From 08d666985f237e1aee80a42ff4478767e36a7f66 Mon Sep 17 00:00:00 2001
From: andryyy <andre.peters@debinux.de>
Date: Sun, 6 Jun 2021 21:00:48 +0200
Subject: [PATCH] [Web] Improve last logins, switch to country name
 (workaround, fix in progress)

---
 data/web/inc/functions.inc.php | 11 +++++++----
 data/web/js/site/user.js       | 29 ++++++-----------------------
 data/web/user.php              |  2 +-
 3 files changed, 14 insertions(+), 28 deletions(-)

diff --git a/data/web/inc/functions.inc.php b/data/web/inc/functions.inc.php
index 8a605b03..45be1dd8 100644
--- a/data/web/inc/functions.inc.php
+++ b/data/web/inc/functions.inc.php
@@ -258,10 +258,11 @@ function last_login($action, $username, $sasl_limit = 10) {
   switch ($action) {
     case 'get':
       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
             AND `success` = 1
-              GROUP BY `real_rip`, `service`
+              GROUP BY `real_rip`, `service`, `app_password`
               ORDER BY `datetime` DESC
               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_setopt($curl, CURLOPT_URL,"https://dfdata.bella.network/lookup/" . $sasl[$k]['real_rip']);
               curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
+              curl_setopt($curl, CURLOPT_USERAGENT, 'Moocow');
+              curl_setopt($curl, CURLOPT_TIMEOUT, 5);
               $ip_data = curl_exec($curl);
               if (!curl_errno($curl)) {
                 $ip_data_array = json_decode($ip_data, true);
-                if ($ip_data_array !== false and !empty($ip_data_array['location']['shortcountry'])) {
-                  $sasl[$k]['location'] = $ip_data_array['location']['shortcountry'];
+                if ($ip_data_array !== false and !empty($ip_data_array['location']['country'])) {
+                  $sasl[$k]['location'] = implode(', ', array_filter(array($ip_data_array['location']['country'], $ip_data_array['location']['city'])));
                     try {
                       $redis->hSet('IP_LOCATIONS', $sasl[$k]['real_rip'], $sasl[$k]['location']);
                     }
diff --git a/data/web/js/site/user.js b/data/web/js/site/user.js
index 1a28c468..65728c85 100644
--- a/data/web/js/site/user.js
+++ b/data/web/js/site/user.js
@@ -78,7 +78,7 @@ jQuery(function($){
     }
   })
 
-  function last_logins(action, lines = 5) {
+  function last_logins(action, lines = 10) {
     if (action == 'get') {
       $.ajax({
         dataType: 'json',
@@ -99,28 +99,11 @@ jQuery(function($){
             $.each(data.sasl, function (i, item) {
               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"});
-              if (item.location) {
-                ip_location = '<span class="lang-sm ip-location-flag" lang="' + item.location + '"></span>';
-              } else {
-                ip_location = '';
-              }
-              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>');
+              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="";
+              "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>";
+              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_data = real_rip + ip_location + app_password;
+              $(".last-login").append('<li class="list-group-item">'+local_datetime+" "+service+" "+lang.from+" "+ip_data+"</li>");
             })
             $('.last-login').append('</ul>');
           }
diff --git a/data/web/user.php b/data/web/user.php
index 3f829e33..fa11d718 100644
--- a/data/web/user.php
+++ b/data/web/user.php
@@ -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>
             <hr>
             <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>
         </div>