cookie_auth.c
Go to the documentation of this file.
1 // Copyright (c) 2014 Cesanta Software
2 // All rights reserved
3 
4 #include <stdio.h>
5 #include <string.h>
6 #include <time.h>
7 #include "mongoose.h"
8 
9 static const char *s_login_uri = "/login.html";
10 static const char *s_secret = ":-)"; // Must be known only to server
11 
12 static void generate_ssid(const char *user_name, const char *expiration_date,
13  char *ssid, size_t ssid_size) {
14  char hash[33];
15  mg_md5(hash, user_name, ":", expiration_date, ":", s_secret, NULL);
16  snprintf(ssid, ssid_size, "%s|%s|%s", user_name, expiration_date, hash);
17 }
18 
19 static int check_auth(struct mg_connection *conn) {
20  char ssid[100], calculated_ssid[100], name[100], expire[100];
21 
22  // Always authenticate requests to login page
23  if (strcmp(conn->uri, s_login_uri) == 0) {
24  return MG_TRUE;
25  }
26 
27  // Look for session ID in the Cookie.
28  // That session ID can be validated against the database that stores
29  // current active sessions.
30  mg_parse_header(mg_get_header(conn, "Cookie"), "ssid", ssid, sizeof(ssid));
31  if (sscanf(ssid, "%[^|]|%[^|]|", name, expire) == 2) {
32  generate_ssid(name, expire, calculated_ssid, sizeof(calculated_ssid));
33  if (strcmp(ssid, calculated_ssid) == 0) {
34  return MG_TRUE; // Authenticate
35  }
36  }
37 
38  // Auth failed, do NOT authenticate, redirect to login page
39  mg_printf(conn, "HTTP/1.1 302 Moved\r\nLocation: %s\r\n\r\n", s_login_uri);
40  return MG_FALSE;
41 }
42 
43 static int check_login_form_submission(struct mg_connection *conn) {
44  char name[100], password[100], ssid[100], expire[100], expire_epoch[100];
45 
46  mg_get_var(conn, "name", name, sizeof(name));
47  mg_get_var(conn, "password", password, sizeof(password));
48 
49  // A real authentication mechanism should be employed here.
50  // Also, the whole site should be served through HTTPS.
51  if (strcmp(name, "Joe") == 0 && strcmp(password, "Doe") == 0) {
52  // Generate expiry date
53  time_t t = time(NULL) + 3600; // Valid for 1 hour
54  snprintf(expire_epoch, sizeof(expire_epoch), "%lu", (unsigned long) t);
55  strftime(expire, sizeof(expire), "%a, %d %b %Y %H:%M:%S GMT", gmtime(&t));
56  generate_ssid(name, expire_epoch, ssid, sizeof(ssid));
57  // Set "session id" cookie, there could be some data encoded in it.
58  mg_printf(conn,
59  "HTTP/1.1 302 Moved\r\n"
60  "Set-Cookie: ssid=%s; expire=\"%s\"; http-only; HttpOnly;\r\n"
61  "Location: /\r\n\r\n",
62  ssid, expire);
63  return MG_TRUE;
64  }
65  return MG_FALSE;
66 }
67 
68 static int serve_request(struct mg_connection *conn) {
69  if (strcmp(conn->uri, s_login_uri) == 0 &&
70  strcmp(conn->request_method, "POST") == 0) {
71  return check_login_form_submission(conn);
72  }
73  return MG_FALSE; // Serve files in the document_root
74 }
75 
76 static int ev_handler(struct mg_connection *conn, enum mg_event ev) {
77  switch (ev) {
78  case MG_AUTH: return check_auth(conn);
79  case MG_REQUEST: return serve_request(conn);
80  default: return MG_FALSE;
81  }
82 }
83 
84 int main(void) {
86  mg_set_option(server, "listening_port", "8080");
87  mg_set_option(server, "document_root", ".");
88 
89  printf("Starting on port %s\n", mg_get_option(server, "listening_port"));
90  for (;;) {
91  mg_poll_server(server, 1000);
92  }
93  mg_destroy_server(&server);
94 
95  return 0;
96 }
int mg_get_var(const struct mg_connection *conn, const char *name, char *dst, size_t dst_len)
Definition: mongoose.c:5040
const char * mg_get_header(const struct mg_connection *ri, const char *s)
Definition: mongoose.c:2566
const char * uri
Definition: mongoose.h:34
char * mg_md5(char buf[33],...)
Definition: mongoose.c:4122
struct mg_server * mg_create_server(void *server_data, mg_handler_t handler)
Definition: mongoose.c:5431
const char * mg_get_option(const struct mg_server *server, const char *name)
Definition: mongoose.c:5425
static char * password
Definition: unit1304.c:27
geometry_msgs::TransformStamped t
time_t mg_poll_server(struct mg_server *server, int milliseconds)
Definition: mongoose.c:4965
int mg_parse_header(const char *s, const char *var_name, char *buf, size_t buf_size)
Definition: mongoose.c:4258
#define printf
Definition: curl_printf.h:40
mg_event
Definition: mongoose.h:62
static struct mg_server * server
Definition: web_server.c:72
const char * mg_set_option(struct mg_server *server, const char *name, const char *value)
Definition: mongoose.c:5143
size_t mg_printf(struct mg_connection *conn, const char *fmt,...)
Definition: mongoose.c:1949
#define snprintf
Definition: curl_printf.h:42
const char * request_method
Definition: mongoose.h:33
const char * name
Definition: curl_sasl.c:54
void mg_destroy_server(struct mg_server **server)
Definition: mongoose.c:4969


rc_tagdetect_client
Author(s): Monika Florek-Jasinska , Raphael Schaller
autogenerated on Sat Feb 13 2021 03:42:08