diff --git a/agent/app/api/v2/database_mongodb.go b/agent/app/api/v2/database_mongodb.go index d92024a30..2d00c2adb 100644 --- a/agent/app/api/v2/database_mongodb.go +++ b/agent/app/api/v2/database_mongodb.go @@ -171,6 +171,37 @@ func (b *BaseApi) ChangeMongodbPassword(c *gin.Context) { helper.Success(c) } +// @Tags Database Mongodb +// @Summary Change mongodb root password +// @Accept json +// @Param request body dto.ChangeDBInfo true "request" +// @Success 200 +// @Security ApiKeyAuth +// @Security Timestamp +// @Router /databases/mongodb/root/password [post] +// @x-panel-log {"bodyKeys":["database"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新 mongodb 数据库 [database] root 密码","formatEN":"update mongodb database [database] root password"} +func (b *BaseApi) ChangeMongodbRootPassword(c *gin.Context) { + var req dto.ChangeDBInfo + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + if len(req.Value) != 0 { + value, err := base64.StdEncoding.DecodeString(req.Value) + if err != nil { + helper.BadRequest(c, err) + return + } + req.Value = string(value) + } + + if err := mongodbService.ChangeRootPassword(req); err != nil { + helper.InternalServer(c, err) + return + } + helper.Success(c) +} + // @Tags Database Mongodb // @Summary Load mongodb privileges // @Accept json diff --git a/agent/app/dto/database.go b/agent/app/dto/database.go index 4d66aa02d..ab6df4a0f 100644 --- a/agent/app/dto/database.go +++ b/agent/app/dto/database.go @@ -11,7 +11,7 @@ type DBConfUpdateByFile struct { type ChangeDBInfo struct { ID uint `json:"id"` From string `json:"from" validate:"required,oneof=local remote"` - Type string `json:"type" validate:"required,oneof=mysql mariadb postgresql redis mysql-cluster postgresql-cluster redis-cluster"` + Type string `json:"type" validate:"required,oneof=mysql mariadb postgresql redis mongodb mysql-cluster postgresql-cluster redis-cluster"` Database string `json:"database" validate:"required"` Value string `json:"value" validate:"required"` } diff --git a/agent/app/service/app_install.go b/agent/app/service/app_install.go index 659a566d1..6e2d74532 100644 --- a/agent/app/service/app_install.go +++ b/agent/app/service/app_install.go @@ -874,7 +874,7 @@ func updateInstallInfoInDB(appKey, appName, param string, value interface{}) err envKey := "" switch param { case "password": - if appKey == "mysql" || appKey == "mariadb" || appKey == "postgresql" { + if appKey == "mysql" || appKey == "mariadb" || appKey == "postgresql" || appKey == "mongodb" { envKey = "PANEL_DB_ROOT_PASSWORD=" } else { envKey = "PANEL_REDIS_ROOT_PASSWORD=" @@ -915,7 +915,7 @@ func updateInstallInfoInDB(appKey, appName, param string, value interface{}) err "param": strings.ReplaceAll(appInstall.Param, oldVal, newVal), "env": strings.ReplaceAll(appInstall.Env, oldVal, newVal), }, repo.WithByID(appInstall.ID)) - if appKey == "mysql" || appKey == "postgresql" { + if appKey == "mysql" || appKey == "postgresql" || appKey == "mongodb" { return nil } } diff --git a/agent/app/service/database_mongodb.go b/agent/app/service/database_mongodb.go index e80ea2cea..7f9009bd1 100644 --- a/agent/app/service/database_mongodb.go +++ b/agent/app/service/database_mongodb.go @@ -29,6 +29,7 @@ type IMongodbService interface { UpdateDescription(req dto.UpdateDescription) error BindUser(req dto.MongodbBind) error ChangePassword(req dto.MongodbPassword) error + ChangeRootPassword(req dto.ChangeDBInfo) error LoadPrivileges(req dto.MongodbPrivilegesLoad) (string, error) ChangePrivileges(req dto.MongodbPrivileges) error DeleteCheck(req dto.MongodbDBDeleteCheck) ([]dto.DBResource, error) @@ -188,6 +189,40 @@ func (u *MongodbService) ChangePassword(req dto.MongodbPassword) error { return mongodbRepo.Update(dbItem.ID, map[string]interface{}{"password": pass}) } +func (u *MongodbService) ChangeRootPassword(req dto.ChangeDBInfo) error { + if cmd.CheckIllegal(req.Value) { + return buserr.New("ErrCmdIllegal") + } + if req.From != constant.AppResourceLocal { + return buserr.New("ErrRecordNotFound") + } + + appInfo, err := appInstallRepo.LoadBaseInfo(req.Type, req.Database) + if err != nil { + return err + } + if appInfo.UserName == "" { + return buserr.New("ErrRecordNotFound") + } + if err := updateMongodbPassword(req.From, req.Database, "admin", appInfo.UserName, req.Value); err != nil { + return err + } + + if err := updateInstallInfoInDB(req.Type, req.Database, "password", req.Value); err != nil { + return err + } + remote, err := databaseRepo.Get(repo.WithByName(req.Database)) + if err != nil { + return err + } + pass, err := encrypt.StringEncrypt(req.Value) + if err != nil { + return fmt.Errorf("encrypt mongodb root password failed, err: %v", err) + } + _ = databaseRepo.Update(remote.ID, map[string]interface{}{"password": pass}) + return nil +} + func (u *MongodbService) DeleteCheck(req dto.MongodbDBDeleteCheck) ([]dto.DBResource, error) { var res []dto.DBResource db, err := mongodbRepo.Get(repo.WithByID(req.ID)) diff --git a/agent/router/ro_database.go b/agent/router/ro_database.go index 16fd56287..2102bfb39 100644 --- a/agent/router/ro_database.go +++ b/agent/router/ro_database.go @@ -65,6 +65,7 @@ func (s *DatabaseRouter) InitRouter(Router *gin.RouterGroup) { cmdRouter.POST("/mongodb/load", baseApi.LoadMongodbFromRemote) cmdRouter.POST("/mongodb/bind", baseApi.BindMongodbUser) cmdRouter.POST("/mongodb/password", baseApi.ChangeMongodbPassword) + cmdRouter.POST("/mongodb/root/password", baseApi.ChangeMongodbRootPassword) cmdRouter.POST("/mongodb/privileges", baseApi.LoadMongodbPrivileges) cmdRouter.POST("/mongodb/privileges/change", baseApi.ChangeMongodbPrivileges) cmdRouter.POST("/mongodb/del/check", baseApi.DeleteCheckMongodb) diff --git a/frontend/src/api/modules/database.ts b/frontend/src/api/modules/database.ts index fb421a1ab..50ee76292 100644 --- a/frontend/src/api/modules/database.ts +++ b/frontend/src/api/modules/database.ts @@ -112,6 +112,11 @@ export const updateMongodbPassword = (params: Database.MongodbPassword) => { encodeBase64Fields(request, ['password']); return http.post(`/databases/mongodb/password`, request, TimeoutEnum.T_40S); }; +export const updateMongodbRootPassword = (params: Database.ChangeInfo) => { + let request = deepCopy(params) as Database.ChangeInfo; + encodeBase64Fields(request, ['value']); + return http.post(`/databases/mongodb/root/password`, request, TimeoutEnum.T_40S); +}; export const updateMongodbDescription = (params: DescriptionUpdate) => { return http.post(`/databases/mongodb/description`, params, TimeoutEnum.T_40S); }; diff --git a/frontend/src/views/database/mongodb/conn/index.vue b/frontend/src/views/database/mongodb/conn/index.vue index bf04903a5..8020aaf81 100644 --- a/frontend/src/views/database/mongodb/conn/index.vue +++ b/frontend/src/views/database/mongodb/conn/index.vue @@ -1,6 +1,6 @@