Ignore:
Timestamp:
May 7, 2023, 5:05:29 PM (19 months ago)
Author:
alloc
Message:

Fixed: User registration allowed same username for multiple users

Location:
binary-improvements2/WebServer/src
Files:
3 added
2 edited
12 moved

Legend:

Unmodified
Added
Removed
  • binary-improvements2/WebServer/src/Permissions/AdminWebUsers.cs

    r404 r433  
    133133                }
    134134
    135                 public WebUser? GetUser (string _name, string _password) {
    136                         if (users.TryGetValue (_name, out WebUser user) && user.ValidatePassword (_password)) {
    137                                 return user;
     135                public bool TryGetUser (string _name, string _password, out WebUser _result) {
     136                        if (users.TryGetValue (_name, out _result) && _result.ValidatePassword (_password)) {
     137                                return true;
    138138                        }
    139139
    140                         return null;
     140                        _result = default;
     141                        return false;
    141142                }
    142143
     144                public bool HasUser (PlatformUserIdentifierAbs _platformUser, PlatformUserIdentifierAbs _crossPlatformUser, out WebUser _result) {
     145                        _result = default;
     146                       
     147                        foreach ((string _, WebUser webUser) in users) {
     148                                if (!PlatformUserIdentifierAbs.Equals (webUser.PlatformUser, _platformUser) ||
     149                                    !PlatformUserIdentifierAbs.Equals (webUser.CrossPlatformUser, _crossPlatformUser)) {
     150                                        continue;
     151                                }
    143152
    144 #region Specials
     153                                _result = webUser;
     154                                return true;
     155                        }
    145156
    146                
    147 #endregion
     157                        return false;
     158                }
     159
    148160        }
    149161}
  • binary-improvements2/WebServer/src/UrlHandlers/SessionHandler.cs

    r422 r433  
    9090                        }
    9191
    92                         AdminWebUsers.WebUser? webUser = AdminWebUsers.Instance.GetUser (username, password);
    93 
    94                         if (!webUser.HasValue) {
     92                        if (!AdminWebUsers.Instance.TryGetUser (username, password, out AdminWebUsers.WebUser webUser)) {
    9593                                Log.Out ($"[Web] User/pass login failed from {_remoteEndpointString}");
    9694                                WebUtils.WriteText (_context.Response, "UserPassInvalid", HttpStatusCode.Unauthorized);
     
    9896                        }
    9997
    100                         HandleUserIdLogin (connectionHandler, _context, _remoteEndpointString, userPassLoginName, userPassErrorPage, webUser.Value.Name, webUser.Value.PlatformUser, webUser.Value.CrossPlatformUser);
     98                        HandleUserIdLogin (connectionHandler, _context, _remoteEndpointString, userPassLoginName, userPassErrorPage, webUser.Name, webUser.PlatformUser, webUser.CrossPlatformUser);
    10199                }
    102100
  • binary-improvements2/WebServer/src/WebAPI/APIs/Permissions/RegisterUser.cs

    r432 r433  
    7979                                return;
    8080                        }
     81
     82                        if (AdminWebUsers.Instance.GetUsers ().TryGetValue (username, out AdminWebUsers.WebUser existingMapping)) {
     83                                // Username already exists
     84
     85                                if (!PlatformUserIdentifierAbs.Equals (existingMapping.PlatformUser, regData.PlatformUserId) ||
     86                                    !PlatformUserIdentifierAbs.Equals (existingMapping.CrossPlatformUser, regData.CrossPlatformUserId)) {
     87                                        // Username already in use by another player
     88                                        SendErrorResult (_context, HttpStatusCode.Unauthorized, _jsonInputData, "DUPLICATE_USERNAME");
     89                                        return;
     90                                }
     91                               
     92                                // Username used by the same player, allow overwriting his existing login
     93                        }
    8194                       
    82                         // TODO: Check if username is already used by someone else!
    83                         // TODO: Remove existing username if player already had one!
     95                        // Log info
     96                        string crossplatformidString = regData.CrossPlatformUserId == null ? "" : $", crossplatform ID {regData.CrossPlatformUserId.CombinedString}";
     97                        global::Log.Out ($"[Web] User registered: Username '{username}' for platform ID {regData.PlatformUserId.CombinedString}{crossplatformidString}");
    8498
     99                        if (AdminWebUsers.Instance.HasUser (regData.PlatformUserId, regData.CrossPlatformUserId, out AdminWebUsers.WebUser existingUser)) {
     100                                // Remove existing username of player, only allowing one user per player
     101
     102                                global::Log.Out ($"[Web] Re-registration, replacing existing username '{existingUser.Name}'");
     103                                AdminWebUsers.Instance.RemoveUser (existingUser.Name);
     104                        }
     105
     106                        // Add new user
    85107                        AdminWebUsers.Instance.AddUser (username, password, regData.PlatformUserId, regData.CrossPlatformUserId);
    86108                       
     109                        // Login with new user and return response
    87110                        string remoteEndpointString = _context.Request.RemoteEndPoint!.ToString ();
    88111                        SessionHandler.HandleUserIdLogin (ParentWeb.ConnectionHandler, _context, remoteEndpointString, SessionHandler.userPassLoginName,
     
    93116                        _context.Response.ContentEncoding = Encoding.UTF8;
    94117                        _context.Response.ContentLength64 = 0;
    95                         // _context.Response.OutputStream.Write (jsonData.Array!, 0, jsonData.Count);
    96118                }
    97119
Note: See TracChangeset for help on using the changeset viewer.