Skip to content

Commit

Permalink
Always log out a deleted user (#987)
Browse files Browse the repository at this point in the history
  • Loading branch information
sesposito authored Feb 27, 2023
1 parent 285305e commit 23b7ea7
Show file tree
Hide file tree
Showing 9 changed files with 26 additions and 19 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ The format is based on [keep a changelog](http://keepachangelog.com) and this pr
- Use stricter validation of method param in Lua server framework HTTP request function.
- Disable SQL statement cache mode describe by default. This reverts to the same behaviour as before 3.14.0 release.
- Build with Go 1.19.4 release.
- Always log out and disconnect a user when it's deleted.

### Fixed
- Fix response structure in purchase lookups by identifier.
Expand Down
2 changes: 1 addition & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ func main() {
statusHandler := server.NewLocalStatusHandler(logger, sessionRegistry, matchRegistry, tracker, metrics, config.GetName())

apiServer := server.StartApiServer(logger, startupLogger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, version, socialClient, leaderboardCache, leaderboardRankCache, sessionRegistry, sessionCache, statusRegistry, matchRegistry, matchmaker, tracker, router, streamManager, metrics, pipeline, runtime)
consoleServer := server.StartConsoleServer(logger, startupLogger, db, config, tracker, router, streamManager, metrics, sessionCache, consoleSessionCache, loginAttemptCache, statusRegistry, statusHandler, runtimeInfo, matchRegistry, configWarnings, semver, leaderboardCache, leaderboardRankCache, leaderboardScheduler, apiServer, runtime, cookie)
consoleServer := server.StartConsoleServer(logger, startupLogger, db, config, tracker, router, streamManager, metrics, sessionRegistry, sessionCache, consoleSessionCache, loginAttemptCache, statusRegistry, statusHandler, runtimeInfo, matchRegistry, configWarnings, semver, leaderboardCache, leaderboardRankCache, leaderboardScheduler, apiServer, runtime, cookie)

gaenabled := len(os.Getenv("NAKAMA_TELEMETRY")) < 1
console.UIFS.Nt = !gaenabled
Expand Down
13 changes: 1 addition & 12 deletions server/api_account.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,23 +93,12 @@ func (s *ApiServer) DeleteAccount(ctx context.Context, in *emptypb.Empty) (*empt
}
}

if err := DeleteAccount(ctx, s.logger, s.db, s.leaderboardRankCache, userID, false); err != nil {
if err := DeleteAccount(ctx, s.logger, s.db, s.config, s.leaderboardRankCache, s.sessionRegistry, s.sessionCache, s.tracker, userID, false); err != nil {
if err == ErrAccountNotFound {
return nil, status.Error(codes.NotFound, "Account not found.")
}
return nil, status.Error(codes.Internal, "Error deleting user account.")
}
// Logout and disconnect.
err := SessionLogout(s.config, s.sessionCache, userID, "", "")
if err != nil {
return nil, err
}
for _, presence := range s.tracker.ListPresenceIDByStream(PresenceStream{Mode: StreamModeNotifications, Subject: userID}) {
err = s.sessionRegistry.Disconnect(ctx, presence.SessionID)
if err != nil {
return nil, err
}
}

// After hook.
if fn := s.runtime.AfterDeleteAccount(); fn != nil {
Expand Down
4 changes: 3 additions & 1 deletion server/console.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ type ConsoleServer struct {
streamManager StreamManager
metrics Metrics
sessionCache SessionCache
sessionRegistry SessionRegistry
consoleSessionCache SessionCache
loginAttemptCache LoginAttemptCache
statusRegistry *StatusRegistry
Expand All @@ -163,7 +164,7 @@ type ConsoleServer struct {
httpClient *http.Client
}

func StartConsoleServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.DB, config Config, tracker Tracker, router MessageRouter, streamManager StreamManager, metrics Metrics, sessionCache SessionCache, consoleSessionCache SessionCache, loginAttemptCache LoginAttemptCache, statusRegistry *StatusRegistry, statusHandler StatusHandler, runtimeInfo *RuntimeInfo, matchRegistry MatchRegistry, configWarnings map[string]string, serverVersion string, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, api *ApiServer, runtime *Runtime, cookie string) *ConsoleServer {
func StartConsoleServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.DB, config Config, tracker Tracker, router MessageRouter, streamManager StreamManager, metrics Metrics, sessionRegistry SessionRegistry, sessionCache SessionCache, consoleSessionCache SessionCache, loginAttemptCache LoginAttemptCache, statusRegistry *StatusRegistry, statusHandler StatusHandler, runtimeInfo *RuntimeInfo, matchRegistry MatchRegistry, configWarnings map[string]string, serverVersion string, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, api *ApiServer, runtime *Runtime, cookie string) *ConsoleServer {
var gatewayContextTimeoutMs string
if config.GetConsole().IdleTimeoutMs > 500 {
// Ensure the GRPC Gateway timeout is just under the idle timeout (if possible) to ensure it has priority.
Expand All @@ -189,6 +190,7 @@ func StartConsoleServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.D
router: router,
streamManager: streamManager,
metrics: metrics,
sessionRegistry: sessionRegistry,
sessionCache: sessionCache,
consoleSessionCache: consoleSessionCache,
loginAttemptCache: loginAttemptCache,
Expand Down
2 changes: 1 addition & 1 deletion server/console_account.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ func (s *ConsoleServer) DeleteAccount(ctx context.Context, in *console.AccountDe
return nil, status.Error(codes.InvalidArgument, "Cannot delete the system user.")
}

if err = DeleteAccount(ctx, s.logger, s.db, s.leaderboardRankCache, userID, in.RecordDeletion != nil && in.RecordDeletion.Value); err != nil {
if err = DeleteAccount(ctx, s.logger, s.db, s.config, s.leaderboardRankCache, s.sessionRegistry, s.sessionCache, s.tracker, userID, in.RecordDeletion != nil && in.RecordDeletion.Value); err != nil {
// Error already logged in function above.
return nil, status.Error(codes.Internal, "An error occurred while trying to delete the user.")
}
Expand Down
17 changes: 16 additions & 1 deletion server/core_account.go
Original file line number Diff line number Diff line change
Expand Up @@ -470,7 +470,7 @@ func ExportAccount(ctx context.Context, logger *zap.Logger, db *sql.DB, userID u
return export, nil
}

func DeleteAccount(ctx context.Context, logger *zap.Logger, db *sql.DB, leaderboardRankCache LeaderboardRankCache, userID uuid.UUID, recorded bool) error {
func DeleteAccount(ctx context.Context, logger *zap.Logger, db *sql.DB, config Config, leaderboardRankCache LeaderboardRankCache, sessionRegistry SessionRegistry, sessionCache SessionCache, tracker Tracker, userID uuid.UUID, recorded bool) error {
ts := time.Now().UTC().Unix()

tx, err := db.BeginTx(ctx, nil)
Expand All @@ -479,6 +479,7 @@ func DeleteAccount(ctx context.Context, logger *zap.Logger, db *sql.DB, leaderbo
return err
}

var deleted bool
if err := ExecuteInTx(ctx, tx, func() error {
count, err := DeleteUser(ctx, tx, userID)
if err != nil {
Expand Down Expand Up @@ -509,11 +510,25 @@ func DeleteAccount(ctx context.Context, logger *zap.Logger, db *sql.DB, leaderbo
}
}

deleted = true

return nil
}); err != nil {
logger.Error("Error occurred while trying to delete the user.", zap.Error(err), zap.String("user_id", userID.String()))
return err
}

if deleted {
// Logout and disconnect.
if err = SessionLogout(config, sessionCache, userID, "", ""); err != nil {
return err
}
for _, presence := range tracker.ListPresenceIDByStream(PresenceStream{Mode: StreamModeNotifications, Subject: userID}) {
if err = sessionRegistry.Disconnect(ctx, presence.SessionID); err != nil {
return err
}
}
}

return nil
}
2 changes: 1 addition & 1 deletion server/runtime_go_nakama.go
Original file line number Diff line number Diff line change
Expand Up @@ -538,7 +538,7 @@ func (n *RuntimeGoNakamaModule) AccountDeleteId(ctx context.Context, userID stri
return errors.New("expects user ID to be a valid identifier")
}

return DeleteAccount(ctx, n.logger, n.db, n.leaderboardRankCache, u, recorded)
return DeleteAccount(ctx, n.logger, n.db, n.config, n.leaderboardRankCache, n.sessionRegistry, n.sessionCache, n.tracker, u, recorded)
}

// @group accounts
Expand Down
2 changes: 1 addition & 1 deletion server/runtime_javascript_nakama.go
Original file line number Diff line number Diff line change
Expand Up @@ -1895,7 +1895,7 @@ func (n *runtimeJavascriptNakamaModule) accountDeleteId(r *goja.Runtime) func(go
recorded = getJsBool(r, f.Argument(1))
}

if err := DeleteAccount(n.ctx, n.logger, n.db, n.rankCache, userID, recorded); err != nil {
if err := DeleteAccount(n.ctx, n.logger, n.db, n.config, n.rankCache, n.sessionRegistry, n.sessionCache, n.tracker, userID, recorded); err != nil {
panic(r.NewGoError(fmt.Errorf("error while trying to delete account: %v", err.Error())))
}

Expand Down
2 changes: 1 addition & 1 deletion server/runtime_lua_nakama.go
Original file line number Diff line number Diff line change
Expand Up @@ -8979,7 +8979,7 @@ func (n *RuntimeLuaNakamaModule) accountDeleteId(l *lua.LState) int {

recorded := l.OptBool(2, false)

if err := DeleteAccount(l.Context(), n.logger, n.db, n.rankCache, userID, recorded); err != nil {
if err := DeleteAccount(l.Context(), n.logger, n.db, n.config, n.rankCache, n.sessionRegistry, n.sessionCache, n.tracker, userID, recorded); err != nil {
l.RaiseError("error while trying to delete account: %v", err.Error())
}

Expand Down

0 comments on commit 23b7ea7

Please sign in to comment.