about summary refs log tree commit diff
path: root/Utilities/LibMatrix.HomeserverEmulator/Controllers/AuthController.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Utilities/LibMatrix.HomeserverEmulator/Controllers/AuthController.cs')
-rw-r--r--Utilities/LibMatrix.HomeserverEmulator/Controllers/AuthController.cs69
1 files changed, 69 insertions, 0 deletions
diff --git a/Utilities/LibMatrix.HomeserverEmulator/Controllers/AuthController.cs b/Utilities/LibMatrix.HomeserverEmulator/Controllers/AuthController.cs
new file mode 100644
index 0000000..66548e2
--- /dev/null
+++ b/Utilities/LibMatrix.HomeserverEmulator/Controllers/AuthController.cs
@@ -0,0 +1,69 @@
+using System.Text.Json.Nodes;
+using LibMatrix.HomeserverEmulator.Services;
+using LibMatrix.Responses;
+using LibMatrix.Services;
+using Microsoft.AspNetCore.Mvc;
+
+namespace LibMatrix.HomeserverEmulator.Controllers;
+
+[ApiController]
+[Route("/_matrix/client/{version}/")]
+public class AuthController(ILogger<AuthController> logger, UserStore userStore, TokenService tokenService) : ControllerBase {
+    [HttpPost("login")]
+    public async Task<LoginResponse> Login(LoginRequest request) {
+        if (!request.Identifier.User.StartsWith('@'))
+            request.Identifier.User = $"@{request.Identifier.User}:{tokenService.GenerateServerName(HttpContext)}";
+        if (request.Identifier.User.EndsWith("localhost"))
+            request.Identifier.User = request.Identifier.User.Replace("localhost", tokenService.GenerateServerName(HttpContext));
+
+        var user = await userStore.GetUserById(request.Identifier.User);
+        if (user is null) {
+            user = await userStore.CreateUser(request.Identifier.User);
+        }
+
+        return user.Login();
+    }
+
+    [HttpGet("login")]
+    public async Task<LoginFlowsResponse> GetLoginFlows() {
+        return new LoginFlowsResponse {
+            Flows = ((string[]) [
+                "m.login.password",
+                "m.login.recaptcha",
+                "m.login.sso",
+                "m.login.email.identity",
+                "m.login.msisdn",
+                "m.login.dummy",
+                "m.login.registration_token",
+            ]).Select(x => new LoginFlowsResponse.LoginFlow { Type = x }).ToList()
+        };
+    }
+
+    [HttpPost("logout")]
+    public async Task<object> Logout() {
+        var token = tokenService.GetAccessToken(HttpContext);
+        var user = await userStore.GetUserByToken(token);
+        if (user == null)
+            throw new MatrixException() {
+                ErrorCode = "M_UNKNOWN_TOKEN",
+                Error = "No such user"
+            };
+
+        if (!user.AccessTokens.ContainsKey(token))
+            throw new MatrixException() {
+                ErrorCode = MatrixException.ErrorCodes.M_NOT_FOUND,
+                Error = "Token not found"
+            };
+
+        user.AccessTokens.Remove(token);
+        return new { };
+    }
+}
+
+public class LoginFlowsResponse {
+    public required List<LoginFlow> Flows { get; set; }
+
+    public class LoginFlow {
+        public required string Type { get; set; }
+    }
+}
\ No newline at end of file