X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fwebcit.h;h=1a8cd774ff46d2a9bc888bef703d25f1d6aa3aea;hb=76f23da782e9e80dad0a8ae1336230da5a6fa124;hp=a616dc89b908c70f4d038a66fd2440f33623ddf3;hpb=6ec27c3dc0bfb0ffd82a2ec5c4e37869ef0076c9;p=citadel.git diff --git a/webcit/webcit.h b/webcit/webcit.h index a616dc89b..1a8cd774f 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -51,7 +51,9 @@ #ifdef ENABLE_NLS #include #include +#ifdef HAVE_USELOCALE extern locale_t wc_locales[]; +#endif #define _(string) gettext(string) #else #define _(string) (string) @@ -122,9 +124,9 @@ extern locale_t wc_locales[]; #define PORT_NUM 2000 /* port number to listen on */ #define DEVELOPER_ID 0 #define CLIENT_ID 4 -#define CLIENT_VERSION 730 /* This version of WebCit */ -#define MINIMUM_CIT_VERSION 730 /* min required Citadel ver */ -#define LIBCITADEL_MIN 104 /* min required libcitadel ver */ +#define CLIENT_VERSION 737 /* This version of WebCit */ +#define MINIMUM_CIT_VERSION 737 /* min required Citadel ver */ +#define LIBCITADEL_MIN 738 /* min required libcitadel ver */ #define DEFAULT_HOST "localhost" /* Default Citadel server */ #define DEFAULT_PORT "504" #define LB (1) /* Internal escape chars */ @@ -223,10 +225,11 @@ struct httprequest { /** * \brief Linked list of session variables encoded in an x-www-urlencoded content type */ +typedef struct urlcontent urlcontent; struct urlcontent { - struct urlcontent *next; /**< the next variable in the list */ char url_key[32]; /**< the variable name */ char *url_data; /**< its value */ + size_t url_data_size; /**< how big is it? */ }; /** @@ -247,6 +250,9 @@ struct serv_info { 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 */ int serv_supports_sieve; /* Does the server support Sieve mail filtering? */ + int serv_fulltext_enabled; /* Does the server have the full text index enabled? */ + char serv_svn_revision[256]; /* SVN revision of the server */ + int serv_supports_openid; /* Does the server support authentication via OpenID? */ }; @@ -279,13 +285,12 @@ struct roomlisting { /** * \brief Dynamic content for variable substitution in templates */ -struct wcsubst { - struct wcsubst *next; /**< next item in the list */ +typedef struct _wcsubst { int wcs_type; /**< which type of ??? */ char wcs_key[32]; /**< ??? what?*/ void *wcs_value; /**< ???? what?*/ void (*wcs_function)(void); /**< funcion hook ???*/ -}; +} wcsubst; /** * \brief Values for wcs_type @@ -315,7 +320,7 @@ struct message_summary { 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 */ + char subj[256]; /**< the title / subject */ int hasattachments; /**< does it have atachments? */ int is_new; /**< is it yet read? */ }; @@ -334,6 +339,20 @@ struct folder { int num_rooms; /**< If this is a floor, how many rooms does it have */ }; +typedef struct _disp_cal { + icalcomponent *cal; /**< cal items for display */ + long cal_msgnum; /**< cal msgids for display */ + char *from; /**< owner of this component */ + int unread; /**< already seen by the user? */ + + time_t event_start; + time_t event_end; + + int multi_day_event; + int is_repeat; +} disp_cal; + + /** * \brief One of these is kept for each active Citadel session. * HTTP transactions are bound to on e at a time. @@ -378,20 +397,13 @@ struct wcsession { 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 */ + int is_mobile; /**< Client is a handheld browser */ + HashList *urlstrings; /**< variables passed to webcit in a URL */ + HashList *vars; /**< HTTP variable substitutions for this page */ char this_page[512]; /**< URL of current page */ char http_host[512]; /**< HTTP Host: header */ HashList *hash_prefs; /**< 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 + HashList *disp_cal_items; /**< sorted list of calendar items; startdate is the sort criteria. */ struct wc_attachment *first_attachment; /**< linked list of attachments for 'enter message' */ char last_chat_user[256]; /**< ??? todo */ char ImportantMessage[SIZ]; /**< ??? todo */ @@ -407,12 +419,15 @@ struct wcsession { int cache_max_folders; /**< ??? todo */ int cache_num_floors; /**< ??? todo */ time_t cache_timestamp; /**< ??? todo */ - int current_iconbar; /**< What is currently in the iconbar? */ - char floordiv_expanded[32]; /**< which floordiv currently expanded */ + HashList *IconBarSetttings; /**< which icons should be shown / not shown? */ + long current_iconbar; /**< What is currently in the iconbar? */ + StrBuf *floordiv_expanded; /**< which floordiv currently expanded */ int selected_language; /**< Language selected by user */ time_t last_pager_check; /**< last time we polled for instant msgs */ int nonce; /**< session nonce (to prevent session riding) */ int time_format_cache; /**< which timeformat does our user like? */ + StrBuf *UrlFragment1; /**< first urlfragment, if NEED_URL is specified by the handler*/ + StrBuf *UrlFragment2; /**< second urlfragment, if NEED_URL is specified by the handler*/ }; /** values for WC->current_iconbar */ @@ -455,6 +470,7 @@ extern int setup_wizard; extern char wizard_filename[]; extern time_t if_modified_since; extern int follow_xff; +extern HashList *HandlerHash; void do_setup_wizard(void); @@ -472,7 +488,14 @@ void cookie_to_stuff(char *cookie, int *session, void locate_host(char *, int); void become_logged_in(char *, char *, char *); void do_login(void); +void do_openid_login(void); +void finalize_openid_login(void); +void openid_manual_create(void); void display_login(char *mesg); +void display_openid_login(char *mesg); +void display_openids(void); +void openid_attach(void); +void openid_detach(void); void do_welcome(void); void do_logout(void); void display_main_menu(void); @@ -485,7 +508,8 @@ void ungoto(void); void get_serv_info(char *, char *); int uds_connectsock(char *); int tcp_connectsock(char *, char *); -void serv_getln(char *strbuf, int bufsize); +int serv_getln(char *strbuf, int bufsize); +int StrBuf_ServGetln(StrBuf *buf); void serv_puts(char *string); void who(void); void who_inner_div(void); @@ -497,8 +521,33 @@ void new_messages_section(void); void fmout(char *align); void pullquote_fmout(void); void wDumpContent(int); -void serv_printf(const char *format,...); -char *bstr(char *key); + +/* TODO: get rid of the non-const-typecast */ +#define bstr(a) (char*) Bstr(a, sizeof(a) - 1) +const char *BSTR(char *key); +const char *Bstr(char *key, size_t keylen); + +#define xbstr(a, b) (char*) XBstr(a, sizeof(a) - 1, b) +const char *XBstr(char *key, size_t keylen, size_t *len); +const char *XBSTR(char *key, size_t *len); + +#define lbstr(a) LBstr(a, sizeof(a) - 1) +long LBstr(char *key, size_t keylen); +long LBSTR(char *key); + +#define ibstr(a) IBstr(a, sizeof(a) - 1) +int IBstr(char *key, size_t keylen); +int IBSTR(char *key); + +#define havebstr(a) HaveBstr(a, sizeof(a) - 1) +int HaveBstr(char *key, size_t keylen); +int HAVEBSTR(char *key); + +#define yesbstr(a) YesBstr(a, sizeof(a) - 1) +int YesBstr(char *key, size_t keylen); +int YESBSTR(char *key); + + void urlescputs(char *); void jsesc(char *, size_t, char *); void jsescputs(char *); @@ -508,13 +557,13 @@ void output_headers( int do_httpheaders, int unset_cookies, int suppress_check, int cache); -void wprintf(const char *format,...); +void wprintf(const char *format,...)__attribute__((__format__(__printf__,1,2))); void output_static(char *what); void display_mime_icon(void); void print_menu_box(char* Title, char *Class, int nLines, ...); long stresc(char *target, long tSize, char *strbuf, int nbsp, int nolinebreaks); void escputs(char *strbuf); -void url(char *buf); +void url(char *buf, size_t bufsize); void escputs1(char *strbuf, int nbsp, int nolinebreaks); void msgesc(char *target, size_t tlen, char *strbuf); void msgescputs(char *strbuf); @@ -525,9 +574,9 @@ void embed_main_menu(void); void serv_read(char *buf, int bytes); 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 embed_message(void); +void print_message(void); +void display_headers(void); void text_to_server(char *ptr); void text_to_server_qp(char *ptr); void display_enter(void); @@ -569,7 +618,7 @@ void serv_read(char *buf, int bytes); void serv_gets(char *strbuf); void serv_write(char *buf, int nbytes); void serv_puts(char *string); -void serv_printf(const char *format,...); +void serv_printf(const char *format,...)__attribute__((__format__(__printf__,1,2))); void load_floorlist(void); void display_reg(int); void display_changepw(void); @@ -601,12 +650,25 @@ void end_webcit_session(void); void page_popup(void); void chat_recv(void); void chat_send(void); -void http_redirect(char *); +void http_redirect(const char *); void clear_substs(struct wcsession *wc); void clear_local_substs(void); -void svprintf(char *keyname, int keytype, const char *format,...); -void svcallback(char *keyname, void (*fcn_ptr)() ); + + +typedef void (*var_callback_fptr)(); + + +void SVPut(char *keyname, size_t keylen, int keytype, char *Data); +#define svput(a, b, c) SVPut(a, sizeof(a) - 1, b, c) +void svprintf(char *keyname, size_t keylen, int keytype, const char *format,...) __attribute__((__format__(__printf__,4,5))); +void SVPRINTF(char *keyname, int keytype, const char *format,...) __attribute__((__format__(__printf__,3,4))); +void SVCALLBACK(char *keyname, var_callback_fptr fcn_ptr); +void SVCallback(char *keyname, size_t keylen, var_callback_fptr fcn_ptr); +#define svcallback(a, b) SVCallback(a, sizeof(a) - 1, b) + void do_template(void *templatename); + + int lingering_close(int fd); char *memreadline(char *start, char *buf, int maxlen); char *memreadlinelen(char *start, char *buf, int maxlen, int *retlen); @@ -627,13 +689,31 @@ void edituser(void); void do_change_view(int); void change_view(void); void folders(void); + + void load_preferences(void); void save_preferences(void); -void get_preference(char *key, char *value, size_t value_len); -void set_preference(char *key, char *value, int save_to_server); +#define get_preference(a, b) get_PREFERENCE(a, sizeof(a) - 1, b) +#define get_pref(a, b) get_PREFERENCE(ChrPtr(a), StrLength(a), b) +int get_PREFERENCE(const char *key, size_t keylen, StrBuf **value); +#define set_preference(a, b, c) set_PREFERENCE(a, sizeof(a) - 1, b, c) +#define set_pref(a, b, c) set_PREFERENCE(ChrPtr(a), StrLength(a), b, c) +void set_PREFERENCE(const char *key, size_t keylen, StrBuf *value, int save_to_server); + +#define get_pref_long(a, b, c) get_PREF_LONG(a, sizeof(a) - 1, b, c) +int get_PREF_LONG(const char *key, size_t keylen, long *value, long Default); +#define set_pref_long(a, b, c) set_PREF_LONG(a, sizeof(a) - 1, b, c) +void set_PREF_LONG(const char *key, size_t keylen, long value, int save_to_server); + +#define get_pref_yesno(a, b, c) get_PREF_YESNO(a, sizeof(a) - 1, b, c) +int get_PREF_YESNO(const char *key, size_t keylen, int *value, int Default); +#define set_pref_yesno(a, b, c) set_PREF_YESNO(a, sizeof(a) - 1, b, c) +void set_PREF_YESNO(const char *key, size_t keylen, int 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); @@ -649,13 +729,14 @@ 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 display_calendar(long msgnum, int unread); +void display_task(long msgnum, int unread); +void display_note(long msgnum, int unread); +void add_new_note(void); void updatenote(void); +void ajax_update_note(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 free_attachments(struct wcsession *sess); @@ -686,21 +767,23 @@ void end_ajax_response(void); void initialize_viewdefs(void); void initialize_axdefs(void); void burn_folder_cache(time_t age); -void list_all_rooms_by_floor(char *viewpref); +void list_all_rooms_by_floor(const char *viewpref); void display_room_directory(void); -void download_file(char *); +void display_picture(void); +void display_pictureview(void); +void download_file(void); void upload_file(void); -#ifdef WEBCIT_WITH_CALENDAR_SERVICE void display_edit_task(void); void save_task(void); void display_edit_event(void); void save_event(void); +icaltimezone *get_default_icaltimezone(void); void display_icaltimetype_as_webform(struct icaltimetype *, char *); 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 display_edit_individual_event(icalcomponent *supplied_vtodo, long msgnum, char *from, int unread); +void save_individual_event(icalcomponent *supplied_vtodo, long msgnum, char *from, int unread); void respond_to_request(void); void handle_rsvp(void); void ical_dezonify(icalcomponent *cal); @@ -714,7 +797,6 @@ int ical_ctdl_is_overlap( struct icaltimetype t2start, struct icaltimetype t2end ); -#endif #ifdef ENABLE_NLS void initialize_locales(void); @@ -729,7 +811,7 @@ long locate_user_vcard(char *username, long usernum); void sleeeeeeeeeep(int); void http_transmit_thing(char *thing, size_t length, const char *content_type, int is_static); -void unescape_input(char *buf); +long unescape_input(char *buf); void do_iconbar(void); void do_iconbar_roomlist(void); void do_selected_iconbar(void); @@ -738,7 +820,7 @@ 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 set_floordiv_expanded(void); void offer_languages(void); void set_selected_language(char *); void go_selected_language(void); @@ -753,6 +835,9 @@ void display_wiki_page(void); int get_time_format_cached (void); int xtoi(char *in, size_t len); void webcit_fmt_date(char *buf, time_t thetime, int brief); +int fetch_http(char *url, char *target_buf, int maxbytes); + +int is_mobile_ua(char *user_agent); #ifdef HAVE_ICONV iconv_t ctdl_iconv_open(const char *tocode, const char *fromcode); @@ -783,9 +868,7 @@ int ZEXPORT compress_gzip(Bytef * dest, size_t * 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); @@ -795,6 +878,18 @@ extern char *hourname[]; /**< Names of hours (12am, 1am, etc.) */ void http_datestring(char *buf, size_t n, time_t xtime); +typedef void (*WebcitHandlerFunc)(void); +typedef struct _WebcitHandler{ + WebcitHandlerFunc F; + long Flags; +} WebcitHandler; +void WebcitAddUrlHandler(const char * UrlString, long UrlSLen, WebcitHandlerFunc F, long Flags); + +#define AJAX (1<<0) +#define ANONYMOUS (1<<1) +#define NEED_URL (1<<2) + + /* These should be empty, but we have them for testing */ #define DEFAULT_HTTPAUTH_USER "" #define DEFAULT_HTTPAUTH_PASS ""