1 // webcit.h - "header of headers"
3 // Copyright (c) 1996-2022 by the citadel.org team
5 // This program is open source software. You can redistribute it and/or
6 // modify it under the terms of the GNU General Public License, version 3.
8 #define SHOW_ME_VAPPEND_PRINTF
18 #include <sys/types.h>
19 #include <sys/socket.h>
20 #include <netinet/in.h>
21 #include <arpa/inet.h>
36 #include <libcitadel.h>
37 #define OPENSSL_NO_KRB5 // Work around RedHat's b0rken OpenSSL includes
38 #include <openssl/ssl.h>
39 #include <openssl/err.h>
40 #include <openssl/rand.h>
42 #define _(x) x // temporary hack until we add i18n back in
43 #define DEBUG_HTTP // uncomment to debug HTTP headers
45 // XML_StopParser is present in expat 2.x
46 #if XML_MAJOR_VERSION > 1
47 #define HAVE_XML_STOPPARSER
50 struct client_handle { // this gets passed up the stack from the webserver to the application code
55 struct keyval { // key/value pair (for array)
60 struct http_transaction { // The lifetime of an HTTP request goes through this data structure.
61 char *method; // The top half is built up by the web server and sent up to the
62 char *url; // application stack. The second half is built up by the application
63 char *http_version; // stack and sent back down to the web server, which transmits it to
64 char *site_prefix; // the client.
65 Array *request_headers;
67 long request_body_length;
68 Array *request_parms; // anything after the "?" in the URL
70 char *response_string;
71 Array *response_headers;
73 long response_body_length;
76 #define AUTH_MAX 256 // Maximum length of an HTTP AUTH header or equivalent cookie data
78 struct ctdlsession *next;
79 int is_bound; // Nonzero if this record is currently bound to a running thread
80 int sock; // Socket connection to Citadel server
81 char auth[AUTH_MAX]; // Auth string (empty if not logged in)
82 char whoami[64]; // Display name of currently logged in user (empty if not logged in)
83 char room[128]; // What room we are currently in
84 int room_current_view;
85 int room_default_view;
89 time_t last_access; // Timestamp of last request that used this session
90 time_t num_requests_handled;
93 extern char *ssl_cipher_list;
94 extern int is_https; // nonzero if we are an HTTPS server today
95 extern char *ctdl_dir; // directory where Citadel Server is running
97 void starttls(struct client_handle *);
98 void endtls(struct client_handle *);
99 int client_write_ssl(struct client_handle *ch, char *buf, int nbytes);
100 int client_read_ssl(struct client_handle *ch, char *buf, int nbytes);
108 #define TRACE syslog(LOG_DEBUG, "\033[3%dmCHECKPOINT: %s:%d\033[0m", ((__LINE__%6)+1), __FILE__, __LINE__)
109 #define SLEEPING 180 // TCP connection timeout
110 #define MAX_WORKER_THREADS 32 // Maximum number of worker threads permitted to exist
111 #define DEFAULT_SSL_CIPHER_LIST "DEFAULT" // See http://openssl.org/docs/apps/ciphers.html
112 #define WEBSERVER_PORT 80
113 #define WEBSERVER_INTERFACE "*"
114 #define CTDL_DIR "/usr/local/citadel"
115 #define DEVELOPER_ID 0
117 #define TARGET "webcit02" /* Window target for inline URL's */
119 void worker_entry(int *pointer_to_master_socket);
120 void perform_one_http_transaction(struct client_handle *ch);
121 void add_response_header(struct http_transaction *h, char *key, char *val);
122 void perform_request(struct http_transaction *);
123 void do_404(struct http_transaction *);
124 void output_static(struct http_transaction *);
125 int uds_connectsock(char *sockpath);
126 void ctdl_a(struct http_transaction *, struct ctdlsession *);
127 void ctdl_r(struct http_transaction *, struct ctdlsession *);
128 void ctdl_u(struct http_transaction *, struct ctdlsession *);
129 struct ctdlsession *connect_to_citadel(struct http_transaction *);
130 void disconnect_from_citadel(struct ctdlsession *);
131 char *header_val(struct http_transaction *h, char *requested_header);
132 char *get_url_param(struct http_transaction *h, char *requested_param);
133 int unescape_input(char *);
134 void http_redirect(struct http_transaction *h, char *to_where);
135 char *http_datestring(time_t xtime);
136 long *get_msglist(struct ctdlsession *c, char *which_msgs);
137 void caldav_report(struct http_transaction *h, struct ctdlsession *c);
138 long locate_message_by_uid(struct ctdlsession *c, char *uid);
139 void ctdl_delete_msgs(struct ctdlsession *c, long *msgnums, int num_msgs);
140 void dav_delete_message(struct http_transaction *h, struct ctdlsession *c, long msgnum);
141 void dav_get_message(struct http_transaction *h, struct ctdlsession *c, long msgnum);
142 void dav_put_message(struct http_transaction *h, struct ctdlsession *c, char *euid, long old_msgnum);
143 ssize_t ctdl_write(struct ctdlsession *ctdl, const void *buf, size_t count);
144 int login_to_citadel(struct ctdlsession *c, char *auth, char *resultbuf);
145 StrBuf *ctdl_readtextmsg(struct ctdlsession *ctdl);
146 StrBuf *html2html(const char *supplied_charset, int treat_as_wiki, char *roomname, long msgnum, StrBuf *Source);
147 void download_mime_component(struct http_transaction *h, struct ctdlsession *c, long msgnum, char *partnum);
148 StrBuf *text2html(const char *supplied_charset, int treat_as_wiki, char *roomname, long msgnum, StrBuf *Source);
149 StrBuf *variformat2html(StrBuf *Source);
150 int ctdl_readline(struct ctdlsession *ctdl, char *buf, int maxbytes);
151 int ctdl_read_binary(struct ctdlsession *ctdl, char *buf, int bytes_requested);
152 void ctdl_c(struct http_transaction *h, struct ctdlsession *c);
153 int webserver(char *webserver_interface, int webserver_port, int webserver_protocol);
154 void ctdl_printf(struct ctdlsession *ctdl, const char *format,...);
155 int webcit_tcp_server(const char *ip_addr, int port_number, int queue_len);
156 void do_502(struct http_transaction *h);
157 void do_404(struct http_transaction *h);
158 void do_412(struct http_transaction *h);
159 void UrlizeText(StrBuf* Target, StrBuf *Source, StrBuf *WrkBuf);
160 void json_render_one_message(struct http_transaction *h, struct ctdlsession *c, long msgnum);