diff options
Diffstat (limited to 'Tests/LibMatrix.HomeserverEmulator/Controllers/AuthController.cs')
-rw-r--r-- | Tests/LibMatrix.HomeserverEmulator/Controllers/AuthController.cs | 116 |
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 |