Changeset 134


Ignore:
Timestamp:
Aug 27, 2014, 5:35:51 PM (10 years ago)
Author:
alloc
Message:

Fixes

Location:
binary-improvements
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • binary-improvements/7dtd-server-fixes/src/NetConnections/Servers/Web/PathHandler.cs

    r133 r134  
    66        public abstract class PathHandler
    77        {
    8                 public abstract void HandleRequest(HttpListenerRequest req, HttpListenerResponse resp);
     8                public abstract void HandleRequest(HttpListenerRequest req, HttpListenerResponse resp, HttpListenerBasicIdentity user);
    99        }
    1010}
  • binary-improvements/7dtd-server-fixes/src/NetConnections/Servers/Web/SimpleRedirectHandler.cs

    r133 r134  
    1313                }
    1414
    15                 public override void HandleRequest (HttpListenerRequest req, HttpListenerResponse resp)
     15                public override void HandleRequest (HttpListenerRequest req, HttpListenerResponse resp, HttpListenerBasicIdentity user)
    1616                {
    1717                        resp.Redirect (target);
  • binary-improvements/7dtd-server-fixes/src/NetConnections/Servers/Web/StaticHandler.cs

    r133 r134  
    33using System.IO;
    44using System.Net;
     5using System.Threading;
    56
    67namespace AllocsFixes.NetConnections.Servers.Web
     
    1112                private string staticPart;
    1213                private bool cache;
     14                private bool logMissingFiles;
    1315                private Dictionary<string, byte[]> fileCache = new Dictionary<string, byte[]> ();
    1416
    15                 public StaticHandler (string staticPart, string filePath, bool cache)
     17                public StaticHandler (string staticPart, string filePath, bool cache, bool logMissingFiles)
    1618                {
    1719                        this.staticPart = staticPart;
    1820                        this.datapath = filePath;
    1921                        this.cache = cache;
     22                        this.logMissingFiles = logMissingFiles;
    2023                }
    2124
    22                 public override void HandleRequest (HttpListenerRequest req, HttpListenerResponse resp)
     25                public override void HandleRequest (HttpListenerRequest req, HttpListenerResponse resp, HttpListenerBasicIdentity user)
    2326                {
    2427                        try {
     
    2730                                byte[] content;
    2831                                if (cache) {
    29                                         if (!fileCache.ContainsKey (fn)) {
    30                                                 if (!File.Exists (datapath + "/" + fn)) {
    31                                                         resp.StatusCode = (int)HttpStatusCode.NotFound;
    32                                                         return;
     32                                        Monitor.Enter (fileCache);
     33                                        try {
     34                                                if (!fileCache.ContainsKey (fn)) {
     35                                                        if (!File.Exists (datapath + "/" + fn)) {
     36                                                                resp.StatusCode = (int)HttpStatusCode.NotFound;
     37                                                                if (logMissingFiles)
     38                                                                        Log.Out ("Web:Static:FileNotFound: " + req.Url.AbsolutePath);
     39                                                                return;
     40                                                        }
     41
     42                                                        fileCache.Add (fn, File.ReadAllBytes (datapath + "/" + fn));
    3343                                                }
    3444
    35                                                 fileCache.Add (fn, File.ReadAllBytes (datapath + "/" + fn));
     45                                                content = fileCache [fn];
     46                                        } finally {
     47                                                Monitor.Exit (fileCache);
    3648                                        }
    37 
    38                                         content = fileCache [fn];
    3949                                } else {
    4050                                        if (!File.Exists (datapath + "/" + fn)) {
    4151                                                resp.StatusCode = (int)HttpStatusCode.NotFound;
     52                                                if (logMissingFiles)
     53                                                        Log.Out ("Web:Static:FileNotFound: " + req.Url.AbsolutePath);
    4254                                                return;
    4355                                        }
  • binary-improvements/7dtd-server-fixes/src/NetConnections/Servers/Web/Web.cs

    r133 r134  
    2020 
    2121                                handlers.Add ("/index.", new SimpleRedirectHandler ("/static/index.html"));
    22                                 handlers.Add ("/static/", new StaticHandler ("/static/", Application.dataPath + "/../webserver", true));
    23                                 handlers.Add ("/map/", new StaticHandler ("/map/", StaticDirectories.GetSaveGameDir () + "/map", false));
     22                                handlers.Add ("/static/", new StaticHandler ("/static/", Application.dataPath + "/../webserver", true, true));
     23                                handlers.Add ("/map/", new StaticHandler ("/map/", StaticDirectories.GetSaveGameDir () + "/map", false, false));
    2424
    2525                                _listener.Prefixes.Add (String.Format ("http://*:{0}/", port));
     26                                _listener.AuthenticationSchemes = AuthenticationSchemes.Basic;
    2627                                _listener.Start ();
    2728
     
    3233                                                        ThreadPool.QueueUserWorkItem ((c) =>
    3334                                                        {
    34                                                                 var ctx = c as HttpListenerContext;
    35                                                                 HandleRequest (ctx.Request, ctx.Response);
     35                                                                HttpListenerContext ctx = c as HttpListenerContext;
     36                                                                HandleRequest (ctx);
    3637                                                        }, _listener.GetContext ());
    3738                                                }
     
    4748                }
    4849
    49                 private void HandleRequest (HttpListenerRequest req, HttpListenerResponse resp)
     50                private void HandleRequest (HttpListenerContext ctx)
    5051                {
    5152                        try {
    52                                 resp.ProtocolVersion = new Version ("1.1");
     53                                ctx.Response.ProtocolVersion = new Version ("1.1");
    5354
    54                                 if (req.Url.AbsolutePath.Length < 2) {
    55                                         handlers ["/index."].HandleRequest (req, resp);
    56                                         return;
    57                                 } else {
    58                                         foreach (KeyValuePair<string, PathHandler> kvp in handlers) {
    59                                                 if (req.Url.AbsolutePath.StartsWith (kvp.Key)) {
    60                                                         kvp.Value.HandleRequest (req, resp);
    61                                                         return;
     55                                HttpListenerBasicIdentity user;
     56
     57                                if (Authorize (ctx, out user)) {
     58                                        if (ctx.Request.Url.AbsolutePath.Length < 2) {
     59                                                handlers ["/index."].HandleRequest (ctx.Request, ctx.Response, user);
     60                                                return;
     61                                        } else {
     62                                                foreach (KeyValuePair<string, PathHandler> kvp in handlers) {
     63                                                        if (ctx.Request.Url.AbsolutePath.StartsWith (kvp.Key)) {
     64                                                                kvp.Value.HandleRequest (ctx.Request, ctx.Response, user);
     65                                                                return;
     66                                                        }
    6267                                                }
    6368                                        }
     69
     70                                        Log.Out ("Error in Web.HandleRequest(): No handler found for path \"" + ctx.Request.Url.AbsolutePath + "\"");
     71                                        ctx.Response.StatusCode = (int)HttpStatusCode.NotFound;
     72                                } else {
     73                                        ctx.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
     74                                        ctx.Response.AddHeader("WWW-Authenticate", "Basic realm=\"\"");
    6475                                }
    65 
    66                                 Log.Out ("Error in Web.HandleRequest(): No handler found for path \"" + req.Url.AbsolutePath + "\"");
    67                                 resp.StatusCode = (int)HttpStatusCode.NotFound;
    6876
    6977//                              byte[] buf = Encoding.UTF8.GetBytes ("Hello World");
     
    7280//                              resp.ContentEncoding = Encoding.UTF8;
    7381//                              resp.OutputStream.Write (buf, 0, buf.Length);
    74                         } catch {
     82                        } catch (Exception e) {
     83                                Log.Out ("Error in Web.HandleRequest(): " + e);
    7584                        } finally {
    76                                 resp.Close ();
     85                                ctx.Response.Close ();
     86                        }
     87                }
     88
     89                private bool Authorize (HttpListenerContext ctx, out HttpListenerBasicIdentity user)
     90                {
     91                        try {
     92                                user = (HttpListenerBasicIdentity)ctx.User.Identity;
     93                                return user.Name.Equals ("admin") && user.Password.Equals (GamePrefs.GetString (EnumGamePrefs.ControlPanelPassword));
     94                        } catch (NullReferenceException) {
     95                                user = null;
     96                                return false;
    7797                        }
    7898                }
Note: See TracChangeset for help on using the changeset viewer.