Add impersonation route
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
nemunaire 2022-09-11 01:05:51 +02:00
parent ef0b394113
commit fb0fc14f69
3 changed files with 58 additions and 6 deletions

1
api.go
View File

@ -47,6 +47,7 @@ func declareAPIRoutes(router *gin.Engine) {
_questions_cache_mutex.Unlock() _questions_cache_mutex.Unlock()
}) })
declareAPIAdminAuthRoutes(apiAdminRoutes)
declareAPIAdminAsksRoutes(apiAdminRoutes) declareAPIAdminAsksRoutes(apiAdminRoutes)
declareAPIAuthGradesRoutes(apiAdminRoutes) declareAPIAuthGradesRoutes(apiAdminRoutes)
declareAPIAdminHelpRoutes(apiAdminRoutes) declareAPIAdminHelpRoutes(apiAdminRoutes)

26
auth.go
View File

@ -27,6 +27,32 @@ func declareAPIAuthRoutes(router *gin.RouterGroup) {
router.POST("/auth/logout", logout) router.POST("/auth/logout", logout)
} }
func declareAPIAdminAuthRoutes(router *gin.RouterGroup) {
router.POST("/auth/impersonate", func(c *gin.Context) {
session := c.MustGet("Session").(*Session)
var u *User
if err := c.ShouldBindJSON(&u); err != nil {
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": err.Error()})
return
}
newuser, err := getUser(int(u.Id))
if err != nil {
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": err.Error()})
return
}
session.IdUser = &newuser.Id
session.Update()
c.JSON(http.StatusOK, authToken{
User: newuser,
CurrentPromo: currentPromo,
})
})
}
type authToken struct { type authToken struct {
*User *User
CurrentPromo uint `json:"current_promo"` CurrentPromo uint `json:"current_promo"`

View File

@ -18,9 +18,25 @@
export let uid; export let uid;
let allPromos = false; let allPromos = false;
let myuser = null;
let userP = null;
$: userP = getUser(uid).then((u) => myuser = u)
function impersonate() {
fetch('api/auth/impersonate', {
method: 'POST',
headers: {'Accept': 'application/json'},
body: JSON.stringify({"id": myuser.id}),
}).then(() => {
if (res.status == 200) {
user.update(res);
}
});
}
</script> </script>
{#await getUser(uid)} {#await userP}
<h2> <h2>
Étudiant Étudiant
</h2> </h2>
@ -42,7 +58,8 @@
</h2> </h2>
{#if student.promo} {#if student.promo}
<span class="badge bg-success ms-1">{student.promo}</span> <span class="badge bg-success ms-1">{student.promo}</span>
{#if $user && $user.is_admin && $user.current_promo && student.promo != $user.current_promo} {#if $user && $user.is_admin}
{#if $user.current_promo && student.promo != $user.current_promo}
<button <button
class="btn btn-sm btn-warning mx-1" class="btn btn-sm btn-warning mx-1"
title="Passer sur la promo en cours" title="Passer sur la promo en cours"
@ -51,6 +68,14 @@
<i class="bi bi-arrow-up"></i> <i class="bi bi-arrow-up"></i>
</button> </button>
{/if} {/if}
<button
class="btn btn-sm btn-primary mx-1"
title="Impersonate"
on:click={impersonate}
>
<i class="bi bi-person-bounding-box"></i>
</button>
{/if}
{/if} {/if}
</div> </div>
<div class="card-body"> <div class="card-body">