Imported Upstream version 3.2.0
[platform/upstream/libwebsockets.git] / minimal-examples / http-server / minimal-http-server-generic-sessions / minimal-http-server-generic-sessions.c
1 /*
2  * lws-minimal-http-server-generic-sessions
3  *
4  * Copyright (C) 2019 Andy Green <andy@warmcat.com>
5  *
6  * This file is made available under the Creative Commons CC0 1.0
7  * Universal Public Domain Dedication.
8  *
9  * This demonstrates setting up and using generic sessions
10  */
11
12 #include <libwebsockets.h>
13 #include <string.h>
14 #include <signal.h>
15
16 static int interrupted;
17 struct lws_context *context;
18
19 static const struct lws_protocol_vhost_options
20    pvo_mm1 = {
21         NULL, NULL, "message-db", (void *)"/var/www/sessions/messageboard.sqlite3"
22 }, pvo_m1 = {
23         NULL, &pvo_mm1, "protocol-lws-messageboard", ""
24 },
25
26    pvo13 = {
27         NULL, NULL, "email-confirm-url-base", (void *)"https://localhost:7681/"
28 }, pvo12 = {
29         &pvo13, NULL, "urlroot", (void *)"https://127.0.0.1:7681/"
30 }, pvo11 = {
31         &pvo12, NULL, "email-contact-person", (void *)"andy@warmcat.com"
32 }, pvo10 = {
33         &pvo11, NULL, "email-helo", (void *)"warmcat.com"
34 }, pvo9 = {
35         &pvo10, NULL, "email-expire", (void *)"3600"
36 }, pvo8 = {
37         &pvo9,  NULL, "email-smtp-ip", (void *)"127.0.0.1"
38 }, pvo7 = {
39         &pvo8,  NULL, "email-from", (void *)"noreply@warmcat.com"
40 }, pvo6 = {
41         &pvo7,  NULL, "confounder", (void *)"some kind of secret confounder"
42 }, pvo5 = {
43         &pvo6,  NULL, "timeout-anon-idle-secs", (void *)"1200"
44 }, pvo4 = {
45         &pvo5,  NULL, "timeout-idle-secs", (void *)"6000"
46 }, pvo3 = {
47         &pvo4,  NULL, "session-db", (void *)"/var/www/sessions/lws.sqlite3"
48 }, pvo2 = {
49         &pvo3, NULL, "admin-password-sha256",
50         (void *)"25d08521d996bad92605f5a40fe71179dc968e70f669cb1db6190dcd53258200"      /* pvo value */
51 }, pvo1 = {
52         &pvo2, NULL, "admin-user", (void *)"admin"
53 }, pvo = {
54         &pvo_m1, &pvo1, "protocol-generic-sessions", ""
55 },
56
57    interpret1 = {
58         NULL, NULL, ".js", "protocol-lws-messageboard"
59 },
60
61    pvo_hsbph[] = {{
62         NULL, NULL,             "referrer-policy:", "no-referrer"
63 }, {
64         &pvo_hsbph[0], NULL,    "x-xss-protection:", "1; mode=block"
65 }, {
66         &pvo_hsbph[1], NULL,    "x-content-type-options:", "nosniff"
67 }, {
68         &pvo_hsbph[2], NULL,    "content-security-policy:",
69                                 "default-src 'self'; "
70                                 "img-src https://www.gravatar.com 'self' data: ; "
71                                 "script-src 'self'; "
72                                 "font-src 'self'; "
73                                 "style-src 'self'; "
74                                 "connect-src 'self'; "
75                                 "frame-ancestors 'self'; "
76                                 "base-uri 'none'; "
77                                 "form-action  'self';"
78 }};
79
80  static const struct lws_http_mount mount2 = {
81         /* .mount_next */               NULL,   /* linked-list "next" */
82         /* .mountpoint */               "/needadmin",           /* mountpoint URL */
83         /* .origin */                   "./mount-origin/needadmin", /* serve from dir */
84         /* .def */                      "index.html",   /* default filename */
85         /* .protocol */                 "protocol-lws-messageboard",
86         /* .cgienv */                   NULL,
87         /* .extra_mimetypes */          NULL,
88         /* .interpret */                &interpret1,
89         /* .cgi_timeout */              0,
90         /* .cache_max_age */            0,
91         /* .auth_mask */                7,
92         /* .cache_reusable */           0,
93         /* .cache_revalidate */         0,
94         /* .cache_intermediaries */     0,
95         /* .origin_protocol */          LWSMPRO_FILE,   /* files in a dir */
96         /* .mountpoint_len */           1,              /* char count */
97         /* .basic_auth_login_file */    NULL,
98  };
99
100  static const struct lws_http_mount mount1 = {
101         /* .mount_next */               &mount2,        /* linked-list "next" */
102         /* .mountpoint */               "/needauth",            /* mountpoint URL */
103         /* .origin */                   "./mount-origin/needauth", /* serve from dir */
104         /* .def */                      "index.html",   /* default filename */
105         /* .protocol */                 "protocol-lws-messageboard",
106         /* .cgienv */                   NULL,
107         /* .extra_mimetypes */          NULL,
108         /* .interpret */                &interpret1,
109         /* .cgi_timeout */              0,
110         /* .cache_max_age */            0,
111         /* .auth_mask */                5,
112         /* .cache_reusable */           0,
113         /* .cache_revalidate */         0,
114         /* .cache_intermediaries */     0,
115         /* .origin_protocol */          LWSMPRO_FILE,   /* files in a dir */
116         /* .mountpoint_len */           1,              /* char count */
117         /* .basic_auth_login_file */    NULL,
118  };
119
120 static const struct lws_http_mount mount = {
121         /* .mount_next */               &mount1,        /* linked-list "next" */
122         /* .mountpoint */               "/",            /* mountpoint URL */
123         /* .origin */                   "./mount-origin", /* serve from dir */
124         /* .def */                      "index.html",   /* default filename */
125         /* .protocol */                 "protocol-lws-messageboard",
126         /* .cgienv */                   NULL,
127         /* .extra_mimetypes */          NULL,
128         /* .interpret */                &interpret1,
129         /* .cgi_timeout */              0,
130         /* .cache_max_age */            0,
131         /* .auth_mask */                0,
132         /* .cache_reusable */           0,
133         /* .cache_revalidate */         0,
134         /* .cache_intermediaries */     0,
135         /* .origin_protocol */          LWSMPRO_FILE,   /* files in a dir */
136         /* .mountpoint_len */           1,              /* char count */
137         /* .basic_auth_login_file */    NULL,
138 };
139
140 void sigint_handler(int sig)
141 {
142         lws_context_destroy(context);
143
144         interrupted = 1;
145 }
146
147 int main(int argc, const char **argv)
148 {
149         struct lws_context_creation_info info;
150         const char *p, *plugin_dirs[] = {
151                 "/usr/local/share/libwebsockets-test-server/plugins",
152                 NULL };
153         int n = 0, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE
154                         /* for LLL_ verbosity above NOTICE to be built into lws,
155                          * lws must have been configured and built with
156                          * -DCMAKE_BUILD_TYPE=DEBUG instead of =RELEASE */
157                         /* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */
158                         /* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */
159                         /* | LLL_DEBUG */;
160
161         if ((p = lws_cmdline_option(argc, argv, "-d")))
162                 logs = atoi(p);
163
164         lws_set_log_level(logs, NULL);
165         lwsl_user("LWS minimal http server TLS | visit https://localhost:7681\n");
166
167         signal(SIGINT, sigint_handler);
168
169         memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */
170         info.port = 7681;
171         info.mounts = &mount;
172         info.error_document_404 = "/404.html";
173         info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |
174                        LWS_SERVER_OPTION_EXPLICIT_VHOSTS;
175         info.ssl_cert_filepath = "localhost-100y.cert";
176         info.ssl_private_key_filepath = "localhost-100y.key";
177         info.plugin_dirs = plugin_dirs;
178         info.pvo = &pvo;
179
180         if (lws_cmdline_option(argc, argv, "-h"))
181                 info.options |= LWS_SERVER_OPTION_VHOST_UPG_STRICT_HOST_CHECK;
182
183         context = lws_create_context(&info);
184         if (!context) {
185                 lwsl_err("lws init failed\n");
186                 return 1;
187         }
188
189         info.headers = &pvo_hsbph[3];
190
191         if (!lws_create_vhost(context, &info)) {
192                 lwsl_err("lws init failed\n");
193                 return 1;
194         }
195
196         while (n >= 0 && !interrupted)
197                 n = lws_service(context, 0);
198
199         lws_context_destroy(context);
200
201         return 0;
202 }