diff --git a/go/cmd/dolt/commands/sqlserver/server.go b/go/cmd/dolt/commands/sqlserver/server.go index 81a63e170e5..0fe2f9524a5 100644 --- a/go/cmd/dolt/commands/sqlserver/server.go +++ b/go/cmd/dolt/commands/sqlserver/server.go @@ -516,11 +516,49 @@ func ConfigureServices( controller.Register(InitMetricsListener) InitLockSuperUser := &svcs.AnonService{ - InitF: func(context.Context) error { + InitF: func(ctx context.Context) error { mysqlDb := sqlEngine.GetUnderlyingEngine().Analyzer.Catalog.MySQLDb + + host := "localhost" + // this is reserved for `dolt sql` connections when sql-server is running + reservedUser := LocalConnectionUser + + rd := mysqlDb.Reader() + conflict, _ := rd.GetUser(mysql_db.UserPrimaryKey{Host: host, User: reservedUser}) + rd.Close() + + var conflicts []mysql_db.UserPrimaryKey + if conflict != nil && !conflict.IsEphemeral { + logrus.Warnf("Dropping persisted '%s@%s' because this account name is reserved for Dolt", conflict.User, conflict.Host) + conflicts = append(conflicts, mysql_db.UserPrimaryKey{Host: conflict.Host, User: conflict.User}) + } + ed := mysqlDb.Editor() + defer ed.Close() + + if len(conflicts) > 0 { + c := conflicts[0] + ed.RemoveUser(c) + ed.RemoveRoleEdgesFromKey(mysql_db.RoleEdgesFromKey{ + FromHost: c.Host, + FromUser: c.User, + }) + ed.RemoveRoleEdgesToKey(mysql_db.RoleEdgesToKey{ + ToHost: c.Host, + ToUser: c.User, + }) + + sqlCtx, err := sqlEngine.NewDefaultContext(ctx) + if err != nil { + return fmt.Errorf("failed to create SQL context: %v", err) + } + if err := mysqlDb.Persist(sqlCtx, ed); err != nil { + return fmt.Errorf("failed to persist changes to privileges database: %v", err) + } + } + mysqlDb.AddEphemeralSuperUser(ed, LocalConnectionUser, "localhost", localCreds.Secret) - ed.Close() + return nil }, } @@ -1144,4 +1182,5 @@ func getEventSchedulerStatus(status string) (eventscheduler.SchedulerStatus, err default: return eventscheduler.SchedulerDisabled, fmt.Errorf("Error while setting value '%s' to 'event_scheduler'.", status) } + } diff --git a/integration-tests/bats/sql-server.bats b/integration-tests/bats/sql-server.bats index db48a231994..cb89cd08415 100644 --- a/integration-tests/bats/sql-server.bats +++ b/integration-tests/bats/sql-server.bats @@ -2115,3 +2115,25 @@ EOF [[ "$output" =~ "br3 | true" ]] || false [[ "$output" =~ "main | false" ]] || false } + +@test "sql-server: warning log on forced __dolt_local_user__ drop after restart" { + skiponwindows "Missing dependencies" + + cd repo1 + start_sql_server > server_log.txt 2>&1 + + # use root account to avoid err on drop + run dolt -u root -p "" sql -q "drop user if exists __dolt_local_user__@localhost" + [ $status -eq 0 ] + run dolt -u root -p "" sql -q "create user __dolt_local_user__@localhost" + [ $status -eq 0 ] + run dolt sql + [ $status -ne 0 ] + [[ "$output" =~ "Error 1045 (28000): Access denied for user" ]] || false + + stop_sql_server 1 && sleep 0.5 + start_sql_server > server_log.txt 2>&1 && sleep 0.5 + + run grep -F "Dropping persisted '__dolt_local_user__@localhost' because this account name is reserved for Dolt" server_log.txt + [ $status -eq 0 ] +}