OLD | NEW |
(Empty) | |
| 1 # Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is govered by a BSD-style |
| 3 # license that can be found in the LICENSE file or at |
| 4 # https://developers.google.com/open-source/licenses/bsd |
| 5 |
| 6 """Classes that implement spam flagging features. |
| 7 """ |
| 8 |
| 9 import httplib |
| 10 import logging |
| 11 |
| 12 from framework import actionlimit |
| 13 from framework import framework_helpers |
| 14 from framework import paginate |
| 15 from framework import permissions |
| 16 from framework import urls |
| 17 from framework import servlet |
| 18 from framework import template_helpers |
| 19 from framework import xsrf |
| 20 from tracker import spam_helpers |
| 21 |
| 22 class FlagSpamForm(servlet.Servlet): |
| 23 """Flag or un-flag the specified issue/comment for the logged in user.""" |
| 24 |
| 25 _CAPTCHA_ACTION_TYPES = [actionlimit.FLAG_SPAM] |
| 26 |
| 27 def ProcessFormData(self, mr, post_data): |
| 28 """Process the flagging request. |
| 29 Args: |
| 30 mr: commonly used info parsed from the request. |
| 31 |
| 32 Returns: |
| 33 A redirect URL to either the original issue page or to issue list. |
| 34 """ |
| 35 comment_id = post_data.get('comment_id', 0) or None |
| 36 |
| 37 flagged_spam = post_data['spam'] == 'true' |
| 38 |
| 39 flag_count = 1 |
| 40 if mr.local_id_list is not None: |
| 41 flag_count = len(mr.local_id_list) |
| 42 |
| 43 self.CountRateLimitedActions(mr, {actionlimit.FLAG_SPAM: flag_count}) |
| 44 # Has the side effect of checking soft limits and returning an error page |
| 45 # when the user hits the limit. |
| 46 self.GatherCaptchaData(mr) |
| 47 |
| 48 # Check perms here for both the single Issue and Comment case. |
| 49 if mr.local_id is not None: |
| 50 issue = self.services.issue.GetIssueByLocalID( |
| 51 mr.cnxn, mr.project_id, mr.local_id) |
| 52 perms = self.MakePagePerms( |
| 53 mr, issue, permissions.FLAG_SPAM, permissions.VERDICT_SPAM) |
| 54 if not perms.FlagSpam: |
| 55 logging.error('User %d not allowed to flag %d/%r as spam.' % ( |
| 56 mr.auth.user_id, mr.local_id, comment_id)) |
| 57 raise permissions.PermissionException( |
| 58 'User lacks permission to flag spam') |
| 59 |
| 60 # TODO: Check for exceeding the max number of flags, issue verdict then too. |
| 61 |
| 62 issue_list = [] |
| 63 # Flag a single comment. |
| 64 if comment_id is not None: |
| 65 comment = self.services.issue.GetComment(mr.cnxn, comment_id) |
| 66 print 'flagged_spam: %s' % flagged_spam |
| 67 if perms.VerdictSpam: |
| 68 self.services.spam.RecordManualCommentVerdict(mr.cnxn, |
| 69 self.services.issue, self.services.user, comment_id, |
| 70 int(post_data['sequence_num']), mr.auth.user_id, flagged_spam) |
| 71 |
| 72 self.services.spam.FlagComment(mr.cnxn, issue.issue_id, comment.id, |
| 73 comment.user_id, mr.auth.user_id, flagged_spam) |
| 74 |
| 75 elif mr.local_id is not None: |
| 76 issue_list = [issue] |
| 77 elif mr.local_id_list is not None: |
| 78 issue_list = self.services.issue.GetIssuesByLocalIDs( |
| 79 mr.cnxn, mr.project_id, mr.local_id_list) |
| 80 else: |
| 81 self.response.status = httplib.BAD_REQUEST |
| 82 return |
| 83 |
| 84 flag_issues = [] |
| 85 verdict_issues = [] |
| 86 for issue in issue_list: |
| 87 perms = self.MakePagePerms(mr, issue, permissions.FLAG_SPAM, |
| 88 permissions.VERDICT_SPAM) |
| 89 if perms.VerdictSpam: |
| 90 verdict_issues.append(issue) |
| 91 if perms.FlagSpam: |
| 92 flag_issues.append(issue) |
| 93 |
| 94 if len(verdict_issues) > 0: |
| 95 self.services.spam.RecordManualIssueVerdicts(mr.cnxn, self.services.issue, |
| 96 verdict_issues, mr.auth.user_id, flagged_spam) |
| 97 |
| 98 if len(flag_issues) > 0: |
| 99 self.services.spam.FlagIssues(mr.cnxn, self.services.issue, flag_issues, |
| 100 mr.auth.user_id, flagged_spam) |
| 101 |
| 102 # TODO(seanmccullough): Make this an ajax request instead of a redirect. |
| 103 if mr.local_id_list is not None: |
| 104 return framework_helpers.FormatAbsoluteURL(mr, urls.ISSUE_LIST) |
| 105 else: |
| 106 return framework_helpers.FormatAbsoluteURL( |
| 107 mr, urls.ISSUE_DETAIL, id=mr.local_id) |
| 108 |
| 109 |
| 110 class ModerationQueue(servlet.Servlet): |
| 111 _PAGE_TEMPLATE = 'tracker/spam-moderation-queue.ezt' |
| 112 |
| 113 def ProcessFormData(self, mr, post_data): |
| 114 if not self.CheckPerm(mr, permissions.MODERATE_SPAM): |
| 115 raise permissions.PermissionException() |
| 116 |
| 117 issue_local_ids = [int(iid) for iid in post_data.getall("issue_local_id")] |
| 118 mark_spam = "mark_spam" in post_data |
| 119 |
| 120 issues = self.services.issue.GetIssuesByLocalIDs(mr.cnxn, |
| 121 mr.project.project_id, issue_local_ids) |
| 122 |
| 123 self.services.spam.RecordManualIssueVerdicts(mr.cnxn, |
| 124 self.services.issue, issues, mr.auth.user_id, mark_spam) |
| 125 |
| 126 return framework_helpers.FormatAbsoluteURL(mr, urls.SPAM_MODERATION_QUEUE) |
| 127 |
| 128 def GatherPageData(self, mr): |
| 129 if not self.CheckPerm(mr, permissions.MODERATE_SPAM): |
| 130 raise permissions.PermissionException() |
| 131 |
| 132 page_perms = self.MakePagePerms( |
| 133 mr, None, permissions.MODERATE_SPAM, |
| 134 permissions.EDIT_ISSUE, permissions.CREATE_ISSUE, |
| 135 permissions.SET_STAR) |
| 136 |
| 137 queue_items, total_count = self.services.spam.GetModerationQueue(mr.cnxn, |
| 138 self.services.issue, mr.project.project_id, mr.start, mr.num) |
| 139 |
| 140 decorated_queue = spam_helpers.DecorateModerationQueue(mr.cnxn, |
| 141 self.services.issue, self.services.spam, self.services.user, |
| 142 queue_items) |
| 143 |
| 144 p = paginate.ArtifactPagination(mr, [], mr.num, urls.SPAM_MODERATION_QUEUE, |
| 145 total_count) |
| 146 |
| 147 return { |
| 148 'spam_queue': decorated_queue, |
| 149 'projectname': mr.project.project_name, |
| 150 'pagination': p, |
| 151 'page_perms': page_perms, |
| 152 'moderate_spam_token': xsrf.GenerateToken( |
| 153 mr.auth.user_id, '/p/%s%s.do' % ( |
| 154 mr.project_name, urls.SPAM_MODERATION_QUEUE)), |
| 155 } |
OLD | NEW |