diff --git a/data/web/debug.php b/data/web/debug.php index 0723ba6a..f9685ab4 100644 --- a/data/web/debug.php +++ b/data/web/debug.php @@ -23,7 +23,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI']; <li role="presentation"><a href="#tab-postfix-logs" aria-controls="tab-postfix-logs" role="tab" data-toggle="tab">Postfix</a></li> <li role="presentation"><a href="#tab-dovecot-logs" aria-controls="tab-dovecot-logs" role="tab" data-toggle="tab">Dovecot</a></li> <li role="presentation"><a href="#tab-sogo-logs" aria-controls="tab-sogo-logs" role="tab" data-toggle="tab">SOGo</a></li> - <li role="presentation"><a href="#tab-fail2ban-logs" aria-controls="tab-fail2ban-logs" role="tab" data-toggle="tab">Fail2ban</a></li> + <li role="presentation"><a href="#tab-netfilter-logs" aria-controls="tab-netfilter-logs" role="tab" data-toggle="tab">Netfilter</a></li> <li role="presentation"><a href="#tab-rspamd-history" aria-controls="tab-rspamd-history" role="tab" data-toggle="tab">Rspamd</a></li> <li role="presentation"><a href="#tab-autodiscover-logs" aria-controls="tab-autodiscover-logs" role="tab" data-toggle="tab">Autodiscover</a></li> <li role="presentation"><a href="#tab-watchdog-logs" aria-controls="tab-watchdog-logs" role="tab" data-toggle="tab">Watchdog</a></li> @@ -112,7 +112,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI']; 'redis-mailcow', 'php-fpm-mailcow', 'mysql-mailcow', - 'fail2ban-mailcow', + 'netfilter-mailcow', 'clamd-mailcow' ); foreach ($container_array as $container) { @@ -123,21 +123,26 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI']; <?php date_default_timezone_set('UTC'); $StartedAt = date_parse($container_stats['State']['StartedAt']); - $date = new \DateTime(); - $date->setTimestamp(mktime( - $StartedAt['hour'], - $StartedAt['minute'], - $StartedAt['second'], - $StartedAt['month'], - $StartedAt['day'], - $StartedAt['year'])); - $user_tz = new DateTimeZone(getenv('TZ')); - $date->setTimezone($user_tz); - $started = $date->format('r'); + if ($StartedAt['hour'] !== false) { + $date = new \DateTime(); + $date->setTimestamp(mktime( + $StartedAt['hour'], + $StartedAt['minute'], + $StartedAt['second'], + $StartedAt['month'], + $StartedAt['day'], + $StartedAt['year'])); + $user_tz = new DateTimeZone(getenv('TZ')); + $date->setTimezone($user_tz); + $started = $date->format('r'); + } + else { + $started = '?'; + } ?> <small>(Started on <?=$started;?>), <a href data-toggle="modal" data-container="<?=$container;?>" data-target="#RestartContainer">Restart</a></small> - <span class="pull-right label label-<?=($container_stats['State']['Running'] == 1) ? 'success' : 'danger';?>"> </span> + <span class="pull-right label label-<?=($container_stats !== false && !empty($container_stats)) ? (($container_stats['State']['Running'] == 1) ? 'success' : 'danger') : 'default'; ?>"> </span> </li> <?php } @@ -198,18 +203,18 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI']; </div> </div> - <div role="tabpanel" class="tab-pane" id="tab-fail2ban-logs"> + <div role="tabpanel" class="tab-pane" id="tab-netfilter-logs"> <div class="panel panel-default"> - <div class="panel-heading">Fail2ban <span class="badge badge-info log-lines"></span> + <div class="panel-heading">Netfilter <span class="badge badge-info log-lines"></span> <div class="btn-group pull-right"> - <button class="btn btn-xs btn-default add_log_lines" data-post-process="general_syslog" data-table="fail2ban_log" data-log-url="fail2ban" data-nrows="100">+ 100</button> - <button class="btn btn-xs btn-default add_log_lines" data-post-process="general_syslog" data-table="fail2ban_log" data-log-url="fail2ban" data-nrows="1000">+ 1000</button> - <button class="btn btn-xs btn-default" id="refresh_fail2ban_log"><?=$lang['admin']['refresh'];?></button> + <button class="btn btn-xs btn-default add_log_lines" data-post-process="general_syslog" data-table="netfilter_log" data-log-url="netfilter" data-nrows="100">+ 100</button> + <button class="btn btn-xs btn-default add_log_lines" data-post-process="general_syslog" data-table="netfilter_log" data-log-url="netfilter" data-nrows="1000">+ 1000</button> + <button class="btn btn-xs btn-default" id="refresh_netfilter_log"><?=$lang['admin']['refresh'];?></button> </div> </div> <div class="panel-body"> <div class="table-responsive"> - <table class="table table-striped table-condensed" id="fail2ban_log"></table> + <table class="table table-striped table-condensed" id="netfilter_log"></table> </div> </div> </div> diff --git a/data/web/edit.php b/data/web/edit.php index 43e055ca..1611a6af 100644 --- a/data/web/edit.php +++ b/data/web/edit.php @@ -661,7 +661,7 @@ if (isset($_SESSION['mailcow_cc_role'])) { ?> <h4>Recipient map: <?=$result['recipient_map_old'];?></h4> <br /> - <form class="form-horizontal" data-id="editrecipient_map" role="form" method="post"> + <form class="form-horizontal" data-id="edit_recipient_map" role="form" method="post"> <input type="hidden" value="0" name="active"> <div class="form-group"> <label class="control-label col-sm-2" for="recipient_map_new">New destination</label> @@ -679,7 +679,7 @@ if (isset($_SESSION['mailcow_cc_role'])) { </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> - <button class="btn btn-success" id="edit_selected" data-id="editrecipient_map" data-item="<?=$map;?>" data-api-url='edit/recipient_map' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button> + <button class="btn btn-success" id="edit_selected" data-id="edit_recipient_map" data-item="<?=$map;?>" data-api-url='edit/recipient_map' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button> </div> </div> </form> diff --git a/data/web/favicon.png b/data/web/favicon.png index 6390041d..69eb2fcd 100644 Binary files a/data/web/favicon.png and b/data/web/favicon.png differ diff --git a/data/web/img/cow_lock.svg b/data/web/img/cow_lock.svg new file mode 100644 index 00000000..2be88dec --- /dev/null +++ b/data/web/img/cow_lock.svg @@ -0,0 +1,198 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="Layer_1" + x="0px" + y="0px" + width="267.80917" + height="306.93799" + viewBox="0 0 267.80917 306.93799" + enable-background="new 0 0 1600 1200" + xml:space="preserve" + inkscape:version="0.91 r13725" + sodipodi:docname="cow_protected_nb.svg"><metadata + id="metadata175"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs + id="defs173" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1721" + inkscape:window-height="1177" + id="namedview171" + showgrid="false" + inkscape:zoom="1.5733333" + inkscape:cx="29.160751" + inkscape:cy="110.78493" + inkscape:window-x="-8" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><g + id="g3" + transform="translate(-661.33429,-371.905)"><g + id="g11"><g + id="g13"><g + id="g15" /></g><g + id="g19"><g + id="g21" /></g><g + id="g25"><g + id="g27"><g + id="g29" /></g></g><g + id="g33"><g + id="g35"><g + id="g37" /></g></g></g><polyline + points="702.43,498.974 684.548,546.739 697.837,612.03 723.777,638.295 " + id="polyline43" + style="fill:#3d5263" /><g + id="g45"><g + id="g47"><polyline + points="669.541,457.293 684.791,493.55 705.121,503.375 735.319,465.213 " + id="polyline49" + style="fill:#fef3df" /><g + id="g51"><path + d="m 721.916,479.683 c 0,0 -22.477,-25.55 -49.782,-18.971 0,0 4.666,34.11 46.339,44.009 l 2.61,8.531 c 0,0 -65.598,-9.687 -59.326,-67.578 0,0 48.997,-19.88 72.582,15.103" + id="path53" + inkscape:connector-curvature="0" + style="fill:#b58765" /><polyline + points="920.935,457.293 905.688,493.55 885.359,503.375 855.16,465.213 " + id="polyline55" + style="fill:#fef3df" /><path + d="m 868.564,479.683 c 0,0 22.475,-25.55 49.779,-18.971 0,0 -4.663,34.11 -46.336,44.009 l -2.612,8.531 c 0,0 65.596,-9.687 59.326,-67.578 0,0 -48.995,-19.88 -72.584,15.103" + id="path57" + inkscape:connector-curvature="0" + style="fill:#b58765" /></g></g><path + d="m 737.898,653.506 55.932,0 20.22445,-212.1817 c -55.801,0 -116.21545,37.4237 -116.21545,85.2487 0,1.454 0.085,2.786 0.121,4.174 0.127,3.933 0.448,7.583 0.856,11.132 1.689,14.813 5.45,27.171 8.459,43.373 1.451,7.829 5.001,23.369 5.001,23.369 0.056,0.408 0.165,0.804 0.224,1.211 2.533,16.542 11.829,32.019 25.398,43.674 z" + id="path59" + inkscape:connector-curvature="0" + style="fill:#b58765" + sodipodi:nodetypes="cccscccccc" /><path + d="m 793.259,439.976 0,213.53 55.932,0 c 13.569,-11.654 22.862,-27.132 25.4,-43.675 0.058,-0.407 0.163,-0.803 0.221,-1.211 0,0 3.548,-15.539 5.001,-23.369 3.01,-16.202 6.773,-28.561 8.462,-43.371 0.404,-3.552 0.724,-7.202 0.846,-11.135 0.042,-1.388 0.126,-2.72 0.126,-4.174 -10e-4,-47.823 -40.183,-86.595 -95.988,-86.595 z" + id="path61" + inkscape:connector-curvature="0" + style="fill:#b58765" /><g + id="g63"><g + id="g65"><path + d="m 872.193,619.949 c 0,28.315 -35.083,51.278 -78.366,51.278 -43.289,0 -78.371,-22.963 -78.371,-51.278 0,-28.319 35.082,-51.278 78.371,-51.278 43.282,0 78.366,22.959 78.366,51.278 z" + id="path67" + inkscape:connector-curvature="0" + style="fill:#fef3df" /></g></g><g + id="g69"><g + id="g71"><g + id="g73"><path + d="m 758.318,612.03 c 0,6.213 -5.039,11.254 -11.258,11.254 -6.208,0 -11.25,-5.04 -11.25,-11.254 0,-6.222 5.042,-11.254 11.25,-11.254 6.218,0 11.258,5.033 11.258,11.254 z" + id="path75" + inkscape:connector-curvature="0" + style="fill:#5a3620" /></g></g><g + id="g77"><g + id="g79"><path + d="m 852.109,612.03 c 0,6.213 -5.036,11.254 -11.254,11.254 -6.216,0 -11.257,-5.04 -11.257,-11.254 0,-6.222 5.04,-11.254 11.257,-11.254 6.218,0 11.254,5.033 11.254,11.254 z" + id="path81" + inkscape:connector-curvature="0" + style="fill:#5a3620" /></g></g></g><g + id="g83"><path + d="m 886.474,532.301 c 0.354,-3.113 0.634,-6.31 0.743,-9.752 0.035,-1.217 0.109,-2.384 0.109,-3.66 0,-40.776 -33.361,-74.027 -80.219,-75.758 l -7.333,0.005 c -0.003,0 -0.003,0 -0.006,0 -0.007,0.018 -26.057,89.686 79.134,141.521 0.945,-4.316 2.078,-10.867 2.73,-14.369 2.638,-14.193 3.363,-25.015 4.842,-37.987 z" + id="path85" + inkscape:connector-curvature="0" + style="fill:#87654a" /></g><g + id="g87"><g + id="g89"><g + id="g91"><g + id="g93"><path + d="m 855.16,526.149 c 0,6.963 -5.649,12.608 -12.616,12.608 -6.961,0 -12.611,-5.645 -12.611,-12.608 0,-6.969 5.65,-12.611 12.611,-12.611 6.967,-10e-4 12.616,5.642 12.616,12.611 z" + id="path95" + inkscape:connector-curvature="0" + style="fill:#5a3620" /></g></g></g><g + id="g97"><g + id="g99"><g + id="g101"><path + d="m 763.301,526.149 c 0,6.963 -5.647,12.608 -12.609,12.608 -6.968,0 -12.609,-5.645 -12.609,-12.608 0,-6.969 5.641,-12.611 12.609,-12.611 6.962,-10e-4 12.609,5.642 12.609,12.611 z" + id="path103" + inkscape:connector-curvature="0" + style="fill:#5a3620" /></g></g></g><g + id="g105"><g + id="g107"><path + d="m 760.023,522.362 c 0,2.557 -2.07,4.628 -4.629,4.628 -2.557,0 -4.632,-2.071 -4.632,-4.628 0,-2.552 2.075,-4.625 4.632,-4.625 2.559,0.001 4.629,2.073 4.629,4.625 z" + id="path109" + inkscape:connector-curvature="0" + style="fill:#ffffff" /></g></g><g + id="g111"><g + id="g113"><path + d="m 851.024,522.362 c 0,2.557 -2.073,4.628 -4.628,4.628 -2.558,0 -4.63,-2.071 -4.63,-4.628 0,-2.552 2.072,-4.625 4.63,-4.625 2.555,0.001 4.628,2.073 4.628,4.625 z" + id="path115" + inkscape:connector-curvature="0" + style="fill:#ffffff" /></g></g></g></g><path + d="m 725.288,441.121 c 0,0 -18.232,-25.193 0,-41.628 0,0 13.123,32.005 40.233,31.495" + id="path117" + inkscape:connector-curvature="0" + style="fill:#fef3df" /><path + d="m 848.318,439.837 c 0,0 18.232,-25.193 0,-41.628 0,0 -13.123,32.005 -40.233,31.495" + id="path119" + inkscape:connector-curvature="0" + style="fill:#fef3df" /><path + d="m 797.53,438.453 c -66.381,0 -120.196,53.815 -120.196,120.196 0,66.381 53.815,120.194 120.196,120.194 66.382,0 120.196,-53.813 120.196,-120.194 C 917.725,492.268 863.912,438.453 797.53,438.453 Z m -11.958,215.653 c -52.997,0 -95.961,-43.845 -95.961,-97.931 0,-54.086 42.963,-97.931 95.961,-97.931 52.995,0 95.958,43.845 95.958,97.931 0,54.086 -42.963,97.931 -95.958,97.931 z" + id="path121" + inkscape:connector-curvature="0" + style="fill:#f1f2f2" /><g + id="g123"><path + d="m 793.003,443.237 c 66.381,0 120.194,53.815 120.194,120.196 0,30.711 -11.523,58.726 -30.475,79.973 21.631,-21.736 35.002,-51.697 35.002,-84.785 0,-66.38 -53.813,-120.196 -120.196,-120.196 -35.67,0 -67.706,15.545 -89.719,40.224 21.769,-21.872 51.899,-35.412 85.194,-35.412 z" + id="path125" + inkscape:connector-curvature="0" + style="fill:#ffffff" /></g><g + id="g127"><path + d="m 694.265,502.313 c 0,0 40.198,-14.957 95.353,-14.022 55.155,0.935 100.027,29.447 100.027,29.447 l 8.413,-57.492 c 0,0 -51.883,-35.524 -77.591,-59.829 -25.708,-24.306 -28.98,-28.512 -28.98,-28.512 0,0 -40.198,41.6 -66.373,56.557 -26.175,14.957 -35.524,20.566 -35.524,20.566 l 4.675,53.285 z" + id="path129" + inkscape:connector-curvature="0" + style="fill:#f1f2f2" /><path + d="m 752.039,427.289 c -5.218,15.301 0.741,45.305 6.446,52.941 4.565,-14.198 1.381,-39.668 -6.446,-52.941 z" + id="path131" + inkscape:connector-curvature="0" + style="fill:#97a3a2" /><path + d="m 792.297,477.645 c 8.422,-10.272 5.501,-61.687 -0.342,-73.723 -6.194,15.191 -10.634,65.438 0.342,73.723 z" + id="path133" + inkscape:connector-curvature="0" + style="fill:#97a3a2" /><path + d="m 720.593,443.412 c -3.983,12.281 1.136,36.168 5.784,42.198 3.474,-11.393 0.625,-31.693 -5.784,-42.198 z" + id="path135" + inkscape:connector-curvature="0" + style="fill:#97a3a2" /><path + d="m 832.42,429.158 c 5.218,15.301 -0.741,45.305 -6.446,52.941 -4.565,-14.197 -1.38,-39.667 6.446,-52.941 z" + id="path137" + inkscape:connector-curvature="0" + style="fill:#97a3a2" /><path + d="m 863.633,447.619 c 3.983,12.281 -1.136,36.168 -5.784,42.198 -3.474,-11.393 -0.625,-31.693 5.784,-42.198 z" + id="path139" + inkscape:connector-curvature="0" + style="fill:#97a3a2" /></g><g + id="g143" /><path + d="m 730.865,636.637 c 0,0 43.49,2.05 64.328,-35.861 0,0 14.758,30.223 46.61,34.759" + id="path157" + inkscape:connector-curvature="0" + style="opacity:0.1;fill:#3d5263" /><path + d="m 795.193,671.227 0,-60.691 c -13.615,27.608 -64.328,26.101 -64.328,26.101 0,0 3.306,8.89 3.788,9.853 0.482,0.963 21.508,12.52 21.508,12.52" + id="path159" + inkscape:connector-curvature="0" + style="fill:#f1f2f2" /><path + d="m 859.521,636.637 c 0,0 -50.713,1.507 -64.328,-26.101 l 0,60.691" + id="path161" + inkscape:connector-curvature="0" + style="fill:#f1f2f2" /><g + id="g163" /></g></svg> \ No newline at end of file diff --git a/data/web/inc/functions.docker.inc.php b/data/web/inc/functions.docker.inc.php index 5b6afa9f..11747f25 100644 --- a/data/web/inc/functions.docker.inc.php +++ b/data/web/inc/functions.docker.inc.php @@ -7,6 +7,7 @@ function docker($service_name, $action, $attr1 = null, $attr2 = null, $extra_hea curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/containers/json'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_POST, 0); + curl_setopt($curl, CURLOPT_TIMEOUT, 4); $response = curl_exec($curl); if ($response === false) { $err = curl_error($curl); @@ -32,6 +33,7 @@ function docker($service_name, $action, $attr1 = null, $attr2 = null, $extra_hea curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/containers/' . $container_id . '/json'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_POST, 0); + curl_setopt($curl, CURLOPT_TIMEOUT, 4); $response = curl_exec($curl); if ($response === false) { $err = curl_error($curl); @@ -58,6 +60,7 @@ function docker($service_name, $action, $attr1 = null, $attr2 = null, $extra_hea if (ctype_xdigit($container_id) && ctype_alnum($attr1)) { curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/containers/' . $container_id . '/' . $attr1); curl_setopt($curl, CURLOPT_POST, 1); + curl_setopt($curl, CURLOPT_TIMEOUT, 4); if (!empty($attr2)) { curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($attr2)); } diff --git a/data/web/inc/functions.fail2ban.inc.php b/data/web/inc/functions.fail2ban.inc.php index b78fb36a..5acbf60f 100644 --- a/data/web/inc/functions.fail2ban.inc.php +++ b/data/web/inc/functions.fail2ban.inc.php @@ -4,30 +4,26 @@ function fail2ban($_action, $_data = null) { global $lang; switch ($_action) { case 'get': - $data = array(); + $f2b_options = array(); if ($_SESSION['mailcow_cc_role'] != "admin") { return false; } try { - $data['ban_time'] = $redis->Get('F2B_BAN_TIME'); - $data['max_attempts'] = $redis->Get('F2B_MAX_ATTEMPTS'); - $data['retry_window'] = $redis->Get('F2B_RETRY_WINDOW'); - $data['netban_ipv4'] = $redis->Get('F2B_NETBAN_IPV4'); - $data['netban_ipv6'] = $redis->Get('F2B_NETBAN_IPV6'); + $f2b_options = json_decode($redis->Get('F2B_OPTIONS'), true); $wl = $redis->hGetAll('F2B_WHITELIST'); if (is_array($wl)) { foreach ($wl as $key => $value) { $tmp_data[] = $key; } if (isset($tmp_data)) { - $data['whitelist'] = implode(PHP_EOL, $tmp_data); + $f2b_options['whitelist'] = implode(PHP_EOL, $tmp_data); } else { - $data['whitelist'] = ""; + $f2b_options['whitelist'] = ""; } } else { - $data['whitelist'] = ""; + $f2b_options['whitelist'] = ""; } } catch (RedisException $e) { @@ -37,7 +33,7 @@ function fail2ban($_action, $_data = null) { ); return false; } - return $data; + return $f2b_options; break; case 'edit': if ($_SESSION['mailcow_cc_role'] != "admin") { @@ -63,21 +59,16 @@ function fail2ban($_action, $_data = null) { return false; } $wl = $_data['whitelist']; - $ban_time = ($ban_time < 60) ? 60 : $ban_time; - - $netban_ipv4 = ($netban_ipv4 < 8) ? 8 : $netban_ipv4; - $netban_ipv6 = ($netban_ipv6 < 8) ? 8 : $netban_ipv6; - $netban_ipv4 = ($netban_ipv4 > 32) ? 32 : $netban_ipv4; - $netban_ipv6 = ($netban_ipv6 > 128) ? 128 : $netban_ipv6; - - $max_attempts = ($max_attempts < 1) ? 1 : $max_attempts; - $retry_window = ($retry_window < 1) ? 1 : $retry_window; + $f2b_options = array(); + $f2b_options['ban_time'] = ($ban_time < 60) ? 60 : $ban_time; + $f2b_options['netban_ipv4'] = ($netban_ipv4 < 8) ? 8 : $netban_ipv4; + $f2b_options['netban_ipv6'] = ($netban_ipv6 < 8) ? 8 : $netban_ipv6; + $f2b_options['netban_ipv4'] = ($netban_ipv4 > 32) ? 32 : $netban_ipv4; + $f2b_options['netban_ipv6'] = ($netban_ipv6 > 128) ? 128 : $netban_ipv6; + $f2b_options['max_attempts'] = ($max_attempts < 1) ? 1 : $max_attempts; + $f2b_options['retry_window'] = ($retry_window < 1) ? 1 : $retry_window; try { - $redis->Set('F2B_BAN_TIME', $ban_time); - $redis->Set('F2B_MAX_ATTEMPTS', $max_attempts); - $redis->Set('F2B_RETRY_WINDOW', $retry_window); - $redis->Set('F2B_NETBAN_IPV4', $netban_ipv4); - $redis->Set('F2B_NETBAN_IPV6', $netban_ipv6); + $redis->Set('F2B_OPTIONS', json_encode($f2b_options)); $redis->Del('F2B_WHITELIST'); if(!empty($wl)) { $wl_array = array_map('trim', preg_split( "/( |,|;|\n)/", $wl)); diff --git a/data/web/inc/functions.inc.php b/data/web/inc/functions.inc.php index f7f08403..54ca415e 100644 --- a/data/web/inc/functions.inc.php +++ b/data/web/inc/functions.inc.php @@ -1134,13 +1134,13 @@ function get_logs($container, $lines = false) { return $data_array; } } - if ($container == "fail2ban-mailcow") { + if ($container == "netfilter-mailcow") { if (!is_numeric($lines)) { list ($from, $to) = explode('-', $lines); - $data = $redis->lRange('F2B_LOG', intval($from), intval($to)); + $data = $redis->lRange('NETFILTER_LOG', intval($from), intval($to)); } else { - $data = $redis->lRange('F2B_LOG', 0, intval($lines)); + $data = $redis->lRange('NETFILTER_LOG', 0, intval($lines)); } if ($data) { foreach ($data as $json_line) { diff --git a/data/web/inc/init_db.inc.php b/data/web/inc/init_db.inc.php index f3577d50..f059ced0 100644 --- a/data/web/inc/init_db.inc.php +++ b/data/web/inc/init_db.inc.php @@ -3,7 +3,7 @@ function init_db_schema() { try { global $pdo; - $db_version = "27012018_1721"; + $db_version = "30012018_1521"; $stmt = $pdo->query("SHOW TABLES LIKE 'versions'"); $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); @@ -21,10 +21,6 @@ function init_db_schema() { AND active = '1' AND address NOT LIKE '@%' GROUP BY goto;", - "grouped_sender_acl" => "CREATE VIEW grouped_sender_acl (username, send_as_acl) AS - SELECT logged_in_as, IFNULL(GROUP_CONCAT(send_as SEPARATOR ' '), '') AS send_as_acl FROM sender_acl - WHERE send_as NOT LIKE '@%' - GROUP BY logged_in_as;", "grouped_domain_alias_address" => "CREATE VIEW grouped_domain_alias_address (username, ad_alias) AS SELECT username, IFNULL(GROUP_CONCAT(local_part, '@', alias_domain SEPARATOR ' '), '') AS ad_alias FROM mailbox LEFT OUTER JOIN alias_domain ON target_domain=domain @@ -193,7 +189,6 @@ function init_db_schema() { "tls_enforce_out" => "TINYINT(1) NOT NULL DEFAULT '0'", "kind" => "VARCHAR(100) NOT NULL DEFAULT ''", "multiple_bookings" => "TINYINT(1) NOT NULL DEFAULT '0'", - "wants_tagged_subject" => "TINYINT(1) NOT NULL DEFAULT '0'", "created" => "DATETIME(0) NOT NULL DEFAULT NOW(0)", "modified" => "DATETIME ON UPDATE CURRENT_TIMESTAMP", "active" => "TINYINT(1) NOT NULL DEFAULT '1'" @@ -250,7 +245,8 @@ function init_db_schema() { "eas_reset" => "TINYINT(1) NOT NULL DEFAULT '1'", "filters" => "TINYINT(1) NOT NULL DEFAULT '1'", "quarantaine" => "TINYINT(1) NOT NULL DEFAULT '1'", - "bcc_maps" => "TINYINT(1) NOT NULL DEFAULT '1'", + "bcc_maps" => "TINYINT(1) NOT NULL DEFAULT '0'", + "recipient_maps" => "TINYINT(1) NOT NULL DEFAULT '0'", ), "keys" => array( "fkey" => array( diff --git a/data/web/js/debug.js b/data/web/js/debug.js index 48ebd5e9..4ffcc044 100644 --- a/data/web/js/debug.js +++ b/data/web/js/debug.js @@ -31,9 +31,9 @@ jQuery(function($){ e.preventDefault(); draw_acme_logs(); }); - $("#refresh_fail2ban_log").on('click', function(e) { + $("#refresh_netfilter_log").on('click', function(e) { e.preventDefault(); - draw_fail2ban_logs(); + draw_netfilter_logs(); }); $("#refresh_rspamd_history").on('click', function(e) { e.preventDefault(); @@ -206,8 +206,8 @@ jQuery(function($){ } }); } - function draw_fail2ban_logs() { - ft_fail2ban_logs = FooTable.init('#fail2ban_log', { + function draw_netfilter_logs() { + ft_netfilter_logs = FooTable.init('#netfilter_log', { "columns": [ {"name":"time","formatter":function unix_time_format(tm) { var date = new Date(tm ? tm * 1000 : 0); return date.toLocaleString();},"title":lang.time,"style":{"width":"170px"}}, {"name":"priority","title":lang.priority,"style":{"width":"80px"}}, @@ -215,10 +215,10 @@ jQuery(function($){ ], "rows": $.ajax({ dataType: 'json', - url: '/api/v1/get/logs/fail2ban', + url: '/api/v1/get/logs/netfilter', jsonp: false, error: function () { - console.log('Cannot draw fail2ban log table'); + console.log('Cannot draw netfilter log table'); }, success: function (data) { return process_table_data(data, 'general_syslog'); @@ -497,7 +497,7 @@ jQuery(function($){ draw_watchdog_logs(); draw_acme_logs(); draw_api_logs(); - draw_fail2ban_logs(); + draw_netfilter_logs(); draw_rspamd_history(); -}); \ No newline at end of file +}); diff --git a/data/web/json_api.php b/data/web/json_api.php index 8c2c5b44..9d6e9761 100644 --- a/data/web/json_api.php +++ b/data/web/json_api.php @@ -880,14 +880,14 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u echo '{}'; } break; - case "fail2ban": + case "netfilter": // 0 is first record, so empty is fine if (isset($extra)) { $extra = preg_replace('/[^\d\-]/i', '', $extra); - $logs = get_logs('fail2ban-mailcow', $extra); + $logs = get_logs('netfilter-mailcow', $extra); } else { - $logs = get_logs('fail2ban-mailcow'); + $logs = get_logs('netfilter-mailcow'); } if (isset($logs) && !empty($logs)) { echo json_encode($logs, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); diff --git a/data/web/lang/lang.de.php b/data/web/lang/lang.de.php index a874eea1..71587fcf 100644 --- a/data/web/lang/lang.de.php +++ b/data/web/lang/lang.de.php @@ -666,3 +666,14 @@ $lang['mailbox']['bcc_to_rcpt'] = "Map empfängerabhängig verwenden"; $lang['mailbox']['add_bcc_entry'] = "BCC-Eintrag hinzufügen"; $lang['mailbox']['bcc_info'] = "Eine empfängerabhängige Map wird verwendet, wenn die BCC-Map Eintragung auf den Eingang einer E-Mail auf das lokale Ziel reagieren soll. Senderabhängige Maps verfahren nach dem gleichen Prinzip.<br/> Das lokale Ziel wird bei Fehlzustellungen an ein BCC-Ziel nicht informiert."; +$lang['mailbox']['address_rewriting'] = 'Adressumschreibung'; +$lang['mailbox']['recipient_maps'] = 'Empfängerumschreibungen'; +$lang['mailbox']['recipient_map_info'] = 'Empfängerumschreibung ersetzen den Empfänger einer E-Mail vor dem Versand.'; +$lang['mailbox']['recipient_map_old'] = 'Original Empfänger'; +$lang['mailbox']['recipient_map_new'] = 'Neuer Empfänger'; +$lang['mailbox']['add_recipient_map_entry'] = 'Empfängerumschreibung hinzufügen'; +$lang['mailbox']['sender_maps'] = 'Senderumschreibungen'; +$lang['mailbox']['sender_map_info'] = 'Senderumschreibungen werden verwendet, um den Absender einer E-Mail noch vor dem Versand umzuschreiben.'; +$lang['mailbox']['sender_map_old'] = 'Original Absender'; +$lang['mailbox']['sender_map_new'] = 'Neuer Absender'; +$lang['mailbox']['add_sender_map_entry'] = 'Senderumschreibung hinzufügen'; \ No newline at end of file diff --git a/data/web/lang/lang.en.php b/data/web/lang/lang.en.php index 41795bc3..50eb64f9 100644 --- a/data/web/lang/lang.en.php +++ b/data/web/lang/lang.en.php @@ -666,4 +666,9 @@ $lang['mailbox']['recipient_maps'] = 'Recipient maps'; $lang['mailbox']['recipient_map_info'] = 'Recipient maps are used to replace the destination address on a message before it is delivered.'; $lang['mailbox']['recipient_map_old'] = 'Original recipient'; $lang['mailbox']['recipient_map_new'] = 'New recipient'; -$lang['mailbox']['add_recipient_map_entry'] = 'Add recipient map'; \ No newline at end of file +$lang['mailbox']['add_recipient_map_entry'] = 'Add recipient map'; +$lang['mailbox']['sender_maps'] = 'Sender maps'; +$lang['mailbox']['sender_map_info'] = 'Sender maps are used to replace the sender address on a message before it is sent.'; +$lang['mailbox']['sender_map_old'] = 'Original sender'; +$lang['mailbox']['sender_map_new'] = 'New sender'; +$lang['mailbox']['add_sender_map_entry'] = 'Add sender map'; \ No newline at end of file