From 8ead9cc93a789e52e4da71d12c8fc4484dc34572 Mon Sep 17 00:00:00 2001 From: Jordan Bancino Date: Fri, 10 Mar 2023 03:24:04 +0000 Subject: [PATCH] Apply #63, make some general bug fixes. --- TODO.txt | 4 +- src/Routes/RouteMatrix.c | 14 +++++++ src/Routes/RouteWhoami.c | 87 ++++++++++++++++++++++++++++++++++++++++ src/User.c | 2 +- src/include/Routes.h | 1 + tools/bin/send-patch | 2 +- 6 files changed, 106 insertions(+), 4 deletions(-) create mode 100644 src/Routes/RouteWhoami.c diff --git a/TODO.txt b/TODO.txt index 07618f4..98fa7b9 100644 --- a/TODO.txt +++ b/TODO.txt @@ -50,11 +50,11 @@ Milestone: v0.3.0 flow - Ensure that registration tokens can be used even if registration is disabled. - [ ] 4: Account management + [~] 4: Account management [ ] Deactivate [ ] Make sure UserLogin() fails if user is deactivated. [ ] Change password - [ ] Whoami + [x] Whoami [ ] 9: User Data [ ] 5: Capabilities negotiation [ ] 10: Security (Rate Limiting) diff --git a/src/Routes/RouteMatrix.c b/src/Routes/RouteMatrix.c index 45ce8a6..2e6e92c 100644 --- a/src/Routes/RouteMatrix.c +++ b/src/Routes/RouteMatrix.c @@ -86,6 +86,20 @@ ROUTE_IMPL(RouteMatrix, args) { response = RouteRefresh(args); } + else if (MATRIX_PATH_EQUALS(pathPart, "account")) + { + Free(pathPart); + pathPart = MATRIX_PATH_POP(args->path); + if (MATRIX_PATH_EQUALS(pathPart, "whoami")) + { + response = RouteWhoami(args); + } + else + { + HttpResponseStatus(args->context, HTTP_NOT_FOUND); + response = MatrixErrorCreate(M_NOT_FOUND); + } + } else { HttpResponseStatus(args->context, HTTP_NOT_FOUND); diff --git a/src/Routes/RouteWhoami.c b/src/Routes/RouteWhoami.c new file mode 100644 index 0000000..b97e749 --- /dev/null +++ b/src/Routes/RouteWhoami.c @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2022-2023 Jordan Bancino <@jordan:bancino.net> + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#include + +#include + +#include +#include +#include +#include +#include + +ROUTE_IMPL(RouteWhoami, args) +{ + Db *db = args->matrixArgs->db; + + HashMap *response = NULL; + HashMap *tokenJson = NULL; + + DbRef *ref; + + char *token; + char *userID; + char *deviceID; + + if (MATRIX_PATH_PARTS(args->path) != 0) + { + HttpResponseStatus(args->context, HTTP_BAD_REQUEST); + return MatrixErrorCreate(M_UNRECOGNIZED); + } + + /* Get the request */ + response = MatrixGetAccessToken(args->context, &token); + if (response) + { + /* No token? */ + return response; + } + + /* Authenticate with our token */ + if (!DbExists(db, 3, "tokens", "access", token)) + { + HttpResponseStatus(args->context, HTTP_UNAUTHORIZED); + return MatrixErrorCreate(M_UNKNOWN_TOKEN); + } + + ref = DbLock(db, 3, "tokens", "access", token); + tokenJson = DbJson(ref); + + response = HashMapCreate(); + + userID = StrConcat(4, "@", + JsonValueAsString(HashMapGet(tokenJson, "user")), + ":", args->matrixArgs->config->serverName); + + deviceID = StrDuplicate(JsonValueAsString(HashMapGet(tokenJson, "device"))); + + DbUnlock(db, ref); + + HashMapSet(response, "device_id", JsonValueString(deviceID)); + HashMapSet(response, "user_id", JsonValueString(userID)); + + Free(userID); + Free(deviceID); + return response; +} diff --git a/src/User.c b/src/User.c index 8700808..3e9a946 100644 --- a/src/User.c +++ b/src/User.c @@ -81,7 +81,7 @@ UserHistoricalValidate(char *localpart, char *domain) return 0; } - if (!(c >= 0x21 && c <= 0x39) || (c >= 0x3B && c <= 0x7E)) + if (!((c >= 0x21 && c <= 0x39) || (c >= 0x3B && c <= 0x7E))) { return 0; } diff --git a/src/include/Routes.h b/src/include/Routes.h index dca2e7c..fb22c33 100644 --- a/src/include/Routes.h +++ b/src/include/Routes.h @@ -65,6 +65,7 @@ ROUTE(RouteLogin); /* /_matrix/client/(r0|v3)/login */ ROUTE(RouteLogout); /* /_matrix/client/(r0|v3)/logout */ ROUTE(RouteRegister); /* /_matrix/client/(r0|v3)/register */ ROUTE(RouteRefresh); /* /_matrix/client/(r0|v3)/refresh */ +ROUTE(RouteWhoami); /* /_matrix/client/(r0|v3)/whoami */ #undef ROUTE diff --git a/tools/bin/send-patch b/tools/bin/send-patch index 9178baf..b8d364b 100755 --- a/tools/bin/send-patch +++ b/tools/bin/send-patch @@ -63,7 +63,7 @@ matrix_login() { printf ' },' printf ' "initial_device_display_name": "Telodendria Patch Script",' printf ' "type": "m.login.password",' - printf ' "password": %s' "$(json -e $MXPW)" + printf ' "password": %s' "$(json -e "$MXPW")" printf '}' ) curlec -X POST -d "$JSON" $HS_BASE/_matrix/client/v3/login