[Web] Improve last logins, switch to country name (workaround, fix in progress)

master
andryyy 2021-06-06 21:00:48 +02:00
parent a89fe53e4a
commit 08d666985f
No known key found for this signature in database
GPG Key ID: 8EC34FF2794E25EF
3 changed files with 14 additions and 28 deletions

View File

@ -258,10 +258,11 @@ function last_login($action, $username, $sasl_limit = 10) {
switch ($action) { switch ($action) {
case 'get': case 'get':
if (filter_var($username, FILTER_VALIDATE_EMAIL) && hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $username)) { if (filter_var($username, FILTER_VALIDATE_EMAIL) && hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $username)) {
$stmt = $pdo->prepare('SELECT `real_rip`, MAX(`datetime`) as `datetime`, `service` FROM `sasl_logs` $stmt = $pdo->prepare('SELECT `real_rip`, MAX(`datetime`) as `datetime`, `service`, `app_password` FROM `sasl_logs`
LEFT OUTER JOIN `app_passwd` on `sasl_logs`.`app_password` = `app_passwd`.`id`
WHERE `username` = :username WHERE `username` = :username
AND `success` = 1 AND `success` = 1
GROUP BY `real_rip`, `service` GROUP BY `real_rip`, `service`, `app_password`
ORDER BY `datetime` DESC ORDER BY `datetime` DESC
LIMIT :sasl_limit;'); LIMIT :sasl_limit;');
$stmt->execute(array(':username' => $username, ':sasl_limit' => $sasl_limit)); $stmt->execute(array(':username' => $username, ':sasl_limit' => $sasl_limit));
@ -286,11 +287,13 @@ function last_login($action, $username, $sasl_limit = 10) {
$curl = curl_init(); $curl = curl_init();
curl_setopt($curl, CURLOPT_URL,"https://dfdata.bella.network/lookup/" . $sasl[$k]['real_rip']); curl_setopt($curl, CURLOPT_URL,"https://dfdata.bella.network/lookup/" . $sasl[$k]['real_rip']);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_USERAGENT, 'Moocow');
curl_setopt($curl, CURLOPT_TIMEOUT, 5);
$ip_data = curl_exec($curl); $ip_data = curl_exec($curl);
if (!curl_errno($curl)) { if (!curl_errno($curl)) {
$ip_data_array = json_decode($ip_data, true); $ip_data_array = json_decode($ip_data, true);
if ($ip_data_array !== false and !empty($ip_data_array['location']['shortcountry'])) { if ($ip_data_array !== false and !empty($ip_data_array['location']['country'])) {
$sasl[$k]['location'] = $ip_data_array['location']['shortcountry']; $sasl[$k]['location'] = implode(', ', array_filter(array($ip_data_array['location']['country'], $ip_data_array['location']['city'])));
try { try {
$redis->hSet('IP_LOCATIONS', $sasl[$k]['real_rip'], $sasl[$k]['location']); $redis->hSet('IP_LOCATIONS', $sasl[$k]['real_rip'], $sasl[$k]['location']);
} }

View File

@ -78,7 +78,7 @@ jQuery(function($){
} }
}) })
function last_logins(action, lines = 5) { function last_logins(action, lines = 10) {
if (action == 'get') { if (action == 'get') {
$.ajax({ $.ajax({
dataType: 'json', dataType: 'json',
@ -99,28 +99,11 @@ jQuery(function($){
$.each(data.sasl, function (i, item) { $.each(data.sasl, function (i, item) {
var datetime = new Date(item.datetime.replace(/-/g, "/")); var datetime = new Date(item.datetime.replace(/-/g, "/"));
var local_datetime = datetime.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"}); var local_datetime = datetime.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
if (item.location) { item.app_password?app_password=', <a href="/edit/app-passwd/'+item.app_password+'">via App</a>':app_password="",item.location?ip_location=", "+item.location:ip_location="";
ip_location = '<span class="lang-sm ip-location-flag" lang="' + item.location + '"></span>'; "smtp"==item.service?service='<div class="label label-default">'+item.service.toUpperCase()+'<i class="bi bi-chevron-compact-right"></i></div>':"imap"==item.service?service='<div class="label label-default"><i class="bi bi-chevron-compact-left"></i> '+item.service.toUpperCase()+"</div>":service='<div class="label label-default">'+item.service.toUpperCase()+"</div>";
} else { item.real_rip.startsWith("Web")?real_rip=item.real_rip:real_rip='<a href="https://bgp.he.net/ip/'+item.real_rip+'" target="_blank">'+item.real_rip+"</a>";
ip_location = ''; ip_data = real_rip + ip_location + app_password;
} $(".last-login").append('<li class="list-group-item">'+local_datetime+" "+service+" "+lang.from+" "+ip_data+"</li>");
if (item.service == "smtp") {
service = '<div class="label label-default">' + item.service.toUpperCase() + '<i class="bi bi-chevron-compact-right"></i></div>';
} else if (item.service == "imap") {
service = '<div class="label label-default"><i class="bi bi-chevron-compact-left"></i> ' + item.service.toUpperCase() + '</div>';
} else {
service = '<div class="label label-default">' + item.service.toUpperCase() + '</div>';
}
if (item.real_rip.startsWith("Web")) {
real_rip = item.real_rip;
} else {
real_rip = '<a href="https://bgp.he.net/ip/' + item.real_rip + '" target="_blank">' + item.real_rip + '</a> ';
}
real_rip = real_rip + ' ' + ip_location;
$('.last-login').append('<li class="list-group-item">' +
local_datetime + ' ' + service + ' ' + lang.from + ' ' +
real_rip +
'</li>');
}) })
$('.last-login').append('</ul>'); $('.last-login').append('</ul>');
} }

View File

@ -176,7 +176,7 @@ elseif (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == '
<p><a href="#userFilterModal" data-toggle="modal">[<?=$lang['user']['show_sieve_filters'];?>]</a></p> <p><a href="#userFilterModal" data-toggle="modal">[<?=$lang['user']['show_sieve_filters'];?>]</a></p>
<hr> <hr>
<h4><?=$lang['user']['recent_successful_connections'];?></h4> <h4><?=$lang['user']['recent_successful_connections'];?></h4>
<div class="last-login"></div> <div class="last-login"><i class="bi bi-hourglass"></i> <?=$lang['user']['waiting'];?></div>
<div class="clear-last-logins"><?=$lang['user']['clear_recent_successful_connections'];?></div> <div class="clear-last-logins"><?=$lang['user']['clear_recent_successful_connections'];?></div>
</div> </div>
</div> </div>