From 6ca1265076c7067b7920d11db81adb2d7e7a6d03 Mon Sep 17 00:00:00 2001 From: Jordan Bancino Date: Sat, 15 Apr 2023 02:36:28 +0000 Subject: [PATCH] Begin working on User-Interactive authentication fallback. --- TODO.txt | 3 ++ src/Routes.c | 1 + src/Routes/RouteUiaFallback.c | 79 +++++++++++++++++++++++++++++++++++ src/Uia.c | 18 +------- src/include/Routes.h | 1 + 5 files changed, 86 insertions(+), 16 deletions(-) create mode 100644 src/Routes/RouteUiaFallback.c diff --git a/TODO.txt b/TODO.txt index cdba16f..3835da9 100644 --- a/TODO.txt +++ b/TODO.txt @@ -49,6 +49,9 @@ Milestone: v0.3.0 [x] Replace current routing system [x] Add route for requestToken endpoints [x] Move TelodendriaBuildRouter() to Routes +[ ] User-Interactive fallback + [ ] Password + [ ] Registration token [ ] Token permissions [ ] Move configuration to database diff --git a/src/Routes.c b/src/Routes.c index b7f362f..88d39ab 100644 --- a/src/Routes.c +++ b/src/Routes.c @@ -47,6 +47,7 @@ RouterBuild(void) R("/_matrix/static", RouteStaticDefault); R("/_matrix/static/client/login", RouteStaticLogin); + R("/_matrix/client/v3/auth/(.*)/fallback/web", RouteUiaFallback); R("/_matrix/client/v3/login", RouteLogin); R("/_matrix/client/v3/logout", RouteLogout); diff --git a/src/Routes/RouteUiaFallback.c b/src/Routes/RouteUiaFallback.c new file mode 100644 index 0000000..2a74ce2 --- /dev/null +++ b/src/Routes/RouteUiaFallback.c @@ -0,0 +1,79 @@ +/* + * 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 + +ROUTE_IMPL(RouteUiaFallback, path, argp) +{ + RouteArgs *args = argp; + Stream *stream = HttpServerStream(args->context); + HashMap *requestParams = HttpRequestParams(args->context); + char *authType = ArrayGet(path, 0); + char *sessionId; + + if (!authType) + { + /* This should never happen */ + HttpResponseStatus(args->context, HTTP_INTERNAL_SERVER_ERROR); + return MatrixErrorCreate(M_UNKNOWN); + } + + sessionId = HashMapGet(requestParams, "session"); + if (!sessionId) + { + HttpResponseStatus(args->context, HTTP_BAD_REQUEST); + return MatrixErrorCreate(M_MISSING_PARAM); + } + + HttpResponseHeader(args->context, "Content-Type", "text/html"); + HttpSendHeaders(args->context); + HtmlBegin(stream, "Authentication"); + + if (strcmp(authType, "m.login.dummy") == 0) + { + /* TODO */ + } + else if (strcmp(authType, "m.login.password") == 0) + { + /* TODO */ + } + else if (strcmp(authType, "m.login.registration_token") == 0) + { + /* TODO */ + } + /* + * TODO: implement m.login.recaptcha, m.login.sso, + * m.login.email.identity, m.login.msisdn here + */ + else + { + HttpResponseStatus(args->context, HTTP_NOT_FOUND); + StreamPrintf(stream, + "

Unknown auth type: %s

", authType); + } + + HtmlEnd(stream); + + return NULL; +} diff --git a/src/Uia.c b/src/Uia.c index f0afad2..50e004a 100644 --- a/src/Uia.c +++ b/src/Uia.c @@ -416,22 +416,8 @@ UiaComplete(Array * flows, HttpServerContext * context, Db * db, RegTokenClose(tokenInfo); RegTokenFree(tokenInfo); } - else if (strcmp(authType, "m.login.recaptcha") == 0) - { - /* TODO */ - } - else if (strcmp(authType, "m.login.sso") == 0) - { - /* TODO */ - } - else if (strcmp(authType, "m.login.email.identity") == 0) - { - /* TODO */ - } - else if (strcmp(authType, "m.login.msisdn") == 0) - { - /* TODO */ - } + /* TODO: implement m.login.recaptcha, m.login.sso, + * m.login.email.identity, m.login.msisdn here */ else { HttpResponseStatus(context, HTTP_UNAUTHORIZED); diff --git a/src/include/Routes.h b/src/include/Routes.h index bb93de0..9d2f7ad 100644 --- a/src/include/Routes.h +++ b/src/include/Routes.h @@ -65,6 +65,7 @@ ROUTE(RouteTokenValid); ROUTE(RouteUserProfile); ROUTE(RouteRequestToken); +ROUTE(RouteUiaFallback); ROUTE(RouteStaticDefault); ROUTE(RouteStaticLogin);