X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fwebcit.h;h=d2b7e94ead2cf712cbf0c0b1d2cb690e21d319ea;hb=b2971ed49d2cfe5128190ec1d5d8c0fa239f0004;hp=d61fef65aa8986e6bcc49cdab7dd5e5c93de27fd;hpb=0bfc1b9cb968626402becec77bea085623d54e2b;p=citadel.git diff --git a/webcit/webcit.h b/webcit/webcit.h index d61fef65a..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.40" /* 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 640 /* This version of WebCit */ -#define MINIMUM_CIT_VERSION 661 /* 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,29 +147,31 @@ * * 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 */ #define UA_KNOWN 2 @@ -175,219 +180,234 @@ #define UA_ZAPPED 16 -/* +/** * 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 Linked list of lines appearing in an HTTP client request */ struct httprequest { - struct httprequest *next; - char line[SIZ]; + struct httprequest *next; /**< the next request in the list */ + char line[SIZ]; /**< the request line */ }; +/** + * \brief Linked list of session variables encoded in an x-www-urlencoded content type + */ struct urlcontent { - struct urlcontent *next; - char url_key[32]; - char *url_data; + 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; - char serv_nodename[32]; - char serv_humannode[64]; - char serv_fqdn[64]; - char serv_software[64]; - int serv_rev_level; - char serv_bbs_city[64]; - char serv_sysadm[64]; - char serv_moreprompt[SIZ]; - int serv_ok_floors; - int serv_supports_ldap; + 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 */ }; -/* - * This struct holds a list of rooms for oto operations. +/** + * \brief This struct holds a list of rooms for \\\oto operations. */ struct march { - struct march *next; - char march_name[128]; - int march_floor; - int march_order; + struct march *next; /**< pointer to next in linked list */ + 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 */ }; -/* - * This struct holds a list of rooms for client display. - * (oooh, a tree!) +/* * + * \brief This struct holds a list of rooms for client display. + * It is a binary tree. */ struct roomlisting { - struct roomlisting *lnext; - struct roomlisting *rnext; - char rlname[128]; - unsigned rlflags; - int rlfloor; - int rlorder; + 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 */ }; -/* - * Dynamic content for variable substitution in templates +/** + * \brief Dynamic content for variable substitution in templates */ struct wcsubst { - struct wcsubst *next; - int wcs_type; - char wcs_key[32]; - void *wcs_value; - void (*wcs_function)(void); + struct wcsubst *next; /**< next item in the list */ + int wcs_type; /**< which type of ??? */ + char wcs_key[32]; /**< ??? what?*/ + void *wcs_value; /**< ???? what?*/ + void (*wcs_function)(void); /**< funcion hook ???*/ }; -/* - * Values for wcs_type +/** + * \brief Values for wcs_type */ enum { - WCS_STRING, - WCS_FUNCTION, - WCS_SERVCMD + WCS_STRING, /**< its a string */ + WCS_FUNCTION, /**< its a function callback */ + WCS_SERVCMD /**< its a command to send to the citadel server */ }; - +/** + * \brief mail attachment ??? + */ struct wc_attachment { - struct wc_attachment *next; - size_t length; - char content_type[SIZ]; - char filename[SIZ]; - char *data; + struct wc_attachment *next;/**< pointer to next in list */ + size_t length; /**< length of the contenttype */ + char content_type[SIZ]; /**< the content itself ???*/ + char filename[SIZ]; /**< the filename hooked to this content ??? */ + char *data; /**< the data pool; aka this content */ }; +/** + * \brief message summary structure. ??? + */ struct message_summary { - time_t date; - long msgnum; - char from[128]; - char to[128]; - char subj[128]; - int hasattachments; - int is_new; + time_t date; /**< its creation date */ + long msgnum; /**< the message number on the citadel server */ + char from[128]; /**< the author */ + char to[128]; /**< the recipient */ + char subj[128]; /**< the title / subject */ + int hasattachments; /**< does it have atachments? */ + int is_new; /**< is it yet read? */ }; -/* Data structure for roomlist-to-folderlist conversion */ +/** + * \brief Data structure for roomlist-to-folderlist conversion + */ struct folder { - int floor; - char room[SIZ]; - char name[SIZ]; - int hasnewmsgs; - int is_mailbox; - int selectable; - int view; + int floor; /**< which floor is it on */ + char room[SIZ]; /**< which roomname ??? */ + char name[SIZ]; /**< which is its own name??? */ + int hasnewmsgs; /**< are there unread messages inside */ + int is_mailbox; /**< is it a mailbox? */ + int selectable; /**< can we select it ??? */ + int view; /**< whats its default view? inbox/calendar.... */ }; -/* - * One of these is kept for each active Citadel session. - * HTTP transactions are bound to one at a time. +/** + * \brief One of these is kept for each active Citadel session. + * 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]; - char wc_password[128]; - char wc_roomname[256]; - int connected; - int logged_in; - int axlevel; - int is_aide; - int is_room_aide; - int http_sock; - int serv_sock; - int chat_sock; - unsigned room_flags; - int wc_view; - int wc_default_view; - int wc_floor; - char ugname[128]; - long uglsn; - int upload_length; - char *upload; - char upload_filename[PATH_MAX]; - char upload_content_type[256]; - int new_mail; - int remember_new_mail; - 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; - struct message_summary *summ; - - int is_wap; /* Client is a WAP gateway */ - struct urlcontent *urlstrings; - int HaveInstantMessages; /* Nonzero if incoming msgs exist */ - struct wcsubst *vars; - char this_page[512]; /* address of current page */ - char http_host[512]; /* HTTP Host: header */ - char *preferences; -#ifdef WEBCIT_WITH_CALENDAR_SERVICE - struct disp_cal { - icalcomponent *cal; /* cal items for display */ - long cal_msgnum; /* cal msgids for display */ - } *disp_cal; - int num_cal; -#endif - struct wc_attachment *first_attachment; - char ImportantMessage[SIZ]; - char last_chat_user[256]; - 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; - char *burst; - 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; - int cache_num_floors; - time_t cache_timestamp; - - int current_iconbar; /* What's currently in the iconbar? */ - char floordiv_expanded[32]; /* which floordiv currently expanded */ - - int selected_language; /* Language selected by user */ + 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; /**< 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 */ +/** values for WC->current_iconbar */ enum { - current_iconbar_menu, - current_iconbar_roomlist + current_iconbar_menu, /**< view the icon menue */ + current_iconbar_roomlist /**< view the roomtree */ }; -#define num_parms(source) num_tokens(source, '|') +#define num_parms(source) num_tokens(source, '|') /* Per-session data */ #define WC ((struct wcsession *)pthread_getspecific(MyConKey)) @@ -403,6 +423,7 @@ struct serv_info serv_info; extern char floorlist[128][SIZ]; extern char *axdefs[]; extern char *ctdlhost, *ctdlport; +extern int http_port; extern char *server_cookie; extern int is_https; extern int setup_wizard; @@ -436,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); @@ -467,9 +492,12 @@ void embed_main_menu(void); void serv_read(char *buf, int bytes); int haschar(char *, char); void readloop(char *oper); +void read_message(long msgnum, int printable_view, char *section); void embed_message(char *msgnum_as_string); void print_message(char *msgnum_as_string); -void text_to_server(char *ptr, int convert_to_html); +void display_headers(char *msgnum_as_string); +void text_to_server(char *ptr); +void text_to_server_qp(char *ptr); void display_enter(void); void post_message(void); void confirm_delete_msg(void); @@ -532,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); @@ -575,7 +604,7 @@ void display_addressbook(long msgnum, char alpha); void offer_start_page(void); void convenience_page(char *titlebarcolor, char *titlebarmsg, char *messagetext); void change_start_page(void); -void output_html(char *); +void output_html(char *, int); void display_floorconfig(char *); void delete_floor(void); void create_floor(void); @@ -589,27 +618,43 @@ void cal_process_attachment(char *part_source, long msgnum, char *cal_partnum); void display_calendar(long msgnum); void display_task(long msgnum); void display_note(long msgnum); +void updatenote(void); void do_calendar_view(void); 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); @@ -658,8 +703,19 @@ void set_selected_language(char *); void go_selected_language(void); void stop_selected_language(void); void httplang_to_locale(char *LocaleString); +void tabbed_dialog(int num_tabs, char *tabnames[]); +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); +#endif void embed_room_banner(char *, int); + /* navbar types that can be passed to embed_room_banner */ enum { navbar_none, @@ -690,20 +746,29 @@ void utf8ify_rfc822_string(char *buf); void begin_burst(void); void end_burst(void); -extern char *ascmonths[]; -extern char *hourname[]; +extern char *hourname[]; /**< Names of hours (12am, 1am, etc.) */ + void http_datestring(char *buf, size_t n, time_t xtime); -/* Views (from citadel.h) */ -#define VIEW_BBS 0 /* Traditional Citadel BBS view */ -#define VIEW_MAILBOX 1 /* Mailbox summary */ -#define VIEW_ADDRESSBOOK 2 /* Address book view */ -#define VIEW_CALENDAR 3 /* Calendar view */ -#define VIEW_TASKS 4 /* Tasks view */ -#define VIEW_NOTES 5 /* Notes view */ + +/** Views (from citadel.h) */ +#define VIEW_BBS 0 /**< Traditional Citadel BBS view */ +#define VIEW_MAILBOX 1 /**< Mailbox summary */ +#define VIEW_ADDRESSBOOK 2 /**< Address book view */ +#define VIEW_CALENDAR 3 /**< Calendar view */ +#define VIEW_TASKS 4 /**< Tasks view */ +#define VIEW_NOTES 5 /**< Notes view */ +#define VIEW_WIKI 6 /**< Wiki view */ +#define VIEW_CALBRIEF 7 /**< Brief Calendar view */ /* These should be empty, but we have them for testing */ #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 */