|
@@ -1,24 +1,18 @@
|
|
package auth
|
|
package auth
|
|
|
|
|
|
import (
|
|
import (
|
|
- "encoding/base64"
|
|
|
|
- "encoding/json"
|
|
|
|
"errors"
|
|
"errors"
|
|
"fmt"
|
|
"fmt"
|
|
"net/http"
|
|
"net/http"
|
|
"strings"
|
|
"strings"
|
|
"time"
|
|
"time"
|
|
|
|
|
|
- "golang.org/x/crypto/bcrypt"
|
|
|
|
- "golang.org/x/exp/slog"
|
|
|
|
- "golang.org/x/oauth2"
|
|
|
|
-
|
|
|
|
"github.com/gorilla/websocket"
|
|
"github.com/gorilla/websocket"
|
|
"github.com/gravitl/netmaker/logger"
|
|
"github.com/gravitl/netmaker/logger"
|
|
"github.com/gravitl/netmaker/logic"
|
|
"github.com/gravitl/netmaker/logic"
|
|
"github.com/gravitl/netmaker/logic/pro/netcache"
|
|
"github.com/gravitl/netmaker/logic/pro/netcache"
|
|
- "github.com/gravitl/netmaker/models"
|
|
|
|
"github.com/gravitl/netmaker/servercfg"
|
|
"github.com/gravitl/netmaker/servercfg"
|
|
|
|
+ "golang.org/x/oauth2"
|
|
)
|
|
)
|
|
|
|
|
|
// == consts ==
|
|
// == consts ==
|
|
@@ -153,16 +147,6 @@ func HandleAuthLogin(w http.ResponseWriter, r *http.Request) {
|
|
functions[handle_login].(func(http.ResponseWriter, *http.Request))(w, r)
|
|
functions[handle_login].(func(http.ResponseWriter, *http.Request))(w, r)
|
|
}
|
|
}
|
|
|
|
|
|
-// 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
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
// HandleHeadlessSSO - handles the OAuth login flow for headless interfaces such as Netmaker CLI via websocket
|
|
// HandleHeadlessSSO - handles the OAuth login flow for headless interfaces such as Netmaker CLI via websocket
|
|
func HandleHeadlessSSO(w http.ResponseWriter, r *http.Request) {
|
|
func HandleHeadlessSSO(w http.ResponseWriter, r *http.Request) {
|
|
conn, err := upgrader.Upgrade(w, r, nil)
|
|
conn, err := upgrader.Upgrade(w, r, nil)
|
|
@@ -239,63 +223,6 @@ func HandleHeadlessSSO(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
|
// == private methods ==
|
|
// == private methods ==
|
|
|
|
|
|
-func addUser(email string) error {
|
|
|
|
- var hasSuperAdmin, err = logic.HasSuperAdmin()
|
|
|
|
- if err != nil {
|
|
|
|
- slog.Error("error checking for existence of admin user during OAuth login for", "email", email, "error", err)
|
|
|
|
- return err
|
|
|
|
- } // generate random password to adapt to current model
|
|
|
|
- var newPass, fetchErr = FetchPassValue("")
|
|
|
|
- if fetchErr != nil {
|
|
|
|
- slog.Error("failed to get password", "error", err.Error())
|
|
|
|
- return fetchErr
|
|
|
|
- }
|
|
|
|
- var newUser = models.User{
|
|
|
|
- UserName: email,
|
|
|
|
- Password: newPass,
|
|
|
|
- }
|
|
|
|
- if !hasSuperAdmin { // must be first attempt, create a superadmin
|
|
|
|
- logger.Log(0, "creating superadmin")
|
|
|
|
- if err = logic.CreateSuperAdmin(&newUser); err != nil {
|
|
|
|
- slog.Error("error creating super admin from user", "email", email, "error", err)
|
|
|
|
- } else {
|
|
|
|
- slog.Info("superadmin created from user", "email", email)
|
|
|
|
- }
|
|
|
|
- } else { // otherwise add to db as admin..?
|
|
|
|
- // TODO: add ability to add users with preemptive permissions
|
|
|
|
- newUser.IsAdmin = false
|
|
|
|
- if err = logic.CreateUser(&newUser); err != nil {
|
|
|
|
- logger.Log(0, "error creating user,", email, "; user not added", "error", err.Error())
|
|
|
|
- } else {
|
|
|
|
- logger.Log(0, "user created from ", email)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- return nil
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-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 getStateAndCode(r *http.Request) (string, string) {
|
|
func getStateAndCode(r *http.Request) (string, string) {
|
|
var state, code string
|
|
var state, code string
|
|
if r.FormValue("state") != "" && r.FormValue("code") != "" {
|
|
if r.FormValue("state") != "" && r.FormValue("code") != "" {
|