diff --git a/routes/profile.vue b/routes/profile.vue index d63302091..05c7186fd 100644 --- a/routes/profile.vue +++ b/routes/profile.vue @@ -116,6 +116,10 @@ pronouns.page/u/{{user.username}} + Impersonate + @@ -274,6 +278,13 @@ return bestKey >= 0 ? best[bestKey].slice(0, 3) : []; }, + async impersonate() { + const { token } = await this.$axios.$get(`/admin/impersonate/${encodeURIComponent(this.username)}`); + this.$cookies.set('impersonator', this.$cookies.get('token')); + this.$cookies.set('token', token); + await this.$router.push('/' + this.config.user.route); + setTimeout(() => window.location.reload(), 500); + }, }, head() { return head({ diff --git a/server/routes/user.js b/server/routes/user.js index 91d2665db..833827e5a 100644 --- a/server/routes/user.js +++ b/server/routes/user.js @@ -612,7 +612,12 @@ router.get('/admin/impersonate/:email', handleErrorAsync(async (req, res) => { return res.status(401).json({error: 'Unauthorised'}); } - return res.json({token: await issueAuthentication(req.db, {email: req.params.email})}); + let email = req.params.email; + if (!email.includes('@')) { + email = (await req.db.get(SQL`SELECT email FROM users WHERE usernameNorm = ${normalise(email)}`)).email; + } + + return res.json({token: await issueAuthentication(req.db, {email: email})}); })); export default router;