diff --git a/cmd/moco-agent/cmd/root.go b/cmd/moco-agent/cmd/root.go index 14489d5..09be0e3 100644 --- a/cmd/moco-agent/cmd/root.go +++ b/cmd/moco-agent/cmd/root.go @@ -259,7 +259,7 @@ func initializeMySQLForMOCO(ctx context.Context, socketPath string, logger logr. if err == nil { break } - if server.IsAccessDenied(err) { + if server.UserNotExists(err) { // There is no passwordless 'root'@'localhost' account. // It means the initialization has been completed. return nil diff --git a/server/connect.go b/server/connect.go index 413413d..557a268 100644 --- a/server/connect.go +++ b/server/connect.go @@ -53,9 +53,15 @@ func GetMySQLConnLocalSocket(user, password, socket string) (*sqlx.DB, error) { return db, nil } -func IsAccessDenied(err error) bool { +func UserNotExists(err error) bool { + // For security reason, error messages are randomly output when a user does not exist. + // https://github.com/mysql/mysql-server/commit/b40001faf6229dca668c9d03ba75c451f999c9f5 + // This function assumes the user does not exist when the following message is output: + // ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) + // ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded + codes := []int{1045, 1524} var merr *mysql.MySQLError - if errors.As(err, &merr) && merr.Number == 1045 { + if errors.As(err, &merr) && contains(codes, merr.Number) { return true }