diff --git a/6.1.25/patches/06_2685_owner_address_set_to_special_address.patch b/6.1.25/patches/06_2685_owner_address_set_to_special_address.patch
index 388849ff71b7270c8d0786052c4ba76a6d81c00f..cbf7262cc52e3f1d87d383b676108d6c1cbee800 100644
--- a/6.1.25/patches/06_2685_owner_address_set_to_special_address.patch
+++ b/6.1.25/patches/06_2685_owner_address_set_to_special_address.patch
@@ -1,7 +1,7 @@
-diff --git a/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in b/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
+diff --git a/sympa-6.1.25/wwsympa/wwsympa.fcgi.in b/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
 index ca6ad17..a31f9ff 100644
---- a/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
-+++ b/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
+--- a/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
++++ b/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
 @@ -9514,6 +9514,26 @@ sub do_edit_list {
  	&report::notice_report_web('subscribers_noticed_deleted_topics',{},$param->{'action'});
      }
diff --git a/6.1.25/patches/07_var-lock-subsys_missing_prevents_startup.patch b/6.1.25/patches/07_var-lock-subsys_missing_prevents_startup.patch
index 5b5dd57b1e8a52f9d1483c67bc34b07651b4befa..077aa369fc1da7e58f07312d326eebd754b1a8f5 100644
--- a/6.1.25/patches/07_var-lock-subsys_missing_prevents_startup.patch
+++ b/6.1.25/patches/07_var-lock-subsys_missing_prevents_startup.patch
@@ -1,7 +1,7 @@
-diff --git a/sympa-6.1.22-src/src/etc/script/sympa.in b/sympa-6.1.22-src/src/etc/script/sympa.in
+diff --git a/sympa-6.1.25/src/etc/script/sympa.in b/sympa-6.1.25/src/etc/script/sympa.in
 index 48e405d..b6df1cb 100755
---- a/sympa-6.1.22-src/src/etc/script/sympa.in
-+++ b/sympa-6.1.22-src/src/etc/script/sympa.in
+--- a/sympa-6.1.25/src/etc/script/sympa.in
++++ b/sympa-6.1.25/src/etc/script/sympa.in
 @@ -216,6 +216,10 @@ fi
  [ -f $sympaconf ] || exit 0
  [ -f $wwsympaconf ] || exit 0
diff --git a/6.1.25/patches/08_2821_max_list_dispatch.patch b/6.1.25/patches/08_2821_max_list_dispatch.patch
index 33e208e0e002777f1434b71ff89f41c991d838e3..485714b633ddd3e07d01e7168684f55a9ac3f7ac 100644
--- a/6.1.25/patches/08_2821_max_list_dispatch.patch
+++ b/6.1.25/patches/08_2821_max_list_dispatch.patch
@@ -1,7 +1,7 @@
-diff --git a/sympa-6.1.22-src/mail_tt2/message_report.tt2 b/sympa-6.1.22-src/mail_tt2/message_report.tt2
+diff --git a/sympa-6.1.25/mail_tt2/message_report.tt2 b/sympa-6.1.25/mail_tt2/message_report.tt2
 index b8834cf..99c8a0f 100644
---- a/sympa-6.1.22-src/mail_tt2/message_report.tt2
-+++ b/sympa-6.1.22-src/mail_tt2/message_report.tt2
+--- a/sympa-6.1.25/mail_tt2/message_report.tt2
++++ b/sympa-6.1.25/mail_tt2/message_report.tt2
 @@ -54,6 +54,9 @@ Note: Because binary files have to be encoded in less-efficient ASCII format bef
  [% ELSIF entry == 'list_unknown' -%]
  
@@ -12,10 +12,10 @@ index b8834cf..99c8a0f 100644
  [% ELSIF entry == 'dyn_cant_create' -%]
  
  [%|loc(listname)%]The %1 list could not be created.[%END%]
-diff --git a/sympa-6.1.22-src/po-wwsympa/de.po b/sympa-6.1.22-src/po-wwsympa/de.po
+diff --git a/sympa-6.1.25/po-wwsympa/de.po b/sympa-6.1.25/po-wwsympa/de.po
 index ebd517d..72f987e 100755
---- a/sympa-6.1.22-src/po-wwsympa/de.po
-+++ b/sympa-6.1.22-src/po-wwsympa/de.po
+--- a/sympa-6.1.25/po-wwsympa/de.po
++++ b/sympa-6.1.25/po-wwsympa/de.po
 @@ -7557,3 +7557,8 @@ msgstr ""
  #~ "Textdatei oder relationalen Datenbank gespeichert werden oder von "
  #~ "verschiedenen externen Quellen inkludiert werden (Listen, Klartextdatei, "
@@ -25,10 +25,10 @@ index ebd517d..72f987e 100755
 +msgid "The number of subscribers for this list, '%1', is greater then the limit set by the list administrators, '%2'"
 +msgstr "Die Zahl der Abonnenten für diese Liste, "% 1", ist größer als der von den Listenadministratoren festgesetzte Grenze, '% 2'"
 +
-diff --git a/sympa-6.1.22-src/po-wwsympa/el.po b/sympa-6.1.22-src/po-wwsympa/el.po
+diff --git a/sympa-6.1.25/po-wwsympa/el.po b/sympa-6.1.25/po-wwsympa/el.po
 index 5f5c873..dd5a52e 100755
---- a/sympa-6.1.22-src/po-wwsympa/el.po
-+++ b/sympa-6.1.22-src/po-wwsympa/el.po
+--- a/sympa-6.1.25/po-wwsympa/el.po
++++ b/sympa-6.1.25/po-wwsympa/el.po
 @@ -5860,3 +5860,8 @@ msgstr ""
  #~ msgstr ""
  #~ "(Προκαθορισμένη τιμή: παραλαβή ταχυδρομείου,απόδειξη παραλαβής,επισκόπηση,"
@@ -38,10 +38,10 @@ index 5f5c873..dd5a52e 100755
 +msgid "The number of subscribers for this list, '%1', is greater then the limit set by the list administrators, '%2'"
 +msgstr "Ο αριθμός των συνδρομητών για αυτήν τη λίστα, '% 1', είναι μεγαλύτερη από το όριο που καθορίζεται από τους διαχειριστές της λίστας '% 2'"
 +
-diff --git a/sympa-6.1.22-src/po-wwsympa/en.po b/sympa-6.1.22-src/po-wwsympa/en.po
+diff --git a/sympa-6.1.25/po-wwsympa/en.po b/sympa-6.1.25/po-wwsympa/en.po
 index b4383f5..484a433 100755
---- a/sympa-6.1.22-src/po-wwsympa/en.po
-+++ b/sympa-6.1.22-src/po-wwsympa/en.po
+--- a/sympa-6.1.25/po-wwsympa/en.po
++++ b/sympa-6.1.25/po-wwsympa/en.po
 @@ -7272,6 +7272,10 @@ msgstr ""
  "in nomail mode, he or she will again receive individual mail messages from "
  "the list."
@@ -53,10 +53,10 @@ index b4383f5..484a433 100755
  #~ msgid "subscribers (private);"
  #~ msgstr "subscribers (private);"
  
-diff --git a/sympa-6.1.22-src/po-wwsympa/es.po b/sympa-6.1.22-src/po-wwsympa/es.po
+diff --git a/sympa-6.1.25/po-wwsympa/es.po b/sympa-6.1.25/po-wwsympa/es.po
 index 2b7c2bf..43e33d2 100755
---- a/sympa-6.1.22-src/po-wwsympa/es.po
-+++ b/sympa-6.1.22-src/po-wwsympa/es.po
+--- a/sympa-6.1.25/po-wwsympa/es.po
++++ b/sympa-6.1.25/po-wwsympa/es.po
 @@ -7532,3 +7532,7 @@ msgstr ""
  
  #~ msgid "value"
@@ -65,10 +65,10 @@ index 2b7c2bf..43e33d2 100755
 +#: ../web_tt2/error.tt2
 +msgid "The number of subscribers for this list, '%1', is greater then the limit set by the list administrators, '%2'"
 +msgstr "El número de suscriptores de esta lista, '% 1', es mayor que el límite establecido por los administradores de la lista, '% 2'"
-diff --git a/sympa-6.1.22-src/po-wwsympa/fr.po b/sympa-6.1.22-src/po-wwsympa/fr.po
+diff --git a/sympa-6.1.25/po-wwsympa/fr.po b/sympa-6.1.25/po-wwsympa/fr.po
 index e65dff1..6ed5e38 100644
---- a/sympa-6.1.22-src/po-wwsympa/fr.po
-+++ b/sympa-6.1.22-src/po-wwsympa/fr.po
+--- a/sympa-6.1.25/po-wwsympa/fr.po
++++ b/sympa-6.1.25/po-wwsympa/fr.po
 @@ -7921,3 +7921,7 @@ msgstr ""
  # nlsref 16,91
  #~ msgid "value"
@@ -77,10 +77,10 @@ index e65dff1..6ed5e38 100644
 +#: ../web_tt2/error.tt2
 +msgid "The number of subscribers for this list, '%1', is greater then the limit set by the list administrators, '%2'"
 +msgstr "Le nombre d'abonnés à cette liste, '% 1', est supérieure à la limite fixée par les administrateurs de la liste, '% 2'"
-diff --git a/sympa-6.1.22-src/po-wwsympa/it.po b/sympa-6.1.22-src/po-wwsympa/it.po
+diff --git a/sympa-6.1.25/po-wwsympa/it.po b/sympa-6.1.25/po-wwsympa/it.po
 index 3434351..10ae265 100755
---- a/sympa-6.1.22-src/po-wwsympa/it.po
-+++ b/sympa-6.1.22-src/po-wwsympa/it.po
+--- a/sympa-6.1.25/po-wwsympa/it.po
++++ b/sympa-6.1.25/po-wwsympa/it.po
 @@ -5891,3 +5891,7 @@ msgstr ""
  # nlsref 16,91
  #~ msgid "value"
@@ -89,10 +89,10 @@ index 3434351..10ae265 100755
 +#: ../web_tt2/error.tt2
 +msgid "The number of subscribers for this list, '%1', is greater then the limit set by the list administrators, '%2'"
 +msgstr "Il numero di abbonati per questa lista, '% 1', è maggiore del limite fissato dagli amministratori della lista, '% 2'"
-diff --git a/sympa-6.1.22-src/po-wwsympa/pt.po b/sympa-6.1.22-src/po-wwsympa/pt.po
+diff --git a/sympa-6.1.25/po-wwsympa/pt.po b/sympa-6.1.25/po-wwsympa/pt.po
 index 13c8230..8784ff2 100755
---- a/sympa-6.1.22-src/po-wwsympa/pt.po
-+++ b/sympa-6.1.22-src/po-wwsympa/pt.po
+--- a/sympa-6.1.25/po-wwsympa/pt.po
++++ b/sympa-6.1.25/po-wwsympa/pt.po
 @@ -5509,3 +5509,7 @@ msgstr ""
  #~ msgstr ""
  #~ "(Valor por defeito: modo de recepção mail,notice,digest,digestplain,"
@@ -101,10 +101,10 @@ index 13c8230..8784ff2 100755
 +#: ../web_tt2/error.tt2
 +msgid "The number of subscribers for this list, '%1', is greater then the limit set by the list administrators, '%2'"
 +msgstr "O número de assinantes para esta lista, '% 1', é maior do que o limite definido pelos administradores da lista, '% 2'"
-diff --git a/sympa-6.1.22-src/po/de.po b/sympa-6.1.22-src/po/de.po
+diff --git a/sympa-6.1.25/po/de.po b/sympa-6.1.25/po/de.po
 index 209c6f7..f3d84f9 100755
---- a/sympa-6.1.22-src/po/de.po
-+++ b/sympa-6.1.22-src/po/de.po
+--- a/sympa-6.1.25/po/de.po
++++ b/sympa-6.1.25/po/de.po
 @@ -5597,6 +5597,11 @@ msgstr "Befehls-Syntaxfehler."
  msgid "List '%1' does not exist."
  msgstr "Liste '%1' existiert nicht."
@@ -117,10 +117,10 @@ index 209c6f7..f3d84f9 100755
  #. (u_err.listname)
  #: ../mail_tt2/command_report.tt2:107
  msgid "%1 mailing list does not provide subscriber preferences."
-diff --git a/sympa-6.1.22-src/po/el.po b/sympa-6.1.22-src/po/el.po
+diff --git a/sympa-6.1.25/po/el.po b/sympa-6.1.25/po/el.po
 index a08f4a6..e89be0b 100755
---- a/sympa-6.1.22-src/po/el.po
-+++ b/sympa-6.1.22-src/po/el.po
+--- a/sympa-6.1.25/po/el.po
++++ b/sympa-6.1.25/po/el.po
 @@ -5598,6 +5598,11 @@ msgstr "Λάθος σύνταξη εντολής."
  msgid "List '%1' does not exist."
  msgstr "Η λίστα '%1' δεν υπάρχει."
@@ -133,10 +133,10 @@ index a08f4a6..e89be0b 100755
  #. (u_err.listname)
  #: ../mail_tt2/command_report.tt2:107
  msgid "%1 mailing list does not provide subscriber preferences."
-diff --git a/sympa-6.1.22-src/po/en.po b/sympa-6.1.22-src/po/en.po
+diff --git a/sympa-6.1.25/po/en.po b/sympa-6.1.25/po/en.po
 index 932bfc1..9b0eb9c 100755
---- a/sympa-6.1.22-src/po/en.po
-+++ b/sympa-6.1.22-src/po/en.po
+--- a/sympa-6.1.25/po/en.po
++++ b/sympa-6.1.25/po/en.po
 @@ -8940,6 +8940,11 @@ msgstr "Command syntax error."
  msgid "List '%1' does not exist."
  msgstr "List '%1' does not exist."
@@ -149,10 +149,10 @@ index 932bfc1..9b0eb9c 100755
  #. (u_err.listname)
  #: default/mail_tt2/command_report.tt2:106
  msgid "%1 mailing list does not provide subscriber preferences."
-diff --git a/sympa-6.1.22-src/po/es.po b/sympa-6.1.22-src/po/es.po
+diff --git a/sympa-6.1.25/po/es.po b/sympa-6.1.25/po/es.po
 index e943bb6..557f0bc 100755
---- a/sympa-6.1.22-src/po/es.po
-+++ b/sympa-6.1.22-src/po/es.po
+--- a/sympa-6.1.25/po/es.po
++++ b/sympa-6.1.25/po/es.po
 @@ -5591,6 +5591,11 @@ msgstr "Error de sintaxis."
  msgid "List '%1' does not exist."
  msgstr "La lista '%1' no existe."
@@ -165,10 +165,10 @@ index e943bb6..557f0bc 100755
  #. (u_err.listname)
  #: ../mail_tt2/command_report.tt2:107
  msgid "%1 mailing list does not provide subscriber preferences."
-diff --git a/sympa-6.1.22-src/po/fr.po b/sympa-6.1.22-src/po/fr.po
+diff --git a/sympa-6.1.25/po/fr.po b/sympa-6.1.25/po/fr.po
 index 693d3c0..e40d819 100755
---- a/sympa-6.1.22-src/po/fr.po
-+++ b/sympa-6.1.22-src/po/fr.po
+--- a/sympa-6.1.25/po/fr.po
++++ b/sympa-6.1.25/po/fr.po
 @@ -5674,6 +5674,11 @@ msgstr "Erreur de syntaxe."
  msgid "List '%1' does not exist."
  msgstr "La liste '%1' est inconnue."
@@ -181,10 +181,10 @@ index 693d3c0..e40d819 100755
  # nlsref 6,91
  #. (u_err.listname)
  #: ../mail_tt2/command_report.tt2:107
-diff --git a/sympa-6.1.22-src/po/it.po b/sympa-6.1.22-src/po/it.po
+diff --git a/sympa-6.1.25/po/it.po b/sympa-6.1.25/po/it.po
 index 243798d..d0c355f 100755
---- a/sympa-6.1.22-src/po/it.po
-+++ b/sympa-6.1.22-src/po/it.po
+--- a/sympa-6.1.25/po/it.po
++++ b/sympa-6.1.25/po/it.po
 @@ -5673,6 +5673,11 @@ msgstr "Errore di sintassi nel comando."
  msgid "List '%1' does not exist."
  msgstr "La lista '%1' non esiste."
@@ -197,10 +197,10 @@ index 243798d..d0c355f 100755
  # nlsref 6,91
  #. (u_err.listname)
  #: ../mail_tt2/command_report.tt2:107
-diff --git a/sympa-6.1.22-src/po/pt.po b/sympa-6.1.22-src/po/pt.po
+diff --git a/sympa-6.1.25/po/pt.po b/sympa-6.1.25/po/pt.po
 index f84f385..e131b47 100755
---- a/sympa-6.1.22-src/po/pt.po
-+++ b/sympa-6.1.22-src/po/pt.po
+--- a/sympa-6.1.25/po/pt.po
++++ b/sympa-6.1.25/po/pt.po
 @@ -5286,6 +5286,11 @@ msgstr ""
  msgid "List '%1' does not exist."
  msgstr ""
@@ -213,10 +213,10 @@ index f84f385..e131b47 100755
  #. (u_err.listname)
  #: ../mail_tt2/command_report.tt2:107
  msgid "%1 mailing list does not provide subscriber preferences."
-diff --git a/sympa-6.1.22-src/src/lib/Commands.pm b/sympa-6.1.22-src/src/lib/Commands.pm
+diff --git a/sympa-6.1.25/src/lib/Commands.pm b/sympa-6.1.25/src/lib/Commands.pm
 index 173374e..8f00c9a 100644
---- a/sympa-6.1.22-src/src/lib/Commands.pm
-+++ b/sympa-6.1.22-src/src/lib/Commands.pm
+--- a/sympa-6.1.25/src/lib/Commands.pm
++++ b/sympa-6.1.25/src/lib/Commands.pm
 @@ -2015,6 +2015,19 @@ sub distribute {
  	return 'unknown_list';
      }
@@ -237,10 +237,10 @@ index 173374e..8f00c9a 100644
      &Language::SetLang($list->{'admin'}{'lang'});
  
      #read the moderation queue and purge it
-diff --git a/sympa-6.1.22-src/src/lib/confdef.pm b/sympa-6.1.22-src/src/lib/confdef.pm
+diff --git a/sympa-6.1.25/src/lib/confdef.pm b/sympa-6.1.25/src/lib/confdef.pm
 index 012d717..0dbb4e8 100644
---- a/sympa-6.1.22-src/src/lib/confdef.pm
-+++ b/sympa-6.1.22-src/src/lib/confdef.pm
+--- a/sympa-6.1.25/src/lib/confdef.pm
++++ b/sympa-6.1.25/src/lib/confdef.pm
 @@ -1548,6 +1548,22 @@ our @params = (
          'edit'    => '1',
          'file'    => 'sympa.conf',
@@ -264,10 +264,10 @@ index 012d717..0dbb4e8 100644
  
  ## Not implemented yet.
  ##    {
-diff --git a/sympa-6.1.22-src/src/sympa.pl.in b/sympa-6.1.22-src/src/sympa.pl.in
+diff --git a/sympa-6.1.25/src/sympa.pl.in b/sympa-6.1.25/src/sympa.pl.in
 index 6c307dd..96f9733 100644
---- a/sympa-6.1.22-src/src/sympa.pl.in
-+++ b/sympa-6.1.22-src/src/sympa.pl.in
+--- a/sympa-6.1.25/src/sympa.pl.in
++++ b/sympa-6.1.25/src/sympa.pl.in
 @@ -1982,9 +1982,27 @@ sub DoMessage{
      my $auth_method = 'smtp';   
      $auth_method = 'dkim' if ($message->{'dkim_pass'});
@@ -297,10 +297,10 @@ index 6c307dd..96f9733 100644
  
      unless (defined $action) {
  	&do_log('err', 'sympa::DoMessage(): message (%s) ignored because unable to evaluate scenario "send" for list %s',$messageid,$listname);
-diff --git a/sympa-6.1.22-src/web_tt2/error.tt2 b/sympa-6.1.22-src/web_tt2/error.tt2
+diff --git a/sympa-6.1.25/web_tt2/error.tt2 b/sympa-6.1.25/web_tt2/error.tt2
 index 8bede87..65d97b8 100644
---- a/sympa-6.1.22-src/web_tt2/error.tt2
-+++ b/sympa-6.1.22-src/web_tt2/error.tt2
+--- a/sympa-6.1.25/web_tt2/error.tt2
++++ b/sympa-6.1.25/web_tt2/error.tt2
 @@ -79,6 +79,7 @@
    [% ELSIF u_err.msg == 'listname_needed' %][%|loc%]You need to provide list name[%END%]
    [% ELSIF u_err.msg == 'already_moderated' %][%|loc%]Failed to moderate a message; it was probably moderated by another moderator[%END%]
@@ -309,10 +309,10 @@ index 8bede87..65d97b8 100644
    [% ELSIF u_err.msg == 'empty_archives' %][%|loc%]Archives are empty for this list[%END%]
    [% ELSIF u_err.msg == 'didnt_change_anything' %][%|loc%]You did not select an action to perform[%END%]
    [% ELSIF u_err.msg == 'no_bounce_user' %][%|loc(u_err.email)%]No bounce for user  %1[%END%]
-diff --git a/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in b/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
+diff --git a/sympa-6.1.25/wwsympa/wwsympa.fcgi.in b/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
 index a31f9ff..5c5af41 100644
---- a/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
-+++ b/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
+--- a/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
++++ b/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
 @@ -7040,6 +7040,17 @@ sub do_skinsedit {
  	 return undef;
       } 
diff --git a/6.1.25/patches/09_1913_email_validation.patch b/6.1.25/patches/09_1913_email_validation.patch
index db47feeb6d1af4c72653eb0900f3a5698630f3ca..820b02bd89fd6a2e7a0a25cc8326bd5fb3c0eee9 100644
--- a/6.1.25/patches/09_1913_email_validation.patch
+++ b/6.1.25/patches/09_1913_email_validation.patch
@@ -1,7 +1,7 @@
-diff --cc sympa-6.1.22-src/po/sympa.pot
+diff --cc sympa-6.1.25/po/sympa.pot
 index 81e0251,833acf6..0000000
---- a/sympa-6.1.22-src/po/sympa.pot
-+++ b/sympa-6.1.22-src/po/sympa.pot
+--- a/sympa-6.1.25/po/sympa.pot
++++ b/sympa-6.1.25/po/sympa.pot
 @@@ -8691,3 -8691,39 +8691,39 @@@ msgstr "
   #: ../wwsympa/wwslib.pm:39
   msgid "no mail (useful for vacations)"
@@ -44,10 +44,10 @@ index 81e0251,833acf6..0000000
 + msgid "The local part of the email address is greater then 64 characters",
 + msgstr ""
 
-diff --git a/sympa-6.1.22-src/soap/sympasoap.pm b/sympa-6.1.22-src/soap/sympasoap.pm
+diff --git a/sympa-6.1.25/soap/sympasoap.pm b/sympa-6.1.25/soap/sympasoap.pm
 index bfc6d7c..810e155 100644
---- a/sympa-6.1.22-src/soap/sympasoap.pm
-+++ b/sympa-6.1.22-src/soap/sympasoap.pm
+--- a/sympa-6.1.25/soap/sympasoap.pm
++++ b/sympa-6.1.25/soap/sympasoap.pm
 @@ -771,8 +771,9 @@ sub add {
  	$u->{'password'} = $u2->{'password'} || &tools::tmp_passwd($email) ;
  	$u->{'lang'} = $u2->{'lang'} || $list->{'admin'}{'lang'};
@@ -73,10 +73,10 @@ index bfc6d7c..810e155 100644
        }
        
        if ($List::use_db) {
-diff --git a/sympa-6.1.22-src/src/lib/Commands.pm b/sympa-6.1.22-src/src/lib/Commands.pm
+diff --git a/sympa-6.1.25/src/lib/Commands.pm b/sympa-6.1.25/src/lib/Commands.pm
 index 8f00c9a..1ed166b 100644
---- a/sympa-6.1.22-src/src/lib/Commands.pm
-+++ b/sympa-6.1.22-src/src/lib/Commands.pm
+--- a/sympa-6.1.25/src/lib/Commands.pm
++++ b/sympa-6.1.25/src/lib/Commands.pm
 @@ -833,8 +833,13 @@ sub subscribe {
  	    $u->{'gecos'} = $comment;
  	    $u->{'date'} = $u->{'update_date'} = time;
@@ -110,10 +110,10 @@ index 8f00c9a..1ed166b 100644
  		&report::reject_report_cmd('intern',$error,{'listname'=>$which},$cmd_line,$sender,$robot);
  		return undef; 
  	    }
-diff --git a/sympa-6.1.22-src/src/lib/Message.pm b/sympa-6.1.22-src/src/lib/Message.pm
+diff --git a/sympa-6.1.25/src/lib/Message.pm b/sympa-6.1.25/src/lib/Message.pm
 index fcddac9..ac45e66 100644
---- a/sympa-6.1.22-src/src/lib/Message.pm
-+++ b/sympa-6.1.22-src/src/lib/Message.pm
+--- a/sympa-6.1.25/src/lib/Message.pm
++++ b/sympa-6.1.25/src/lib/Message.pm
 @@ -347,7 +347,8 @@ sub _get_envelope_sender {
  	    return '<>';
  	} else {
@@ -136,10 +136,10 @@ index fcddac9..ac45e66 100644
  	return undef;
      }
  
-diff --git a/sympa-6.1.22-src/src/lib/Upgrade.pm b/sympa-6.1.22-src/src/lib/Upgrade.pm
+diff --git a/sympa-6.1.25/src/lib/Upgrade.pm b/sympa-6.1.25/src/lib/Upgrade.pm
 index 394ad7a..7a3b57f 100644
---- a/sympa-6.1.22-src/src/lib/Upgrade.pm
-+++ b/sympa-6.1.22-src/src/lib/Upgrade.pm
+--- a/sympa-6.1.25/src/lib/Upgrade.pm
++++ b/sympa-6.1.25/src/lib/Upgrade.pm
 @@ -616,9 +616,11 @@ sub upgrade {
  		$list->{'total'} = 0;
  		
@@ -154,10 +154,10 @@ index 394ad7a..7a3b57f 100644
  		    next;
  		}
  		
-diff --git a/sympa-6.1.22-src/src/sympa.pl.in b/sympa-6.1.22-src/src/sympa.pl.in
+diff --git a/sympa-6.1.25/src/sympa.pl.in b/sympa-6.1.25/src/sympa.pl.in
 index 96f9733..ea4bff9 100644
---- a/sympa-6.1.22-src/src/sympa.pl.in
-+++ b/sympa-6.1.22-src/src/sympa.pl.in
+--- a/sympa-6.1.25/src/sympa.pl.in
++++ b/sympa-6.1.25/src/sympa.pl.in
 @@ -535,8 +535,11 @@ if ($main::options{'dump'}) {
  	$u->{'email'} = $email;
  	$u->{'gecos'} = $gecos;
@@ -172,10 +172,10 @@ index 96f9733..ea4bff9 100644
  	    next;
  	}
  	print STDERR '+';
-diff --git a/sympa-6.1.22-src/web_tt2/error.tt2 b/sympa-6.1.22-src/web_tt2/error.tt2
+diff --git a/sympa-6.1.25/web_tt2/error.tt2 b/sympa-6.1.25/web_tt2/error.tt2
 index 65d97b8..3518609 100644
---- a/sympa-6.1.22-src/web_tt2/error.tt2
-+++ b/sympa-6.1.22-src/web_tt2/error.tt2
+--- a/sympa-6.1.25/web_tt2/error.tt2
++++ b/sympa-6.1.25/web_tt2/error.tt2
 @@ -55,7 +55,7 @@
    [% ELSIF u_err.msg == 'missing_arg' %][%|loc(u_err.argument)%]Missing argument %1[%END%]
    [% ELSIF u_err.msg == 'wrong_value' %][%|loc(u_err.argument)%]Wrong value for parameter %1[%END%]
@@ -185,10 +185,10 @@ index 65d97b8..3518609 100644
    [% ELSIF u_err.msg == 'incorrect_passwd' %][%|loc%]Provided password is incorrect[%END%]
    [% ELSIF u_err.msg == 'init_passwd' %][%|loc%]You did not choose a password, request a reminder of the initial password[%END%]
    [% ELSIF u_err.msg == 'ldap_user' %][%|loc%]Your password is stored in an LDAP directory, therefore Sympa cannot post you a reminder[%END%]
-diff --git a/sympa-6.1.22-src/wwsympa/Auth.pm b/sympa-6.1.22-src/wwsympa/Auth.pm
+diff --git a/sympa-6.1.25/wwsympa/Auth.pm b/sympa-6.1.25/wwsympa/Auth.pm
 index 144ad29..d57e912 100644
---- a/sympa-6.1.22-src/wwsympa/Auth.pm
-+++ b/sympa-6.1.22-src/wwsympa/Auth.pm
+--- a/sympa-6.1.25/wwsympa/Auth.pm
++++ b/sympa-6.1.25/wwsympa/Auth.pm
 @@ -54,7 +54,8 @@ sub password_fingerprint{
  
       my ($canonic, $user);
@@ -209,10 +209,10 @@ index 144ad29..d57e912 100644
  	 return ($auth);
       }else{
  	 return lc($canonic_email[0]);
-diff --git a/sympa-6.1.22-src/wwsympa/wwslib.pm b/sympa-6.1.22-src/wwsympa/wwslib.pm
+diff --git a/sympa-6.1.25/wwsympa/wwslib.pm b/sympa-6.1.25/wwsympa/wwslib.pm
 index 1d13a3d..be8ba46 100644
---- a/sympa-6.1.22-src/wwsympa/wwslib.pm
-+++ b/sympa-6.1.22-src/wwsympa/wwslib.pm
+--- a/sympa-6.1.25/wwsympa/wwslib.pm
++++ b/sympa-6.1.25/wwsympa/wwslib.pm
 @@ -274,13 +274,6 @@ sub new_passwd {
      return 'init'.$passwd;
  }
@@ -227,10 +227,10 @@ index 1d13a3d..be8ba46 100644
  sub init_passwd {
      my ($robot, $email, $data) = @_;
      
-diff --git a/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in b/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
+diff --git a/sympa-6.1.25/wwsympa/wwsympa.fcgi.in b/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
 index 5c5af41..d78a479 100644
---- a/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
-+++ b/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
+--- a/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
++++ b/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
 @@ -3605,7 +3605,8 @@ sub do_sso_login_succeeded {
  	     my @alternative_conf = split(/,/,$ldap->{'alternative_email_attribute'});
  	     my $attrs = $ldap->{'email_attribute'};
@@ -379,10 +379,10 @@ index 5c5af41..d78a479 100644
  	 &wwslog('info',"d_set_owner : $in{'content'} : incorrect email");
  	 &web_db_log({'robot' => $robot,'list' => $list->{'name'},'action' => $param->{'action'},'parameters' => "$in{'name_doc'}",'target_email' => "",'msg_id' => '','status' => 'error','error_type' => 'incorrect_email','user_email' => $param->{'user'}{'email'},'client' => $ip,'daemon' => $daemon_name});
  	 return undef;
-diff --git a/sympa-6.1.22-src/src/lib/List.pm b/sympa-6.1.22-src/src/lib/List.pm
+diff --git a/sympa-6.1.25/src/lib/List.pm b/sympa-6.1.25/src/lib/List.pm
 index ca917d4..522e1e5 100644
---- a/sympa-6.1.22-src/src/lib/List.pm
-+++ b/sympa-6.1.22-src/src/lib/List.pm
+--- a/sympa-6.1.25/src/lib/List.pm
++++ b/sympa-6.1.25/src/lib/List.pm
 @@ -7516,10 +7516,13 @@ sub add_user {
      unless ($dbh and $dbh->ping) {
  	return undef unless &db_connect();
@@ -420,10 +420,10 @@ index ca917d4..522e1e5 100644
  		return undef;
  	    }
  	    if ($user_added) {
-diff --git a/sympa-6.1.22-src/src/lib/tools.pm b/sympa-6.1.22-src/src/lib/tools.pm
+diff --git a/sympa-6.1.25/src/lib/tools.pm b/sympa-6.1.25/src/lib/tools.pm
 index d9be037..2cae36f 100644
---- a/sympa-6.1.22-src/src/lib/tools.pm
-+++ b/sympa-6.1.22-src/src/lib/tools.pm
+--- a/sympa-6.1.25/src/lib/tools.pm
++++ b/sympa-6.1.25/src/lib/tools.pm
 @@ -2737,13 +2737,47 @@ sub valid_email {
      
      unless ($email =~ /^$regexp{'email'}$/) {
@@ -474,10 +474,10 @@ index d9be037..2cae36f 100644
      }
  
      return 1;
-diff --git a/sympa-6.1.22-src/src/lib/confdef.pm b/sympa-6.1.22-src/src/lib/confdef.pm
+diff --git a/sympa-6.1.25/src/lib/confdef.pm b/sympa-6.1.25/src/lib/confdef.pm
 index 0dbb4e8..548f55c 100644
---- a/sympa-6.1.22-src/src/lib/confdef.pm
-+++ b/sympa-6.1.22-src/src/lib/confdef.pm
+--- a/sympa-6.1.25/src/lib/confdef.pm
++++ b/sympa-6.1.25/src/lib/confdef.pm
 @@ -1564,6 +1564,14 @@ our @params = (
          'edit'    => '1',
          'file'    => 'sympa.conf',
@@ -493,10 +493,10 @@ index 0dbb4e8..548f55c 100644
  
  ## Not implemented yet.
  ##    {
-diff --git a/sympa-6.1.22-src/src/sympa_wizard.pl.in b/sympa-6.1.22-src/src/sympa_wizard.pl.in
+diff --git a/sympa-6.1.25/src/sympa_wizard.pl.in b/sympa-6.1.25/src/sympa_wizard.pl.in
 index 0d4789d..3ee8c82 100644
---- a/sympa-6.1.22-src/src/sympa_wizard.pl.in
-+++ b/sympa-6.1.22-src/src/sympa_wizard.pl.in
+--- a/sympa-6.1.25/src/sympa_wizard.pl.in
++++ b/sympa-6.1.25/src/sympa_wizard.pl.in
 @@ -380,6 +380,12 @@ sub check_cpan {
  				     mandatory => 1,
  				     usage => 'module for character encoding processing',
@@ -510,10 +510,10 @@ index 0d4789d..3ee8c82 100644
  			'FCGI' => {
  				   required_version => '0.67',
  				   package_name => 'FCGI',
-diff --git a/sympa-6.1.22-src/src/lib/confdef.pm b/sympa-6.1.22-src/src/lib/confdef.pm
+diff --git a/sympa-6.1.25/src/lib/confdef.pm b/sympa-6.1.25/src/lib/confdef.pm
 index 7b471dc..9feb752 100644
---- a/sympa-6.1.22-src/src/lib/confdef.pm
-+++ b/sympa-6.1.22-src/src/lib/confdef.pm
+--- a/sympa-6.1.25/src/lib/confdef.pm
++++ b/sympa-6.1.25/src/lib/confdef.pm
 @@ -1570,6 +1570,7 @@ our @params = (
          'default' => 'tldcheck,fqdn,rfc822',
          'edit'    => '1',
diff --git a/6.1.25/patches/10_3981_forbid_weak_passwords.patch b/6.1.25/patches/10_3981_forbid_weak_passwords.patch
index 06c4ad6d742e9671ee2d0a0738b11b7df931388c..80098e239fda88c0ab0e01a0ae2bf304dac15337 100644
--- a/6.1.25/patches/10_3981_forbid_weak_passwords.patch
+++ b/6.1.25/patches/10_3981_forbid_weak_passwords.patch
@@ -1,7 +1,7 @@
-diff --git a/sympa-6.1.22-src/po/de.po b/sympa-6.1.22-src/po/de.po
+diff --git a/sympa-6.1.25/po/de.po b/sympa-6.1.25/po/de.po
 index f3d84f9..911ece1 100755
---- a/sympa-6.1.22-src/po/de.po
-+++ b/sympa-6.1.22-src/po/de.po
+--- a/sympa-6.1.25/po/de.po
++++ b/sympa-6.1.25/po/de.po
 @@ -10919,6 +10919,11 @@ msgid ""
  "Visit  %3/oauth_check/%2 to check the token state and renew it if necessary."
  msgstr ""
@@ -14,10 +14,10 @@ index f3d84f9..911ece1 100755
  #~ msgid "The configuration file contains errors.\n"
  #~ msgstr "Diese Konfigurationsdatei enthält Fehler.\n"
  
-diff --git a/sympa-6.1.22-src/po/el.po b/sympa-6.1.22-src/po/el.po
+diff --git a/sympa-6.1.25/po/el.po b/sympa-6.1.25/po/el.po
 index e89be0b..33b636f 100755
---- a/sympa-6.1.22-src/po/el.po
-+++ b/sympa-6.1.22-src/po/el.po
+--- a/sympa-6.1.25/po/el.po
++++ b/sympa-6.1.25/po/el.po
 @@ -11012,6 +11012,10 @@ msgstr ""
  msgid "%s / %s"
  msgstr ""
@@ -29,10 +29,10 @@ index e89be0b..33b636f 100755
  #, fuzzy
  #~ msgid "The configuration file contains errors.\n"
  #~ msgstr "Το αρχείο διαμόρφωσης --CONFIG-- περιέχει λάθη.\n"
-diff --git a/sympa-6.1.22-src/po/es.po b/sympa-6.1.22-src/po/es.po
+diff --git a/sympa-6.1.25/po/es.po b/sympa-6.1.25/po/es.po
 index 557f0bc..b8d32c9 100755
---- a/sympa-6.1.22-src/po/es.po
-+++ b/sympa-6.1.22-src/po/es.po
+--- a/sympa-6.1.25/po/es.po
++++ b/sympa-6.1.25/po/es.po
 @@ -11170,6 +11170,10 @@ msgstr ""
  msgid "Plugin"
  msgstr ""
@@ -44,10 +44,10 @@ index 557f0bc..b8d32c9 100755
  #, fuzzy
  #~ msgid "The configuration file contains errors.\n"
  #~ msgstr "El archivo de configuración --CONFIG-- contiene errores.\n"
-diff --git a/sympa-6.1.22-src/po/fr.po b/sympa-6.1.22-src/po/fr.po
+diff --git a/sympa-6.1.25/po/fr.po b/sympa-6.1.25/po/fr.po
 index e40d819..45c9a25 100755
---- a/sympa-6.1.22-src/po/fr.po
-+++ b/sympa-6.1.22-src/po/fr.po
+--- a/sympa-6.1.25/po/fr.po
++++ b/sympa-6.1.25/po/fr.po
 @@ -10474,6 +10474,10 @@ msgstr "modèle d'alias de liste"
  msgid "no mail (useful for vacations)"
  msgstr "interrompre la réception des messages (utile pendant les vacances)"
@@ -59,10 +59,10 @@ index e40d819..45c9a25 100755
  #~ msgid "The configuration file contains errors.\n"
  #~ msgstr "Le fichier de configuration contient des erreurs.\n"
  
-diff --git a/sympa-6.1.22-src/po/it.po b/sympa-6.1.22-src/po/it.po
+diff --git a/sympa-6.1.25/po/it.po b/sympa-6.1.25/po/it.po
 index d0c355f..28a78ed 100755
---- a/sympa-6.1.22-src/po/it.po
-+++ b/sympa-6.1.22-src/po/it.po
+--- a/sympa-6.1.25/po/it.po
++++ b/sympa-6.1.25/po/it.po
 @@ -11363,6 +11363,10 @@ msgstr ""
  msgid "Searches are limited to 50 results, except when using a @domain mask."
  msgstr ""
@@ -74,10 +74,10 @@ index d0c355f..28a78ed 100755
  # nlsref 1,1
  #, fuzzy
  #~ msgid "The configuration file contains errors.\n"
-diff --git a/sympa-6.1.22-src/po/pt.po b/sympa-6.1.22-src/po/pt.po
+diff --git a/sympa-6.1.25/po/pt.po b/sympa-6.1.25/po/pt.po
 index e131b47..dd68b0e 100755
---- a/sympa-6.1.22-src/po/pt.po
-+++ b/sympa-6.1.22-src/po/pt.po
+--- a/sympa-6.1.25/po/pt.po
++++ b/sympa-6.1.25/po/pt.po
 @@ -11928,6 +11928,10 @@ msgid ""
  "was over the maximum size allowed on this list."
  msgstr ""
@@ -89,10 +89,10 @@ index e131b47..dd68b0e 100755
  #, fuzzy
  #~ msgid "URL of main Web page"
  #~ msgstr "Página de Administração %1"
-diff --git a/sympa-6.1.22-src/po/sympa.pot b/sympa-6.1.22-src/po/sympa.pot
+diff --git a/sympa-6.1.25/po/sympa.pot b/sympa-6.1.25/po/sympa.pot
 index 81e0251..cc5a732 100644
---- a/sympa-6.1.22-src/po/sympa.pot
-+++ b/sympa-6.1.22-src/po/sympa.pot
+--- a/sympa-6.1.25/po/sympa.pot
++++ b/sympa-6.1.25/po/sympa.pot
 @@ -8691,3 +8691,13 @@ msgstr ""
  #: ../wwsympa/wwslib.pm:39
  msgid "no mail (useful for vacations)"
@@ -107,10 +107,10 @@ index 81e0251..cc5a732 100644
 +msgstr ""
 +
 +
-diff --git a/sympa-6.1.22-src/soap/sympasoap.pm b/sympa-6.1.22-src/soap/sympasoap.pm
+diff --git a/sympa-6.1.25/soap/sympasoap.pm b/sympa-6.1.25/soap/sympasoap.pm
 index bfc6d7c..58e5309 100644
---- a/sympa-6.1.22-src/soap/sympasoap.pm
-+++ b/sympa-6.1.22-src/soap/sympasoap.pm
+--- a/sympa-6.1.25/soap/sympasoap.pm
++++ b/sympa-6.1.25/soap/sympasoap.pm
 @@ -768,7 +768,22 @@ sub add {
  	$u->{'email'} = $email;
  	$u->{'gecos'} = $gecos || $u2->{'gecos'};
@@ -135,10 +135,10 @@ index bfc6d7c..58e5309 100644
  	$u->{'lang'} = $u2->{'lang'} || $list->{'admin'}{'lang'};
  	
  	unless ($list->add_user($u)) {
-diff --git a/sympa-6.1.22-src/src/lib/confdef.pm b/sympa-6.1.22-src/src/lib/confdef.pm
+diff --git a/sympa-6.1.25/src/lib/confdef.pm b/sympa-6.1.25/src/lib/confdef.pm
 index 7b471dc..19aadfc 100644
---- a/sympa-6.1.22-src/src/lib/confdef.pm
-+++ b/sympa-6.1.22-src/src/lib/confdef.pm
+--- a/sympa-6.1.25/src/lib/confdef.pm
++++ b/sympa-6.1.25/src/lib/confdef.pm
 @@ -1571,6 +1571,13 @@ our @params = (
          'edit'    => '1',
          'file'    => 'sympa.conf',
@@ -153,10 +153,10 @@ index 7b471dc..19aadfc 100644
  
  ## Not implemented yet.
  ##    {
-diff --git a/sympa-6.1.22-src/src/lib/tools.pm b/sympa-6.1.22-src/src/lib/tools.pm
+diff --git a/sympa-6.1.25/src/lib/tools.pm b/sympa-6.1.25/src/lib/tools.pm
 index 37bd999..e0af65f 100644
---- a/sympa-6.1.22-src/src/lib/tools.pm
-+++ b/sympa-6.1.22-src/src/lib/tools.pm
+--- a/sympa-6.1.25/src/lib/tools.pm
++++ b/sympa-6.1.25/src/lib/tools.pm
 @@ -4048,4 +4048,28 @@ sub decode_header {
      }
  }
@@ -186,10 +186,10 @@ index 37bd999..e0af65f 100644
 +}
 +
  1;
-diff --git a/sympa-6.1.22-src/src/sympa_wizard.pl.in b/sympa-6.1.22-src/src/sympa_wizard.pl.in
+diff --git a/sympa-6.1.25/src/sympa_wizard.pl.in b/sympa-6.1.25/src/sympa_wizard.pl.in
 index cb886fd..c4d4c98 100644
---- a/sympa-6.1.22-src/src/sympa_wizard.pl.in
-+++ b/sympa-6.1.22-src/src/sympa_wizard.pl.in
+--- a/sympa-6.1.25/src/sympa_wizard.pl.in
++++ b/sympa-6.1.25/src/sympa_wizard.pl.in
 @@ -324,6 +324,12 @@ sub check_cpan {
  						 package_name => 'Crypt-CipherSaber',
  						 usage => 'this module provides reversible encryption of user passwords in the database.  Useful when updating from old version with password reversible encryption, or if secure session cookies in non-SSL environments are required.',
@@ -203,10 +203,10 @@ index cb886fd..c4d4c98 100644
  			'DB_File' => {
  				      required_version =>'1.75',
  				      package_name => 'DB_File',
-diff --git a/sympa-6.1.22-src/web_tt2/error.tt2 b/sympa-6.1.22-src/web_tt2/error.tt2
+diff --git a/sympa-6.1.25/web_tt2/error.tt2 b/sympa-6.1.25/web_tt2/error.tt2
 index 65d97b8..3cd16b5 100644
---- a/sympa-6.1.22-src/web_tt2/error.tt2
-+++ b/sympa-6.1.22-src/web_tt2/error.tt2
+--- a/sympa-6.1.25/web_tt2/error.tt2
++++ b/sympa-6.1.25/web_tt2/error.tt2
 @@ -74,6 +74,7 @@
    [% ELSIF u_err.msg == 'user_already_subscriber' %][%|loc(u_err.email,u_err.list)%]%1 is already subscribed to the list %2[%END%] 
    [% ELSIF u_err.msg == 'no_passwd' %][%|loc%]Please provide your password[%END%]
@@ -215,10 +215,10 @@ index 65d97b8..3cd16b5 100644
    [% ELSIF u_err.msg == 'wrong_input_path' %][%|loc(u_err.tpl)%]Provided path is incorrect for template '%1'[%END%]
    [% ELSIF u_err.msg == 'cannot_open_file' %][%|loc(u_err.path)%]Cannot open file '%1'[%END%]
    [% ELSIF u_err.msg == 'listname_needed' %][%|loc%]You need to provide list name[%END%]
-diff --git a/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in b/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
+diff --git a/sympa-6.1.25/wwsympa/wwsympa.fcgi.in b/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
 index 5c5af41..8b366b0 100644
---- a/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
-+++ b/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
+--- a/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
++++ b/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
 @@ -4961,6 +4961,15 @@ sub do_subscribe {
  		$u->{'gecos'} = $param->{'user'}{'gecos'} || $in{'gecos'};
  		$u->{'date'} = $u->{'update_date'} = time;
@@ -265,10 +265,10 @@ index 5c5af41..8b366b0 100644
  	 $u->{'lang'} = $u2->{'lang'} || $list->{'admin'}{'lang'};
  	 if ($comma_emails) {
  	     $comma_emails = $comma_emails .','. $email;
-diff --git a/sympa-6.1.22-src/src/lib/confdef.pm b/sympa-6.1.22-src/src/lib/confdef.pm
+diff --git a/sympa-6.1.25/src/lib/confdef.pm b/sympa-6.1.25/src/lib/confdef.pm
 index 19aadfc..7154dea 100644
---- a/sympa-6.1.22-src/src/lib/confdef.pm
-+++ b/sympa-6.1.22-src/src/lib/confdef.pm
+--- a/sympa-6.1.25/src/lib/confdef.pm
++++ b/sympa-6.1.25/src/lib/confdef.pm
 @@ -1577,6 +1577,7 @@ our @params = (
          'default' => undef,
          'edit'    => '1',
@@ -277,10 +277,10 @@ index 19aadfc..7154dea 100644
      },
  
  ## Not implemented yet.
-diff --git a/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in b/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
+diff --git a/sympa-6.1.25/wwsympa/wwsympa.fcgi.in b/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
 index 4e0f580..156ebeb 100644
---- a/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
-+++ b/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
+--- a/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
++++ b/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
 @@ -4965,15 +4965,6 @@ sub do_subscribe {
  		$u->{'gecos'} = $param->{'user'}{'gecos'} || $in{'gecos'};
  		$u->{'date'} = $u->{'update_date'} = time;
diff --git a/6.1.25/patches/11_1187_full_name_removeal.2.patch b/6.1.25/patches/11_1187_full_name_removeal.2.patch
index 995ffd697490c0b096096fcabb90af9a96c2fc64..3f63ee40ca18ed3e90b6aaffb6313542b400fdf9 100644
--- a/6.1.25/patches/11_1187_full_name_removeal.2.patch
+++ b/6.1.25/patches/11_1187_full_name_removeal.2.patch
@@ -1,7 +1,7 @@
-diff --git a/sympa-6.1.22-src/web_tt2/editsubscriber.tt2 b/sympa-6.1.22-src/web_tt2/editsubscriber.tt2
+diff --git a/sympa-6.1.25/web_tt2/editsubscriber.tt2 b/sympa-6.1.25/web_tt2/editsubscriber.tt2
 index c8d40b6..7cb9040 100644
---- a/sympa-6.1.22-src/web_tt2/editsubscriber.tt2
-+++ b/sympa-6.1.22-src/web_tt2/editsubscriber.tt2
+--- a/sympa-6.1.25/web_tt2/editsubscriber.tt2
++++ b/sympa-6.1.25/web_tt2/editsubscriber.tt2
 @@ -9,8 +9,6 @@
  <input type="hidden" name="email" value="[% current_subscriber.escaped_email %]" />
  <label for="new_email">[%|loc%]Email:[%END%]  </label>
@@ -11,10 +11,10 @@ index c8d40b6..7cb9040 100644
  [% IF current_subscriber.custom_attribute %]
  [% SET subscriber = current_subscriber ;
  PROCESS edit_attributes.tt2 ;
-diff --git a/sympa-6.1.22-src/web_tt2/subscriber_table.tt2 b/sympa-6.1.22-src/web_tt2/subscriber_table.tt2
+diff --git a/sympa-6.1.25/web_tt2/subscriber_table.tt2 b/sympa-6.1.25/web_tt2/subscriber_table.tt2
 index 5f1a4b9..db685e5 100644
---- a/sympa-6.1.22-src/web_tt2/subscriber_table.tt2
-+++ b/sympa-6.1.22-src/web_tt2/subscriber_table.tt2
+--- a/sympa-6.1.25/web_tt2/subscriber_table.tt2
++++ b/sympa-6.1.25/web_tt2/subscriber_table.tt2
 @@ -28,14 +28,6 @@
    	    [%|loc%]Picture[%END%]
  	    </th>
@@ -42,10 +42,10 @@ index 5f1a4b9..db685e5 100644
  	  [% IF is_listmaster || is_owner || is_editor  %]
    	    <td>
    	      [%|optdesc('reception')%][% u.reception %][% END %]
-diff --git a/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in b/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
+diff --git a/sympa-6.1.25/wwsympa/wwsympa.fcgi.in b/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
 index 120bf9a..db67bd3 100644
---- a/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
-+++ b/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
+--- a/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
++++ b/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
 @@ -4723,11 +4723,7 @@ sub do_pref {
  	 }
       }
diff --git a/6.1.25/patches/11_1187_full_name_removeal.patch b/6.1.25/patches/11_1187_full_name_removeal.patch
index 3d4760c857138a2ea587b4b8640eeb36efddc3f8..90f72ad5d03e25a1086fe145d04beb7e79f94db0 100644
--- a/6.1.25/patches/11_1187_full_name_removeal.patch
+++ b/6.1.25/patches/11_1187_full_name_removeal.patch
@@ -1,7 +1,7 @@
-diff --git a/sympa-6.1.22-src/web_tt2/pref.tt2 b/sympa-6.1.22-src/web_tt2/pref.tt2
+diff --git a/sympa-6.1.25/web_tt2/pref.tt2 b/sympa-6.1.25/web_tt2/pref.tt2
 index 3ffc1c4..f1b5bcf 100644
---- a/sympa-6.1.22-src/web_tt2/pref.tt2
-+++ b/sympa-6.1.22-src/web_tt2/pref.tt2
+--- a/sympa-6.1.25/web_tt2/pref.tt2
++++ b/sympa-6.1.25/web_tt2/pref.tt2
 @@ -7,7 +7,6 @@
  <form action="[% path_cgi %]" method="post">
    <fieldset>
@@ -10,10 +10,10 @@ index 3ffc1c4..f1b5bcf 100644
      <label for="lang">[%|loc%]Language:[%END%]  </label><select id="lang" name="lang" class="LanguageNeutral">
                [% FOREACH l = languages %]
  		<option lang="[%l.value.lang_tag%]" xml:lang="[%l.value.lang_tag%]" value="[% l.key %]" [% l.value.selected %]>[% l.value.complete %]</option>
-diff --git a/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in b/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
+diff --git a/sympa-6.1.25/wwsympa/wwsympa.fcgi.in b/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
 index 156ebeb..120bf9a 100644
---- a/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
-+++ b/sympa-6.1.22-src/wwsympa/wwsympa.fcgi.in
+--- a/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
++++ b/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
 @@ -4794,7 +4794,7 @@ sub check_custom_attribute {
       &wwslog('info', 'do_setpref');
       my $changes = {};
diff --git a/sympa-6.1.25/mail_tt2/message_report.tt2 b/sympa-6.1.25/mail_tt2/message_report.tt2
index b8834cf3ca5c0981106967228ca579f83c7c2046..99c8a0fd4f3abcc125595b7e54023ff1faed57c6 100644
--- a/sympa-6.1.25/mail_tt2/message_report.tt2
+++ b/sympa-6.1.25/mail_tt2/message_report.tt2
@@ -54,6 +54,9 @@ Note: Because binary files have to be encoded in less-efficient ASCII format bef
 [% ELSIF entry == 'list_unknown' -%]
 
 [%|loc(listname)%]List '%1' does not exist.[%END%]
+[% ELSIF entry == 'max_list_dispatch' -%]
+
+[%|loc(max_list_dispatch)%]List size has exceded the limit, %1, set by the administrators.[%END%]
 [% ELSIF entry == 'dyn_cant_create' -%]
 
 [%|loc(listname)%]The %1 list could not be created.[%END%]
diff --git a/sympa-6.1.25/po-wwsympa/de.po b/sympa-6.1.25/po-wwsympa/de.po
old mode 100644
new mode 100755
index ebd517d242188e4c2b2ff19ff51bef458354b60b..72f987ec6a84108bd1261260883d3a86a05abdf3
--- a/sympa-6.1.25/po-wwsympa/de.po
+++ b/sympa-6.1.25/po-wwsympa/de.po
@@ -7557,3 +7557,8 @@ msgstr ""
 #~ "Textdatei oder relationalen Datenbank gespeichert werden oder von "
 #~ "verschiedenen externen Quellen inkludiert werden (Listen, Klartextdatei, "
 #~ "Ergebnis einer Abfrage)."
+
+#: ../web_tt2/error.tt2
+msgid "The number of subscribers for this list, '%1', is greater then the limit set by the list administrators, '%2'"
+msgstr "Die Zahl der Abonnenten für diese Liste, "% 1", ist größer als der von den Listenadministratoren festgesetzte Grenze, '% 2'"
+
diff --git a/sympa-6.1.25/po-wwsympa/el.po b/sympa-6.1.25/po-wwsympa/el.po
old mode 100644
new mode 100755
index 5f5c873ca3ca577e1d9293d1f8e50b296f226b7c..dd5a52e4b7bcf305fce20a65f7bd41d4402d6375
--- a/sympa-6.1.25/po-wwsympa/el.po
+++ b/sympa-6.1.25/po-wwsympa/el.po
@@ -5860,3 +5860,8 @@ msgstr ""
 #~ msgstr ""
 #~ "(Προκαθορισμένη τιμή: παραλαβή ταχυδρομείου,απόδειξη παραλαβής,επισκόπηση,"
 #~ "κοινή επισκόπηση,περίληψη,χωρίς ταχυδρομείο)"
+
+#: ../web_tt2/error.tt2
+msgid "The number of subscribers for this list, '%1', is greater then the limit set by the list administrators, '%2'"
+msgstr "Ο αριθμός των συνδρομητών για αυτήν τη λίστα, '% 1', είναι μεγαλύτερη από το όριο που καθορίζεται από τους διαχειριστές της λίστας '% 2'"
+
diff --git a/sympa-6.1.25/po-wwsympa/en.po b/sympa-6.1.25/po-wwsympa/en.po
old mode 100644
new mode 100755
index b4383f5b0311d7e8a0297066a2ba62cc57f9ac25..484a4335340ab42da7c28e583ee21e2b6b68e805
--- a/sympa-6.1.25/po-wwsympa/en.po
+++ b/sympa-6.1.25/po-wwsympa/en.po
@@ -7272,6 +7272,10 @@ msgstr ""
 "in nomail mode, he or she will again receive individual mail messages from "
 "the list."
 
+#: ../web_tt2/error.tt2
+msgid "The number of subscribers for this list, '%1', is greater then the limit set by the list administrators, '%2'"
+msgstr "The number of subscribers for this list, '%1', is greater then the limit set by the list administrators, '%2'"
+
 #~ msgid "subscribers (private);"
 #~ msgstr "subscribers (private);"
 
diff --git a/sympa-6.1.25/po-wwsympa/es.po b/sympa-6.1.25/po-wwsympa/es.po
old mode 100644
new mode 100755
index 2b7c2bfe3f9a7c7e98087add8d41cd68e03099d2..43e33d222b096cd3de4849ff12f60e6318208c09
--- a/sympa-6.1.25/po-wwsympa/es.po
+++ b/sympa-6.1.25/po-wwsympa/es.po
@@ -7532,3 +7532,7 @@ msgstr ""
 
 #~ msgid "value"
 #~ msgstr "valor"
+
+#: ../web_tt2/error.tt2
+msgid "The number of subscribers for this list, '%1', is greater then the limit set by the list administrators, '%2'"
+msgstr "El número de suscriptores de esta lista, '% 1', es mayor que el límite establecido por los administradores de la lista, '% 2'"
diff --git a/sympa-6.1.25/po-wwsympa/fr.po b/sympa-6.1.25/po-wwsympa/fr.po
index e65dff15b9d8407ee727a4f8201e6928db17133f..6ed5e386d752c25f2ce2e2e4a952d1ebd9fb8505 100644
--- a/sympa-6.1.25/po-wwsympa/fr.po
+++ b/sympa-6.1.25/po-wwsympa/fr.po
@@ -7921,3 +7921,7 @@ msgstr ""
 # nlsref 16,91
 #~ msgid "value"
 #~ msgstr "valeur"
+
+#: ../web_tt2/error.tt2
+msgid "The number of subscribers for this list, '%1', is greater then the limit set by the list administrators, '%2'"
+msgstr "Le nombre d'abonnés à cette liste, '% 1', est supérieure à la limite fixée par les administrateurs de la liste, '% 2'"
diff --git a/sympa-6.1.25/po-wwsympa/it.po b/sympa-6.1.25/po-wwsympa/it.po
old mode 100644
new mode 100755
index 343435142da36d5e1aac61d16c1d0b2ae7b66bcd..10ae26574fe5d9b887a918759dbc0230c3839af6
--- a/sympa-6.1.25/po-wwsympa/it.po
+++ b/sympa-6.1.25/po-wwsympa/it.po
@@ -5891,3 +5891,7 @@ msgstr ""
 # nlsref 16,91
 #~ msgid "value"
 #~ msgstr "valore"
+
+#: ../web_tt2/error.tt2
+msgid "The number of subscribers for this list, '%1', is greater then the limit set by the list administrators, '%2'"
+msgstr "Il numero di abbonati per questa lista, '% 1', è maggiore del limite fissato dagli amministratori della lista, '% 2'"
diff --git a/sympa-6.1.25/po-wwsympa/pt.po b/sympa-6.1.25/po-wwsympa/pt.po
old mode 100644
new mode 100755
index 13c8230f5a61df266c168526301244d466941da8..8784ff2eb0b43283ecaed3702ea243bb033434ee
--- a/sympa-6.1.25/po-wwsympa/pt.po
+++ b/sympa-6.1.25/po-wwsympa/pt.po
@@ -5509,3 +5509,7 @@ msgstr ""
 #~ msgstr ""
 #~ "(Valor por defeito: modo de recepção mail,notice,digest,digestplain,"
 #~ "summary,nomail)"
+
+#: ../web_tt2/error.tt2
+msgid "The number of subscribers for this list, '%1', is greater then the limit set by the list administrators, '%2'"
+msgstr "O número de assinantes para esta lista, '% 1', é maior do que o limite definido pelos administradores da lista, '% 2'"
diff --git a/sympa-6.1.25/po/de.po b/sympa-6.1.25/po/de.po
old mode 100644
new mode 100755
index 2efd0af87e54b54379fefd1eabf6f5123fbd9e72..832a251ccb156c521b21899c21146079ee9419c2
--- a/sympa-6.1.25/po/de.po
+++ b/sympa-6.1.25/po/de.po
@@ -5597,6 +5597,11 @@ msgstr "Befehls-Syntaxfehler."
 msgid "List '%1' does not exist."
 msgstr "Liste '%1' existiert nicht."
 
+#. (u_err.max_list_dispatch)
+#: default/mail_tt2/message_report.tt2:59
+msgid "List size has exceded the limit, %1, set by the administrators."
+msgstr "Größe der Liste hat die Grenze,% 1, die von den Administratoren übertraf."
+
 #. (u_err.listname)
 #: ../mail_tt2/command_report.tt2:107
 msgid "%1 mailing list does not provide subscriber preferences."
@@ -10926,6 +10931,11 @@ msgid ""
 "Visit  %3/oauth_check/%2 to check the token state and renew it if necessary."
 msgstr ""
 
+
+#: ../default/web_tt2/error.tt2:77
+msgid "The password you typed does not match this sites standards of strength: %1. Please pick a stronger password."
+msgstr "Die von Ihnen eingegebene Passwort stimmt nicht mit diesen Seiten Normen der Stärke:% 1. Bitte wählen Sie eine stärkere Passwort."
+
 #~ msgid "The configuration file contains errors.\n"
 #~ msgstr "Diese Konfigurationsdatei enthält Fehler.\n"
 
diff --git a/sympa-6.1.25/po/el.po b/sympa-6.1.25/po/el.po
old mode 100644
new mode 100755
index 77d9c27b28d927d542fe5ef98721ff25857bc566..6e06d6ce74b5cdae1ac97282e647da8813829d26
--- a/sympa-6.1.25/po/el.po
+++ b/sympa-6.1.25/po/el.po
@@ -5598,6 +5598,11 @@ msgstr "Λάθος σύνταξη εντολής."
 msgid "List '%1' does not exist."
 msgstr "Η λίστα '%1' δεν υπάρχει."
 
+#. (u_err.max_list_dispatch)
+#: default/mail_tt2/message_report.tt2:59
+msgid "List size has exceded the limit, %1, set by the administrators."
+msgstr "Μέγεθος της λίστας έχει exceded το όριο, 1%, που καθορίζεται από τους διαχειριστές."
+
 #. (u_err.listname)
 #: ../mail_tt2/command_report.tt2:107
 msgid "%1 mailing list does not provide subscriber preferences."
@@ -11019,6 +11024,10 @@ msgstr ""
 msgid "%s / %s"
 msgstr ""
 
+#: ../default/web_tt2/error.tt2:77
+msgid "The password you typed does not match this sites standards of strength: %1. Please pick a stronger password."
+msgstr "Ο κωδικός πρόσβασης που πληκτρολογήσατε δεν ταιριάζει με αυτό sites πρότυπα της δύναμης:% 1. Παρακαλώ επιλέξτε μια ισχυρότερη κωδικό πρόσβασης."
+
 #, fuzzy
 #~ msgid "The configuration file contains errors.\n"
 #~ msgstr "Το αρχείο διαμόρφωσης --CONFIG-- περιέχει λάθη.\n"
diff --git a/sympa-6.1.25/po/en.po b/sympa-6.1.25/po/en.po
index 133b101e424050e2df54573f280c9599f2be4508..e10172f235dd3c4bd29436d4d0e841184c4e0f30 100755
--- a/sympa-6.1.25/po/en.po
+++ b/sympa-6.1.25/po/en.po
@@ -5723,6 +5723,11 @@ msgstr "This list archive is empty."
 msgid "Required file does not exist."
 msgstr "Required file does not exist."
 
+#. (u_err.max_list_dispatch)
+#: default/mail_tt2/message_report.tt2:59
+msgid "List size has exceded the limit, %1, set by the administrators."
+msgstr "List size has exceded the limit, %1, set by the administrators."
+
 #. (u_err.listname)
 #: ../mail_tt2/command_report.tt2:139
 msgid "List %1 has no subscriber."
diff --git a/sympa-6.1.25/po/es.po b/sympa-6.1.25/po/es.po
old mode 100644
new mode 100755
index ccb4eed73c64d5d52b0c9b253cfe11ad90a655d0..8421993fbd4b9d41fda7bc1ec56f64819ad8a109
--- a/sympa-6.1.25/po/es.po
+++ b/sympa-6.1.25/po/es.po
@@ -5591,6 +5591,11 @@ msgstr "Error de sintaxis."
 msgid "List '%1' does not exist."
 msgstr "La lista '%1' no existe."
 
+#. (u_err.max_list_dispatch)
+#: default/mail_tt2/message_report.tt2:59
+msgid "List size has exceded the limit, %1, set by the administrators."
+msgstr "Tamaño de la lista ha rebasadas el límite,% 1, fijado por los administradores."
+
 #. (u_err.listname)
 #: ../mail_tt2/command_report.tt2:107
 msgid "%1 mailing list does not provide subscriber preferences."
@@ -11177,6 +11182,10 @@ msgstr ""
 msgid "Plugin"
 msgstr ""
 
+#: ../default/web_tt2/error.tt2:77
+msgid "The password you typed does not match this sites standards of strength: %1. Please pick a stronger password."
+msgstr "La contraseña que escribió no coincide con estos sitios niveles de fuerza:% 1. Por favor, escoja una contraseña fuerte."
+
 #, fuzzy
 #~ msgid "The configuration file contains errors.\n"
 #~ msgstr "El archivo de configuración --CONFIG-- contiene errores.\n"
diff --git a/sympa-6.1.25/po/fr.po b/sympa-6.1.25/po/fr.po
old mode 100644
new mode 100755
index 8aa9ec105c71a30b2e57d1f68d439bc86be31730..bda06d4aa6fbfbffc210fe69171e334f801d93d5
--- a/sympa-6.1.25/po/fr.po
+++ b/sympa-6.1.25/po/fr.po
@@ -5674,6 +5674,11 @@ msgstr "Erreur de syntaxe."
 msgid "List '%1' does not exist."
 msgstr "La liste '%1' est inconnue."
 
+#. (u_err.max_list_dispatch)
+#: default/mail_tt2/message_report.tt2:59
+msgid "List size has exceded the limit, %1, set by the administrators."
+msgstr "Taille de la liste a exceded la limite, 1%, fixé par les administrateurs."
+
 # nlsref 6,91
 #. (u_err.listname)
 #: ../mail_tt2/command_report.tt2:107
@@ -10481,6 +10486,10 @@ msgstr ""
 "Le mot de passe que vous avez saisi ne correspond pas à ces sites normes de "
 "résistance:% 1. S'il vous plaît choisir un mot de passe fort."
 
+#: ../default/web_tt2/error.tt2:77
+msgid "The password you typed does not match this sites standards of strength: %1. Please pick a stronger password."
+msgstr "Le mot de passe que vous avez saisi ne correspond pas à ces sites normes de résistance:% 1. S'il vous plaît choisir un mot de passe fort."
+
 #~ msgid "The configuration file contains errors.\n"
 #~ msgstr "Le fichier de configuration contient des erreurs.\n"
 
diff --git a/sympa-6.1.25/po/it.po b/sympa-6.1.25/po/it.po
old mode 100644
new mode 100755
index 9b253e03f96781980514076f1251987465dde087..2cc3eef7f4e67710fc6d0026cab7d0433729fdba
--- a/sympa-6.1.25/po/it.po
+++ b/sympa-6.1.25/po/it.po
@@ -5673,6 +5673,11 @@ msgstr "Errore di sintassi nel comando."
 msgid "List '%1' does not exist."
 msgstr "La lista '%1' non esiste."
 
+#. (u_err.max_list_dispatch)
+#: default/mail_tt2/message_report.tt2:59
+msgid "List size has exceded the limit, %1, set by the administrators."
+msgstr "Dimensioni List ha exceded il limite,% 1, impostare dagli amministratori."
+
 # nlsref 6,91
 #. (u_err.listname)
 #: ../mail_tt2/command_report.tt2:107
@@ -11370,6 +11375,10 @@ msgstr ""
 msgid "Searches are limited to 50 results, except when using a @domain mask."
 msgstr ""
 
+#: ../default/web_tt2/error.tt2:77
+msgid "The password you typed does not match this sites standards of strength: %1. Please pick a stronger password."
+msgstr "La password digitata non corrisponde a questi siti norme di forza:% 1. Si prega di scegliere una password forte."
+
 # nlsref 1,1
 #, fuzzy
 #~ msgid "The configuration file contains errors.\n"
diff --git a/sympa-6.1.25/po/pt.po b/sympa-6.1.25/po/pt.po
old mode 100644
new mode 100755
index 3965cc107fe804a1009395e259d469d50cb66225..d5dbeee540f6c6b7be9a8a27b5f34ba606045126
--- a/sympa-6.1.25/po/pt.po
+++ b/sympa-6.1.25/po/pt.po
@@ -5286,6 +5286,11 @@ msgstr ""
 msgid "List '%1' does not exist."
 msgstr ""
 
+#. (u_err.max_list_dispatch)
+#: default/mail_tt2/message_report.tt2:59
+msgid "List size has exceded the limit, %1, set by the administrators."
+msgstr "Tamanho da lista tenha ultrapassado o limite,% 1, definido pelos administradores."
+
 #. (u_err.listname)
 #: ../mail_tt2/command_report.tt2:107
 msgid "%1 mailing list does not provide subscriber preferences."
@@ -11935,6 +11940,10 @@ msgid ""
 "was over the maximum size allowed on this list."
 msgstr ""
 
+#: ../default/web_tt2/error.tt2:77
+msgid "The password you typed does not match this sites standards of strength: %1. Please pick a stronger password."
+msgstr "A senha que você digitou não corresponde esse Sites padrões de força:% 1. Por favor escolha uma senha forte."
+
 #, fuzzy
 #~ msgid "URL of main Web page"
 #~ msgstr "Página de Administração %1"
diff --git a/sympa-6.1.25/soap/sympasoap.pm b/sympa-6.1.25/soap/sympasoap.pm
index 2c001af949d8aeb4a11ff8f6767e28b9f90fd905..4d306c0452125e79954af94ab182451f18a37591 100644
--- a/sympa-6.1.25/soap/sympasoap.pm
+++ b/sympa-6.1.25/soap/sympasoap.pm
@@ -799,8 +799,9 @@ sub add {
 
 	$u->{'lang'} = $u2->{'lang'} || $list->{'admin'}{'lang'};
 	
-	unless ($list->add_user($u)) {
-	    &Log::do_log('info', 'add %s@%s %s from %s : Unable to add user', $listname,$robot,$email,$sender);
+	my ($status, %invalids) = $list->add_user($u);
+	unless ($status) {
+	    &Log::do_log('info', 'add %s@%s %s from %s : Unable to add user: %s', $listname,$robot,$email,$sender, $invalids{$email});
 	    my $error = "Unable to add user $email in list $listname";
 	    die SOAP::Fault->faultcode('Server')
 		->faultstring('Unable to add user')
@@ -1256,10 +1257,11 @@ sub subscribe {
 	  $u->{'gecos'} = $gecos;
 	  $u->{'date'} = $u->{'update_date'} = time;
 	  
+		my ($ct, %invalids) = $list->add_user($u);
 	  die SOAP::Fault->faultcode('Server')
 	      ->faultstring('Undef')
 		  ->faultdetail("SOAP subscribe : add user failed")
-		      unless $list->add_user($u);
+		      unless $ct;
       }
       
       if ($List::use_db) {
diff --git a/sympa-6.1.25/src/etc/script/sympa.in b/sympa-6.1.25/src/etc/script/sympa.in
index 48e405ddce38a895b533372f55eb6d5fc73124d6..b6df1cbb92b821726d81c859ce1234ec46a07fbb 100755
--- a/sympa-6.1.25/src/etc/script/sympa.in
+++ b/sympa-6.1.25/src/etc/script/sympa.in
@@ -216,6 +216,10 @@ fi
 [ -f $sympaconf ] || exit 0
 [ -f $wwsympaconf ] || exit 0
 
+if [ ! -d /var/lock/subsys ]; then
+	mkdir /var/lock/subsys 
+fi
+
 # See how we were called.
 case "$1" in
   start)
diff --git a/sympa-6.1.25/src/lib/Commands.pm b/sympa-6.1.25/src/lib/Commands.pm
index 173374ea6403764ebaa42c70cd876d239c6d869f..1ed166b14fd6cc4446000aceb64889ff590308b5 100644
--- a/sympa-6.1.25/src/lib/Commands.pm
+++ b/sympa-6.1.25/src/lib/Commands.pm
@@ -833,8 +833,13 @@ sub subscribe {
 	    $u->{'gecos'} = $comment;
 	    $u->{'date'} = $u->{'update_date'} = time;
 
-	    unless ($list->add_user($u)){
-		my $error = "Unable to add user $user in list $listname";
+	    my ($ct, %invalids) = $list->add_user($u);
+	    unless ($ct){
+
+		#TODO: this is untranslateable with variables in it $reason is already
+		# translated, and the other variables just need to be sent in as parameters
+		my $reason = $invalids{$sender};
+		my $error = "Unable to add user $user in list $listname: $reason";
 		&report::reject_report_cmd('intern',$error,{'listname'=>$which},$cmd_line,$sender,$robot);
 		return undef; 
 	    }
@@ -1277,8 +1282,14 @@ sub add {
 	    $u->{'gecos'} = $comment;
 	    $u->{'date'} = $u->{'update_date'} = time;
 	    
-	    unless ($list->add_user($u)) {
-		my $error = "Unable to add user $user in list $listname";
+	    my ($ct, %invalids) = $list->add_user($u);
+	    unless ($ct){
+
+		#TODO: this is untranslateable with variables in it $reason is already
+		# translated, and the other variables just need to be sent in as parameters
+		my $reason = $invalids{$sender};
+		my $error = "Unable to add user $user in list $listname: $reason";
+
 		&report::reject_report_cmd('intern',$error,{'listname'=>$which},$cmd_line,$sender,$robot);
 		return undef; 
 	    }
@@ -2015,6 +2026,19 @@ sub distribute {
 	return 'unknown_list';
     }
 
+    ## Check to make sure that the list does not get dispatched if it is from a
+    ## moderator and the list size is greater then max_list_dispatch
+    ## We do not check to see if the message is being attempted to get dispatched
+    ## by a non privileged user because their access should be rejected by other
+    ## mechanisims at this point anyway.
+    if ($Conf{'max_list_dispatch'} && 
+        ($Conf{'max_list_dispatch'} < $list->get_total()) 
+    ) {
+	&do_log('info', 'DISTRIBUTE %s %s from %s refused, list subscriber count (%d) at max (%d)', $which, $key, $sender, $list->get_total(), $Conf{'max_list_dispatch'});
+	&report::reject_report_msg('user','max_list_dispatch',$sender,{'max_list_dispatch' => $Conf{'max_list_dispatch'}},$robot,'','');
+	return undef;
+    }
+
     &Language::SetLang($list->{'admin'}{'lang'});
 
     #read the moderation queue and purge it
diff --git a/sympa-6.1.25/src/lib/List.pm b/sympa-6.1.25/src/lib/List.pm
index 0e30f9227238004748a72cdbebe5e9208b0bc4fb..b1b577e645f579842bd2ba2c86468bd79cba266f 100644
--- a/sympa-6.1.25/src/lib/List.pm
+++ b/sympa-6.1.25/src/lib/List.pm
@@ -7520,10 +7520,13 @@ sub add_user {
     unless ($dbh and $dbh->ping) {
 	return undef unless &db_connect();
     }	   
-    
+
+		my %invalids = (); 
     foreach my $new_user (@new_users) {
 	my $who = &tools::clean_email($new_user->{'email'});
-	unless ($who) {
+	my ($status, $reason) = &tools::valid_email($new_user->{'email'});
+	unless ($who || !$status ) {
+			$invalids{$new_user->{'email'}} = $reason;
 	    Log::do_log('err', 'Ignoring %s which is not a valid email',$new_user->{'email'});
 	    next;
 	}
@@ -7607,7 +7610,7 @@ sub add_user {
     $self->{'total'} += $total;
     $self->savestats();
 
-    return $total;
+    return ($total, %invalids);
 }
 
 
@@ -9855,8 +9858,9 @@ sub sync_include {
 	    $u->{'date'} = time;
 	    @add_tab = ($u);
 	    my $user_added = 0;
-	    unless( $user_added = $self->add_user( @add_tab ) ) {
-		&do_log('err', 'List:sync_include(%s): Failed to add new users', $name);
+			my ($added, %invalids) = $self->add_user( @add_tab );
+	    unless( $added ) {
+		&do_log('err', 'List:sync_include(%s): Failed to add new users: %s', $name, $invalids{$email});
 		return undef;
 	    }
 	    if ($user_added) {
diff --git a/sympa-6.1.25/src/lib/Message.pm b/sympa-6.1.25/src/lib/Message.pm
index fcddac91ebc6cff87e2a70b54b4678ef6dd35f16..ac45e668a734c75a1893a5a5631d2ce8cd89b075 100644
--- a/sympa-6.1.25/src/lib/Message.pm
+++ b/sympa-6.1.25/src/lib/Message.pm
@@ -347,7 +347,8 @@ sub _get_envelope_sender {
 	    return '<>';
 	} else {
 	    my @addrs = Mail::Address->parse($addr);
-	    if (@addrs and tools::valid_email($addrs[0]->address)) {
+			my ($status, $reason) = tools::valid_email($addrs[0]->address);
+	    if (@addrs and $status) {
 		return $addrs[0]->address;
 	    }
 	}
@@ -392,8 +393,9 @@ sub _get_sender_email {
 	do_log('err', 'No valid sender address');
 	return undef;
     }
-    unless (tools::valid_email($sender)) {
-	do_log('err', 'Invalid sender address "%s"', $sender);
+		my ($status, $reason) = tools::valid_email($sender);
+    unless ($status) {
+	do_log('err', 'Invalid sender address "%s" %s', $sender, $reason);
 	return undef;
     }
 
diff --git a/sympa-6.1.25/src/lib/Upgrade.pm b/sympa-6.1.25/src/lib/Upgrade.pm
index 394ad7a952a84a078c9bded6915f989822083d80..7a3b57f51cbab0e374215e306a60f7507175f5f5 100644
--- a/sympa-6.1.25/src/lib/Upgrade.pm
+++ b/sympa-6.1.25/src/lib/Upgrade.pm
@@ -616,9 +616,11 @@ sub upgrade {
 		$list->{'total'} = 0;
 		
 		## Add users to the DB
-		my $total = $list->add_user(@users);
+		my ($total, %invalids) = $list->add_user(@users);
 		unless (defined $total) {
-		    &do_log('err', 'Failed to add users');
+				foreach my $addr (keys %invalids) {
+					&do_log('err', 'Failed to add user %s: %s', $addr, $invalids{$addr});
+				}
 		    next;
 		}
 		
diff --git a/sympa-6.1.25/src/lib/admin.pm b/sympa-6.1.25/src/lib/admin.pm
index 20766fe3ea7b437f1edaadba543e5e9f6736f25a..af604c1c55ff791cce4ec923bf36fb714ef01967 100644
--- a/sympa-6.1.25/src/lib/admin.pm
+++ b/sympa-6.1.25/src/lib/admin.pm
@@ -817,16 +817,16 @@ sub rename_list{
      }
 
     # set list status to pending if creation list is moderated
-    if ($r_action =~ /listmaster/) {
-      $list->{'admin'}{'status'} = 'pending' ;
-      &List::send_notify_to_listmaster('request_list_renaming',$list->{'domain'}, 
-				       {'list' => $list,
-					'new_listname' => $param{'new_listname'},
-					'old_listname' => $old_listname,
-					'email' => $param{'user_email'},
-					'mode' => $param{'mode'}});
-      $param{'status'} = 'pending';
-    }
+#    if ($r_action =~ /listmaster/) {
+#      $list->{'admin'}{'status'} = 'pending' ;
+#      &List::send_notify_to_listmaster('request_list_renaming',$list->{'domain'}, 
+#				       {'list' => $list,
+#					'new_listname' => $param{'new_listname'},
+#					'old_listname' => $old_listname,
+#					'email' => $param{'user_email'},
+#					'mode' => $param{'mode'}});
+#      $param{'status'} = 'pending';
+#    }
      
     ## Save config file for the new() later to reload it
     $list->save_config($param{'user_email'});
diff --git a/sympa-6.1.25/src/lib/confdef.pm b/sympa-6.1.25/src/lib/confdef.pm
index 72070f528a415b58ca9c9fbe4bb43055cbe17700..7939c71e855ac69e9a17dc4551d20ca189f619f5 100644
--- a/sympa-6.1.25/src/lib/confdef.pm
+++ b/sympa-6.1.25/src/lib/confdef.pm
@@ -1401,6 +1401,14 @@ our @params = (
         'file'  => 'sympa.conf',
         'edit'  => '1',
     },
+    {
+        'name'    => 'password_validation',
+        'query'   => 'The password validation techniques to be used against user passwords that are added to mailing lists. Options come from Data::Password (http://search.cpan.org/~razinf/Data-Password-1.07/Password.pm#VARIABLES), ie password_validation MINLEN=8,GROUPS=3,DICTIONARY=4,DICTIONARIES=/pentest/dictionaries',
+        'default' => undef,
+        'edit'    => '1',
+        'file'    => 'sympa.conf',
+        'optional' => '1',
+    },
 
     { 'title' => 'Web interface parameters' },
 
@@ -1549,13 +1557,30 @@ our @params = (
         'file'    => 'sympa.conf',
     },
     {
-        'name'     => 'password_validation',
-        'query'    => 'The password validation techniques to be used against user passwords that are added to mailing lists. Options come from Data::Password (http://search.cpan.org/~razinf/Data-Password-1.07/Password.pm#VARIABLES)',
-	'sample'   => 'MINLEN=8,GROUPS=3,DICTIONARY=4,DICTIONARIES=/pentest/dictionaries',
-        'edit'     => '1',
-        'file'     => 'sympa.conf',
-	'optional' => '1',
+        'name'    => 'max_list_dispatch',
+        'query'   => 'The maximum list size that messages can be sent to, aka the maximum number of emails sent per list reciept from moderators',
+        'default' => 1000000,
+	'vhost'   => '1',
+        'edit'    => '1',
+        'file'    => 'sympa.conf',
+    },
+    {
+        'name'    => 'max_list_dispatch_from_subscriber',
+        'query'   => 'The maximum list size that messages can be sent to from list subscribers, aka the maximum number of emails sent per list reciept from list subscribers',
+        'default' => 1000000,
+	'vhost'   => '1',
+        'edit'    => '1',
+        'file'    => 'sympa.conf',
+				'optional'=> '1',
     },
+		{
+
+			 'name' => 'email_validation',
+			 'query' => 'The email validation techniques to be used against email addresses that are added to mailing lists. Options come from Email::Validate (http://search.cpan.org/~rjbs/Email-Valid-1.194/lib/Email/Valid.pm). Commenting this out turns off email validation.',
+			 'default' => 'tldcheck,fqdn,rfc822',
+			 'edit' => '1',
+			 'file' => 'sympa.conf',
+	 },
 
 ## Not implemented yet.
 ##    {
diff --git a/sympa-6.1.25/src/lib/tools.pm b/sympa-6.1.25/src/lib/tools.pm
index ca895f367e70daccf48a5ff3cc44614d48a3a4aa..35b8287929a323c19cfb70b284c4494b26c4daed 100644
--- a/sympa-6.1.25/src/lib/tools.pm
+++ b/sympa-6.1.25/src/lib/tools.pm
@@ -2741,13 +2741,47 @@ sub valid_email {
     
     unless ($email =~ /^$regexp{'email'}$/) {
 	do_log('err', "Invalid email address '%s'", $email);
-	return undef;
+	return (undef, gettext('Considered invalid by SYMPA'));
     }
     
     ## Forbidden characters
     if ($email =~ /[\|\$\*\?\!]/) {
 	do_log('err', "Invalid email address '%s'", $email);
-	return undef;
+	return (undef, gettext('Contains invalid characters'));
+    }
+
+    # If email_validation is set then apply additional email validation set
+    # by Email::Valid as per the configuration
+    if ($Conf::Conf{'email_validation'}) {
+        use Email::Valid;
+	my $technique_map = {
+	    'tldcheck' => '-tldcheck',
+	    'fqdn' => '-fqdn',
+	    'mxcheck' => '-mxcheck',
+	    'fudge' => '-fudge',
+	    'allow_ip' => '-allow_ip',
+	    'local_rules' => '-local_rules'
+	};
+
+	my $reason_map = {
+	    'tldcheck' => gettext('Invalid top level domain in address'),
+	    'fqdn' => gettext('Fully qualified domain does not exist in address'),
+	    'mxcheck' => gettext('Address domain does not have a valid MX record'),
+	    'local_rules' => gettext('Does not satisfy the restictions on aol.com addresses'),
+			'localpart' => gettext('The local part of the email address is greater then 64 characters'),
+			'rfc822' => gettext('Address does not comply with RFC822')
+	};
+
+  my @techniques = split(',', $Conf::Conf{'email_validation'});
+	my @options;
+	foreach (@techniques) {
+	    push @options, $technique_map->{$_};
+	}
+	my $valid = new Email::Valid(@options);
+	if (!$valid->address($email)) {
+	    do_log('err', "Invalid email address '%s' [%s]", $email, $valid->details());
+	    return (undef, $reason_map->{$valid->details()});
+	}
     }
 
     return 1;
@@ -4063,4 +4097,28 @@ sub password_validation {
     return Data::Password::IsBadPassword($password);
 }
 
+sub password_validation {
+	my ($password) = @_;
+	my $pv = $Conf::Conf{'password_validation'};
+	if ($pv && $password) {
+		use Data::Password qw(:all);
+		use Switch;
+		my @techniques = split(/,/, $pv);
+		foreach my $technique (@techniques) {
+			my ($key, $value) = $technique =~ /([^=]+)=(.*)/;
+			switch ($key) {
+				case 'DICTIONARY' { $DICTIONARY = $value; }
+				case 'FOLLOWING' { $FOLLOWING = $value; }
+				case 'GROUPS' { $GROUPS = $value; }
+				case 'MINLEN' { $MINLEN = $value; }
+				case 'MAXLEN' { $MAXLEN = $value; }
+				# TODO: How do we handle a list of dictionaries?
+				case 'DICTIONARIES' { push @DICTIONARIES, $value; }
+			}
+		}
+		return IsBadPassword($password);
+	}
+	return undef;
+}
+
 1;
diff --git a/sympa-6.1.25/src/sympa.pl.in b/sympa-6.1.25/src/sympa.pl.in
index a4808ac6d9c36964bb08226fe6718a003f5a8ed1..a716b7b0069d71291db07775468384ac13a48b05 100644
--- a/sympa-6.1.25/src/sympa.pl.in
+++ b/sympa-6.1.25/src/sympa.pl.in
@@ -535,8 +535,11 @@ if ($main::options{'dump'}) {
 	$u->{'email'} = $email;
 	$u->{'gecos'} = $gecos;
 
-	unless ($list->add_user($u)) {
-	    printf STDERR "\nCould not add %s\n", $email;
+	my ($num, %invalids) = $list->add_user($u);
+	unless ($num) {
+			foreach my $addr (keys %invalids) {
+				printf STDERR "\nCould not add %s: %s\n", $email, $invalids{$addr};
+			}
 	    next;
 	}
 	print STDERR '+';
@@ -1984,9 +1987,27 @@ sub DoMessage{
     my $auth_method = 'smtp';   
     $auth_method = 'dkim' if ($message->{'dkim_pass'});
     $auth_method = 'smime' if ($is_signed->{'body'}) ;
-    
     $result = $list->check_list_authz('send',$auth_method,$context);
     $action = $result->{'action'} if (ref($result) eq 'HASH');
+   
+    ## Defer messages if the list size is greater then the hard coded limit to
+    ## prevent mail servers sending huge amounts of mail
+    my $total = $list->get_total();
+    if (
+	# If there are not more users in the list then the limit for a subscriber
+        ($Conf{'max_list_dispatch_from_subscriber'} && 
+	$total > $Conf{'max_list_dispatch_from_subscriber'}) &&
+
+	# Or if the sender is privileged and there are not more then the limit for privileged users
+        !($list->am_i('owner', $sender) || $list->am_i('editor', $sender) &&
+        $Conf{'max_list_dispatch'} &&
+        $total < $Conf{'max_list_dispatch'}) 
+    ) {
+
+        &do_log('info', 'sympa::DoMessage(): Message diverted to list owner because of constraints placed on list member size (%d) for %s from %s', $Conf{'max_list_dispatch_from_subscriber'}, $listname, $sender);
+        &Log::db_log({'robot' => $robot,'list' => $list->{'name'},'action' => 'DoMessage','parameters' => "$which,$messageid,$robot",'target_email' => '','msg_id' => $messageid,'status' => 'error','error_type' => 'max_list_dispatch','user_email' => $sender,'client' => $ip,'daemon' => $daemon_name});
+        $action = 'editorkey';
+    }
 
     unless (defined $action) {
 	&do_log('err', 'sympa::DoMessage(): message (%s) ignored because unable to evaluate scenario "send" for list %s',$messageid,$listname);
diff --git a/sympa-6.1.25/src/sympa_wizard.pl.in b/sympa-6.1.25/src/sympa_wizard.pl.in
index 3ac1072c061c438e4a3286d35d45b8a389a14c5e..dba0e954a8f38e326e79358bd4c39d4e1bed3345 100644
--- a/sympa-6.1.25/src/sympa_wizard.pl.in
+++ b/sympa-6.1.25/src/sympa_wizard.pl.in
@@ -375,11 +375,6 @@ sub check_cpan {
 						   package_name => 'Crypt-OpenSSL-X509',
 						   usage => 'required to extract user certificates for SSL clients and S/MIME messages.',
 						  },
-			'Data::Password' => {
-				      required_version =>'1.07',
-				      package_name => 'Data-Password',
-				      usage => 'Used for configureable hardening of passwords via the password_validation sympa.conf directive.',
-				     },
 			'DB_File' => {
 				      required_version =>'1.75',
 				      package_name => 'DB_File',
@@ -436,6 +431,12 @@ sub check_cpan {
 				     mandatory => 1,
 				     usage => 'module for character encoding processing',
 				    },
+      'Email::Valid' => {
+             required_version =>'1.194',
+             package_name => 'Email-Valid',
+             mandatory => 1,
+             usage => 'used to compute validate email addresses',
+      },
 			'FCGI' => {
 				   required_version => '0.67',
 				   package_name => 'FCGI',
diff --git a/sympa-6.1.25/web_tt2/editsubscriber.tt2 b/sympa-6.1.25/web_tt2/editsubscriber.tt2
index c8d40b6c7bad7e8a2fbf9767e94604e15906edda..7cb90400d70e553838edeb2cb2b7f09de6e3cf0a 100644
--- a/sympa-6.1.25/web_tt2/editsubscriber.tt2
+++ b/sympa-6.1.25/web_tt2/editsubscriber.tt2
@@ -9,8 +9,6 @@
 <input type="hidden" name="email" value="[% current_subscriber.escaped_email %]" />
 <label for="new_email">[%|loc%]Email:[%END%]  </label>
   <input type="text" name="new_email" id="new_email" value="[% current_subscriber.escaped_email %]" size="25" /><br />
-<label for="gecos">[%|loc%]Name:[%END%]  </label>
-  <input type="text" name="gecos" id="gecos" value="[% current_subscriber.gecos %]" size="25" /><br />
 [% IF current_subscriber.custom_attribute %]
 [% SET subscriber = current_subscriber ;
 PROCESS edit_attributes.tt2 ;
diff --git a/sympa-6.1.25/web_tt2/error.tt2 b/sympa-6.1.25/web_tt2/error.tt2
index 06b9f18ef56b9d6d0de21b6f095853f0ad264a72..8fb297cecceaf8109f646d11f0295649b3fe438e 100644
--- a/sympa-6.1.25/web_tt2/error.tt2
+++ b/sympa-6.1.25/web_tt2/error.tt2
@@ -55,7 +55,7 @@
   [% ELSIF u_err.msg == 'missing_arg' %][%|loc(u_err.argument)%]Missing argument %1[%END%]
   [% ELSIF u_err.msg == 'wrong_value' %][%|loc(u_err.argument)%]Wrong value for parameter %1[%END%]
   [% ELSIF u_err.msg == 'no_user' %][%|loc%]You need to login[%END%]
-  [% ELSIF u_err.msg == 'incorrect_email' %][%|loc(u_err.email)%]Address "%1" is incorrect[%END%]
+  [% ELSIF u_err.msg == 'incorrect_email' %][%|loc(u_err.email,u_err.reason)%]Address "%1" is incorrect: %2[%END%]
   [% ELSIF u_err.msg == 'incorrect_passwd' %][%|loc%]Provided password is incorrect[%END%]
   [% ELSIF u_err.msg == 'init_passwd' %][%|loc%]You did not choose a password, request a reminder of the initial password[%END%]
   [% ELSIF u_err.msg == 'ldap_user' %][%|loc%]Your password is stored in an LDAP directory, therefore Sympa cannot post you a reminder[%END%]
@@ -80,6 +80,7 @@
   [% ELSIF u_err.msg == 'listname_needed' %][%|loc%]You need to provide list name[%END%]
   [% ELSIF u_err.msg == 'already_moderated' %][%|loc%]Failed to moderate a message; it was probably moderated by another moderator[%END%]
   [% ELSIF u_err.msg == 'msg_topic_missing' %][%|loc%]Tagging message is required for this list[%END%]
+  [% ELSIF u_err.msg == 'max_list_dispatch' %][%|loc(u_err.list_size,u_err.max_list_dispatch)%]The number of subscribers for this list, '%1', is greater then the limit set by the list administrators, '%2'[%END%]
   [% ELSIF u_err.msg == 'empty_archives' %][%|loc%]Archives are empty for this list[%END%]
   [% ELSIF u_err.msg == 'didnt_change_anything' %][%|loc%]You did not select an action to perform[%END%]
   [% ELSIF u_err.msg == 'no_bounce_user' %][%|loc(u_err.email)%]No bounce for user  %1[%END%]
diff --git a/sympa-6.1.25/web_tt2/pref.tt2 b/sympa-6.1.25/web_tt2/pref.tt2
index 3ffc1c4af165f97fbfd43fa6b7b3497b9824efbe..f1b5bcf22cdcfa0c5c42b70fb83adb65e2ca199c 100644
--- a/sympa-6.1.25/web_tt2/pref.tt2
+++ b/sympa-6.1.25/web_tt2/pref.tt2
@@ -7,7 +7,6 @@
 <form action="[% path_cgi %]" method="post">
   <fieldset>
     <label>[%|loc%]Email:[%END%]  </label>[% user.email %]<br />
-    <label for="gecos">[%|loc%]Name:[%END%]  </label><input type="text" id="gecos" name="gecos" size="30" value="[% user.gecos %]" /><br />
     <label for="lang">[%|loc%]Language:[%END%]  </label><select id="lang" name="lang" class="LanguageNeutral">
               [% FOREACH l = languages %]
 		<option lang="[%l.value.lang_tag%]" xml:lang="[%l.value.lang_tag%]" value="[% l.key %]" [% l.value.selected %]>[% l.value.complete %]</option>
diff --git a/sympa-6.1.25/web_tt2/subscriber_table.tt2 b/sympa-6.1.25/web_tt2/subscriber_table.tt2
index 5f1a4b933cc8d350cd607f3f06b109cd74e7df71..db685e594412ac1020e60d7ba02e15a22d83e9a7 100644
--- a/sympa-6.1.25/web_tt2/subscriber_table.tt2
+++ b/sympa-6.1.25/web_tt2/subscriber_table.tt2
@@ -28,14 +28,6 @@
   	    [%|loc%]Picture[%END%]
 	    </th>
   	[% END %]
-	[% IF sortby == 'name' %]
-	<th class="sortby">
-	  [%|loc%]Name[%END%]
-	[% ELSE %]
-	<th>
-          <a href="[% path_cgi %]/review/[% list %]/1/[% size %]/name">[%|loc%]Name[%END%]</a>
-	[% END %] 
-	</th>
         [% IF is_listmaster || is_owner || is_editor  %]
           <th>
 	  [%|loc%]Reception[%END%]
@@ -110,11 +102,6 @@
   	      </td>
   	    [% END %]
   	  [% END %]
-	  <td>
-             <span class="smaller">
-	        [% u.gecos %]&nbsp;
-	     </span>
-          </td>
 	  [% IF is_listmaster || is_owner || is_editor  %]
   	    <td>
   	      [%|optdesc('reception')%][% u.reception %][% END %]
diff --git a/sympa-6.1.25/wwsympa/Auth.pm b/sympa-6.1.25/wwsympa/Auth.pm
index 144ad29f5ec1720191912a9fcad59379479f9a0a..d57e912b7a70ab427147a7fce7f929880e0fd98f 100644
--- a/sympa-6.1.25/wwsympa/Auth.pm
+++ b/sympa-6.1.25/wwsympa/Auth.pm
@@ -54,7 +54,8 @@ sub password_fingerprint{
 
      my ($canonic, $user);
 
-     if( &tools::valid_email($auth)) {
+     my ($status, $reason) = &tools::valid_email($auth);
+     if($status) {
 	 return &authentication($robot, $auth,$pwd);
      }else{
 	 ## This is an UID
@@ -283,7 +284,8 @@ sub ldap_authentication {
      &do_log('debug3',"canonic: $canonic_email[0]");
      ## If the identifier provided was a valid email, return the provided email.
      ## Otherwise, return the canonical email guessed after the login.
-     if( &tools::valid_email($auth) && !$Conf::Conf{'robots'}{$robot}{'ldap_force_canonical_email'}) {
+     my ($status, $reason) =  &tools::valid_email($auth);
+     if( $status && !$Conf::Conf{'robots'}{$robot}{'ldap_force_canonical_email'}) {
 	 return ($auth);
      }else{
 	 return lc($canonic_email[0]);
diff --git a/sympa-6.1.25/wwsympa/wwslib.pm b/sympa-6.1.25/wwsympa/wwslib.pm
index 1d13a3d22dabf2c21d23e609e9e9b81b584b5adb..be8ba464b8fcd55262b25b8d391ba71d90662525 100644
--- a/sympa-6.1.25/wwsympa/wwslib.pm
+++ b/sympa-6.1.25/wwsympa/wwslib.pm
@@ -274,13 +274,6 @@ sub new_passwd {
     return 'init'.$passwd;
 }
 
-## Basic check of an email address
-sub valid_email {
-    my $email = shift;
-    
-    $email =~ /^([\w\-\_\.\/\+\=]+|\".*\")\@[\w\-]+(\.[\w\-]+)+$/;
-}
-
 sub init_passwd {
     my ($robot, $email, $data) = @_;
     
diff --git a/sympa-6.1.25/wwsympa/wwsympa.fcgi.in b/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
index 2cf35ceae85d59c85f4e0c96ed21975577eebed3..5296ae0379a5325bc1bd640253b336531cfbba5c 100644
--- a/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
+++ b/sympa-6.1.25/wwsympa/wwsympa.fcgi.in
@@ -3605,7 +3605,8 @@ sub do_sso_login_succeeded {
 	     my @alternative_conf = split(/,/,$ldap->{'alternative_email_attribute'});
 	     my $attrs = $ldap->{'email_attribute'};
 
-	     if (&tools::valid_email($auth)){
+	     my ($status, $reason) = &tools::valid_email($auth);
+	     if ($status){
 		 $filter = $ldap->{'get_dn_by_email_filter'};
 	     }else{
 		 $filter = $ldap->{'get_dn_by_uid_filter'};
@@ -3775,9 +3776,10 @@ sub sendssopasswd {
 	return 'requestemail';
     }
     
-    unless (&tools::valid_email($email)) {
-	&report::reject_report_web('user','incorrect_email',{'email' => $email},$param->{'action'});
-	&wwslog('info','do_sendssopasswd: incorrect email %s', $email);
+    my ($status, $reason) = &tools::valid_email($email);
+    unless ($status) {
+	&report::reject_report_web('user','incorrect_email',{'email' => $email, 'reason' => $reason},$param->{'action'});
+	&wwslog('info','do_sendssopasswd: incorrect email %s: %s', $email, $reason);
 	&web_db_log({'parameters' => $email,
 		     'target_email' => $email,
 		     'status' => 'error',
@@ -3841,11 +3843,12 @@ sub do_renewpasswd {
 
      my $url_redirect;
      if($in{'email'}){
+	 my ($status, $reason) = &tools::valid_email($in{'email'});
 	 if($url_redirect = &is_ldap_user($in{'email'})){
 	     $param->{'redirect_to'} = $url_redirect
 		 if ($url_redirect && ($url_redirect != 1));
-	 }elsif (! &tools::valid_email($in{'email'})) {
-	     &report::reject_report_web('user','incorrect_email',{'email' => $in{'email'}},$param->{'action'});
+	 }elsif (! $status) {
+	     &report::reject_report_web('user','incorrect_email',{'email' => $in{'email'}, 'reason' => $reason},$param->{'action'});
 	     &wwslog('info','do_renewpasswd: incorrect email \"%s\"', $in{'email'});
 	     &web_db_log({'parameters' => $in{'email'},
 			  'target_email' => $in{'email'},
@@ -4070,6 +4073,9 @@ sub do_renewpasswd {
  ## The list of latest created lists
  sub do_latest_lists {
      &wwslog('info', "do_latest_lists($in{'for'}, $in{'count'},$in{'topic'}, $in{'subtopic'})");
+     # should try to actually fix this one day
+     return 0;
+
 
      unless (&do_lists()) {
 	 &wwslog('err','do_latest_lists: error while calling do_lists');
@@ -4130,6 +4136,8 @@ sub do_renewpasswd {
  ## The list of the most active lists
  sub do_active_lists {
      &wwslog('info', "do_active_lists($in{'for'}, $in{'count'},$in{'topic'}, $in{'subtopic'})");
+     # should try to actually fix this one day
+     return 0;
 
      unless (&do_lists()) {
 	 &wwslog('err','do_active_lists: error while calling do_lists');
@@ -4650,9 +4658,10 @@ sub do_pref {
 
      if ($in{'new_email'} && ($in{'email'} ne $in{'new_email'})) {
 
-	 unless ($in{'new_email'} && &tools::valid_email($in{'new_email'})) {
-	     &wwslog('notice', "do_set:incorrect email %s",$in{'new_email'});
-	     &report::reject_report_web('user','incorrect_email',{'email' => $in{'new_email'}},$param->{'action'});
+	 my ($status, $reason) = &tools::valid_email($in{'new_email'});
+	 unless ($in{'new_email'} && $status) {
+	     &wwslog('notice', "do_set:incorrect email %s: %s",$in{'new_email'}, $reason);
+	     &report::reject_report_web('user','incorrect_email',{'email' => $in{'new_email'}, 'reason' => $reason},$param->{'action'});
 	     &web_db_log({'parameters' => "$in{'reception'},$in{'visibility'}",
 			  'status' => 'error',
 			  'error_type' => 'incorrect_email'});		      
@@ -4714,11 +4723,7 @@ sub do_pref {
 	 }
      }
 
-     if ($in{'gecos'}) {
-	 $update->{'gecos'} = $in{'gecos'};
-     }else{
-	 $update->{'gecos'} = undef;
-     }
+		 $update->{'gecos'} = undef;
      $update->{'custom_attribute'} = $xml_custom_attribute if $xml_custom_attribute;
 
      unless ( $list->update_user($email, $update) ) {
@@ -4785,7 +4790,7 @@ sub check_custom_attribute {
      &wwslog('info', 'do_setpref');
      my $changes = {};
 
-     foreach my $p ('gecos','lang','cookie_delay') {
+     foreach my $p ('lang','cookie_delay') {
 	 $changes->{$p} = $in{$p} if (defined($in{$p}));
      }
 
@@ -4799,7 +4804,7 @@ sub check_custom_attribute {
 	 unless (&List::update_user_db($param->{'user'}{'email'}, $changes)) {
 	     &report::reject_report_web('intern','update_user_db_failed',{'user'=>$param->{'user'}{'email'}},$param->{'action'},'',$param->{'user'}{'email'},$robot);
 	     &wwslog('info','do_pref: update failed');
-	     &web_db_log({'parameters' => "$in{'gecos'},$in{'lang'},$in{'cookie_delay'}",
+	     &web_db_log({'parameters' => "$in{'lang'},$in{'cookie_delay'}",
 			  'status' => 'error',
 			  'error_type' => 'internal'});
 	     return undef;
@@ -4809,19 +4814,19 @@ sub check_custom_attribute {
 	 unless (&List::add_user_db($changes)) {
 	     &report::reject_report_web('intern','add_user_db_failed',{'user'=>$param->{'user'}{'email'}},$param->{'action'},'',$param->{'user'}{'email'},$robot);
 	     &wwslog('info','do_pref: add failed');
-	     &web_db_log({'parameters' => "$in{'gecos'},$in{'lang'},$in{'cookie_delay'}",
+	     &web_db_log({'parameters' => "$in{'lang'},$in{'cookie_delay'}",
 			  'status' => 'error',
 			  'error_type' => 'internal'});
 	     return undef;
 	 }
      }
 
-     foreach my $p ('gecos','lang','cookie_delay') {
+     foreach my $p ('lang','cookie_delay') {
 	 $param->{'user'}{$p} = $in{$p};
      }
 
      &report::notice_report_web('performed',{},$param->{'action'});
-     &web_db_log({'parameters' => "$in{'gecos'},$in{'lang'},$in{'cookie_delay'}",
+     &web_db_log({'parameters' => "$in{'lang'},$in{'cookie_delay'}",
 		  'status' => 'success',
 	      });
      if ($in{'previous_action'}) {
@@ -4956,20 +4961,12 @@ sub do_subscribe {
 		$u->{'gecos'} = $param->{'user'}{'gecos'} || $in{'gecos'};
 		$u->{'date'} = $u->{'update_date'} = time;
 		$u->{'password'} = $param->{'user'}{'password'};
-		if (my $reason = &tools::password_validation($u->{'password'})) {
-			&report::reject_report_web('user','passwd_validation',{'reason' => $reason},$param->{'action'});
-			&wwslog('info','do_setpasswd: password validation');
-			&web_db_log({
-				'status' => 'error',
-			  'error_type' => 'bad_parameter'
-			});
-			return undef;
-		 }
 		$u->{'custom_attribute'} = $xml_custom_attribute if (defined $xml_custom_attribute);
 		$u->{'lang'} = $param->{'user'}{'lang'} || $param->{'lang'};
 		
-		unless ($list->add_user($u)) {
-		    &report::reject_report_web('intern','add_subscriber_db_failed',{'sub'=>$param->{'user'}{'email'}},$param->{'action'},$list,$param->{'user'}{'email'},$robot);
+		my ($ct, %invalids) = $list->add_user($u);
+		unless ($ct) {
+		    &report::reject_report_web('intern','add_subscriber_db_failed',{'sub'=>$param->{'user'}{'email'}, 'reason' => $invalids{$u->{'email'}}},$param->{'action'},$list,$param->{'user'}{'email'},$robot);
 		    &wwslog('info', 'do_subscribe: subscribe failed');
 		    &web_db_log({'parameters' => $in{'email'},
 				 'status' => 'error',
@@ -5143,9 +5140,10 @@ sub do_subrequest {
 	    return 1;
 	}
 	## valid email address?
-	unless (&tools::valid_email($in{'email'})) {
-	    &report::reject_report_web('user','incorrect_email',{'email' => $in{'email'}},$param->{'action'},$list);
-	    &wwslog('info','do_subrequest: incorrect email %s', $in{'email'});
+	my ($result, $reason) = &tools::valid_email($in{'email'});
+	unless ($result) {
+	    &report::reject_report_web('user','incorrect_email',{'email' => $in{'email'}, 'reason' => $reason},$param->{'action'},$list);
+	    &wwslog('info','do_subrequest: incorrect email %s: %s', $in{'email'}, $reason);
 	    &web_db_log({'target_email' => $in{'email'},
 			 'status' => 'error',
 			 'error_type' => 'incorrect_email'});
@@ -5449,9 +5447,10 @@ sub unsubscribe {
 	 return 1;
      }
      ## valid email address?
-     unless (&tools::valid_email($in{'email'})) {
-	&report::reject_report_web('user','incorrect_email',{'email' => $in{'email'}},$param->{'action'},$list);
-	&wwslog('info','do_sigrequest: incorrect email %s', $in{'email'});
+     my ($result, $reason) = &tools::valid_email($in{'email'});
+     unless ($result) {
+	&report::reject_report_web('user','incorrect_email',{'email' => $in{'email'}, 'reason' => $reason},$param->{'action'},$list);
+	&wwslog('info','do_sigrequest: incorrect email %s: %s', $in{'email'}, $reason);
 	&web_db_log({'target_email' => $in{'email'},
 		    'status' => 'error',
 		    'error_type' => 'incorrect_email'});
@@ -5503,7 +5502,7 @@ sub unsubscribe {
 
 	if (my $reason = &tools::password_validation($in{'newpasswd1'})) {
 		&report::reject_report_web('user','passwd_validation',{'reason' => $reason},$param->{'action'});
-		 &wwslog('info','do_setpasswd: password validation');
+		 &wwslog('info','password validation error: '. $reason);
 		 &web_db_log({'status' => 'error',
 			  'error_type' => 'bad_parameter'});
 		 return undef;
@@ -6354,7 +6353,7 @@ sub do_skinsedit {
 	 return undef;
      }
      
-     my ($total, @new_users, @added_users );
+     my ($total, @new_users, @added_users, %invalids );
      my $comma_emails ;
      foreach my $email (keys %user) {
 	 &wwslog('debug', "do_add subscription \$subscriptions->{$email}{custom_attribute} = $subscriptions->{$email}{'custom_attribute'})" );
@@ -6384,8 +6383,9 @@ sub do_skinsedit {
 	     next;
 	 }
 	 
-	 unless (&tools::valid_email($email)) {
-	     &report::reject_report_web('user','incorrect_email',{'email' => $email},$param->{'action'},$list);
+	 my ($status, $reason) = &tools::valid_email($email);
+	 unless ($status) {
+	     &report::reject_report_web('user','incorrect_email',{'email' => $email, 'reason' => $reason},$param->{'action'},$list);
 	     &wwslog('info','do_add: incorrect email %s', $email);
 	     &web_db_log({'target_email' => $in{'email'}||$in{'pending_email'},
 			  'status' => 'error',
@@ -6412,14 +6412,6 @@ sub do_skinsedit {
 	 $u->{'gecos'} = $user{$email} || $u2->{'gecos'};
 	 $u->{'date'} = $u->{'update_date'} = time;
 	 $u->{'password'} = $u2->{'password'} || &tools::tmp_passwd($email) ;
-	 if (my $reason = &tools::password_validation($u->{'password'})) {
-		 &report::reject_report_web('user','passwd_validation',{'reason' => $reason},$param->{'action'});
-		 &wwslog('info','do_setpasswd: password validation');
-		 &web_db_log({'status' => 'error',
-			  'error_type' => 'bad_parameter'});
-		 return undef;
-	 }
-
 	 $u->{'lang'} = $u2->{'lang'} || $list->{'admin'}{'lang'};
 	 if ($comma_emails) {
 	     $comma_emails = $comma_emails .','. $email;
@@ -6438,13 +6430,15 @@ sub do_skinsedit {
 	 }
      }
      
-     $total = $list->add_user(@new_users);
+     ($total, %invalids) = $list->add_user(@new_users);
      unless( defined $total) {
-	 &report::reject_report_web('intern','add_subscriber_db_failed',{},$param->{'action'},$list,$param->{'user'}{'email'},$robot);
-	 &wwslog('info','do_add: failed adding');
-	 &web_db_log({'target_email' => $in{'email'}||$in{'pending_email'},
-		      'status' => 'error',
-		      'error_type' => 'internal'});
+			foreach my $addr (keys %invalids) {
+			 &report::reject_report_web('intern','add_subscriber_db_failed',{'reason'=>$invalids{$addr}},$param->{'action'},$list,$param->{'user'}{'email'},$robot);
+			 &wwslog('info','do_add: failed adding');
+			 &web_db_log({'target_email' => $in{'email'}||$in{'pending_email'},
+							'status' => 'error',
+							'error_type' => 'internal'});
+			}
 	 return undef;
      }
      
@@ -7060,6 +7054,17 @@ sub do_skinsedit {
 	 return undef;
      } 
 
+     # If the moderator is attempting to dispatch a message but the list 
+     # excceeds the limit set by the robot admin then do not dispatch and
+     # send the moderator a helpful message
+     if ($Conf{'max_list_dispatch'} && ($Conf{'max_list_dispatch'} < $list->get_total())) {
+	 &report::reject_report_web('user', 'max_list_dispatch', {'list_size' => $list->get_total(), 'max_list_dispatch' => $Conf{'max_list_dispatch'}}, $param->{'action'});
+	 &wwslog('info','do_distribute: number of subscribers greater then robot limit');
+	 &web_db_log({'parameters' => $in{'id'},
+		      'status' => 'error',
+		      'error_type' => 'no_topic'});
+	 return undef;
+     }
 
      ## messages
      foreach my $id (split (/,/, $in{'id'})) { # QUIET DISTRIBUTE
@@ -8235,8 +8240,12 @@ sub do_remove_arc {
      ## Checking families and other virtual hosts.
      &get_server_details();
 
-    my $all_lists = &List::get_lists($robot,
-				     { 'filter_query' => [ 'status' => 'pending' ] });
+#    my $all_lists = &List::get_lists($robot,
+#				     { 'filter_query' => [ 'status' => 'pending' ] });
+     my $statement = "status_list = 'pending'";
+     my @lists = &List::get_lists_db($statement);
+     my $all_lists = &List::get_lists($robot, undef, @lists);
+
     foreach my $list ( @$all_lists ) {
 	$param->{'pending'}{$list->{'name'}}{'subject'} = $list->{'admin'}{'subject'};
 	$param->{'pending'}{$list->{'name'}}{'by'} = $list->{'admin'}{'creation'}{'email'};
@@ -9601,6 +9610,26 @@ sub do_edit_list {
 	}
     }
 
+    ## Checking that list owner address is not set to one of the special 
+    ## addresses:   
+    if (exists $changed{'owner'}) {
+	my $list = $param->{'list'};
+	my @special = ("$list-owner\@$robot", 
+		"$list-editor\@$robot", "$list-admin\@$robot", 
+		"$list-admin\@$robot", "$list-request\@$robot",
+		"$list-bounce\@$robot", "$list-subscribe\@$robot",
+		"$list-unsubscribe\@$robot");	
+	foreach my $owner (@{$new_admin->{'owner'}}) {
+		if (grep (/^$owner->{'email'}$/, @special)) {
+			## generate an error and return
+		    	&report::reject_report_web('user','incorrect_email',{'email'=>$owner->{'email'}},$param->{'action'},$list);
+			&wwslog('info','do_edit_list: Reserved email address %s', $owner->{'email'});
+			&web_db_log({'status' => 'error', 'error_type' => 'incorrect_email'}, 'parameters' => $owner->{'email'});
+			return undef;
+		}
+	}
+    }
+
     ## Delete selected params
     foreach my $p (keys %delete) {
 	
@@ -10508,7 +10537,10 @@ sub _restrict_values {
 
 sub do_copy_list {
     &wwslog('info', 'do_copy_list(%s,%s)', $in{'new_listname'}, $in{'new_robot'});
-    &do_rename_list('copy');
+    # mysteriously reject copy list requests - this needs a real solution
+    &report::reject_report_web('intern','Unable_to_copy_list', {'new_listname' => $in{'new_listname'}},
+                                  $param->{'action'},$list,$param->{'user'}{'email'},$robot);
+    return undef;
 }
 
 # in order to rename a list you must be list owner and you must be allowed to create new list
@@ -10532,6 +10564,7 @@ sub do_rename_list {
 				      remote_addr => $param->{'remote_addr'},
 				      aliases => $param->{'aliases'},
 				      status => $param->{'status'},
+                                      skip_authz => 1,
 				     );
      
      if ($result eq 'incorrect_listname') {       
@@ -10592,9 +10625,9 @@ sub do_rename_list {
      }
      
      # set list status to pending if creation list is moderated
-     if ($param->{'status'} eq 'pending') {
-	 &report::notice_report_web('pending_list',{},$param->{'action'},$list);
-     }
+#     if ($param->{'status'} eq 'pending') {
+#	 &report::notice_report_web('pending_list',{},$param->{'action'},$list);
+#     }
      
      if ($in{'new_robot'} eq '$robot') {
 	 $param->{'redirect_to'} = "$param->{'base_url'}$param->{'path_cgi'}/admin/$in{'new_listname'}";
@@ -14807,8 +14840,9 @@ sub d_test_existing_and_rights {
      }
 
      # the email must look like an email "somebody@somewhere"
-     unless (&tools::valid_email($in{'content'})) {
-	 &report::reject_report_web('user','incorrect_email',{'email' => $in{'content'}},$param->{'action'},$list);
+     my ($result, $reason) = &tools::valid_email($in{'content'});
+     unless ($result) {
+	 &report::reject_report_web('user','incorrect_email',{'email' => $in{'content'}, 'reason' => $reason},$param->{'action'},$list);
 	 &wwslog('info',"d_set_owner : $in{'content'} : incorrect email");
 	 &web_db_log({'robot' => $robot,'list' => $list->{'name'},'action' => $param->{'action'},'parameters' => "$in{'name_doc'}",'target_email' => "",'msg_id' => '','status' => 'error','error_type' => 'incorrect_email','user_email' => $param->{'user'}{'email'},'client' => $ip,'daemon' => $daemon_name});
 	 return undef;