Make impersonation ending work, fix frontend events
This commit is contained in:
parent
522c5785a2
commit
4b87c74f41
18 changed files with 255 additions and 106 deletions
53
platform/impersonation.go
Normal file
53
platform/impersonation.go
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
package platform
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/Gleipnir-Technology/nidus-sync/db"
|
||||
"github.com/Gleipnir-Technology/nidus-sync/db/models"
|
||||
"github.com/Gleipnir-Technology/nidus-sync/platform/event"
|
||||
"github.com/aarondl/opt/omit"
|
||||
"github.com/aarondl/opt/omitnull"
|
||||
"github.com/rs/zerolog/log"
|
||||
)
|
||||
|
||||
func ImpersonationCreate(ctx context.Context, user User, target int) (*models.LogImpersonation, error) {
|
||||
if !user.HasRoot() {
|
||||
return nil, fmt.Errorf("user %d is not root, and therefore can't impersonate user %d", user.ID, target)
|
||||
}
|
||||
setter := models.LogImpersonationSetter{
|
||||
BeginAt: omit.From(time.Now()),
|
||||
EndAt: omitnull.FromPtr[time.Time](nil),
|
||||
//ID: ,
|
||||
ImpersonatorID: omit.From(int32(user.ID)),
|
||||
TargetID: omit.From(int32(target)),
|
||||
}
|
||||
log, err := models.LogImpersonations.Insert(&setter).One(ctx, db.PGInstance.BobDB)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("insert log: %w", err)
|
||||
}
|
||||
event.UpdatedUser(event.TypeSession, user.model.ID, "")
|
||||
event.UpdatedUser(event.TypeSession, int32(target), "")
|
||||
return log, nil
|
||||
}
|
||||
func ImpersonationEnd(ctx context.Context, user User, impersonator_id int32) error {
|
||||
l, err := models.LogImpersonations.Query(
|
||||
models.SelectWhere.LogImpersonations.EndAt.IsNull(),
|
||||
models.SelectWhere.LogImpersonations.ImpersonatorID.EQ(impersonator_id),
|
||||
).One(ctx, db.PGInstance.BobDB)
|
||||
if err != nil {
|
||||
return fmt.Errorf("query impersonations: %w", err)
|
||||
}
|
||||
err = l.Update(ctx, db.PGInstance.BobDB, &models.LogImpersonationSetter{
|
||||
EndAt: omitnull.From(time.Now()),
|
||||
})
|
||||
if err != nil {
|
||||
return fmt.Errorf("update impersonation log: %w", err)
|
||||
}
|
||||
log.Info().Int32("impersonator", l.ImpersonatorID).Int32("target", l.TargetID).Msg("Stopped impersonating")
|
||||
event.UpdatedUser(event.TypeSession, user.model.ID, "")
|
||||
event.UpdatedUser(event.TypeSession, impersonator_id, "")
|
||||
return nil
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue