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
Files:
3 added
3 edited
12 moved

Legend:

Unmodified
Added
Removed
  • binary-improvements2/WebServer/WebServer.csproj

    r432 r433  
    120120    <Compile Include="src\WebAPI\AbsRestApi.cs" />
    121121    <Compile Include="src\WebAPI\AbsWebAPI.cs" />
    122     <Compile Include="src\WebAPI\APIs\Animal.cs" />
    123122    <Compile Include="src\WebAPI\APIs\Command.cs" />
    124     <Compile Include="src\WebAPI\APIs\GetLandClaims.cs" />
    125     <Compile Include="src\WebAPI\APIs\GetPlayerInventories.cs" />
    126     <Compile Include="src\WebAPI\APIs\GetPlayerInventory.cs" />
    127     <Compile Include="src\WebAPI\APIs\GetPlayerList.cs" />
    128     <Compile Include="src\WebAPI\APIs\GetPlayersLocation.cs" />
    129     <Compile Include="src\WebAPI\APIs\GetPlayersOnline.cs" />
    130     <Compile Include="src\WebAPI\APIs\Hostile.cs" />
    131     <Compile Include="src\WebAPI\APIs\Item.cs" />
     123    <Compile Include="src\WebAPI\APIs\GameData\Item.cs" />
     124    <Compile Include="src\WebAPI\APIs\GameData\Mods.cs" />
    132125    <Compile Include="src\WebAPI\APIs\Log.cs" />
    133     <Compile Include="src\WebAPI\APIs\Player.cs" />
    134     <Compile Include="src\WebAPI\APIs\RegisterUser.cs" />
     126    <Compile Include="src\WebAPI\APIs\Permissions\RegisterUser.cs" />
    135127    <Compile Include="src\WebAPI\APIs\ServerInfo.cs" />
    136128    <Compile Include="src\WebAPI\APIs\ServerStats.cs" />
    137     <Compile Include="src\WebAPI\APIs\Mods.cs" />
    138129    <Compile Include="src\WebAPI\APIs\WebUiUpdates.cs" />
     130    <Compile Include="src\WebAPI\APIs\WorldState\Animal.cs" />
     131    <Compile Include="src\WebAPI\APIs\WorldState\GetLandClaims.cs" />
     132    <Compile Include="src\WebAPI\APIs\WorldState\GetPlayerInventories.cs" />
     133    <Compile Include="src\WebAPI\APIs\WorldState\GetPlayerInventory.cs" />
     134    <Compile Include="src\WebAPI\APIs\WorldState\GetPlayerList.cs" />
     135    <Compile Include="src\WebAPI\APIs\WorldState\GetPlayersLocation.cs" />
     136    <Compile Include="src\WebAPI\APIs\WorldState\GetPlayersOnline.cs" />
     137    <Compile Include="src\WebAPI\APIs\WorldState\Hostile.cs" />
     138    <Compile Include="src\WebAPI\APIs\WorldState\Player.cs" />
    139139    <Compile Include="src\WebAPI\JsonCommons.cs" />
    140140    <Compile Include="src\WebAPI\Null.cs" />
  • 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.