aboutsummaryrefslogtreecommitdiff
path: root/gencookie.c
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi92@disroot.org>2025-09-22 17:32:44 +0200
committerXavier Del Campo Romero <xavi92@disroot.org>2026-02-13 09:57:39 +0100
commit78bf2fe4a5bf37514f6dfd203ef969da0bf40c2e (patch)
tree33f9440b8ee0fa7a3b3ad033616d722d2101bb4d /gencookie.c
parent107a2e43d54f9a42fb85b00b83cb0d9abb194680 (diff)
Setup project skeletonHEADmaster
Diffstat (limited to 'gencookie.c')
-rw-r--r--gencookie.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/gencookie.c b/gencookie.c
new file mode 100644
index 0000000..9a71b3e
--- /dev/null
+++ b/gencookie.c
@@ -0,0 +1,72 @@
+#define _POSIX_C_SOURCE 200809L
+
+#include "jwt.h"
+#include <cjson/cJSON.h>
+#include <libweb/http.h>
+#include <sodium.h>
+#include <errno.h>
+#include <stddef.h>
+#include <string.h>
+#include <time.h>
+
+char *gencookie(const char *const name, const char *const key)
+{
+ char *ret = NULL, *sname = NULL, *c = NULL, *jwt = NULL;
+ unsigned char dkey[crypto_auth_hmacsha256_KEYBYTES];
+ size_t len;
+ cJSON *j = NULL;
+ time_t t = time(NULL);
+ struct tm tm;
+
+ if (t == (time_t)-1)
+ {
+ fprintf(stderr, "%s: time(2): %s\n", __func__, strerror(errno));
+ goto end;
+ }
+
+ /* Set 5-year lifetime for cookies. */
+ t += 5 * 365 * 24 * 60 * 60;
+
+ if (!localtime_r(&t, &tm))
+ {
+ fprintf(stderr, "%s: localtime_r(3): %s\n", __func__, strerror(errno));
+ goto end;
+ }
+ else if (!(j = cJSON_CreateObject()))
+ {
+ fprintf(stderr, "%s: cJSON_CreateObject failed\n", __func__);
+ goto end;
+ }
+ else if (!cJSON_AddStringToObject(j, "name", name))
+ {
+ fprintf(stderr, "%s: cJSON_AddStringToObject failed\n", __func__);
+ goto end;
+ }
+ else if (sodium_hex2bin(dkey, sizeof dkey, key, strlen(key), NULL, &len,
+ NULL))
+ {
+ fprintf(stderr, "%s: sodium_hex2bin failed\n", __func__);
+ goto end;
+ }
+ else if (!(jwt = jwt_encode(j, dkey, sizeof dkey)))
+ {
+ fprintf(stderr, "%s: jwt_encode failed\n", __func__);
+ goto end;
+ }
+ else if (!(c = http_cookie_create(name, jwt, &tm)))
+ {
+ fprintf(stderr, "%s: http_cookie_create failed\n", __func__);
+ goto end;
+ }
+
+ ret = c;
+
+end:
+ if (!ret)
+ free(c);
+
+ free(jwt);
+ free(sname);
+ cJSON_Delete(j);
+ return ret;
+}