X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fwebcit.h;h=78cfa7f4afbfadc7b760a272e6d4c95a13788982;hb=d120028b4c45f3c26d05186c8ba488fd2feef13f;hp=dc8b2f10de484db2afea0e660e9c68e7b9a31b92;hpb=dfbede1c0ae337256261691896abc4c0a6092f41;p=citadel.git diff --git a/webcit/webcit.h b/webcit/webcit.h index dc8b2f10d..78cfa7f4a 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -1,19 +1,105 @@ /* $Id$ */ +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#ifdef HAVE_FCNTL_H +#include +#endif +#include +#include +#include +#include +#ifdef HAVE_SYS_TIME_H +#include +#endif +#include +#ifdef HAVE_LIMITS_H +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef INADDR_NONE +#define INADDR_NONE 0xffffffff +#endif + +#ifdef HAVE_ICONV +#include +#endif + +#include "gettext.h" + +#if ENABLE_NLS +#include +#define _(string) gettext(string) +#else +#define _(string) (string) +#endif + +/* + * Uncomment to dump an HTTP trace to stderr +#define HTTP_TRACING 1 + */ + +#ifdef HTTP_TRACING +#undef HAVE_ZLIB_H +#undef HAVE_ZLIB +#endif + #ifdef HAVE_ZLIB_H #include #endif - #ifdef HAVE_ICAL_H #ifdef HAVE_LIBICAL #define WEBCIT_WITH_CALENDAR_SERVICE 1 #endif #endif + + #ifdef WEBCIT_WITH_CALENDAR_SERVICE +/* Work around PACKAGE/VERSION defs that are (not supposed to be?) in ical.h */ +#ifdef PACKAGE +# define CTDL_PACKAGE PACKAGE +# undef PACKAGE +#endif +#ifdef VERSION +# define CTDL_VERSION VERSION +# undef VERSION +#endif #include +#ifdef CTDL_PACKAGE +# ifdef PACKAGE +# undef PACKAGE +# endif +# define PACKAGE CTDL_PACKAGE +# undef CTDL_PACKAGE #endif +#ifdef CTDL_VERSION +# ifdef VERSION +# undef VERSION +# endif +# define VERSION CTDL_VERSION +# undef CTDL_VERSION +#endif +#endif + + #ifdef HAVE_OPENSSL /* Work around RedHat's b0rken OpenSSL includes */ @@ -33,11 +119,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 v5.23" /* who's in da house */ +#define SERVER "WebCit v6.70" /* who's in da house */ #define DEVELOPER_ID 0 #define CLIENT_ID 4 -#define CLIENT_VERSION 523 /* This version of WebCit */ -#define MINIMUM_CIT_VERSION 623 /* min required Citadel vers */ +#define CLIENT_VERSION 670 /* This version of WebCit */ +#define MINIMUM_CIT_VERSION 670 /* min required Citadel ver. */ #define DEFAULT_HOST "localhost" /* Default Citadel server */ #define DEFAULT_PORT "504" #define LB (1) /* Internal escape chars */ @@ -58,18 +144,18 @@ * * bucket one... */ -#define QR_PERMANENT 1 /* Room does not purge */ +#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_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 */ @@ -80,13 +166,34 @@ #define QR2_SYSTEM 1 /* System room; hide by default */ #define QR2_SELFLIST 2 /* Self-service mailing list mgmt */ - -#define UA_KNOWN 2 -#define UA_GOTOALLOWED 4 -#define UA_HASNEWMSGS 8 -#define UA_ZAPPED 16 +/* + * user/room access + */ +#define UA_KNOWN 2 +#define UA_GOTOALLOWED 4 +#define UA_HASNEWMSGS 8 +#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_USER_SET (US_LASTOLD | US_EXPERT | US_UNLISTED | \ + US_NOPROMPT | US_DISAPPEAR | US_PAGINATOR | \ + US_FLOORS | US_COLOR | US_PROMPTCTL ) @@ -172,16 +279,38 @@ struct wc_attachment { char *data; }; +struct message_summary { + time_t date; + long msgnum; + char from[128]; + char to[128]; + char subj[128]; + int hasattachments; + int is_new; +}; + +/* 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; +}; + /* * One of these is kept for each active Citadel session. * HTTP transactions are bound to one at a time. */ struct wcsession { - struct wcsession *next; /* Linked list */ + struct wcsession *next; /* Linked list */ int wc_session; /* WebCit session ID */ - char wc_username[SIZ]; - char wc_password[SIZ]; - char wc_roomname[SIZ]; + char wc_username[128]; + char wc_fullname[128]; + char wc_password[128]; + char wc_roomname[256]; int connected; int logged_in; int axlevel; @@ -193,31 +322,32 @@ struct wcsession { unsigned room_flags; int wc_view; int wc_default_view; + int wc_is_trash; int wc_floor; char ugname[128]; long uglsn; int upload_length; char *upload; - char upload_filename[SIZ]; - char upload_content_type[SIZ]; + 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[SIZ]; /* User's preferred Internet addr. */ - pthread_mutex_t SessionMutex; /* mutex for exclusive access */ - time_t lastreq; /* Timestamp of most recent HTTP */ + 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[SIZ]; /* reply-to address */ - long msgarr[4096]; /* for read operations */ - int fake_frames; + 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 HaveExpressMessages; /* Nonzero if incoming msgs exist */ struct wcsubst *vars; - char this_page[SIZ]; /* address of current page */ - char http_host[SIZ]; /* HTTP Host: header */ + 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 { @@ -228,12 +358,31 @@ struct wcsession { #endif struct wc_attachment *first_attachment; char ImportantMessage[SIZ]; - int outside_frameset_allowed; /* nonzero if current req is allowed - * outside of the main frameset */ - char last_chat_user[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 */ + time_t last_pager_check; /* last time we polled for instant msgs */ +}; + +/* values for WC->current_iconbar */ +enum { + current_iconbar_menu, + current_iconbar_roomlist }; -#define extract(dest,source,parmnum) extract_token(dest,source,parmnum,'|') + #define num_parms(source) num_tokens(source, '|') /* Per-session data */ @@ -252,14 +401,18 @@ extern char *axdefs[]; extern char *ctdlhost, *ctdlport; extern char *server_cookie; extern int is_https; - -extern struct wcsubst *global_subst; - +extern int setup_wizard; +extern char wizard_filename[]; +extern time_t if_modified_since; +extern int follow_xff; +void do_setup_wizard(void); void stuff_to_cookie(char *cookie, int session, char *user, char *pass, char *room); void cookie_to_stuff(char *cookie, int *session, - char *user, char *pass, char *room); + char *user, size_t user_len, + char *pass, size_t pass_len, + char *room, size_t room_len); void locate_host(char *, int); void become_logged_in(char *, char *, char *); void do_login(void); @@ -267,6 +420,7 @@ void display_login(char *mesg); void do_welcome(void); void do_logout(void); void display_main_menu(void); +void display_aide_menu(void); void display_advanced_menu(void); void slrp_highest(void); void gotonext(void); @@ -274,10 +428,12 @@ void ungoto(void); void get_serv_info(char *, char *); int uds_connectsock(char *); int tcp_connectsock(char *, char *); -void serv_gets(char *strbuf); +void serv_getln(char *strbuf, int bufsize); void serv_puts(char *string); -void whobbs(void); -void fmout(FILE *fp, char *align); +void who(void); +void who_inner_div(void); +void fmout(char *align); +void pullquote_fmout(void); void wDumpContent(int); void serv_printf(const char *format,...); char *bstr(char *key); @@ -285,7 +441,12 @@ void urlesc(char *, char *); void urlescputs(char *); void jsesc(char *, char *); void jsescputs(char *); -void output_headers(int); +void output_headers( int do_httpheaders, + int do_htmlhead, + int do_room_banner, + int unset_cookies, + int suppress_check, + int cache); void wprintf(const char *format,...); void output_static(char *what); void stresc(char *target, char *strbuf, int nbsp, int nolinebreaks); @@ -294,20 +455,22 @@ void url(char *buf); void escputs1(char *strbuf, int nbsp, int nolinebreaks); void msgesc(char *target, char *strbuf); void msgescputs(char *strbuf); -long extract_long(char *source, long int parmnum); -int extract_int(char *source, int parmnum); +int extract_int(const char *source, int parmnum); +long extract_long(const char *source, int parmnum); void stripout(char *str, char leftboundary, char rightboundary); void dump_vars(void); void embed_main_menu(void); void serv_read(char *buf, int bytes); int haschar(char *, char); void readloop(char *oper); +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 display_enter(void); void post_message(void); void confirm_delete_msg(void); void delete_msg(void); -void do_stuff_to_one_msg(void); void confirm_move_msg(void); void move_msg(void); void userlist(void); @@ -321,17 +484,19 @@ void zapped_list(void); void display_zap(void); void zap(void); void display_success(char *); +void authorization_required(const char *message); void display_entroom(void); void entroom(void); void display_editroom(void); void netedit(void); void editroom(void); void display_whok(void); +void do_invt_kick(void); void server_to_text(void); void save_edit(char *description, char *enter_cmd, int regoto); void display_edit(char *description, char *check_cmd, - char *read_cmd, char *save_cmd, int headers_type); -void gotoroom(char *gname, int display_name); + char *read_cmd, char *save_cmd, int with_room_banner); +int gotoroom(char *gname); void confirm_delete_room(void); void delete_room(void); void validate(void); @@ -359,14 +524,15 @@ void display_siteconfig(void); void siteconfig(void); void display_generic(void); void do_generic(void); +void ajax_servcmd(void); void display_menubar(int); -void embed_room_banner(char *); void smart_goto(char *); void worker_entry(void); void session_loop(struct httprequest *); -void fmt_date(char *buf, time_t thetime); +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); void end_webcit_session(void); void page_popup(void); void chat_recv(void); @@ -379,7 +545,7 @@ void do_template(void *templatename); int lingering_close(int fd); char *memreadline(char *start, char *buf, int maxlen); int num_tokens (char *source, char tok); -void extract_token(char *dest, char *source, int parmnum, char separator); +void extract_token(char *dest, const char *source, int parmnum, char separator, int maxlen); void remove_token(char *source, int parmnum, char separator); char *load_mimepart(long msgnum, char *partnum); int pattern2(char *search, char *patn); @@ -388,24 +554,25 @@ void edit_vcard(void); void submit_vcard(void); void striplt(char *); void select_user_to_edit(char *message, char *preselect); +void delete_user(char *); void display_edituser(char *who, int is_new); void create_user(void); void edituser(void); void do_change_view(int); void change_view(void); void folders(void); -void do_stuff_to_msgs(void); void load_preferences(void); void save_preferences(void); -void get_preference(char *key, char *value); -void set_preference(char *key, char *value); +void get_preference(char *key, char *value, size_t value_len); +void set_preference(char *key, char *value, int save_to_server); void knrooms(void); int is_msg_in_mset(char *mset, long msgnum); char *safestrncpy(char *dest, const char *src, size_t n); 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(void); +void output_html(char *); void display_floorconfig(char *); void delete_floor(void); void create_floor(void); @@ -413,22 +580,33 @@ void rename_floor(void); void do_listsub(void); void toggle_self_service(void); void summary(void); +void summary_inner_div(void); ssize_t write(int fd, const void *buf, size_t count); 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 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 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 set_room_policy(void); void display_inetconf(void); void save_inetconf(void); - +void generate_uuid(char *); +void CtdlMakeTempFileName(char *, int); +void display_preferences(void); +void set_preferences(void); +void recp_autocomplete(char *); +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); #ifdef WEBCIT_WITH_CALENDAR_SERVICE void display_edit_task(void); @@ -436,10 +614,10 @@ void save_task(void); void display_edit_event(void); void save_event(void); void display_icaltimetype_as_webform(struct icaltimetype *, char *); -struct icaltimetype icaltime_from_webform(char *prefix); +void icaltime_from_webform(struct icaltimetype *result, char *prefix); +void icaltime_from_webform_dateonly(struct icaltimetype *result, char *prefix); void display_edit_individual_event(icalcomponent *supplied_vtodo, long msgnum); void save_individual_event(icalcomponent *supplied_vtodo, long msgnum); -void generate_new_uid(char *); void respond_to_request(void); void handle_rsvp(void); void ical_dezonify(icalcomponent *cal); @@ -449,6 +627,10 @@ void check_attendee_availability(icalcomponent *supplied_vevent); void do_freebusy(char *req); #endif +#ifdef ENABLE_NLS +void initialize_locales(void); +#endif + extern char *months[]; extern char *days[]; void read_server_binary(char *buffer, size_t total_len); @@ -460,11 +642,30 @@ void http_transmit_thing(char *thing, size_t length, char *content_type, int is_static); void unescape_input(char *buf); void do_iconbar(void); +void do_iconbar_roomlist(void); +void do_selected_iconbar(void); void display_customize_iconbar(void); void commit_iconbar(void); int CtdlDecodeQuotedPrintable(char *decoded, char *encoded, int sourcelen); void spawn_another_worker_thread(void); - +void display_rss(char *roomname, char *request_method); +void set_floordiv_expanded(char *which_floordiv); +void offer_languages(void); +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 embed_room_banner(char *, int); + +/* navbar types that can be passed to embed_room_banner */ +enum { + navbar_none, + navbar_default +}; #ifdef HAVE_OPENSSL @@ -477,7 +678,22 @@ int client_read_ssl(char *buf, int bytes, int timeout); void client_write_ssl(char *buf, int nbytes); #endif +#ifdef HAVE_ZLIB +#include +int ZEXPORT compress_gzip(Bytef * dest, uLongf * destLen, + const Bytef * source, uLong sourceLen, int level); +#endif + +#ifdef HAVE_ICONV +void utf8ify_rfc822_string(char *buf); +#endif + +void begin_burst(void); +void end_burst(void); +extern char *ascmonths[]; +extern char *hourname[]; +void http_datestring(char *buf, size_t n, time_t xtime); /* Views (from citadel.h) */ #define VIEW_BBS 0 /* Traditional Citadel BBS view */ @@ -485,3 +701,10 @@ void client_write_ssl(char *buf, int nbytes); #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 */ + + +/* These should be empty, but we have them for testing */ +#define DEFAULT_HTTPAUTH_USER "" +#define DEFAULT_HTTPAUTH_PASS "" +