Files
1Panel/agent/utils/mysql/client/user_sql.go
2026-07-16 14:24:38 +08:00

98 lines
2.9 KiB
Go

package client
import (
"fmt"
"strings"
)
func splitHosts(permission string) []string {
hosts := strings.Split(permission, ",")
res := make([]string, 0, len(hosts))
for _, host := range hosts {
host = strings.TrimSpace(host)
if len(host) == 0 {
continue
}
res = append(res, host)
}
if len(res) == 0 {
return []string{"%"}
}
return res
}
func userIdentity(username, host string) string {
return fmt.Sprintf("'%s'@'%s'", strings.ReplaceAll(username, "'", "''"), strings.ReplaceAll(host, "'", "''"))
}
func userIdentities(username, permission string) []string {
hosts := splitHosts(permission)
users := make([]string, 0, len(hosts))
for _, host := range hosts {
users = append(users, userIdentity(username, host))
}
return users
}
func isUserExistsErr(err error) bool {
return strings.Contains(strings.ToLower(err.Error()), "error 1396")
}
func createUserSQL(user, password string) string {
return fmt.Sprintf("create user %s identified by '%s';", user, password)
}
func databaseScope(database string) string {
if database == "*" {
return "*.*"
}
return fmt.Sprintf("`%s`.*", database)
}
func grantDatabaseSQL(database, user string) string {
return fmt.Sprintf("grant all privileges on %s to %s", databaseScope(database), user)
}
func createUserGrantSQL(info CreateInfo, user string) string {
grantStr := grantDatabaseSQL(info.Name, user)
if strings.HasPrefix(info.Version, "5.7") || strings.HasPrefix(info.Version, "5.6") {
return fmt.Sprintf("%s identified by '%s' with grant option;", grantStr, info.Password)
}
return grantStr + " with grant option;"
}
func grantUserSQL(info GrantInfo) string {
return grantDatabaseSQL(info.Database, userIdentity(info.Username, info.Host)) + " with grant option;"
}
func revokeGrantSQL(info GrantInfo) string {
return fmt.Sprintf("revoke all privileges on %s from %s;", databaseScope(info.Database), userIdentity(info.Username, info.Host))
}
func revokeGrantOptionSQL(info GrantInfo) string {
return fmt.Sprintf("revoke grant option on %s from %s;", databaseScope(info.Database), userIdentity(info.Username, info.Host))
}
func dropUserSQL(info UserInfo, version string) string {
user := userIdentity(info.Username, info.Host)
if strings.HasPrefix(version, "5.6") {
return fmt.Sprintf("drop user %s", user)
}
return fmt.Sprintf("drop user if exists %s", user)
}
func renameUserSQL(info UserUpdateInfo) string {
return fmt.Sprintf("rename user %s to %s", userIdentity(info.Username, info.Host), userIdentity(info.Username, info.NewHost))
}
func dropDatabaseSQL(name string) string {
return fmt.Sprintf("drop database if exists `%s`", name)
}
func changeUserPasswordSQL(user, password, version string) string {
if strings.HasPrefix(version, "5.7") || strings.HasPrefix(version, "5.6") {
return fmt.Sprintf("set password for %s = password('%s')", user, password)
}
return fmt.Sprintf("ALTER USER %s IDENTIFIED BY '%s';", user, password)
}