Changeset 394


Ignore:
Timestamp:
Aug 8, 2022, 8:07:44 PM (2 years ago)
Author:
alloc
Message:

SessionHandler cleanup + redirect to /app/error/:code
Some profiler usage cleanup

Location:
binary-improvements2/WebServer/src
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • binary-improvements2/WebServer/src/UrlHandlers/ApiHandler.cs

    r391 r394  
    4848                }
    4949
    50 #if ENABLE_PROFILER
    5150                private static readonly UnityEngine.Profiling.CustomSampler apiHandlerSampler = UnityEngine.Profiling.CustomSampler.Create ("API_Handler");
    52 #endif
    5351
    5452                public override void HandleRequest (RequestContext _context) {
     
    8381
    8482                        try {
    85 #if ENABLE_PROFILER
    8683                                apiHandlerSampler.Begin ();
    87 #endif
    8884                                api.HandleRequest (_context);
    89 #if ENABLE_PROFILER
    9085                                apiHandlerSampler.End ();
    91 #endif
    9286                        } catch (Exception e) {
    9387                                Log.Error ($"Error in {nameof(ApiHandler)}.HandleRequest(): Handler {api.Name} threw an exception:");
  • binary-improvements2/WebServer/src/UrlHandlers/SessionHandler.cs

    r391 r394  
    11using System;
    2 using System.IO;
    32using System.Net;
    4 using System.Text;
    53
    64namespace Webserver.UrlHandlers {
    75        public class SessionHandler : AbsHandler {
    8                 private const string pageBasePath = "/";
     6                private const string pageBasePath = "/app";
     7                private const string pageErrorPath = "/app/error/";
    98                private const string steamOpenIdVerifyUrl = "verifysteamopenid";
    109                private const string steamLoginUrl = "loginsteam";
    11                
    12                 private readonly string footer = "";
    13                 private readonly string header = "";
    1410
    1511                private readonly ConnectionHandler connectionHandler;
    1612
    17                 public SessionHandler (string _dataFolder, ConnectionHandler _connectionHandler) : base (null) {
     13                public SessionHandler (ConnectionHandler _connectionHandler) : base (null) {
    1814                        connectionHandler = _connectionHandler;
    19                        
    20                         if (File.Exists (_dataFolder + "/sessionheader.tmpl")) {
    21                                 header = File.ReadAllText (_dataFolder + "/sessionheader.tmpl");
    22                         }
    23 
    24                         if (File.Exists (_dataFolder + "/sessionfooter.tmpl")) {
    25                                 footer = File.ReadAllText (_dataFolder + "/sessionfooter.tmpl");
    26                         }
    2715                }
    2816
    2917                public override void HandleRequest (RequestContext _context) {
    30                        
    31                         IPEndPoint reqRemoteEndPoint = _context.Request.RemoteEndPoint;
    32                         if (reqRemoteEndPoint == null) {
    33                                 _context.Response.Redirect (pageBasePath);
     18                        if (_context.Request.RemoteEndPoint == null) {
     19                                _context.Response.Redirect (pageErrorPath + "NoRemoteEndpoint");
    3420                                return;
    3521                        }
     
    3723                        string subpath = _context.RequestPath.Remove (0, urlBasePath.Length);
    3824
    39                         StringBuilder result = new StringBuilder ();
    40                         result.Append (header);
     25                        if (subpath.StartsWith (steamOpenIdVerifyUrl)) {
     26                                HandleSteamVerification (_context);
     27                                return;
     28                        }
    4129
    42                         if (subpath.StartsWith (steamOpenIdVerifyUrl)) {
    43                                 string remoteEndpointString = reqRemoteEndPoint.ToString ();
     30                        if (subpath.StartsWith ("logout")) {
     31                                HandleLogout (_context);
     32                                return;
     33                        }
    4434
    45                                 try {
    46                                         ulong id = OpenID.Validate (_context.Request);
    47                                         if (id > 0) {
    48                                                 WebConnection con = connectionHandler.LogIn (id, reqRemoteEndPoint.Address);
    49                                                 int level = GameManager.Instance.adminTools.GetUserPermissionLevel (con.UserId);
    50                                                 Log.Out ("Steam OpenID login from {0} with ID {1}, permission level {2}",
    51                                                         remoteEndpointString, con.UserId, level);
    52                                                
    53                                                 Cookie cookie = new Cookie ("sid", con.SessionID, "/") {
    54                                                         Expired = false,
    55                                                         Expires = DateTime.MinValue,
    56                                                         HttpOnly = true,
    57                                                         Secure = false
    58                                                 };
    59                                                 _context.Response.AppendCookie (cookie);
    60                                                 _context.Response.Redirect (pageBasePath);
     35                        if (subpath.StartsWith (steamLoginUrl)) {
     36                                HandleSteamLogin (_context);
     37                                return;
     38                        }
    6139
    62                                                 return;
    63                                         }
    64                                 } catch (Exception e) {
    65                                         Log.Error ("Error validating login:");
    66                                         Log.Exception (e);
    67                                 }
     40                        _context.Response.Redirect (pageErrorPath + "InvalidSessionsCommand");
     41                }
    6842
    69                                 Log.Out ($"Steam OpenID login failed from {remoteEndpointString}");
    70                                 result.Append ($"<h1>Login failed, <a href=\"{pageBasePath}\">click to return to main page</a>.</h1>");
    71                         } else if (subpath.StartsWith ("logout")) {
    72                                 if (_context.Connection != null) {
    73                                         connectionHandler.LogOut (_context.Connection.SessionID);
    74                                         Cookie cookie = new Cookie ("sid", "", "/") {
    75                                                 Expired = true
     43                private void HandleSteamLogin (RequestContext _context) {
     44                        string host = (WebUtils.IsSslRedirected (_context.Request) ? "https://" : "http://") + _context.Request.UserHostName;
     45                        string url = OpenID.GetOpenIdLoginUrl (host, host + urlBasePath + steamOpenIdVerifyUrl);
     46                        _context.Response.Redirect (url);
     47                }
     48
     49                private void HandleLogout (RequestContext _context) {
     50                        Cookie cookie = new Cookie ("sid", "", "/") {
     51                                Expired = true
     52                        };
     53                        _context.Response.AppendCookie (cookie);
     54
     55                        if (_context.Connection == null) {
     56                                _context.Response.Redirect (pageErrorPath + "NotLoggedIn");
     57                                return;
     58                        }
     59
     60                        connectionHandler.LogOut (_context.Connection.SessionID);
     61                        _context.Response.Redirect (pageBasePath);
     62                }
     63
     64                private void HandleSteamVerification (RequestContext _context) {
     65                        string remoteEndpointString = _context.Request.RemoteEndPoint!.ToString ();
     66
     67                        try {
     68                                ulong id = OpenID.Validate (_context.Request);
     69                                if (id > 0) {
     70                                        WebConnection con = connectionHandler.LogIn (id, _context.Request.RemoteEndPoint.Address);
     71                                        int level = GameManager.Instance.adminTools.GetUserPermissionLevel (con.UserId);
     72                                        Log.Out ("Steam OpenID login from {0} with ID {1}, permission level {2}",
     73                                                remoteEndpointString, con.UserId, level);
     74
     75                                        Cookie cookie = new Cookie ("sid", con.SessionID, "/") {
     76                                                Expired = false,
     77                                                Expires = DateTime.MinValue,
     78                                                HttpOnly = true,
     79                                                Secure = false
    7680                                        };
    7781                                        _context.Response.AppendCookie (cookie);
    7882                                        _context.Response.Redirect (pageBasePath);
     83
    7984                                        return;
    8085                                }
    81 
    82                                 result.Append ($"<h1>Not logged in, <a href=\"{pageBasePath}\">click to return to main page</a>.</h1>");
    83                         } else if (subpath.StartsWith (steamLoginUrl)) {
    84                                 string host = (WebUtils.IsSslRedirected (_context.Request) ? "https://" : "http://") + _context.Request.UserHostName;
    85                                 string url = OpenID.GetOpenIdLoginUrl (host, host + urlBasePath + steamOpenIdVerifyUrl);
    86                                 _context.Response.Redirect (url);
    87                                 return;
    88                         } else {
    89                                 result.Append ($"<h1>Unknown command, <a href=\"{pageBasePath}\">click to return to main page</a>.</h1>");
     86                        } catch (Exception e) {
     87                                Log.Error ("Error validating login:");
     88                                Log.Exception (e);
    9089                        }
    9190
    92                         result.Append (footer);
     91                        Log.Out ($"Steam OpenID login failed from {remoteEndpointString}");
     92                        _context.Response.Redirect (pageErrorPath + "SteamLoginFailed");
     93                }
    9394
    94                         WebUtils.WriteText (_context.Response, result.ToString (), _mimeType: WebUtils.MimeHtml);
    95                 }
    9695        }
    9796}
  • binary-improvements2/WebServer/src/Web.cs

    r391 r394  
    6363                                RegisterWebMods (useStaticCache);
    6464
    65                                 RegisterPathHandler ("/session/", new SessionHandler (webfilesFolder, connectionHandler));
     65                                RegisterPathHandler ("/session/", new SessionHandler (connectionHandler));
    6666                                RegisterPathHandler ("/userstatus", new UserStatusHandler ());
    6767                                RegisterPathHandler ("/sse/", new SseHandler ());
     
    152152                }
    153153
    154 #if ENABLE_PROFILER
     154                private readonly UnityEngine.Profiling.CustomSampler getContextSampler = UnityEngine.Profiling.CustomSampler.Create ("GetCtx");
    155155                private readonly UnityEngine.Profiling.CustomSampler authSampler = UnityEngine.Profiling.CustomSampler.Create ("Auth");
     156                private readonly UnityEngine.Profiling.CustomSampler cookieSampler = UnityEngine.Profiling.CustomSampler.Create ("ConCookie");
    156157                private readonly UnityEngine.Profiling.CustomSampler handlerSampler = UnityEngine.Profiling.CustomSampler.Create ("Handler");
    157 #endif
    158158
    159159                private void HandleRequest (IAsyncResult _result) {
     
    165165#if ENABLE_PROFILER
    166166                        UnityEngine.Profiling.Profiler.BeginThreadProfiling ("AllocsMods", "WebRequest");
     167                        getContextSampler.Begin ();
    167168                        HttpListenerContext ctx = listenerInstance.EndGetContext (_result);
     169                        getContextSampler.End ();
    168170                        try {
    169171#else
     
    189191                                }
    190192
    191 #if ENABLE_PROFILER
    192193                                authSampler.Begin ();
    193 #endif
    194194                                int permissionLevel = DoAuthentication (request, out WebConnection conn);
    195 #if ENABLE_PROFILER
    196195                                authSampler.End ();
    197 #endif
    198196
    199197                                //Log.Out ("Login status: conn!=null: {0}, permissionlevel: {1}", conn != null, permissionLevel);
    200198
     199                                cookieSampler.Begin ();
    201200                                if (conn != null) {
    202201                                        Cookie cookie = new Cookie ("sid", conn.SessionID, "/") {
     
    208207                                        response.AppendCookie (cookie);
    209208                                }
     209                                cookieSampler.End ();
    210210
    211211                                string requestPath = request.Url.AbsolutePath;
     
    256256                                        }
    257257                                } else {
    258 #if ENABLE_PROFILER
    259258                                        handlerSampler.Begin ();
    260 #endif
    261259                                        handler.HandleRequest (_context);
    262 #if ENABLE_PROFILER
    263260                                        handlerSampler.End ();
    264 #endif
    265261                                }
    266262
     
    291287                        }
    292288
    293                         string remoteEndpointString = reqRemoteEndPoint.ToString ();
    294 
    295289                        if (_req.QueryString ["adminuser"] == null || _req.QueryString ["admintoken"] == null) {
    296290                                return guestPermissionLevel;
     
    303297                        }
    304298
    305                         Log.Warning ("Invalid Admintoken used from " + remoteEndpointString);
     299                        Log.Warning ("Invalid Admintoken used from " + reqRemoteEndPoint);
    306300
    307301                        return guestPermissionLevel;
  • binary-improvements2/WebServer/src/WebAPI/AbsRestApi.cs

    r391 r394  
    66namespace Webserver.WebAPI {
    77        public abstract class AbsRestApi : AbsWebAPI {
     8                private static readonly UnityEngine.Profiling.CustomSampler jsonDeserializeSampler = UnityEngine.Profiling.CustomSampler.Create ("JSON_Deserialize");
     9
    810                public sealed override void HandleRequest (RequestContext _context) {
    911                        JsonNode jsonBody = null;
     
    1416                                if (!string.IsNullOrEmpty (body)) {
    1517                                        try {
     18                                                jsonDeserializeSampler.Begin ();
    1619                                                jsonBody = Parser.Parse (body);
     20                                                jsonDeserializeSampler.End ();
    1721                                        } catch (Exception e) {
     22                                                jsonDeserializeSampler.End ();
     23
    1824                                                SendEnvelopedResult (_context, null, HttpStatusCode.BadRequest, null, "INVALID_BODY", e);
    1925                                                return;
  • binary-improvements2/WebServer/src/WebAPI/GetPlayerList.cs

    r391 r394  
    1313                        new Regex (@"^(>=|=>|>|<=|=<|<|==|=)?\s*([0-9]+(\.[0-9]*)?)$");
    1414
    15 #if ENABLE_PROFILER
    1615                private static readonly UnityEngine.Profiling.CustomSampler jsonSerializeSampler = UnityEngine.Profiling.CustomSampler.Create ("JSON_Build");
    17 #endif
    1816
    1917                public override void HandleRequest (RequestContext _context) {
     
    4240                        List<JsonObject> playerList = new List<JsonObject> ();
    4341
    44 #if ENABLE_PROFILER
    4542                        jsonSerializeSampler.Begin ();
    46 #endif
    4743
    4844                        foreach (KeyValuePair<PlatformUserIdentifierAbs, Player> kvp in playersList.Dict) {
     
    7672                        }
    7773
    78 #if ENABLE_PROFILER
    7974                        jsonSerializeSampler.End ();
    80 #endif
    8175
    8276                        IEnumerable<JsonObject> list = playerList;
  • binary-improvements2/WebServer/src/WebUtils.cs

    r391 r394  
    1212                public const string MimeJson = "application/json";
    1313               
    14 #if ENABLE_PROFILER
    1514                private static readonly UnityEngine.Profiling.CustomSampler jsonSerializeSampler = UnityEngine.Profiling.CustomSampler.Create ("JSON_Serialize");
    1615                private static readonly UnityEngine.Profiling.CustomSampler netWriteSampler = UnityEngine.Profiling.CustomSampler.Create ("JSON_Write");
    17 #endif
    1816
    1917                public static void WriteJson (HttpListenerResponse _resp, JsonNode _root, HttpStatusCode _statusCode = HttpStatusCode.OK) {
    20 #if ENABLE_PROFILER
    2118                        jsonSerializeSampler.Begin ();
    22 #endif
    2319                        StringBuilder sb = new StringBuilder ();
    2420                        _root.ToString (sb);
    25 #if ENABLE_PROFILER
    2621                        jsonSerializeSampler.End ();
    2722                        netWriteSampler.Begin ();
    28 #endif
    2923                        WriteText (_resp, sb.ToString(), _statusCode, MimeJson);
    30 #if ENABLE_PROFILER
    3124                        netWriteSampler.End ();
    32 #endif
    3325                }
    3426
Note: See TracChangeset for help on using the changeset viewer.