diff options
| author | Xavier Del Campo Romero <xavi92@disroot.org> | 2025-09-22 17:32:44 +0200 |
|---|---|---|
| committer | Xavier Del Campo Romero <xavi92@disroot.org> | 2026-02-13 09:57:39 +0100 |
| commit | 78bf2fe4a5bf37514f6dfd203ef969da0bf40c2e (patch) | |
| tree | 33f9440b8ee0fa7a3b3ad033616d722d2101bb4d /gencookie.c | |
| parent | 107a2e43d54f9a42fb85b00b83cb0d9abb194680 (diff) | |
Diffstat (limited to 'gencookie.c')
| -rw-r--r-- | gencookie.c | 72 |
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; +} |
