public ActionResult GetResourceForHtml(GetResourceForHtmlParameters parameters)
        {
            try
            {
                if (!string.IsNullOrEmpty(parameters.ResourceName) &&
                    parameters.ResourceName.IndexOf("/", StringComparison.Ordinal) >= 0)
                {
                    parameters.ResourceName = parameters.ResourceName.Replace("/", "");
                }

                var resource = new HtmlResource(parameters.ResourceName)
                {
                    //ResourceName = parameters.ResourceName,
                    //ResourceType = Utils.GetResourceType(parameters.ResourceName),
                    DocumentPageNumber = parameters.PageNumber
                };
                var stream = _htmlHandler.GetResource(parameters.DocumentPath, resource);

                if (stream == null || stream.Length == 0)
                {
                    return(new HttpStatusCodeResult((int)HttpStatusCode.Gone));
                }

                return(File(stream, Utils.GetMimeType(parameters.ResourceName)));
            }
            catch (Exception e)
            {
                return(this.JsonOrJsonP(new FailedResponse {
                    Reason = e.Message
                }, null));
            }
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            _htmlHandler = (ViewerHtmlHandler)Session["htmlHandler"];

            GetResourceForHtmlParameters parameters = new GetResourceForHtmlParameters();


            parameters.DocumentPath = GetValueFromQueryString("documentPath");
            parameters.ResourceName = GetValueFromQueryString("resourceName");
            parameters.PageNumber   = int.Parse(GetValueFromQueryString("pageNumber") != String.Empty ? GetValueFromQueryString("pageNumber") : "0");

            if (!string.IsNullOrEmpty(parameters.ResourceName) &&
                parameters.ResourceName.IndexOf("/", StringComparison.Ordinal) >= 0)
            {
                parameters.ResourceName = parameters.ResourceName.Replace("/", "");
            }


            try
            {
                var resource = new HtmlResource
                {
                    ResourceName       = parameters.ResourceName,
                    ResourceType       = Utils.GetResourceType(parameters.ResourceName),
                    DocumentPageNumber = parameters.PageNumber
                };
                var stream = _htmlHandler.GetResource(parameters.DocumentPath, resource);
                if (stream == null || stream.Length == 0)
                {
                    Response.StatusCode = ((int)HttpStatusCode.Gone);
                    Response.End();
                }
                else
                {
                    byte[] Bytes = new byte[stream.Length];
                    stream.Read(Bytes, 0, Bytes.Length);
                    //string contentDispositionString = "attachment; filename=\"" + parameters.ResourceName + "\"";
                    string contentDispositionString = new ContentDisposition {
                        FileName = parameters.ResourceName, Inline = true
                    }.ToString();

                    HttpContext.Current.Response.ContentType = Utils.GetImageMimeTypeFromFilename(parameters.ResourceName);
                    HttpContext.Current.Response.AddHeader("Content-Disposition", contentDispositionString);
                    HttpContext.Current.Response.AddHeader("Content-Length", stream.Length.ToString());
                    HttpContext.Current.Response.OutputStream.Write(Bytes, 0, Bytes.Length);
                    HttpContext.Current.Response.Flush();
                    HttpContext.Current.Response.End();
                }
            }
            catch
            {
            }
        }
Example #3
0
        public ActionResult GetResourceForHtml(GetResourceForHtmlParameters parameters)
        {
            if (!string.IsNullOrEmpty(parameters.ResourceName) &&
                parameters.ResourceName.IndexOf("/", StringComparison.Ordinal) >= 0)
            {
                parameters.ResourceName = parameters.ResourceName.Replace("/", "");
            }

            var resource = new HtmlResource
            {
                ResourceName       = parameters.ResourceName,
                ResourceType       = Utils.GetResourceType(parameters.ResourceName),
                DocumentPageNumber = parameters.PageNumber
            };
            var stream = _htmlHandler.GetResource(parameters.DocumentPath, resource);

            if (stream == null || stream.Length == 0)
            {
                return(new HttpStatusCodeResult((int)HttpStatusCode.Gone));
            }

            return(File(stream, Utils.GetImageMimeTypeFromFilename(parameters.ResourceName)));
        }
Example #4
0
        private async Task ProcessRequest(HttpListenerContext context)
        {/*
          * <!DOCTYPE html>
          * <html lang="en">
          *
          * <head>
          *
          */
            try
            {
                var cookie = context.Request.Cookies["token"];
                if (cookie != null)
                {
                    string base64 = Convert.ToBase64String(Token);
                    if (cookie.Value != base64)
                    {
                        return;
                    }
                }
                else
                {
                    return;
                }

                if (_resources.Any(x => x.Key == context.Request.RawUrl))
                {
                    HtmlResource resource = _resources.First(x => x.Key == context.Request.RawUrl).Value;
                    byte[]       bytes    = { };

                    if (resource.Id == 0)
                    {
#if TESTING
                        string data = $"<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n<script>const version = \"TESTING_MODE\";</script>\r\n" + Encoding.UTF8.GetString((byte[])Properties.Resources.ResourceManager.GetObject($"_{resource.Id}"));
#else
                        string data = $"<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n<script>const version = \"{Engine.Version}\";</script>\r\n" + Encoding.UTF8.GetString((byte[])Properties.Resources.ResourceManager.GetObject($"_{resource.Id}"));
#endif
                        bytes = Encoding.UTF8.GetBytes(data);
                    }
                    else
                    {
                        bytes = (byte[])Properties.Resources.ResourceManager.GetObject($"_{resource.Id}");
                    }

                    context.Response.ContentLength64 = bytes.Length;
                    context.Response.ContentType     = resource.Type;
                    await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);

                    context.Response.OutputStream.Close();
                }
                else
                {
                    switch (context.Request.RawUrl)
                    {
                    case "/utils/login_form":
                        if (!Engine.LocalSettings.NightMode)
                        {
                            new LoginWindowLight().ShowDialog();
                        }
                        else
                        {
                            new LoginWindowDark().ShowDialog();
                        }
                        context.Response.StatusCode  = 200;
                        context.Response.ContentType = "text/plain";
                        await context.Response.OutputStream.WriteAsync(new byte[] { }, 0, 0);

                        context.Response.OutputStream.Close();
                        break;

                    case "/engine/start":
                        Engine.Start();
                        context.Response.StatusCode = 200;
                        byte[] bytes = Encoding.UTF8.GetBytes("Started!");
                        await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);

                        context.Response.OutputStream.Close();
                        break;

                    case "/engine/stop":
                        Engine.Stop();
                        context.Response.ContentType = "text/plain";
                        context.Response.StatusCode  = 200;
                        bytes = new byte[] { };

                        string statusd = Engine.GetStatus();

                        if ((!Engine.LocalSettings.AutoOpen || Engine.LocalSettings.OpenInDownloader) && Engine.FoundCurrentSearch > 0)
                        {
                            bytes = Encoding.UTF8.GetBytes("Beatmaps_viewer");
                        }

                        await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);

                        context.Response.OutputStream.Close();
                        break;

                    case "/engine/status":
                        bytes = Encoding.UTF8.GetBytes(Engine.GetStatus());

                        context.Response.ContentLength64 = bytes.Length;
                        context.Response.ContentType     = "text/plain";
                        context.Response.StatusCode      = 200;
                        await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);

                        context.Response.OutputStream.Close();

                        break;

                    case "/engine/beatmaps/ranked":
                        context.Response.StatusCode  = 200;
                        context.Response.ContentType = "application/json";

                        bytes = Encoding.UTF8.GetBytes(Engine.GetRankedJson());

                        await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);

                        context.Response.OutputStream.Close();
                        break;

                    case "/engine/beatmaps/clear":
                        context.Response.StatusCode  = 200;
                        context.Response.ContentType = "text/plain";

                        Engine.Clear();

                        await context.Response.OutputStream.WriteAsync(new byte [] { }, 0, 0);

                        context.Response.OutputStream.Close();
                        break;

                    case "/engine/beatmaps/loved":
                        context.Response.StatusCode  = 200;
                        context.Response.ContentType = "application/json";

                        bytes = Encoding.UTF8.GetBytes(Engine.GetLovedJson());

                        await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);

                        context.Response.OutputStream.Close();
                        break;

                    case "/engine/beatmaps/unranked":
                        context.Response.StatusCode  = 200;
                        context.Response.ContentType = "application/json";

                        bytes = Encoding.UTF8.GetBytes(Engine.GetUnrankedJson());

                        await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);

                        context.Response.OutputStream.Close();
                        return;

                    case "/engine/beatmaps/save":
                        System.Windows.Forms.SaveFileDialog dialog = new System.Windows.Forms.SaveFileDialog
                        {
                            Filter = "osu!Sync|*.nw520-osbl|Text file|*.txt"
                        };

                        if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                        {
                            if (dialog.FilterIndex == 1)
                            {
                                System.IO.File.WriteAllBytes(dialog.FileName, new ExportFormats.OsuSync(Engine.FoundBeatmaps).GetBytes());
                            }
                            else if (dialog.FilterIndex == 2)
                            {
                                System.IO.File.WriteAllBytes(dialog.FileName, new ExportFormats.TextFile(Engine.FoundBeatmaps).GetBytes());
                            }
                        }

                        context.Response.StatusCode  = 200;
                        context.Response.ContentType = "application/json";
                        await context.Response.OutputStream.WriteAsync(new byte[] { }, 0, 0);

                        context.Response.OutputStream.Close();
                        break;

                    case "/engine/mirror":
                        context.Response.StatusCode  = 200;
                        context.Response.ContentType = "text/plain";

                        bytes = Encoding.UTF8.GetBytes("MIRROR");

                        await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);

                        context.Response.OutputStream.Close();
                        return;

                    case "/downloader/dls":
                        bytes = Encoding.UTF8.GetBytes(
                            await BeatmapDownloader.DownloadStatusAsync());

                        context.Response.StatusCode  = 200;
                        context.Response.ContentType = "application/json";

                        await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);

                        context.Response.OutputStream.Close();
                        return;

                    default:
                        if (context.Request.RawUrl.Contains("/engine/settings"))
                        {
                            context.Response.StatusCode  = 200;
                            context.Response.ContentType = "application/json";

                            if (context.Request.HttpMethod == "PATCH")
                            {
                                string query = context.Request.QueryString["p"];
                                PatchSettings(query);
                                await context.Response.OutputStream.WriteAsync(new byte[] { }, 0, 0);
                            }
                            else if (context.Request.HttpMethod == "GET")
                            {
                                bytes = Encoding.UTF8.GetBytes(GetSettings());
                                await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);
                            }
                            else
                            {
                                await BadRequest(context);

                                return;
                            }

                            context.Response.OutputStream.Close();
                            return;
                        }
                        else if (context.Request.RawUrl.Contains("/engine/beatmaps/ranked"))
                        {
                            string query = context.Request.QueryString["p"];

                            context.Response.StatusCode  = 200;
                            context.Response.ContentType = "application/json";

                            bytes = Encoding.UTF8.GetBytes(Engine.GetRankedPageJson(int.Parse(query)));

                            await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);

                            context.Response.OutputStream.Close();
                        }
                        else if (context.Request.RawUrl.Contains("/engine/beatmaps/unranked"))
                        {
                            string query = context.Request.QueryString["p"];

                            context.Response.StatusCode  = 200;
                            context.Response.ContentType = "application/json";

                            bytes = Encoding.UTF8.GetBytes(Engine.GetUnrankedPageJson(int.Parse(query)));

                            await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);

                            context.Response.OutputStream.Close();
                        }
                        else if (context.Request.RawUrl.Contains("/engine/beatmaps/loved"))
                        {
                            string query = context.Request.QueryString["p"];

                            context.Response.StatusCode  = 200;
                            context.Response.ContentType = "application/json";

                            bytes = Encoding.UTF8.GetBytes(Engine.GetLovedPageJson(int.Parse(query)));

                            await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);

                            context.Response.OutputStream.Close();
                        }
                        else if (context.Request.RawUrl.Contains("/utils/open_beatmapset_mirror"))
                        {
                            string query     = context.Request.QueryString["id"];
                            string query_bId = context.Request.QueryString["b_id"];

                            if (query != string.Empty)
                            {
                                context.Response.StatusCode  = 200;
                                context.Response.ContentType = "text/plain";

                                if (!int.TryParse(query, out int i))
                                {
                                    break;
                                }

                                switch (Engine.LocalSettings.Mirror)
                                {
                                case Engine.DownloadMirrors.Hexide:
                                    Process.Start($"https://osu.hexide.com/beatmaps/{query}/download/novid/no-video.osz");
                                    break;

                                case Engine.DownloadMirrors.Bloodcat:
                                    Process.Start($"https://bloodcat.com/osu/s/{query}");
                                    break;

                                default:
                                    break;
                                }

                                await context.Response.OutputStream.WriteAsync(new byte[] { }, 0, 0);

                                context.Response.OutputStream.Close();
                            }
                            return;
                        }
                        else if (context.Request.RawUrl.Contains("/utils/open_beatmapset"))
                        {
                            string query     = context.Request.QueryString["id"];
                            string query_bId = context.Request.QueryString["b_id"];

                            if (query != string.Empty)
                            {
                                context.Response.StatusCode  = 200;
                                context.Response.ContentType = "text/plain";

                                if (!int.TryParse(query, out int i))
                                {
                                    break;
                                }

                                if (Engine.LocalSettings.OpenInGame)
                                {
                                    Process.Start($"osu://s/{query}");
                                }
                                else
                                {
                                    if (!Engine.Ripple)
                                    {
                                        Process.Start($"https://osu.ppy.sh/s/{query}");
                                    }
                                    else
                                    {
                                        Process.Start($"https://ripple.moe/b/{query_bId}");
                                    }
                                }

                                await context.Response.OutputStream.WriteAsync(new byte[] { }, 0, 0);

                                context.Response.OutputStream.Close();
                            }
                            return;
                        }
                        else if (context.Request.RawUrl.Contains("/images/get_beatmap_image_nodisk"))
                        {
                            await _thumbnailsSemaphore.WaitAsync();

                            try
                            {
                                string query = context.Request.QueryString["id"];

                                context.Response.StatusCode = 200;
                                bytes = await ThumbnailDownloader.MainThumbnailDownloader.GetThumbnailNoDisk(int.Parse(query));

                                context.Response.ContentLength64 = bytes.Length;
                                context.Response.ContentType     = "image/jpeg";

                                await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);

                                context.Response.OutputStream.Close();
                                return;
                            }
                            finally
                            {
                                _thumbnailsSemaphore.Release();
                            }
                        }
                        else if (context.Request.RawUrl.Contains("/images/get_beatmap_image"))
                        {
                            await _thumbnailsSemaphore.WaitAsync();

                            try
                            {
                                string query = context.Request.QueryString["id"];

                                context.Response.StatusCode = 200;
                                bytes = await ThumbnailDownloader.MainThumbnailDownloader.GetThumbnail(int.Parse(query));

                                context.Response.ContentLength64 = bytes.Length;
                                context.Response.ContentType     = "image/jpeg";

                                await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);

                                context.Response.OutputStream.Close();
                                return;
                            }
                            finally
                            {
                                _thumbnailsSemaphore.Release();
                            }
                        }
                        else if (context.Request.RawUrl.Contains("/sounds/play"))
                        {
                            context.Response.StatusCode  = 200;
                            context.Response.ContentType = "text/plain";

                            if (Engine.LocalSettings.SoundEffects)
                            {
                                string query = context.Request.QueryString["id"];

                                switch (query)
                                {
                                case "Click":
                                    Utils.PlayWavAsync(Properties.Resources.Click);
                                    break;

                                case "Switch":
                                    Utils.PlayWavAsync(Properties.Resources.Switch);
                                    break;

                                case "Downloaded":
                                    Utils.PlayWavAsync(Properties.Resources.Downloaded);
                                    break;

                                default:
                                    break;
                                }
                            }

                            await context.Response.OutputStream.WriteAsync(new byte[] { }, 0, 0);

                            context.Response.OutputStream.Close();
                        }
                        else if (context.Request.RawUrl.Contains("/downloader/search_unranked"))
                        {
                            string query = context.Request.QueryString["query"];
                            string page  = "1";

                            try
                            {
                                page = context.Request.QueryString["page"];
                            }
                            catch { }

                            bytes = Encoding.UTF8.GetBytes(
                                await BeatmapDownloader.SearchUnranked(query, int.Parse(page)));

                            context.Response.StatusCode  = 200;
                            context.Response.ContentType = "application/json";

                            await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);

                            context.Response.OutputStream.Close();
                            return;
                        }
                        else if (context.Request.RawUrl.Contains("/downloader/search"))
                        {
                            string query = context.Request.QueryString["query"];
                            string page  = "0";

                            try
                            {
                                page = context.Request.QueryString["page"];
                            } catch {
                            }

                            if (page == null)
                            {
                                page = "0";
                            }

                            bytes = Encoding.UTF8.GetBytes(
                                await BeatmapDownloader.Search(query, int.Parse(page)));

                            context.Response.StatusCode  = 200;
                            context.Response.ContentType = "application/json";

                            await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);

                            context.Response.OutputStream.Close();
                            return;
                        }
                        else if (context.Request.RawUrl.Contains("/downloader/start"))
                        {
                            string query0 = context.Request.QueryString["id"];
                            string query1 = context.Request.QueryString["author"];
                            string query2 = context.Request.QueryString["artist"];
                            string query3 = context.Request.QueryString["title"];
                            string query4 = context.Request.QueryString["status"];

                            if (await BeatmapDownloader.Exists(int.Parse(query0)))
                            {
                                if (!MainWindow.Current.DownloadBeatmapAgainMessageBox())
                                {
                                    await context.Response.OutputStream.WriteAsync(new byte[] { }, 0, 0);

                                    context.Response.OutputStream.Close();
                                    break;
                                }
                                else
                                {
                                    await BeatmapDownloader.Delete(int.Parse(query0));
                                }
                            }

                            bytes = Encoding.UTF8.GetBytes(
                                (await BeatmapDownloader
                                 .RegisterDownload(int.Parse(query0), int.Parse(query4), query2, query1, query3))
                                .ToString());

                            context.Response.StatusCode  = 200;
                            context.Response.ContentType = "text/plain";

                            await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);

                            context.Response.OutputStream.Close();
                            return;
                        }
                        else if (context.Request.RawUrl.Contains("/downloader/stop"))
                        {
                            string query  = context.Request.QueryString["id"];
                            int    status = await BeatmapDownloader.Stop(int.Parse(query));

                            context.Response.StatusCode  = status;
                            context.Response.ContentType = "text/plain";

                            await context.Response.OutputStream.WriteAsync(new byte[] { }, 0, 0);

                            context.Response.OutputStream.Close();
                            return;
                        }
                        else if (context.Request.RawUrl.Contains("/downloader/run"))
                        {
                            string query  = context.Request.QueryString["id"];
                            int    status = await BeatmapDownloader.RunBeatmap(int.Parse(query));

                            context.Response.StatusCode  = status;
                            context.Response.ContentType = "text/plain";

                            await context.Response.OutputStream.WriteAsync(new byte[] { }, 0, 0);

                            context.Response.OutputStream.Close();
                            return;
                        }
                        else if (context.Request.RawUrl.Contains("/downloader/dls"))
                        {
                            try
                            {
                                string query = context.Request.QueryString["id"];
                                bytes = Encoding.UTF8.GetBytes(
                                    await BeatmapDownloader.DownloadStatusAsync(int.Parse(query)));
                            } catch (Exception e)
                            {
                                bytes = Encoding.UTF8.GetBytes("ERROR");
                            }
                            context.Response.StatusCode  = 200;
                            context.Response.ContentType = "application/json";

                            await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);

                            context.Response.OutputStream.Close();
                            return;
                        }
                        else if (context.Request.RawUrl.Contains("/ui_mode/"))
                        {
                            string mode = string.Empty;

                            if (Engine.LocalSettings.NightMode)
                            {
                                mode = "../css/night.css";
                            }
                            else
                            {
                                mode = "../css/main.css";
                            }

                            context.Response.StatusCode  = 200;
                            context.Response.ContentType = "text/plain";

                            bytes = Encoding.UTF8.GetBytes(mode);

                            await context.Response.OutputStream.WriteAsync(bytes, 0, bytes.Length);

                            context.Response.OutputStream.Close();
                            return;
                        }

                        await BadRequest(context);

                        break;
                    }
                }
            } catch (Exception e)
            {
                Logger.MainLogger.Log(Logger.LogTypes.Error, e.ToString());
            }
        }
        public ActionResult GetResourceForHtml(GetResourceForHtmlParameters parameters)
        {
            if (!string.IsNullOrEmpty(parameters.ResourceName) &&
                parameters.ResourceName.IndexOf("/", StringComparison.Ordinal) >= 0)
                parameters.ResourceName = parameters.ResourceName.Replace("/", "");

            var resource = new HtmlResource
            {
                ResourceName = parameters.ResourceName,
                ResourceType = Utils.GetResourceType(parameters.ResourceName),
                DocumentPageNumber = parameters.PageNumber == 0 ? 1 : parameters.PageNumber
            };

            var stream = _htmlHandler.GetResource(parameters.DocumentPath, resource);

            if (stream == null || stream.Length == 0)
                return new HttpStatusCodeResult((int)HttpStatusCode.Gone);

            return File(stream, Utils.GetMimeType(parameters.ResourceName));
        }