X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fwebcit.h;h=d2b7e94ead2cf712cbf0c0b1d2cb690e21d319ea;hb=b2971ed49d2cfe5128190ec1d5d8c0fa239f0004;hp=eababbed8c2eb5ca8c0466e5eb13a4828e68aa6f;hpb=928e2b479b20b370fd8d4ee1fa1596d40798b494;p=citadel.git diff --git a/webcit/webcit.h b/webcit/webcit.h index eababbed8..d2b7e94ea 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -1,5 +1,8 @@ /* $Id$ */ +#include "config.h" + + #include #include #ifdef HAVE_UNISTD_H @@ -41,10 +44,10 @@ #include #endif -#include "gettext.h" - -#if ENABLE_NLS +#ifdef ENABLE_NLS +#include #include +extern locale_t wc_locales[]; #define _(string) gettext(string) #else #define _(string) (string) @@ -119,11 +122,11 @@ #define SLEEPING 180 /* TCP connection timeout */ #define WEBCIT_TIMEOUT 900 /* WebCit session timeout */ #define PORT_NUM 2000 /* port number to listen on */ -#define SERVER "WebCit v6.71" /* who's in da house */ +#define SERVER "WebCit v7.11" /* who's in da house */ #define DEVELOPER_ID 0 #define CLIENT_ID 4 -#define CLIENT_VERSION 671 /* This version of WebCit */ -#define MINIMUM_CIT_VERSION 671 /* min required Citadel ver. */ +#define CLIENT_VERSION 711 /* This version of WebCit */ +#define MINIMUM_CIT_VERSION 710 /* min required Citadel ver. */ #define DEFAULT_HOST "localhost" /* Default Citadel server */ #define DEFAULT_PORT "504" #define LB (1) /* Internal escape chars */ @@ -144,27 +147,29 @@ * * bucket one... */ -#define QR_PERMANENT 1 /**< Room does not purge */ -#define QR_INUSE 2 /**< Set if in use, clear if avail */ -#define QR_PRIVATE 4 /**< Set for any type of private room */ -#define QR_PASSWORDED 8 /**< Set if there's a password too */ -#define QR_GUESSNAME 16 /**< Set if it's a guessname room */ -#define QR_DIRECTORY 32 /**< Directory room */ -#define QR_UPLOAD 64 /**< Allowed to upload */ -#define QR_DOWNLOAD 128 /**< Allowed to download */ -#define QR_VISDIR 256 /**< Visible directory */ -#define QR_ANONONLY 512 /**< Anonymous-Only room */ -#define QR_ANONOPT 1024 /**< Anonymous-Option room */ -#define QR_NETWORK 2048 /**< Shared network room */ -#define QR_PREFONLY 4096 /**< Preferred status needed to enter */ -#define QR_READONLY 8192 /**< Aide status required to post */ -#define QR_MAILBOX 16384 /**< Set if this is a private mailbox */ +#define QR_PERMANENT 1 /**< Room does not purge */ +#define QR_INUSE 2 /**< Set if in use, clear if avail */ +#define QR_PRIVATE 4 /**< Set for any type of private room */ +#define QR_PASSWORDED 8 /**< Set if there's a password too */ +#define QR_GUESSNAME 16 /**< Set if it's a guessname room */ +#define QR_DIRECTORY 32 /**< Directory room */ +#define QR_UPLOAD 64 /**< Allowed to upload */ +#define QR_DOWNLOAD 128 /**< Allowed to download */ +#define QR_VISDIR 256 /**< Visible directory */ +#define QR_ANONONLY 512 /**< Anonymous-Only room */ +#define QR_ANONOPT 1024 /**< Anonymous-Option room */ +#define QR_NETWORK 2048 /**< Shared network room */ +#define QR_PREFONLY 4096 /**< Preferred status needed to enter */ +#define QR_READONLY 8192 /**< Aide status required to post */ +#define QR_MAILBOX 16384 /**< Set if this is a private mailbox */ /** * bucket two... */ -#define QR2_SYSTEM 1 /**< System room; hide by default */ -#define QR2_SELFLIST 2 /**< Self-service mailing list mgmt */ +#define QR2_SYSTEM 1 /**< System room; hide by default */ +#define QR2_SELFLIST 2 /**< Self-service mailing list mgmt */ +#define QR2_COLLABDEL 4 /**< Anyone who can post can also delete*/ +#define QR2_SUBJECTREQ 8 /**< Subject strongly recommended */ /** * user/room access @@ -178,55 +183,57 @@ /** * User flags (from Citadel) */ -#define US_NEEDVALID 1 /**< User needs to be validated */ -#define US_PERM 4 /**< Permanent user */ -#define US_LASTOLD 16 /**< Print last old message with new */ -#define US_EXPERT 32 /**< Experienced user */ -#define US_UNLISTED 64 /**< Unlisted userlog entry */ -#define US_NOPROMPT 128 /**< Don't prompt after each message */ -#define US_PROMPTCTL 256 /**< ext & top work at prompt */ -#define US_DISAPPEAR 512 /**< Use "disappearing msg prompts" */ -#define US_REGIS 1024 /**< Registered user */ -#define US_PAGINATOR 2048 /**< Pause after each screen of text */ -#define US_INTERNET 4096 /**< Internet mail privileges */ -#define US_FLOORS 8192 /**< User wants to see floors */ -#define US_COLOR 16384 /**< User wants ANSI color support */ +#define US_NEEDVALID 1 /**< User needs to be validated */ +#define US_PERM 4 /**< Permanent user */ +#define US_LASTOLD 16 /**< Print last old message with new */ +#define US_EXPERT 32 /**< Experienced user */ +#define US_UNLISTED 64 /**< Unlisted userlog entry */ +#define US_NOPROMPT 128 /**< Don't prompt after each message */ +#define US_PROMPTCTL 256 /**< ext & top work at prompt */ +#define US_DISAPPEAR 512 /**< Use "disappearing msg prompts" */ +#define US_REGIS 1024 /**< Registered user */ +#define US_PAGINATOR 2048 /**< Pause after each screen of text */ +#define US_INTERNET 4096 /**< Internet mail privileges */ +#define US_FLOORS 8192 /**< User wants to see floors */ +#define US_COLOR 16384 /**< User wants ANSI color support */ #define US_USER_SET (US_LASTOLD | US_EXPERT | US_UNLISTED | \ US_NOPROMPT | US_DISAPPEAR | US_PAGINATOR | \ US_FLOORS | US_COLOR | US_PROMPTCTL ) -/** \brief http request struct ??? */ +/** \brief Linked list of lines appearing in an HTTP client request */ struct httprequest { - struct httprequest *next; /**< the next request in the list ??? */ - char line[SIZ]; /**< the request line ??? */ + struct httprequest *next; /**< the next request in the list */ + char line[SIZ]; /**< the request line */ }; /** - * \brief contents of an url??? + * \brief Linked list of session variables encoded in an x-www-urlencoded content type */ struct urlcontent { - struct urlcontent *next; /**< the next url in the list */ - char url_key[32]; /**< the url directory part */ - char *url_data; /**< the url data part ??? */ + struct urlcontent *next; /**< the next variable in the list */ + char url_key[32]; /**< the variable name */ + char *url_data; /**< its value */ }; /** * \brief information about us ??? */ struct serv_info { - int serv_pid; /**< Our process id */ - char serv_nodename[32]; /**< How is the name of this citadel */ - char serv_humannode[64]; /**< How is the human readable name of this citadel */ - char serv_fqdn[64]; /**< How is our Full quallified Domain Name (uncensored.citadel.org ie.e */ - char serv_software[64]; /**< What version does our connected citadel server use */ - int serv_rev_level; /**< Whats the citadel server revision */ - char serv_bbs_city[64]; /**< Where is the dialin node */ - char serv_sysadm[64]; /**< Who's to blame on trouble */ - char serv_moreprompt[SIZ]; /**< Whats the commandline textprompt */ - int serv_ok_floors; /**< what??? */ - int serv_supports_ldap; /**< is the server linked against an ldap tree for adresses? */ + int serv_pid; /**< Process ID of the Citadel server */ + char serv_nodename[32]; /**< Node name of the Citadel server */ + char serv_humannode[64]; /**< human readable node name of the Citadel server */ + char serv_fqdn[64]; /**< fully quallified Domain Name (such as uncensored.citadel.org) */ + char serv_software[64]; /**< What version does our connected citadel server use */ + int serv_rev_level; /**< Whats the citadel server revision */ + char serv_bbs_city[64]; /**< Geographic location of the Citadel server */ + char serv_sysadm[64]; /**< Name of system administrator */ + char serv_moreprompt[256]; /**< Whats the commandline textprompt */ + int serv_ok_floors; /**< nonzero == server supports floors */ + int serv_supports_ldap; /**< is the server linked against an ldap tree for adresses? */ + int serv_newuser_disabled; /**< Has the server disabled self-service new user creation? */ + char serv_default_cal_zone[128];/**< Default timezone for unspecified calendar items */ }; @@ -236,22 +243,22 @@ struct serv_info { */ struct march { struct march *next; /**< pointer to next in linked list */ - char march_name[128]; /**< function name ??? */ - int march_floor; /**< floor number */ - int march_order; /**< order number???*/ + char march_name[128]; /**< name of room */ + int march_floor; /**< floor number of room */ + int march_order; /**< sequence in which we are to visit this room */ }; /* * - * \brief This struct holds a list of rooms for client display. - * (oooh, a tree!) (double linked list? ) + * \brief This struct holds a list of rooms for client display. + * It is a binary tree. */ struct roomlisting { - struct roomlisting *lnext;/**< pointer to the next roomlisting */ - struct roomlisting *rnext;/**< pointer to the previous roomlisting */ - char rlname[128]; /**< the userprintable roomname */ - unsigned rlflags; /**< the room flags */ - int rlfloor; /**< the floor it reside on (citadel server room number???)*/ - int rlorder; /**< the order to print it???*/ + struct roomlisting *lnext; /**< pointer to 'left' tree node */ + struct roomlisting *rnext; /**< pointer to 'right' tree node */ + char rlname[128]; /**< name of room */ + unsigned rlflags; /**< room flags */ + int rlfloor; /**< the floor it resides on */ + int rlorder; /**< room listing order */ }; @@ -318,76 +325,79 @@ struct folder { * HTTP transactions are bound to on e at a time. */ struct wcsession { - struct wcsession *next; /**< Linked list */ - int wc_session; /**< WebCit session ID */ - char wc_username[128]; /**< ??? todo */ - char wc_fullname[128]; /**< ??? todo */ - char wc_password[128]; /**< ??? todo */ - char wc_roomname[256]; /**< ??? todo */ - int connected; /**< ??? todo */ - int logged_in; /**< ??? todo */ - int axlevel; /**< ??? todo */ - int is_aide; /**< ??? todo */ - int is_room_aide; /**< ??? todo */ - int http_sock; /**< ??? todo */ - int serv_sock; /**< ??? todo */ - int chat_sock; /**< ??? todo */ - unsigned room_flags; /**< ??? todo */ - int wc_view; /**< ??? todo */ - int wc_default_view; /**< ??? todo */ - int wc_is_trash; /**< ??? todo */ - int wc_floor; /**< ??? todo */ - char ugname[128]; /**< ??? todo */ - long uglsn; /**< ??? todo */ - int upload_length; /**< ??? todo */ - char *upload; /**< ??? todo */ - char upload_filename[PATH_MAX]; /**< ??? todo */ - char upload_content_type[256]; /**< ??? todo */ - int new_mail; /**< ??? todo */ - int remember_new_mail; /**< ??? todo */ - int need_regi; /**< This user needs to register. */ - int need_vali; /**< New users require validation. */ - char cs_inet_email[256]; /**< User's preferred Internet addr. */ - pthread_mutex_t SessionMutex; /**< mutex for exclusive access */ - time_t lastreq; /**< Timestamp of most recent HTTP */ - int killthis; /**< Nonzero == purge this session */ - struct march *march; /**< march mode room list */ - char reply_to[512]; /**< reply-to address */ - long msgarr[10000]; /**< for read operations */ - int num_summ; /**< ??? todo */ - struct message_summary *summ; /**< ??? todo */ - int is_wap; /**< Client is a WAP gateway */ - struct urlcontent *urlstrings; /**< ??? todo */ - struct wcsubst *vars; /**< ??? todo*/ - char this_page[512]; /**< address of current page */ - char http_host[512]; /**< HTTP Host: header */ - char *preferences; /**< ??? todo */ -#ifdef WEBCIT_WITH_CALENDAR_SERVICE - /** \brief ical???? */ - struct disp_cal { - icalcomponent *cal; /**< cal items for display */ - long cal_msgnum; /**< cal msgids for display */ - } *disp_cal; - int num_cal; /**< ??? todo */ + struct wcsession *next; /**< Linked list */ + int wc_session; /**< WebCit session ID */ + char wc_username[128]; /**< login name of current user */ + char wc_fullname[128]; /**< Screen name of current user */ + char wc_password[128]; /**< Password of current user */ + char wc_roomname[256]; /**< Room we are currently in */ + int connected; /**< nonzero == we are connected to Citadel */ + int logged_in; /**< nonzero == we are logged in */ + int axlevel; /**< this user's access level */ + int is_aide; /**< nonzero == this user is an Aide */ + int is_room_aide; /**< nonzero == this user is a Room Aide in this room */ + int http_sock; /**< HTTP server socket */ + int serv_sock; /**< Client socket to Citadel server */ + int chat_sock; /**< Client socket to Citadel server - for chat */ + unsigned room_flags; /**< flags associated with the current room */ + unsigned room_flags2; /**< flags associated with the current room */ + int wc_view; /**< view for the current room */ + int wc_default_view; /**< default view for the current room */ + int wc_is_trash; /**< nonzero == current room is a Trash folder */ + int wc_floor; /**< floor number of current room */ + char ugname[128]; /**< where does 'ungoto' take us */ + long uglsn; /**< last seen message number for ungoto */ + int upload_length; /**< content length of http-uploaded data */ + char *upload; /**< pointer to http-uploaded data */ + char upload_filename[PATH_MAX]; /**< filename of http-uploaded data */ + char upload_content_type[256]; /**< content type of http-uploaded data */ + int new_mail; /**< user has new mail waiting */ + int remember_new_mail; /**< last count of new mail messages */ + int need_regi; /**< This user needs to register. */ + int need_vali; /**< New users require validation. */ + char cs_inet_email[256]; /**< User's preferred Internet addr. */ + pthread_mutex_t SessionMutex; /**< mutex for exclusive access */ + time_t lastreq; /**< Timestamp of most recent HTTP */ + int killthis; /**< Nonzero == purge this session */ + struct march *march; /**< march mode room list */ + char reply_to[512]; /**< reply-to address */ + long msgarr[10000]; /**< for read operations */ + int num_summ; /**< number of messages in mailbox summary view */ + struct message_summary *summ; /**< array of messages for mailbox summary view */ + int is_wap; /**< Client is a WAP gateway */ + struct urlcontent *urlstrings; /**< variables passed to webcit in a URL */ + struct wcsubst *vars; /**< HTTP variable substitutions for this page */ + char this_page[512]; /**< URL of current page */ + char http_host[512]; /**< HTTP Host: header */ + char *preferences; /**< WebCit preferences for this user */ +#ifdef WEBCIT_WITH_CALENDAR_SERVICE + /** \brief ical???? */ + struct disp_cal { + icalcomponent *cal; /**< cal items for display */ + long cal_msgnum; /**< cal msgids for display */ + } *disp_cal; + int num_cal; /**< number of calendar items for display */ #endif - struct wc_attachment *first_attachment; /**< ??? todo */ - char last_chat_user[256]; /**< ??? todo */ - char ImportantMessage[SIZ]; /**< ??? todo */ - int ctdl_pid; /**< Session ID on the Citadel server */ - char httpauth_user[256]; /**< only for GroupDAV sessions */ - char httpauth_pass[256]; /**< only for GroupDAV sessions */ - size_t burst_len; /**< ??? todo */ - char *burst; /**< ??? todo */ - int gzip_ok; /**< Nonzero if Accept-encoding: gzip */ - int is_mailbox; /**< the current room is a private mailbox */ - struct folder *cache_fold; /**< cache the iconbar room list */ - int cache_max_folders; /**< ??? todo */ - int cache_num_floors; /**< ??? todo */ - time_t cache_timestamp; /**< ??? todo */ - int current_iconbar; /**< What's currently in the iconbar? */ - char floordiv_expanded[32]; /**< which floordiv currently expanded */ - int selected_language; /**< Language selected by user */ - time_t last_pager_check; /**< last time we polled for instant msgs */ + struct wc_attachment *first_attachment; /**< linked list of attachments for 'enter message' */ + char last_chat_user[256]; /**< ??? todo */ + char ImportantMessage[SIZ]; /**< ??? todo */ + int ctdl_pid; /**< Session ID on the Citadel server */ + char httpauth_user[256]; /**< only for GroupDAV sessions */ + char httpauth_pass[256]; /**< only for GroupDAV sessions */ + size_t burst_len; /** current_iconbar */ @@ -447,6 +457,10 @@ void serv_getln(char *strbuf, int bufsize); void serv_puts(char *string); void who(void); void who_inner_div(void); +void wholist_section(void); +void tasks_section(void); +void calendar_section(void); +void new_messages_section(void); void fmout(char *align); void pullquote_fmout(void); void wDumpContent(int); @@ -546,10 +560,11 @@ void display_menubar(int); void smart_goto(char *); void worker_entry(void); void session_loop(struct httprequest *); +size_t wc_strftime(char *s, size_t max, const char *format, const struct tm *tm); void fmt_date(char *buf, time_t thetime, int brief); void fmt_time(char *buf, time_t thetime); void httpdate(char *buf, time_t thetime); -time_t httpdate_to_timestamp(const char *buf); +time_t httpdate_to_timestamp(char *buf); void end_webcit_session(void); void page_popup(void); void chat_recv(void); @@ -609,22 +624,37 @@ void do_tasks_view(void); void free_calendar_buffer(void); void calendar_summary_view(void); int load_msg_ptrs(char *servcmd, int with_headers); -void CtdlEncodeBase64(char *dest, const char *source, size_t sourcelen); +void CtdlEncodeBase64(char *dest, const char *source, size_t sourcelen, int linebreaks); int CtdlDecodeBase64(char *dest, const char *source, size_t length); void free_attachments(struct wcsession *sess); +void free_march_list(struct wcsession *wcf); void set_room_policy(void); void display_inetconf(void); void save_inetconf(void); +void display_smtpqueue(void); +void display_smtpqueue_inner_div(void); +void display_sieve(void); +void display_rules_editor_inner_div(void); +void save_sieve(void); +void display_add_remove_scripts(char *); +void create_script(void); +void delete_script(void); void generate_uuid(char *); void CtdlMakeTempFileName(char *, int); void display_preferences(void); void set_preferences(void); void recp_autocomplete(char *); +void address_book_popup(void); +void display_address_book_middle_div(void); +void display_address_book_inner_div(void); void begin_ajax_response(void); void end_ajax_response(void); void initialize_viewdefs(void); void initialize_axdefs(void); void list_all_rooms_by_floor(char *viewpref); +void display_room_directory(void); +void download_file(char *); +void upload_file(void); #ifdef WEBCIT_WITH_CALENDAR_SERVICE void display_edit_task(void); @@ -678,6 +708,7 @@ void begin_tab(int tabnum, int num_tabs); void end_tab(int tabnum, int num_tabs); void str_wiki_index(char *s); void display_wiki_page(void); +char *bmstrcasestr(char *text, char *pattern); #ifdef HAVE_ICONV iconv_t ctdl_iconv_open(const char *tocode, const char *fromcode); @@ -715,12 +746,8 @@ void utf8ify_rfc822_string(char *buf); void begin_burst(void); void end_burst(void); -extern char *ascmonths[]; /**< Short (three letter) month names */ -extern char *months[]; /**< Long (full) month names */ extern char *hourname[]; /**< Names of hours (12am, 1am, etc.) */ -extern char *wdays[]; /**< Days of the week */ -void initialize_months_and_days(void); void http_datestring(char *buf, size_t n, time_t xtime); @@ -739,3 +766,9 @@ void http_datestring(char *buf, size_t n, time_t xtime); #define DEFAULT_HTTPAUTH_USER "" #define DEFAULT_HTTPAUTH_PASS "" + +/* Exit codes 101 through 109 are initialization failures so we don't want to + * just keep respawning indefinitely. + */ +#define WC_EXIT_BIND 101 /* Can't bind to the port */ +#define WC_EXIT_SSL 102 /* Can't initialize SSL */