mirror of
https://github.com/gravitl/netmaker.git
synced 2025-09-11 23:54:22 +08:00
add user auth type to user model
This commit is contained in:
parent
0f97dc6c7f
commit
eef24cb7f3
10 changed files with 60 additions and 54 deletions
38
auth/auth.go
38
auth/auth.go
|
@ -1,13 +1,8 @@
|
||||||
package auth
|
package auth
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/base64"
|
|
||||||
"encoding/json"
|
|
||||||
|
|
||||||
"github.com/gravitl/netmaker/logger"
|
|
||||||
"github.com/gravitl/netmaker/logic"
|
"github.com/gravitl/netmaker/logic"
|
||||||
"github.com/gravitl/netmaker/models"
|
"github.com/gravitl/netmaker/models"
|
||||||
"golang.org/x/crypto/bcrypt"
|
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -20,39 +15,6 @@ var (
|
||||||
auth_provider *oauth2.Config
|
auth_provider *oauth2.Config
|
||||||
)
|
)
|
||||||
|
|
||||||
// IsOauthUser - returns
|
|
||||||
func IsOauthUser(user *models.User) error {
|
|
||||||
var currentValue, err = FetchPassValue("")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var bCryptErr = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(currentValue))
|
|
||||||
return bCryptErr
|
|
||||||
}
|
|
||||||
|
|
||||||
func FetchPassValue(newValue string) (string, error) {
|
|
||||||
|
|
||||||
type valueHolder struct {
|
|
||||||
Value string `json:"value" bson:"value"`
|
|
||||||
}
|
|
||||||
newValueHolder := valueHolder{}
|
|
||||||
var currentValue, err = logic.FetchAuthSecret()
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
var unmarshErr = json.Unmarshal([]byte(currentValue), &newValueHolder)
|
|
||||||
if unmarshErr != nil {
|
|
||||||
return "", unmarshErr
|
|
||||||
}
|
|
||||||
|
|
||||||
var b64CurrentValue, b64Err = base64.StdEncoding.DecodeString(newValueHolder.Value)
|
|
||||||
if b64Err != nil {
|
|
||||||
logger.Log(0, "could not decode pass")
|
|
||||||
return "", nil
|
|
||||||
}
|
|
||||||
return string(b64CurrentValue), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func isUserIsAllowed(username, network string) (*models.User, error) {
|
func isUserIsAllowed(username, network string) (*models.User, error) {
|
||||||
|
|
||||||
user, err := logic.GetUser(username)
|
user, err := logic.GetUser(username)
|
||||||
|
|
|
@ -422,6 +422,7 @@ func createUser(w http.ResponseWriter, r *http.Request) {
|
||||||
logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("non-admins users can only be created on Pro version"), "forbidden"))
|
logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("non-admins users can only be created on Pro version"), "forbidden"))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = logic.CreateUser(&user)
|
err = logic.CreateUser(&user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("error creating new user: ", "user", user.UserName, "error", err.Error())
|
slog.Error("error creating new user: ", "user", user.UserName, "error", err.Error())
|
||||||
|
@ -526,7 +527,7 @@ func updateUser(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if auth.IsOauthUser(user) == nil && userchange.Password != "" {
|
if logic.IsOauthUser(user) == nil && userchange.Password != "" {
|
||||||
err := fmt.Errorf("cannot update user's password for an oauth user %s", username)
|
err := fmt.Errorf("cannot update user's password for an oauth user %s", username)
|
||||||
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
|
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
|
||||||
return
|
return
|
||||||
|
|
|
@ -93,18 +93,54 @@ func GetUsers() ([]models.ReturnUser, error) {
|
||||||
return users, err
|
return users, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsOauthUser - returns
|
||||||
|
func IsOauthUser(user *models.User) error {
|
||||||
|
var currentValue, err = FetchPassValue("")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var bCryptErr = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(currentValue))
|
||||||
|
return bCryptErr
|
||||||
|
}
|
||||||
|
|
||||||
|
func FetchPassValue(newValue string) (string, error) {
|
||||||
|
|
||||||
|
type valueHolder struct {
|
||||||
|
Value string `json:"value" bson:"value"`
|
||||||
|
}
|
||||||
|
newValueHolder := valueHolder{}
|
||||||
|
var currentValue, err = FetchAuthSecret()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
var unmarshErr = json.Unmarshal([]byte(currentValue), &newValueHolder)
|
||||||
|
if unmarshErr != nil {
|
||||||
|
return "", unmarshErr
|
||||||
|
}
|
||||||
|
|
||||||
|
var b64CurrentValue, b64Err = base64.StdEncoding.DecodeString(newValueHolder.Value)
|
||||||
|
if b64Err != nil {
|
||||||
|
logger.Log(0, "could not decode pass")
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
return string(b64CurrentValue), nil
|
||||||
|
}
|
||||||
|
|
||||||
// CreateUser - creates a user
|
// CreateUser - creates a user
|
||||||
func CreateUser(user *models.User) error {
|
func CreateUser(user *models.User) error {
|
||||||
// check if user exists
|
// check if user exists
|
||||||
if _, err := GetUser(user.UserName); err == nil {
|
if _, err := GetUser(user.UserName); err == nil {
|
||||||
return errors.New("user exists")
|
return errors.New("user exists")
|
||||||
}
|
}
|
||||||
|
user.AuthType = models.BasicAuth
|
||||||
|
if IsOauthUser(user) == nil {
|
||||||
|
user.AuthType = models.OAuth
|
||||||
|
}
|
||||||
var err = ValidateUser(user)
|
var err = ValidateUser(user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Log(0, "failed to validate user", err.Error())
|
logger.Log(0, "failed to validate user", err.Error())
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// encrypt that password so we never see it again
|
// encrypt that password so we never see it again
|
||||||
hash, err := bcrypt.GenerateFromPassword([]byte(user.Password), 5)
|
hash, err := bcrypt.GenerateFromPassword([]byte(user.Password), 5)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -356,6 +356,10 @@ func syncUsers() {
|
||||||
if user.PlatformRoleID.String() != "" {
|
if user.PlatformRoleID.String() != "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
user.AuthType = models.BasicAuth
|
||||||
|
if logic.IsOauthUser(&user) == nil {
|
||||||
|
user.AuthType = models.OAuth
|
||||||
|
}
|
||||||
if len(user.NetworkRoles) == 0 {
|
if len(user.NetworkRoles) == 0 {
|
||||||
user.NetworkRoles = make(map[models.NetworkID]map[models.UserRole]struct{})
|
user.NetworkRoles = make(map[models.NetworkID]map[models.UserRole]struct{})
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,12 @@ type RsrcType string
|
||||||
type RsrcID string
|
type RsrcID string
|
||||||
type UserRole string
|
type UserRole string
|
||||||
type UserGroupID string
|
type UserGroupID string
|
||||||
|
type AuthType string
|
||||||
|
|
||||||
|
var (
|
||||||
|
BasicAuth AuthType = "basic_auth"
|
||||||
|
OAuth AuthType = "oauth"
|
||||||
|
)
|
||||||
|
|
||||||
func (r RsrcType) String() string {
|
func (r RsrcType) String() string {
|
||||||
return string(r)
|
return string(r)
|
||||||
|
@ -128,6 +134,7 @@ type User struct {
|
||||||
IsAdmin bool `json:"isadmin" bson:"isadmin"` // deprecated
|
IsAdmin bool `json:"isadmin" bson:"isadmin"` // deprecated
|
||||||
IsSuperAdmin bool `json:"issuperadmin"` // deprecated
|
IsSuperAdmin bool `json:"issuperadmin"` // deprecated
|
||||||
RemoteGwIDs map[string]struct{} `json:"remote_gw_ids"` // deprecated
|
RemoteGwIDs map[string]struct{} `json:"remote_gw_ids"` // deprecated
|
||||||
|
AuthType AuthType `json:"auth_type"`
|
||||||
UserGroups map[UserGroupID]struct{} `json:"user_group_ids"`
|
UserGroups map[UserGroupID]struct{} `json:"user_group_ids"`
|
||||||
PlatformRoleID UserRole `json:"platform_role_id"`
|
PlatformRoleID UserRole `json:"platform_role_id"`
|
||||||
NetworkRoles map[NetworkID]map[UserRole]struct{} `json:"network_roles"`
|
NetworkRoles map[NetworkID]map[UserRole]struct{} `json:"network_roles"`
|
||||||
|
@ -144,6 +151,7 @@ type ReturnUser struct {
|
||||||
UserName string `json:"username"`
|
UserName string `json:"username"`
|
||||||
IsAdmin bool `json:"isadmin"`
|
IsAdmin bool `json:"isadmin"`
|
||||||
IsSuperAdmin bool `json:"issuperadmin"`
|
IsSuperAdmin bool `json:"issuperadmin"`
|
||||||
|
AuthType AuthType `json:"auth_type"`
|
||||||
RemoteGwIDs map[string]struct{} `json:"remote_gw_ids"` // deprecated
|
RemoteGwIDs map[string]struct{} `json:"remote_gw_ids"` // deprecated
|
||||||
UserGroups map[UserGroupID]struct{} `json:"user_group_ids"`
|
UserGroups map[UserGroupID]struct{} `json:"user_group_ids"`
|
||||||
PlatformRoleID UserRole `json:"platform_role_id"`
|
PlatformRoleID UserRole `json:"platform_role_id"`
|
||||||
|
|
|
@ -9,7 +9,6 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/gravitl/netmaker/auth"
|
|
||||||
"github.com/gravitl/netmaker/database"
|
"github.com/gravitl/netmaker/database"
|
||||||
"github.com/gravitl/netmaker/logger"
|
"github.com/gravitl/netmaker/logger"
|
||||||
"github.com/gravitl/netmaker/logic"
|
"github.com/gravitl/netmaker/logic"
|
||||||
|
@ -90,7 +89,7 @@ func handleAzureCallback(w http.ResponseWriter, r *http.Request) {
|
||||||
if database.IsEmptyRecord(err) { // user must not exist, so try to make one
|
if database.IsEmptyRecord(err) { // user must not exist, so try to make one
|
||||||
if inviteExists {
|
if inviteExists {
|
||||||
// create user
|
// create user
|
||||||
var newPass, fetchErr = auth.FetchPassValue("")
|
var newPass, fetchErr = logic.FetchPassValue("")
|
||||||
if fetchErr != nil {
|
if fetchErr != nil {
|
||||||
logic.ReturnErrorResponse(w, r, logic.FormatError(fetchErr, "internal"))
|
logic.ReturnErrorResponse(w, r, logic.FormatError(fetchErr, "internal"))
|
||||||
return
|
return
|
||||||
|
@ -147,7 +146,7 @@ func handleAzureCallback(w http.ResponseWriter, r *http.Request) {
|
||||||
handleOauthUserNotAllowed(w)
|
handleOauthUserNotAllowed(w)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var newPass, fetchErr = auth.FetchPassValue("")
|
var newPass, fetchErr = logic.FetchPassValue("")
|
||||||
if fetchErr != nil {
|
if fetchErr != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,6 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/gravitl/netmaker/auth"
|
|
||||||
"github.com/gravitl/netmaker/database"
|
"github.com/gravitl/netmaker/database"
|
||||||
"github.com/gravitl/netmaker/logger"
|
"github.com/gravitl/netmaker/logger"
|
||||||
"github.com/gravitl/netmaker/logic"
|
"github.com/gravitl/netmaker/logic"
|
||||||
|
@ -89,7 +88,7 @@ func handleGithubCallback(w http.ResponseWriter, r *http.Request) {
|
||||||
if database.IsEmptyRecord(err) { // user must not exist, so try to make one
|
if database.IsEmptyRecord(err) { // user must not exist, so try to make one
|
||||||
if inviteExists {
|
if inviteExists {
|
||||||
// create user
|
// create user
|
||||||
var newPass, fetchErr = auth.FetchPassValue("")
|
var newPass, fetchErr = logic.FetchPassValue("")
|
||||||
if fetchErr != nil {
|
if fetchErr != nil {
|
||||||
logic.ReturnErrorResponse(w, r, logic.FormatError(fetchErr, "internal"))
|
logic.ReturnErrorResponse(w, r, logic.FormatError(fetchErr, "internal"))
|
||||||
return
|
return
|
||||||
|
@ -147,7 +146,7 @@ func handleGithubCallback(w http.ResponseWriter, r *http.Request) {
|
||||||
handleOauthUserNotAllowed(w)
|
handleOauthUserNotAllowed(w)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var newPass, fetchErr = auth.FetchPassValue("")
|
var newPass, fetchErr = logic.FetchPassValue("")
|
||||||
if fetchErr != nil {
|
if fetchErr != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,6 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gravitl/netmaker/auth"
|
|
||||||
"github.com/gravitl/netmaker/database"
|
"github.com/gravitl/netmaker/database"
|
||||||
"github.com/gravitl/netmaker/logger"
|
"github.com/gravitl/netmaker/logger"
|
||||||
"github.com/gravitl/netmaker/logic"
|
"github.com/gravitl/netmaker/logic"
|
||||||
|
@ -96,7 +95,7 @@ func handleGoogleCallback(w http.ResponseWriter, r *http.Request) {
|
||||||
if inviteExists {
|
if inviteExists {
|
||||||
// create user
|
// create user
|
||||||
logger.Log(0, "CALLBACK ----> 4.0")
|
logger.Log(0, "CALLBACK ----> 4.0")
|
||||||
var newPass, fetchErr = auth.FetchPassValue("")
|
var newPass, fetchErr = logic.FetchPassValue("")
|
||||||
if fetchErr != nil {
|
if fetchErr != nil {
|
||||||
logic.ReturnErrorResponse(w, r, logic.FormatError(fetchErr, "internal"))
|
logic.ReturnErrorResponse(w, r, logic.FormatError(fetchErr, "internal"))
|
||||||
return
|
return
|
||||||
|
@ -159,7 +158,7 @@ func handleGoogleCallback(w http.ResponseWriter, r *http.Request) {
|
||||||
handleOauthUserNotAllowed(w)
|
handleOauthUserNotAllowed(w)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var newPass, fetchErr = auth.FetchPassValue("")
|
var newPass, fetchErr = logic.FetchPassValue("")
|
||||||
if fetchErr != nil {
|
if fetchErr != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,6 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/gravitl/netmaker/auth"
|
|
||||||
"github.com/gravitl/netmaker/database"
|
"github.com/gravitl/netmaker/database"
|
||||||
"github.com/gravitl/netmaker/logger"
|
"github.com/gravitl/netmaker/logger"
|
||||||
"github.com/gravitl/netmaker/logic"
|
"github.com/gravitl/netmaker/logic"
|
||||||
|
@ -78,7 +77,7 @@ func HandleHeadlessSSOCallback(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
newPass, fetchErr := auth.FetchPassValue("")
|
newPass, fetchErr := logic.FetchPassValue("")
|
||||||
if fetchErr != nil {
|
if fetchErr != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,6 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/coreos/go-oidc/v3/oidc"
|
"github.com/coreos/go-oidc/v3/oidc"
|
||||||
"github.com/gravitl/netmaker/auth"
|
|
||||||
"github.com/gravitl/netmaker/database"
|
"github.com/gravitl/netmaker/database"
|
||||||
"github.com/gravitl/netmaker/logger"
|
"github.com/gravitl/netmaker/logger"
|
||||||
"github.com/gravitl/netmaker/logic"
|
"github.com/gravitl/netmaker/logic"
|
||||||
|
@ -102,7 +101,7 @@ func handleOIDCCallback(w http.ResponseWriter, r *http.Request) {
|
||||||
if database.IsEmptyRecord(err) { // user must not exist, so try to make one
|
if database.IsEmptyRecord(err) { // user must not exist, so try to make one
|
||||||
if inviteExists {
|
if inviteExists {
|
||||||
// create user
|
// create user
|
||||||
var newPass, fetchErr = auth.FetchPassValue("")
|
var newPass, fetchErr = logic.FetchPassValue("")
|
||||||
if fetchErr != nil {
|
if fetchErr != nil {
|
||||||
logic.ReturnErrorResponse(w, r, logic.FormatError(fetchErr, "internal"))
|
logic.ReturnErrorResponse(w, r, logic.FormatError(fetchErr, "internal"))
|
||||||
return
|
return
|
||||||
|
@ -159,7 +158,7 @@ func handleOIDCCallback(w http.ResponseWriter, r *http.Request) {
|
||||||
handleOauthUserNotAllowed(w)
|
handleOauthUserNotAllowed(w)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var newPass, fetchErr = auth.FetchPassValue("")
|
var newPass, fetchErr = logic.FetchPassValue("")
|
||||||
if fetchErr != nil {
|
if fetchErr != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue