Add a more detailed failed login message and fix CIDR login loop (#7461)
* Add a more detailed failed login message and fix CIDR login loop * Use a column for login failure detail * Add translations * Fix accidental overwrite of database write result message * Remove test data for CIDR
This commit is contained in:
@@ -59,6 +59,9 @@ class authentication {
|
|||||||
//set default return array as null
|
//set default return array as null
|
||||||
$result = null;
|
$result = null;
|
||||||
|
|
||||||
|
//use a login message when a login attempt fails
|
||||||
|
$failed_login_message = null;
|
||||||
|
|
||||||
//get the domain_name and domain_uuid
|
//get the domain_name and domain_uuid
|
||||||
if (!isset($this->domain_name) || !isset($this->domain_uuid)) {
|
if (!isset($this->domain_name) || !isset($this->domain_uuid)) {
|
||||||
$this->get_domain();
|
$this->get_domain();
|
||||||
@@ -170,13 +173,16 @@ class authentication {
|
|||||||
|
|
||||||
//set authorized to false if any authentication method failed
|
//set authorized to false if any authentication method failed
|
||||||
$authorized = false;
|
$authorized = false;
|
||||||
|
$plugin_name = '';
|
||||||
if (is_array($_SESSION['authentication']['plugin'])) {
|
if (is_array($_SESSION['authentication']['plugin'])) {
|
||||||
foreach($_SESSION['authentication']['plugin'] as $row) {
|
foreach($_SESSION['authentication']['plugin'] as $row) {
|
||||||
|
$plugin_name = $row['plugin'];
|
||||||
if ($row["authorized"]) {
|
if ($row["authorized"]) {
|
||||||
$authorized = true;
|
$authorized = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$authorized = false;
|
$authorized = false;
|
||||||
|
$failed_login_message = "Authentication plugin '$plugin_name' blocked login attempt";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -193,6 +199,8 @@ class authentication {
|
|||||||
} else {
|
} else {
|
||||||
//user failed the cidr check - no longer authorized
|
//user failed the cidr check - no longer authorized
|
||||||
$authorized = false;
|
$authorized = false;
|
||||||
|
$failed_login_message = "CIDR blocked login attempt";
|
||||||
|
$_SESSION['authentication']['plugin'][$name]['authorized'] = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -200,8 +208,7 @@ class authentication {
|
|||||||
$_SESSION['authorized'] = $authorized;
|
$_SESSION['authorized'] = $authorized;
|
||||||
|
|
||||||
//log the attempt
|
//log the attempt
|
||||||
$plugin_classname = substr($class_name, 7);
|
user_logs::add($_SESSION['authentication']['plugin'][$name], $failed_login_message);
|
||||||
user_logs::add($_SESSION['authentication']['plugin'][$plugin_classname]);
|
|
||||||
|
|
||||||
//return the result
|
//return the result
|
||||||
return $result ?? false;
|
return $result ?? false;
|
||||||
@@ -313,6 +320,9 @@ class authentication {
|
|||||||
require_once $project_root . '/app/domains/resources/domains.php';
|
require_once $project_root . '/app/domains/resources/domains.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//initialize the parameters array
|
||||||
|
$parameters = [];
|
||||||
|
|
||||||
//get the user settings
|
//get the user settings
|
||||||
$sql = "select * from v_user_settings ";
|
$sql = "select * from v_user_settings ";
|
||||||
$sql .= "where domain_uuid = :domain_uuid ";
|
$sql .= "where domain_uuid = :domain_uuid ";
|
||||||
@@ -321,7 +331,6 @@ class authentication {
|
|||||||
$parameters['domain_uuid'] = $result["domain_uuid"];
|
$parameters['domain_uuid'] = $result["domain_uuid"];
|
||||||
$parameters['user_uuid'] = $result["user_uuid"];
|
$parameters['user_uuid'] = $result["user_uuid"];
|
||||||
$user_settings = $database->select($sql, $parameters, 'all');
|
$user_settings = $database->select($sql, $parameters, 'all');
|
||||||
unset($sql, $parameters);
|
|
||||||
|
|
||||||
//store user settings in the session when available
|
//store user settings in the session when available
|
||||||
if (is_array($user_settings)) {
|
if (is_array($user_settings)) {
|
||||||
|
|||||||
@@ -73,6 +73,11 @@
|
|||||||
$apps[$x]['db'][$y]['fields'][$z]['search_by'] = 'true';
|
$apps[$x]['db'][$y]['fields'][$z]['search_by'] = 'true';
|
||||||
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = 'Enter the result.';
|
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = 'Enter the result.';
|
||||||
$z++;
|
$z++;
|
||||||
|
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'detail';
|
||||||
|
$apps[$x]['db'][$y]['fields'][$z]['type'] = 'text';
|
||||||
|
$apps[$x]['db'][$y]['fields'][$z]['search_by'] = '';
|
||||||
|
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = 'Details about the result.';
|
||||||
|
$z++;
|
||||||
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'remote_address';
|
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'remote_address';
|
||||||
$apps[$x]['db'][$y]['fields'][$z]['type'] = 'text';
|
$apps[$x]['db'][$y]['fields'][$z]['type'] = 'text';
|
||||||
$apps[$x]['db'][$y]['fields'][$z]['search_by'] = 'true';
|
$apps[$x]['db'][$y]['fields'][$z]['search_by'] = 'true';
|
||||||
|
|||||||
@@ -538,6 +538,33 @@ $text['label-location']['zh-cn'] = "地点";
|
|||||||
$text['label-location']['ja-jp'] = "位置";
|
$text['label-location']['ja-jp'] = "位置";
|
||||||
$text['label-location']['ko-kr'] = "위치";
|
$text['label-location']['ko-kr'] = "위치";
|
||||||
|
|
||||||
|
$text['label-detail']['en-us'] = "Detail";
|
||||||
|
$text['label-detail']['en-gb'] = "Detail";
|
||||||
|
$text['label-detail']['ar-eg'] = "تفصيل";
|
||||||
|
$text['label-detail']['de-at'] = "Detail";
|
||||||
|
$text['label-detail']['de-ch'] = "Detail";
|
||||||
|
$text['label-detail']['de-de'] = "Detail";
|
||||||
|
$text['label-detail']['el-gr'] = "Λεπτομέρεια";
|
||||||
|
$text['label-detail']['es-cl'] = "Detalle";
|
||||||
|
$text['label-detail']['es-mx'] = "Detalle";
|
||||||
|
$text['label-detail']['fr-ca'] = "Détail";
|
||||||
|
$text['label-detail']['fr-fr'] = "Détail";
|
||||||
|
$text['label-detail']['he-il'] = "פרט";
|
||||||
|
$text['label-detail']['it-it'] = "Dettaglio";
|
||||||
|
$text['label-detail']['ka-ge'] = "დეტალი";
|
||||||
|
$text['label-detail']['nl-nl'] = "Detail";
|
||||||
|
$text['label-detail']['pl-pl'] = "Szczegół";
|
||||||
|
$text['label-detail']['pt-br'] = "Detalhe";
|
||||||
|
$text['label-detail']['pt-pt'] = "Detalhe";
|
||||||
|
$text['label-detail']['ro-ro'] = "Detaliu";
|
||||||
|
$text['label-detail']['ru-ru'] = "Деталь";
|
||||||
|
$text['label-detail']['sv-se'] = "Detalj";
|
||||||
|
$text['label-detail']['uk-ua'] = "Деталь";
|
||||||
|
$text['label-detail']['tr-tr'] = "Detay";
|
||||||
|
$text['label-detail']['zh-cn'] = "细节";
|
||||||
|
$text['label-detail']['ja-jp'] = "詳細";
|
||||||
|
$text['label-detail']['ko-kr'] = "세부";
|
||||||
|
|
||||||
$text['description-location']['en-us'] = "Enter the location.";
|
$text['description-location']['en-us'] = "Enter the location.";
|
||||||
$text['description-location']['en-gb'] = "Enter the location.";
|
$text['description-location']['en-gb'] = "Enter the location.";
|
||||||
$text['description-location']['ar-eg'] = "أدخل الموقع.";
|
$text['description-location']['ar-eg'] = "أدخل الموقع.";
|
||||||
|
|||||||
@@ -57,7 +57,7 @@
|
|||||||
/**
|
/**
|
||||||
* add user_logs
|
* add user_logs
|
||||||
*/
|
*/
|
||||||
public static function add($result) {
|
public static function add($result, $details = '') {
|
||||||
|
|
||||||
//prepare the array
|
//prepare the array
|
||||||
$array = [];
|
$array = [];
|
||||||
@@ -76,6 +76,7 @@
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$array['user_logs'][0]["result"] = 'failure';
|
$array['user_logs'][0]["result"] = 'failure';
|
||||||
|
$array['user_logs'][0]["detail"] = $details;
|
||||||
}
|
}
|
||||||
|
|
||||||
//add the dialplan permission
|
//add the dialplan permission
|
||||||
|
|||||||
@@ -39,6 +39,21 @@
|
|||||||
$language = new text;
|
$language = new text;
|
||||||
$text = $language->get();
|
$text = $language->get();
|
||||||
|
|
||||||
|
//set config object
|
||||||
|
global $config;
|
||||||
|
if (!($confing instanceof config)) {
|
||||||
|
$config = config::load();
|
||||||
|
}
|
||||||
|
|
||||||
|
//set database object
|
||||||
|
global $database;
|
||||||
|
if (!($database instanceof database)) {
|
||||||
|
$database = database::new(['config' => $config]);
|
||||||
|
}
|
||||||
|
//check for the new column
|
||||||
|
$table_prefix = database::TABLE_PREFIX;
|
||||||
|
$has_column_detail = $database->column_exists("{$table_prefix}user_logs", 'detail');
|
||||||
|
|
||||||
//get the http post data
|
//get the http post data
|
||||||
if (!empty($_POST['user_logs']) && is_array($_POST['user_logs'])) {
|
if (!empty($_POST['user_logs']) && is_array($_POST['user_logs'])) {
|
||||||
$action = $_POST['action'];
|
$action = $_POST['action'];
|
||||||
@@ -67,7 +82,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
//prepare the database object
|
//prepare the database object
|
||||||
$database = new database;
|
|
||||||
$database->app_name = 'user_logs';
|
$database->app_name = 'user_logs';
|
||||||
$database->app_uuid = '582a13cf-7d75-4ea3-b2d9-60914352d76e';
|
$database->app_uuid = '582a13cf-7d75-4ea3-b2d9-60914352d76e';
|
||||||
|
|
||||||
@@ -125,7 +139,6 @@
|
|||||||
$sql .= ") ";
|
$sql .= ") ";
|
||||||
$parameters['search'] = '%'.$search.'%';
|
$parameters['search'] = '%'.$search.'%';
|
||||||
}
|
}
|
||||||
$database = new database;
|
|
||||||
$num_rows = $database->select($sql, $parameters ?? null, 'column');
|
$num_rows = $database->select($sql, $parameters ?? null, 'column');
|
||||||
unset($sql, $parameters);
|
unset($sql, $parameters);
|
||||||
|
|
||||||
@@ -139,12 +152,7 @@
|
|||||||
$offset = $rows_per_page * $page;
|
$offset = $rows_per_page * $page;
|
||||||
|
|
||||||
//set the time zone
|
//set the time zone
|
||||||
if (isset($_SESSION['domain']['time_zone']['name'])) {
|
$time_zone = $settings->get('domain', 'time_zone', date_default_timezone_get());
|
||||||
$time_zone = $_SESSION['domain']['time_zone']['name'];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$time_zone = date_default_timezone_get();
|
|
||||||
}
|
|
||||||
$parameters['time_zone'] = $time_zone;
|
$parameters['time_zone'] = $time_zone;
|
||||||
|
|
||||||
//get the list
|
//get the list
|
||||||
@@ -161,6 +169,9 @@
|
|||||||
$sql .= "result, ";
|
$sql .= "result, ";
|
||||||
$sql .= "remote_address, ";
|
$sql .= "remote_address, ";
|
||||||
$sql .= "user_agent, ";
|
$sql .= "user_agent, ";
|
||||||
|
if ($has_column_detail) {
|
||||||
|
$sql .= "detail, ";
|
||||||
|
}
|
||||||
$sql .= "session_id ";
|
$sql .= "session_id ";
|
||||||
$sql .= "from v_user_logs as u, v_domains as d ";
|
$sql .= "from v_user_logs as u, v_domains as d ";
|
||||||
if (permission_exists('user_log_all') && $show == 'all') {
|
if (permission_exists('user_log_all') && $show == 'all') {
|
||||||
@@ -183,7 +194,6 @@
|
|||||||
$sql .= "and u.domain_uuid = d.domain_uuid ";
|
$sql .= "and u.domain_uuid = d.domain_uuid ";
|
||||||
$sql .= order_by($order_by, $order, 'timestamp', 'desc');
|
$sql .= order_by($order_by, $order, 'timestamp', 'desc');
|
||||||
$sql .= limit_offset($rows_per_page, $offset);
|
$sql .= limit_offset($rows_per_page, $offset);
|
||||||
$database = new database;
|
|
||||||
$user_logs = $database->select($sql, $parameters ?? null, 'all');
|
$user_logs = $database->select($sql, $parameters ?? null, 'all');
|
||||||
unset($sql, $parameters);
|
unset($sql, $parameters);
|
||||||
|
|
||||||
@@ -250,6 +260,9 @@
|
|||||||
echo th_order_by('username', $text['label-username'], $order_by, $order);
|
echo th_order_by('username', $text['label-username'], $order_by, $order);
|
||||||
echo th_order_by('type', $text['label-type'], $order_by, $order);
|
echo th_order_by('type', $text['label-type'], $order_by, $order);
|
||||||
echo th_order_by('result', $text['label-result'], $order_by, $order);
|
echo th_order_by('result', $text['label-result'], $order_by, $order);
|
||||||
|
if ($has_column_detail) {
|
||||||
|
echo th_order_by('detail', $text['label-detail'], $order_by, $order);
|
||||||
|
}
|
||||||
echo th_order_by('remote_address', $text['label-remote_address'], $order_by, $order);
|
echo th_order_by('remote_address', $text['label-remote_address'], $order_by, $order);
|
||||||
echo th_order_by('user_agent', $text['label-user_agent'], $order_by, $order);
|
echo th_order_by('user_agent', $text['label-user_agent'], $order_by, $order);
|
||||||
echo "</tr>\n";
|
echo "</tr>\n";
|
||||||
@@ -283,6 +296,9 @@
|
|||||||
echo " <td>".escape($row['username'])."</td>\n";
|
echo " <td>".escape($row['username'])."</td>\n";
|
||||||
echo " <td>".escape($row['type'])."</td>\n";
|
echo " <td>".escape($row['type'])."</td>\n";
|
||||||
echo " <td>".escape($row['result'])."</td>\n";
|
echo " <td>".escape($row['result'])."</td>\n";
|
||||||
|
if ($has_column_detail) {
|
||||||
|
echo " <td>".escape($row['detail'])."</td>\n";
|
||||||
|
}
|
||||||
echo " <td>".escape($row['remote_address'])."</td>\n";
|
echo " <td>".escape($row['remote_address'])."</td>\n";
|
||||||
echo " <td>".escape($row['user_agent'])."</td>\n";
|
echo " <td>".escape($row['user_agent'])."</td>\n";
|
||||||
echo "</tr>\n";
|
echo "</tr>\n";
|
||||||
|
|||||||
Reference in New Issue
Block a user