diff --git a/server/channels/app/bot.go b/server/channels/app/bot.go index 27b5e6ce0c..708d2e4453 100644 --- a/server/channels/app/bot.go +++ b/server/channels/app/bot.go @@ -604,6 +604,27 @@ func (a *App) getDisableBotSysadminMessage(user *model.User, userBots model.BotL // ConvertUserToBot converts a user to bot. func (a *App) ConvertUserToBot(rctx request.CTX, user *model.User) (*model.Bot, *model.AppError) { + // Clear OAuth credentials before converting to bot + if user.AuthService != "" { + emptyString := "" + userAuth := &model.UserAuth{ + AuthService: "", + AuthData: &emptyString, + } + + _, err := a.UpdateUserAuth(rctx, user.Id, userAuth) + if err != nil { + return nil, err + } + + // Refresh user data + updatedUser, err := a.GetUser(user.Id) + if err != nil { + return nil, err + } + user = updatedUser + } + bot, err := a.Srv().Store().Bot().Save(model.BotFromUser(user)) if err != nil { var appErr *model.AppError diff --git a/server/channels/app/bot_test.go b/server/channels/app/bot_test.go index 7599898946..e011c7a795 100644 --- a/server/channels/app/bot_test.go +++ b/server/channels/app/bot_test.go @@ -901,6 +901,54 @@ func TestConvertUserToBot(t *testing.T) { require.NotNil(t, err) require.Equal(t, "api.context.invalid_token.error", err.Id) }) + + t.Run("user with oauth credentials", func(t *testing.T) { + th := Setup(t).InitBasic() + defer th.TearDown() + + // Create a user first + oauthUser := &model.User{ + Email: "oauth_user@example.com", + Username: "oauth_user", + Password: "password", + EmailVerified: true, + } + + oauthUser, err := th.App.CreateUser(th.Context, oauthUser) + require.Nil(t, err) + + // Set OAuth credentials + authData := "google_auth_data" + userAuth := &model.UserAuth{ + AuthData: &authData, + AuthService: "google", + } + _, err = th.App.UpdateUserAuth(th.Context, oauthUser.Id, userAuth) + require.Nil(t, err) + + // Verify OAuth credentials are set + oauthUser, appErr := th.App.GetUser(oauthUser.Id) + require.Nil(t, appErr) + require.Equal(t, "google", oauthUser.AuthService) + require.NotNil(t, oauthUser.AuthData) + + // Convert user to bot + bot, err := th.App.ConvertUserToBot(th.Context, oauthUser) + require.Nil(t, err) + defer func() { + err = th.App.PermanentDeleteBot(th.Context, bot.UserId) + require.Nil(t, err) + }() + + // Get updated user and verify OAuth credentials are cleared + updatedUser, err := th.App.GetUser(oauthUser.Id) + require.Nil(t, err) + assert.Empty(t, updatedUser.AuthService) + // AuthData may be empty string instead of nil in the database + if updatedUser.AuthData != nil { + assert.Empty(t, *updatedUser.AuthData) + } + }) } func TestGetSystemBot(t *testing.T) {