41 lines
1.4 KiB
Go
41 lines
1.4 KiB
Go
package identityprovider
|
|
|
|
import (
|
|
"gorm.io/gorm/clause"
|
|
"vpn-platform/backend/internal/model"
|
|
"vpn-platform/backend/internal/service"
|
|
"vpn-platform/backend/internal/store"
|
|
)
|
|
|
|
func saveProfile(base string, cfg model.IdentityProvider, user accessData) error {
|
|
return store.DB.Clauses(clause.OnConflict{
|
|
Columns: []clause.Column{{Name: "issuer"}, {Name: "app_id"}, {Name: "subject"}},
|
|
DoUpdates: clause.AssignmentColumns([]string{"name", "updated_at"}),
|
|
}).Create(&model.IdentityProfile{Issuer: base, AppID: cfg.AppID, Subject: user.Subject, Name: user.Name}).Error
|
|
}
|
|
|
|
// ProfileNames returns verified display names only for the current built-in
|
|
// application and exact issuer. Never resolve an identity by IP or name.
|
|
func ProfileNames(tunnel *model.Tunnel, subjects []string) map[string]string {
|
|
names := map[string]string{}
|
|
if store.DB == nil || len(subjects) == 0 || tunnel.Protocol != "openvpn" {
|
|
return names
|
|
}
|
|
cfg, err := store.TunnelConfig(tunnel)
|
|
if err != nil || service.Str(cfg, "auth_mode") != "oidc" || service.Str(cfg, "oidc_provider") != "builtin" {
|
|
return names
|
|
}
|
|
idp, err := current()
|
|
if err != nil || !idp.Enabled {
|
|
return names
|
|
}
|
|
var profiles []model.IdentityProfile
|
|
if store.DB.Where("issuer = ? AND app_id = ? AND subject IN ?", service.Str(cfg, "oidc_issuer"), idp.AppID, subjects).Find(&profiles).Error != nil {
|
|
return names
|
|
}
|
|
for _, profile := range profiles {
|
|
names[profile.Subject] = profile.Name
|
|
}
|
|
return names
|
|
}
|