Skip to content

Commit f4c3aaf

Browse files
authored
fix: 解决数据库用户名超长导致用户创建失败的问题 (#2011)
1 parent c1db588 commit f4c3aaf

File tree

3 files changed

+52
-27
lines changed

3 files changed

+52
-27
lines changed

backend/utils/mysql/client/info.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
package client
22

3+
import (
4+
"strings"
5+
6+
"github.com/1Panel-dev/1Panel/backend/utils/common"
7+
)
8+
39
type DBInfo struct {
410
From string `json:"from"`
511
Address string `json:"address"`
@@ -85,3 +91,16 @@ var formatMap = map[string]string{
8591
"gbk": "gbk_chinese_ci",
8692
"big5": "big5_chinese_ci",
8793
}
94+
95+
func loadNameByDB(name, version string) string {
96+
if strings.HasPrefix(version, "5.6") {
97+
if len(name) <= 16 {
98+
return name
99+
}
100+
return strings.TrimSuffix(name[:10], "_") + "_" + common.RandStr(5)
101+
}
102+
if len(name) <= 32 {
103+
return name
104+
}
105+
return strings.TrimSuffix(name[:25], "_") + "_" + common.RandStr(5)
106+
}

backend/utils/mysql/client/local.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,15 @@ func (r *Local) Create(info CreateInfo) error {
3838
return err
3939
}
4040

41-
if err := r.CreateUser(info); err != nil {
41+
if err := r.CreateUser(info, true); err != nil {
4242
_ = r.ExecSQL(fmt.Sprintf("drop database if exists `%s`", info.Name), info.Timeout)
4343
return err
4444
}
4545

4646
return nil
4747
}
4848

49-
func (r *Local) CreateUser(info CreateInfo) error {
49+
func (r *Local) CreateUser(info CreateInfo, withDeleteDB bool) error {
5050
var userlist []string
5151
if strings.Contains(info.Permission, ",") {
5252
ips := strings.Split(info.Permission, ",")
@@ -201,7 +201,7 @@ func (r *Local) ChangeAccess(info AccessChangeInfo) error {
201201
Password: info.Password,
202202
Permission: info.Permission,
203203
Timeout: info.Timeout,
204-
}); err != nil {
204+
}, false); err != nil {
205205
return err
206206
}
207207
if err := r.ExecSQL("flush privileges", 300); err != nil {
@@ -305,15 +305,16 @@ func (r *Local) SyncDB(version string) ([]SyncDBInfo, error) {
305305
}
306306
}
307307
if len(dataItem.Username) == 0 {
308+
username := loadNameByDB(parts[0], version)
308309
if err := r.CreateUser(CreateInfo{
309310
Name: parts[0],
310311
Format: parts[1],
311312
Version: version,
312-
Username: parts[0],
313+
Username: username,
313314
Password: common.RandStr(16),
314315
Permission: "%",
315316
Timeout: 300,
316-
}); err != nil {
317+
}, false); err != nil {
317318
global.LOG.Errorf("sync from remote server failed, err: create user failed %v", err)
318319
}
319320
dataItem.Username = parts[0]

backend/utils/mysql/client/remote.go

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,15 @@ func (r *Remote) Create(info CreateInfo) error {
3939
return err
4040
}
4141

42-
if err := r.CreateUser(info); err != nil {
42+
if err := r.CreateUser(info, true); err != nil {
4343
_ = r.ExecSQL(fmt.Sprintf("drop database if exists `%s`", info.Name), info.Timeout)
4444
return err
4545
}
4646

4747
return nil
4848
}
4949

50-
func (r *Remote) CreateUser(info CreateInfo) error {
50+
func (r *Remote) CreateUser(info CreateInfo, withDeleteDB bool) error {
5151
var userlist []string
5252
if strings.Contains(info.Permission, ",") {
5353
ips := strings.Split(info.Permission, ",")
@@ -62,15 +62,17 @@ func (r *Remote) CreateUser(info CreateInfo) error {
6262

6363
for _, user := range userlist {
6464
if err := r.ExecSQL(fmt.Sprintf("create user %s identified by '%s';", user, info.Password), info.Timeout); err != nil {
65-
_ = r.Delete(DeleteInfo{
66-
Name: info.Name,
67-
Version: info.Version,
68-
Username: info.Username,
69-
Permission: info.Permission,
70-
ForceDelete: true,
71-
Timeout: 300})
72-
if strings.Contains(err.Error(), "ERROR 1396") {
73-
return buserr.New(constant.ErrUserIsExist)
65+
if withDeleteDB {
66+
_ = r.Delete(DeleteInfo{
67+
Name: info.Name,
68+
Version: info.Version,
69+
Username: info.Username,
70+
Permission: info.Permission,
71+
ForceDelete: true,
72+
Timeout: 300})
73+
if strings.Contains(err.Error(), "ERROR 1396") {
74+
return buserr.New(constant.ErrUserIsExist)
75+
}
7476
}
7577
return err
7678
}
@@ -82,13 +84,15 @@ func (r *Remote) CreateUser(info CreateInfo) error {
8284
grantStr = fmt.Sprintf("%s identified by '%s' with grant option;", grantStr, info.Password)
8385
}
8486
if err := r.ExecSQL(grantStr, info.Timeout); err != nil {
85-
_ = r.Delete(DeleteInfo{
86-
Name: info.Name,
87-
Version: info.Version,
88-
Username: info.Username,
89-
Permission: info.Permission,
90-
ForceDelete: true,
91-
Timeout: 300})
87+
if withDeleteDB {
88+
_ = r.Delete(DeleteInfo{
89+
Name: info.Name,
90+
Version: info.Version,
91+
Username: info.Username,
92+
Permission: info.Permission,
93+
ForceDelete: true,
94+
Timeout: 300})
95+
}
9296
return err
9397
}
9498
}
@@ -202,7 +206,7 @@ func (r *Remote) ChangeAccess(info AccessChangeInfo) error {
202206
Password: info.Password,
203207
Permission: info.Permission,
204208
Timeout: info.Timeout,
205-
}); err != nil {
209+
}, false); err != nil {
206210
return err
207211
}
208212
if err := r.ExecSQL("flush privileges", 300); err != nil {
@@ -312,16 +316,17 @@ func (r *Remote) SyncDB(version string) ([]SyncDBInfo, error) {
312316
i++
313317
}
314318
if len(dataItem.Username) == 0 {
319+
userName := loadNameByDB(dbName, version)
315320
if err := r.CreateUser(CreateInfo{
316321
Name: dbName,
317322
Format: charsetName,
318323
Version: version,
319-
Username: dbName,
324+
Username: userName,
320325
Password: common.RandStr(16),
321326
Permission: "%",
322327
Timeout: 300,
323-
}); err != nil {
324-
global.LOG.Errorf("sync from remote server failed, err: create user failed %v", err)
328+
}, false); err != nil {
329+
return datas, fmt.Errorf("sync db from remote server failed, err: create user failed %v", err)
325330
}
326331
dataItem.Username = dbName
327332
dataItem.Permission = "%"

0 commit comments

Comments
 (0)