Merge authors: Ralf Jung <p...@ralfj.de> Related merge proposals: https://code.launchpad.net/~ralfjung-e/mailman/2.1/+merge/368614 proposed by: Ralf Jung (ralfjung-e) ------------------------------------------------------------ revno: 1815 [merge] committer: Mark Sapiro <m...@msapiro.net> branch nick: 2.1 timestamp: Wed 2019-06-19 16:51:12 -0700 message: Implement Ralf Jung's captcha feature for the subscribe form. modified: Mailman/Cgi/listinfo.py Mailman/Cgi/subscribe.py Mailman/Defaults.py.in Mailman/Utils.py NEWS templates/ar/listinfo.html templates/ast/listinfo.html templates/ca/listinfo.html templates/cs/listinfo.html templates/da/listinfo.html templates/de/listinfo.html templates/el/listinfo.html templates/en/listinfo.html templates/eo/listinfo.html templates/es/listinfo.html templates/et/listinfo.html templates/eu/listinfo.html templates/fa/listinfo.html templates/fi/listinfo.html templates/fr/listinfo.html templates/gl/listinfo.html templates/he/listinfo.html templates/hr/listinfo.html templates/hu/listinfo.html templates/ia/listinfo.html templates/it/listinfo.html templates/ja/listinfo.html templates/ko/listinfo.html templates/lt/listinfo.html templates/nl/listinfo.html templates/no/listinfo.html templates/pl/listinfo.html templates/pt/listinfo.html templates/pt_BR/listinfo.html templates/ro/listinfo.html templates/ru/listinfo.html templates/sk/listinfo.html templates/sl/listinfo.html templates/sr/listinfo.html templates/sv/listinfo.html templates/tr/listinfo.html templates/uk/listinfo.html templates/vi/listinfo.html templates/zh_CN/listinfo.html templates/zh_TW/listinfo.html
-- lp:mailman/2.1 https://code.launchpad.net/~mailman-coders/mailman/2.1 Your team Mailman Checkins is subscribed to branch lp:mailman/2.1. To unsubscribe from this branch go to https://code.launchpad.net/~mailman-coders/mailman/2.1/+edit-subscription
=== modified file 'Mailman/Cgi/listinfo.py' --- Mailman/Cgi/listinfo.py 2018-06-21 16:23:09 +0000 +++ Mailman/Cgi/listinfo.py 2019-06-19 23:51:12 +0000 @@ -216,10 +216,28 @@ # drop one : resulting in an invalid format, but it's only # for our hash so it doesn't matter. remote = remote.rsplit(':', 1)[0] + # render CAPTCHA, if configured + if isinstance(mm_cfg.CAPTCHAS, dict) and 'en' in mm_cfg.CAPTCHAS: + (captcha_question, captcha_box, captcha_idx) = \ + Utils.captcha_display(mlist, lang, mm_cfg.CAPTCHAS) + pre_question = _( + """Please answer the following question to prove that + you are not a bot:""" + ) + replacements['<mm-captcha-ui>'] = ( + """<tr><td BGCOLOR="#dddddd">%s<br>%s</td><td>%s</td></tr>""" + % (pre_question, captcha_question, captcha_box)) + else: + # just to have something to include in the hash below + captcha_idx = '' + # fill form replacements['<mm-subscribe-form-start>'] += ( - '<input type="hidden" name="sub_form_token" value="%s:%s">\n' - % (now, Utils.sha_new(mm_cfg.SUBSCRIBE_FORM_SECRET + ":" + + '<input type="hidden" name="sub_form_token"' + ' value="%s:%s:%s">\n' + % (now, captcha_idx, + Utils.sha_new(mm_cfg.SUBSCRIBE_FORM_SECRET + ":" + now + ":" + + captcha_idx + ":" + mlist.internal_name() + ":" + remote ).hexdigest() === modified file 'Mailman/Cgi/subscribe.py' --- Mailman/Cgi/subscribe.py 2018-06-17 23:47:34 +0000 +++ Mailman/Cgi/subscribe.py 2019-06-19 23:51:12 +0000 @@ -168,13 +168,15 @@ # for our hash so it doesn't matter. remote1 = remote.rsplit(':', 1)[0] try: - ftime, fhash = cgidata.getfirst('sub_form_token', '').split(':') + ftime, fcaptcha_idx, fhash = cgidata.getfirst( + 'sub_form_token', '').split(':') then = int(ftime) except ValueError: - ftime = fhash = '' + ftime = fcaptcha_idx = fhash = '' then = 0 token = Utils.sha_new(mm_cfg.SUBSCRIBE_FORM_SECRET + ":" + ftime + ":" + + fcaptcha_idx + ":" + mlist.internal_name() + ":" + remote1).hexdigest() if ftime and now - then > mm_cfg.FORM_LIFETIME: @@ -189,6 +191,13 @@ results.append( _('There was no hidden token in your submission or it was corrupted.')) results.append(_('You must GET the form before submitting it.')) + # Check captcha + if isinstance(mm_cfg.CAPTCHAS, dict): + captcha_answer = cgidata.getvalue('captcha_answer', '') + if not Utils.captcha_verify( + fcaptcha_idx, captcha_answer, mm_cfg.CAPTCHAS): + results.append(_( + 'This was not the right answer to the CAPTCHA question.')) # Was an attempt made to subscribe the list to itself? if email == mlist.GetListEmail(): syslog('mischief', 'Attempt to self subscribe %s: %s', email, remote) === modified file 'Mailman/Defaults.py.in' --- Mailman/Defaults.py.in 2019-05-22 00:10:40 +0000 +++ Mailman/Defaults.py.in 2019-06-19 23:51:12 +0000 @@ -131,6 +131,25 @@ # test. SUBSCRIBE_FORM_MIN_TIME = seconds(5) +# Use a custom question-answer CAPTCHA to protect against subscription spam. +# Has no effect unless SUBSCRIBE_FORM_SECRET is set. +# Should be set to a dict mapping language keys to a list of pairs +# of questions and regexes for the answers, e.g. +# CAPTCHAS = { +# 'en': [ +# ('What is two times six?', '(12|twelve)'), +# ('What is this mailing list software called?', '[Mm]ailman'), +# ], +# 'de': [ +# ('Was ist 3 mal 6?', '(18|achtzehn)'), +# ], +# } +# The regular expression must match the full string, i.e., it is implicitly +# acting as if it had "^" in the beginning and "$" at the end. +# An 'en' key must be present and is used as fall-back if there are no +# questions for the currently set language. +CAPTCHAS = None + # Use Google reCAPTCHA to protect the subscription form from spam bots. The # following must be set to a pair of keys issued by the reCAPTCHA service at # https://www.google.com/recaptcha/admin @@ -1188,7 +1207,7 @@ # with a stronger DMARC policy if such a policy would result in message # modification because dmarc_moderation_action is 1 or 2. Thus, there is # a list setting to apply dmarc_moderaction_action of 1 or 2 to messages -# From: domains with DMARC p=none. Setting this to Yes is only effective if +# From: domains with DMARC p=none. Setting this to Yes is only effective if # dmarc_quarantine_moderaction_action is also Yes. The following is the # default for this setting for new lists. DEFAULT_DMARC_NONE_MODERATION_ACTION = No @@ -1224,7 +1243,7 @@ # (0 to disable). DEFAULT_MEMBER_VERBOSITY_INTERVAL = 300 DEFAULT_MEMBER_VERBOSITY_THRESHOLD = 0 - + # This controls how often to clean old post time entries from the dictionary # used to implement the member verbosity feature. This is a compromise between # using resources for cleaning and allowing the dictionary to grow very large. === modified file 'Mailman/Utils.py' --- Mailman/Utils.py 2019-03-02 02:24:14 +0000 +++ Mailman/Utils.py 2019-06-19 23:51:12 +0000 @@ -1576,3 +1576,33 @@ if not re.search(r'127\.0\.1\.255$', text, re.MULTILINE): return True return False + + +def captcha_display(mlist, lang, captchas): + """Returns a CAPTCHA question, the HTML for the answer box, and + the data to be put into the CSRF token""" + if not lang in captchas: + lang = 'en' + captchas = captchas[lang] + idx = random.randrange(len(captchas)) + question = captchas[idx][0] + box_html = mlist.FormatBox('captcha_answer', size=30) + # Remember to encode the language in the index so that we can get it out + # again! + return (websafe(question), box_html, lang + "-" + str(idx)) + +def captcha_verify(idx, given_answer, captchas): + try: + (lang, idx) = idx.split("-") + idx = int(idx) + except ValueError: + return False + if not lang in captchas: + return False + captchas = captchas[lang] + if not idx in range(len(captchas)): + return False + # Check the given answer. + # We append a `$` to emulate `re.fullmatch`. + correct_answer_pattern = captchas[idx][1] + "$" + return re.match(correct_answer_pattern, given_answer) === modified file 'NEWS' --- NEWS 2019-06-05 23:43:30 +0000 +++ NEWS 2019-06-19 23:51:12 +0000 @@ -21,9 +21,17 @@ does this on every web access and on sites with a very large number of lists, this can have performance implications. See the description in Defaults.py for more information. - + + - Thanks to Ralph Jung there is now the ability to add text based captchas + (aka textchas) to the listinfo subscribe form. See the documentation + for the new CAPTCHA setting in Defaults.py for how to enable this. Also + note that if you have custom listinfo.html templates, you will have to + add a <mm-captcha-ui> tag to those templates to make this work. This + feature can be used in combination with or instead of the Google + reCAPTCHA feature added in 2.1.26. + Bug Fixes and other patches - + - Fixed the confirm CGI to catch a rare TypeError on simultaneous confirmations of the same token. (LP: #1785854) @@ -61,7 +69,7 @@ 2.1.28 (23-Jul-2018) Security - + - A content spoofing vulnerability with invalid list name messages in the web UI has been fixed. CVE-2018-13796 (LP: #1780874) @@ -400,7 +408,7 @@ well as the user options page and the previously fixed admin pages. Thanks to Nishant Agarwala for reporting the issue. CVE-2016-6893 (LP: #1614841) - + New Features - For header_filter_rules matching, RFC 2047 encoded headers, non-encoded @@ -483,7 +491,7 @@ - A site can now set DMARC_ORGANIZATIONAL_DOMAIN_DATA_URL to None or the null string if it wants to avoid using this. (LP: #1578450) - + - The white space to the left of the admindb Logout link is no longer part of the link. (LP: #1573623) @@ -711,11 +719,11 @@ and deleting the old address. (LP: #266809) i18n - + - The Russian translation has been updated by Danil Smirnov. - The Polish translation has been updated by Stefan Plewako. - + Bug fixes and other patches - A LookupError in SpamDetect on a message with RFC 2047 encoded headers @@ -954,7 +962,7 @@ - If checking DNS for dmarc_moderation_action and DNS lookup is not available, log it. (LP: #1324541) - + - Handle missing From: header addresses for DMARC mitigation actions. (LP: #1318025) === modified file 'templates/ar/listinfo.html' --- templates/ar/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/ar/listinfo.html 2019-06-19 23:51:12 +0000 @@ -112,6 +112,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/ast/listinfo.html' --- templates/ast/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/ast/listinfo.html 2019-06-19 23:51:12 +0000 @@ -104,6 +104,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></P></center> === modified file 'templates/ca/listinfo.html' --- templates/ca/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/ca/listinfo.html 2019-06-19 23:51:12 +0000 @@ -115,6 +115,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/cs/listinfo.html' --- templates/cs/listinfo.html 2018-07-02 13:58:29 +0000 +++ templates/cs/listinfo.html 2019-06-19 23:51:12 +0000 @@ -113,6 +113,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/da/listinfo.html' --- templates/da/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/da/listinfo.html 2019-06-19 23:51:12 +0000 @@ -109,6 +109,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/de/listinfo.html' --- templates/de/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/de/listinfo.html 2019-06-10 15:29:24 +0000 @@ -115,6 +115,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/el/listinfo.html' --- templates/el/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/el/listinfo.html 2019-06-19 23:51:12 +0000 @@ -117,6 +117,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></P></center> === modified file 'templates/en/listinfo.html' --- templates/en/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/en/listinfo.html 2019-06-10 15:29:24 +0000 @@ -116,6 +116,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/eo/listinfo.html' --- templates/eo/listinfo.html 2018-06-04 01:12:09 +0000 +++ templates/eo/listinfo.html 2019-06-19 23:51:12 +0000 @@ -105,6 +105,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/es/listinfo.html' --- templates/es/listinfo.html 2018-01-30 04:06:24 +0000 +++ templates/es/listinfo.html 2019-06-19 23:51:12 +0000 @@ -118,6 +118,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/et/listinfo.html' --- templates/et/listinfo.html 2018-01-30 04:06:24 +0000 +++ templates/et/listinfo.html 2019-06-19 23:51:12 +0000 @@ -108,6 +108,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/eu/listinfo.html' --- templates/eu/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/eu/listinfo.html 2019-06-19 23:51:12 +0000 @@ -114,6 +114,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/fa/listinfo.html' --- templates/fa/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/fa/listinfo.html 2019-06-19 23:51:12 +0000 @@ -106,6 +106,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/fi/listinfo.html' --- templates/fi/listinfo.html 2018-01-30 04:06:24 +0000 +++ templates/fi/listinfo.html 2019-06-19 23:51:12 +0000 @@ -121,6 +121,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/fr/listinfo.html' --- templates/fr/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/fr/listinfo.html 2019-06-10 15:29:24 +0000 @@ -119,6 +119,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/gl/listinfo.html' --- templates/gl/listinfo.html 2018-01-30 04:06:24 +0000 +++ templates/gl/listinfo.html 2019-06-19 23:51:12 +0000 @@ -117,6 +117,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/he/listinfo.html' --- templates/he/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/he/listinfo.html 2019-06-19 23:51:12 +0000 @@ -111,6 +111,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/hr/listinfo.html' --- templates/hr/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/hr/listinfo.html 2019-06-19 23:51:12 +0000 @@ -113,6 +113,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/hu/listinfo.html' --- templates/hu/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/hu/listinfo.html 2019-06-19 23:51:12 +0000 @@ -112,6 +112,7 @@ <tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <td colspan="3"> <center><MM-Subscribe-Button></center> </td> === modified file 'templates/ia/listinfo.html' --- templates/ia/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/ia/listinfo.html 2019-06-19 23:51:12 +0000 @@ -104,6 +104,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/it/listinfo.html' --- templates/it/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/it/listinfo.html 2019-06-19 23:51:12 +0000 @@ -124,6 +124,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/ja/listinfo.html' --- templates/ja/listinfo.html 2018-07-19 06:07:37 +0000 +++ templates/ja/listinfo.html 2019-06-19 23:51:12 +0000 @@ -116,6 +116,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/ko/listinfo.html' --- templates/ko/listinfo.html 2018-01-30 04:06:24 +0000 +++ templates/ko/listinfo.html 2019-06-19 23:51:12 +0000 @@ -113,6 +113,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/lt/listinfo.html' --- templates/lt/listinfo.html 2018-01-30 04:06:24 +0000 +++ templates/lt/listinfo.html 2019-06-19 23:51:12 +0000 @@ -114,6 +114,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/nl/listinfo.html' --- templates/nl/listinfo.html 2018-01-30 04:06:24 +0000 +++ templates/nl/listinfo.html 2019-06-19 23:51:12 +0000 @@ -109,6 +109,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/no/listinfo.html' --- templates/no/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/no/listinfo.html 2019-06-19 23:51:12 +0000 @@ -109,6 +109,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/pl/listinfo.html' --- templates/pl/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/pl/listinfo.html 2019-06-19 23:51:12 +0000 @@ -114,6 +114,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/pt/listinfo.html' --- templates/pt/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/pt/listinfo.html 2019-06-19 23:51:12 +0000 @@ -115,6 +115,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/pt_BR/listinfo.html' --- templates/pt_BR/listinfo.html 2018-01-30 04:06:24 +0000 +++ templates/pt_BR/listinfo.html 2019-06-19 23:51:12 +0000 @@ -116,6 +116,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/ro/listinfo.html' --- templates/ro/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/ro/listinfo.html 2019-06-19 23:51:12 +0000 @@ -110,6 +110,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/ru/listinfo.html' --- templates/ru/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/ru/listinfo.html 2019-06-19 23:51:12 +0000 @@ -101,6 +101,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/sk/listinfo.html' --- templates/sk/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/sk/listinfo.html 2019-06-19 23:51:12 +0000 @@ -118,6 +118,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/sl/listinfo.html' --- templates/sl/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/sl/listinfo.html 2019-06-19 23:51:12 +0000 @@ -113,6 +113,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/sr/listinfo.html' --- templates/sr/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/sr/listinfo.html 2019-06-19 23:51:12 +0000 @@ -98,6 +98,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center> <MM-Subscribe-Button></center> === modified file 'templates/sv/listinfo.html' --- templates/sv/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/sv/listinfo.html 2019-06-19 23:51:12 +0000 @@ -95,6 +95,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/tr/listinfo.html' --- templates/tr/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/tr/listinfo.html 2019-06-19 23:51:12 +0000 @@ -116,6 +116,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/uk/listinfo.html' --- templates/uk/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/uk/listinfo.html 2019-06-19 23:51:12 +0000 @@ -112,6 +112,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/vi/listinfo.html' --- templates/vi/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/vi/listinfo.html 2019-06-19 23:51:12 +0000 @@ -103,6 +103,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/zh_CN/listinfo.html' --- templates/zh_CN/listinfo.html 2018-01-29 12:58:42 +0000 +++ templates/zh_CN/listinfo.html 2019-06-19 23:51:12 +0000 @@ -108,6 +108,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center> === modified file 'templates/zh_TW/listinfo.html' --- templates/zh_TW/listinfo.html 2018-01-30 04:06:24 +0000 +++ templates/zh_TW/listinfo.html 2019-06-19 23:51:12 +0000 @@ -101,6 +101,7 @@ </tr> <mm-digest-question-end> <mm-recaptcha-ui> + <mm-captcha-ui> <tr> <td colspan="3"> <center><MM-Subscribe-Button></center>
_______________________________________________ Mailman-checkins mailing list Mailman-checkins@python.org Unsubscribe: https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org