Changeset 17728
- Timestamp:
- Oct 25, 2023, 10:11:32 PM (9 months ago)
- Location:
- plugins/trunk/spam-filter
- Files:
-
- 1 added
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
plugins/trunk/spam-filter/setup.py
r17301 r17728 16 16 17 17 PACKAGE = 'TracSpamFilter' 18 VERSION = '1.5. 0'18 VERSION = '1.5.' 19 19 20 20 extra = {} … … 89 89 spamfilter.captcha.rand = tracspamfilter.captcha.rand 90 90 spamfilter.captcha.recaptcha2 = tracspamfilter.captcha.recaptcha2 91 91 92 spamfilter.captcha.keycaptcha = tracspamfilter.captcha.keycaptcha 92 93 """, -
plugins/trunk/spam-filter/tracspamfilter/__init__.py
r17126 r17728 18 18 from tracspamfilter.model import * 19 19 20 pkg_resources.require('Trac >= 1.5.1 dev')20 pkg_resources.require('Trac >= 1.5.1') -
plugins/trunk/spam-filter/tracspamfilter/admin.py
r17301 r17728 93 93 page = 'entry' 94 94 else: 95 95 96 data = self._render_monitoring_panel(req, cat, page) 96 97 data['allowselect'] = True 97 98 data['monitor'] = True 99 98 100 add_script_data(req, { 99 101 'bayestext': _("SpamBayes determined spam probability " … … 104 106 'sel0text': _("Select 0.00%% entries") % (), 105 107 'selspamtext': _("Select Spam entries"), 106 'selhamtext': _('Select Ham entries') 108 'selhamtext': _('Select Ham entries'), 109 'nolog_obvious': nolog_obvious 107 110 }) 108 111 add_script(req, 'spamfilter/adminmonitor.js') -
plugins/trunk/spam-filter/tracspamfilter/captcha/admin.py
r16461 r17728 26 26 from tracspamfilter.captcha.keycaptcha import KeycaptchaCaptcha 27 27 from tracspamfilter.captcha.recaptcha2 import Recaptcha2Captcha 28 28 29 29 30 try: … … 43 44 self.recaptcha_enabled = \ 44 45 self.env.is_enabled(Recaptcha2Captcha) 46 47 45 48 self.keycaptcha_enabled =\ 46 49 self.env.is_enabled(KeycaptchaCaptcha) … … 54 57 def get_admin_panels(self, req): 55 58 any_captchas_enabled = \ 56 any((self.recaptcha_enabled, self. keycaptcha_enabled,59 any((self.recaptcha_enabled, self.keycaptcha_enabled, 57 60 self.expressioncaptcha_enabled, self.imagecaptcha_enabled)) 58 61 if 'SPAM_CONFIG' in req.perm and any_captchas_enabled: … … 93 96 if recaptcha_private_key and not verified_key: 94 97 data['recaptcha_error'] = _("The keys are invalid") 98 99 100 101 102 103 104 105 106 107 108 95 109 data['error'] = 1 96 110 … … 167 181 recaptcha_public_key) 168 182 183 184 185 186 187 188 169 189 if self.keycaptcha_enabled: 170 190 spam_config.set('captcha_keycaptcha_private_key', … … 205 225 spam_config.get('captcha_recaptcha_public_key') 206 226 227 228 229 230 231 207 232 keycaptcha_private_key = \ 208 233 spam_config.get('captcha_keycaptcha_private_key') … … 234 259 'recaptcha_private_key': recaptcha_private_key, 235 260 'recaptcha_public_key': recaptcha_public_key, 261 262 263 236 264 'keycaptcha_enabled': self.keycaptcha_enabled, 237 265 'keycaptcha_private_key': keycaptcha_private_key, -
plugins/trunk/spam-filter/tracspamfilter/htdocs/adminconfig.js
r16629 r17728 1 jQuery(function ($) { 2 var $logging_enabled = $("#logging_enabled"); 3 var $trust_authenticated = $("#trust_authenticated"); 4 var $purge_age = $("#purge_age"); 5 var $spam_monitor_entries = $("#spam_monitor_entries"); 6 var $authenticated_karma = $("#authenticated_karma"); 7 $purge_age.enable($logging_enabled.checked()); 8 $spam_monitor_entries.enable($logging_enabled.checked()); 9 $logging_enabled.click(function () { 10 $purge_age.enable(this.checked); 11 $spam_monitor_entries.enable(this.checked); 1 jQuery(function($) { 2 $("#purge_age").enable($("#logging_enabled").checked()); 3 $("#spam_monitor_entries").enable($("#logging_enabled").checked()); 4 $("#logging_enabled").click(function() { 5 $("#purge_age").enable(this.checked); 6 $("#spam_monitor_entries").enable(this.checked); 12 7 }); 13 $ authenticated_karma.enable(!$trust_authenticated.checked());14 $ trust_authenticated.click(function() {15 $ authenticated_karma.enable(!this.checked);8 $.checked()); 9 $() { 10 $.enable(!this.checked); 16 11 }); 17 12 }); -
plugins/trunk/spam-filter/tracspamfilter/htdocs/adminexternal.js
r16629 r17728 1 1 function my_enable(element, state) { 2 2 var input = document.getElementById(element).getElementsByTagName("input"); 3 for 3 for(var i = 0; i < input.length; i++) { 4 4 input[i].disabled = !state; 5 5 } 6 6 } 7 7 8 jQuery(function ($) { 9 var $use_external = $("#use_external"); 10 my_enable("external", $use_external.checked()); 11 $use_external.click(function () { 8 jQuery(function($) { 9 my_enable("external", $("#use_external").checked()); 10 $("#use_external").click(function() { 12 11 my_enable("external", this.checked); 13 12 }); -
plugins/trunk/spam-filter/tracspamfilter/htdocs/adminmonitor.js
r16629 r17728 1 function ToggleSelectPerfect(all, no, name) { 1 function ToggleSelectPerfect(all, no, name) 2 { 2 3 var bayes = bayestext.replace("%%", "%"); 3 4 var box = document.getElementById(name); … … 8 9 9 10 var lines = table.getElementsByTagName('tr'); 10 for (var i = 0; i < lines.length; i += 2) { 11 for(var i = 0; i < lines.length; i += 2) 12 { 11 13 var checkbox = lines[i].getElementsByTagName('input')[0]; 12 14 var sstate = lines[i].className.indexOf("rejected"); 13 var html = lines[i +1].innerHTML;14 if 15 var html = lines[i1].innerHTML; 16 if(all && sstate > 0 && html.indexOf(bayes.replace("%s", "100.00")) > 0) 15 17 checkbox.checked = state; 16 else if (all === 2 && sstate > 0 && respam.exec(html))18 else if== 2 && sstate > 0 && respam.exec(html)) 17 19 checkbox.checked = state; 18 else if (no === 2 && sstate < 0 && reham.exec(html))20 else if== 2 && sstate < 0 && reham.exec(html)) 19 21 checkbox.checked = state; 20 else if 22 else if(no && sstate < 0 && html.indexOf(bayes.replace("%s", "0.00")) > 0) 21 23 checkbox.checked = state; 22 24 } 23 25 } 24 26 25 function ToggleSelectSpam(mode) { 27 function ToggleSelectSpam(mode) 28 { 26 29 var box = document.getElementById(mode ? "selhambutton" : "selspambutton"); 27 30 var state = box.checked; 28 31 var table = document.getElementById("spamtable"); 29 32 var lines = table.getElementsByTagName('tr'); 30 for (var i = 0; i < lines.length; i += 2) { 33 for(var i = 0; i < lines.length; i += 2) 34 { 31 35 var checkbox = lines[i].getElementsByTagName('input')[0]; 32 36 var sstate = lines[i].className.indexOf("rejected"); 33 37 var event = new Event('click', { 'bubbles': true }); 34 if 38 if(mode ? sstate < 0 : sstate >= 0) { 35 39 checkbox.checked = state; 36 40 checkbox.dispatchEvent(event); … … 39 43 } 40 44 41 function setbuttons() { 42 document.getElementById("boxes").innerHTML += "<table><tr>" 43 + "<td valign=\"center\"><input class=\"spambox\" type=\"checkbox\" id=\"sel100button\" " 45 function setbuttons() 46 { 47 var txt = "<table>" 48 if(!nolog_obvious) 49 { 50 txt += "<tr>" 51 +"<td valign=\"center\"><input class=\"spambox\" type=\"checkbox\" id=\"sel100button\"" 44 52 + "onclick=\"ToggleSelectPerfect(1,0,'sel100button')\"/><\/td>" 45 + 46 + "<label for=\"sel100button\">" + sel100text +"</label><\/td>"47 + "<td valign=\"center\"><input class=\"spambox\" type=\"checkbox\" id=\"sel90button\""53 +"<td class=\"spambox\" valign=\"center\">" 54 + "<label for=\"sel100button\">""</label><\/td>" 55 +" 48 56 + "onclick=\"ToggleSelectPerfect(2,0,'sel90button')\"/><\/td>" 49 + 50 + "<label for=\"sel90button\">" + sel90text +"</label><\/td>"51 + "<td valign=\"center\"><input class=\"hambox\" type=\"checkbox\" id=\"sel10button\""57 +"<td class=\"spambox\" valign=\"center\">" 58 + "<label for=\"sel90button\">""</label><\/td>" 59 +" 52 60 + "onclick=\"ToggleSelectPerfect(0,2,'sel10button')\"/><\/td>" 53 + 54 + "<label for=\"sel10button\">" + sel10text +"</label><\/td>"55 + "<td valign=\"center\"><input class=\"hambox\" type=\"checkbox\" id=\"sel0button\""61 +"<td class=\"hambox\" valign=\"center\">" 62 + "<label for=\"sel10button\">""</label><\/td>" 63 +" 56 64 + "onclick=\"ToggleSelectPerfect(0,1,'sel0button')\"/><\/td>" 57 + "<td class=\"hambox\" valign=\"center\">" 58 + "<label for=\"sel0button\">" + sel0text + "</label><\/td>" 59 + "<\/tr><tr>" 60 + "<td valign=\"center\"><input class=\"spambox\" type=\"checkbox\" id=\"selspambutton\" " 61 + "onclick=\"ToggleSelectSpam(0)\"/><\/td>" 62 + "<td colspan=3 class=\"spambox\" valign=\"center\">" 63 + "<label for=\"selspambutton\">" + selspamtext + "</label><\/td>" 64 + "<td valign=\"center\"><input class=\"hambox\" type=\"checkbox\" id=\"selhambutton\" " 65 + "onclick=\"ToggleSelectSpam(1)\"/><\/td>" 66 + "<td colspan=3 class=\"hambox\" valign=\"center\">" 67 + "<label for=\"selhambutton\">" + selhamtext + "</label><\/td>" 68 + "<\/tr><\/table>"; 65 +"<td class=\"hambox\" valign=\"center\">" 66 + "<label for=\"sel0button\">"+sel0text+"</label><\/td>" 67 +"<\/tr>"; 68 } 69 txt += "<tr>" 70 +"<td valign=\"center\"><input class=\"spambox\" type=\"checkbox\" id=\"selspambutton\"" 71 + "onclick=\"ToggleSelectSpam(0)\"/><\/td>" 72 +"<td colspan=3 class=\"spambox\" valign=\"center\">" 73 + "<label for=\"selspambutton\">"+selspamtext+"</label><\/td>" 74 +"<td valign=\"center\"><input class=\"hambox\" type=\"checkbox\" id=\"selhambutton\"" 75 + "onclick=\"ToggleSelectSpam(1)\"/><\/td>" 76 +"<td colspan=3 class=\"hambox\" valign=\"center\">" 77 + "<label for=\"selhambutton\">"+selhamtext+"</label><\/td>" 78 +"<\/tr><\/table>"; 79 80 document.getElementById("boxes").innerHTML += txt; 69 81 } 70 82 71 jQuery(function 83 jQuery(function($) { 72 84 $("#spammonitor").addSelectAllCheckboxes(); 73 if (document.forms["spammonitorform"].elements["sel"]) { 85 if(document.forms["spammonitorform"].elements["sel"]) 86 { 74 87 setbuttons(); 75 88 } -
plugins/trunk/spam-filter/tracspamfilter/htdocs/reportspam.js
r15675 r17728 1 1 jQuery(function ($) { 2 $("#reportspam").click(function ( ){2 $("#reportspam").click(function ({ 3 3 var comment = prompt(spamreport_comment, ""); 4 4 if (comment === null) { 5 this.href = document.URL; 5 event.preventDefault(); 6 return; 6 7 } 7 else { 8 this.href += "&comment=" + comment; 9 } 8 this.href += "&comment=" + encodeURIComponent(comment); 10 9 }); 11 10 }); -
plugins/trunk/spam-filter/tracspamfilter/model.py
r16455 r17728 396 396 UPDATE spamfilter_statistics 397 397 SET delay=%s,delay_max=%s,delay_min=%s,count=%s 398 WHERE ACTION=%s AND data=%s AND status=%s AND strategy=%s398 WHERE =%s AND data=%s AND status=%s AND strategy=%s 399 399 """, (delay_val, delay_max, delay_min, count, action, 400 400 data, status, strategy)) -
plugins/trunk/spam-filter/tracspamfilter/report.py
r16490 r17728 60 60 """, (savepage, headers, req.authname, isauth, 61 61 req.args.get('comment'), int(time()))) 62 62 63 req.redirect(req.href(page)) 63 64 -
plugins/trunk/spam-filter/tracspamfilter/templates/admin_captcha.html
r15825 r17728 57 57 <legend>reCAPTCHA</legend> 58 58 <p class="hint" i18n:msg=""> 59 The reCAPTCHA system provides a very good captcha system based on 60 scanned books. See 59 The reCAPTCHA system provides a very good captcha system. See 61 60 <a class="ext-link" href="http://www.google.com/recaptcha">Google 62 61 reCAPTCHA</a> page. You need to obtain … … 84 83 <div py:if="recaptcha_error" class="system-message"> 85 84 <strong>Key validation failed:</strong> ${recaptcha_error} 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 86 116 </div> 87 117 </fieldset> -
plugins/trunk/spam-filter/tracspamfilter/templates/admin_spammonitor.html
r15628 r17728 42 42 </div> 43 43 44 45 44 46 <xi:include href="monitortable.html" /> 45 47 … … 47 49 ${prevnext_nav()} 48 50 </div> 49 <div id="boxes" py:if="entries"></div>50 51 51 52 <div class="buttons" py:if="entries"> 52 <input type="submit" class="trac-disable-on-submit" 53 <input type="submit" class="trac-disable-on-submit" 53 54 name="deleteobvious" value="${dgettext('tracspamfilter', 'Delete > 90%')}" /> 54 55 <input type="hidden" name="page" value="$page" /> -
plugins/trunk/spam-filter/tracspamfilter/templates/usertable.html
r16685 r17728 37 37 <py:choose test="data[1]"> 38 38 <py:when test="0"> 39 <td><a href="${ href() +data[0]}">Source</a></td>39 <td><a href="${data[0]}">Source</a></td> 40 40 </py:when> 41 41 <py:otherwise> -
plugins/trunk/spam-filter/tracspamfilter/tests/api.py
r16457 r17728 25 25 26 26 class DummyStrategy(Component): 27 28 27 implements(IFilterStrategy) 29 28 … … 34 33 self.message = None 35 34 self.spam = None 36 self.ip = None37 35 38 36 def configure(self, karma, message="Dummy"): … … 58 56 def is_external(self): 59 57 return False 60 61 58 62 59 class FilterSystemTestCase(unittest.TestCase): … … 119 116 FilterSystem(self.env).test(req, 'John Doe', [(None, 'Test')]) 120 117 self.fail('Expected RejectContent exception') 121 except RejectContent :118 except RejectContent: 122 119 pass 123 120 … … 127 124 self.assertEqual('/foo', entry.path) 128 125 self.assertEqual('John Doe', entry.author) 129 self.assert False(entry.authenticated)126 self.assertentry.authenticated) 130 127 self.assertEqual('127.0.0.1', entry.ipnr) 131 128 self.assertEqual('Test', entry.content) 132 self.assert True(entry.rejected)129 self.assertentry.rejected) 133 130 self.assertEqual(-5, entry.karma) 134 self.assertEqual([['DummyStrategy', '-5', 'Blacklisted']], 135 entry.reasons) 131 self.assertEqual([['DummyStrategy', '-5', 'Blacklisted']], entry.reasons) 136 132 137 133 def test_log_accept(self): … … 145 141 self.assertEqual('/foo', entry.path) 146 142 self.assertEqual('John Doe', entry.author) 147 self.assert False(entry.authenticated)143 self.assertentry.authenticated) 148 144 self.assertEqual('127.0.0.1', entry.ipnr) 149 145 self.assertEqual('Test', entry.content) 150 self.assert False(entry.rejected)146 self.assertentry.rejected) 151 147 self.assertEqual(5, entry.karma) 152 148 self.assertEqual([['DummyStrategy', '5', 'Dummy']], entry.reasons) … … 161 157 162 158 strategy = DummyStrategy(self.env) 163 self.assert True(strategy.train_called)159 self.assertstrategy.train_called) 164 160 self.assertEqual('john', strategy.author) 165 161 self.assertEqual('Test', strategy.content) 166 self.assert True(strategy.spam)162 self.assertstrategy.spam) 167 163 168 164 log = list(LogEntry.select(self.env)) 169 165 self.assertEqual(1, len(log)) 170 166 entry = log[0] 171 self.assert True(entry.rejected)167 self.assertentry.rejected) 172 168 173 169 def test_train_ham(self): … … 179 175 180 176 strategy = DummyStrategy(self.env) 181 self.assert True(strategy.train_called)177 self.assertstrategy.train_called) 182 178 self.assertEqual('john', strategy.author) 183 179 self.assertEqual('Test', strategy.content) 184 self.assert False(strategy.spam)180 self.assertstrategy.spam) 185 181 186 182 log = list(LogEntry.select(self.env)) 187 183 self.assertEqual(1, len(log)) 188 184 entry = log[0] 189 self.assert False(entry.rejected)185 self.assertentry.rejected) 190 186 191 187 … … 195 191 return suite 196 192 197 198 193 if __name__ == '__main__': 199 194 unittest.main(defaultTest='test_suite')
Note:
See TracChangeset
for help on using the changeset viewer.