Ejemplo n.º 1
0
        public void ReadPosts()
        {
            if (!File.Exists(Index) || !File.Exists(Data))
            {
                return;
            }

            string indexes = Encoding.UTF8.GetString(File.ReadAllBytes(Index));
            string posts   = Encoding.UTF8.GetString(File.ReadAllBytes(Data));

            try
            {
                for (int i = 0; i < indexes.Length / 8; i += 2)
                {
                    string offset  = indexes.Substring(i * 8, 8);
                    string length  = indexes.Substring(i * 8 + 8, 8);
                    string rawpost = posts.Substring(
                        int.Parse(offset, System.Globalization.NumberStyles.HexNumber),
                        int.Parse(length, System.Globalization.NumberStyles.HexNumber));
                    var post = new NanoPost(rawpost);

                    if (!SpamDetector.IsSpam(post.Message))
                    {
                        AddPost(new NanoPost(rawpost), false);
                    }
                }
            }

            catch (Exception e)
            {
                Logger.LogError("Error while reading posts db:\n" + e.ToString());
            }
        }
Ejemplo n.º 2
0
        public NanoHttpResponse Handle(NanoHttpRequest request)
        {
            if (string.IsNullOrEmpty(request.Content))
            {
                return(new ErrorHandler(StatusCode.BadRequest, "Empty message").Handle(request));
            }

            Hash thread = new Hash(request.Address.Split('/').Last());

            if (thread.Invalid)
            {
                return(new ErrorHandler(StatusCode.BadRequest, "Invalid hash").Handle(request));
            }

            var str = Encoding.UTF8.GetString(request.Connection.Raw);

            str = str.Substring(str.IndexOf("\r\n\r\n") + 4);
            NanoPost post = null;

            if (thread.Value != NanoDB.CategoriesHashValue)
            {
                post = new NanoPost(thread, "[g]" + GetPostHeader() + "[/g]\n" + str);
            }

            else
            {
                post = new NanoPost(thread, str);
            }

            if (post.Invalid)
            {
                NotificationHandler.Instance.AddNotification("Превышен максимальный размер поста.");
                return(new NanoHttpResponse(StatusCode.BadRequest, ""));
            }

            if (SpamDetector.IsSpam(post.Message))
            {
                NotificationHandler.Instance.AddNotification("Ваш пост из-за своего содержания будет считаться спамом.");
                return(new NanoHttpResponse(StatusCode.BadRequest, ""));
            }
            else
            {
                NotificationHandler.Instance.AddNotification(
                    "Сообщение добавлено, " + post.SerializedBytes().Length + " байт (" + post.SerializedString().Length + " симв.)");

                if (_db.AddPost(post))
                {
                    _db.WriteNewPosts(false);
                }

                return(new NanoHttpResponse(StatusCode.Ok, post.GetHash().Value));
            }
        }
Ejemplo n.º 3
0
        public static NanoPost[] Unpack(byte[] bytes)
        {
            bytes = GZipUtil.Decompress(bytes);
            List <NanoPost> posts = new List <NanoPost>();
            string          str   = Encoding.UTF8.GetString(bytes);

            int count = int.Parse(str.Substring(0, 6), System.Globalization.NumberStyles.HexNumber);

            List <int>    sizes = new List <int>();
            List <string> raws  = new List <string>();

            for (int i = 0; i < count; i++)
            {
                int size = int.Parse(str.Substring((i + 1) * 6, 6), System.Globalization.NumberStyles.HexNumber);
                sizes.Add(size);
            }

            int offset = count * 6 + 6;

            for (int i = 0; i < sizes.Count; i++)
            {
                int size = sizes[i];
                raws.Add(str.Substring(offset, size));
                offset += size;
            }

            var containerHash       = SHA256.Create().ComputeHash(bytes);
            var containerHashString = "";

            containerHash.ToList().ForEach(b => containerHashString += b.ToString("x2"));

            for (int i = 0; i < raws.Count; i++)
            {
                var p = new NanoPost(raws[i]);
                p.ContainerTag = containerHashString;

                if (SpamDetector.IsSpam(p.Message))
                {
                    continue;
                }

                posts.Add(p);
            }

            return(posts.ToArray());
        }