Index: link.module
===================================================================
--- link.module	(révision 1622)
+++ link.module	(copie de travail)
@@ -10,8 +10,15 @@
 define('LINK_FRONT', 'front');
 define('LINK_EMAIL', 'email');
 define('LINK_NEWS', 'news');
-define('LINK_DOMAINS', 'aero|arpa|asia|biz|com|cat|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|mobi|local');
+define('LINK_DEVELOPMENT_DOMAINS', '|local|localhost');
+define('LINK_DEFAULT_DOMAINS', 'aero|arpa|asia|biz|com|cat|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|mobi' . LINK_DEVELOPMENT_DOMAINS . '|[a-z]{2}');
 
+define('LINK_VAR_TLDS', 'link_valid_TLDs');
+define('LINK_VAR_NEXT_TLD_LIST_UPDATE', 'link_next_TLD_list_update');
+define('LINK_TLD_LIST_UPDATE_PERIODICITY', '+1 day');
+define('LINK_TLD_LIST_UPDATE_PERIODICITY_ON_FAILURE', '+6 hour');
+define('LINK_TLD_SOURCE_URL', 'http://data.iana.org/TLD/tlds-alpha-by-domain.txt');
+
 define('LINK_TARGET_DEFAULT', 'default');
 define('LINK_TARGET_NEW_WINDOW', '_blank');
 define('LINK_TARGET_TOP', '_top');
@@ -893,7 +900,7 @@
     $protocol_match = preg_match("/^([a-z0-9][a-z0-9\.\-_]*:\/\/)/i", $url);
     if (empty($protocol_match)) {
       // But should there be? Add an automatic http:// if it starts with a domain name.
-      $domain_match = preg_match('/^(([a-z0-9]([a-z0-9\-_]*\.)+)('. LINK_DOMAINS .'|[a-z]{2}))/i', $url);
+      $domain_match = preg_match('/^(([a-z0-9]([a-z0-9\-_]*\.)+)('. _link_get_TLD_regex() .'))/i', $url);
       if (!empty($domain_match)) {
         $url = $protocol ."://". $url;
       }
@@ -977,7 +984,7 @@
   // Starting a parenthesis group with (?: means that it is grouped, but is not captured
   $protocol = '((?:'. implode("|", $allowed_protocols) .'):\/\/)';
   $authentication = "(?:(?:(?:[\w\.\-\+!$&'\(\)*\+,;=" . $LINK_ICHARS . "]|%[0-9a-f]{2})+(?::(?:[\w". $LINK_ICHARS ."\.\-\+%!$&'\(\)*\+,;=]|%[0-9a-f]{2})*)?)?@)";
-  $domain = '(?:(?:[a-z0-9' . $LINK_ICHARS_DOMAIN . ']([a-z0-9'. $LINK_ICHARS_DOMAIN . '\-_\[\]])*)(\.(([a-z0-9' . $LINK_ICHARS_DOMAIN . '\-_\[\]])+\.)*('. LINK_DOMAINS .'|[a-z]{2}))?)';
+  $domain = '(?:(?:[a-z0-9' . $LINK_ICHARS_DOMAIN . ']([a-z0-9'. $LINK_ICHARS_DOMAIN . '\-_\[\]])*)(\.(([a-z0-9' . $LINK_ICHARS_DOMAIN . '\-_\[\]])+\.)*('. _link_get_TLD_regex() .'))?)';
   $ipv4 = '(?:[0-9]{1,3}(\.[0-9]{1,3}){3})';
   $ipv6 = '(?:[0-9a-fA-F]{1,4}(\:[0-9a-fA-F]{1,4}){7})';
   $port = '(?::([0-9]{1,5}))';
@@ -1104,3 +1111,36 @@
   );
   return $properties;
 }
+
+/**
+ * Get the current list of valid Top-Level-Domains (TLDs) in regular expression form.
+ * 
+ */
+function _link_get_TLD_regex() {
+  // Is it time to update ?
+  if (time() >= variable_get(LINK_VAR_NEXT_TLD_LIST_UPDATE, 0))
+  {
+    $success = FALSE;
+    if ($tld_text = file_get_contents(LINK_TLD_SOURCE_URL))
+    {
+      if (preg_match_all('/^(?<tld>[-A-Z0-9]{2,})$/simx', $tld_text, $matches))
+      {
+        variable_set(LINK_VAR_TLDS, strtolower(implode('|', $matches['tld']) . LINK_DEVELOPMENT_DOMAINS));
+        variable_set(LINK_VAR_NEXT_TLD_LIST_UPDATE, strtotime(LINK_TLD_LIST_UPDATE_PERIODICITY));
+        $success = TRUE;
+      }
+    }
+    if (!$success) variable_set(LINK_VAR_NEXT_TLD_LIST_UPDATE, strtotime(LINK_TLD_LIST_UPDATE_PERIODICITY_ON_FAILURE));
+ }
+ return variable_get(LINK_VAR_TLDS, LINK_DEFAULT_DOMAINS);
+}
+
+
+/**
+ * Implements hook_cron().
+ *
+ * Ensures that the TLD list is up-to-date
+ */
+function link_cron() {
+ _link_get_TLD_regex();
+}
