public virtual StoryCreateResult Create(IUser byUser, string url, string title, string category, string description, string tags, string userIPAddress, string userAgent, string urlReferer, NameValueCollection serverVariables, Func <IStory, string> buildDetailUrl) { StoryCreateResult result = ValidateCreate(byUser, url, title, category, description, userIPAddress, userAgent); if (result == null) { if (_contentService.IsRestricted(url)) { result = new StoryCreateResult { ErrorMessage = "Podany url jest zablokowany." }; } } if (result == null) { using (IUnitOfWork unitOfWork = UnitOfWork.Begin()) { IStory alreadyExists = _storyRepository.FindByUrl(url); if (alreadyExists != null) { return(new StoryCreateResult { ErrorMessage = "Artykuł z danym url już istnieje.", DetailUrl = buildDetailUrl(alreadyExists) }); } ICategory storyCategory = _categoryRepository.FindByUniqueName(category); if (storyCategory == null) { return(new StoryCreateResult { ErrorMessage = "\"{0}\" nie istnieje.".FormatWith(category) }); } if (storyCategory.IsActive == false) { return(new StoryCreateResult { ErrorMessage = "\"{0}\" jest tylko do odczytu.".FormatWith(category) }); } StoryContent content = _contentService.Get(url); if (content == StoryContent.Empty) { return(new StoryCreateResult { ErrorMessage = "Podany Url wydaje się być wadliwy." }); } var splittedTags = tags.NullSafe().Split(','); if (splittedTags.Length == 1) //only one tag { var tag = splittedTags[0].Trim(); if (String.Compare(".net", tag, StringComparison.OrdinalIgnoreCase) == 0 || String.Compare("c#", tag, StringComparison.OrdinalIgnoreCase) == 0) { return(new StoryCreateResult { ErrorMessage = "Proszę, pomyśl chwilę nad lepszymi tagami." }); } } if (splittedTags.Length == 2) //two tags, maybe not .net and C# { var tag1 = splittedTags[0].Trim(); var tag2 = splittedTags[1].Trim(); if ( (String.Compare(".net", tag1, StringComparison.OrdinalIgnoreCase) == 0 && String.Compare("c#", tag2, StringComparison.OrdinalIgnoreCase) == 0) || (String.Compare(".net", tag1, StringComparison.OrdinalIgnoreCase) == 0 && String.Compare("c#", tag2, StringComparison.OrdinalIgnoreCase) == 0) ) { return(new StoryCreateResult { ErrorMessage = "Tagi: .Net i C#. Srsly?" }); } } description = _htmlSanitizer.Sanitize(description); if (!_settings.AllowPossibleSpamStorySubmit && ShouldCheckSpamForUser(byUser)) { result = EnsureNotSpam <StoryCreateResult>(byUser, userIPAddress, userAgent, url, urlReferer, description, "social news", serverVariables, "Artykuł odrzucony: {0}, {1}".FormatWith(url, byUser), "Twój artykuł wydaje się być spamem."); if (result != null) { return(result); } } // If we are here which means story is not spam IStory story = _factory.CreateStory(storyCategory, byUser, userIPAddress, title.StripHtml(), description, url); _storyRepository.Add(story); // The Initial vote; story.Promote(story.CreatedAt, byUser, userIPAddress); // Capture the thumbnail, might speed up the thumbnail generation process _thumbnail.Capture(story.Url); // Subscribe comments by default story.SubscribeComment(byUser); AddTagsToContainers(tags, new ITagContainer[] { story, byUser }); string detailUrl = buildDetailUrl(story); if (_settings.AllowPossibleSpamStorySubmit && _settings.SendMailWhenPossibleSpamStorySubmitted && ShouldCheckSpamForUser(byUser)) { unitOfWork.Commit(); _spamProtection.IsSpam(CreateSpamCheckContent(byUser, userIPAddress, userAgent, url, urlReferer, description, "social news", serverVariables), (source, isSpam) => _spamPostprocessor.Process(source, isSpam, detailUrl, story)); } else { story.Approve(SystemTime.Now()); _eventAggregator.GetEvent <StorySubmitEvent>().Publish(new StorySubmitEventArgs(story, detailUrl)); unitOfWork.Commit(); } result = new StoryCreateResult { NewStory = story, DetailUrl = detailUrl }; } } return(result); }
public void IsSpam_Should_Return_True_For_Comment_When_Weight_Calculators_Return_More_Than_CommentThresold() { _calculator1.Setup(c => c.Calculate(It.IsAny <string>())).Returns(2); _calculator2.Setup(c => c.Calculate(It.IsAny <string>())).Returns(2); _calculator3.Setup(c => c.Calculate(It.IsAny <string>())).Returns(2); var result = _spamProtection.IsSpam(CreateDummyContent(settings.Object.RootUrl + "\\A-Story")); Assert.True(result); }
public virtual StoryCreateResult Create(IUser byUser, string url, string title, string category, string description, string tags, string userIPAddress, string userAgent, string urlReferer, NameValueCollection serverVariables, Func <IStory, string> buildDetailUrl) { StoryCreateResult result = ValidateCreate(byUser, url, title, category, description, userIPAddress, userAgent); if (result == null) { using (IUnitOfWork unitOfWork = UnitOfWork.Get()) { IStory alreadyExists = _storyRepository.FindByUrl(url); if (alreadyExists != null) { return(new StoryCreateResult { ErrorMessage = "Wpis z takim samym url ju¿ istnieje.", DetailUrl = buildDetailUrl(alreadyExists) }); } ICategory storyCategory = _categoryRepository.FindByUniqueName(category); if (storyCategory == null) { return(new StoryCreateResult { ErrorMessage = "\"{0}\" - kategoria nie istnieje.".FormatWith(category) }); } StoryContent content = _contentService.Get(url); if (content == StoryContent.Empty) { return(new StoryCreateResult { ErrorMessage = "Podany url wydaje siê nie byæ poprawnym." }); } description = _htmlSanitizer.Sanitize(description); if (!_settings.AllowPossibleSpamStorySubmit && ShouldCheckSpamForUser(byUser)) { result = EnsureNotSpam <StoryCreateResult>(byUser, userIPAddress, userAgent, url, urlReferer, description, "social news", serverVariables, "Spamowy wpis odrzucony : {0}, {1}".FormatWith(url, byUser), "Twój wpis wydaje siê byæ spamem."); if (result != null) { return(result); } } // If we are here which means story is not spam IStory story = _factory.CreateStory(storyCategory, byUser, userIPAddress, title.StripHtml(), description, url); _storyRepository.Add(story); // The Initial vote; story.Promote(story.CreatedAt, byUser, userIPAddress); // Capture the thumbnail, might speed up the thumbnail generation process _thumbnail.Capture(story.Url); // Subscribe comments by default story.SubscribeComment(byUser); AddTagsToContainers(tags, new ITagContainer[] { story, byUser }); _userScoreService.StorySubmitted(byUser); string detailUrl = buildDetailUrl(story); if (_settings.AllowPossibleSpamStorySubmit && _settings.SendMailWhenPossibleSpamStorySubmitted && ShouldCheckSpamForUser(byUser)) { unitOfWork.Commit(); _spamProtection.IsSpam(CreateSpamCheckContent(byUser, userIPAddress, userAgent, url, urlReferer, description, "social news", serverVariables), (source, isSpam) => _spamPostprocessor.Process(source, isSpam, detailUrl, story)); } else { story.Approve(SystemTime.Now()); } // Ping the Story PingStory(content, story, detailUrl); result = new StoryCreateResult { NewStory = story, DetailUrl = detailUrl }; } } return(result); }
public void Api_Key_Should_Be_Valid() { _httpForm.Setup(h => h.Post(It.Is <HttpFormPostRequest>(r => r.Url == ApiKeyCheckUrl))).Returns(new HttpFormResponse { Response = ValidApiKeyResponse }); _httpForm.Setup(h => h.Post(It.Is <HttpFormPostRequest>(r => r.Url == CommentCheckUrl))).Returns(new HttpFormResponse { Response = NotSpamCommentResponse }); Assert.DoesNotThrow(() => _spamProtection.IsSpam(CreateDummyContent())); }
public void Api_Key_Should_Be_Valid() { _httpForm.Expect(h => h.Post(ApiKeyCheckUrl, It.IsAny <NameValueCollection>())).Returns(ValidApiKeyResponse); _httpForm.Expect(h => h.Post(CommentCheckUrl, It.IsAny <NameValueCollection>())).Returns(NotSpamCommentResponse); Assert.DoesNotThrow(() => _spamProtection.IsSpam(CreateDummyContent())); }
public virtual StoryCreateResult Create(IUser byUser, string url, string title, string category, string description, string tags, string userIPAddress, string userAgent, string urlReferer, NameValueCollection serverVariables, Func <IStory, string> buildDetailUrl) { StoryCreateResult result = ValidateCreate(byUser, url, title, category, description, userIPAddress, userAgent); if (result == null) { if (_contentService.IsRestricted(url)) { result = new StoryCreateResult { ErrorMessage = "Specifed url has match with our banned url list." }; } } if (result == null) { using (IUnitOfWork unitOfWork = UnitOfWork.Begin()) { IStory alreadyExists = _storyRepository.FindByUrl(url); if (alreadyExists != null) { return(new StoryCreateResult { ErrorMessage = "Story with the same url already exists.", DetailUrl = buildDetailUrl(alreadyExists) }); } ICategory storyCategory = _categoryRepository.FindByUniqueName(category); if (storyCategory == null) { return(new StoryCreateResult { ErrorMessage = "\"{0}\" category does not exist.".FormatWith(category) }); } StoryContent content = _contentService.Get(url); if (content == StoryContent.Empty) { return(new StoryCreateResult { ErrorMessage = "Specified url appears to be broken." }); } description = _htmlSanitizer.Sanitize(description); if (!_settings.AllowPossibleSpamStorySubmit && ShouldCheckSpamForUser(byUser)) { result = EnsureNotSpam <StoryCreateResult>(byUser, userIPAddress, userAgent, url, urlReferer, description, "social news", serverVariables, "Spam story rejected : {0}, {1}".FormatWith(url, byUser), "Your story appears to be a spam."); if (result != null) { return(result); } } // If we are here which means story is not spam IStory story = _factory.CreateStory(storyCategory, byUser, userIPAddress, title.StripHtml(), description, url); _storyRepository.Add(story); // The Initial vote; story.Promote(story.CreatedAt, byUser, userIPAddress); // Capture the thumbnail, might speed up the thumbnail generation process _thumbnail.Capture(story.Url); // Subscribe comments by default story.SubscribeComment(byUser); AddTagsToContainers(tags, new ITagContainer[] { story, byUser }); string detailUrl = buildDetailUrl(story); if (_settings.AllowPossibleSpamStorySubmit && _settings.SendMailWhenPossibleSpamStorySubmitted && ShouldCheckSpamForUser(byUser)) { unitOfWork.Commit(); _spamProtection.IsSpam(CreateSpamCheckContent(byUser, userIPAddress, userAgent, url, urlReferer, description, "social news", serverVariables), (source, isSpam) => _spamPostprocessor.Process(source, isSpam, detailUrl, story)); } else { story.Approve(SystemTime.Now()); _eventAggregator.GetEvent <StorySubmitEvent>().Publish(new StorySubmitEventArgs(story, detailUrl)); unitOfWork.Commit(); } result = new StoryCreateResult { NewStory = story, DetailUrl = detailUrl }; } } return(result); }