mirror of https://github.com/h44z/wg-portal.git
				
				
				
			
		
			
				
	
	
		
			93 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
| package auth
 | |
| 
 | |
| import (
 | |
| 	"strings"
 | |
| 
 | |
| 	"github.com/h44z/wg-portal/internal"
 | |
| 	"github.com/h44z/wg-portal/internal/config"
 | |
| 	"github.com/h44z/wg-portal/internal/domain"
 | |
| )
 | |
| 
 | |
| // parseOauthUserInfo parses the raw user info from the oauth provider and maps it to the internal user info struct
 | |
| func parseOauthUserInfo(
 | |
| 	mapping config.OauthFields,
 | |
| 	adminMapping *config.OauthAdminMapping,
 | |
| 	raw map[string]any,
 | |
| ) (*domain.AuthenticatorUserInfo, error) {
 | |
| 	var isAdmin bool
 | |
| 
 | |
| 	// first try to match the is_admin field against the given regex
 | |
| 	if mapping.IsAdmin != "" {
 | |
| 		re := adminMapping.GetAdminValueRegex()
 | |
| 		if re.MatchString(strings.TrimSpace(internal.MapDefaultString(raw, mapping.IsAdmin, ""))) {
 | |
| 			isAdmin = true
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// next try to parse the user's groups
 | |
| 	if !isAdmin && mapping.UserGroups != "" && adminMapping.AdminGroupRegex != "" {
 | |
| 		userGroups := internal.MapDefaultStringSlice(raw, mapping.UserGroups, nil)
 | |
| 		re := adminMapping.GetAdminGroupRegex()
 | |
| 		for _, group := range userGroups {
 | |
| 			if re.MatchString(strings.TrimSpace(group)) {
 | |
| 				isAdmin = true
 | |
| 				break
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	userInfo := &domain.AuthenticatorUserInfo{
 | |
| 		Identifier: domain.UserIdentifier(internal.MapDefaultString(raw, mapping.UserIdentifier, "")),
 | |
| 		Email:      internal.MapDefaultString(raw, mapping.Email, ""),
 | |
| 		Firstname:  internal.MapDefaultString(raw, mapping.Firstname, ""),
 | |
| 		Lastname:   internal.MapDefaultString(raw, mapping.Lastname, ""),
 | |
| 		Phone:      internal.MapDefaultString(raw, mapping.Phone, ""),
 | |
| 		Department: internal.MapDefaultString(raw, mapping.Department, ""),
 | |
| 		IsAdmin:    isAdmin,
 | |
| 	}
 | |
| 
 | |
| 	return userInfo, nil
 | |
| }
 | |
| 
 | |
| // getOauthFieldMapping returns the default field mapping for the oauth provider
 | |
| func getOauthFieldMapping(f config.OauthFields) config.OauthFields {
 | |
| 	defaultMap := config.OauthFields{
 | |
| 		BaseFields: config.BaseFields{
 | |
| 			UserIdentifier: "sub",
 | |
| 			Email:          "email",
 | |
| 			Firstname:      "given_name",
 | |
| 			Lastname:       "family_name",
 | |
| 			Phone:          "phone",
 | |
| 			Department:     "department",
 | |
| 		},
 | |
| 		IsAdmin:    "admin_flag",
 | |
| 		UserGroups: "", // by default, do not use user groups
 | |
| 	}
 | |
| 	if f.UserIdentifier != "" {
 | |
| 		defaultMap.UserIdentifier = f.UserIdentifier
 | |
| 	}
 | |
| 	if f.Email != "" {
 | |
| 		defaultMap.Email = f.Email
 | |
| 	}
 | |
| 	if f.Firstname != "" {
 | |
| 		defaultMap.Firstname = f.Firstname
 | |
| 	}
 | |
| 	if f.Lastname != "" {
 | |
| 		defaultMap.Lastname = f.Lastname
 | |
| 	}
 | |
| 	if f.Phone != "" {
 | |
| 		defaultMap.Phone = f.Phone
 | |
| 	}
 | |
| 	if f.Department != "" {
 | |
| 		defaultMap.Department = f.Department
 | |
| 	}
 | |
| 	if f.IsAdmin != "" {
 | |
| 		defaultMap.IsAdmin = f.IsAdmin
 | |
| 	}
 | |
| 	if f.UserGroups != "" {
 | |
| 		defaultMap.UserGroups = f.UserGroups
 | |
| 	}
 | |
| 
 | |
| 	return defaultMap
 | |
| }
 |