Exemplo n.º 1
0
 public ulong AddPost(BooruUser User, BooruPost PostWithImage)
 {
     if (User.CanAddPosts)
     {
         if (!User.AdvancePostControl)
         {
             PostWithImage.EditCount    = 0;
             PostWithImage.CreationDate = DateTime.Now;
             PostWithImage.ViewCount    = 0;
             PostWithImage.User         = User.Username;
         }
         else if (string.IsNullOrWhiteSpace(PostWithImage.User))
         {
             PostWithImage.User = User.Username;
         }
         PostWithImage.Width     = (uint)PostWithImage.Image.Bitmap.Width;
         PostWithImage.Height    = (uint)PostWithImage.Image.Bitmap.Height;
         PostWithImage.ImageHash = PostWithImage.Image.CalculateImageHash();
         PostWithImage.ID        = (uint)_DB.ExecuteInsert("posts", PostWithImage.ToDictionary(false));
         //Maybe Width + Height checks?
         string thumbPath = Path.Combine(ThumbFolder, "thumb" + PostWithImage.ID);
         string imagePath = Path.Combine(ImageFolder, "image" + PostWithImage.ID);
         using (BooruImage thumbImage = PostWithImage.Image.CreateThumbnail(BooruInfo.ThumbnailSize, false))
             thumbImage.Save(thumbPath, BooruInfo.ThumbnailQuality);
         PostWithImage.Image.Save(imagePath);
         _ImgOptimizer.Optimize(thumbPath);
         _ImgOptimizer.Optimize(imagePath);
         CheckAndAddPostTags(ref PostWithImage);
         return(PostWithImage.ID);
     }
     else
     {
         throw new BooruException(BooruException.ErrorCodes.NoPermission);
     }
 }
Exemplo n.º 2
0
        public BooruImage GetThumbnail(BooruUser User, ulong PostID)
        {
            DataRow   postRow = _DB.ExecuteRow(SQLStatements.GetPostByID, PostID);
            BooruPost post    = BooruPost.FromRow(postRow);

            if (post != null)
            {
                string path = Path.Combine(ThumbFolder, "thumb" + PostID);
                if (User == null)
                {
                    return(BooruImage.FromFile(path));
                }
                else if (post.Rating <= User.MaxRating && IsPrivacyAllowed(post, User))
                {
                    return(BooruImage.FromFile(path));
                }
                else
                {
                    throw new BooruException(BooruException.ErrorCodes.NoPermission);
                }
            }
            else
            {
                throw new BooruException(BooruException.ErrorCodes.ResourceNotFound);
            }
        }
Exemplo n.º 3
0
        public ServerBooru(string Folder)
        {
            _ImgOptimizer = new ImageOptimizer(null);
            string dbPath = Path.Combine(Folder, "booru.db");

            if (File.Exists(dbPath))
            {
                if (Directory.Exists(Path.Combine(Folder, "images")))
                {
                    if (Directory.Exists(Path.Combine(Folder, "thumbs")))
                    //if (Directory.Exists(Path.Combine(Folder, "avatars")))
                    {
                        _Folder      = Folder;
                        _DB          = new SQLiteWrapper(dbPath);
                        _DefaultUser = GetUser("default");
                        if (_DefaultUser == null)
                        {
                            throw new Exception("Default user not found");
                        }
                        return;
                    }
                }
            }
            throw new Exception("No valid booru directory");
        }
Exemplo n.º 4
0
 public void EditImage(BooruUser User, ulong PostID, BooruImage Image)
 {
     if (User.CanEditPosts)
     {
         DataRow   postRow = _DB.ExecuteRow(SQLStatements.GetPostByID, PostID);
         BooruPost post    = BooruPost.FromRow(postRow);
         if (post != null)
         {
             //Maybe Width + Height checks?
             string thumbPath = Path.Combine(ThumbFolder, "thumb" + PostID);
             string imagePath = Path.Combine(ImageFolder, "image" + PostID);
             using (BooruImage thumbImage = Image.CreateThumbnail(BooruInfo.ThumbnailSize, false))
                 thumbImage.Save(thumbPath, BooruInfo.ThumbnailQuality);
             Image.Save(imagePath);
             _ImgOptimizer.Optimize(thumbPath);
             _ImgOptimizer.Optimize(imagePath);
             post.Width     = (uint)Image.Bitmap.Width;
             post.Height    = (uint)Image.Bitmap.Height;
             post.ImageHash = Image.CalculateImageHash();
             _DB.ExecuteNonQuery(SQLStatements.DeletePostByID, PostID);
             _DB.ExecuteInsert("posts", post.ToDictionary(true));
         }
         else
         {
             throw new BooruException(BooruException.ErrorCodes.ResourceNotFound);
         }
     }
     else
     {
         throw new BooruException(BooruException.ErrorCodes.NoPermission);
     }
 }
Exemplo n.º 5
0
 public void EditTag(BooruUser User, BooruTag Tag)
 {
     if (User.CanEditTags)
     {
         if (_DB.ExecuteScalar <int>(SQLStatements.GetTagCountByID, Tag.ID) > 0)
         {
             DataRow typeRow = _DB.ExecuteRow(SQLStatements.GetTagTypeByTypeName, Tag.Type);
             if (typeRow != null)
             {
                 uint typeID = Convert.ToUInt32(typeRow["id"]);
                 _DB.ExecuteNonQuery(SQLStatements.DeleteTagByID, Tag.ID);
                 _DB.ExecuteNonQuery(SQLStatements.InsertTagWithID, Tag.ID, Tag.Tag, typeID);
             }
             else
             {
                 throw new BooruException(BooruException.ErrorCodes.ResourceNotFound);
             }
         }
         else
         {
             throw new BooruException(BooruException.ErrorCodes.ResourceNotFound);
         }
     }
     else
     {
         throw new BooruException(BooruException.ErrorCodes.NoPermission);
     }
 }
Exemplo n.º 6
0
        public BooruPost GetPost(BooruUser User, ulong PostID, bool IncludeThumbnail)
        {
            DataRow   postRow = _DB.ExecuteRow(SQLStatements.GetPostByID, PostID);
            BooruPost post    = BooruPost.FromRow(postRow);

            if (post != null)
            {
                DataTable tagTable = _DB.ExecuteTable(SQLStatements.GetTagsByPostID, PostID);
                post.Tags = BooruTagList.FromTable(tagTable);
                if (User == null)
                {
                    return(post);
                }
                else if (post.Rating <= User.MaxRating && IsPrivacyAllowed(post, User))
                {
                    return(post);
                }
                else
                {
                    throw new BooruException(BooruException.ErrorCodes.NoPermission);
                }
            }
            else
            {
                throw new BooruException(BooruException.ErrorCodes.ResourceNotFound);
            }
        }
Exemplo n.º 7
0
 public void EditPost(BooruUser User, BooruPost Post)
 {
     if (User.CanEditPosts)
     {
         if (_DB.ExecuteScalar <int>(SQLStatements.GetPostCountByID, Post.ID) > 0)
         {
             if (!User.AdvancePostControl)
             {
                 DataRow   postRow = _DB.ExecuteRow(SQLStatements.GetPostByID, Post.ID);
                 BooruPost oldPost = BooruPost.FromRow(postRow);
                 Post.EditCount    = oldPost.EditCount + 1;
                 Post.CreationDate = oldPost.CreationDate;
                 Post.User         = oldPost.User;
                 Post.ViewCount    = oldPost.ViewCount;
             }
             _DB.ExecuteNonQuery(SQLStatements.DeletePostByID, Post.ID);
             _DB.ExecuteNonQuery(SQLStatements.DeletePostTagsByPostID, Post.ID);
             CheckAndAddPostTags(ref Post);
             _DB.ExecuteInsert("posts", Post.ToDictionary(true));
         }
         else
         {
             throw new BooruException(BooruException.ErrorCodes.ResourceNotFound);
         }
     }
     else
     {
         throw new BooruException(BooruException.ErrorCodes.NoPermission);
     }
 }
Exemplo n.º 8
0
 public void DeleteUser(BooruUser User, string Username)
 {
     if (User.IsAdmin)
     {
         _DB.ExecuteNonQuery(SQLStatements.DeleteUserByUsername, Username);
     }
     else
     {
         throw new BooruException(BooruException.ErrorCodes.NoPermission);
     }
 }
Exemplo n.º 9
0
 public void AddUser(BooruUser User, BooruUser NewUser)
 {
     if (User.IsAdmin)
     {
         _DB.ExecuteInsert("users", NewUser.ToDictionary(false));
     }
     else
     {
         throw new BooruException(BooruException.ErrorCodes.NoPermission);
     }
 }
Exemplo n.º 10
0
 private bool IsPrivacyAllowed(BooruPost Post, BooruUser User)
 {
     if (Post.Private && !User.IsAdmin)
     {
         return(Post.User == User.Username);
     }
     else
     {
         return(true);
     }
 }
Exemplo n.º 11
0
        public BooruTag GetTag(BooruUser User, ulong TagID)
        {
            DataRow  tagRow = _DB.ExecuteRow(SQLStatements.GetTagByID, TagID);
            BooruTag tag    = BooruTag.FromRow(tagRow);

            if (tag != null)
            {
                return(tag);
            }
            else
            {
                throw new BooruException(BooruException.ErrorCodes.ResourceNotFound);
            }
        }
Exemplo n.º 12
0
        public BooruUser Login(BooruUser User, string Username, string Password)
        {
            Password = Helper.BytesToString(Helper.MD5OfString(Password));
            BooruUser user = GetUser(Username);

            if (user != null)
            {
                if (user.Enabled && (user.MD5Password == Password || (User == null ? false : User.IsAdmin)))
                {
                    user.MD5Password = null;
                    return(user);
                }
            }
            throw new BooruException(BooruException.ErrorCodes.LoginFailed);
        }
Exemplo n.º 13
0
        public List <ulong> SearchImg(BooruUser User, byte[] Hash)
        {
            DataTable     dupeTable = _DB.ExecuteTable(SQLStatements.GetDuplicatePosts, Convert.ToBase64String(Hash), User.MaxRating, 20);
            BooruPostList dupes     = BooruPostList.FromTable(dupeTable);
            List <ulong>  ids       = new List <ulong>();

            foreach (BooruPost dupe in dupes)
            {
                if (IsPrivacyAllowed(dupe, User))
                {
                    ids.Add(dupe.ID);
                }
            }
            return(ids);
        }
Exemplo n.º 14
0
 public void AddAlias(BooruUser User, string Alias, ulong TagID)
 {
     if (User.CanEditTags) //TODO Alias permission?
     {
         if (_DB.ExecuteScalar <int>(SQLStatements.GetTagCountByID, TagID) > 0)
         {
             _DB.ExecuteNonQuery(SQLStatements.InsertAlias, Alias, TagID);
         }
         else
         {
             throw new BooruException(BooruException.ErrorCodes.ResourceNotFound);
         }
     }
     else
     {
         throw new BooruException(BooruException.ErrorCodes.NoPermission);
     }
 }
Exemplo n.º 15
0
 public void DeleteTag(BooruUser User, ulong TagID)
 {
     if (User.CanDeleteTags)
     {
         if (_DB.ExecuteScalar <int>(SQLStatements.GetTagCountByID, TagID) > 0)
         {
             _DB.ExecuteNonQuery(SQLStatements.DeleteTagByID, TagID);
             _DB.ExecuteNonQuery(SQLStatements.DeletePostTagsByTagID, TagID);
         }
         else
         {
             throw new BooruException(BooruException.ErrorCodes.ResourceNotFound);
         }
     }
     else
     {
         throw new BooruException(BooruException.ErrorCodes.NoPermission);
     }
 }
Exemplo n.º 16
0
 public void DeletePost(BooruUser User, ulong PostID)
 {
     if (User.CanDeletePosts)
     {
         if (_DB.ExecuteScalar <int>(SQLStatements.GetPostCountByID, PostID) > 0)
         {
             _DB.ExecuteNonQuery(SQLStatements.DeletePostByID, PostID);
             _DB.ExecuteNonQuery(SQLStatements.DeletePostTagsByPostID, PostID);
             File.Delete(Path.Combine(ThumbFolder, "thumb" + PostID));
             File.Delete(Path.Combine(ImageFolder, "image" + PostID));
         }
         else
         {
             throw new BooruException(BooruException.ErrorCodes.ResourceNotFound);
         }
     }
     else
     {
         throw new BooruException(BooruException.ErrorCodes.NoPermission);
     }
 }
Exemplo n.º 17
0
 private void _ClientHandlerStage2(Stream Stream)
 {
     using (ReaderWriter rw = new ReaderWriter(Stream))
     {
         BooruUser user = _Booru.DefaultUser;
         while (_ThreadPool.IsRunning)
         {
             RequestCode requestCode = (RequestCode)rw.ReadUShort();
             if (requestCode != RequestCode.Disconnect)
             {
                 byte[] payload = rw.ReadBytes();
                 _Logger.LogLine("Client request: RQ = {0}, {1} bytes payload", Enum.GetName(typeof(RequestCode), requestCode), payload.Length);
                 using (var inputMs = new MemoryStream(payload))
                     using (var outputMs = new MemoryStream())
                     {
                         try
                         {
                             using (var rw2 = new ReaderWriter(inputMs, outputMs))
                                 _ClientHandlerStage3((RequestCode)requestCode, rw2, ref user);
                             rw.Write(true);
                             rw.Write(outputMs.ToArray(), true);
                         }
                         catch (Exception ex)
                         {
                             _Logger.LogException("ClientRequest", ex);
                             rw.Write(false);
                             rw.Write(ex.Message, true);
                         }
                         rw.Flush();
                     }
             }
             else
             {
                 _Logger.LogLine("Client disconnected gracefully");
                 break;
             }
         }
     }
 }
Exemplo n.º 18
0
        public List <ulong> Search(BooruUser User, string SearchExpression)
        {
            BooruPostList searchedPosts = BooruSearch.DoSearch(SearchExpression, this);
            BooruPostList postsToSend   = new BooruPostList();

            searchedPosts.ForEach(x =>
            {
                if (User == null)
                {
                    postsToSend.Add(x);
                }
                else if (x.Rating <= User.MaxRating && IsPrivacyAllowed(x, User))
                {
                    postsToSend.Add(x);
                }
            });
            postsToSend.Sort((b1, b2) => DateTime.Compare(b2.CreationDate, b1.CreationDate));
            List <ulong> ids = new List <ulong>(postsToSend.Count);

            postsToSend.ForEach(x => ids.Add(x.ID));
            return(ids);
        }
Exemplo n.º 19
0
        public BooruImage GetImage(BooruUser User, ulong PostID)
        {
            DataRow   postRow = _DB.ExecuteRow(SQLStatements.GetPostByID, PostID);
            BooruPost post    = BooruPost.FromRow(postRow);

            if (post != null)
            {
                if (User == null || (post.Rating <= User.MaxRating && IsPrivacyAllowed(post, User)))
                {
                    BooruImage image = BooruImage.FromFile(Path.Combine(ImageFolder, "image" + PostID));
                    _DB.ExecuteNonQuery(SQLStatements.UpdateIncrementViewCount, PostID);
                    return(image);
                }
                else
                {
                    throw new BooruException(BooruException.ErrorCodes.NoPermission);
                }
            }
            else
            {
                throw new BooruException(BooruException.ErrorCodes.ResourceNotFound);
            }
        }
Exemplo n.º 20
0
        private void _ClientHandlerStage3(RequestCode RQ, ReaderWriter RW, ref BooruUser User)
        {
            switch (RQ)
            {
            default: throw new NotSupportedException("Unknown request code");

            case RequestCode.Get_Post:
            {
                ulong id = RW.ReadULong();
                using (var post = _Booru.GetPost(User, id, false))
                    post.ToWriter(RW);
            } break;

            case RequestCode.Get_Thumb:
            {
                ulong id = RW.ReadULong();
                using (var thumb = _Booru.GetThumbnail(User, id))
                    thumb.ToWriter(RW);
            } break;

            case RequestCode.Get_Image:
            {
                ulong id = RW.ReadULong();
                using (var image = _Booru.GetImage(User, id))
                    image.ToWriter(RW);
            } break;

            case RequestCode.Get_Tag:
            {
                ulong id = RW.ReadULong();
                _Booru.GetTag(User, id).ToWriter(RW);
            } break;

            case RequestCode.Get_Info:
                _Booru.BooruInfo.ToWriter(RW);
                break;

            case RequestCode.Get_AllTags:
            {
                List <string> tags = _Booru.GetAllTags();
                RW.Write((uint)tags.Count);
                foreach (string tag in tags)
                {
                    RW.Write(tag, true);
                }
            } break;

            case RequestCode.Get_PostTags:
            {
                ulong id = RW.ReadULong();
                using (var post = _Booru.GetPost(User, id, false))
                    post.Tags.ToWriter(RW);
            } break;

            case RequestCode.Get_User:
                User.ToWriter(RW);
                break;

            case RequestCode.Get_PostCount:
                RW.Write(_Booru.GetPostCount());
                break;

            case RequestCode.Search_String:     //User limitations?
            {
                string       pattern = RW.ReadString();
                List <ulong> ids     = _Booru.Search(User, pattern);
                RW.Write((uint)ids.Count);
                foreach (ulong id in ids)
                {
                    RW.Write(id);
                }
            } break;

            case RequestCode.Search_Image:
                throw new NotImplementedException();     //TODO Implement

            case RequestCode.Login:
            {
                string username = RW.ReadString();
                string password = RW.ReadString();
                User = _Booru.Login(User, username, password);
            } break;

            case RequestCode.Logout:
                User = _Booru.DefaultUser;
                break;

            case RequestCode.Search_Tags:
            {
                string term  = RW.ReadString();
                byte   limit = RW.ReadByte();
                _Booru.SearchTags(term, limit).ToWriter(RW);
            } break;

            case RequestCode.Start_GC:
                if (!User.IsAdmin)
                {
                    throw new BooruException(BooruException.ErrorCodes.NoPermission);
                }
                else
                {
                    GC.Collect();
                }
                break;

            case RequestCode.Add_Post:
                using (var post = BooruPost.FromReader(RW))
                {
                    post.Tags  = BooruTagList.FromReader(RW);
                    post.Image = BooruImage.FromReader(RW);
                    ulong id = _Booru.AddPost(User, post);
                    RW.Write(id);
                    if (_MN != null)
                    {
                        using (var thumb = _Booru.GetThumbnail(null, id))
                            _MN.NotificatePostAdded(id, post, thumb);
                    }
                } break;

            case RequestCode.Edit_Post:
            {
                using (var post = BooruPost.FromReader(RW))
                {
                    post.Tags = BooruTagList.FromReader(RW);
                    _Booru.EditPost(User, post);
                }
            } break;

            case RequestCode.Edit_Image:
            {
                ulong id = RW.ReadULong();
                using (var image = BooruImage.FromReader(RW))
                    _Booru.EditImage(User, id, image);
            } break;

            case RequestCode.Delete_Post:
            {
                ulong id = RW.ReadULong();
                _Booru.DeletePost(User, id);
            } break;
            }
        }
Exemplo n.º 21
0
        public BooruUser GetUser(string Username)
        {
            DataRow userRow = _DB.ExecuteRow(SQLStatements.GetUserByUsername, Username);

            return(BooruUser.FromRow(userRow));
        }