Przeglądaj źródła

move auth record rules from table User_list to table auth_rules
bugfix: fix parse date

rajven 5 lat temu
rodzic
commit
f53a1c65da

+ 2 - 5
docs/mysql/stat_table_User_list.sql

@@ -18,14 +18,11 @@ CREATE TABLE `User_list` (
   `queue_id` int(11) NOT NULL DEFAULT 0,
   `day_quota` int(11) NOT NULL DEFAULT 0,
   `month_quota` int(11) NOT NULL DEFAULT 0,
-  `default_subnet` varchar(20) DEFAULT NULL,
-  `hostname_rule` varchar(70) DEFAULT NULL,
-  `mac_rule` varchar(70) DEFAULT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 --
 -- Дамп данных таблицы `User_list`
 --
 
-INSERT INTO `User_list` (`id`, `login`, `fio`, `enabled`, `blocked`, `deleted`, `ou_id`, `filter_group_id`, `queue_id`, `day_quota`, `month_quota`, `default_subnet`, `hostname_rule`, `mac_rule`) VALUES
-(1, 'default', '', 0, 0, 0, 3, 2, 0, 0, 0, NULL, NULL, NULL);
+INSERT INTO `User_list` (`id`, `login`, `fio`, `enabled`, `blocked`, `deleted`, `ou_id`, `filter_group_id`, `queue_id`, `day_quota`, `month_quota`) VALUES
+(1, 'default', '', 0, 0, 0, 3, 2, 0, 0, 0);

+ 2 - 0
docs/mysql/stat_table_auth_rules.sql

@@ -0,0 +1,2 @@
+CREATE TABLE `auth_rules` ( `id` INT NOT NULL AUTO_INCREMENT , `user_id` INT NOT NULL , `type` INT NOT NULL , `rule` VARCHAR(40) NULL DEFAULT NULL , PRIMARY KEY (`id`), INDEX (`user_id`)) ENGINE = InnoDB;
+ALTER TABLE `auth_rules` ADD UNIQUE(`rule`);

+ 93 - 0
html/admin/users/edit_rules.php

@@ -0,0 +1,93 @@
+<?php
+
+require_once ($_SERVER['DOCUMENT_ROOT']."/inc/auth.php");
+require_once ($_SERVER['DOCUMENT_ROOT']."/inc/languages/" . $language . ".php");
+require_once ($_SERVER['DOCUMENT_ROOT']."/inc/idfilter.php");
+
+global $default_user_id;
+global $hotspot_user_id;
+
+$msg_error = "";
+
+$sSQL = "SELECT * FROM User_list WHERE id=$id";
+$auth_info = get_record_sql($db_link, $sSQL);
+
+if (isset($_POST["s_remove"])) {
+    $s_id = $_POST["s_id"];
+    foreach ($s_id as $key => $val) {
+        if (isset($val)) {
+            LOG_INFO($db_link, "Remove rule id: $val");
+            delete_record($db_link, "auth_rules", "id=" . $val);
+        }
+    }
+    header("Location: " . $_SERVER["REQUEST_URI"]);
+}
+
+if (isset($_POST['s_save'])) {
+    $len = is_array($_POST['s_save']) ? count($_POST['s_save']) : 0;
+    for ($i = 0; $i < $len; $i ++) {
+        $save_id = intval($_POST['s_save'][$i]);
+        $len_all = is_array($_POST['n_id']) ? count($_POST['n_id']) : 0;
+        for ($j = 0; $j < $len_all; $j ++) {
+            if (intval($_POST['n_id'][$j]) != $save_id) { continue; }
+            $new['type'] = $_POST['s_type'][$j];
+            $new['rule'] = trim($_POST['s_rule'][$j]);
+            update_record($db_link, "auth_rules", "id='{$save_id}'", $new);
+        }
+    }
+    header("Location: " . $_SERVER["REQUEST_URI"]);
+}
+
+if (isset($_POST["s_create"])) {
+    $new_rule = $_POST["s_new_rule"];
+    if (isset($new_rule)) {
+        $new['type'] = $_POST["s_new_type"];
+        $new['rule'] = $new_rule;
+        $new['user_id'] = $id;
+        LOG_INFO($db_link, "Create new rule $new_rule");
+        insert_record($db_link, "auth_rules", $new);
+    }
+    header("Location: " . $_SERVER["REQUEST_URI"]);
+}
+
+unset($_POST);
+
+require_once ($_SERVER['DOCUMENT_ROOT']."/inc/header.php");
+
+?>
+<div id="cont">
+<br>
+<form name="def" action="edit_rules.php" method="post">
+<b>Правила автоназначения адресов в <?php print_url($auth_info['login'],"/admin/users/edituser.php?id=$id"); ?></b>
+<br>
+Порядок применения: hotspot => subnet => mac => hostname => default user
+<br><br>
+<table class="data">
+<tr align="center">
+	<td></td>
+	<td width=30><b>id</b></td>
+	<td><b>Тип</b></td>
+	<td><b>Правило</b></td>
+	<td><input type="submit" name="s_remove" value="Удалить"></td>
+</tr>
+<?
+$t_auth_rules = get_records($db_link,'auth_rules',"user_id=$id ORDER BY id");
+foreach ( $t_auth_rules as $row ) {
+    print "<tr align=center>\n";
+    print "<td class=\"data\" style='padding:0'><input type=checkbox name=s_id[] value='{$row['id']}'></td>\n";
+    print "<td class=\"data\"><input type=\"hidden\" name='n_id[]' value='{$row['id']}'>{$row['id']}</td>\n";
+    print "<td class=\"data\">"; print_qa_rule_select("s_type[]","{$row['type']}"); print "</td>\n";
+    print "<td class=\"data\"><input type=\"text\" name='s_rule[]' value='{$row['rule']}'></td>\n";
+    print "<td class=\"data\"><button name='s_save[]' value='{$row['id']}'>Сохранить</button></td>\n";
+    print "</tr>\n";
+}
+?>
+<tr>
+<td colspan=6>Новое правило :<?php print_qa_rule_select("s_new_type","1");  print "<input type=\"text\" name='s_new_rule' value=''>"; ?></td>
+<td><input type="submit" name="s_create" value="Добавить"></td>
+</tr>
+</table>
+</form>
+<?php
+require_once ($_SERVER['DOCUMENT_ROOT']."/inc/footer.php");
+?>

+ 3 - 2
html/admin/users/editauth.php

@@ -232,11 +232,12 @@ print "<b> Адрес доступа пользователя <a href=/admin/use
 <td colspan=2><input type="submit" name="moveauth" value=<?php print $btn_move; ?>><?php print_login_select($db_link, 'new_parent', $auth_info['user_id']); ?></td>
 <td><a href=/admin/logs/authlog.php?auth_id=<?php print $id; ?>>Лог</a></td>
 <?php
+print "<td>"; print_url("Трафик за день","/admin/reports/authday.php?id=$id"); print "</td>";
 if ($auth_info['deleted']) {
-    print "<td colspan=2>Deleted: " . $auth_info['changed_time']."</td>";
+    print "<td colspan=1>Deleted: " . $auth_info['changed_time']."</td>";
     print "<td colspan=2 align=right><input type=\"submit\" name=\"recovery\" value=\"Восстановить\"></td>";
 } else {
-    print "<td colspan=2></td>";
+    print "<td colspan=1></td>";
     print "<td colspan=2 align=right><input type=\"submit\" name=\"editauth\" value=\"$btn_save\"></td>";
 }
 ?>

+ 20 - 24
html/admin/users/edituser.php

@@ -15,13 +15,8 @@ if (isset($_POST["edituser"])) {
     unset($new);
     unset($auth);
     $new["ou_id"] = $_POST["f_ou"] * 1;
-    $new["default_subnet"] = trim($_POST["f_subnet"]);
-    $new["hostname_rule"] = trim($_POST["f_hostname_rule"]);
-    $new["mac_rule"] = trim($_POST["f_mac_rule"]);
     $new["filter_group_id"] = $_POST["f_filter"]*1;
     $new["queue_id"] = $_POST["f_queue"]*1;
-    $range = cidrToRange($new["default_subnet"]);
-    if (ip2long($range[0]) == 0 or ip2long($range[1]) == 0 or ip2long($range[0]) == ip2long($range[1])) { $new["default_subnet"] = ''; }
     if ($default_user_id == $id or $hotspot_user_id == $id) {
         $new["enabled"] = 0;
         $new["blocked"] = 0;
@@ -183,43 +178,44 @@ if ($msg_error) {
 <input type="hidden" name="id" value=<? echo $id; ?>>
 <table class="data">
 <tr>
-<td><?php print $cell_login; ?></td>
-<td><?php print $cell_fio; ?></td>
-<td><?php print $cell_ou; ?></td>
-<td><?php print $cell_enabled; ?></td>
+<td colspan=2><?php print $cell_login; ?></td>
+<td colspan=2><?php print $cell_fio; ?></td>
+<td colspan=2><?php print $cell_ou; ?></td>
 </tr>
 <tr>
-<td><input type="text" name="f_login" value="<?php print $user_info["login"]; ?>" size=25></td>
-<td><input type="text" name="f_fio" value="<?php print $user_info["fio"]; ?>" size=25></td>
-<td><?php print_ou_select($db_link, 'f_ou', $user_info["ou_id"]); ?></td>
-<td><?php print_qa_select('f_enabled', $user_info["enabled"]); ?></td>
+<td colspan=2><input type="text" name="f_login" value="<?php print $user_info["login"]; ?>" size=25></td>
+<td colspan=2><input type="text" name="f_fio" value="<?php print $user_info["fio"]; ?>" size=25></td>
+<td colspan=2><?php print_ou_select($db_link, 'f_ou', $user_info["ou_id"]); ?></td>
 </tr>
 <tr>
 <td>Фильтр</td>
 <td>Шейпер</td>
+<td><?php print $cell_enabled; ?></td>
 <td><?php print $cell_perday; ?></td>
 <td><?php print $cell_permonth; ?></td>
+<td><?php print $cell_blocked; ?></td>
 </tr>
 <tr>
 <td><?php print_group_select($db_link, 'f_filter', $user_info["filter_group_id"]); ?></td>
 <td><?php print_queue_select($db_link, 'f_queue', $user_info["queue_id"]); ?></td>
+<td><?php print_qa_select('f_enabled', $user_info["enabled"]); ?></td>
 <td><input type="text" name="f_perday" value="<? echo $user_info["day_quota"]; ?>" size=5></td>
 <td><input type="text" name="f_permonth" value="<? echo $user_info["month_quota"]; ?>" size=5></td>
+<td><?php print_qa_select('f_blocked', $user_info["blocked"]); ?></td>
 </tr>
 <tr>
-<td>IP rule</td>
-<td>Dhcp Hostname rule</td>
-<td>Mac rule</td>
-<td><?php print $cell_blocked; ?></td>
-<tr>
-<td><input type="text" name="f_subnet" value="<?php print $user_info["default_subnet"]; ?>" size=20></td>
-<td><input type="text" name="f_hostname_rule" value="<?php print $user_info["hostname_rule"]; ?>" size=20></td>
-<td><input type="text" name="f_mac_rule" value="<?php print $user_info["mac_rule"]; ?>" size=20></td>
-<td><?php print_qa_select('f_blocked', $user_info["blocked"]); ?></td>
+<?php
+print "<td>"; print_url("Список правил","/admin/users/edit_rules.php?id=$id"); print "</td>";
+$rule_count = get_count_records($db_link,"auth_rules","user_id=".$id);
+if ($rule_count>0) { print "<td colspan=3> Count: ".$rule_count."</td>"; } else { print "<td colspan=3></td>"; }
+?>
+<td colspan=2>Created: <?php print $user_info["timestamp"]; ?></td><td></td>
 </tr>
 <tr>
-<td><input value="Трафик за день" type="button"	onclick="location.href='/admin/reports/userday.php?id=<? echo $id?>'"></td>
-<td colspan=2>Created: <?php print $user_info["timestamp"]; ?></td>
+<?php
+print "<td colspan=2>"; print_url("Трафик за день","/admin/reports/userday.php?id=$id"); print "</td>";
+?>
+<td colspan=3></td>
 <td><input type="submit" name="edituser" value=<?php print $btn_save; ?>></td>
 </tr>
 </table>

+ 3 - 2
html/admin/users/index.php

@@ -132,7 +132,7 @@ if ($page<1) { $page=1; }
 $start = ($page * $displayed) - $displayed;
 print_navigation($page_url,$page,$displayed,$count_records[0],$total);
 
-$sSQL = "SELECT U.id, U.login, U.fio, O.ou_name, U.enabled, U.day_quota, U.month_quota, U.blocked, U.default_subnet as rule FROM User_list U, OU O WHERE $filter ORDER BY $sort_table.$sort_field $order LIMIT $start,$displayed";
+$sSQL = "SELECT U.id, U.login, U.fio, O.ou_name, U.enabled, U.day_quota, U.month_quota, U.blocked FROM User_list U, OU O WHERE $filter ORDER BY $sort_table.$sort_field $order LIMIT $start,$displayed";
 
 ?>
 
@@ -169,7 +169,8 @@ foreach ($users as $row) {
     print "<td class=\"$cl\" ><input type=hidden name=\"id\" value=".$row['id'].">".$row['id']."</td>\n";
     print "<td class=\"$cl\" align=left><a href=edituser.php?id=".$row['id'].">" . $row['login'] . "</a></td>\n";
     print "<td class=\"$cl\">".$row['fio']."</td>\n";
-    print "<td class=\"$cl\">".$row['rule']."</td>\n";
+    $rules_count = get_count_records($db_link,"auth_rules","user_id=".$row['id']);
+    print "<td class=\"$cl\">".$rules_count."</td>\n";
     print "<td class=\"$cl\">".$row['ou_name']."</td>\n";
     print "<td class=\"$cl\">".get_qa($row['enabled']) . "</td>\n";
     print "<td class=\"$cl\">".$row['day_quota']."</td>\n";

+ 22 - 20
html/inc/common.php

@@ -669,6 +669,15 @@ function print_qa_l3int_select($qa_name, $qa_value)
     print "</select>\n";
 }
 
+function print_qa_rule_select($qa_name, $qa_value)
+{
+    print "<select name=\"$qa_name\">\n";
+    print_select_item('Subnet',1,$qa_value);
+    print_select_item('Mac',2,$qa_value);
+    print_select_item('Hostname',3,$qa_value);
+    print "</select>\n";
+}
+
 function print_qa_select($qa_name, $qa_value)
 {
     print "<select name=\"$qa_name\">\n";
@@ -1111,7 +1120,7 @@ return $result;
 function GetDateTimeFromString($date_str) {
 if (!is_a($date_str,'DateTime')) {
     $date_str = urldecode($date_str);
-//    $date_str = preg_replace('/(\'|\")/','',$date_str);
+    $date_str = preg_replace('/(\'|\")/','',$date_str);
     $date1 = DateTime::createFromFormat('Y-m-d H:i:s',$date_str);
     if (!$date1) { $date1 = DateTime::createFromFormat('Y.m.d H:i:s',$date_str); }
     if (!$date1) { $date1 = DateTime::createFromFormat('Y/m/d H:i:s',$date_str); }
@@ -1339,15 +1348,6 @@ function resurrection_auth($db, $ip, $mac, $action, $dhcp_hostname)
     return $resurrection_id;
 }
 
-function get_user_by_subnet_rules ($db,$ip) {
-$d_sql = "SELECT id, default_subnet FROM User_list WHERE default_subnet IS NOT NULL";
-$t_users = mysqli_query($db, $d_sql);
-while (list ($f_id, $f_rule) = mysqli_fetch_array($t_users)) {
-    if (is_subnet_aton($f_rule,ip2long($ip))) { return $f_id; }
-    }
-return 0;
-}
-
 function get_auth($db, $current_auth)
 {
     if (! isset($current_auth)) {
@@ -3051,21 +3051,23 @@ function get_new_user_id($db, $ip, $mac)
 {
     global $hotspot_user_id;
     global $default_user_id;
-    if (is_hotspot($db, $ip)) { return $hotspot_user_id; }
-    $ip_aton = ip2long($ip);
-    $t_rules = mysqli_query($db, "SELECT id,default_subnet FROM User_list WHERE deleted=0 and LENGTH(default_subnet)>0");
-    while (list ($f_id, $f_net) = mysqli_fetch_array($t_rules)) {
-        $range = cidrToRange($f_net);
-        if ($ip_aton >= ip2long($range[0]) and $ip_aton <= ip2long($range[1])) {
-            return $f_id;
+    //ip
+    if (!empty($ip)) {
+        if (is_hotspot($db, $ip)) { return $hotspot_user_id; }
+        $ip_aton = ip2long($ip);
+        $t_rules = get_records_sql($db, "SELECT * FROM auth_rules WHERE type=1 and LENGTH(rule)>0");
+        foreach ($t_rules as $row) {
+            if (!empty($row['rule']) and is_subnet_aton($row['rule'],$ip_aton)) { return $row['user_id']; }
+            }
         }
-    }
+    //mac
     if (!empty($mac)) {
-        $mac_rules=get_records_sql($db,"SELECT id,mac_rule FROM User_list WHERE deleted=0 AND LENGTH(mac_rule)>0");
+        $mac_rules=get_records_sql($db,"SELECT * FROM auth_rules WHERE type=2 AND LENGTH(rule)>0");
         foreach ($mac_rules as $row) {
-            if (!empty($row['mac_rule']) and preg_match($row['mac_rule'], $mac)) { return $row['id']; }
+            if (!empty($row['rule']) and preg_match($row['rule'], $mac)) { return $row['user_id']; }
             }
         }
+    //the hostname is not processed, because the dhcp-server on the microtic does not return it
     return $default_user_id;
 }
 

+ 2 - 2
html/inc/datefilter.php

@@ -7,7 +7,7 @@ $datetime_start = new DateTime();
 if (empty($default_date_shift)) { $default_date_shift='d'; }
 
 if (!empty($_GET['date_start']) or !empty($_POST['date_start'])) {
-    if (!empty($_GET['date_start'])) { $datetime_start = GetDateTimeFromString(urldecode($_GET['date_start'])); }
+    if (!empty($_GET['date_start'])) { $datetime_start = GetDateTimeFromString($_GET['date_start']); }
     if (!empty($_POST['date_start'])) { $datetime_start = GetDateTimeFromString($_POST['date_start']); }
     $date1 = $datetime_start->format('Y-m-d');
     $time_start = $datetime_start->getTimestamp();
@@ -23,7 +23,7 @@ if (!empty($_GET['date_start']) or !empty($_POST['date_start'])) {
     }
 
 if (!empty($_POST['date_stop']) or !empty($_GET['date_stop'])) {
-    if (!empty($_GET['date_stop'])) { $datetime_stop = GetDateTimeFromString(urldecode($_GET['date_stop'])); }
+    if (!empty($_GET['date_stop'])) { $datetime_stop = GetDateTimeFromString($_GET['date_stop']); }
     if (!empty($_POST['date_stop'])) { $datetime_stop = GetDateTimeFromString($_POST['date_stop']); }
     $date2 = $datetime_stop->format('Y-m-d');
     $time_stop = $datetime_stop->getTimestamp();

+ 3 - 2
html/inc/datetimefilter.php

@@ -7,7 +7,7 @@ $datetime_start = new DateTime(strftime('%Y-%m-%d 00:00:00',time()));
 if (empty($default_date_shift)) { $default_date_shift='h'; }
 
 if (!empty($_GET['date_start']) or !empty($_POST['date_start'])) {
-    if (!empty($_GET['date_start'])) { $datetime_start = GetDateTimeFromString(urldecode($_GET['date_start'])); }
+    if (!empty($_GET['date_start'])) { $datetime_start = GetDateTimeFromString($_GET['date_start']); }
     if (!empty($_POST['date_start'])) { $datetime_start = GetDateTimeFromString($_POST['date_start']); }
     $date1 = $datetime_start->format('Y-m-d H:i:s');
     $time_start = $datetime_start->getTimestamp();
@@ -23,7 +23,7 @@ if (!empty($_GET['date_start']) or !empty($_POST['date_start'])) {
     }
 
 if (!empty($_POST['date_stop']) or !empty($_GET['date_stop'])) {
-    if (!empty($_GET['date_stop'])) { $datetime_stop = GetDateTimeFromString(urldecode($_GET['date_stop'])); }
+    if (!empty($_GET['date_stop'])) { $datetime_stop = GetDateTimeFromString($_GET['date_stop']); }
     if (!empty($_POST['date_stop'])) { $datetime_stop = GetDateTimeFromString($_POST['date_stop']); }
     $date2 = $datetime_stop->format('Y-m-d H:i:s');
     $time_stop = $datetime_stop->getTimestamp();
@@ -36,6 +36,7 @@ if (!empty($_POST['date_stop']) or !empty($_GET['date_stop'])) {
     }
 
 
+
 if (!isset($datetime_stop) or empty($datetime_stop)) {
     if ($default_date_shift==='h') {
         $datetime_start->modify('+1 hour');

+ 1 - 209
html/inc/languages/russian.php

@@ -51,7 +51,7 @@ $cell_nagios_handler = "Реакция на событие";
 $cell_link = "Линк";
 $cell_traf = "Запись трафика";
 $cell_acl = "dhcp acl";
-$cell_rule = "Правило";
+$cell_rule = "Правил";
 
 /* lists name */
 $list_ou = "Список групп";
@@ -71,212 +71,4 @@ $btn_apply = "Применить конфигурацию";
 $msg_exists = "уже существует!";
 $msg_ip_error = "Формат адреса не верен!";
 
-/* /inc/header.php */
-define("menu1", "Трафик");
-define("menu2", "Группы");
-define("menu3", "Пользователи");
-define("menu4", "Фильтры");
-
-/* /reports/userinfo.php */
-define("userinfo1", "Трафик пользователя");
-define("userinfo2", "Для адреса:");
-define("userinfo3", "Логин");
-define("userinfo4", "За месяц");
-define("userinfo5", "За год");
-define("userinfo6", "За день");
-define("userinfo7", "Входящий");
-define("userinfo8", "Исходящий");
-define("userinfo9", "Общий трафик");
-define("userinfo10", "За период");
-define("userinfo11", " год ");
-define("userinfo12", " месяц ");
-define("userinfo13", " день ");
-
-/* /sessions/index.php */
-define("sessions1", "Активные подключения");
-define("sessions2", "Логин");
-define("sessions3", "IP сессии");
-define("sessions4", "Подключено с IP");
-define("sessions5", "Интерфейс");
-define("sessions6", "Баланс");
-define("sessions7", "Дата");
-define("sessions8", "Статистика использования трафика");
-define("sessions9", "Логин");
-define("sessions10", "За месяц");
-define("sessions11", "За сегодня");
-define("sessions12", "За последний час");
-define("sessions13", "Входящий");
-define("sessions14", "Исходящий");
-define("sessions15", "Общий трафик");
-define("sessions16", "Отключить выбранных");
-
-/* /users/index.php */
-define("users1", "Пользователи");
-define("users2", "Логин");
-define("users3", "IP");
-define("users4", "Тариф");
-define("users5", "Баланс");
-define("users6", "Не блокировать");
-define("users7", "Новый пользователь");
-define("users8", "Удалить пользователей");
-define("users9", "Пополнить баланс:");
-define("users10", "Сменить тариф:");
-define("users11", "Пополнить");
-define("users12", "Сменить");
-
-/* /users/adduser.php */
-define("adduser1", "Добавить пользователя");
-define("adduser2", "Логин");
-define("adduser3", "Пароль");
-define("adduser4", "Подтверждение:");
-define("adduser5", "IP адрес");
-define("adduser6", "Баланс");
-define("adduser7", "Тариф");
-define("adduser8", "Не блокировать при отрицательном балансе");
-define("adduser9", "Добавить");
-
-/* /users/edituser.php */
-define("edituser1", "Редактирование пользователя");
-define("edituser2", "Логин");
-define("edituser3", "IP адрес");
-define("edituser4", "Баланс");
-define("edituser5", "Тариф");
-define("edituser6", "Не блокировать при отрицательном балансе");
-define("edituser7", "Сохранить");
-define("edituser8", "Изменить пароль");
-define("edituser9", "Новый пароль");
-define("edituser10", "Подтверждение");
-define("edituser11", "Сохранить");
-
-/* /tariffs/index.php */
-define("tariffs1", "Тарифы");
-define("tariffs2", "Название");
-define("tariffs3", "Цена за 1мб");
-define("tariffs4", "Скорость");
-define("tariffs5", "Входящий");
-define("tariffs6", "Исходящий");
-define("tariffs7", "Новый тариф");
-define("tariffs8", "Удалить тарифы");
-define("tariffs9", "Шейпер");
-define("tariffs10", "Стат.");
-define("tariffs11", "Макс.");
-define("tariffs12", "Мин.");
-define("tariffs13", "Нет");
-define("tariffs14", "Статич.");
-define("tariffs15", "Динамич.");
-
-/* /tariffs/addtariff.php */
-define("addtariff1", "Добавить тариф");
-define("addtariff2", "Название");
-define("addtariff3", "Входяший");
-define("addtariff4", "Исходящий");
-define("addtariff5", "Не ограничивать");
-define("addtariff6", "Скорость");
-define("addtariff7", "Добавить тариф");
-define("addtariff8", "Статическая");
-define("addtariff9", "Динамическая");
-define("addtariff10", "руб/Мб");
-define("addtariff11", "Кбит/сек");
-define("addtariff12", "Минимальная");
-define("addtariff13", "Максимальная");
-
-define("addtariff14", "Абонентская плата");
-define("addtariff15", "Сумма");
-define("addtariff16", "Пояснение");
-define("addtariff17", "Предоплаченный трафик");
-define("addtariff18", "Входящий");
-define("addtariff19", "Исходящий");
-define("addtariff20", "руб");
-define("addtariff21", "Мбайт");
-define("addtariff22", "Ограничение скорости");
-
-/* /tariffs/edittariff.php */
-define("edittariff1", "Редактировать тариф");
-define("edittariff2", "Название");
-define("edittariff3", "Входяший");
-define("edittariff4", "Исходящий");
-define("edittariff5", "Не ограничивать");
-define("edittariff6", "Скорость");
-define("edittariff7", "Сохранить");
-define("edittariff8", "Статическая");
-define("edittariff9", "Динамическая");
-define("edittariff10", "руб/Мб");
-define("edittariff11", "Кбит/сек");
-define("edittariff12", "Минимальная");
-define("edittariff13", "Максимальная");
-
-define("edittariff14", "Абонентская плата");
-define("edittariff15", "Сумма");
-define("edittariff16", "Пояснение");
-define("edittariff17", "Предоплаченный трафик");
-define("edittariff18", "Входящий");
-define("edittariff19", "Исходящий");
-define("edittariff20", "руб");
-define("edittariff21", "Мбайт");
-define("edittariff22", "Ограничение скорости");
-
-/* /tariffs/prices.php */
-define("prices1", "Ценовые правила для тарифа");
-define("prices2", "Хост/Сеть");
-define("prices3", "Входящий");
-define("prices4", "Исходящий");
-define("prices5", "Описание");
-define("prices6", "Новое правло");
-define("prices7", "Удалить отмеченные");
-
-/* /tariffs/addprice.php */
-define("addprice1", "Добавление правила");
-define("addprice2", "Хост");
-define("addprice3", "Сеть");
-define("addprice4", "Входящий");
-define("addprice5", "Исходящий");
-define("addprice6", "Описание");
-define("addprice7", "руб/Мб");
-define("addprice8", "Добавить");
-define("addprice9", "Включен предоплаченный трафик");
-
-/* /tariffs/editprice.php */
-define("editprice1", "Редактирование правила");
-define("editprice2", "Хост");
-define("editprice3", "Сеть");
-define("editprice4", "Входящий");
-define("editprice5", "Исходящий");
-define("editprice6", "Описание");
-define("editprice7", "руб/Мб");
-define("editprice8", "Сохранить");
-define("editprice9", "Включен предоплаченный трафик");
-
-/* /stats/ */
-define("stats1", "Часовая");
-define("stats2", "Дневная");
-define("stats3", "Месячная");
-define("stats4", "Время");
-define("stats5", "Дата");
-define("stats6", "Месяц");
-define("stats7", "Пользователь");
-define("stats8", "Входящий");
-define("stats9", "Исходящий");
-define("stats10", "Всего");
-define("stats11", "Детальная статистика за");
-define("stats12", "Показать");
-define("stats13", "Период");
-define("stats14", "Статистика");
-define("stats15", "В период");
-/* /msgs/index.php */
-define("msgs1", "Сообщения пользователям");
-define("msgs2", "Текст");
-define("msgs3", "Дата");
-define("msgs4", "Новое сообщение");
-define("msgs5", "Удалить сообщения");
-
-/* /msgs/addmsg.php */
-define("addmsg1", "Добавить сообщение");
-define("addmsg2", "Текст сообщения:");
-define("addmsg3", "Добавить");
-
-/* /msgs/editmsg.php */
-define("editmsg1", "Редактировать сообщение");
-define("editmsg2", "Текст сообщения:");
-define("editmsg3", "Сохранить");
-
 ?>

+ 31 - 44
scripts/Rstat/mysql.pm

@@ -40,7 +40,6 @@ get_device_by_ip
 get_diff_rec
 get_id_record
 get_new_user_id
-get_newuser_by_regexp
 GetNowTime
 GetUnixTimeByStr
 GetTimeStrByUnixTime
@@ -50,7 +49,6 @@ init_db
 init_option
 insert_record
 IpToStr
-refresh_add_rules
 resurrection_auth
 new_auth
 StrToIp
@@ -440,60 +438,44 @@ return $now_str;
 
 #---------------------------------------------------------------------------------------------------------------
 
-sub refresh_add_rules {
-my $dbh = shift;
-if (defined $add_rules) { undef $add_rules; }
-$add_rules = new Net::Patricia;
-#custom rules
-my @user_rules=get_records_sql($dbh,'select id,default_subnet from User_list where deleted=0 and LENGTH(default_subnet)>0');
-foreach my $subnet (@user_rules) {
-    next if (!$subnet);
-    next if (!$subnet->{default_subnet});
-    next if (!$subnet->{id});
-    eval {
-	$add_rules->add_string($subnet->{default_subnet},$subnet->{id});
-	};
-    }
-#hotspot nets
-foreach my $subnet (@hotspot_network_list) {
-    next if (!$subnet);
-    $add_rules->add_string($subnet,$hotspot_user_id);
-    }
-}
-
-#---------------------------------------------------------------------------------------------------------------
-
-sub get_newuser_by_regexp {
+sub get_new_user_id {
 my $dbh = shift;
+my $ip  = shift;
 my $mac = shift;
 my $hostname = shift;
-#custom rules
+#check ip
+if (defined $ip and $ip) {
+    my $users = new Net::Patricia;
+    #check hotspot
+    my @ip_rules = get_records_sql($dbh,'SELECT * FROM subnets WHERE hotspot=1 AND LENGTH(subnet)>0');
+    foreach my $row (@ip_rules) { $users->add_string($row->{subnet},$config_ref{hotspot_user_id}); }
+    if ($users->match_string($ip)) { return $users->match_string($ip); }
+    #check ip rules
+    @ip_rules = get_records_sql($dbh,'SELECT * FROM auth_rules WHERE type=1 and LENGTH(rule)>0');
+    foreach my $row (@ip_rules) { $users->add_string($row->{rule},$row->{user_id}); }
+    if ($users->match_string($ip)) { return $users->match_string($ip); }
+    }
+
+#check mac
 if (defined $mac and $mac) {
-    my @user_rules=get_records_sql($dbh,'SELECT id,mac_rule FROM User_list WHERE deleted=0 AND LENGTH(mac_rule)>0');
-    foreach my $user (@user_rules) { if ($mac=~/$user->{mac_rule}/i) { return $user->{id}; } }
+    my @user_rules=get_records_sql($dbh,'SELECT * FROM auth_rules WHERE type=2 AND LENGTH(rule)>0');
+    foreach my $user (@user_rules) {
+        if ($mac=~/$user->{rule}/i) { return $user->{user_id}; }
+        }
     }
+
+#check hostname
 if (defined $hostname and $hostname) {
-    my @user_rules=get_records_sql($dbh,'SELECT id,hostname_rule FROM User_list WHERE deleted=0 AND LENGTH(hostname_rule)>0');
-    foreach my $user (@user_rules) { if ($hostname=~/$user->{hostname_rule}/i) { return $user->{id}; } }
+    my @user_rules=get_records_sql($dbh,'SELECT * FROM auth_rules WHERE type=3 AND LENGTH(rule)>0');
+    foreach my $user (@user_rules) {
+        if ($hostname=~/$user->{rule}/i) { return $user->{user_id}; }
+        }
     }
 return $default_user_id;
 }
 
 #---------------------------------------------------------------------------------------------------------------
 
-sub get_new_user_id {
-my $dbh = shift;
-my $ip  = shift;
-my $mac = shift;
-my $hostname = shift;
-if (!defined $add_rules) { refresh_add_rules($dbh); }
-my $user_id=$add_rules->match_string($ip);
-if (!$user_id) { $user_id=get_newuser_by_regexp($dbh,$mac,$hostname); }
-return $user_id;
-}
-
-#---------------------------------------------------------------------------------------------------------------
-
 sub set_changed {
 my $db = shift;
 my $id = shift;
@@ -942,6 +924,11 @@ push(@all_network_list,$net->{subnet});
 $all_networks->add_string($net->{subnet});
 }
 
+#remove all rules for default user id and hotspot subnet
+delete_record($dbh,"auth_rules","user_id=".$config_ref{default_user_id});
+delete_record($dbh,"auth_rules","user_id=".$config_ref{hotspot_user_id});
+foreach my $subnet (@hotspot_network_list) { delete_record($dbh,"auth_rules","rule='".$subnet."'"); }
+
 }
 
 #---------------------------------------------------------------------------------------------------------------

+ 3 - 0
updates/20210325/db-patch-mysql.sql

@@ -0,0 +1,3 @@
+CREATE TABLE `auth_rules` ( `id` INT NOT NULL AUTO_INCREMENT , `user_id` INT NOT NULL , `type` INT NOT NULL , `rule` VARCHAR(40) NULL DEFAULT NULL , PRIMARY KEY (`id`), INDEX (`user_id`)) ENGINE = InnoDB;
+ALTER TABLE `auth_rules` ADD UNIQUE(`rule`);
+

+ 53 - 0
updates/20210325/patch-auth_rules.pl

@@ -0,0 +1,53 @@
+#!/usr/bin/perl
+
+#
+# Copyright (C) Roman Dmitiriev, rnd@rajven.ru
+#
+
+use FindBin '$Bin';
+use lib "$Bin/";
+use Data::Dumper;
+use Rstat::config;
+use Rstat::main;
+use Rstat::mysql;
+use Rstat::net_utils;
+use strict;
+use warnings;
+
+my @users = get_records_sql($dbh,"SELECT * FROM User_list");
+
+foreach my $row (@users) {
+#hostname rule = 3
+#mac rule = 2
+#ip_rule = 1
+if ($row->{default_subnet}) {
+    my $new_rule;
+    $new_rule->{user_id} = $row->{id};
+    $new_rule->{type}=1;
+    $new_rule->{rule}=$row->{default_subnet};
+    my $ret = insert_record($dbh,"auth_rules",$new_rule);
+    if (!$ret) { die ("Error insert record!"); }
+    }
+if ($row->{mac_rule}) {
+    my $new_rule;
+    $new_rule->{user_id} = $row->{id};
+    $new_rule->{type}=2;
+    $new_rule->{rule}=$row->{mac_rule};
+    my $ret = insert_record($dbh,"auth_rules",$new_rule);
+    if (!$ret) { die ("Error insert record!"); }
+    }
+if ($row->{hostname_rule}) {
+    my $new_rule;
+    $new_rule->{user_id} = $row->{id};
+    $new_rule->{type}=3;
+    $new_rule->{rule}=$row->{hostname_rule};
+    my $ret = insert_record($dbh,"auth_rules",$new_rule);
+    if (!$ret) { die ("Error insert record!"); }
+    }
+}
+
+do_sql($dbh,"ALTER TABLE `User_list` DROP `default_subnet`, DROP `hostname_rule`, DROP `mac_rule`");
+
+print "Done!\n";
+
+exit;