X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fwebcit.h;h=2265e9bd7f8708617fce291af7c25e3819a4d1e3;hb=cf934431c7c8c1091b38c0b374f6a3b9293841ca;hp=3f18d3fdfc651034b00fffa648c8895da6d0d543;hpb=da9bc113d0f6727d9543dee3a2e7a4bd1bf03af5;p=citadel.git diff --git a/webcit/webcit.h b/webcit/webcit.h index 3f18d3fdf..2265e9bd7 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -1,8 +1,10 @@ /* $Id$ */ -#include "config.h" +#include "sysdep.h" +#include + #include #include #ifdef HAVE_UNISTD_H @@ -36,6 +38,8 @@ #include #include +#include + #ifndef INADDR_NONE #define INADDR_NONE 0xffffffff #endif @@ -47,12 +51,15 @@ #ifdef ENABLE_NLS #include #include +#ifdef HAVE_USELOCALE extern locale_t wc_locales[]; +#endif #define _(string) gettext(string) #else #define _(string) (string) #endif +#define IsEmptyStr(a) ((a)[0] == '\0') /* * Uncomment to dump an HTTP trace to stderr #define HTTP_TRACING 1 @@ -67,42 +74,35 @@ extern locale_t wc_locales[]; #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 PACKAGE_STRING +# define CTDL_PACKAGE_STRING PACKAGE_STRING +//# undef PACKAGE_STRING +#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 +#undef PACKAGE +#undef VERSION +#undef PACKAGE_NAME +#undef PACKAGE_STRING +#undef PACKAGE_TARNAME +#undef PACKAGE_VERSION +#undef PACKAGE_BUGREPORT +#include "sysdep.h" +////////#include "hash.h" #ifdef HAVE_OPENSSL /* Work around RedHat's b0rken OpenSSL includes */ @@ -122,11 +122,11 @@ extern locale_t wc_locales[]; #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.84" /* who's in da house */ #define DEVELOPER_ID 0 #define CLIENT_ID 4 -#define CLIENT_VERSION 684 /* This version of WebCit */ -#define MINIMUM_CIT_VERSION 684 /* min required Citadel ver. */ +#define CLIENT_VERSION 734 /* This version of WebCit */ +#define MINIMUM_CIT_VERSION 730 /* min required Citadel ver */ +#define LIBCITADEL_MIN 109 /* min required libcitadel ver */ #define DEFAULT_HOST "localhost" /* Default Citadel server */ #define DEFAULT_PORT "504" #define LB (1) /* Internal escape chars */ @@ -142,6 +142,13 @@ extern locale_t wc_locales[]; #define DEFAULT_MAXMSGS 20 +#ifdef LIBCITADEL_VERSION_NUMBER +#if LIBCITADEL_VERSION_NUMBER < LIBCITADEL_MIN +#error libcitadel is too old. Please upgrade it before continuing. +#endif +#endif + + /* * Room flags (from Citadel) * @@ -168,6 +175,10 @@ extern locale_t wc_locales[]; */ #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 */ +#define QR2_SMTP_PUBLIC 16 /* smtp public postable room */ +#define QR2_MODERATED 32 /* Listservice aide has to permit posts */ /** * user/room access @@ -198,6 +209,11 @@ extern locale_t wc_locales[]; US_NOPROMPT | US_DISAPPEAR | US_PAGINATOR | \ US_FLOORS | US_COLOR | US_PROMPTCTL ) +/* + * NLI is the string that shows up in a who's online listing for sessions + * that are active, but for which no user has yet authenticated. + */ +#define NLI "(not logged in)" /** \brief Linked list of lines appearing in an HTTP client request */ @@ -219,19 +235,21 @@ struct urlcontent { * \brief information about us ??? */ struct serv_info { - 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 */ + 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 */ + int serv_supports_sieve; /* Does the server support Sieve mail filtering? */ + int serv_fulltext_enabled; /* Does the server have the full text index enabled? */ }; @@ -316,6 +334,7 @@ struct folder { int is_mailbox; /**< is it a mailbox? */ int selectable; /**< can we select it ??? */ int view; /**< whats its default view? inbox/calendar.... */ + int num_rooms; /**< If this is a floor, how many rooms does it have */ }; /** @@ -338,6 +357,7 @@ struct wcsession { 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 */ @@ -366,15 +386,14 @@ struct wcsession { 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???? */ + HashList *hash_prefs; /**< WebCit preferences for this user */ 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? */ } *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 */ @@ -394,6 +413,8 @@ struct wcsession { 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 */ + int nonce; /**< session nonce (to prevent session riding) */ + int time_format_cache; /**< which timeformat does our user like? */ }; /** values for WC->current_iconbar */ @@ -401,9 +422,15 @@ enum { current_iconbar_menu, /**< view the icon menue */ current_iconbar_roomlist /**< view the roomtree */ }; +enum { + S_SELECT, + S_SHUTDOWN, + MAX_SEMAPHORES +}; - +#ifndef num_parms #define num_parms(source) num_tokens(source, '|') +#endif /* Per-session data */ #define WC ((struct wcsession *)pthread_getspecific(MyConKey)) @@ -413,6 +440,10 @@ extern pthread_key_t MyConKey; #ifdef HAVE_OPENSSL #define THREADSSL ((SSL *)pthread_getspecific(ThreadSSL)) extern pthread_key_t ThreadSSL; +extern char ctdl_key_dir[PATH_MAX]; +extern char file_crpt_file_key[PATH_MAX]; +extern char file_crpt_file_csr[PATH_MAX]; +extern char file_crpt_file_cer[PATH_MAX]; #endif struct serv_info serv_info; @@ -428,7 +459,13 @@ extern time_t if_modified_since; extern int follow_xff; void do_setup_wizard(void); -void stuff_to_cookie(char *cookie, int session, + +void InitialiseSemaphores(void); +void begin_critical_section(int which_one); +void end_critical_section(int which_one); + + +void stuff_to_cookie(char *cookie, size_t clen, int session, char *user, char *pass, char *room); void cookie_to_stuff(char *cookie, int *session, char *user, size_t user_len, @@ -442,6 +479,7 @@ void do_welcome(void); void do_logout(void); void display_main_menu(void); void display_aide_menu(void); +void display_shutdown(void); void display_advanced_menu(void); void slrp_highest(void); void gotonext(void); @@ -449,18 +487,22 @@ 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); 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 ajax_mini_calendar(void); +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); -void urlesc(char *, char *); void urlescputs(char *); -void jsesc(char *, char *); +void jsesc(char *, size_t, char *); void jsescputs(char *); void output_headers( int do_httpheaders, int do_htmlhead, @@ -470,19 +512,19 @@ void output_headers( int do_httpheaders, int cache); void wprintf(const char *format,...); void output_static(char *what); -void stresc(char *target, char *strbuf, int nbsp, int nolinebreaks); +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 escputs1(char *strbuf, int nbsp, int nolinebreaks); -void msgesc(char *target, char *strbuf); +void msgesc(char *target, size_t tlen, char *strbuf); void msgescputs(char *strbuf); -int extract_int(const char *source, int parmnum); -long extract_long(const char *source, int parmnum); +void msgescputs1(char *strbuf); 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 read_message(long msgnum, int printable_view, char *section); void embed_message(char *msgnum_as_string); @@ -540,8 +582,9 @@ void display_netconf(void); void display_confirm_delete_node(void); void delete_node(void); void display_add_node(void); -void add_node(void); void terminate_session(void); +void shutdown_sessions(void); +void do_housekeeping(void); void edit_me(void); void display_siteconfig(void); void siteconfig(void); @@ -553,7 +596,6 @@ 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(char *buf); @@ -562,21 +604,23 @@ void page_popup(void); void chat_recv(void); void chat_send(void); void http_redirect(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)() ); 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, const char *source, int parmnum, char separator, int maxlen); +char *memreadlinelen(char *start, char *buf, int maxlen, int *retlen); +long 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); -void do_edit_vcard(long, char *, char *); +void do_edit_vcard(long, char *, char *, char *); void edit_vcard(void); void submit_vcard(void); void striplt(char *); +void stripltlen(char *, int *); void select_user_to_edit(char *message, char *preselect); void delete_user(char *); void display_edituser(char *who, int is_new); @@ -591,7 +635,6 @@ 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); @@ -607,34 +650,50 @@ 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 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); -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_pushemail(void); +void save_pushemail(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 burn_folder_cache(time_t age); void list_all_rooms_by_floor(char *viewpref); +void display_room_directory(void); +void display_picture(void); +void display_pictureview(void); +void download_file(char *); +void upload_file(void); -#ifdef WEBCIT_WITH_CALENDAR_SERVICE void display_edit_task(void); void save_task(void); void display_edit_event(void); @@ -642,8 +701,8 @@ void save_event(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); @@ -651,7 +710,12 @@ void partstat_as_string(char *buf, icalproperty *attendee); icalcomponent *ical_encapsulate_subcomponent(icalcomponent *subcomp); void check_attendee_availability(icalcomponent *supplied_vevent); void do_freebusy(char *req); -#endif +int ical_ctdl_is_overlap( + struct icaltimetype t1start, + struct icaltimetype t1end, + struct icaltimetype t2start, + struct icaltimetype t2end +); #ifdef ENABLE_NLS void initialize_locales(void); @@ -664,7 +728,7 @@ char *read_server_text(void); int goto_config_room(void); long locate_user_vcard(char *username, long usernum); void sleeeeeeeeeep(int); -void http_transmit_thing(char *thing, size_t length, char *content_type, +void http_transmit_thing(char *thing, size_t length, const char *content_type, int is_static); void unescape_input(char *buf); void do_iconbar(void); @@ -680,13 +744,17 @@ void offer_languages(void); void set_selected_language(char *); void go_selected_language(void); void stop_selected_language(void); +void preset_locale(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); +int get_time_format_cached (void); +int xtoi(char *in, size_t len); +void webcit_fmt_date(char *buf, time_t thetime, int brief); + #ifdef HAVE_ICONV iconv_t ctdl_iconv_open(const char *tocode, const char *fromcode); @@ -713,13 +781,11 @@ void client_write_ssl(char *buf, int nbytes); #ifdef HAVE_ZLIB #include -int ZEXPORT compress_gzip(Bytef * dest, uLongf * destLen, +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); @@ -729,18 +795,20 @@ 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 */ -#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 */ + + +#define WC_TIMEFORMAT_NONE 0 +#define WC_TIMEFORMAT_AMPM 1 +#define WC_TIMEFORMAT_24 2 + +