about summary refs log tree commit diff
path: root/Tests/LibMatrix.HomeserverEmulator/Controllers/AuthController.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Tests/LibMatrix.HomeserverEmulator/Controllers/AuthController.cs')
-rw-r--r--Tests/LibMatrix.HomeserverEmulator/Controllers/AuthController.cs116
1 files changed, 68 insertions, 48 deletions
diff --git a/Tests/LibMatrix.HomeserverEmulator/Controllers/AuthController.cs b/Tests/LibMatrix.HomeserverEmulator/Controllers/AuthController.cs
index da56ec4..66548e2 100644
--- a/Tests/LibMatrix.HomeserverEmulator/Controllers/AuthController.cs
+++ b/Tests/LibMatrix.HomeserverEmulator/Controllers/AuthController.cs
@@ -1,49 +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()

-        };

-    }

-}

-

-public class LoginFlowsResponse {

-    public required List<LoginFlow> Flows { get; set; }

-

-    public class LoginFlow {

-        public required string Type { get; set; }

-    }

+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