コード例 #1
0
ファイル: PostService.cs プロジェクト: freeboygirl/POPForums
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        // 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 })
            }));
        }
コード例 #4
0
        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
            });
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
            }
        }
コード例 #8
0
ファイル: PostService.cs プロジェクト: omidnasri/POPForums
        public string GenerateParsedTextPreview(string text, bool isPlainText)
        {
            var result = isPlainText ? _textParsingService.ForumCodeToHtml(text) : _textParsingService.ClientHtmlToHtml(text);

            return(result);
        }
コード例 #9
0
        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
            });
        }