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); } }
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); } }
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"); }
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); } }
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); } }
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); } }
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); } }
public void DeleteUser(BooruUser User, string Username) { if (User.IsAdmin) { _DB.ExecuteNonQuery(SQLStatements.DeleteUserByUsername, Username); } else { throw new BooruException(BooruException.ErrorCodes.NoPermission); } }
public void AddUser(BooruUser User, BooruUser NewUser) { if (User.IsAdmin) { _DB.ExecuteInsert("users", NewUser.ToDictionary(false)); } else { throw new BooruException(BooruException.ErrorCodes.NoPermission); } }
private bool IsPrivacyAllowed(BooruPost Post, BooruUser User) { if (Post.Private && !User.IsAdmin) { return(Post.User == User.Username); } else { return(true); } }
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); } }
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); }
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); }
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); } }
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); } }
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); } }
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; } } } }
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); }
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); } }
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; } }
public BooruUser GetUser(string Username) { DataRow userRow = _DB.ExecuteRow(SQLStatements.GetUserByUsername, Username); return(BooruUser.FromRow(userRow)); }