Merge remote-tracking branch 'origin/bug-1318' into release
[cacert-devel.git] / includes / general.php
index b3fd121..17b449b 100644 (file)
                if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\+\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/" , $email))
                {
                        list($username,$domain)=explode('@',$email,2);
-                       $dom = escapeshellarg($domain);
-                       $line = trim(shell_exec("dig +short MX $dom 2>&1"));
-#echo $email."-$dom-$line-\n";
-#echo shell_exec("dig +short mx heise.de 2>&1")."-<br>\n";
-
-                       $list = explode("\n", $line);
-                       foreach($list as $row) {
-                               if(!strstr($row, " ")) {
-                                       continue;
+                       $mxhostrr = array();
+                       $mxweight = array();
+                       if( !getmxrr($domain, $mxhostrr, $mxweight) ) {
+                               $mxhostrr = array($domain);
+                               $mxweight = array(0);
+                       } else if ( empty($mxhostrr) ) {
+                               $mxhostrr = array($domain);
+                               $mxweight = array(0);
+                       }
+
+                       $mxhostprio = array();
+                       for($i = 0; $i < count($mxhostrr); $i++) {
+                               $mx_host = trim($mxhostrr[$i], '.');
+                               $mx_prio = $mxweight[$i];
+                               if(empty($mxhostprio[$mx_prio])) {
+                                       $mxhostprio[$mx_prio] = array();
+                               }
+                               $mxhostprio[$mx_prio][] = $mx_host;
+                       }
+
+                       array_walk($mxhostprio, function(&$mx) { shuffle($mx); } );
+                       ksort($mxhostprio);
+
+                       $mxhosts = array();
+                       foreach($mxhostprio as $mx_prio => $mxhostnames) {
+                               foreach($mxhostnames as $mx_host) {
+                                       $mxhosts[] = $mx_host;
                                }
-                               list($pri, $mxhosts[]) = explode(" ", trim($row), 2);
                        }
-                       $mxhosts[] = $domain;
-                       array_walk($mxhosts, function(&$mx) { $mx = trim($mx, '.'); } );
 
                        foreach($mxhosts as $key => $domain)
                        {
                                        fputs($fp, "EHLO www.cacert.org\r\n");
                                        do {
                                                $line = fgets($fp, 4096);
-                                               $has_starttls |= trim($line) == "250-STARTTLS";
+                                               $has_starttls |= substr(trim($line),4) == "STARTTLS";
                                        } while(substr($line, 0, 4) == "250-");
                                        if(substr($line, 0, 3) != "250") {
                                                fclose($fp);
                                        }
 
                                        if($has_starttls) {
+                                               fputs($fp, "STARTTLS\r\n");
+                                               do {
+                                                       $line = fgets($fp, 4096);
+                                               } while(substr($line, 0, 4) == "220-");
+                                               if(substr($line, 0, 3) != "220") {
+                                                       fclose($fp);
+                                                       continue;
+                                               }
+
                                                stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
 
                                                fputs($fp, "EHLO www.cacert.org\r\n");
                                                do {
                                                        $line = fgets($fp, 4096);
-                                                       $has_starttls |= trim($line) == "250-STARTTLS";
                                                } while(substr($line, 0, 4) == "250-");
                                                if(substr($line, 0, 3) != "250") {
                                                        fclose($fp);