/* * nanobbs, a tiny forums software. * Copyright (C) 2025-2026 Xavier Del Campo Romero * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ #define _POSIX_C_SOURCE 200809L #include "endpoints.h" #include "auth.h" #include "form.h" #include #include static const char errmsg[] = "Invalid or missing cookie"; static int setup(const struct http_payload *const p, struct http_response *const r, void *const user, sqlite3 *const db, const struct auth_user *const u) { static const char date[] = "Thu, 1 Jan 1970 00:00:00 GMT"; int ret = -1, error; struct dynstr d; dynstr_init(&d); if (!u) { ret = form_unauthorized("Authentication required", r); goto end; } else if (dynstr_append(&d, "%s=expired; Expires=%s", u->username, date)) { fprintf(stderr, "%s: dynstr_append failed\n", __func__); goto end; } *r = (const struct http_response){.status = HTTP_STATUS_SEE_OTHER}; if (http_response_add_header(r, "Set-Cookie", d.str) || http_response_add_header(r, "Location", "/")) { fprintf(stderr, "%s: http_response_add_header failed\n", __func__); goto end; } ret = 0; end: if ((error = sqlite3_close(db)) != SQLITE_OK) { fprintf(stderr, "%s: sqlite3_close: %s\n", __func__, sqlite3_errstr(error)); ret = -1; } dynstr_free(&d); return ret; } int ep_logout(const struct http_payload *const p, struct http_response *const r, void *const user) { int ret = auth_validate(p, r, user, setup); if (ret < 0) fprintf(stderr, "%s: auth_validate failed\n", __func__); else if (ret) ret = form_badreq(errmsg, r); return ret; }