Ticket #2706: tracdiscussion-anti-spam-patch.diff

File tracdiscussion-anti-spam-patch.diff, 3.9 kB (added by mickem, 9 months ago)

anti-spam-fiter-path

  • setup.py

    old new  
    1414    'TracDiscussion.timeline = tracdiscussion.timeline', 
    1515    'TracDiscussion.admin = tracdiscussion.admin', 
    1616    'TracDiscussion.search = tracdiscussion.search', 
     17    'TracDiscussion.spam = tracdiscussion.spam', 
    1718    'TracDiscussion.notification = tracdiscussion.notification']}, 
    1819  install_requires = ['TracWebAdmin'], 
    1920  keywords = 'trac discussion', 
  • tracdiscussion/core.py

    old new  
    1717    implements(INavigationContributor, IRequestHandler, ITemplateProvider, 
    1818      IPermissionRequestor) 
    1919 
     20    discussion_manipulators = ExtensionPoint(IDiscussionManipulator) 
     21 
    2022    title = Option('discussion', 'title', 'Discussion', 
    2123      'Main navigation bar button title.') 
    2224 
  • tracdiscussion/api.py

    old new  
    99from trac.util.text import to_unicode 
    1010import time 
    1111 
     12class InvalidDiscussionPost(TracError): 
     13    """Exception raised when a ticket fails validation.""" 
     14 
     15class IDiscussionManipulator(Interface): 
     16    """Miscellaneous manipulation of forum posts.""" 
     17 
     18    def validate_message(self, req, author, body): 
     19        """Validate a new message post in a topic. 
     20 
     21        Must return a list of `(field, message)` tuples, one for each problem 
     22        detected. `field` can be `None` to indicate an overall problem with the 
     23        ticket. Therefore, a return value of `[]` means everything is OK.""" 
     24 
     25    def validate_topic(self, req, author, subject, body): 
     26        """Validate a new topic. 
     27 
     28        Must return a list of `(field, message)` tuples, one for each problem 
     29        detected. `field` can be `None` to indicate an overall problem with the 
     30        ticket. Therefore, a return value of `[]` means everything is OK.""" 
     31 
     32 
    1233class DiscussionApi(object): 
    1334    def __init__(self, component, req): 
    1435        self.env = component.env 
    1536        self.log = component.log 
     37        self.discussion_manipulators = component.discussion_manipulators 
    1638 
    1739    # Main request processing function 
    1840 
     
    531553                new_author = req.args.get('author') 
    532554                new_body = req.args.get('body') 
    533555                new_time = int(time.time()) 
     556                for manipulator in self.discussion_manipulators: 
     557                    for field, message in manipulator.validate_topic(req, new_author, new_subject, new_body): 
     558                        if field: 
     559                            raise InvalidDiscussionPost("The field %s in message is invalid: %s" % 
     560                                                (field, message)) 
     561                        else: 
     562                            raise InvalidDiscussionPost("Invalid post: %s" % message) 
    534563 
    535564                # Add topic. 
    536565                self.add_topic(cursor, forum['id'], new_subject, new_time, 
     
    641670                new_author = req.args.get('author') 
    642671                new_body = req.args.get('body') 
    643672                new_time = int(time.time()) 
     673                # Custom validation rules 
     674                for manipulator in self.discussion_manipulators: 
     675                    for field, message in manipulator.validate_message(req, new_author, new_body): 
     676                        if field: 
     677                            raise InvalidDiscussionPost("The field %s in message is invalid: %s" % 
     678                                                (field, message)) 
     679                        else: 
     680                            raise InvalidDiscussionPost("Invalid post: %s" % message) 
    644681 
    645682                # Add message. 
    646683                if message: