瀏覽代碼

add migration func to assign superadmin role for existing admin user

Abhishek Kondur 2 年之前
父節點
當前提交
ed5d022af0
共有 3 個文件被更改,包括 43 次插入7 次删除
  1. 7 6
      controllers/user.go
  2. 1 1
      logic/gateway.go
  3. 35 0
      migrate/migrate.go

+ 7 - 6
controllers/user.go

@@ -23,7 +23,7 @@ var (
 func userHandlers(r *mux.Router) {
 	r.HandleFunc("/api/users/adm/hassuperadmin", hasSuperAdmin).Methods(http.MethodGet)
 	r.HandleFunc("/api/users/adm/createsuperadmin", createSuperAdmin).Methods(http.MethodPost)
-	r.HandleFunc("/api/users/adm/transfersuperadmin", logic.SecurityCheck(true, http.HandlerFunc(transferSuperAdmin))).Methods(http.MethodPost)
+	r.HandleFunc("/api/users/adm/transfersuperadmin/{username}", logic.SecurityCheck(true, http.HandlerFunc(transferSuperAdmin))).Methods(http.MethodPost)
 	r.HandleFunc("/api/users/adm/authenticate", authenticateUser).Methods(http.MethodPost)
 	r.HandleFunc("/api/users/{username}/remote_access_gw/{remote_access_gateway_id}", logic.SecurityCheck(true, http.HandlerFunc(attachUserToRemoteAccessGw))).Methods(http.MethodPost)
 	r.HandleFunc("/api/users/{username}/remote_access_gw/{remote_access_gateway_id}", logic.SecurityCheck(true, http.HandlerFunc(removeUserFromRemoteAccessGW))).Methods(http.MethodDelete)
@@ -471,10 +471,11 @@ func transferSuperAdmin(w http.ResponseWriter, r *http.Request) {
 		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("only superadmin can assign the superadmin role to another user"), "forbidden"))
 		return
 	}
-	var u models.User
-	err = json.NewDecoder(r.Body).Decode(&u)
+	var params = mux.Vars(r)
+	username := params["username"]
+	u, err := logic.GetUser(username)
 	if err != nil {
-		slog.Error("error decoding request body: ", "error", err.Error())
+		slog.Error("error getting user", "user", u.UserName, "error", err.Error())
 		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
 		return
 	}
@@ -489,7 +490,7 @@ func transferSuperAdmin(w http.ResponseWriter, r *http.Request) {
 
 	u.IsSuperAdmin = true
 	u.IsAdmin = false
-	err = logic.UpsertUser(u)
+	err = logic.UpsertUser(*u)
 	if err != nil {
 		slog.Error("error updating user to superadmin: ", "user", u.UserName, "error", err.Error())
 		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
@@ -504,7 +505,7 @@ func transferSuperAdmin(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 	slog.Info("user was made a super admin", "user", u.UserName)
-	json.NewEncoder(w).Encode(logic.ToReturnUser(u))
+	json.NewEncoder(w).Encode(logic.ToReturnUser(*u))
 }
 
 // swagger:route POST /api/users/{username} user createUser

+ 1 - 1
logic/gateway.go

@@ -171,7 +171,7 @@ func GetIngressGwUsers(node models.Node) (models.IngressGwUsers, error) {
 		return gwUsers, err
 	}
 	for _, user := range users {
-		if _, ok := user.RemoteGwIDs[node.ID.String()]; ok {
+		if !user.IsAdmin && !user.IsSuperAdmin {
 			gwUsers.Users = append(gwUsers.Users, user)
 		}
 	}

+ 35 - 0
migrate/migrate.go

@@ -5,12 +5,47 @@ import (
 
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/logger"
+	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
+	"golang.org/x/exp/slog"
 )
 
 // Run - runs all migrations
 func Run() {
 	updateEnrollmentKeys()
+	assignSuperAdmin()
+}
+
+func assignSuperAdmin() {
+	ok, _ := logic.HasSuperAdmin()
+	if !ok {
+		createdSuperAdmin := false
+		users, err := logic.GetUsers()
+		if err == nil {
+			for _, u := range users {
+				if u.IsAdmin {
+					user, err := logic.GetUser(u.UserName)
+					if err != nil {
+						slog.Error("error getting user", "user", u.UserName, "error", err.Error())
+						continue
+					}
+					user.IsSuperAdmin = true
+					user.IsAdmin = false
+					err = logic.UpsertUser(*user)
+					if err != nil {
+						slog.Error("error updating user to superadmin", "user", user.UserName, "error", err.Error())
+						continue
+					} else {
+						createdSuperAdmin = true
+					}
+					break
+				}
+			}
+		}
+		if !createdSuperAdmin {
+			logger.FatalLog0("failed to create superadmin!!")
+		}
+	}
 }
 
 func updateEnrollmentKeys() {