public bool IsNewPostDupeOrInTimeLimit(NewPost newPost, User user) { var postID = _profileRepository.GetLastPostID(user.UserID); if (postID == null) { return(false); } var lastPost = _postRepository.Get(postID.Value); if (lastPost == null) { return(false); } var minimumSeconds = _settingsManager.Current.MinimumSecondsBetweenPosts; if (DateTime.UtcNow.Subtract(lastPost.PostTime).TotalSeconds < minimumSeconds) { return(true); } var parsedText = newPost.IsPlainText ? _textParsingService.ForumCodeToHtml(newPost.FullText) : _textParsingService.ClientHtmlToHtml(newPost.FullText); if (parsedText == lastPost.FullText) { return(true); } return(false); }
public async Task <PrivateMessage> Create(string subject, string fullText, User user, List <User> toUsers) { if (String.IsNullOrWhiteSpace(subject)) { throw new ArgumentNullException("subject"); } if (String.IsNullOrWhiteSpace(fullText)) { throw new ArgumentNullException("fullText"); } if (user == null) { throw new ArgumentNullException("user"); } if (toUsers == null || toUsers.Count == 0) { throw new ArgumentException("toUsers must include at least one user.", "toUsers"); } var names = user.Name; foreach (var toUser in toUsers) { names += ", " + toUser.Name; } var now = DateTime.UtcNow; var pm = new PrivateMessage { Subject = _textParsingService.EscapeHtmlAndCensor(subject), UserNames = names, LastPostTime = now }; pm.PMID = await _privateMessageRepository.CreatePrivateMessage(pm); await _privateMessageRepository.AddUsers(pm.PMID, new List <int> { user.UserID }, now, true); await _privateMessageRepository.AddUsers(pm.PMID, toUsers.Select(u => u.UserID).ToList(), now.AddSeconds(-1), false); var post = new PrivateMessagePost { FullText = _textParsingService.ForumCodeToHtml(fullText), Name = user.Name, PMID = pm.PMID, PostTime = now, UserID = user.UserID }; await _privateMessageRepository.AddPost(post); return(pm); }
// TODO: [ValidateInput(false)] public JsonResult PostTopic(NewPost newPost) { var user = _userRetrievalShim.GetUser(HttpContext); if (user == null) { return(Json(new BasicJsonMessage { Message = Resources.LoginToPost, Result = false })); } ForumPermissionContext permissionContext; var forum = GetForumByIdWithPermissionContext(newPost.ItemID, out permissionContext); if (!permissionContext.UserCanView) { return(Json(new BasicJsonMessage { Message = Resources.ForumNoView, Result = false })); } if (!permissionContext.UserCanPost) { return(Json(new BasicJsonMessage { Message = Resources.ForumNoPost, Result = false })); } if (_postService.IsNewPostDupeOrInTimeLimit(newPost, user)) { return(Json(new BasicJsonMessage { Message = String.Format(Resources.PostWait, _settingsManager.Current.MinimumSecondsBetweenPosts), Result = false })); } newPost.FullText = newPost.IsPlainText ? _textParsingService.ForumCodeToHtml(newPost.FullText) : _textParsingService.ClientHtmlToHtml(newPost.FullText); if (String.IsNullOrWhiteSpace(newPost.FullText) || String.IsNullOrWhiteSpace(newPost.Title)) { return(Json(new BasicJsonMessage { Message = Resources.PostEmpty, Result = false })); } // TODO: test link generation var urlHelper = Url; var userProfileUrl = urlHelper.Action("ViewProfile", "Account", new { id = user.UserID }); Func <Topic, string> topicLinkGenerator = t => urlHelper.Action("Topic", "Forum", new { id = t.UrlName }); var topic = _forumService.PostNewTopic(forum, user, permissionContext, newPost, HttpContext.Connection.RemoteIpAddress.ToString(), userProfileUrl, topicLinkGenerator); _topicViewCountService.SetViewedTopic(topic, HttpContext); return(Json(new BasicJsonMessage { Result = true, Redirect = urlHelper.RouteUrl(new { controller = "Forum", action = "Topic", id = topic.UrlName }) })); }
public void EditPost(Post post, PostEdit postEdit, User editingUser) { // TODO: text parsing is controller for new topic and replies, see issue #121 https://github.com/POPWorldMedia/POPForums/issues/121 // TODO: also not checking for empty posts var oldText = post.FullText; post.Title = _textParsingService.Censor(postEdit.Title); if (postEdit.IsPlainText) { post.FullText = _textParsingService.ForumCodeToHtml(postEdit.FullText); } else { post.FullText = _textParsingService.ClientHtmlToHtml(postEdit.FullText); } post.ShowSig = postEdit.ShowSig; post.LastEditTime = DateTime.UtcNow; post.LastEditName = editingUser.Name; post.IsEdited = true; _postRepository.Update(post); _moderationLogService.LogPost(editingUser, ModerationType.PostEdit, post, postEdit.Comment, oldText); _searchIndexQueueRepository.Enqueue(new SearchIndexPayload { TenantID = _tenantService.GetTenant(), TopicID = post.TopicID }); }
public Post PostReply(Topic topic, User user, int parentPostID, string ip, bool isFirstInTopic, NewPost newPost, DateTime postTime, string topicLink, Func <User, string> unsubscribeLinkGenerator, string userUrl, Func <Post, string> postLinkGenerator) { newPost.Title = _textParsingService.Censor(newPost.Title); if (newPost.IsPlainText) { newPost.FullText = _textParsingService.ForumCodeToHtml(newPost.FullText); } else { newPost.FullText = _textParsingService.ClientHtmlToHtml(newPost.FullText); } var postID = _postRepository.Create(topic.TopicID, parentPostID, ip, isFirstInTopic, newPost.IncludeSignature, user.UserID, user.Name, newPost.Title, newPost.FullText, postTime, false, user.Name, null, false, 0); var post = new Post { PostID = postID, FullText = newPost.FullText, IP = ip, IsDeleted = false, IsEdited = false, IsFirstInTopic = isFirstInTopic, LastEditName = user.Name, LastEditTime = null, Name = user.Name, ParentPostID = parentPostID, PostTime = postTime, ShowSig = newPost.IncludeSignature, Title = newPost.Title, TopicID = topic.TopicID, UserID = user.UserID }; _topicRepository.IncrementReplyCount(topic.TopicID); _topicRepository.UpdateLastTimeAndUser(topic.TopicID, user.UserID, user.Name, postTime); _forumRepository.UpdateLastTimeAndUser(topic.ForumID, postTime, user.Name); _forumRepository.IncrementPostCount(topic.ForumID); _topicRepository.MarkTopicForIndexing(topic.TopicID); _profileRepository.SetLastPostID(user.UserID, postID); if (unsubscribeLinkGenerator != null) { _subscribedTopicService.NotifySubscribers(topic, user, topicLink, unsubscribeLinkGenerator); } // <a href="{0}">{1}</a> made a post in the topic: <a href="{2}">{3}</a> var message = String.Format(Resources.NewReplyPublishMessage, userUrl, user.Name, postLinkGenerator(post), topic.Title); var forumHasViewRestrictions = _forumRepository.GetForumViewRoles(topic.ForumID).Count > 0; _eventPublisher.ProcessEvent(message, user, EventDefinitionService.StaticEventIDs.NewPost, forumHasViewRestrictions); _broker.NotifyNewPosts(topic, post.PostID); _broker.NotifyNewPost(topic, post.PostID); var forum = _forumRepository.Get(topic.ForumID); _broker.NotifyForumUpdate(forum); topic = _topicRepository.Get(topic.TopicID); _broker.NotifyTopicUpdate(topic, forum, topicLink); return(post); }
public Topic PostNewTopic(Forum forum, User user, ForumPermissionContext permissionContext, NewPost newPost, string ip, string userUrl, Func <Topic, string> topicLinkGenerator, DateTime timeStamp) { if (!permissionContext.UserCanPost || !permissionContext.UserCanView) { throw new Exception(String.Format("User {0} can't post to forum {1}.", user.Name, forum.Title)); } newPost.Title = _textParsingService.EscapeHtmlAndCensor(newPost.Title); if (newPost.IsPlainText) { newPost.FullText = _textParsingService.ForumCodeToHtml(newPost.FullText); } else { newPost.FullText = _textParsingService.ClientHtmlToHtml(newPost.FullText); } var urlName = newPost.Title.ToUniqueUrlName(_topicRepository.GetUrlNamesThatStartWith(newPost.Title.ToUrlName())); //var timeStamp = DateTime.UtcNow; var topicID = _topicRepository.Create(forum.ForumID, newPost.Title, 0, 0, user.UserID, user.Name, user.UserID, user.Name, timeStamp, false, false, false, false, urlName); var postID = _postRepository.Create(topicID, 0, ip, true, newPost.IncludeSignature, user.UserID, user.Name, newPost.Title, newPost.FullText, timeStamp, false, user.Name, null, false, 0, newPost.IsAnonymous, newPost.FileUrl); _forumRepository.UpdateLastTimeAndUser(forum.ForumID, timeStamp, user.Name); _forumRepository.IncrementPostAndTopicCount(forum.ForumID); _profileRepository.SetLastPostID(user.UserID, postID); var topic = new Topic(topicID) { ForumID = forum.ForumID, IsClosed = false, IsDeleted = false, IsIndexed = false, IsPinned = false, LastPostName = user.Name, LastPostTime = timeStamp, LastPostUserID = user.UserID, ReplyCount = 0, StartedByName = user.Name, StartedByUserID = user.UserID, Title = newPost.Title, UrlName = urlName, ViewCount = 0 }; // <a href="{0}">{1}</a> started a new topic: <a href="{2}">{3}</a> var topicLink = topicLinkGenerator(topic); var message = String.Format(Resources.NewPostPublishMessage, userUrl, user.Name, topicLink, topic.Title); var forumHasViewRestrictions = _forumRepository.GetForumViewRoles(forum.ForumID).Count > 0; _eventPublisher.ProcessEvent(message, user, EventDefinitionService.StaticEventIDs.NewTopic, forumHasViewRestrictions); _eventPublisher.ProcessEvent(String.Empty, user, EventDefinitionService.StaticEventIDs.NewPost, true); forum = _forumRepository.Get(forum.ForumID); _broker.NotifyForumUpdate(forum); _broker.NotifyTopicUpdate(topic, forum, topicLink); return(topic); }
public void EditUser(User targetUser, UserEdit userEdit, bool removeAvatar, bool removePhoto, HttpPostedFileBase avatarFile, HttpPostedFileBase photoFile, string ip, User user) { if (!String.IsNullOrWhiteSpace(userEdit.NewEmail)) { ChangeEmail(targetUser, userEdit.NewEmail, user, ip, userEdit.IsApproved); } if (!String.IsNullOrWhiteSpace(userEdit.NewPassword)) { SetPassword(targetUser, userEdit.NewPassword, ip, user); } if (targetUser.IsApproved != userEdit.IsApproved) { UpdateIsApproved(targetUser, userEdit.IsApproved, user, ip); } var profile = _profileRepository.GetProfile(targetUser.UserID); profile.IsSubscribed = userEdit.IsSubscribed; profile.ShowDetails = userEdit.ShowDetails; profile.IsPlainText = userEdit.IsPlainText; profile.HideVanity = userEdit.HideVanity; profile.TimeZone = userEdit.TimeZone; profile.IsDaylightSaving = userEdit.IsDaylightSaving; profile.Signature = _textParsingService.ForumCodeToHtml(userEdit.Signature); profile.Location = userEdit.Location; profile.Dob = userEdit.Dob; profile.Web = userEdit.Web; profile.Aim = userEdit.Aim; profile.Icq = userEdit.Icq; profile.YahooMessenger = userEdit.YahooMessenger; profile.Facebook = userEdit.Facebook; profile.Twitter = userEdit.Twitter; if (removeAvatar) { profile.AvatarID = null; } if (removePhoto) { profile.ImageID = null; } _profileRepository.Update(profile); var newRoles = userEdit.Roles ?? new string[0]; _roleRepository.ReplaceUserRoles(targetUser.UserID, newRoles); foreach (var role in targetUser.Roles) { if (!newRoles.Contains(role)) { _securityLogService.CreateLogEntry(user, targetUser, ip, role, SecurityLogType.UserRemovedFromRole); } } foreach (var role in newRoles) { if (!targetUser.Roles.Contains(role)) { _securityLogService.CreateLogEntry(user, targetUser, ip, role, SecurityLogType.UserAddedToRole); } } if (avatarFile != null && avatarFile.ContentLength > 0) { var avatarID = _userAvatarRepository.SaveNewAvatar(targetUser.UserID, avatarFile.GetBytes(), DateTime.UtcNow); profile.AvatarID = avatarID; _profileRepository.Update(profile); } if (photoFile != null && photoFile.ContentLength > 0) { var imageID = _userImageRepository.SaveNewImage(targetUser.UserID, 0, true, photoFile.GetBytes(), DateTime.UtcNow); profile.ImageID = imageID; _profileRepository.Update(profile); } }
public string GenerateParsedTextPreview(string text, bool isPlainText) { var result = isPlainText ? _textParsingService.ForumCodeToHtml(text) : _textParsingService.ClientHtmlToHtml(text); return(result); }
public async Task <BasicServiceResponse <Topic> > PostNewTopic(User user, NewPost newPost, string ip, string userUrl, Func <Topic, string> topicLinkGenerator, Func <Topic, string> redirectLinkGenerator) { if (user == null) { return(GetPostFailMessage(Resources.LoginToPost)); } var forum = await _forumRepository.Get(newPost.ItemID); if (forum == null) { throw new Exception($"Forum {newPost.ItemID} not found"); } var permissionContext = await _forumPermissionService.GetPermissionContext(forum, user); if (!permissionContext.UserCanView) { return(GetPostFailMessage(Resources.ForumNoView)); } if (!permissionContext.UserCanPost) { return(GetPostFailMessage(Resources.ForumNoPost)); } newPost.FullText = newPost.IsPlainText ? _textParsingService.ForumCodeToHtml(newPost.FullText) : _textParsingService.ClientHtmlToHtml(newPost.FullText); if (await IsNewPostDupeOrInTimeLimit(newPost.FullText, user)) { return(GetPostFailMessage(string.Format(Resources.PostWait, _settingsManager.Current.MinimumSecondsBetweenPosts))); } if (string.IsNullOrWhiteSpace(newPost.FullText) || string.IsNullOrWhiteSpace(newPost.Title)) { return(GetPostFailMessage(Resources.PostEmpty)); } newPost.Title = _textParsingService.Censor(newPost.Title); var urlName = newPost.Title.ToUniqueUrlName(await _topicRepository.GetUrlNamesThatStartWith(newPost.Title.ToUrlName())); var timeStamp = DateTime.UtcNow; var topicID = await _topicRepository.Create(forum.ForumID, newPost.Title, 0, 0, user.UserID, user.Name, user.UserID, user.Name, timeStamp, false, false, false, urlName); var postID = await _postRepository.Create(topicID, 0, ip, true, newPost.IncludeSignature, user.UserID, user.Name, newPost.Title, newPost.FullText, timeStamp, false, user.Name, null, false, 0); await _forumRepository.UpdateLastTimeAndUser(forum.ForumID, timeStamp, user.Name); await _forumRepository.IncrementPostAndTopicCount(forum.ForumID); await _profileRepository.SetLastPostID(user.UserID, postID); var topic = new Topic { TopicID = topicID, ForumID = forum.ForumID, IsClosed = false, IsDeleted = false, IsPinned = false, LastPostName = user.Name, LastPostTime = timeStamp, LastPostUserID = user.UserID, ReplyCount = 0, StartedByName = user.Name, StartedByUserID = user.UserID, Title = newPost.Title, UrlName = urlName, ViewCount = 0 }; // <a href="{0}">{1}</a> started a new topic: <a href="{2}">{3}</a> var topicLink = topicLinkGenerator(topic); var message = string.Format(Resources.NewPostPublishMessage, userUrl, user.Name, topicLink, topic.Title); var forumHasViewRestrictions = _forumRepository.GetForumViewRoles(forum.ForumID).Result.Count > 0; await _eventPublisher.ProcessEvent(message, user, EventDefinitionService.StaticEventIDs.NewTopic, forumHasViewRestrictions); await _eventPublisher.ProcessEvent(string.Empty, user, EventDefinitionService.StaticEventIDs.NewPost, true); forum = await _forumRepository.Get(forum.ForumID); _broker.NotifyForumUpdate(forum); _broker.NotifyTopicUpdate(topic, forum, topicLink); await _searchIndexQueueRepository.Enqueue(new SearchIndexPayload { TenantID = _tenantService.GetTenant(), TopicID = topic.TopicID }); _topicViewCountService.SetViewedTopic(topic); var redirectLink = redirectLinkGenerator(topic); return(new BasicServiceResponse <Topic> { Data = topic, Message = null, Redirect = redirectLink, IsSuccessful = true }); }