public async Task SendPrivateMessageFromSubverse() { var id = Guid.NewGuid().ToString(); var sender = "unit"; var recipient = USERNAMES.User100CCP; var user = TestHelper.SetPrincipal(sender); var message = new Domain.Models.SendMessage() { Sender = $"v/{sender}", Recipient = recipient, Subject = id, Message = id }; var cmd = new SendMessageCommand(message).SetUserContext(user); var r = await cmd.Execute(); VoatAssert.IsValid(r); using (var db = new VoatDataContext()) { var record = (from x in db.Message where x.Sender == sender && x.SenderType == (int)Domain.Models.IdentityType.Subverse && x.Recipient == recipient && x.RecipientType == (int)Domain.Models.IdentityType.User && x.Title == id && x.Content == id select x).FirstOrDefault(); Assert.IsNotNull(record, "Can not find message in database"); } }
public async Task SendPrivateMessageFromSubverse() { var id = Guid.NewGuid().ToString(); var sender = "unit"; var recipient = "User100CCP"; TestHelper.SetPrincipal("unit"); var message = new Domain.Models.SendMessage() { Sender = $"v/{sender}", Recipient = recipient, Subject = id, Message = id }; var cmd = new SendMessageCommand(message); var response = await cmd.Execute(); Assert.IsNotNull(response, "Response is null"); Assert.IsTrue(response.Success, response.Status.ToString()); using (var db = new voatEntities()) { var record = (from x in db.Messages where x.Sender == sender && x.SenderType == (int)Domain.Models.IdentityType.Subverse && x.Recipient == recipient && x.RecipientType == (int)Domain.Models.IdentityType.User && x.Title == id && x.Content == id select x).FirstOrDefault(); Assert.IsNotNull(record, "Can not find message in database"); } }
public async Task SendPrivateMessage() { var id = Guid.NewGuid().ToString(); var sender = "User100CCP"; var recipient = "anon"; TestHelper.SetPrincipal(sender); var message = new Domain.Models.SendMessage() { //Sender = User.Identity.Name, Recipient = recipient, Subject = id, Message = id }; var cmd = new SendMessageCommand(message); var response = await cmd.Execute(); Assert.IsNotNull(response, "Response is null"); Assert.IsTrue(response.Success, response.Status.ToString()); using (var db = new voatEntities()) { var record = (from x in db.Messages where x.Recipient == recipient && x.Sender == sender && x.Title == id && x.Content == id && x.Subverse == null && x.CommentID == null && x.SubmissionID == null && x.Type == (int)Domain.Models.MessageType.Sent //&& x.Direction == (int)Domain.Models.MessageDirection.OutBound select x).FirstOrDefault(); Assert.IsNotNull(record, "Can not find outbound in database"); record = (from x in db.Messages where x.Recipient == recipient && x.Sender == sender && x.Title == id && x.Content == id && x.Subverse == null && x.CommentID == null && x.SubmissionID == null && x.Type == (int)Domain.Models.MessageType.Private //&& x.Direction == (int)Domain.Models.MessageDirection.InBound select x).FirstOrDefault(); Assert.IsNotNull(record, "Can not find inbound in database"); } }
public async Task SendPrivateMessage() { var id = Guid.NewGuid().ToString(); var sender = USERNAMES.User100CCP; var recipient = USERNAMES.Anon; var user = TestHelper.SetPrincipal(sender); var message = new Domain.Models.SendMessage() { //Sender = User.Identity.Name, Recipient = recipient, Subject = id, Message = id }; var cmd = new SendMessageCommand(message).SetUserContext(user); var response = await cmd.Execute(); VoatAssert.IsValid(response); using (var db = new VoatDataContext()) { var record = (from x in db.Message where x.Recipient == recipient && x.Sender == sender && x.Title == id && x.Content == id && x.Subverse == null && x.CommentID == null && x.SubmissionID == null && x.Type == (int)Domain.Models.MessageType.Sent //&& x.Direction == (int)Domain.Models.MessageDirection.OutBound select x).FirstOrDefault(); Assert.IsNotNull(record, "Can not find outbound in database"); record = (from x in db.Message where x.Recipient == recipient && x.Sender == sender && x.Title == id && x.Content == id && x.Subverse == null && x.CommentID == null && x.SubmissionID == null && x.Type == (int)Domain.Models.MessageType.Private //&& x.Direction == (int)Domain.Models.MessageDirection.InBound select x).FirstOrDefault(); Assert.IsNotNull(record, "Can not find inbound in database"); } }
public async Task SendPrivateMessageDeniedCCP() { var id = Guid.NewGuid().ToString(); var sender = "unit"; var recipient = "anon"; TestHelper.SetPrincipal(sender); var message = new Domain.Models.SendMessage() { //Sender = User.Identity.Name, Recipient = recipient, Subject = id, Message = id }; var cmd = new SendMessageCommand(message); var response = await cmd.Execute(); Assert.IsNotNull(response, "Response is null"); Assert.IsFalse(response.Success, "Expecting not success response"); }
public async Task SendPrivateMessageDeniedCCP() { var id = Guid.NewGuid().ToString(); var sender = USERNAMES.Unit; var recipient = USERNAMES.Anon; var user = TestHelper.SetPrincipal(sender); var message = new Domain.Models.SendMessage() { //Sender = User.Identity.Name, Recipient = recipient, Subject = id, Message = id }; var cmd = new SendMessageCommand(message).SetUserContext(user); var response = await cmd.Execute(); VoatAssert.IsValid(response, Status.Ignored); Assert.IsNotNull(response, "Response is null"); Assert.IsFalse(response.Success, "Expecting not success response"); }
public async Task <ActionResult> AcceptModeratorInvitation(int invitationId) { int maximumOwnedSubs = VoatSettings.Instance.MaximumOwnedSubs; //TODO: These errors are not friendly - please update to redirect or something // check if there is an invitation for this user with this id var userInvitation = _db.ModeratorInvitation.Find(invitationId); if (userInvitation == null) { return(ErrorView(new ErrorViewModel() { Title = "Moderator Invite Not Found", Description = "The moderator invite is no longer valid", Footer = "Where did it go?" })); //return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } // check if logged in user is actually the invited user if (!User.Identity.Name.IsEqual(userInvitation.Recipient)) { return(ErrorView(ErrorViewModel.GetErrorViewModel(HttpStatusCode.Unauthorized))); //return new HttpStatusCodeResult(HttpStatusCode.Unauthorized); } // check if user is over modding limits var amountOfSubsUserModerates = _db.SubverseModerator.Where(s => s.UserName.ToLower() == User.Identity.Name.ToLower()); if (amountOfSubsUserModerates.Any()) { if (amountOfSubsUserModerates.Count() >= maximumOwnedSubs) { return(ErrorView(new ErrorViewModel() { Title = "Maximum Moderation Level Exceeded", Description = $"Sorry, you can not own or moderate more than {maximumOwnedSubs} subverses.", Footer = "That's too bad" })); } } // check if subverse exists var subverse = _db.Subverse.FirstOrDefault(s => s.Name.ToLower() == userInvitation.Subverse.ToLower()); if (subverse == null) { return(ErrorView(ErrorViewModel.GetErrorViewModel(ErrorType.SubverseNotFound))); //return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } // check if user is already a moderator of this sub var userModerating = _db.SubverseModerator.Where(s => s.Subverse.ToLower() == userInvitation.Subverse.ToLower() && s.UserName.ToLower() == User.Identity.Name.ToLower()); if (userModerating.Any()) { _db.ModeratorInvitation.Remove(userInvitation); _db.SaveChanges(); return(ErrorView(new ErrorViewModel() { Title = "You = Moderator * 2?", Description = "You are currently already a moderator of this subverse", Footer = "How much power do you want?" })); //return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } // add user as moderator as specified in invitation var subAdm = new SubverseModerator { Subverse = subverse.Name, UserName = UserHelper.OriginalUsername(userInvitation.Recipient), Power = userInvitation.Power, CreatedBy = UserHelper.OriginalUsername(userInvitation.CreatedBy), CreationDate = Repository.CurrentDate }; _db.SubverseModerator.Add(subAdm); // notify sender that user has accepted the invitation var message = new Domain.Models.SendMessage() { Sender = $"v/{subverse.Name}", Subject = $"Moderator invitation for v/{subverse.Name} accepted", Recipient = userInvitation.CreatedBy, Message = $"User {User.Identity.Name} has accepted your invitation to moderate subverse v/{subverse.Name}." }; var cmd = new SendMessageCommand(message).SetUserContext(User); await cmd.Execute(); //clear mod cache CacheHandler.Instance.Remove(CachingKey.SubverseModerators(subverse.Name)); // delete the invitation from database _db.ModeratorInvitation.Remove(userInvitation); _db.SaveChanges(); return(RedirectToAction("Update", "SubverseModeration", new { subverse = subverse.Name })); //return Update(subverse.Name); }
public async Task <ActionResult> ReportSubmission(int id) { var s = _db.Submissions.Find(id); if (s != null) { // prepare report headers var subverse = s.Subverse; //don't allow banned users to send reports if (!UserHelper.IsUserBannedFromSubverse(User.Identity.Name, subverse) && !UserHelper.IsUserGloballyBanned(User.Identity.Name)) { var reportTimeStamp = Repository.CurrentDate.ToString(CultureInfo.InvariantCulture); try { string cacheKeyReport = CachingKey.ReportKey(ContentType.Submission, id); //see if comment has been reported before if (CacheHandler.Instance.Retrieve <object>(cacheKeyReport) == null) { //mark comment in cache as having been reported CacheHandler.Instance.Register(cacheKeyReport, new Func <object>(() => { return(new object()); }), contentReportTimeOut, -1); string userName = User.Identity.Name; string cacheKeyUserReportCount = CachingKey.ReportCountUserKey(ContentType.Submission, userName); int reportsPerUserThreshold = 5; var reportCountViaUser = CacheHandler.Instance.Retrieve <int?>(cacheKeyUserReportCount); //ensure user is below reporting threshold if (reportCountViaUser == null || reportCountViaUser.Value <= reportsPerUserThreshold) { //add or update cache with current user reports if (reportCountViaUser.HasValue) { CacheHandler.Instance.Replace <int?>(cacheKeyUserReportCount, new Func <int?, int?>((x) => { return((int?)(x.Value + 1)); }), contentUserCountTimeOut); } else { CacheHandler.Instance.Register <int?>(cacheKeyUserReportCount, new Func <int?>(() => { return((int?)1); }), contentUserCountTimeOut, -1); } string body = String.Format("This submission has been reported:\r\n\r\nhttps://voat.co/v/{0}/{1}\r\n\r\n\r\nReport Spammers to v/ReportSpammers.", s.Subverse, s.ID); var message = new Domain.Models.SendMessage() { Sender = s.IsAnonymized ? "Anon" : userName, Recipient = $"v/{subverse}", Subject = "Submission Spam Report", Message = body }; var cmd = new SendMessageCommand(message, true); await cmd.Execute(); //MesssagingUtility.SendPrivateMessage(commentToReport.IsAnonymized ? "Anon" : userName, String.Format("v/{0}", commentSubverse), "Comment Spam Report", body); } } } catch (Exception) { return(new HttpStatusCodeResult(HttpStatusCode.ServiceUnavailable, "Service Unavailable")); } } } else { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Bad Request")); } return(new HttpStatusCodeResult(HttpStatusCode.OK, "OK")); }
public async Task SendPrivateMessageToSubverse() { var id = Guid.NewGuid().ToString(); var sender = "User100CCP"; var subverse = "unit"; //ensure v/Unit has moderators using (var db = new voatEntities()) { var record = (from x in db.SubverseModerators where x.Subverse == subverse select x).ToList(); var mod = "anon"; if (!record.Any(x => x.UserName == mod)) { db.SubverseModerators.Add(new SubverseModerator() { UserName = mod, Subverse = subverse, CreatedBy = "UnitTesting", CreationDate = DateTime.UtcNow, Power = 1 }); } mod = "unit"; if (!record.Any(x => x.UserName == mod)) { db.SubverseModerators.Add(new SubverseModerator() { UserName = mod, Subverse = subverse, CreatedBy = "UnitTesting", CreationDate = DateTime.UtcNow, Power = 1 }); } db.SaveChanges(); } TestHelper.SetPrincipal(sender); var message = new Domain.Models.SendMessage() { //Sender = User.Identity.Name, Recipient = $"v/{subverse}", Subject = id, Message = id }; var cmd = new SendMessageCommand(message); var response = await cmd.Execute(); Assert.IsNotNull(response, "Response is null"); Assert.IsTrue(response.Success, response.Status.ToString()); using (var db = new voatEntities()) { var record = (from x in db.Messages where x.Sender == sender && x.SenderType == (int)Domain.Models.IdentityType.User && x.Recipient == subverse && x.RecipientType == (int)Domain.Models.IdentityType.Subverse && x.Title == id && x.Content == id select x).ToList(); Assert.IsNotNull(record, "Can not find message in database"); Assert.AreEqual(2, record.Count, "Expecting 2 PMs"); } }
public async Task SendPrivateMessageReply() { var id = Guid.NewGuid().ToString(); var sender = USERNAMES.User100CCP; var recipient = "anon"; var user = TestHelper.SetPrincipal(sender); var message = new Domain.Models.SendMessage() { //Sender = User.Identity.Name, Recipient = recipient, Subject = id, Message = id }; var cmd = new SendMessageCommand(message).SetUserContext(user); var response = await cmd.Execute(); VoatAssert.IsValid(response); var firstMessage = response.Response; var idToRespondTo = 0; //Ensure first msg is in db using (var db = new VoatDataContext()) { var record = (from x in db.Message where x.Recipient == recipient && x.Sender == sender && x.Title == id && x.Content == id && x.Subverse == null && x.CommentID == null && x.SubmissionID == null && x.Type == (int)Domain.Models.MessageType.Sent //&& x.Direction == (int)Domain.Models.MessageDirection.OutBound select x).FirstOrDefault(); Assert.IsNotNull(record, "Can not find sent in database"); record = (from x in db.Message where x.Recipient == recipient && x.Sender == sender && x.Title == id && x.Content == id && x.Subverse == null && x.CommentID == null && x.SubmissionID == null && x.Type == (int)Domain.Models.MessageType.Private //&& x.Direction == (int)Domain.Models.MessageDirection.InBound select x).FirstOrDefault(); Assert.IsNotNull(record, "Can not find message in database"); idToRespondTo = record.ID; } //reply user = TestHelper.SetPrincipal(recipient); var replyCmd = new SendMessageReplyCommand(idToRespondTo, $"Reply to {idToRespondTo.ToString()}").SetUserContext(user); var replyResponse = await replyCmd.Execute(); VoatAssert.IsValid(replyResponse); var replyMessage = replyResponse.Response; Assert.AreEqual(idToRespondTo, replyMessage.ParentID); }