Beispiel #1
0
        public void SaveToPngContainer(NanoDB db)
        {
            var files = new DirectoryInfo(Strings.Containers).GetFiles("*.png");

            if (files.Length == 0)
            {
                NotificationHandler.Instance.AddNotification("Не найдены PNG файлы в папке containers.");
                return;
            }

            FileInfo file          = files[random.Next(files.Length - 1)];
            var      bmp           = new Bitmap(file.FullName);
            int      capacity      = (int)(bmp.Width * bmp.Height * 3 / 8);
            string   sessionPrefix = random.Next().ToString("x8");

            sessionPrefix += random.Next().ToString("x8");

            byte[] packed     = null;
            byte[] prevPacked = null;
            int    amount     = 1;

            int realAmount = 0;

            while (amount < 65535 && (prevPacked == null || packed == null || packed.Length < capacity - 32))
            {
                prevPacked = packed;
                var lastPosts   = db.GetNLastPosts(amount).ExceptHidden(db);
                var randomPosts = db.GetNRandomPosts(amount).ExceptHidden(db).FilterBySize(16384);
                var posts       = new List <NanoPost>();
                posts.AddRange(lastPosts);
                posts.AddRange(randomPosts);
                realAmount = posts.Count;
                packed     = Pack(posts.ToArray().Randomized());
                amount     = 1 + amount + amount * 10 / 15;
            }

            packed = prevPacked;
            Console.WriteLine(string.Format("PNG capacity:{0}, posts amount (not unique):{1}, packed size:{2}", capacity, realAmount, packed.Length));

            if (capacity - packed.Length > 32)
            {
                var noise = new byte[capacity - packed.Length - 32];
                random.NextBytes(noise);
                var temp = new List <byte>();
                temp.AddRange(packed);
                temp.AddRange(noise);
                packed = temp.ToArray();
            }

            new PngStegoUtil().HideBytesInPng(
                file.FullName,
                Strings.Upload + Path.DirectorySeparatorChar + sessionPrefix + Strings.PngExt,
                packed);
            NotificationHandler.Instance.AddNotification("Контейнер сохранён: " + Strings.Upload + Path.DirectorySeparatorChar + sessionPrefix + Strings.PngExt);
        }
        public void SaveToPngContainer(NanoDB db)
        {
            var files = new DirectoryInfo(Strings.Containers).GetFiles("*.png");

            if (files.Length == 0)
            {
                NotificationHandler.Instance.AddNotification("Не найдены PNG файлы в папке containers.");
                return;
            }

            FileInfo file = files[random.Next(files.Length - 1)];
            var bmp = new Bitmap(file.FullName);
            int capacity = (int)(bmp.Width * bmp.Height * 3 / 8);
            string sessionPrefix = random.Next().ToString("x8");
            sessionPrefix += random.Next().ToString("x8");

            byte[] packed = null;
            byte[] prevPacked = null;
            int amount = 1;

            int realAmount = 0;

            while (amount < 65535 && (prevPacked == null || packed == null || packed.Length < capacity - 32))
            {
                prevPacked = packed;
                var lastPosts = db.GetNLastPosts(amount).ExceptHidden(db);
                var randomPosts = db.GetNRandomPosts(amount).ExceptHidden(db).FilterBySize(16384);
                var posts = new List<NanoPost>();
                posts.AddRange(lastPosts);
                posts.AddRange(randomPosts);
                realAmount = posts.Count;
                packed = Pack(posts.ToArray().Randomized());
                amount = 1 + amount + amount * 10 / 15;
            }

            packed = prevPacked;
            Console.WriteLine(string.Format("PNG capacity:{0}, posts amount (not unique):{1}, packed size:{2}", capacity, realAmount, packed.Length));

            if (capacity - packed.Length > 32)
            {
                var noise = new byte[capacity - packed.Length - 32];
                random.NextBytes(noise);
                var temp = new List<byte>();
                temp.AddRange(packed);
                temp.AddRange(noise);
                packed = temp.ToArray();
            }

            new PngStegoUtil().HideBytesInPng(
                        file.FullName,
                        Strings.Upload + Path.DirectorySeparatorChar + sessionPrefix + Strings.PngExt,
                        packed);
            NotificationHandler.Instance.AddNotification("Контейнер сохранён: " + Strings.Upload + Path.DirectorySeparatorChar + sessionPrefix + Strings.PngExt);
        }
Beispiel #3
0
        private NanoHttpResponse HandleSafe(NanoHttpRequest request)
        {
            int count = int.Parse(request.Address.Split('/').Last());

            var sb = new StringBuilder();

            sb.Append("{ \n    \"posts\" : [\n");

            var posts = _db.GetNLastPosts(count);

            for (int i = 0; i < posts.Length; i++)
            {
                var  p    = posts[i];
                bool last = i == posts.Length - 1;
                sb.Append("    {\n        \"hash\" :    \"");
                sb.Append(p.GetHash().Value);
                sb.Append("\", \n        \"isHidden\" : \"");
                sb.Append(_db.IsHidden(p.GetHash()) ? "1" : "0");
                sb.Append("\", \n        \"replyTo\" : \"");
                sb.Append(p.ReplyTo.Value);
                sb.Append("\", \n        \"message\" : \"");

                string s = p.SerializedString().Substring(32);
                s = s.Replace("\\", "\\\\");
                s = s.Replace("\n", "\\n");
                s = s.Replace("\"", "\\\"");
                s = s.Replace("\t", "\\t");
                s = s.Replace("\r", "\\r");
                sb.Append(s);
                sb.Append("\"\n    }");
                if (!last)
                {
                    sb.Append(",\n");
                }
            }

            sb.Append("\n    ]\n}");

            return(new NanoHttpResponse(StatusCode.Ok, sb.ToString(), "application/json; charset=utf-8"));
        }
        /*
         *  Takes 50 or less last posts (up to 150000 bytes max total),
         *  adds  50 or less random posts (up to 150000 bytes max total),
         *  random is shifted towards latest posts.
         */
        public void Create()
        {
            var count   = _db.GetPostCount();
            var take    = 50;
            var last50s = _db.GetNLastPosts(take * 4).ExceptHidden(_db).Reverse().Take(take).ToArray();
            var list    = new List <NanoPost>(last50s);

            while (!ByteCountUnder(list, 150000))
            {
                list.RemoveAt(list.Count - 1);
            }

            var r      = new Random();
            int rbytes = 0;
            int max    = 50;

            for (int i = 0; i < max; i++)
            {
                int index = (int)Math.Min(Math.Pow(r.NextDouble(), 0.3) * count, count - 1);
                var p     = _db.GetPost(index);
                if (_db.IsHidden(p.GetHash()))
                {
                    if (max < 10000)
                    {
                        max += 1;
                    }
                    continue;
                }
                var bc = ByteCount(p);
                if (rbytes + bc > 150000)
                {
                    break;
                }
                rbytes += bc;
                list.Add(p);
            }
            CreateWithList(list);
        }
Beispiel #5
0
        private NanoHttpResponse HandleSafe(NanoHttpRequest request)
        {
            var sw = new System.Diagnostics.Stopwatch();

            sw.Start();

            var sb = new StringBuilder();

            ThreadViewHandler.AddHeader(sb);

            sb.Append(string.Format("<div>Количество правил игнорирования постов: {0}. Настройте spamfilter.txt под себя.</div>", SpamDetector.RuleCount));

            sb.Append("[Очистить список]".ToButton("", "", @"
                var x = new XMLHttpRequest(); 
                x.open('POST', '../save/', true);
                x.send('');
                location.reload();
            ").ToDiv("", ""));

            var posts = _db.GetNewPosts();//.ExceptHidden(_db);

            posts = posts.Reverse().ToArray();

            if (posts.Length == 0)
            {
                posts = _db.GetNLastPosts(200).Reverse().ToArray();
            }

            foreach (var p in posts)
            {
                int    answers = _db.CountAnswers(p.GetHash());
                string ans     = "ответ";
                if (answers != 11 && answers % 10 == 1)
                {
                    //
                }
                else if (answers != 11 && answers % 10 == 5)
                {
                    ans += "ов";
                }
                else
                {
                    ans += "а";
                }

                bool corePost = false;

                if (_db.Get(p.ReplyTo) != null &&
                    (_db.Get(p.ReplyTo).ReplyTo.Value == NanoDB.CategoriesHashValue ||
                     _db.Get(p.ReplyTo).ReplyTo.Value == NanoDB.RootHashValue))
                {
                    corePost = true;
                }

                bool hidden = _db.IsHidden(p.GetHash());
                sb.Append(
                    (
                        p.Message.Strip(true).Replace("\n", "<br/>").ToStyledDiv("postinner", p.GetHash().Value, hidden?"visibility:hidden;height:0px;":"") +
                        ((answers > ThreadViewHandler.MinAnswers ? ("[" + answers + " " + ans + "]").ToRef("/expand/" + p.GetHash().Value):"") +
                         (hidden?"[Вернуть]":"[Удалить]").ToButton("", "", @"var x = new XMLHttpRequest(); x.open('POST', '../hide/" + p.GetHash().Value + @"', true);
                        x.send('');
                        var elem = document.getElementById('" + p.GetHash().Value + @"');
                        if (elem.style.visibility != 'hidden') {
                            elem.style.visibility='hidden';
                            elem.style.height = '0px';
                            innerHTML = '[Вернуть]';
                        } else { 
                            elem.style.visibility='visible';
                            elem.style.height = '100%';
                            innerHTML = '[Удалить]';
                        }
                        ") +
                         (p.ContainerTag != null ?
                          "[Отклонить контейнер]".ToButton("", "", @"var x = new XMLHttpRequest(); x.open('POST', '../hideall/" + p.GetHash().Value + @"', true);
                        x.send('');location.reload();") : "") +
                         //("[В закладки]").ToRef("/bookmark/" + p.GetHash().Value) +
                         ("[В тред]").ToRef((corePost?"/thread/":"/expand/") + p.ReplyTo.Value) +
                         ("[Ответить]").ToRef("/reply/" + p.GetHash().Value)).ToDiv("", "")
                    ).ToDiv("post", ""));
            }

            string s1 = "<a href='#' onclick='location.reload()'>[Обновить]</a>";

            sb.Append(s1.ToDiv("", ""));

            sw.Stop();
            ThreadViewHandler.AddFooter(sb, sw.ElapsedMilliseconds, _db);

            return(new NanoHttpResponse(StatusCode.Ok, sb.ToString().ToHtmlBody(ThreadViewHandler.NotifierScript)));
        }