Beispiel #1
0
 public RequestInfo(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
 {
     Request    = request;
     Response   = response;
     Session    = session;
     BodyWriter = new BodyWriter(response, request);
 }
Beispiel #2
0
        public bool Process(IHttpRequest aRequest, IHttpResponse aResponse, HttpServer.Sessions.IHttpSession aSession)
        {
            if (aRequest.Uri.AbsolutePath.StartsWith("/hello"))
            {
                Host.Logger.WriteLine("Accept request for : {0}", aRequest.Uri.ToString());

                StreamWriter writer = new StreamWriter(aResponse.Body);
                writer.WriteLine("Hello dude..dude!");
                writer.Flush();

                aResponse.Send();

                return(true);
            }
            return(false);
        }
Beispiel #3
0
        private void GetBackup(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, BodyWriter bw)
        {
            HttpServer.HttpInput input = request.Method.ToUpper() == "POST" ? request.Form : request.QueryString;
            var bk = Program.DataConnection.GetBackup(input["id"].Value);

            if (bk == null)
            {
                ReportError(response, bw, "Invalid or missing backup id");
            }
            else
            {
                var scheduleId  = Program.DataConnection.GetScheduleIDsFromTags(new string[] { "ID=" + bk.ID });
                var schedule    = scheduleId.Any() ? Program.DataConnection.GetSchedule(scheduleId.First()) : null;
                var sourcenames = SpecialFolders.GetSourceNames(bk);

                //TODO: Filter out the password in both settings and the target url

                bw.OutputOK(new
                {
                    success = true,
                    data    = new {
                        Schedule     = schedule,
                        Backup       = bk,
                        DisplayNames = sourcenames
                    }
                });
            }
        }
Beispiel #4
0
        public static void HandleControlCGI(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, BodyWriter bw, Type module)
        {
            var method = request.Method;

            if (!string.IsNullOrWhiteSpace(request.Headers["X-HTTP-Method-Override"]))
            {
                method = request.Headers["X-HTTP-Method-Override"];
            }

            DoProcess(request, response, session, method, module.Name.ToLowerInvariant(), (String.Equals(request.Method, "POST", StringComparison.OrdinalIgnoreCase) ? request.Form : request.QueryString)["id"].Value);
        }
Beispiel #5
0
 public static void DoProcess(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, string method, string module, string key)
 {
     using (var reqinfo = new RequestInfo(request, response, session))
         DoProcess(reqinfo, method, module, key);
 }
Beispiel #6
0
        public bool Process(HttpServer.IHttpRequest aRequest, HttpServer.IHttpResponse aResponse, HttpServer.Sessions.IHttpSession aSession)
        {
            if (aRequest.Uri.AbsolutePath == "/user/bye/")
            {
                Host?.Logger.WriteLine($"Accept request for : {aRequest.Uri}");

                var writer = new StreamWriter(aResponse.Body);
                writer.WriteLine("<library><book>Eu e eu...</book></library>");
                writer.Flush();

                aResponse.Send();

                return(true);
            }
            return(false);
        }
Beispiel #7
0
 public bool Process(IHttpRequest aRequest, IHttpResponse aResponse, HttpServer.Sessions.IHttpSession aSession)
 {
     return(true);
 }
Beispiel #8
0
        public void Execute(HttpServer.IHttpClientContext context, HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
        {
            if (!request.Param.Contains("number"))
            {
                return;
            }

            var call = _plugin.PluginManager.Core.CallManager.MakeCall(request.Param["number"].Value);

            var content = TemplateTools.ProcessTemplate(
                "Call.html",
                new Dictionary <string, string>()
            {
                { "number", call.Number }
            });

            response.Connection    = HttpServer.ConnectionType.Close;
            response.ContentType   = "text/html";
            response.ContentLength = content.Length;
            response.AddHeader("Content-type", "text/html");
            response.SendHeaders();

            response.SendBody(content);

            //response.Connection = HttpServer.ConnectionType.Close;
            //response.Redirect(String.Format("/callstate?call_id={0}", call.SessionId));
            //response.Send();
        }
Beispiel #9
0
        private void ReadLogData(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, BodyWriter bw)
        {
            HttpServer.HttpInput input = request.Method.ToUpper() == "POST" ? request.Form : request.QueryString;
            var backupid = input["id"].Value;

            if (string.IsNullOrWhiteSpace(backupid))
            {
                List <Dictionary <string, object> > res = null;
                Program.DataConnection.ExecuteWithCommand(x =>
                {
                    res = DumpTable(x, "ErrorLog", "Timestamp", input["offset"].Value, input["pagesize"].Value);
                });

                bw.OutputOK(res);
            }
            else
            {
                var backup = Program.DataConnection.GetBackup(backupid);
                if (backup == null)
                {
                    ReportError(response, bw, "Invalid or missing backup id");
                    return;
                }

                using (var con = (System.Data.IDbConnection)Activator.CreateInstance(Duplicati.Library.SQLiteHelper.SQLiteLoader.SQLiteConnectionType))
                {
                    con.ConnectionString = "Data Source=" + backup.DBPath;
                    con.Open();

                    using (var cmd = con.CreateCommand())
                    {
                        if (Duplicati.Library.Utility.Utility.ParseBool(input["remotelog"].Value, false))
                        {
                            var dt = DumpTable(cmd, "RemoteOperation", "ID", input["offset"].Value, input["pagesize"].Value);

                            // Unwrap raw data to a string
                            foreach (var n in dt)
                            {
                                try { n["Data"] = System.Text.Encoding.UTF8.GetString((byte[])n["Data"]); }
                                catch { }
                            }

                            bw.OutputOK(dt);
                        }
                        else
                        {
                            var dt = DumpTable(cmd, "LogData", "ID", input["offset"].Value, input["pagesize"].Value);
                            bw.OutputOK(dt);
                        }
                    }
                }
            }
        }
Beispiel #10
0
        public void Execute(HttpServer.IHttpClientContext context, HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
        {
            if (!request.Param.Contains("call_id"))
            {
                return;
            }

            var call = _plugin.PluginManager.Core.CallManager[Int32.Parse(request.Param["call_id"].Value)];

            var content = TemplateTools.ProcessTemplate(
                "CallState.html",
                new Dictionary <string, string>()
            {
                { "number", call.Number },
                { "state", ConvertState(call.State) }
            });

            response.Connection    = HttpServer.ConnectionType.Close;
            response.ContentType   = "text/html";
            response.ContentLength = content.Length;
            response.AddHeader("Content-type", "text/html");
            response.SendHeaders();

            response.SendBody(content);
        }
Beispiel #11
0
        public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
        {
            HttpServer.HttpInput input = request.Method.ToUpper() == "POST" ? request.Form : request.QueryString;

            var authcookie = request.Cookies[AUTH_COOKIE_NAME] ?? request.Cookies[Library.Utility.Uri.UrlEncode(AUTH_COOKIE_NAME)];
            var authinput  = input["auth-token"] ?? input[Library.Utility.Uri.UrlEncode("auth-token")];

            var auth_token = authcookie == null || string.IsNullOrWhiteSpace(authcookie.Value) ? null : authcookie.Value;

            if (authinput != null && !string.IsNullOrWhiteSpace(authinput.Value))
            {
                auth_token = input["auth-token"].Value;
            }

            if (request.Uri.AbsolutePath == "/logout.cgi")
            {
                if (!string.IsNullOrWhiteSpace(auth_token))
                {
                    if (m_activeTokens.ContainsKey(auth_token))
                    {
                        m_activeTokens.Remove(auth_token);
                    }
                }

                response.Status = System.Net.HttpStatusCode.NoContent;
                response.Reason = "OK";

                return(true);
            }
            else if (request.Uri.AbsolutePath == "/login.cgi")
            {
                foreach (var k in (from n in m_activeNonces where DateTime.UtcNow > n.Value.Item1 select n.Key).ToList())
                {
                    m_activeNonces.Remove(k);
                }

                if (input["get-nonce"] != null && !string.IsNullOrWhiteSpace(input["get-nonce"].Value))
                {
                    if (m_activeNonces.Count > 50)
                    {
                        response.Status = System.Net.HttpStatusCode.ServiceUnavailable;
                        response.Reason = "Too many active login attempts";
                        return(true);
                    }

                    var buf     = new byte[32];
                    var expires = DateTime.UtcNow.AddMinutes(10);
                    m_prng.GetBytes(buf);
                    var nonce = Convert.ToBase64String(buf);

                    var sha256 = System.Security.Cryptography.SHA256.Create();
                    sha256.TransformBlock(buf, 0, buf.Length, buf, 0);
                    buf = Convert.FromBase64String(Program.DataConnection.ApplicationSettings.WebserverPassword);
                    sha256.TransformFinalBlock(buf, 0, buf.Length);
                    var pwd = Convert.ToBase64String(sha256.Hash);

                    m_activeNonces.Add(nonce, new Tuple <DateTime, string>(expires, pwd));

                    response.Cookies.Add(new HttpServer.ResponseCookie(NONCE_COOKIE_NAME, nonce, expires));
                    using (var bw = new BodyWriter(response))
                    {
                        bw.OutputOK(new {
                            Status = "OK",
                            Nonce  = nonce,
                            Salt   = Program.DataConnection.ApplicationSettings.WebserverPasswordSalt
                        });
                    }
                    return(true);
                }
                else
                {
                    if (input["password"] != null && !string.IsNullOrWhiteSpace(input["password"].Value))
                    {
                        var nonce_el   = request.Cookies[NONCE_COOKIE_NAME] ?? request.Cookies[Library.Utility.Uri.UrlEncode(NONCE_COOKIE_NAME)];
                        var nonce      = nonce_el == null || string.IsNullOrWhiteSpace(nonce_el.Value) ? "" : nonce_el.Value;
                        var urldecoded = nonce == null ? "" : Duplicati.Library.Utility.Uri.UrlDecode(nonce);
                        if (m_activeNonces.ContainsKey(urldecoded))
                        {
                            nonce = urldecoded;
                        }

                        if (!m_activeNonces.ContainsKey(nonce))
                        {
                            response.Status      = System.Net.HttpStatusCode.Unauthorized;
                            response.Reason      = "Unauthorized";
                            response.ContentType = "application/json";
                            return(true);
                        }

                        var pwd = m_activeNonces[nonce].Item2;
                        m_activeNonces.Remove(nonce);

                        if (pwd != input["password"].Value)
                        {
                            response.Status      = System.Net.HttpStatusCode.Unauthorized;
                            response.Reason      = "Unauthorized";
                            response.ContentType = "application/json";
                            return(true);
                        }

                        var buf     = new byte[32];
                        var expires = DateTime.UtcNow.AddHours(1);
                        m_prng.GetBytes(buf);
                        var token = Duplicati.Library.Utility.Utility.Base64UrlEncode(buf);
                        while (token.Length > 0 && token.EndsWith("="))
                        {
                            token = token.Substring(0, token.Length - 1);
                        }

                        m_activeTokens.Add(token, expires);
                        response.Cookies.Add(new  HttpServer.ResponseCookie(AUTH_COOKIE_NAME, token, expires));

                        using (var bw = new BodyWriter(response))
                            bw.OutputOK();

                        return(true);
                    }
                }
            }

            if (string.IsNullOrWhiteSpace(Program.DataConnection.ApplicationSettings.WebserverPassword))
            {
                return(false);
            }

            foreach (var k in (from n in m_activeTokens where DateTime.UtcNow > n.Value select n.Key).ToList())
            {
                m_activeTokens.Remove(k);
            }


            // If we have a valid token, proceeed
            if (!string.IsNullOrWhiteSpace(auth_token))
            {
                DateTime expires;
                var      found = m_activeTokens.TryGetValue(auth_token, out expires);
                if (!found)
                {
                    auth_token = Duplicati.Library.Utility.Uri.UrlDecode(auth_token);
                    found      = m_activeTokens.TryGetValue(auth_token, out expires);
                }

                if (found && DateTime.UtcNow < expires)
                {
                    expires = DateTime.UtcNow.AddHours(1);
                    m_activeTokens[auth_token] = expires;
                    response.Cookies.Add(new ResponseCookie(AUTH_COOKIE_NAME, auth_token, expires));
                    return(false);
                }
            }

            if (request.Uri.AbsolutePath == "/" || request.Uri.AbsolutePath == "/index.html")
            {
                response.Redirect("/login.html");
                return(true);
            }

            if (request.Uri.AbsolutePath == "/control.cgi")
            {
                response.Status = System.Net.HttpStatusCode.Unauthorized;
                response.Reason = "Not logged in";
                response.AddHeader("Location", "login.html");

                return(true);
            }

            return(false);
        }
        public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
        {
            if (request.UriPath.StartsWith(Url))
            {
                string value = request.QueryString[UrlParameters.IsEnabled].Value;
                Settings.ThumbnailOnly = value == "true";

                string redirect = request.QueryString[UrlParameters.RedirectUrl].Value;

                if (!string.IsNullOrWhiteSpace(redirect))
                {
                    response.Redirect(redirect);
                }
                else
                {
                    response.Redirect("/");
                }

                return(true);
            }

            return(false);
        }
        public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
        {
            var path = this.GetPath(request.Uri);
            var html = System.IO.Path.Combine(path, "index.html");
            var htm  = System.IO.Path.Combine(path, "index.htm");

            if (System.IO.Directory.Exists(path) && (System.IO.File.Exists(html) || System.IO.File.Exists(htm)))
            {
                if (!request.Uri.AbsolutePath.EndsWith("/", StringComparison.Ordinal))
                {
                    response.Redirect(request.Uri.AbsolutePath + "/");
                    return(true);
                }

                response.Status      = System.Net.HttpStatusCode.OK;
                response.Reason      = "OK";
                response.ContentType = "text/html; charset=utf-8";
                response.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0");

                using (var fs = System.IO.File.OpenRead(System.IO.File.Exists(html) ? html : htm))
                {
                    response.ContentLength = fs.Length;
                    response.Body          = fs;
                    response.Send();
                }

                return(true);
            }

            return(false);
        }
Beispiel #14
0
        /// <summary>
        /// Processes the request
        /// </summary>
        /// <returns><c>true</c> if the request is handled <c>false</c> otherwise.</returns>
        /// <param name="request">The request.</param>
        /// <param name="response">The response.</param>
        /// <param name="session">The session.</param>
        public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
        {
            if (FULLY_DISABLED)
            {
                response.Status = System.Net.HttpStatusCode.ServiceUnavailable;
                response.Reason = "The system is incorrectly configured";
                return(true);
            }

            var limitedAccess =
                request.Uri.AbsolutePath.StartsWith(RESTHandler.API_URI_PATH, StringComparison.OrdinalIgnoreCase)
                ||
                request.Uri.AbsolutePath.StartsWith(AuthenticationHandler.LOGIN_SCRIPT_URI, StringComparison.OrdinalIgnoreCase)
                ||
                request.Uri.AbsolutePath.StartsWith(AuthenticationHandler.LOGOUT_SCRIPT_URI, StringComparison.OrdinalIgnoreCase);

            if (!limitedAccess)
            {
                return(false);
            }

            var tmpenv = new Dictionary <string, string>();

            tmpenv["REMOTE_ADDR"] = request.RemoteEndPoint.Address.ToString();
            tmpenv["REMOTE_PORT"] = request.RemoteEndPoint.Port.ToString();

            if (!string.IsNullOrWhiteSpace(request.Headers["X-Real-IP"]))
            {
                tmpenv["REMOTE_ADDR"] = request.Headers["X-Real-IP"];
            }
            if (!string.IsNullOrWhiteSpace(request.Headers["X-Real-IP"]))
            {
                tmpenv["REMOTE_PORT"] = request.Headers["X-Real-Port"];
            }

            var loginid = request.Cookies["id"]?.Value;

            if (!string.IsNullOrWhiteSpace(loginid))
            {
                tmpenv["HTTP_COOKIE"] = "id=" + loginid;
            }

            var xsrftoken = request.Headers["X-Syno-Token"];

            if (string.IsNullOrWhiteSpace(xsrftoken))
            {
                xsrftoken = request.QueryString["SynoToken"]?.Value;
            }

            var cachestring = BuildCacheKey(tmpenv, xsrftoken);

            DateTime cacheExpires;

            if (m_logincache.TryGetValue(cachestring, out cacheExpires) && cacheExpires > DateTime.Now)
            {
                // We do not refresh the cache, as we need to ask the synology auth system periodically
                return(false);
            }

            if (string.IsNullOrWhiteSpace(xsrftoken) && AUTO_XSRF)
            {
                var authre = new Regex(@"""SynoToken""\s?\:\s?""(?<token>[^""]+)""");
                try
                {
                    var resp = ShellExec(LOGIN_CGI, env: tmpenv).Result;

                    var m = authre.Match(resp);
                    if (m.Success)
                    {
                        xsrftoken = m.Groups["token"].Value;
                    }
                    else
                    {
                        throw new Exception("Unable to get XSRF token");
                    }
                }
                catch (Exception)
                {
                    response.Status = System.Net.HttpStatusCode.InternalServerError;
                    response.Reason = "The system is incorrectly configured";
                    return(true);
                }
            }

            if (!string.IsNullOrWhiteSpace(xsrftoken))
            {
                tmpenv["HTTP_X_SYNO_TOKEN"] = xsrftoken;
            }

            cachestring = BuildCacheKey(tmpenv, xsrftoken);

            var username = GetEnvArg("SYNO_USERNAME");

            if (string.IsNullOrWhiteSpace(username))
            {
                try
                {
                    username = ShellExec(AUTH_CGI, shell: false, exitcode: 0, env: tmpenv).Result;
                }
                catch (Exception)
                {
                    response.Status = System.Net.HttpStatusCode.InternalServerError;
                    response.Reason = "The system is incorrectly configured";
                    return(true);
                }
            }

            if (string.IsNullOrWhiteSpace(username))
            {
                response.Status = System.Net.HttpStatusCode.Forbidden;
                response.Reason = "Permission denied, not logged in";
                return(true);
            }

            username = username.Trim();

            if (ADMIN_ONLY)
            {
                var groups = GetEnvArg("SYNO_GROUP_IDS");

                if (string.IsNullOrWhiteSpace(groups))
                {
                    groups = ShellExec("id", "-G '" + username.Trim().Replace("'", "\\'") + "'", exitcode: 0).Result ?? string.Empty;
                }
                if (!groups.Split(new char[] { ' ' }).Contains("101"))
                {
                    response.Status = System.Net.HttpStatusCode.Forbidden;
                    response.Reason = "Administrator login required";
                    return(true);
                }
            }

            // We are now authenticated, add to cache
            m_logincache[cachestring] = DateTime.Now + CACHE_TIMEOUT;
            return(false);
        }
Beispiel #15
0
            /// <summary>
            /// Process the received request
            /// </summary>
            /// <returns>A flag indicating if the request is handled.</returns>
            /// <param name="request">The received request.</param>
            /// <param name="response">The response object.</param>
            /// <param name="session">The session state.</param>
            public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
            {
                string[] h       = null;
                var      hstring = Program.DataConnection.ApplicationSettings.AllowedHostnames;

                if (!string.IsNullOrWhiteSpace(hstring))
                {
                    h = m_lastSplitNames;
                    if (hstring != m_lastAllowed)
                    {
                        m_lastAllowed = hstring;
                        h             = m_lastSplitNames = (hstring ?? string.Empty).Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                    }

                    if (h == null || h.Length == 0)
                    {
                        h = null;
                    }
                }

                // For some reason, the web server strips out the host header
                var host = request.Headers["Host"];

                if (string.IsNullOrWhiteSpace(host))
                {
                    host = request.Uri.Host;
                }

                // This should not happen
                if (string.IsNullOrWhiteSpace(host))
                {
                    response.Reason = "Invalid request, missing host header";
                    response.Status = System.Net.HttpStatusCode.Forbidden;
                    var msg = System.Text.Encoding.ASCII.GetBytes(response.Reason);
                    response.ContentType   = "text/plain";
                    response.ContentLength = msg.Length;
                    response.Body.Write(msg, 0, msg.Length);
                    response.Send();
                    return(true);
                }

                // Check the hostnames we always allow
                if (Array.IndexOf(DEFAULT_ALLOWED, host) >= 0)
                {
                    return(false);
                }

                // Then the user specified ones
                if (h != null && Array.IndexOf(h, host) >= 0)
                {
                    return(false);
                }

                // Disable checks if we have an asterisk
                if (h != null && Array.IndexOf(h, "*") >= 0)
                {
                    return(false);
                }

                // Finally, check if we have a potential IP address
                var v4 = IPV4.Match(host);
                var v6 = IPV6.Match(host);

                if ((v4.Success && v4.Length == host.Length) || (v6.Success && v6.Length == host.Length))
                {
                    try
                    {
                        // Verify that the hostname is indeed a valid IP address
                        System.Net.IPAddress.Parse(host);
                        return(false);
                    }
                    catch
                    { }
                }

                // Failed to find a valid header
                response.Reason = $"The host header sent by the client is not allowed";
                response.Status = System.Net.HttpStatusCode.Forbidden;
                var txt = System.Text.Encoding.ASCII.GetBytes(response.Reason);

                response.ContentType   = "text/plain";
                response.ContentLength = txt.Length;
                response.Body.Write(txt, 0, txt.Length);
                response.Send();
                return(true);
            }
Beispiel #16
0
        public sealed override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
        {
            if (request.UriPath == GetPageUrl())
            {
                StringBuilder sb = new StringBuilder(HtmlTemplates.ThreadFiltersPageTemplate);

                IncludeCommonHtml(sb);

                sb.Replace("{{inline-title}}", GetPageTitle());
                sb.Replace("{{boards-list-html}}", ThreadServerModule.get_board_list(UrlParameters.Board));
                sb.Replace("{{available-filters-list}}", get_available_filters());
                sb.Replace("{{filters-list}}", GetThreadFiltersTableHtml());

                WriteFinalHtmlResponse(response, sb.ToString());

                return(true);
            }

            if (request.UriPath.StartsWith(GetPageUrl() + "/"))
            {
                string mode  = request.QueryString["mode"].Value;
                string board = request.QueryString[UrlParameters.Board].Value;

                BoardWatcher bw;

                switch (mode)
                {
                case "add":
                {
                    if (Program.active_dumpers.ContainsKey(board))
                    {
                        bw = Program.active_dumpers[board];
                    }
                    else
                    {
                        bw = new BoardWatcher(board);
                        Program.active_dumpers.Add(board, bw);
                    }

                    string filter_type = request.QueryString["type"].Value;
                    string filter_exp  = request.QueryString["exp"].Value;

                    if (string.IsNullOrEmpty(filter_exp) || string.IsNullOrEmpty(filter_type))
                    {
                        return(false);
                    }
                    else
                    {
                        ChanArchiver.Filters.IFilter f = get_filter(filter_type, filter_exp);
                        if (f != null)
                        {
                            bw.AddFilter(f);
                            bw.SaveFilters();
                            response.Redirect(GetPageUrl());
                            return(true);
                        }
                        else
                        {
                            return(false);
                        }
                    }
                }

                case "edit":
                    return(false);

                case "delete":
                {
                    if (Program.active_dumpers.ContainsKey(board))
                    {
                        string index = request.QueryString["i"].Value;

                        bw = Program.active_dumpers[board];

                        int inde = -1;
                        Int32.TryParse(index, out inde);

                        if (inde >= 0 && inde <= bw.WhitelistFilters.Length - 1)
                        {
                            bw.RemoveFilter(inde);
                            bw.SaveFilters();
                            response.Redirect(GetPageUrl());
                            return(true);
                        }
                        else
                        {
                            return(false);
                        }
                    }
                    else
                    {
                        return(false);
                    }
                }

                case "editnotes":
                {
                    string fID        = request.QueryString["filterindex"].Value;
                    string notes_text = request.QueryString["notestext"].Value;

                    if (string.IsNullOrEmpty(fID) || string.IsNullOrEmpty(board))
                    {
                        response.Redirect(GetPageUrl());
                        return(true);
                    }
                    else
                    {
                        if (Program.active_dumpers.ContainsKey(board))
                        {
                            bw = Program.active_dumpers[board];

                            int index = -1;

                            Int32.TryParse(fID, out index);

                            if (index >= 0 && index < bw.WhitelistFilters.Length)
                            {
                                Filters.IFilter fil = bw.WhitelistFilters[index];

                                fil.Notes = notes_text;
                                bw.SaveFilters();
                                response.Redirect(GetPageUrl());
                                return(true);
                            }
                        }
                    }
                }
                    return(false);

                default:
                    return(false);
                }
            }

            return(false);
        }
Beispiel #17
0
        public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
        {
            if (!request.Uri.AbsolutePath.StartsWith("/capture"))
            {
                return(false);
            }
            HttpServerUtil.DebugPrintRequest(request);

            HttpInputItem        deviceIdParam = request.Param["id"];
            CaptureDevice        device;
            CaptureDeviceHandler captureDevice;

            // First, get the specified lowlevel capture device
            if (deviceIdParam.Count == 1)
            {
                device = WasapiLoopbackCapture2.GetLoopbackCaptureDevices()[int.Parse(deviceIdParam.Value)];
            }
            else
            {
                device = WasapiLoopbackCapture2.GetDefaultLoopbackCaptureDevice();
            }

            // Then, get the capture device handler
            if (captureDevices.ContainsKey(device))
            {
                captureDevice = captureDevices[device];
            }
            else
            {
                captureDevice = new CaptureDeviceHandler(device);
                captureDevices.Add(device, captureDevice);
            }

            response.ContentLength = long.MaxValue;
            response.ContentType   = String.Format("audio/L16;rate={0};channels={1}",
                                                   captureDevice.WaveFormat.SampleRate,
                                                   captureDevice.WaveFormat.Channels);
            response.AddHeader("TransferMode.DLNA.ORG", "Streaming");
            response.AddHeader("Server", "UPnP/1.0 DLNADOC/1.50 LAB/1.0");
            response.AddHeader("icy-name", "Local Audio Broadcast");

            // create local output buffers
            CircleBuffer captureBuffer = new CircleBuffer(BUFFER_SIZE);

            byte[] buffer         = new byte[BUFFER_SIZE];
            byte[] emptiness100ms = new byte[captureDevice.WaveFormat.SampleRate / 10
                                             * captureDevice.WaveFormat.Channels
                                             * (captureDevice.WaveFormat.BitsPerSample / 8)];

            // register buffer for being filled with loopback samples
            captureDevice.Add(captureBuffer);

            IDataSource data = captureBuffer;

            EventHandler <TrackInfoChangedEventArgs> trackInfoHandler = null;

            if (request.Headers["Icy-MetaData"] == "1")
            {
                ShoutcastMetadataEmbedder me = new ShoutcastMetadataEmbedder(
                    captureDevice.WaveFormat.SampleRate * 2, // 1 second interval
                    captureBuffer);
                response.ProtocolVersion = "ICY";
                response.AddHeader("icy-metaint", me.Interval + "");
                data = me;
                me.SetTrackInfo(trackInfoProvider.TrackInfo);
                trackInfoHandler = new EventHandler <TrackInfoChangedEventArgs>(delegate(object sender, TrackInfoChangedEventArgs e) {
                    me.SetTrackInfo(e.TrackInfo);
                });
                trackInfoProvider.TrackInfoChanged += trackInfoHandler;
            }

            HttpServerUtil.DebugPrintResponse(response);
            Socket socket = HttpServerUtil.GetNetworkSocket(response);

            response.SendHeaders();

            int bytesRead = 0;

            while (socket.Connected)
            {
                Thread.Sleep(100);
                while (captureBuffer.Empty)
                {
                    //Thread.Sleep(200);
                    captureBuffer.Write(emptiness100ms, 0, emptiness100ms.Length);
                }
                lock (captureDevice.lockObject) {
                    bytesRead = data.Read(buffer, 0, buffer.Length);
                }
                //Console.WriteLine("buffer-{3} r {0} - {1} = {2}%", loopbackBuffer.FillLevel + bytesRead, bytesRead,
                //    (float)loopbackBuffer.FillLevel / loopbackBuffer.Length * 100, loopbackBuffer.GetHashCode());
                response.SendBody(buffer, 0, bytesRead);

                Console.WriteLine("sending {0} bytes = {1:0.00} secs", bytesRead, bytesRead /
                                  (double)captureDevice.loopbackCapture.WaveFormat.AverageBytesPerSecond);
            }

            if (trackInfoHandler != null)
            {
                trackInfoProvider.TrackInfoChanged -= trackInfoHandler;
            }

            // remove local output buffer
            captureDevice.Remove(captureBuffer);

            Console.WriteLine("request processing finished");

            return(true);
        }
Beispiel #18
0
            public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
            {
                if (!this.CanHandle(request.Uri))
                {
                    return(false);
                }

                if (request.Uri.AbsolutePath.EndsWith("index.html", StringComparison.Ordinal) || request.Uri.AbsolutePath.EndsWith("index.htm", StringComparison.Ordinal))
                {
                    response.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0");
                }
                else
                {
                    response.AddHeader("Cache-Control", "max-age=" + (60 * 60 * 24));
                }
                return(base.Process(request, response, session));
            }
Beispiel #19
0
 public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
 {
     System.Diagnostics.Trace.WriteLine(string.Format("Rejecting request for {0}", request.Uri));
     return(false);
 }
Beispiel #20
0
        private void AddBackup(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, BodyWriter bw)
        {
            var str = request.Form["data"].Value;

            if (string.IsNullOrWhiteSpace(str))
            {
                ReportError(response, bw, "Missing backup object");
                return;
            }

            AddOrUpdateBackupData data = null;

            try
            {
                data = Serializer.Deserialize <AddOrUpdateBackupData>(new StringReader(str));
                if (data.Backup == null)
                {
                    ReportError(response, bw, "Data object had no backup entry");
                    return;
                }

                data.Backup.ID = null;

                if (Duplicati.Library.Utility.Utility.ParseBool(request.Form["temporary"].Value, false))
                {
                    Program.DataConnection.RegisterTemporaryBackup(data.Backup);

                    bw.OutputOK(new { status = "OK", ID = data.Backup.ID });
                }
                else
                {
                    if (Library.Utility.Utility.ParseBool(request.Form["existing_db"].Value, false))
                    {
                        data.Backup.DBPath = Library.Main.DatabaseLocator.GetDatabasePath(data.Backup.TargetURL, null, false, false);
                        if (string.IsNullOrWhiteSpace(data.Backup.DBPath))
                        {
                            throw new Exception("Unable to find remote db path?");
                        }
                    }


                    lock (Program.DataConnection.m_lock)
                    {
                        if (Program.DataConnection.Backups.Where(x => x.Name.Equals(data.Backup.Name, StringComparison.InvariantCultureIgnoreCase)).Any())
                        {
                            ReportError(response, bw, "There already exists a backup with the name: " + data.Backup.Name);
                            return;
                        }

                        Program.DataConnection.AddOrUpdateBackupAndSchedule(data.Backup, data.Schedule);
                    }

                    bw.OutputOK(new { status = "OK", ID = data.Backup.ID });
                }
            }
            catch (Exception ex)
            {
                if (data == null)
                {
                    ReportError(response, bw, string.Format("Unable to parse backup or schedule object: {0}", ex.Message));
                }
                else
                {
                    ReportError(response, bw, string.Format("Unable to save schedule or backup object: {0}", ex.Message));
                }
            }
        }
        public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
        {
            if (request.UriPath == Url || request.UriPath == (Url + "/"))
            {
                StringBuilder sb = new StringBuilder(HtmlTemplates.WatchJobsPageTemplate);

                IncludeCommonHtml(sb);

                sb.Replace("{{watched-threads-table}}", GetWatchedThreadsTableHtml());

                sb.Replace("//{ai_items_js}", get_ai_items());

                sb.Replace("//{board_names_js}", get_boards_names_js());

                sb.Replace("{archives}", get_archives_html());

                WriteFinalHtmlResponse(response, sb.ToString());
                return(true);
            }
            return(false);
        }
Beispiel #22
0
        private void UpdateBackup(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, BodyWriter bw)
        {
            string str = request.Form["data"].Value;

            if (string.IsNullOrWhiteSpace(str))
            {
                ReportError(response, bw, "Missing backup object");
                return;
            }

            AddOrUpdateBackupData data = null;

            try
            {
                data = Serializer.Deserialize <AddOrUpdateBackupData>(new StringReader(str));
                if (data.Backup == null)
                {
                    ReportError(response, bw, "Data object had no backup entry");
                    return;
                }

                if (data.Backup.ID == null)
                {
                    ReportError(response, bw, "Invalid or missing backup id");
                    return;
                }

                if (data.Backup.IsTemporary)
                {
                    var backup = Program.DataConnection.GetBackup(data.Backup.ID);
                    if (backup.IsTemporary)
                    {
                        throw new InvalidDataException("External is temporary but internal is not?");
                    }

                    Program.DataConnection.UpdateTemporaryBackup(backup);
                    bw.OutputOK();
                }
                else
                {
                    lock (Program.DataConnection.m_lock)
                    {
                        var backup = Program.DataConnection.GetBackup(data.Backup.ID);
                        if (backup == null)
                        {
                            ReportError(response, bw, "Invalid or missing backup id");
                            return;
                        }

                        if (Program.DataConnection.Backups.Where(x => x.Name.Equals(data.Backup.Name, StringComparison.InvariantCultureIgnoreCase) && x.ID != data.Backup.ID).Any())
                        {
                            ReportError(response, bw, "There already exists a backup with the name: " + data.Backup.Name);
                            return;
                        }

                        //TODO: Merge in real passwords where the placeholder is found
                        Program.DataConnection.AddOrUpdateBackupAndSchedule(data.Backup, data.Schedule);
                    }

                    bw.OutputOK();
                }
            }
            catch (Exception ex)
            {
                if (data == null)
                {
                    ReportError(response, bw, string.Format("Unable to parse backup or schedule object: {0}", ex.Message));
                }
                else
                {
                    ReportError(response, bw, string.Format("Unable to save backup or schedule: {0}", ex.Message));
                }
            }
        }
Beispiel #23
0
        protected override void HandleRequest(HttpServer.IHttpClientContext context, HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
        {
            var handler = _handlerManager[request.Uri.LocalPath];

            if (handler != null)
            {
                try
                {
                    handler.Execute(context, request, response, session);
                }
                catch (Exception e)
                {
                    Logger.LogWarn(e);
                }
            }
            else
            {
                new FileHandler().Execute(context, request, response, session);
            }

            base.HandleRequest(context, request, response, session);
        }
Beispiel #24
0
        private void SearchBackupFiles(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, BodyWriter bw)
        {
            HttpServer.HttpInput input = request.Method.ToUpper() == "POST" ? request.Form : request.QueryString;

            var filter     = (input["filter"].Value ?? "").Split(new string[] { System.IO.Path.PathSeparator.ToString() }, StringSplitOptions.RemoveEmptyEntries);
            var timestring = input["time"].Value;
            var allversion = Duplicati.Library.Utility.Utility.ParseBool(input["all-versions"].Value, false);

            if (string.IsNullOrWhiteSpace(timestring) && !allversion)
            {
                ReportError(response, bw, "Invalid or missing time");
                return;
            }
            var bk = Program.DataConnection.GetBackup(input["id"].Value);

            if (bk == null)
            {
                ReportError(response, bw, "Invalid or missing backup id");
                return;
            }

            var prefixonly     = Duplicati.Library.Utility.Utility.ParseBool(input["prefix-only"].Value, false);
            var foldercontents = Duplicati.Library.Utility.Utility.ParseBool(input["folder-contents"].Value, false);
            var time           = new DateTime();

            if (!allversion)
            {
                time = Duplicati.Library.Utility.Timeparser.ParseTimeInterval(timestring, DateTime.Now);
            }

            var r = Runner.Run(Runner.CreateListTask(bk, filter, prefixonly, allversion, foldercontents, time), false) as Duplicati.Library.Interface.IListResults;

            var result = new Dictionary <string, object>();

            foreach (HttpServer.HttpInputItem n in input)
            {
                result[n.Name] = n.Value;
            }

            result["Filesets"] = r.Filesets;
            result["Files"]    = r.Files;

            bw.OutputOK(result);
        }
Beispiel #25
0
        public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
        {
            HttpServer.HttpInput input = request.Method.ToUpper() == "POST" ? request.Form : request.QueryString;

            var auth_token = FindAuthCookie(request);
            var xsrf_token = FindXSRFToken(request);

            if (!HasXSRFCookie(request))
            {
                var cookieAdded = AddXSRFTokenToRespone(response);

                if (!cookieAdded)
                {
                    response.Status = System.Net.HttpStatusCode.ServiceUnavailable;
                    response.Reason = "Too Many Concurrent Request, try again later";
                    return(true);
                }
            }
            Tuple <DateTime, string> tmpTuple;
            DateTime tmpDateTime;

            if (LOGOUT_SCRIPT_URI.Equals(request.Uri.AbsolutePath, StringComparison.OrdinalIgnoreCase))
            {
                if (!string.IsNullOrWhiteSpace(auth_token))
                {
                    // Remove the active auth token
                    m_activeTokens.TryRemove(auth_token, out tmpDateTime);
                }

                response.Status = System.Net.HttpStatusCode.NoContent;
                response.Reason = "OK";

                return(true);
            }
            else if (LOGIN_SCRIPT_URI.Equals(request.Uri.AbsolutePath, StringComparison.OrdinalIgnoreCase))
            {
                // Remove expired nonces
                foreach (var k in (from n in m_activeNonces where DateTime.UtcNow > n.Value.Item1 select n.Key))
                {
                    m_activeNonces.TryRemove(k, out tmpTuple);
                }

                if (input["get-nonce"] != null && !string.IsNullOrWhiteSpace(input["get-nonce"].Value))
                {
                    if (m_activeNonces.Count > 50)
                    {
                        response.Status = System.Net.HttpStatusCode.ServiceUnavailable;
                        response.Reason = "Too many active login attempts";
                        return(true);
                    }

                    var password = Program.DataConnection.ApplicationSettings.WebserverPassword;

                    if (request.Headers[TRAYICONPASSWORDSOURCE_HEADER] == "database")
                    {
                        password = Program.DataConnection.ApplicationSettings.WebserverPasswordTrayIconHash;
                    }

                    var buf     = new byte[32];
                    var expires = DateTime.UtcNow.AddMinutes(AUTH_TIMEOUT_MINUTES);
                    m_prng.GetBytes(buf);
                    var nonce = Convert.ToBase64String(buf);

                    var sha256 = System.Security.Cryptography.SHA256.Create();
                    sha256.TransformBlock(buf, 0, buf.Length, buf, 0);
                    buf = Convert.FromBase64String(password);
                    sha256.TransformFinalBlock(buf, 0, buf.Length);
                    var pwd = Convert.ToBase64String(sha256.Hash);

                    m_activeNonces.AddOrUpdate(nonce, key => new Tuple <DateTime, string>(expires, pwd), (key, existingValue) =>
                    {
                        // Simulate the original behavior => if the nonce, against all odds, is already used
                        // we throw an ArgumentException
                        throw new ArgumentException("An element with the same key already exists in the dictionary.");
                    });

                    response.Cookies.Add(new HttpServer.ResponseCookie(NONCE_COOKIE_NAME, nonce, expires));
                    using (var bw = new BodyWriter(response, request))
                    {
                        bw.OutputOK(new {
                            Status = "OK",
                            Nonce  = nonce,
                            Salt   = Program.DataConnection.ApplicationSettings.WebserverPasswordSalt
                        });
                    }
                    return(true);
                }
                else
                {
                    if (input["password"] != null && !string.IsNullOrWhiteSpace(input["password"].Value))
                    {
                        var nonce_el   = request.Cookies[NONCE_COOKIE_NAME] ?? request.Cookies[Library.Utility.Uri.UrlEncode(NONCE_COOKIE_NAME)];
                        var nonce      = nonce_el == null || string.IsNullOrWhiteSpace(nonce_el.Value) ? "" : nonce_el.Value;
                        var urldecoded = nonce == null ? "" : Duplicati.Library.Utility.Uri.UrlDecode(nonce);
                        if (m_activeNonces.ContainsKey(urldecoded))
                        {
                            nonce = urldecoded;
                        }

                        if (!m_activeNonces.ContainsKey(nonce))
                        {
                            response.Status      = System.Net.HttpStatusCode.Unauthorized;
                            response.Reason      = "Unauthorized";
                            response.ContentType = "application/json";
                            return(true);
                        }

                        var pwd = m_activeNonces[nonce].Item2;

                        // Remove the nonce
                        m_activeNonces.TryRemove(nonce, out tmpTuple);

                        if (pwd != input["password"].Value)
                        {
                            response.Status      = System.Net.HttpStatusCode.Unauthorized;
                            response.Reason      = "Unauthorized";
                            response.ContentType = "application/json";
                            return(true);
                        }

                        var buf     = new byte[32];
                        var expires = DateTime.UtcNow.AddHours(1);
                        m_prng.GetBytes(buf);
                        var token = Duplicati.Library.Utility.Utility.Base64UrlEncode(buf);
                        while (token.Length > 0 && token.EndsWith("=", StringComparison.Ordinal))
                        {
                            token = token.Substring(0, token.Length - 1);
                        }

                        m_activeTokens.AddOrUpdate(token, key => expires, (key, existingValue) =>
                        {
                            // Simulate the original behavior => if the token, against all odds, is already used
                            // we throw an ArgumentException
                            throw new ArgumentException("An element with the same key already exists in the dictionary.");
                        });

                        response.Cookies.Add(new  HttpServer.ResponseCookie(AUTH_COOKIE_NAME, token, expires));

                        using (var bw = new BodyWriter(response, request))
                            bw.OutputOK();

                        return(true);
                    }
                }
            }

            var limitedAccess =
                request.Uri.AbsolutePath.StartsWith(RESTHandler.API_URI_PATH, StringComparison.OrdinalIgnoreCase)
            ;

            // Override to allow the CAPTCHA call to go through
            if (request.Uri.AbsolutePath.StartsWith(CAPTCHA_IMAGE_URI, StringComparison.OrdinalIgnoreCase) && request.Method == "GET")
            {
                limitedAccess = false;
            }

            if (limitedAccess)
            {
                if (xsrf_token != null && m_activexsrf.ContainsKey(xsrf_token))
                {
                    var expires = DateTime.UtcNow.AddMinutes(XSRF_TIMEOUT_MINUTES);
                    m_activexsrf[xsrf_token] = expires;
                    response.Cookies.Add(new ResponseCookie(XSRF_COOKIE_NAME, xsrf_token, expires));
                }
                else
                {
                    response.Status = System.Net.HttpStatusCode.BadRequest;
                    response.Reason = "Missing XSRF Token. Please reload the page";

                    return(true);
                }
            }

            if (string.IsNullOrWhiteSpace(Program.DataConnection.ApplicationSettings.WebserverPassword))
            {
                return(false);
            }

            foreach (var k in (from n in m_activeTokens where DateTime.UtcNow > n.Value select n.Key))
            {
                m_activeTokens.TryRemove(k, out tmpDateTime);
            }


            // If we have a valid token, proceed
            if (!string.IsNullOrWhiteSpace(auth_token))
            {
                DateTime expires;
                var      found = m_activeTokens.TryGetValue(auth_token, out expires);
                if (!found)
                {
                    auth_token = Duplicati.Library.Utility.Uri.UrlDecode(auth_token);
                    found      = m_activeTokens.TryGetValue(auth_token, out expires);
                }

                if (found && DateTime.UtcNow < expires)
                {
                    expires = DateTime.UtcNow.AddHours(1);

                    m_activeTokens[auth_token] = expires;
                    response.Cookies.Add(new ResponseCookie(AUTH_COOKIE_NAME, auth_token, expires));
                    return(false);
                }
            }

            if ("/".Equals(request.Uri.AbsolutePath, StringComparison.OrdinalIgnoreCase) || "/index.html".Equals(request.Uri.AbsolutePath, StringComparison.OrdinalIgnoreCase))
            {
                response.Redirect("/login.html");
                return(true);
            }

            if (limitedAccess)
            {
                response.Status = System.Net.HttpStatusCode.Unauthorized;
                response.Reason = "Not logged in";
                response.AddHeader("Location", "login.html");

                return(true);
            }

            return(false);
        }
        public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
        {
            string command = request.UriPath;

            if (command == "/settings")
            {
                StringBuilder page = new StringBuilder(Properties.Resources.settings_page);

                //-------------------- General Settings --------------------------

                if (Settings.AutoStartManuallyAddedThreads)
                {
                    page.Replace("{gs0c}", Checked);
                }
                else
                {
                    page.Replace("{gs0c}", "");
                }

                if (Settings.ThumbnailOnly)
                {
                    page.Replace("{gs1c}", Checked);
                }
                else
                {
                    page.Replace("{gs1c}", "");
                }

                if (Settings.EnableFileStats)
                {
                    page.Replace("{gs2c}", Checked);
                }
                else
                {
                    page.Replace("{gs2c}", "");
                }

                if (Settings.UseHttps)
                {
                    page.Replace("{gs3c}", Checked);
                }
                else
                {
                    page.Replace("{gs3c}", "");
                }

                if (Settings.RemoveThreadsWhenTheyEnterArchivedState)
                {
                    page.Replace("{gs4c}", Checked);
                }
                else
                {
                    page.Replace("{gs4c}", "");
                }

                if (Settings.SaveBannedFileThumbnail)
                {
                    page.Replace("{gs5c}", Checked);
                }
                else
                {
                    page.Replace("{gs5c}", "");
                }

                if (Settings.CacheAPIFilesInMemory)
                {
                    page.Replace("{gs6c}", Checked);
                }
                else
                {
                    page.Replace("{gs6c}", "");
                }


                //-------------------- Security Settings --------------------------

                if (Settings.EnableAuthentication)
                {
                    page.Replace("{ss0c}", Checked);
                }
                else
                {
                    page.Replace("{ss0c}", "");
                }

                if (Settings.AllowGuestAccess)
                {
                    page.Replace("{ss1c}", Checked);
                }
                else
                {
                    page.Replace("{ss1c}", "");
                }

                page.Replace("{bauser}", string.IsNullOrEmpty(Settings.AuthUsername) ? "" : Settings.AuthUsername);

                page.Replace("{bapass}", string.IsNullOrEmpty(Settings.AuthPassword) ? "" : Settings.AuthPassword);

                //-------------------- FFMPEG Settings --------------------------

                page.Replace("{ffpath}", Program.ffmpeg_path);


                if (Settings.ConvertGifsToWebm)
                {
                    page.Replace("{ff0c}", Checked);
                }
                else
                {
                    page.Replace("{ff0c}", "");
                }

                if (Settings.ConvertWebmToMp4)
                {
                    page.Replace("{ff1c}", Checked);
                }
                else
                {
                    page.Replace("{ff1c}", "");
                }

                if (Settings.Convert_Webmgif_To_Target)
                {
                    page.Replace("{ff2c}", Checked);
                }
                else
                {
                    page.Replace("{ff2c}", "");
                }


                if (Settings.Convert_Webmgif_Target == Settings.X_Target.GIF)
                {
                    page.Replace("{ff2s1o1c}", Selected);
                    page.Replace("{ff2s1o2c}", "");
                }
                else
                {
                    page.Replace("{ff2s1o1c}", "");
                    page.Replace("{ff2s1o2c}", Selected);
                }

                if (Settings.Convert_Webmgif_only_devices)
                {
                    page.Replace("{ff2s2o1c}", Selected);
                    page.Replace("{ff2s2o2c}", "");
                }
                else
                {
                    page.Replace("{ff2s2o1c}", "");
                    page.Replace("{ff2s2o2c}", Selected);
                }

                //-------------------- File Queue Settings --------------------------

                if (Settings.ListThumbsInQueue)
                {
                    page.Replace("{fq0c}", Checked);
                }
                else
                {
                    page.Replace("{fq0c}", "");
                }


                /*
                 * if (Settings.PrioritizeBumpLimit)
                 * {
                 *  page.Replace("{fq1c}", Checked);
                 * }
                 * else
                 * {
                 *  page.Replace("{fq1c}", "");
                 * }
                 *
                 * switch (Settings.FilePrioritizeMode)
                 * {
                 *  case Settings.FilePrioritizeModeEnum.BoardSpeed:
                 *      page.Replace("{fq2s1o1c}", "");
                 *      page.Replace("{fq2s1o2c}", "");
                 *      page.Replace("{fq2s1o3c}", Selected);
                 *      break;
                 *  case Settings.FilePrioritizeModeEnum.LargerFirst:
                 *      page.Replace("{fq2s1o1c}", "");
                 *      page.Replace("{fq2s1o2c}", Selected);
                 *      page.Replace("{fq2s1o3c}", "");
                 *      break;
                 *  case Settings.FilePrioritizeModeEnum.SmallerFirst:
                 *      page.Replace("{fq2s1o1c}", Selected);
                 *      page.Replace("{fq2s1o2c}", "");
                 *      page.Replace("{fq2s1o3c}", "");
                 *      break;
                 *  default:
                 *      break;
                 * }
                 */

                if (Settings.AutoRemoveCompleteFiles)
                {
                    page.Replace("{fq3c}", Checked);
                }
                else
                {
                    page.Replace("{fq3c}", "");
                }

                response.Status      = System.Net.HttpStatusCode.OK;
                response.ContentType = "text/html";
                byte[] data = Encoding.UTF8.GetBytes(page.ToString());
                response.ContentLength = data.Length;
                response.SendHeaders();
                response.SendBody(data);

                return(true);
            }

            if (command.StartsWith("/settings/"))
            {
                // -------------- General Settings ------------
                Settings.AutoStartManuallyAddedThreads = request.QueryString["gs0"].Value == "1";
                Settings.ThumbnailOnly   = request.QueryString["gs1"].Value == "1";
                Settings.EnableFileStats = request.QueryString["gs2"].Value == "1";
                Settings.UseHttps        = request.QueryString["gs3"].Value == "1";
                Settings.RemoveThreadsWhenTheyEnterArchivedState = request.QueryString["gs4"].Value == "1";
                Settings.SaveBannedFileThumbnail = request.QueryString["gs5"].Value == "1";
                Settings.CacheAPIFilesInMemory   = request.QueryString["gs6"].Value == "1";

                if (Settings.EnableFileStats)
                {
                    FileSystemStats.Init();
                }


                // -------------- Security Settings ------------
                Settings.EnableAuthentication = request.QueryString["ss0"].Value == "1";
                Settings.AllowGuestAccess     = request.QueryString["ss1"].Value == "1";
                Settings.AuthUsername         = request.QueryString["ba_user"].Value;
                Settings.AuthPassword         = request.QueryString["ba_pass"].Value;

                // -------------- FFMPEG Settings ------------

                Settings.ConvertGifsToWebm = request.QueryString["ff0"].Value == "1";

                Settings.ConvertWebmToMp4          = request.QueryString["ff1"].Value == "1";
                Settings.Convert_Webmgif_To_Target = request.QueryString["ff2"].Value == "1";

                if (request.QueryString["ff2s1"].Value == "gif")
                {
                    Settings.Convert_Webmgif_Target = Settings.X_Target.GIF;
                }
                else
                {
                    Settings.Convert_Webmgif_Target = Settings.X_Target.MP4;
                }


                Settings.Convert_Webmgif_only_devices = request.QueryString["ff2s2"].Value == "ff2s2o1";


                // -------------- File Queue Settings ------------


                Settings.ListThumbsInQueue = request.QueryString["fq0"].Value == "1";

                /*
                 * Settings.PrioritizeBumpLimit = request.QueryString["fq1"].Value == "1";
                 *
                 * switch (request.QueryString["fq2s1"].Value)
                 * {
                 *  case "fq2s1o1":
                 *      Settings.FilePrioritizeMode = Settings.FilePrioritizeModeEnum.SmallerFirst;
                 *      break;
                 *  case "fq2s1o2":
                 *      Settings.FilePrioritizeMode = Settings.FilePrioritizeModeEnum.LargerFirst;
                 *      break;
                 *  case "fq2s1o3":
                 *      Settings.FilePrioritizeMode = Settings.FilePrioritizeModeEnum.BoardSpeed;
                 *      break;
                 *  default:
                 *      Settings.FilePrioritizeMode = Settings.FilePrioritizeModeEnum.SmallerFirst;
                 *      break;
                 * }*/

                Settings.AutoRemoveCompleteFiles = request.QueryString["fq3"].Value == "1";

                Settings.Save();

                if (!Settings.EnableAuthentication)
                {
                    session.Clear();
                    response.Cookies.Clear();
                }

                response.Redirect("/settings");
                return(true);
            }

            return(false);
        }
Beispiel #27
0
        public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
        {
            if (!request.Uri.AbsolutePath.StartsWith(API_URI_PATH, StringComparison.OrdinalIgnoreCase))
            {
                return(false);
            }

            var module = request.Uri.Segments.Skip(API_URI_SEGMENTS).FirstOrDefault();

            if (string.IsNullOrWhiteSpace(module))
            {
                module = "help";
            }

            module = module.Trim('/');

            var key = string.Join("", request.Uri.Segments.Skip(API_URI_SEGMENTS + 1)).Trim('/');

            var method = request.Method;

            if (!string.IsNullOrWhiteSpace(request.Headers["X-HTTP-Method-Override"]))
            {
                method = request.Headers["X-HTTP-Method-Override"];
            }

            DoProcess(request, response, session, method, module, key);

            return(true);
        }
Beispiel #28
0
        public void Execute(HttpServer.IHttpClientContext context, HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
        {
            var filePath = request.Uri.LocalPath;

            // Prevent hacking
            filePath = filePath.Replace('/', '\\');
            filePath = filePath.Substring(filePath.LastIndexOf('\\'));

            if (filePath[0] == '\\')
            {
                filePath = filePath.Substring(1);
            }

            response.Connection = HttpServer.ConnectionType.Close;
            try
            {
                var content = TemplateTools.ReadResourceFile(filePath);
                response.ContentType   = GetMimeTypeByExtension(filePath);
                response.ContentLength = content.Length;
                response.SendHeaders();

                response.SendBody(content);
            }
            catch
            {
                response.Reason = "HTTP/1.1 404 Not Found";
                response.Send();
            }
        }
Beispiel #29
0
        public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
        {
            if (request.UriPath.StartsWith(Url))
            {
                string day_number = request.QueryString[UrlParameters.DayNumber].Value;

                int dayNumber = 0;

                DateTime day = DateTime.Now;

                if (Int32.TryParse(day_number, out dayNumber))
                {
                    day = new DateTime(day.Year, 1, 1);

                    dayNumber--;

                    if (!DateTime.IsLeapYear(day.Year) && dayNumber == 365)
                    {
                        dayNumber--;
                    }

                    day = day.AddDays(dayNumber);
                }

                var sdata = NetworkUsageCounter.GetDayStats(day);

                JsonArray ja = new JsonArray();

                for (int i = 0; i < sdata.Length; i++)
                {
                    double t = sdata[i].Value / 1024 / 1024;

                    JsonArray inner = new JsonArray();

                    inner.Add(sdata[i].Key);
                    inner.Add(Math.Round(t, 2, MidpointRounding.AwayFromZero));

                    ja.Add(inner);
                }

                WriteJsonResponse(response, ja.ToString());
                return(true);
            }

            return(false);
        }
        public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session)
        {
            if (!request.Uri.AbsolutePath.StartsWith(path))
            {
                return(false);
            }
            HttpServerUtil.DebugPrintRequest(request);

            Socket socket = HttpServerUtil.GetNetworkSocket(response);

            //response.ContentLength = long.MaxValue;
            response.ContentType = "audio/" + fileInfo.Extension.Substring(1);
            response.AddHeader("TransferMode.DLNA.ORG", "Streaming");
            response.AddHeader("Server", "UPnP/1.0 DLNADOC/1.50 LAB/1.0");

            FileStream stream = fileInfo.OpenRead();

            // create local output buffers
            byte[] buffer = new byte[BUFFER_SIZE];

            HttpServerUtil.DebugPrintResponse(response);
            response.SendHeaders();

            int bytesRead = 1;

            while (socket.Connected && bytesRead > 0)
            {
                // file stream -> byte array buffer -> circlebuffer -> add metadata -> byte array buffer -> response stream
                bytesRead = stream.Read(buffer, 0, buffer.Length);
                response.SendBody(buffer, 0, bytesRead);
            }

            // remove local output buffer
            stream.Close();

            Console.WriteLine("request processing finished");

            return(true);
        }