moved vars to vars.js
[citadel.git] / webcit-ng / webcit.h
1 // webcit.h - "header of headers"
2 //
3 // Copyright (c) 1996-2022 by the citadel.org team
4 //
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.
7
8 #define SHOW_ME_VAPPEND_PRINTF
9
10 #include <stdlib.h>
11 #include <unistd.h>
12 #include <stdio.h>
13 #include <ctype.h>
14 #include <syslog.h>
15 #include <string.h>
16 #include <fcntl.h>
17 #include <sys/stat.h>
18 #include <sys/types.h>
19 #include <sys/socket.h>
20 #include <netinet/in.h>
21 #include <arpa/inet.h>
22 #include <netdb.h>
23 #include <sys/un.h>
24 #include <sys/poll.h>
25 #include <sys/time.h>
26 #include <string.h>
27 #include <pwd.h>
28 #include <errno.h>
29 #include <stdarg.h>
30 #include <pthread.h>
31 #include <signal.h>
32 #include <syslog.h>
33 #include <stdarg.h>
34 #include <limits.h>
35 #include <iconv.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>
41 #include <expat.h>
42 #define _(x)    x                               // temporary hack until we add i18n back in
43 #define DEBUG_HTTP                              // uncomment to debug HTTP headers
44
45 // XML_StopParser is present in expat 2.x
46 #if XML_MAJOR_VERSION > 1
47 #define HAVE_XML_STOPPARSER
48 #endif
49
50 struct client_handle {                          // this gets passed up the stack from the webserver to the application code
51         int sock;
52         SSL *ssl_handle;
53 };
54
55 struct keyval {                                 // key/value pair (for array)
56         char *key;
57         char *val;
58 };
59
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;
66         char *request_body;
67         long request_body_length;
68         Array *request_parms;                   // anything after the "?" in the URL
69         int response_code;
70         char *response_string;
71         Array *response_headers;
72         char *response_body;
73         long response_body_length;
74 };
75
76 #define AUTH_MAX 256                            // Maximum length of an HTTP AUTH header or equivalent cookie data
77 struct ctdlsession {
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;
86         int is_room_aide;                       // nonzero if the user has aide rights to THIS room
87         long last_seen;
88         int new_messages;
89         int total_messages;
90         time_t last_access;                     // Timestamp of last request that used this session
91         time_t num_requests_handled;
92 };
93
94 extern char *ssl_cipher_list;
95 extern int is_https;                            // nonzero if we are an HTTPS server today
96 extern char *ctdl_dir;                          // directory where Citadel Server is running
97 void init_ssl(void);
98 void starttls(struct client_handle *);
99 void endtls(struct client_handle *);
100 int client_write_ssl(struct client_handle *ch, char *buf, int nbytes);
101 int client_read_ssl(struct client_handle *ch, char *buf, int nbytes);
102
103 enum {
104         WEBSERVER_HTTP,
105         WEBSERVER_HTTPS,
106         WEBSERVER_UDS
107 };
108
109 #define TRACE syslog(LOG_DEBUG, "\033[3%dmCHECKPOINT: %s:%d\033[0m", ((__LINE__%6)+1), __FILE__, __LINE__)
110 #define SLEEPING                180             // TCP connection timeout
111 #define MAX_WORKER_THREADS      32              // Maximum number of worker threads permitted to exist
112 #define DEFAULT_SSL_CIPHER_LIST "DEFAULT"       // See http://openssl.org/docs/apps/ciphers.html
113 #define WEBSERVER_PORT          80
114 #define WEBSERVER_INTERFACE     "*"
115 #define CTDL_DIR                "/usr/local/citadel"
116 #define DEVELOPER_ID            0
117 #define CLIENT_ID               4
118 #define TARGET                  "webcit02"      /* Window target for inline URL's */
119
120 void worker_entry(int *);
121 void perform_one_http_transaction(struct client_handle *ch);
122 void add_response_header(struct http_transaction *h, char *key, char *val);
123 void perform_request(struct http_transaction *);
124 void do_204(struct http_transaction *);
125 void do_404(struct http_transaction *);
126 void do_412(struct http_transaction *);
127 void do_502(struct http_transaction *);
128 void output_static(struct http_transaction *);
129 int uds_connectsock(char *);
130 void ctdl_a(struct http_transaction *, struct ctdlsession *);
131 void ctdl_f(struct http_transaction *, struct ctdlsession *);
132 void ctdl_r(struct http_transaction *, struct ctdlsession *);
133 void ctdl_u(struct http_transaction *, struct ctdlsession *);
134 struct ctdlsession *connect_to_citadel(struct http_transaction *);
135 void disconnect_from_citadel(struct ctdlsession *);
136 char *header_val(struct http_transaction *h, char *requested_header);
137 char *get_url_param(struct http_transaction *h, char *requested_param);
138 int unescape_input(char *);
139 void http_redirect(struct http_transaction *h, char *to_where);
140 char *http_datestring(time_t xtime);
141 long *get_msglist(struct ctdlsession *c, char *which_msgs);
142 void caldav_report(struct http_transaction *h, struct ctdlsession *c);
143 long locate_message_by_uid(struct ctdlsession *c, char *uid);
144 void ctdl_delete_msgs(struct ctdlsession *c, long *msgnums, int num_msgs);
145 void dav_delete_message(struct http_transaction *h, struct ctdlsession *c, long msgnum);
146 void dav_get_message(struct http_transaction *h, struct ctdlsession *c, long msgnum);
147 void dav_put_message(struct http_transaction *h, struct ctdlsession *c, char *euid, long old_msgnum);
148 ssize_t ctdl_write(struct ctdlsession *ctdl, const void *buf, size_t count);
149 int login_to_citadel(struct ctdlsession *c, char *auth, char *resultbuf);
150 StrBuf *ctdl_readtextmsg(struct ctdlsession *ctdl);
151 StrBuf *html2html(const char *supplied_charset, int treat_as_wiki, char *roomname, long msgnum, StrBuf *Source);
152 void download_mime_component(struct http_transaction *h, struct ctdlsession *c, long msgnum, char *partnum);
153 StrBuf *text2html(const char *supplied_charset, int treat_as_wiki, char *roomname, long msgnum, StrBuf *Source);
154 StrBuf *variformat2html(StrBuf *Source);
155 int ctdl_readline(struct ctdlsession *ctdl, char *buf, int maxbytes);
156 int ctdl_read_binary(struct ctdlsession *ctdl, char *buf, int bytes_requested);
157 void ctdl_c(struct http_transaction *h, struct ctdlsession *c);
158 int webserver(char *webserver_interface, int webserver_port, int webserver_protocol);
159 void ctdl_printf(struct ctdlsession *ctdl, const char *format,...);
160 int webcit_tcp_server(const char *ip_addr, int port_number, int queue_len);
161 void UrlizeText(StrBuf* Target, StrBuf *Source, StrBuf *WrkBuf);
162 void json_render_one_message(struct http_transaction *h, struct ctdlsession *c, long msgnum);