nidus-sync/platform/impersonation.go

53 lines
1.8 KiB
Go

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
}