Changeset 17738
- Timestamp:
- Oct 30, 2023, 12:40:56 PM (9 months ago)
- Location:
- plugins/trunk/spam-filter/tracspamfilter/filters
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
plugins/trunk/spam-filter/tracspamfilter/filters/ip_regex.py
r17729 r17738 20 20 import re 21 21 22 22 23 from trac.config import BoolOption, IntOption, Option 23 from trac.core import Component, implements 24 from trac.core import Component, TracError, implements 25 from trac.util.html import tag 26 from trac.util.text import exception_to_unicode 24 27 from trac.wiki.api import IWikiChangeListener 25 28 from trac.wiki.model import WikiPage 26 29 27 from tracspamfilter.api import IFilterStrategy, N_ 30 from tracspamfilter.api import IFilterStrategy, N_ 28 31 29 32 … … 49 52 50 53 def __init__(self): 51 self.patterns = [] 52 page = WikiPage(self.env, 'BadIP') 53 if page.exists: 54 self._load_patterns(page) 55 if self.badcontent_file != '': 56 file = open(self.badcontent_file, 'r') 57 if file is None: 58 self.log.warning("BadIP file cannot be opened") 59 else: 60 lines = file.read().splitlines() 61 pat = [re.compile(p.strip()) for p in lines if p.strip()] 62 self.log.debug("Loaded %s patterns from BadIP file", len(pat)) 63 self.patterns += pat 54 self._patterns_file = self._load_file(self.badcontent_file) 64 55 65 56 # IFilterStrategy implementation … … 94 85 def wiki_page_changed(self, page, *args): 95 86 if page.name == 'BadIP': 96 self._load_patterns(page) 87 self._load_page(page) 88 del self._patterns_page 89 97 90 wiki_page_added = wiki_page_changed 98 91 wiki_page_version_deleted = wiki_page_changed … … 100 93 def wiki_page_deleted(self, page): 101 94 if page.name == 'BadIP': 102 self.patterns = []95 103 96 104 97 # Internal methods 105 98 106 def _load_patterns(self, page): 99 @property 100 def patterns(self): 101 for pattern in self._patterns_file: 102 yield pattern 103 for pattern in self._patterns_page: 104 yield pattern 105 106 @cached 107 def _patterns_page(self): 108 page = WikiPage(self.env, 'BadIP') 109 if page.exists: 110 try: 111 return self._load_page(page) 112 except TracError: 113 pass 114 return [] 115 116 def _load_file(self, filename): 117 if not filename: 118 return [] 119 try: 120 f = open(filename, 'r') 121 except EnvironmentError as e: 122 self.log.warning("BadIP file cannot be opened (%s)", 123 exception_to_unicode(e)) 124 return [] 125 patterns = [] 126 with f: 127 for line in f: 128 line = line.strip() 129 if not line: 130 continue 131 patterns.append(re.compile(line)) 132 self.log.debug("Loaded %s patterns from BadIP file", len(patterns)) 133 return patterns 134 135 def _load_page(self, page): 136 patterns = [] 107 137 if '{{{' in page.text and '}}}' in page.text: 108 lines = page.text.split('{{{', 1)[1].split('}}}', 1)[0].splitlines() 109 self.patterns = [re.compile(p.strip()) for p in lines if p.strip()] 110 self.log.debug("Loaded %s patterns from BadIP", 111 len(self.patterns)) 138 lines = page.text.split('{{{', 1)[1].split('}}}', 1)[0] 139 for p in lines.splitlines(): 140 p = p.strip() 141 if not p: 142 continue 143 try: 144 patterns.append(re.compile(p)) 145 except re.error as e: 146 self.log.debug("Error in pattern %s: %s", p, e) 147 raise TracError(tag_("Error in pattern %(pattern)s: " 148 "%(error)s.", pattern=tag.tt(p), 149 error=tag.i(e))) 150 self.log.debug("Loaded %s patterns from BadIP", len(patterns)) 112 151 else: 113 152 self.log.warning("BadIP page does not contain any patterns") 114 self.patterns = []153 -
plugins/trunk/spam-filter/tracspamfilter/filters/regex.py
r17729 r17738 18 18 import re 19 19 20 20 21 from trac.config import BoolOption, IntOption, Option 21 22 from trac.core import Component, TracError, implements 22 23 from trac.util.html import tag 24 23 25 from trac.wiki.api import IWikiChangeListener, IWikiPageManipulator 24 26 from trac.wiki.model import WikiPage … … 47 49 48 50 def __init__(self): 49 self.patterns = [] 50 page = WikiPage(self.env, 'BadContent') 51 if page.exists: 52 try: 53 self._load_patterns(page) 54 except TracError: 55 pass 56 if self.badcontent_file != '': 57 with open(self.badcontent_file, 'r') as file: 58 if file is None: 59 self.log.warning("BadContent file cannot be opened") 60 else: 61 lines = file.read().splitlines() 62 pat = [re.compile(p.strip()) for p in lines if p.strip()] 63 self.log.debug("Loaded %s patterns from BadContent file", 64 len(pat)) 65 self.patterns += pat 51 self._patterns_file = self._load_file(self.badcontent_file) 66 52 67 53 # IFilterStrategy implementation … … 104 90 if page.name == 'BadContent': 105 91 try: 106 self._load_pa tterns(page)92 self._load_pa(page) 107 93 except TracError as e: 108 94 return [(None, e)] … … 113 99 def wiki_page_changed(self, page, *args): 114 100 if page.name == 'BadContent': 115 self._load_patterns(page) 101 self._load_page(page) # verify patterns 102 del self._patterns_page 116 103 117 104 wiki_page_added = wiki_page_changed … … 121 108 def wiki_page_deleted(self, page): 122 109 if page.name == 'BadContent': 123 self.patterns = []110 124 111 125 112 # Internal methods 126 113 127 def _load_patterns(self, page): 114 @property 115 def patterns(self): 116 for pattern in self._patterns_file: 117 yield pattern 118 for pattern in self._patterns_page: 119 yield pattern 120 121 @cached 122 def _patterns_page(self): 123 page = WikiPage(self.env, 'BadContent') 124 if page.exists: 125 try: 126 return self._load_page(page) 127 except TracError: 128 pass 129 return [] 130 131 def _load_file(self, filename): 132 if not filename: 133 return [] 134 try: 135 f = open(filename, 'r') 136 except EnvironmentError as e: 137 self.log.warning("BadContent file cannot be opened (%s)", 138 exception_to_unicode(e)) 139 return [] 140 patterns = [] 141 with f: 142 for line in f: 143 line = line.strip() 144 if not line: 145 continue 146 patterns.append(re.compile(line)) 147 self.log.debug("Loaded %s patterns from BadContent file", 148 len(patterns)) 149 return patterns 150 151 def _load_page(self, page): 152 patterns = [] 128 153 if '{{{' in page.text and '}}}' in page.text: 129 154 lines = page.text.split('{{{', 1)[1].split('}}}', 1)[0] … … 131 156 for p in lines: 132 157 try: 133 self.patterns.append(re.compile(p))158 patterns.append(re.compile(p)) 134 159 except re.error as e: 135 160 raise TracError(tag_("Error in pattern %(pattern)s: " 136 161 "%(error)s.", pattern=tag.code(p), 137 162 error=tag.i(e))) 138 self.log.debug("Loaded %s patterns from BadContent", 139 len(self.patterns)) 163 self.log.debug("Loaded %s patterns from BadContent", len(patterns)) 140 164 else: 141 165 self.log.warning("BadContent page does not contain any patterns") 142 self.patterns = []166 -
plugins/trunk/spam-filter/tracspamfilter/filters/tests/regex.py
r17729 r17738 21 21 from trac.wiki.web_ui import WikiModule 22 22 23 from tracspamfilter.filters import regex24 23 from tracspamfilter.filters.regex import RegexFilterStrategy 25 26 27 class DummyWikiPage(object):28 29 def __init__(self):30 self.text = ''31 32 def __call__(self, env, name):33 self.env = env34 self.name = name35 self.exists = True36 return self37 24 38 25 … … 42 29 self.env = EnvironmentStub(enable=['trac.*', RegexFilterStrategy], 43 30 default_data=True) 44 self.page = regex.WikiPage = DummyWikiPage()45 31 self.strategy = RegexFilterStrategy(self.env) 46 32 … … 66 52 def test_one_matching_pattern(self): 67 53 req = MockRequest(self.env) 68 self.page.text = """{{{ 54 page = WikiPage(self.env) 55 page.name = 'BadContent' 56 page.text = """{{{ 69 57 foobar 70 58 }}}""" 71 self.strategy.wiki_page_changed(self.page)59 ) 72 60 rv = self.strategy.test(req, 'anonymous', 'foobar', '127.0.0.1') 73 61 self.assertEqual((-5, "Content contained these blacklisted " … … 75 63 76 64 def test_multiple_matching_pattern(self): 77 self.page.text = """{{{ 65 page = WikiPage(self.env) 66 page.name = 'BadContent' 67 page.text = """{{{ 78 68 foobar 79 69 ^foo 80 70 bar$ 81 71 }}}""" 82 self.strategy.wiki_page_changed(self.page)72 ) 83 73 req = MockRequest(self.env) 84 74 rv = self.strategy.test(req, 'anonymous', '\nfoobar', '127.0.0.1')
Note:
See TracChangeset
for help on using the changeset viewer.