pomerium/internal/handlers/userinfo.go
backport-actions-token[bot] 4c7c4320af
core/userinfo: remove excess userinfo data (#5148)
core/userinfo: remove excess userinfo data (#5137)

Co-authored-by: Caleb Doxsey <cdoxsey@pomerium.com>
2024-06-25 13:24:18 -06:00

117 lines
3.1 KiB
Go

package handlers
import (
"net/http"
"github.com/pomerium/datasource/pkg/directory"
"github.com/pomerium/pomerium/internal/httputil"
"github.com/pomerium/pomerium/pkg/grpc/identity"
"github.com/pomerium/pomerium/pkg/grpc/session"
"github.com/pomerium/pomerium/pkg/grpc/user"
"github.com/pomerium/pomerium/ui"
"github.com/pomerium/webauthn"
)
// UserInfoData is the data for the UserInfo page.
type UserInfoData struct {
CSRFToken string
IsImpersonated bool
Session *session.Session
User *user.User
Profile *identity.Profile
IsEnterprise bool
DirectoryUser *directory.User
DirectoryGroups []*directory.Group
WebAuthnCreationOptions *webauthn.PublicKeyCredentialCreationOptions
WebAuthnRequestOptions *webauthn.PublicKeyCredentialRequestOptions
WebAuthnURL string
BrandingOptions httputil.BrandingOptions
}
// ToJSON converts the data into a JSON map.
func (data UserInfoData) ToJSON() map[string]any {
m := map[string]any{}
m["csrfToken"] = data.CSRFToken
m["isImpersonated"] = data.IsImpersonated
m["session"] = data.sessionJSON()
m["user"] = data.userJSON()
m["profile"] = data.profileJSON()
m["isEnterprise"] = data.IsEnterprise
if data.DirectoryUser != nil {
m["directoryUser"] = data.DirectoryUser
}
if len(data.DirectoryGroups) > 0 {
m["directoryGroups"] = data.DirectoryGroups
}
m["webAuthnCreationOptions"] = data.WebAuthnCreationOptions
m["webAuthnRequestOptions"] = data.WebAuthnRequestOptions
m["webAuthnUrl"] = data.WebAuthnURL
httputil.AddBrandingOptionsToMap(m, data.BrandingOptions)
return m
}
func (data UserInfoData) profileJSON() map[string]any {
if data.Profile == nil {
return nil
}
m := map[string]any{}
claims := make(map[string]any)
for k, v := range data.Profile.GetClaims().AsMap() {
claims[k] = v
}
m["claims"] = m
return m
}
func (data UserInfoData) sessionJSON() map[string]any {
if data.Session == nil {
return nil
}
m := map[string]any{}
claims := make(map[string]any)
for k, vs := range data.Session.GetClaims() {
claims[k] = vs.AsSlice()
}
m["claims"] = claims
var deviceCredentials []any
for _, dc := range data.Session.GetDeviceCredentials() {
deviceCredentials = append(deviceCredentials, map[string]any{
"typeId": dc.GetTypeId(),
"id": dc.GetId(),
})
}
m["deviceCredentials"] = deviceCredentials
m["expiresAt"] = data.Session.GetExpiresAt().AsTime()
m["id"] = data.Session.GetId()
m["userId"] = data.Session.GetUserId()
return m
}
func (data UserInfoData) userJSON() map[string]any {
if data.User == nil {
return nil
}
m := map[string]any{}
claims := make(map[string]any)
for k, vs := range data.User.GetClaims() {
claims[k] = vs.AsSlice()
}
m["claims"] = claims
m["deviceCredentialIds"] = data.User.GetDeviceCredentialIds()
m["id"] = data.User.GetId()
m["name"] = data.User.GetName()
return m
}
// UserInfo returns a handler that renders the user info page.
func UserInfo(data UserInfoData) http.Handler {
return httputil.HandlerFunc(func(w http.ResponseWriter, r *http.Request) error {
return ui.ServePage(w, r, "UserInfo", "User Info Dashboard", data.ToJSON())
})
}