fix enterprise user cli updates (#12689)

This commit is contained in:
ssongliu
2026-05-08 17:44:55 +08:00
committed by zhengkunwang223
parent 11771b2b53
commit 6cd0373678
3 changed files with 130 additions and 12 deletions

View File

@@ -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

View File

@@ -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}))

View File

@@ -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
}