diff --git a/core/cmd/server/cmd/root.go b/core/cmd/server/cmd/root.go index f61cbac5b..36a5e2b38 100644 --- a/core/cmd/server/cmd/root.go +++ b/core/cmd/server/cmd/root.go @@ -43,7 +43,7 @@ func loadDBConn(dbName string) (*gorm.DB, error) { return nil, fmt.Errorf("handle load `BASE_DIR` failed, err: %v", err) } if len(baseDir) == 0 { - return nil, fmt.Errorf("error `BASE_DIR` find in /usr/local/bin/1pctl \n") + return nil, fmt.Errorf("error `BASE_DIR` find in /usr/local/bin/1pctl") } if strings.HasSuffix(baseDir, "/") { baseDir = baseDir[:strings.LastIndex(baseDir, "/")] @@ -51,7 +51,7 @@ func loadDBConn(dbName string) (*gorm.DB, error) { db, err := gorm.Open(sqlite.Open(path.Join(baseDir, "1panel/db", dbName)), &gorm.Config{}) if err != nil { - return nil, fmt.Errorf("init my db conn failed, err: %v \n", err) + return nil, fmt.Errorf("init my db conn failed, err: %v", err) } return db, nil } @@ -64,7 +64,7 @@ func getSettingByKey(db *gorm.DB, key string) string { type LoginLog struct{} -func isDefault(db *gorm.DB) bool { +func shouldShowInitialPassword(db *gorm.DB) bool { logCount := int64(0) _ = db.Model(&LoginLog{}).Where("status = ?", "Success").Count(&logCount).Error return logCount == 0 diff --git a/core/cmd/server/cmd/update.go b/core/cmd/server/cmd/update.go index 78c5e4811..51297f860 100644 --- a/core/cmd/server/cmd/update.go +++ b/core/cmd/server/cmd/update.go @@ -9,6 +9,7 @@ import ( "strings" "unicode" + "github.com/1Panel-dev/1Panel/core/cmd/server/conf" "github.com/1Panel-dev/1Panel/core/constant" "github.com/1Panel-dev/1Panel/core/global" "github.com/1Panel-dev/1Panel/core/i18n" @@ -17,6 +18,8 @@ import ( "github.com/1Panel-dev/1Panel/core/utils/encrypt" "github.com/spf13/cobra" "golang.org/x/term" + "gopkg.in/yaml.v3" + "gorm.io/gorm" ) func init() { @@ -27,12 +30,17 @@ func init() { RootCmd.AddCommand(updateCmd) updateCmd.AddCommand(updateUserName) + updateUserName.Flags().StringVar(&updateUserNameFlag, "username", "", "username") updateCmd.AddCommand(updatePassword) + updatePassword.Flags().StringVar(&updatePasswordUserName, "username", "", "username") updateCmd.AddCommand(updatePort) updateCmd.AddCommand(updateVersion) } +var updateUserNameFlag string +var updatePasswordUserName string + var updateCmd = &cobra.Command{ Use: "update", RunE: func(cmd *cobra.Command, args []string) error { @@ -51,6 +59,10 @@ var updateUserName = &cobra.Command{ fmt.Println(i18n.GetMsgWithMapForCmd("SudoHelper", map[string]interface{}{"cmd": "sudo 1pctl update username"})) return nil } + if isEnterprise() && len(strings.TrimSpace(updateUserNameFlag)) == 0 { + fmt.Println(i18n.GetMsgByKey("UsernameNeed")) + return nil + } username() return nil }, @@ -64,10 +76,51 @@ var updatePassword = &cobra.Command{ fmt.Println(i18n.GetMsgWithMapForCmd("SudoHelper", map[string]interface{}{"cmd": "sudo 1pctl update password"})) return nil } + if isEnterprise() && len(strings.TrimSpace(updatePasswordUserName)) == 0 { + fmt.Println(i18n.GetMsgByKey("UsernameNeed")) + return nil + } password() return nil }, } + +type serverConfig struct { + Base struct { + IsEnterprise bool `yaml:"is_enterprise"` + } `yaml:"base"` +} + +func isEnterprise() bool { + var config serverConfig + if err := yaml.Unmarshal(conf.AppYaml, &config); err != nil { + return false + } + return config.Base.IsEnterprise +} + +func updateEnterprisePassword(db *gorm.DB, username, password string) error { + result := db.Exec("UPDATE users SET password = ? WHERE name = ?", password, username) + if result.Error != nil { + return result.Error + } + if result.RowsAffected == 0 { + return fmt.Errorf("user %s not found", username) + } + return nil +} + +func updateEnterpriseUserName(db *gorm.DB, username, newUsername string) error { + result := db.Exec("UPDATE users SET name = ? WHERE name = ?", newUsername, username) + if result.Error != nil { + return result.Error + } + if result.RowsAffected == 0 { + return fmt.Errorf("user %s not found", username) + } + return nil +} + var updatePort = &cobra.Command{ Use: "port", Short: i18n.GetMsgByKeyForCmd("UpdatePort"), @@ -132,7 +185,17 @@ func username() { fmt.Println(i18n.GetMsgWithMapForCmd("DBConnErr", map[string]interface{}{"err": err.Error()})) return } - if err := setSettingByKey(db, "UserName", newUsername); err != nil { + if isEnterprise() { + enterpriseDB, err := loadDBConn("enterprise.db") + if err != nil { + fmt.Println(i18n.GetMsgWithMapForCmd("DBConnErr", map[string]interface{}{"err": err.Error()})) + return + } + if err := updateEnterpriseUserName(enterpriseDB, strings.TrimSpace(updateUserNameFlag), newUsername); err != nil { + fmt.Println(i18n.GetMsgWithMapForCmd("UpdateUserErr", map[string]interface{}{"err": err.Error()})) + return + } + } else if err := setSettingByKey(db, "UserName", newUsername); err != nil { fmt.Println(i18n.GetMsgWithMapForCmd("UpdateUserErr", map[string]interface{}{"err": err.Error()})) return } @@ -198,11 +261,24 @@ func password() { } else { p = newPassword } - if err := setSettingByKey(db, "Password", p); err != nil { + if isEnterprise() { + enterpriseDB, err := loadDBConn("enterprise.db") + if err != nil { + fmt.Println("\n" + i18n.GetMsgWithMapForCmd("DBConnErr", map[string]interface{}{"err": err.Error()})) + return + } + if err := updateEnterprisePassword(enterpriseDB, strings.TrimSpace(updatePasswordUserName), p); err != nil { + fmt.Println("\n", i18n.GetMsgWithMapForCmd("UpdatePortErr", map[string]interface{}{"err": err.Error()})) + return + } + } else if err := setSettingByKey(db, "Password", p); err != nil { fmt.Println("\n", i18n.GetMsgWithMapForCmd("UpdatePortErr", map[string]interface{}{"err": err.Error()})) return } username := getSettingByKey(db, "UserName") + if isEnterprise() { + username = strings.TrimSpace(updatePasswordUserName) + } fmt.Println("\n" + i18n.GetMsgByKeyForCmd("UpdateSuccessful")) fmt.Println(i18n.GetMsgWithMapForCmd("UpdateUserResult", map[string]interface{}{"name": username})) diff --git a/core/cmd/server/cmd/user-info.go b/core/cmd/server/cmd/user-info.go index 1bc92f7f3..99e4e1575 100644 --- a/core/cmd/server/cmd/user-info.go +++ b/core/cmd/server/cmd/user-info.go @@ -2,12 +2,14 @@ package cmd import ( "fmt" + "strings" "github.com/1Panel-dev/1Panel/core/constant" "github.com/1Panel-dev/1Panel/core/global" "github.com/1Panel-dev/1Panel/core/i18n" "github.com/1Panel-dev/1Panel/core/utils/encrypt" "github.com/spf13/cobra" + "gorm.io/gorm" ) func init() { @@ -24,22 +26,43 @@ var userinfoCmd = &cobra.Command{ } db, err := loadDBConn("core.db") if err != nil { - return fmt.Errorf("init my db conn failed, err: %v \n", err) + return fmt.Errorf("init my db conn failed, err: %v", err) } agentDB, err := loadDBConn("agent.db") if err != nil { - return fmt.Errorf("init my agent db conn failed, err: %v \n", err) + return fmt.Errorf("init my agent db conn failed, err: %v", err) } - user := getSettingByKey(db, "UserName") + isEnterpriseVersion := isEnterprise() + showInitialPassword := shouldShowInitialPassword(db) + encryptSetting := getSettingByKey(db, "EncryptKey") + user := "" pass := "********" - if isDefault(db) { - encryptSetting := getSettingByKey(db, "EncryptKey") - pass = getSettingByKey(db, "Password") + if isEnterpriseVersion { + enterpriseDB, err := loadDBConn("enterprise.db") + if err != nil { + return fmt.Errorf("init my enterprise db conn failed, err: %v", err) + } + enterpriseUser, enterprisePassword, err := loadEnterpriseSuperAdminInfo(enterpriseDB) + if err != nil { + return err + } + user = enterpriseUser + if showInitialPassword { + pass = enterprisePassword + } + } else { + user = getSettingByKey(db, "UserName") + if showInitialPassword { + pass = getSettingByKey(db, "Password") + } + } + if showInitialPassword { if len(encryptSetting) == 16 { global.CONF.Base.EncryptKey = encryptSetting pass, _ = encrypt.StringDecrypt(pass) } } + port := getSettingByKey(db, "ServerPort") ssl := getSettingByKey(db, "SSL") entrance := getSettingByKey(db, "SecurityEntrance") @@ -60,7 +83,26 @@ var userinfoCmd = &cobra.Command{ fmt.Println(i18n.GetMsgByKeyForCmd("UserInfoAddr") + fmt.Sprintf("%s://%s:%s/%s ", protocol, address, port, entrance)) fmt.Println(i18n.GetMsgWithMapForCmd("UpdateUserResult", map[string]interface{}{"name": user})) fmt.Println(i18n.GetMsgWithMapForCmd("UpdatePasswordResult", map[string]interface{}{"name": pass})) - fmt.Println(i18n.GetMsgByKeyForCmd("UserInfoPassHelp") + "1pctl update password") + updatePasswordCmd := "1pctl update password" + if isEnterpriseVersion && strings.TrimSpace(user) != "" { + updatePasswordCmd += " --username " + user + } + fmt.Println(i18n.GetMsgByKeyForCmd("UserInfoPassHelp") + updatePasswordCmd) return nil }, } + +func loadEnterpriseSuperAdminInfo(db *gorm.DB) (string, string, error) { + var user struct { + Name string + Password string + } + result := db.Raw("SELECT name, password FROM users WHERE is_super_admin = ? ORDER BY id LIMIT 1", true).Scan(&user) + if result.Error != nil { + return "", "", result.Error + } + if result.RowsAffected == 0 { + return "", "", fmt.Errorf("super admin user not found") + } + return user.Name, user.Password, nil +}