瀏覽代碼

[Web] Fix some transport verifications

andryyy 5 年之前
父節點
當前提交
79ab962d50
共有 4 個文件被更改,包括 37 次插入3 次删除
  1. 1 1
      data/web/admin.php
  2. 1 1
      data/web/edit.php
  3. 29 1
      data/web/inc/ajax/transport_check.php
  4. 6 0
      data/web/inc/functions.transports.inc.php

+ 1 - 1
data/web/admin.php

@@ -272,7 +272,7 @@ if (!isset($_SESSION['gal']) && $license_cache = $redis->Get('LICENSE_STATUS_CAC
             <form class="form" data-id="rlyhost" role="form" method="post">
             <form class="form" data-id="rlyhost" role="form" method="post">
               <div class="form-group">
               <div class="form-group">
                 <label for="hostname"><?=$lang['admin']['host'];?></label>
                 <label for="hostname"><?=$lang['admin']['host'];?></label>
-                <input class="form-control input-sm" name="hostname" placeholder='host:25, host, [host]:25, [0.0.0.0]:25' required>
+                <input class="form-control input-sm" name="hostname" placeholder='[0.0.0.0], [0.0.0.0]:25, host:25, host, [host]:25' required>
               </div>
               </div>
               <div class="form-group">
               <div class="form-group">
                 <label for="username"><?=$lang['admin']['username'];?></label>
                 <label for="username"><?=$lang['admin']['username'];?></label>

+ 1 - 1
data/web/edit.php

@@ -843,7 +843,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
             <div class="form-group">
             <div class="form-group">
               <label class="control-label col-sm-2" for="nexthop"><?=$lang['edit']['nexthop'];?></label>
               <label class="control-label col-sm-2" for="nexthop"><?=$lang['edit']['nexthop'];?></label>
               <div class="col-sm-10">
               <div class="col-sm-10">
-                <input type="text" class="form-control" name="nexthop" value="<?=htmlspecialchars($result['nexthop'], ENT_QUOTES, 'UTF-8');?>" required>
+                <input type="text" class="form-control" name="nexthop" placeholder='[0.0.0.0], [0.0.0.0]:25, host:25, host, [host]:25' value="<?=htmlspecialchars($result['nexthop'], ENT_QUOTES, 'UTF-8');?>" required>
               </div>
               </div>
             </div>
             </div>
             <div class="form-group">
             <div class="form-group">

+ 29 - 1
data/web/inc/ajax/transport_check.php

@@ -23,9 +23,37 @@ if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == "admi
   if (!empty($transport_details)) {
   if (!empty($transport_details)) {
     // Remove [ and ]
     // Remove [ and ]
     $hostname_w_port = preg_replace('/\[|\]/', '', $nexthop);
     $hostname_w_port = preg_replace('/\[|\]/', '', $nexthop);
+    preg_match('/\[.+\](:.+)/', $nexthop, $hostname_port_match);
+    preg_match('/\[\d\.\d\.\d\.\d\](:.+)/', $nexthop, $ipv4_port_match);
+    $has_bracket_and_port = (isset($hostname_port_match[1])) ? true : false;
+    $is_ipv4_and_has_port = (isset($ipv4_port_match[1])) ? true : false;
     $skip_lookup_mx = strpos($nexthop, '[');
     $skip_lookup_mx = strpos($nexthop, '[');
     // Explode to hostname and port
     // Explode to hostname and port
-    list($hostname, $port) = explode(':', $hostname_w_port);
+    if ($has_bracket_and_port) {
+      $port = substr($hostname_w_port, strrpos($hostname_w_port, ':') + 1);
+      $hostname = rtrim($hostname_w_port, ':' . $port);
+      if (filter_var($hostname, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
+        $hostname = '[' . $hostname . ']:';
+      }
+    }
+    else {
+      if ($is_ipv4_and_has_port) {
+        $port = substr($hostname_w_port, strrpos($hostname_w_port, ':') + 1);
+        $hostname = rtrim($hostname_w_port, ':' . $port);
+      }
+      if (filter_var($hostname_w_port, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
+        $hostname = $hostname_w_port;
+        $port = null;
+      }
+      elseif (filter_var($hostname_w_port, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
+        $hostname = '[' . $hostname_w_port . ']';
+        $port = null;
+      }
+      else {
+        echo "Invalid transport";
+        die();
+      }
+    }
     // Try to get MX if host is not [host]
     // Try to get MX if host is not [host]
     if ($skip_lookup_mx === false) {
     if ($skip_lookup_mx === false) {
       getmxrr($hostname, $mx_records, $mx_weight);
       getmxrr($hostname, $mx_records, $mx_weight);

+ 6 - 0
data/web/inc/functions.transports.inc.php

@@ -190,6 +190,9 @@ function transport($_action, $_data = null) {
       $active = intval($_data['active']);
       $active = intval($_data['active']);
       $lookup_mx = intval($_data['lookup_mx']);
       $lookup_mx = intval($_data['lookup_mx']);
       $nexthop = trim($_data['nexthop']);
       $nexthop = trim($_data['nexthop']);
+      if (filter_var($nexthop, FILTER_VALIDATE_IP)) {
+        $nexthop = '[' . $nexthop . ']';
+      }
       preg_match('/\[(.+)\].*/', $nexthop, $next_hop_matches);
       preg_match('/\[(.+)\].*/', $nexthop, $next_hop_matches);
       $next_hop_clean = (isset($next_hop_matches[1])) ? $next_hop_matches[1] : $nexthop;
       $next_hop_clean = (isset($next_hop_matches[1])) ? $next_hop_matches[1] : $nexthop;
       $username = str_replace(':', '\:', trim($_data['username']));
       $username = str_replace(':', '\:', trim($_data['username']));
@@ -323,6 +326,9 @@ function transport($_action, $_data = null) {
           continue;
           continue;
         }
         }
         preg_match('/\[(.+)\].*/', $nexthop, $next_hop_matches);
         preg_match('/\[(.+)\].*/', $nexthop, $next_hop_matches);
+        if (filter_var($nexthop, FILTER_VALIDATE_IP)) {
+          $nexthop = '[' . $nexthop . ']';
+        }
         $next_hop_clean = (isset($next_hop_matches[1])) ? $next_hop_matches[1] : $nexthop;
         $next_hop_clean = (isset($next_hop_matches[1])) ? $next_hop_matches[1] : $nexthop;
         $transports = transport('get');
         $transports = transport('get');
         if (!empty($transports)) {
         if (!empty($transports)) {