diff --git a/api/source/api_modules/auth.d b/api/source/api_modules/auth.d index f6b4359..f93ea65 100644 --- a/api/source/api_modules/auth.d +++ b/api/source/api_modules/auth.d @@ -58,6 +58,7 @@ private Optional!User getUserFromBasicAuth(ref HttpRequestContext ctx, Connectio import std.string : startsWith; import std.digest.sha; import std.algorithm : countUntil; + import std.conv : to; string headerStr = ctx.request.headers.getFirst("Authorization").orElse(""); if (headerStr.length == 0 || !startsWith(headerStr, "Basic ")) { @@ -83,6 +84,18 @@ private Optional!User getUserFromBasicAuth(ref HttpRequestContext ctx, Connectio ) { return Optional!User.empty; } + // Check if an admin user is requesting to view the application as a given user. + if (optUser.value.isAdmin && ctx.request.headers.contains("X-Admin-As-User")) { + string userAsIdHeader = ctx.request.headers.getFirst("X-Admin-As-User").orElse(""); + ulong userId = userAsIdHeader.to!ulong; + infoF!"Admin user %s is viewing the application as user %d."(optUser.value.username, userId); + return findOne( + conn, + "SELECT * FROM auth_user WHERE id = ?", + &User.parse, + userId + ); + } return optUser; } diff --git a/api/source/app.d b/api/source/app.d index c233c56..ef34935 100644 --- a/api/source/app.d +++ b/api/source/app.d @@ -17,7 +17,7 @@ void main() { config.defaultHeaders["Access-Control-Allow-Origin"] = "*"; config.defaultHeaders["Access-Control-Allow-Methods"] = "*"; config.defaultHeaders["Access-Control-Request-Method"] = "*"; - config.defaultHeaders["Access-Control-Allow-Headers"] = "Authorization, Content-Length, Content-Type"; + config.defaultHeaders["Access-Control-Allow-Headers"] = "Authorization, Content-Length, Content-Type, X-Admin-As-User"; if (env == "PROD") { config.port = 8107; diff --git a/app/src/App.vue b/app/src/App.vue index d4f5971..069a16c 100644 --- a/app/src/App.vue +++ b/app/src/App.vue @@ -15,6 +15,12 @@ async function logOut() { authStore.logOut() await router.replace('/') } + +async function exitAdminViewAsUser() { + if (!authStore.state) return + authStore.state.adminAsUser = null + await router.replace('/admin-dashboard') +} diff --git a/app/src/views/MyAccountView.vue b/app/src/views/MyAccountView.vue index 26f3c14..6e5bac0 100644 --- a/app/src/views/MyAccountView.vue +++ b/app/src/views/MyAccountView.vue @@ -1,32 +1,42 @@