X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fwebcit.h;h=92eae15fd7d5a5ba002137b4315b90aa89900186;hb=694a3ea878536e2deda1c0168e51837a31b81af7;hp=df8e2be113e770db20eaca688801ad89e3e02a30;hpb=8c451428eca6cfe21a76c388984c2d6cae7d33bb;p=citadel.git diff --git a/webcit/webcit.h b/webcit/webcit.h index df8e2be11..92eae15fd 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -1,5 +1,9 @@ /* $Id$ */ +/** we need _GNU_SOURCE for various functions arround the NLS-Stuff */ +#define _GNU_SOURCE + + #include #include #ifdef HAVE_UNISTD_H @@ -41,10 +45,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 +123,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 v6.73" /* 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 673 /* This version of WebCit */ +#define MINIMUM_CIT_VERSION 673 /* min required Citadel ver. */ #define DEFAULT_HOST "localhost" /* Default Citadel server */ #define DEFAULT_PORT "504" #define LB (1) /* Internal escape chars */ @@ -144,27 +148,27 @@ * * 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 */ /** * user/room access @@ -178,55 +182,56 @@ /** * 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[SIZ]; /**< 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? */ }; @@ -236,22 +241,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 +323,77 @@ 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 */ + 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 */ @@ -413,6 +419,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; @@ -477,10 +484,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 display_headers(char *msgnum_as_string); -void text_to_server(char *ptr, int convert_to_html); +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); @@ -543,10 +552,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); @@ -586,7 +596,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); @@ -600,6 +610,7 @@ 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); @@ -608,6 +619,7 @@ int load_msg_ptrs(char *servcmd, int with_headers); void CtdlEncodeBase64(char *dest, const char *source, size_t sourcelen); 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); @@ -672,7 +684,13 @@ 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); @@ -706,18 +724,20 @@ 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 */ -#define VIEW_WIKI 6 /* Wiki 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 */