Esempio n. 1
0
        public override void handleGETRequest(HttpProcessor p)
        {
            Settings.data.RemoveAppPath(p);

            if (mvcMain.ProcessRequest(p, p.requestedPage))
            {
            }
            else
            {
                #region www
                DirectoryInfo WWWDirectory     = new DirectoryInfo(Settings.data.GetWWWDirectoryBase());
                string        wwwDirectoryBase = WWWDirectory.FullName.Replace('\\', '/').TrimEnd('/') + '/';

                FileInfo fi             = new FileInfo(wwwDirectoryBase + p.requestedPage);
                string   targetFilePath = fi.FullName.Replace('\\', '/');
                if (!targetFilePath.StartsWith(wwwDirectoryBase) || targetFilePath.Contains("../"))
                {
                    p.writeFailure("400 Bad Request");
                    return;
                }
                if (!p.requestedPage.Equals("service-worker.js", StringComparison.OrdinalIgnoreCase))
                {
                    if (webpackProxy != null)
                    {
                        // Handle hot module reload provided by webpack dev server.
                        switch (fi.Extension.ToLower())
                        {
                        case ".js":
                        case ".map":
                        case ".css":
                        case ".json":
                            webpackProxy.Proxy(p);
                            return;
                        }
                    }
                }
                if (!fi.Exists ||
                    p.requestedPage.Equals("", StringComparison.OrdinalIgnoreCase) ||
                    p.requestedPage.Equals("default", StringComparison.OrdinalIgnoreCase) ||
                    p.requestedPage.Equals("default.html", StringComparison.OrdinalIgnoreCase))
                {
                    mvcMain.ProcessRequest(p, "Default");
                    return;
                }

                if (fi.LastWriteTimeUtc.ToString("R") == p.GetHeaderValue("if-modified-since"))
                {
                    p.writeSuccess(Mime.GetMimeType(fi.Extension), -1, "304 Not Modified");
                    return;
                }
                using (FileStream fs = fi.OpenRead())
                {
                    p.writeSuccess(Mime.GetMimeType(fi.Extension), fi.Length, additionalHeaders: GetCacheLastModifiedHeaders(TimeSpan.FromHours(1), fi.LastWriteTimeUtc));
                    p.outputStream.Flush();
                    fs.CopyTo(p.tcpStream);
                    p.tcpStream.Flush();
                }
                #endregion
            }
        }
Esempio n. 2
0
 /// <summary>
 /// Prepares the response.
 /// </summary>
 /// <param name="context">The context.</param>
 /// <param name="mode">The mode.</param>
 /// <param name="fileName">Name of the file.</param>
 /// <param name="lengthFile">The length file.</param>
 public static void PrepareResponse(this HttpContext context, SendMode mode, string fileName, long lengthFile)
 {
     PrepareResponse(
         context,
         mode,
         fileName,
         Mime.GetMimeType(fileName),
         lengthFile);
 }
        internal static void Main(string[] args)
        {
            //Using static method get mime Type From the Resources
            var name = Mime.GetMimeType("ami");

            Console.WriteLine("ami = " + name);

            IMime mimeType  = new Mime();
            var   mimeType1 = mimeType.Get("3dml");

            Console.WriteLine("3dml = " + mimeType1);

            var mimeType2 = mimeType["z3"];

            Console.WriteLine("z3 = " + mimeType2);
        }
Esempio n. 4
0
        private void InstallCollections(ModuleInstallRequest request)
        {
            const string collection       = "collections";
            var          collectionFilter = @"{name: /^content\/" + collection + "/, " + CommonConst.CommonField.MODULE_NAME + ": '" + request.Name + "', " + CommonConst.CommonField.VERSION + ": '" + request.Version + "'}";

            foreach (var item in _dbService.Get(CommonConst.Collection.MODULE_FILE_UPLOAD_CACHE, new RawQuery(collectionFilter)))
            {
                var fileSourceId   = item[CommonConst.CommonField.DISPLAY_ID].ToString();
                var fileName       = item[CommonConst.CommonField.NAME].ToString();
                var fileSize       = int.Parse(item[CommonConst.CommonField.FILE_SIZE].ToString());
                var contentType    = Mime.GetMimeType(fileName);
                var fileData       = JObjectHelper.GetJObjectDbDataFromFile(fileName, contentType, "content/wwwroot", request.Name, fileSize);
                var id             = fileData[CommonConst.CommonField.DISPLAY_ID].ToString();
                var collectionName = new FileInfo(fileName).Name.Replace(CommonConst.CONFIG_FILE_EXTENSION, "");
                var parent         = new FileInfo(fileName).Directory.Name;
                _logger.Debug($"InstallCollection File : {fileName}, Collection {collectionName}, Parent: { parent}");

                foreach (JObject joData in JObjectHelper.GetJArrayFromString(CommonUtility.GetStringFromBase64(_keyValueStorage.Get <string>(CommonConst.Collection.MODULE_FILE_UPLOAD_CACHE, fileSourceId))))
                {
                    try
                    {
                        joData[CommonConst.CommonField.DISPLAY_ID]             = CommonUtility.GetNewID();
                        joData[CommonConst.CommonField.CREATED_DATA_DATE_TIME] = DateTime.Now;
                        joData[CommonConst.CommonField.MODULE_NAME]            = request.Name;
                        joData[CommonConst.CommonField.VERSION]     = request.Version;
                        joData[CommonConst.CommonField.ÌS_OVERRIDE] = false;
                        joData[CommonConst.CommonField.OVERRIDE_BY] = CommonConst.CommonValue.NONE;
                        var url = GetUIAppUrl(parent);
                        if (string.IsNullOrEmpty(url))
                        {
                            WriteToDB(joData, request.Name, collectionName, CommonConst.CommonField.DATA_KEY);
                        }
                        else
                        {
                            _logger.Debug($"Callling remote /ui/installcollection Flile : {fileName}, Collection {collectionName}, Parent: { parent}, url {url}");
                            joData[CommonConst.CommonValue.COLLECTION] = collectionName;
                            _apiGateway.CallAsync(CommonConst.ActionMethods.POST, "/ui/installcollection", "", joData, null, url).GetAwaiter().GetResult();
                        }
                    }
                    catch (Exception ex)
                    {
                        _logger.Error($"Error InstallCollections collection:{joData}", ex);
                    }
                }
            }
        }
Esempio n. 5
0
        private void InstallWWWRoot(ModuleInstallRequest request)
        {
            var wwwrootFilter = @"{name: /^content\/wwwroot/, " + CommonConst.CommonField.MODULE_NAME + ": '" + request.Name + "', " + CommonConst.CommonField.VERSION + ": '" + request.Version + "'}";

            _dbService.OverrideData(new JObject()
            {
                [CommonConst.CommonField.MODULE_NAME] = request.Name
            }, request.Name, CommonConst.CommonField.MODULE_NAME, CommonConst.Collection.STATIC_CONTECT);

            foreach (var item in _dbService.Get(CommonConst.Collection.MODULE_FILE_UPLOAD_CACHE, new RawQuery(wwwrootFilter)))
            {
                var fileName = string.Empty;
                try
                {
                    var fileSourceId = item[CommonConst.CommonField.DISPLAY_ID].ToString();
                    fileName = item[CommonConst.CommonField.NAME].ToString();
                    var fileSize    = int.Parse(item[CommonConst.CommonField.FILE_SIZE].ToString());
                    var contentType = Mime.GetMimeType(fileName);
                    var fileData    = JObjectHelper.GetJObjectDbDataFromFile(fileName, contentType, "content/wwwroot", request.Name, fileSize);
                    fileData[CommonConst.CommonField.VERSION] = request.Version;
                    var id = fileData[CommonConst.CommonField.DISPLAY_ID].ToString();

                    var appUIFolder = GetAppFromUIFolder(fileData[CommonConst.CommonField.FILE_PATH].ToString());
                    if (!string.IsNullOrEmpty(appUIFolder))
                    {
                        fileData[CommonConst.CommonField.FILE_PATH] = fileData[CommonConst.CommonField.FILE_PATH].ToString().Replace($"/{appUIFolder}", "");
                    }
                    var appUIFolderUrl = GetUIAppUrl(appUIFolder);
                    if (string.IsNullOrEmpty(appUIFolderUrl))
                    {
                        WriteToDB(fileData, request.Name, CommonConst.Collection.STATIC_CONTECT, CommonConst.CommonField.FILE_PATH);
                        _keyValueStorage.Put <string>(CommonConst.Collection.STATIC_CONTECT, id, _keyValueStorage.Get <string>(CommonConst.Collection.MODULE_FILE_UPLOAD_CACHE, fileSourceId), null, request.Name);
                    }
                    else
                    {
                        fileData[CommonConst.CommonField.DATA] = _keyValueStorage.Get <string>(CommonConst.Collection.MODULE_FILE_UPLOAD_CACHE, fileSourceId);
                        _apiGateway.CallAsync(CommonConst.ActionMethods.POST, "/ui/installpage", "", fileData, null, appUIFolderUrl).GetAwaiter().GetResult();
                    }
                }
                catch (Exception ex)
                {
                    _logger.Error($"Error InstallWWWRoot file:{fileName}", ex);
                }
            }
        }
Esempio n. 6
0
        protected IWebFile ProvideFile(Uri fileUrl)
        {
            if (fileUrl.LocalPath == "/KnowledgeBase/Image.ashx")
            {
                var q = fileUrl.Query.Split(new char[] { '=' });
                if (q.Length < 2)
                {
                    return(null);
                }
                var fileID = Guid.Parse(q[1]);
                var file   = KbContext.CurrentKb.ManagerFileInclude.GetByID(fileID);
                var data   = KbContext.CurrentKb.ManagerFileInclude.GetData(fileID);

                return(new LoadedData(fileUrl, Mime.GetMimeType(file.FileName), data));
            }
            else
            {
                AppCore.Log.Warn("Intresting URL " + fileUrl);
                return(null);
            }
        }
Esempio n. 7
0
        private void InstallDlls(ModuleInstallRequest request)
        {
            var dllFilter = @"{name: /^lib\/netstandard2.0/, " + CommonConst.CommonField.MODULE_NAME + ": '" + request.Name + "', " + CommonConst.CommonField.VERSION + ": '" + request.Version + "'}";

            foreach (var item in _dbService.Get(CommonConst.Collection.MODULE_FILE_UPLOAD_CACHE, new RawQuery(dllFilter)))
            {
                var fileSourceId = item[CommonConst.CommonField.DISPLAY_ID].ToString();
                var fileName     = item[CommonConst.CommonField.NAME].ToString();
                var fileSize     = int.Parse(item[CommonConst.CommonField.FILE_SIZE].ToString());
                var contentType  = Mime.GetMimeType(fileName);
                var fileData     = JObjectHelper.GetJObjectDbDataFromFile(fileName, contentType, "lib/netstandard2.0/", request.Name, fileSize);
                fileData[CommonConst.CommonField.VERSION] = request.Version;
                var id       = fileData[CommonConst.CommonField.DISPLAY_ID].ToString();
                var data     = _keyValueStorage.Get <string>(CommonConst.Collection.MODULE_FILE_UPLOAD_CACHE, fileSourceId);
                var assembly = Assembly.Load(Convert.FromBase64String(data));
                fileData[CommonConst.CommonField.NAME] = assembly.FullName;
                WriteToDB(fileData, request.Name, CommonConst.Collection.DLLS, CommonConst.CommonField.FILE_PATH);
                InstallRoutes(request, assembly);
                _keyValueStorage.Put <string>(CommonConst.Collection.DLLS, id, data);
            }
        }
Esempio n. 8
0
        public override void handleGETRequest(HttpProcessor p)
        {
#if DEBUG
            DirectoryInfo WWWDirectory = new DirectoryInfo(Globals.WritableDirectoryBase + "../../www");
#else
            DirectoryInfo WWWDirectory = new DirectoryInfo(Globals.WritableDirectoryBase + "www");
#endif
            string   wwwDirectoryBase = WWWDirectory.FullName.Replace('\\', '/').TrimEnd('/') + '/';
            FileInfo fi             = new FileInfo(wwwDirectoryBase + p.requestedPage);
            string   targetFilePath = fi.FullName.Replace('\\', '/');
            if (!targetFilePath.StartsWith(wwwDirectoryBase) || targetFilePath.Contains("../"))
            {
                p.writeFailure("400 Bad Request");
                return;
            }
            if (!fi.Exists)
            {
                p.writeFailure();
                return;
            }
            string mime = Mime.GetMimeType(fi.Extension);
            if (p.requestedPage.StartsWith(".well-known/acme-challenge/"))
            {
                mime = "text/plain";
            }
            if (fi.LastWriteTimeUtc.ToString("R") == p.GetHeaderValue("if-modified-since"))
            {
                p.writeSuccess(mime, -1, "304 Not Modified");
                return;
            }
            p.writeSuccess(mime, fi.Length, additionalHeaders: GetCacheLastModifiedHeaders(TimeSpan.FromHours(1), fi.LastWriteTimeUtc));
            p.outputStream.Flush();
            using (FileStream fs = fi.OpenRead())
            {
                fs.CopyTo(p.rawOutputStream);
            }
            p.rawOutputStream.Flush();
        }
Esempio n. 9
0
        public override void handleGETRequest(HttpProcessor p)
        {
            BasicEventTimer bet = new BasicEventTimer();

            bet.Start("GET " + p.requestedPage);
            try
            {
                string pageLower = p.requestedPage.ToLower();
                if (pageLower == "json")
                {
                    p.writeFailure("405 Method Not Allowed", "json API requests must use the POST method");
                }
                else if (pageLower == "broadlinkcommands.json")
                {
                    if (File.Exists(ServiceWrapper.BroadLinkCommandsFile))
                    {
                        byte[] content = File.ReadAllBytes(ServiceWrapper.BroadLinkCommandsFile);
                        p.writeSuccess("application/json", content.Length);
                        p.outputStream.Flush();
                        p.tcpStream.Write(content, 0, content.Length);
                    }
                    else
                    {
                        p.writeFailure();
                    }
                }
                else if (pageLower == "itachcommands.json")
                {
                    if (File.Exists(ServiceWrapper.iTachCommandsFile))
                    {
                        byte[] content = File.ReadAllBytes(ServiceWrapper.iTachCommandsFile);
                        p.writeSuccess("application/json", content.Length);
                        p.outputStream.Flush();
                        p.tcpStream.Write(content, 0, content.Length);
                    }
                    else
                    {
                        p.writeFailure();
                    }
                }
                else if (pageLower == "downloadconfiguration")
                {
                    string filename = "HotkeyAutomationConfig_" + Environment.MachineName + "_" + DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".zip";
                    List <KeyValuePair <string, string> > additionalHeaders = new List <KeyValuePair <string, string> >();
                    additionalHeaders.Add(new KeyValuePair <string, string>("Content-Disposition", "attachment; filename=\"" + filename + "\""));
                    p.writeSuccess("application/zip", additionalHeaders: additionalHeaders);
                    p.outputStream.Flush();
                    ConfigurationIO.WriteToStream(p.tcpStream);
                }
                else
                {
                    #region www
                    DirectoryInfo WWWDirectory     = new DirectoryInfo(ServiceWrapper.config.GetWWWDirectoryBase());
                    string        wwwDirectoryBase = WWWDirectory.FullName.Replace('\\', '/').TrimEnd('/') + '/';

                    FileInfo fi = null;
                    if (p.requestedPage == "")
                    {
                        fi = GetDefaultFile(wwwDirectoryBase);
                    }
                    else
                    {
                        try
                        {
                            fi = new FileInfo(wwwDirectoryBase + p.requestedPage);
                        }
                        catch
                        {
                            fi = GetDefaultFile(wwwDirectoryBase);
                        }
                    }
                    string targetFilePath = fi.FullName.Replace('\\', '/');
                    if (!targetFilePath.StartsWith(wwwDirectoryBase) || targetFilePath.Contains("../"))
                    {
                        p.writeFailure("400 Bad Request");
                        return;
                    }
                    if (webpackProxy != null)
                    {
                        // Handle hot module reload provided by webpack dev server.
                        switch (fi.Extension.ToLower())
                        {
                        case ".js":
                        case ".map":
                        case ".css":
                        case ".json":
                            bet.Start("Proxy Start");
                            webpackProxy.Proxy(p);
                            bet.Start("Proxy End");
                            return;
                        }
                    }
                    if (!fi.Exists)
                    {
                        fi = GetDefaultFile(wwwDirectoryBase);
                        if (!fi.Exists)
                        {
                            p.writeFailure();
                            return;
                        }
                    }

                    if ((fi.Extension == ".html" || fi.Extension == ".htm") && fi.Length < 256000)
                    {
                        bet.Start("Write HTML");
                        string html = File.ReadAllText(fi.FullName);
                        try
                        {
                            html = html.Replace("%%SYSTEM_NAME%%", ServiceWrapper.config.systemName);
                            html = html.Replace("%%APP_VERSION%%", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString());
                            html = html.Replace("%%APPPATH%%", "/");
                        }
                        catch (Exception ex)
                        {
                            Logger.Debug(ex);
                        }
                        p.writeSuccess(Mime.GetMimeType(fi.Extension));
                        p.outputStream.Write(html);
                        p.outputStream.Flush();
                    }
                    else
                    {
                        bet.Start("Write Response");
                        if (fi.LastWriteTimeUtc.ToString("R") == p.GetHeaderValue("if-modified-since"))
                        {
                            p.writeSuccess(Mime.GetMimeType(fi.Extension), -1, "304 Not Modified");
                            return;
                        }
                        using (FileStream fs = fi.OpenRead())
                        {
                            p.writeSuccess(Mime.GetMimeType(fi.Extension), fi.Length, additionalHeaders: GetCacheLastModifiedHeaders(TimeSpan.FromHours(1), fi.LastWriteTimeUtc));
                            p.outputStream.Flush();
                            fs.CopyTo(p.tcpStream);
                            p.tcpStream.Flush();
                        }
                    }
                    #endregion
                }
            }
            finally
            {
                bet.Stop();
                //Logger.Info(bet.ToString("\r\n"));
            }
        }
Esempio n. 10
0
        public void MimeTypeTest1()
        {
            var name = Mime.GetMimeType("ami");

            Assert.AreEqual(name, "application/vnd.amiga.ami");
        }
Esempio n. 11
0
        public override void handleGETRequest(HttpProcessor p)
        {
            string pageLower = p.requestedPage.ToLower();

            //if (pageLower == "manualfix")
            //{
            //	if (IsAdmin(p))
            //	{
            //		p.writeSuccess("text/plain");
            //		try
            //		{
            //			Agent.RetroactiveFixData();
            //		}
            //		catch (Exception ex)
            //		{
            //			p.outputStream.WriteLine(ex.ToString());
            //		}
            //	}
            //	else
            //		p.writeFailure("403 Forbidden");
            //}
            if (pageLower.StartsWith("api/"))
            {
                p.writeFailure("405 Method Not Allowed");
            }
            else if (p.requestedPage == "IP")
            {
                p.writeSuccess("text/plain");
                p.outputStream.Write(p.RemoteIPAddressStr);
            }
            else if (p.requestedPage == "HEADERS")
            {
                p.writeSuccess("text/plain");
                p.outputStream.Write(string.Join(Environment.NewLine, p.httpHeadersRaw.Select(h => h.Key + ": " + h.Value)));
            }
            else if (p.requestedPage == "IP")
            {
                p.writeSuccess("text/plain");
                p.outputStream.Write(p.RemoteIPAddressStr);
            }
            else if (p.requestedPage == "")
            {
                p.writeRedirect("default.html");
            }
            else
            {
                string wwwPath = Globals.ApplicationDirectoryBase + "www/";
#if DEBUG
                if (System.Diagnostics.Debugger.IsAttached)
                {
                    wwwPath = Globals.ApplicationDirectoryBase + "../../../www/";
                }
#endif
                DirectoryInfo WWWDirectory     = new DirectoryInfo(wwwPath);
                string        wwwDirectoryBase = WWWDirectory.FullName.Replace('\\', '/').TrimEnd('/') + '/';
                FileInfo      fi             = new FileInfo(wwwDirectoryBase + p.requestedPage);
                string        targetFilePath = fi.FullName.Replace('\\', '/');
                if (!targetFilePath.StartsWith(wwwDirectoryBase) || targetFilePath.Contains("../"))
                {
                    p.writeFailure("400 Bad Request");
                    return;
                }
                if (!fi.Exists)
                {
                    return;
                }
                if ((fi.Extension == ".html" || fi.Extension == ".htm") && fi.Length < 256000)
                {
                    string html = File.ReadAllText(fi.FullName);
                    html = html.Replace("%%VERSION%%", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString());
                    html = html.Replace("%%RND%%", rnd.ToString());
                    html = html.Replace("%%ADMIN%%", IsAdmin(p) ? "true" : "false");

                    byte[] data = Encoding.UTF8.GetBytes(html);
                    p.writeSuccess(Mime.GetMimeType(fi.Extension), data.Length);
                    p.outputStream.Flush();
                    p.tcpStream.Write(data, 0, data.Length);
                    p.tcpStream.Flush();
                }
                else
                {
                    string mime = Mime.GetMimeType(fi.Extension);
                    if (pageLower.StartsWith(".well-known/acme-challenge/"))
                    {
                        mime = "text/plain";
                    }
                    if (fi.LastWriteTimeUtc.ToString("R") == p.GetHeaderValue("if-modified-since"))
                    {
                        p.writeSuccess(mime, -1, "304 Not Modified");
                        return;
                    }
                    p.writeSuccess(mime, fi.Length, additionalHeaders: GetCacheLastModifiedHeaders(TimeSpan.FromHours(1), fi.LastWriteTimeUtc));
                    p.outputStream.Flush();
                    using (FileStream fs = fi.OpenRead())
                    {
                        fs.CopyTo(p.tcpStream);
                    }
                    p.tcpStream.Flush();
                }
            }
        }
Esempio n. 12
0
 /// <summary>
 /// Initializes a new instance of the <see cref="LoadedData"/> class.
 /// </summary>
 /// <param name="url">The URL.</param>
 /// <param name="bytes">The bytes.</param>
 public LoadedData(Uri url, byte[] bytes)
 {
     _contentType = Mime.GetMimeType(Path.GetFileName(url.LocalPath));
     _bytes       = bytes;
     _url         = url;
 }
Esempio n. 13
0
        public override void handleGETRequest(HttpProcessor p)
        {
            try
            {
                string requestedPage = Uri.UnescapeDataString(p.request_url.AbsolutePath.TrimStart('/'));

                if (requestedPage == "admin")
                {
                    p.writeRedirect("admin/main");
                    return;
                }

                if (requestedPage == "login")
                {
                    LogOutUser(p, null);
                    return;
                }

                Session s = sm.GetSession(p.requestCookies.GetValue("cps"), p.requestCookies.GetValue("auth"), p.GetParam("rawauth"));
                if (s.sid != null && s.sid.Length == 16)
                {
                    p.responseCookies.Add("cps", s.sid, TimeSpan.FromMinutes(s.sessionLengthMinutes));
                }

                if (requestedPage == "logout")
                {
                    LogOutUser(p, s);
                    return;
                }


                if (requestedPage.StartsWith("admin/"))
                {
                    string adminPage = requestedPage == "admin" ? "" : requestedPage.Substring("admin/".Length);
                    if (string.IsNullOrWhiteSpace(adminPage))
                    {
                        adminPage = "main";
                    }
                    int idxQueryStringStart = adminPage.IndexOf('?');
                    if (idxQueryStringStart == -1)
                    {
                        idxQueryStringStart = adminPage.Length;
                    }
                    adminPage = adminPage.Substring(0, idxQueryStringStart);
                    Pages.Admin.AdminPage.HandleRequest(adminPage, p, s);
                    return;
                }
                else if (requestedPage.StartsWith("image/"))
                {
                    requestedPage = requestedPage.Substring("image/".Length);
                    #region image/
                    if (requestedPage.EndsWith(".jpg") || requestedPage.EndsWith(".jpeg") || requestedPage.EndsWith(".png") || requestedPage.EndsWith(".webp"))
                    {
                        int    extensionLength = requestedPage[requestedPage.Length - 4] == '.' ? 4 : 5;
                        string format          = requestedPage.Substring(requestedPage.Length - (extensionLength - 1));
                        string cameraId        = requestedPage.Substring(0, requestedPage.Length - extensionLength);
                        cameraId = cameraId.ToLower();

                        int minPermission = cm.GetCameraMinPermission(cameraId);
                        if (minPermission == 101)
                        {
                            p.writeFailure();
                            return;
                        }
                        if ((s == null && minPermission > 0) || (s != null && s.permission < minPermission))
                        {
                            LogOutUser(p, s);
                            return;
                        }
                        int          wait        = p.GetIntParam("wait", 5000);
                        IPCameraBase cam         = cm.GetCamera(cameraId);
                        byte[]       latestImage = cm.GetLatestImage(cameraId, wait);
                        int          patience    = p.GetIntParam("patience");
                        if (patience > 0)
                        {
                            if (patience > 5000)
                            {
                                patience = 5000;
                            }

                            int timeLeft = patience;
                            System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
                            timer.Start();
                            while (s.DuplicateImageSendCheck(cameraId, latestImage) && cam != null && timeLeft > 0)
                            {
                                // The latest image was already sent to the user in a previous image request.
                                // Wait for up to 5 seconds as desired by the user to get a "new" image.
                                cam.newFrameWaitHandle.WaitOne(Math.Max(50, timeLeft));                                  // This EventWaitHandle nonsense isn't perfect, so this should prevent excessively long delays in the event of a timing error.
                                latestImage = cm.GetLatestImage(cameraId);
                                timeLeft    = patience - (int)timer.ElapsedMilliseconds;
                            }
                        }
                        if (latestImage.Length == 0)
                        {
                            p.writeFailure("502 Bad Gateway");
                            return;
                        }
                        ImageFormat imgFormat = ImageFormat.Jpeg;
                        latestImage = ImageConverter.HandleRequestedConversionIfAny(latestImage, p, ref imgFormat, format);
                        p.tcpClient.SendBufferSize = latestImage.Length + 256;
                        p.writeSuccess(Util.GetMime(imgFormat), latestImage.Length);
                        p.outputStream.Flush();
                        p.rawOutputStream.Write(latestImage, 0, latestImage.Length);
                    }
                    else if (requestedPage.EndsWith(".mjpg"))
                    {
                        string cameraId = requestedPage.Substring(0, requestedPage.Length - 5);
                        cameraId = cameraId.ToLower();
                        int minPermission = cm.GetCameraMinPermission(cameraId);
                        if (minPermission == 101)
                        {
                            p.writeFailure();
                            return;
                        }
                        if ((s == null && minPermission > 0) || (s != null && s.permission < minPermission))
                        {
                            LogOutUser(p, s);
                            return;
                        }
                        if (cm.GetLatestImage(cameraId).Length == 0)
                        {
                            return;
                        }
                        // Increasing the send buffer size here does not help streaming fluidity.
                        p.writeSuccess("multipart/x-mixed-replace;boundary=ipcamera");
                        byte[] newImage;
                        byte[] lastImage = null;
                        while (!this.stopRequested)
                        {
                            try
                            {
                                newImage = cm.GetLatestImage(cameraId);
                                while (newImage == lastImage)
                                {
                                    Thread.Sleep(1);
                                    newImage = cm.GetLatestImage(cameraId);
                                    if (this.stopRequested)
                                    {
                                        return;
                                    }
                                }
                                lastImage = newImage;

                                ImageFormat imgFormat = ImageFormat.Jpeg;
                                byte[]      sendImage = ImageConverter.HandleRequestedConversionIfAny(newImage, p, ref imgFormat);

                                p.outputStream.WriteLine("--ipcamera");
                                p.outputStream.WriteLine("Content-Type: " + Util.GetMime(imgFormat));
                                p.outputStream.WriteLine("Content-Length: " + sendImage.Length);
                                p.outputStream.WriteLine();
                                p.outputStream.Flush();
                                p.rawOutputStream.Write(sendImage, 0, sendImage.Length);
                                p.rawOutputStream.Flush();
                                p.outputStream.WriteLine();
                            }
                            catch (Exception ex)
                            {
                                if (!p.isOrdinaryDisconnectException(ex))
                                {
                                    Logger.Debug(ex);
                                }
                                break;
                            }
                        }
                    }
                    else if (requestedPage.EndsWith(".ogg"))
                    {
                        string cameraId = requestedPage.Substring(0, requestedPage.Length - 4);
                        cameraId = cameraId.ToLower();
                        int minPermission = cm.GetCameraMinPermission(cameraId);
                        if (minPermission == 101)
                        {
                            p.writeFailure();
                            return;
                        }
                        if ((s == null && minPermission > 0) || (s != null && s.permission < minPermission))
                        {
                            LogOutUser(p, s);
                            return;
                        }
                        IPCameraBase _cam = cm.GetCamera(cameraId);
                        if (_cam is Html5VideoCamera)
                        {
                            Html5VideoCamera         cam            = (Html5VideoCamera)_cam;
                            ConcurrentQueue <byte[]> myDataListener = new ConcurrentQueue <byte[]>();
                            try
                            {
                                cam.RegisterStreamListener(myDataListener);
                                p.writeSuccess("application/octet-stream");
                                p.outputStream.Flush();
                                byte[] outputBuffer;
                                int    chunkCount = 0;
                                while (!this.stopRequested)
                                {
                                    try
                                    {
                                        chunkCount = myDataListener.Count;
                                        if (chunkCount > 100)
                                        {
                                            return;                                             // This connection is falling too far behind.  End it.
                                        }
                                        else if (chunkCount > 0)
                                        {
                                            Console.Write(chunkCount + " ");
                                            if (myDataListener.TryDequeue(out outputBuffer))
                                            {
                                                p.rawOutputStream.Write(outputBuffer, 0, outputBuffer.Length);
                                                p.rawOutputStream.Flush();
                                            }
                                        }
                                        else
                                        {
                                            Thread.Sleep(1);
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        if (!p.isOrdinaryDisconnectException(ex))
                                        {
                                            Logger.Debug(ex);
                                        }
                                        break;
                                    }
                                }
                            }
                            finally
                            {
                                cam.UnregisterStreamListener(myDataListener);
                            }
                        }
                        else
                        {
                            p.writeFailure("501 Not Implemented");
                        }
                    }
                    else if (requestedPage.EndsWith(".cam"))
                    {
                        string cameraId = requestedPage.Substring(0, requestedPage.Length - 4);
                        cameraId = cameraId.ToLower();
                        int minPermission = cm.GetCameraMinPermission(cameraId);
                        if (minPermission == 101)
                        {
                            p.writeFailure();
                            return;
                        }
                        if ((s == null && minPermission > 0) || (s != null && s.permission < minPermission))
                        {
                            LogOutUser(p, s);
                            return;
                        }
                        IPCameraBase cam = cm.GetCamera(cameraId);
                        if (cam != null && cam.cameraSpec.ptzType == MJpegCameraProxy.Configuration.PtzType.Dahua || cam.cameraSpec.ptzType == MJpegCameraProxy.Configuration.PtzType.Hikvision)
                        {
                            p.writeRedirect("../Camera.html?cam=" + cameraId);
                            return;
                        }

                        string userAgent = p.GetHeaderValue("User-Agent", "");
                        bool   isMobile  = userAgent.Contains("iPad") || userAgent.Contains("iPhone") || userAgent.Contains("Android") || userAgent.Contains("BlackBerry");

                        bool   isLanConnection = p == null ? false : p.IsLanConnection;
                        int    defaultRefresh  = isLanConnection && !isMobile ? -1 : 250;
                        string html            = CamPage.GetHtml(cameraId, !isMobile, p.GetIntParam("refresh", defaultRefresh), p.GetBoolParam("override") ? -1 : 600000, p);
                        if (string.IsNullOrEmpty(html) || html == "NO")
                        {
                            p.writeFailure();
                            return;
                        }
                        p.writeSuccess("text/html");
                        p.outputStream.Write(html);
                    }
                    else if (requestedPage == "PTZPRESETIMG")
                    {
                        string cameraId = p.GetParam("id");
                        cameraId = cameraId.ToLower();
                        IPCameraBase cam = cm.GetCamera(cameraId);
                        if (cam != null)
                        {
                            int index = p.GetIntParam("index", -1);
                            if (index > -1)
                            {
                                if (cam.cameraSpec.ptz_proxy)
                                {
                                    string auth = (!string.IsNullOrEmpty(cam.cameraSpec.ptz_username) && !string.IsNullOrEmpty(cam.cameraSpec.ptz_password)) ? "rawauth=" + HttpUtility.UrlEncode(cam.cameraSpec.ptz_username) + ":" + HttpUtility.UrlEncode(cam.cameraSpec.ptz_password) + "&" : "";
                                    byte[] data = SimpleProxy.GetData("http://" + cam.cameraSpec.ptz_hostName + "/PTZPRESETIMG?" + auth + "id=" + HttpUtility.UrlEncode(cam.cameraSpec.ptz_proxy_cameraId) + "&index=" + index);
                                    if (data.Length > 0)
                                    {
                                        p.writeSuccess("image/jpg", data.Length);
                                        p.outputStream.Flush();
                                        p.rawOutputStream.Write(data, 0, data.Length);
                                        return;
                                    }
                                }
                                else
                                {
                                    string fileName      = Globals.ThumbsDirectoryBase + cameraId + index + ".jpg";
                                    int    minPermission = cm.GetCameraMinPermission(cameraId);
                                    if ((s == null && minPermission > 0) || (s != null && s.permission < minPermission) || minPermission == 101)
                                    {
                                    }
                                    else
                                    {
                                        if (File.Exists(fileName))
                                        {
                                            byte[] bytes = File.ReadAllBytes(fileName);
                                            p.writeSuccess("image/jpg", bytes.Length);
                                            p.outputStream.Flush();
                                            p.rawOutputStream.Write(bytes, 0, bytes.Length);
                                            return;
                                        }
                                    }
                                }
                            }
                        }
                        {                         // Failed to get image thumbnail
                            byte[] bytes = File.ReadAllBytes(Globals.WWWPublicDirectoryBase + "Images/qmark.png");
                            p.writeSuccess("image/png", bytes.Length);
                            p.outputStream.Flush();
                            p.rawOutputStream.Write(bytes, 0, bytes.Length);
                            return;
                        }
                    }
                    else if (requestedPage.EndsWith(".wanscamstream"))
                    {
                        string       cameraId = requestedPage.Substring(0, requestedPage.Length - ".wanscamstream".Length);
                        IPCameraBase cam      = cm.GetCamera(cameraId);
                        if (cam == null)
                        {
                            return;
                        }
                        if (!cam.cameraSpec.wanscamCompatibilityMode)
                        {
                            return;
                        }
                        if (p.RemoteIPAddress != "127.0.0.1")
                        {
                            return;
                        }
                        Uri    url  = new Uri(cam.cameraSpec.imageryUrl);
                        string host = url.Host;
                        int    port = url.Port;
                        string path = url.PathAndQuery;
                        //string path = "/livestream.cgi?user=admin&pwd=nooilwell&streamid=0&audio=0&filename=";
                        //string path = "/videostream.cgi?user=admin&pwd=nooilwell&resolution=8";
                        int total = 0;
                        try
                        {
                            //Console.WriteLine("opening");
                            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                            socket.Connect(host, port);
                            byte[] buffer = new byte[4096];
                            socket.Send(UTF8Encoding.UTF8.GetBytes("GET " + path + " HTTP/1.1\r\nHost: " + host + ":" + port + "\r\nConnection: close\r\n\r\n"));
                            //Console.WriteLine("open");
                            int read = socket.Receive(buffer);
                            p.writeSuccess("video/raw");
                            p.outputStream.Flush();
                            while (read > 0 && socket.Connected && p.tcpClient.Connected)
                            {
                                p.rawOutputStream.Write(buffer, 0, read);
                                total += read;
                                //Console.WriteLine(read);
                                read = socket.Receive(buffer);
                            }
                            //Console.WriteLine("close");
                        }
                        catch (Exception ex)
                        {
                            if (!p.isOrdinaryDisconnectException(ex))
                            {
                                Logger.Debug(ex);
                            }
                        }
                    }
                    #endregion
                }
                else if (requestedPage.StartsWith("control/"))
                {
                    requestedPage = requestedPage.Substring("control/".Length);
                    #region control/
                    if (requestedPage == "keepalive")
                    {
                        string cameraId = p.GetParam("id");
                        cameraId = cameraId.ToLower();
                        int minPermission = cm.GetCameraMinPermission(cameraId);
                        if (minPermission == 101)
                        {
                            p.writeFailure();
                            return;
                        }
                        if ((s == null && minPermission > 0) || (s != null && s.permission < minPermission))
                        {
                            p.writeFailure("403 Forbidden");
                            return;
                        }
                        cm.GetRTSPUrl(cameraId, p);
                        p.writeSuccess("text/plain");
                        p.outputStream.Write("1");
                    }

                    else if (requestedPage == "PTZ")
                    {
                        string cameraId = p.GetParam("id");
                        cameraId = cameraId.ToLower();
                        int minPermission = cm.GetCameraMinPermission(cameraId);
                        if (minPermission == 101)
                        {
                            p.writeFailure();
                            return;
                        }
                        if ((s == null && minPermission > 0) || (s != null && s.permission < minPermission))
                        {
                            LogOutUser(p, s);
                            return;
                        }
                        PTZ.RunCommand(cameraId, p.GetParam("cmd"));
                        p.writeSuccess("text/plain");
                    }
                    #endregion
                }
                else
                {
                    #region www
                    int permissionRequired;
                    if (!Util.TryGetValue(requestedPage.ToLower(), MJpegWrapper.cfg.GetWwwFilesList(), out permissionRequired))
                    {
                        permissionRequired = -1;
                    }


                    string wwwDirectory = permissionRequired == -1 ? Globals.WWWPublicDirectoryBase : Globals.WWWDirectoryBase;

                    if (permissionRequired < 0)
                    {
                        permissionRequired = 0;
                    }
                    else if (permissionRequired > 100)
                    {
                        permissionRequired = 100;
                    }

                    if (permissionRequired > s.permission)
                    {
                        LogOutUser(p, s);
                        return;
                    }

                    DirectoryInfo WWWDirectory     = new DirectoryInfo(wwwDirectory);
                    string        wwwDirectoryBase = WWWDirectory.FullName.Replace('\\', '/').TrimEnd('/') + '/';
                    FileInfo      fi             = new FileInfo(wwwDirectoryBase + requestedPage);
                    string        targetFilePath = fi.FullName.Replace('\\', '/');
                    if (!targetFilePath.StartsWith(wwwDirectoryBase) || targetFilePath.Contains("../"))
                    {
                        p.writeFailure("400 Bad Request");
                        return;
                    }
                    if (!fi.Exists)
                    {
                        p.writeFailure();
                        return;
                    }

                    // && (fi.Extension == ".html" || fi.Extension == ".htm")
                    if (fi.Name.ToLower() == "camera.html" && fi.Length < 256000)
                    {
                        p.writeSuccess(Mime.GetMimeType(fi.Extension));
                        string   html = File.ReadAllText(fi.FullName);
                        CamPage2 cp   = new CamPage2(html, p);
                        html = cp.Html;
                        html = html.Replace("%ALLCAMS%", string.Join(",", MJpegServer.cm.GenerateAllCameraIdList()));
                        html = html.Replace("%ALLCAMS_IDS_NAMES_JS_ARRAY%", MJpegServer.cm.GenerateAllCameraIdNameList(s == null ? 0 : s.permission));
                        try
                        {
                            html = html.Replace("%REMOTEIP%", p.RemoteIPAddress);
                        }
                        catch (Exception ex)
                        {
                            Logger.Debug(ex);
                        }
                        p.outputStream.Write(html);
                        p.outputStream.Flush();
                    }
                    else if ((fi.Extension == ".html" || fi.Extension == ".htm") && fi.Length < 256000)
                    {
                        p.writeSuccess(Mime.GetMimeType(fi.Extension));
                        string html = File.ReadAllText(fi.FullName);
                        html = html.Replace("%ALLCAMS%", string.Join(",", MJpegServer.cm.GenerateAllCameraIdList()));
                        html = html.Replace("%ALLCAMS_IDS_NAMES_JS_ARRAY%", MJpegServer.cm.GenerateAllCameraIdNameList(s == null ? 0 : s.permission));
                        try
                        {
                            html = html.Replace("%REMOTEIP%", p.RemoteIPAddress);
                        }
                        catch (Exception ex)
                        {
                            Logger.Debug(ex);
                        }
                        p.outputStream.Write(html);
                        p.outputStream.Flush();
                    }
                    else
                    {
                        List <KeyValuePair <string, string> > additionalHeaders = new List <KeyValuePair <string, string> >();
                        additionalHeaders.Add(new KeyValuePair <string, string>("Cache-Control", "max-age=3600, public"));
                        p.writeSuccess(Mime.GetMimeType(fi.Extension), additionalHeaders: additionalHeaders);
                        p.outputStream.Flush();
                        using (FileStream fs = fi.OpenRead())
                        {
                            fs.CopyTo(p.rawOutputStream);
                        }
                        p.rawOutputStream.Flush();
                    }
                    #endregion
                }
            }
            catch (Exception ex)
            {
                if (!p.isOrdinaryDisconnectException(ex))
                {
                    Logger.Debug(ex);
                }
            }
        }
Esempio n. 14
0
        public override void handleGETRequest(HttpProcessor p)
        {
            BasicEventTimer bet = new BasicEventTimer();

            bet.Start("GET " + p.requestedPage);
            try
            {
                p.tcpClient.NoDelay = true;
                string pageLower = p.requestedPage.ToLower();
                if (pageLower == "json")
                {
                    p.writeFailure("405 Method Not Allowed", "json API requests must use the POST method");
                }
                else if (p.requestedPage.StartsWith("WebSocketClientProxy/"))
                {
                    WebSocketProxy.HandleWebSocketClientProxyRequest(p);
                }
                else if (p.requestedPage.StartsWith("WebSocketHostProxy/"))
                {
                    WebSocketProxy.HandleWebSocketHostProxyResponse(p);
                }
                //else if (p.requestedPage == "windowskeycodes")
                //{
                //	p.writeSuccess();
                //	p.outputStream.Write("<table><thead><tr><th>KeyCode</th><th>Name</th></tr></thead><tbody>");
                //	HashSet<int> addedKeyCodes = new HashSet<int>();
                //	foreach (int keyCode in ((IEnumerable<int>)Enum.GetValues(typeof(System.Windows.Forms.Keys))))
                //	{
                //		p.outputStream.Write("<tr><td>" + keyCode + "</td><td>" + (System.Windows.Forms.Keys)keyCode + "</td></tr>");
                //	}
                //	p.outputStream.Write("</tbody></table>");
                //}
                else
                {
                    #region www
                    DirectoryInfo WWWDirectory     = new DirectoryInfo(ServiceWrapper.settings.GetWWWDirectoryBase());
                    string        wwwDirectoryBase = WWWDirectory.FullName.Replace('\\', '/').TrimEnd('/') + '/';

                    FileInfo fi = null;
                    if (p.requestedPage == "")
                    {
                        fi = GetDefaultFile(wwwDirectoryBase);
                    }
                    else
                    {
                        try
                        {
                            fi = new FileInfo(wwwDirectoryBase + p.requestedPage);
                        }
                        catch
                        {
                            fi = GetDefaultFile(wwwDirectoryBase);
                        }
                    }
                    string targetFilePath = fi.FullName.Replace('\\', '/');
                    if (!targetFilePath.StartsWith(wwwDirectoryBase) || targetFilePath.Contains("../"))
                    {
                        p.writeFailure("400 Bad Request");
                        return;
                    }
                    if (webpackProxy != null)
                    {
                        // Handle hot module reload provided by webpack dev server.
                        switch (fi.Extension.ToLower())
                        {
                        case ".js":
                        case ".map":
                        case ".css":
                        case ".json":
                            bet.Start("Proxy Start");
                            webpackProxy.Proxy(p);
                            bet.Start("Proxy End");
                            return;
                        }
                    }
                    if (!fi.Exists)
                    {
                        fi = GetDefaultFile(wwwDirectoryBase);
                        if (!fi.Exists)
                        {
                            p.writeFailure();
                            return;
                        }
                    }

                    if ((fi.Extension == ".html" || fi.Extension == ".htm") && fi.Length < 256000)
                    {
                        bet.Start("Write HTML");
                        string html = File.ReadAllText(fi.FullName);
                        try
                        {
                            //html = html.Replace("%%REMOTEIP%%", p.RemoteIPAddressStr);
                            html = html.Replace("%%SYSTEM_NAME%%", "SHRD");
                            html = html.Replace("%%APP_VERSION%%", AppVersion.VersionNumber);
                            html = html.Replace("%%APPPATH%%", "/");
                        }
                        catch (Exception ex)
                        {
                            Logger.Debug(ex);
                        }
                        p.writeSuccess(Mime.GetMimeType(fi.Extension));
                        p.outputStream.Write(html);
                        p.outputStream.Flush();
                    }
                    else
                    {
                        bet.Start("Write Response");
                        if (fi.LastWriteTimeUtc.ToString("R") == p.GetHeaderValue("if-modified-since"))
                        {
                            p.writeSuccess(Mime.GetMimeType(fi.Extension), -1, "304 Not Modified");
                            return;
                        }
                        using (FileStream fs = fi.OpenRead())
                        {
                            p.writeSuccess(Mime.GetMimeType(fi.Extension), fi.Length, additionalHeaders: GetCacheLastModifiedHeaders(TimeSpan.FromHours(1), fi.LastWriteTimeUtc));
                            p.outputStream.Flush();
                            fs.CopyTo(p.tcpStream);
                            p.tcpStream.Flush();
                        }
                    }
                    #endregion
                }
            }
            finally
            {
                bet.Stop();
                //Logger.Info(bet.ToString("\r\n"));
            }
        }
Esempio n. 15
0
        public override void handleGETRequest(HttpProcessor p)
        {
            string pageLower = p.requestedPage.ToLower();

            if (pageLower.StartsWith("api/"))
            {
                p.writeFailure("405 Method Not Allowed");
            }
            else if (p.requestedPage == "")
            {
                p.writeRedirect("default.html");
            }
            else if (p.requestedPage == "TEST")
            {
                StringBuilder sb = new StringBuilder();
                p.writeSuccess("text/plain");
                p.outputStream.Write(string.Join(", ", Process.GetProcessesByName("svchost").Select(i => ProcessHelper.GetUserWhichOwnsProcess(i.Id))));
            }
            else
            {
                string wwwPath = Globals.ApplicationDirectoryBase + "www/";
#if DEBUG
                if (System.Diagnostics.Debugger.IsAttached)
                {
                    wwwPath = Globals.ApplicationDirectoryBase + "../../www/";
                }
#endif
                DirectoryInfo WWWDirectory     = new DirectoryInfo(wwwPath);
                string        wwwDirectoryBase = WWWDirectory.FullName.Replace('\\', '/').TrimEnd('/') + '/';
                FileInfo      fi             = new FileInfo(wwwDirectoryBase + p.requestedPage);
                string        targetFilePath = fi.FullName.Replace('\\', '/');
                if (!targetFilePath.StartsWith(wwwDirectoryBase) || targetFilePath.Contains("../"))
                {
                    p.writeFailure("400 Bad Request");
                    return;
                }
                if (!fi.Exists)
                {
                    return;
                }
                if ((fi.Extension == ".html" || fi.Extension == ".htm") && fi.Length < 256000)
                {
                    string html = File.ReadAllText(fi.FullName);
                    html = html.Replace("%%VERSION%%", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString());
                    html = html.Replace("%%RND%%", rnd.ToString());

                    byte[] data = Encoding.UTF8.GetBytes(html);
                    if (!p.GetBoolParam("nocompress"))
                    {
                        p.CompressResponseIfCompatible();
                    }
                    p.writeSuccess(Mime.GetMimeType(fi.Extension));
                    p.outputStream.Flush();
                    p.tcpStream.Write(data, 0, data.Length);
                    p.tcpStream.Flush();
                }
                else
                {
                    string mime = Mime.GetMimeType(fi.Extension);
                    if (pageLower.StartsWith(".well-known/acme-challenge/"))
                    {
                        mime = "text/plain";
                    }
                    if (fi.LastWriteTimeUtc.ToString("R") == p.GetHeaderValue("if-modified-since"))
                    {
                        p.writeSuccess(mime, -1, "304 Not Modified");
                        return;
                    }
                    if (!p.GetBoolParam("nocompress"))
                    {
                        p.CompressResponseIfCompatible();
                    }
                    p.writeSuccess(mime, additionalHeaders: GetCacheLastModifiedHeaders(TimeSpan.FromHours(1), fi.LastWriteTimeUtc));
                    p.outputStream.Flush();
                    using (FileStream fs = fi.OpenRead())
                    {
                        fs.CopyTo(p.tcpStream);
                    }
                    p.tcpStream.Flush();
                }
            }
        }
Esempio n. 16
0
        public override void handleGETRequest(HttpProcessor p)
        {
            string pageLower = p.requestedPage.ToLower();

            if (p.requestedPage == "randomdata")
            {
                p.writeSuccess("application/x-binary");
                p.outputStream.Flush();

                int testSec = p.GetIntParam("testsec", 5);
                testSec = BPMath.Clamp(testSec, 1, 30);

                long   endTime    = sw.ElapsedMilliseconds + (long)TimeSpan.FromSeconds(testSec).TotalMilliseconds;
                byte[] randomData = StaticRandom.NextBytes(p.tcpClient.SendBufferSize);
                while (sw.ElapsedMilliseconds < endTime)
                {
                    p.tcpStream.Write(randomData, 0, randomData.Length);
                }
            }
            else if (p.requestedPage == "nstws")
            {
                wss.AcceptIncomingConnection(p.tcpClient);
            }
            else if (p.requestedPage == "HEADERS")
            {
                p.writeSuccess("text/plain");
                p.outputStream.Write(string.Join(Environment.NewLine, p.httpHeadersRaw.Select(h => h.Key + ": " + h.Value)));
            }
            else if (p.requestedPage == "IP")
            {
                p.writeSuccess("text/plain");
                p.outputStream.Write(p.RemoteIPAddressStr);
            }
            else
            {
                if (p.requestedPage == "")
                {
                    p.requestedPage = "default.html";
                }

                string wwwPath = Globals.ApplicationDirectoryBase + "www/";
#if DEBUG
                if (System.Diagnostics.Debugger.IsAttached)
                {
                    wwwPath = Globals.ApplicationDirectoryBase + "../../www/";
                }
#endif
                DirectoryInfo WWWDirectory     = new DirectoryInfo(wwwPath);
                string        wwwDirectoryBase = WWWDirectory.FullName.Replace('\\', '/').TrimEnd('/') + '/';
                FileInfo      fi             = new FileInfo(wwwDirectoryBase + p.requestedPage);
                string        targetFilePath = fi.FullName.Replace('\\', '/');
                if (!targetFilePath.StartsWith(wwwDirectoryBase) || targetFilePath.Contains("../"))
                {
                    p.writeFailure("400 Bad Request");
                    return;
                }
                if (!fi.Exists)
                {
                    return;
                }
                if ((fi.Extension == ".html" || fi.Extension == ".htm") && fi.Length < 256000)
                {
                    string html = File.ReadAllText(fi.FullName);
                    html = html.Replace("%%VERSION%%", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString());
                    html = html.Replace("%%RND%%", rnd.ToString());

                    byte[] data = Encoding.UTF8.GetBytes(html);
                    p.writeSuccess(Mime.GetMimeType(fi.Extension), data.Length);
                    p.outputStream.Flush();
                    p.tcpStream.Write(data, 0, data.Length);
                    p.tcpStream.Flush();
                }
                else
                {
                    string mime = Mime.GetMimeType(fi.Extension);
                    if (pageLower.StartsWith(".well-known/acme-challenge/"))
                    {
                        mime = "text/plain";
                    }
                    if (fi.LastWriteTimeUtc.ToString("R") == p.GetHeaderValue("if-modified-since"))
                    {
                        p.writeSuccess(mime, -1, "304 Not Modified");
                        return;
                    }
                    p.writeSuccess(mime, fi.Length, additionalHeaders: GetCacheLastModifiedHeaders(TimeSpan.FromHours(1), fi.LastWriteTimeUtc));
                    p.outputStream.Flush();
                    using (FileStream fs = fi.OpenRead())
                    {
                        fs.CopyTo(p.tcpStream);
                    }
                    p.tcpStream.Flush();
                }
            }
        }
Esempio n. 17
0
        public override void handleGETRequest(HttpProcessor p)
        {
            try
            {
                string requestedPageLower = p.requestedPage.ToLower();

                if (p.requestedPage == "errors")
                {
                    string errors = File.ReadAllText(Globals.ErrorFilePath);
                    p.writeSuccess();
                    p.outputStream.Write(HttpUtility.HtmlEncode(errors).Replace("\r\n", "<br/>").Replace("\r", "<br/>").Replace("\n", "<br/>"));
                    return;
                }
                if (p.requestedPage == "error")
                {
                    Logger.Debug("/error page loaded");
                    p.writeSuccess();
                    p.outputStream.Write("Error written to log");
                    return;
                }
                if (p.requestedPage == "admin")
                {
                    p.writeRedirect("admin/main");
                    return;
                }

                if (p.requestedPage == "login")
                {
                    LogOutUser(p, null);
                    return;
                }

                if (p.requestedPage == "testip")
                {
                    p.writeSuccess("text/plain; charset=utf-8");
                    p.outputStream.Write(p.RemoteIPAddressStr);
                    return;
                }

                Session s = sm.GetSession(p.requestCookies.GetValue("tlsess"), p.requestCookies.GetValue("tlauth"), p.GetParam("rawauth"));
                if (s != null && s.sid != null && s.sid.Length == 16)
                {
                    p.responseCookies.Add("tlsess", s.sid, TimeSpan.FromMinutes(s.sessionLengthMinutes));
                }

                if (p.requestedPage == "logout")
                {
                    LogOutUser(p, s);
                    return;
                }


                if (p.requestedPage.StartsWith("admin/"))
                {
                    string adminPage = p.requestedPage == "admin" ? "" : p.requestedPage.Substring("admin/".Length);
                    if (string.IsNullOrWhiteSpace(adminPage))
                    {
                        adminPage = "main";
                    }
                    int idxQueryStringStart = adminPage.IndexOf('?');
                    if (idxQueryStringStart == -1)
                    {
                        idxQueryStringStart = adminPage.Length;
                    }
                    adminPage = adminPage.Substring(0, idxQueryStringStart);
                    Pages.Admin.AdminPage.HandleRequest(adminPage, p, s);
                    return;
                }
                else if (p.requestedPage == "Navigation" || p.requestedPage == "NavigationNextDay")
                {
                    if (HandlePublicServiceDisabled(p))
                    {
                        return;
                    }
                    CameraSpec cs = TimelapseWrapper.cfg.GetCameraSpec(p.GetParam("cam"));
                    if (cs == null || cs.type != CameraType.FTP)
                    {
                        p.writeFailure("400 Bad Request");
                    }
                    else if (cs != null && !IpWhitelist.IsWhitelisted(p.RemoteIPAddressStr, cs.ipWhitelist))
                    {
                        p.writeFailure("403 Forbidden");
                    }
                    else
                    {
                        string path = p.GetParam("path");
                        p.writeSuccess();
                        try
                        {
                            if (p.requestedPage == "Navigation")
                            {
                                p.outputStream.Write(Navigation.GetNavHtml(cs, path));
                            }
                            else
                            {
                                p.outputStream.Write(Navigation.GetNavHtmlForNextDay(cs, path));
                            }
                        }
                        catch (NavigationException)
                        {
                            p.outputStream.Write("Server busy. Please reload this page later.");
                        }
                    }
                }
                else if (p.requestedPage == "TimeZoneList")
                {
                    if (HandlePublicServiceDisabled(p))
                    {
                        return;
                    }
                    p.writeSuccess();
                    p.outputStream.Write(Pages.TimeZoneList.GetHtml());
                }
                else if (requestedPageLower.StartsWith(TimelapseGlobals.ImageArchiveFolderNameLower + "/"))
                {
                    p.writeFailure();
                }
                else if (p.requestedPage == "GetFileListUrls")
                {
                    if (HandlePublicServiceDisabled(p))
                    {
                        return;
                    }
                    CameraSpec cs = TimelapseWrapper.cfg.GetCameraSpec(p.GetParam("cam"));
                    if (cs == null || cs.type != CameraType.FTP)
                    {
                        p.writeFailure("400 Bad Request");
                    }
                    else if (cs != null && !IpWhitelist.IsWhitelisted(p.RemoteIPAddressStr, cs.ipWhitelist))
                    {
                        p.writeFailure("403 Forbidden");
                    }
                    else
                    {
                        string path = p.GetParam("path");
                        try
                        {
                            string response = Navigation.GetFileListUrls(cs, path);
                            p.writeSuccess("text/plain");
                            p.outputStream.Write(response);
                        }
                        catch (NavigationException)
                        {
                            p.writeFailure("503 Service Unavailable");
                            p.outputStream.Write("");
                        }
                        catch (Exception ex)
                        {
                            Logger.Debug(ex);
                            p.writeFailure("500 Internal Server Error");
                        }
                    }
                }
                else
                {
                    if (p.requestedPage.StartsWith("TimelapseAPI/", StringComparison.OrdinalIgnoreCase))
                    {
                        mvcApi.ProcessRequest(p, p.requestedPage.Substring("TimelapseAPI/".Length));
                        return;
                    }

                    CameraSpec cs = null;
                    if (p.request_url.Segments.Length > 1)
                    {
                        cs = TimelapseWrapper.cfg.GetCameraSpec(p.request_url.Segments[1].Trim('/'));
                    }
                    if (cs != null)
                    {
                        if (HandlePublicServiceDisabled(p))
                        {
                            return;
                        }

                        if (cs != null && !IpWhitelist.IsWhitelisted(p.RemoteIPAddressStr, cs.ipWhitelist))
                        {
                            p.writeFailure("403 Forbidden");
                        }
                        else
                        {
                            // This page is something involving a camera we have configured
                            if (p.request_url.Segments.Length == 2)
                            {
                                if (cs.type == CameraType.ThirdPartyHosted)
                                {
                                    p.writeFailure("400 Bad Request");
                                }
                                else
                                {
                                    p.writeRedirect("Camera.html?cam=" + cs.id);                                     // Redirect to the camera page for this camera
                                }
                            }
                            else if (p.request_url.Segments.Length >= 3)
                            {
                                if (p.request_url.Segments.Length == 3 && p.request_url.Segments[2] == "latest.jpg")
                                {
                                    if (cs.type == CameraType.ThirdPartyHosted)
                                    {
                                        if (!string.IsNullOrWhiteSpace(cs.path_3rdpartyimgzippedURL))
                                        {
                                            WebServerUtil.Handle3rdPartyZippedImage(p, cs);
                                            return;
                                        }
                                        else
                                        {
                                            p.writeFailure("400 Bad Request");
                                            return;
                                        }
                                    }
                                    if (!CameraMaintenance.MaintainCamera(cs))
                                    {
                                        p.writeFailure("500 Internal Server Error");
                                        return;
                                    }
                                    string   latestImgTime;
                                    DateTime dateTime;
                                    string   latestImagePathPart;
                                    try
                                    {
                                        latestImagePathPart = Navigation.GetLatestImagePath(cs, out latestImgTime, out dateTime);
                                    }
                                    catch (NavigationException)
                                    {
                                        p.writeFailure("503 Service Unavailable");
                                        return;
                                    }
                                    string path = cs.id + "/" + latestImagePathPart;

                                    List <KeyValuePair <string, string> > headers = WebServerUtil.GetCacheEtagHeaders(TimeSpan.Zero, path);
                                    FileInfo imgFile = new FileInfo(TimelapseGlobals.ImageArchiveDirectoryBase + path);
                                    headers.Add(new KeyValuePair <string, string>("Content-Disposition", "inline; filename=\"" + cs.name + " " + imgFile.Name.Substring(0, imgFile.Name.Length - imgFile.Extension.Length) + ".jpg\""));

                                    if (path == p.GetHeaderValue("if-none-match"))
                                    {
                                        p.writeSuccess("image/jpeg", -1, "304 Not Modified");
                                        return;
                                    }
                                    byte[] data = WebServerUtil.GetImageData(path);
                                    p.writeSuccess("image/jpeg", data.Length, additionalHeaders: headers);
                                    p.outputStream.Flush();
                                    p.tcpStream.Write(data, 0, data.Length);
                                }
                                else
                                {
                                    if (cs.type != CameraType.FTP)
                                    {
                                        p.writeFailure("400 Bad Request");
                                        return;
                                    }

                                    List <KeyValuePair <string, string> > headers = WebServerUtil.GetCacheEtagHeaders(TimeSpan.FromDays(365), p.requestedPage);
                                    FileInfo imgFile = new FileInfo(TimelapseGlobals.ImageArchiveDirectoryBase + p.requestedPage);
                                    headers.Add(new KeyValuePair <string, string>("Content-Disposition", "inline; filename=\"" + cs.name + " " + imgFile.Name.Substring(0, imgFile.Name.Length - imgFile.Extension.Length) + ".jpg\""));

                                    if (p.requestedPage == p.GetHeaderValue("if-none-match"))
                                    {
                                        p.writeSuccess("image/jpeg", -1, "304 Not Modified");
                                        return;
                                    }
                                    byte[] data = WebServerUtil.GetImageData(p.requestedPage);
                                    p.writeSuccess("image/jpeg", data.Length, additionalHeaders: headers);
                                    p.outputStream.Flush();
                                    p.tcpStream.Write(data, 0, data.Length);
                                }
                            }
                            else
                            {
                                p.writeFailure();
                            }
                        }
                    }
                    else
                    {
                        #region www
                        DirectoryInfo WWWDirectory = new DirectoryInfo(TimelapseGlobals.WWWDirectoryBase);
                        DirectoryInfo debugWWW     = GetDebugWWW();
                        if (debugWWW != null)
                        {
                            WWWDirectory = debugWWW;
                        }
                        string wwwDirectoryBase = WWWDirectory.FullName.Replace('\\', '/').TrimEnd('/') + '/';
                        string reqPage          = p.requestedPage;
                        //if (reqPage == "")
                        //	reqPage = "Default.html";
                        FileInfo fi             = new FileInfo(wwwDirectoryBase + reqPage);
                        string   targetFilePath = fi.FullName.Replace('\\', '/');
                        if (!targetFilePath.StartsWith(wwwDirectoryBase) || targetFilePath.Contains("../"))
                        {
                            if (WebServerUtil.HandleAdminConfiguredRedirect(p))
                            {
                                return;
                            }
                            p.writeFailure("400 Bad Request");
                            return;
                        }
                        //if (webpackProxy != null)
                        //{
                        //	// Handle hot module reload provided by webpack dev server.
                        //	switch (fi.Extension.ToLower())
                        //	{
                        //		case ".js":
                        //		case ".map":
                        //		case ".css":
                        //		case ".json":
                        //			webpackProxy.Proxy(p);
                        //			return;
                        //	}
                        //}
                        if (!fi.Exists)
                        {
                            if (WebServerUtil.HandleAdminConfiguredRedirect(p))
                            {
                                return;
                            }
                            //fi = new FileInfo(wwwDirectoryBase + "Default.html");
                            //if (!fi.Exists)
                            //{
                            p.writeFailure("404 Not Found");
                            return;
                            //}
                        }

                        if ((fi.Extension == ".html" || fi.Extension == ".htm") && fi.Length < 256000)
                        {
                            string html = File.ReadAllText(fi.FullName);
                            if (fi.Name.ToLower() == "camera.html")
                            {
                                // camera.html triggers special behavior

                                if (HandlePublicServiceDisabled(p))
                                {
                                    return;
                                }

                                string camId = p.GetParam("cam");
                                cs = TimelapseWrapper.cfg.GetCameraSpec(camId);

                                if (cs == null || cs.type == CameraType.ThirdPartyHosted || !CameraMaintenance.MaintainCamera(cs))
                                {
                                    p.writeFailure("400 Bad Request");
                                    return;
                                }

                                if (cs != null && !IpWhitelist.IsWhitelisted(p.RemoteIPAddressStr, cs.ipWhitelist))
                                {
                                    p.writeFailure("403 Forbidden");
                                    return;
                                }

                                string   latestImgTime = "";
                                DateTime dateTime      = DateTime.MinValue;
                                string   navMenu;
                                string   latestImagePathPart;
                                try
                                {
                                    navMenu             = Navigation.GetNavHtml(cs, Navigation.GetLatestPath(cs, out latestImgTime, out dateTime));
                                    latestImagePathPart = Navigation.GetLatestImagePath(cs, out latestImgTime, out dateTime);
                                }
                                catch (NavigationException)
                                {
                                    navMenu             = "Server busy. Please reload this page later.";
                                    latestImagePathPart = "latest";
                                }
                                html = html.Replace("%NAVMENU%", navMenu);
                                html = html.Replace("%TOPMENU%", cs.topMenuHtml);
                                html = html.Replace("%CAMID%", cs.id);
                                html = html.Replace("%CAMNAME%", cs.name);
                                html = html.Replace("%CSS%", WebServerUtil.GetCameraPageStyleCSS(cs));
                                html = html.Replace("%CAMFRAME_GRADIENT%", cs.imgBackgroundGradient ? "true" : "false");
                                html = html.Replace("%CAMNAME_HTML%", WebServerUtil.GetCameraNameHtml(cs));
                                string latestImagePath = cs.id + "/" + latestImagePathPart + ".jpg";
                                html = html.Replace("%LATEST_IMAGE%", latestImagePath);
                                html = html.Replace("%LATEST_IMAGE_TIME%", HttpUtility.JavaScriptStringEncode(latestImgTime));
                            }
                            else if (fi.Name.ToLower() == "all.html")
                            {
                                // all.html triggers special macro strings
                                html = html.Replace("%ALL_CAMERAS_JS_ARRAY%", WebServerUtil.GetAllCamerasJavascriptArray(p.RemoteIPAddressStr));
                                html = html.Replace("%ALL_PAGE_HEADER%", TimelapseWrapper.cfg.options.allPageHeading);
                            }
                            try
                            {
                                html = html.Replace("%REMOTEIP%", p.RemoteIPAddressStr);
                                html = html.Replace("%SYSTEM_NAME%", TimelapseWrapper.cfg.options.systemName);
                                html = html.Replace("%APP_VERSION%", TimelapseGlobals.Version);
                            }
                            catch (Exception ex)
                            {
                                Logger.Debug(ex);
                            }
                            p.writeSuccess(Mime.GetMimeType(fi.Extension));
                            p.outputStream.Write(html);
                            p.outputStream.Flush();
                        }
                        else
                        {
                            string mime = Mime.GetMimeType(fi.Extension);
                            if (p.requestedPage.StartsWith(".well-known/acme-challenge/"))
                            {
                                mime = "text/plain";
                            }
                            if (fi.LastWriteTimeUtc.ToString("R") == p.GetHeaderValue("if-modified-since"))
                            {
                                p.writeSuccess(mime, -1, "304 Not Modified");
                                return;
                            }
                            p.writeSuccess(mime, fi.Length, additionalHeaders: WebServerUtil.GetCacheLastModifiedHeaders(TimeSpan.FromHours(1), fi.LastWriteTimeUtc));
                            p.outputStream.Flush();
                            using (FileStream fs = fi.OpenRead())
                            {
                                fs.CopyTo(p.tcpStream);
                            }
                            p.tcpStream.Flush();
                        }
                        #endregion
                    }
                }
            }
            catch (Exception ex)
            {
                if (!HttpProcessor.IsOrdinaryDisconnectException(ex))
                {
                    Logger.Debug(ex);
                }
            }
        }