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

Reply via email to