Merge branch 'master' into Development

This commit is contained in:
iBNu Maksum 2024-10-29 14:17:31 +07:00
commit 7614422bd8
No known key found for this signature in database
GPG Key ID: 7FC82848810579E5
6 changed files with 71 additions and 20 deletions

View File

@ -25,6 +25,10 @@ switch ($action) {
if (!in_array($admin['user_type'], ['SuperAdmin', 'Admin'])) { if (!in_array($admin['user_type'], ['SuperAdmin', 'Admin'])) {
_alert(Lang::T('You do not have permission to access this page'), 'danger', "dashboard"); _alert(Lang::T('You do not have permission to access this page'), 'danger', "dashboard");
} }
$csrf_token = _req('token');
if (!Csrf::check($csrf_token)) {
r2(U . 'customers', 'e', Lang::T('Invalid or Expired CSRF Token') . ".");
}
$cs = ORM::for_table('tbl_customers') $cs = ORM::for_table('tbl_customers')
->select('tbl_customers.id', 'id') ->select('tbl_customers.id', 'id')
@ -153,6 +157,7 @@ switch ($action) {
} }
$ui->assign('xheader', $leafletpickerHeader); $ui->assign('xheader', $leafletpickerHeader);
run_hook('view_add_customer'); #HOOK run_hook('view_add_customer'); #HOOK
$ui->assign('csrf_token', Csrf::generateAndStoreToken());
$ui->display('customers-add.tpl'); $ui->display('customers-add.tpl');
break; break;
case 'recharge': case 'recharge':
@ -161,6 +166,10 @@ switch ($action) {
} }
$id_customer = $routes['2']; $id_customer = $routes['2'];
$plan_id = $routes['3']; $plan_id = $routes['3'];
$csrf_token = _req('token');
if (!Csrf::check($csrf_token)) {
r2(U . 'customers/view/' . $id_customer, 'e', Lang::T('Invalid or Expired CSRF Token') . ".");
}
$b = ORM::for_table('tbl_user_recharges')->where('customer_id', $id_customer)->where('plan_id', $plan_id)->find_one(); $b = ORM::for_table('tbl_user_recharges')->where('customer_id', $id_customer)->where('plan_id', $plan_id)->find_one();
if ($b) { if ($b) {
$gateway = 'Recharge'; $gateway = 'Recharge';
@ -199,6 +208,7 @@ switch ($action) {
$ui->assign('channel', $channel); $ui->assign('channel', $channel);
$ui->assign('server', $b['routers']); $ui->assign('server', $b['routers']);
$ui->assign('plan', $plan); $ui->assign('plan', $plan);
$ui->assign('csrf_token', Csrf::generateAndStoreToken());
$ui->display('recharge-confirm.tpl'); $ui->display('recharge-confirm.tpl');
} else { } else {
r2(U . 'customers/view/' . $id_customer, 'e', 'Cannot find active plan'); r2(U . 'customers/view/' . $id_customer, 'e', 'Cannot find active plan');
@ -210,6 +220,10 @@ switch ($action) {
} }
$id_customer = $routes['2']; $id_customer = $routes['2'];
$plan_id = $routes['3']; $plan_id = $routes['3'];
$csrf_token = _req('token');
if (!Csrf::check($csrf_token)) {
r2(U . 'customers/view/' . $id_customer, 'e', Lang::T('Invalid or Expired CSRF Token') . ".");
}
$b = ORM::for_table('tbl_user_recharges')->where('customer_id', $id_customer)->where('plan_id', $plan_id)->find_one(); $b = ORM::for_table('tbl_user_recharges')->where('customer_id', $id_customer)->where('plan_id', $plan_id)->find_one();
if ($b) { if ($b) {
$p = ORM::for_table('tbl_plans')->where('id', $b['plan_id'])->find_one(); $p = ORM::for_table('tbl_plans')->where('id', $b['plan_id'])->find_one();
@ -238,6 +252,10 @@ switch ($action) {
break; break;
case 'sync': case 'sync':
$id_customer = $routes['2']; $id_customer = $routes['2'];
$csrf_token = _req('token');
if (!Csrf::check($csrf_token)) {
r2(U . 'customers/view/' . $id_customer, 'e', Lang::T('Invalid or Expired CSRF Token') . ".");
}
$bs = ORM::for_table('tbl_user_recharges')->where('customer_id', $id_customer)->where('status', 'on')->findMany(); $bs = ORM::for_table('tbl_user_recharges')->where('customer_id', $id_customer)->where('status', 'on')->findMany();
if ($bs) { if ($bs) {
$routers = []; $routers = [];
@ -266,8 +284,12 @@ switch ($action) {
_alert(Lang::T('You do not have permission to access this page'), 'danger', "dashboard"); _alert(Lang::T('You do not have permission to access this page'), 'danger', "dashboard");
} }
$id = $routes['2']; $id = $routes['2'];
$csrf_token = _req('token');
if (!Csrf::check($csrf_token)) {
r2(U . 'customers/view/' . $id, 'e', Lang::T('Invalid or Expired CSRF Token') . ".");
}
$customer = ORM::for_table('tbl_customers')->find_one($id); $customer = ORM::for_table('tbl_customers')->find_one($id);
if($customer){ if ($customer) {
$_SESSION['uid'] = $id; $_SESSION['uid'] = $id;
User::setCookie($id); User::setCookie($id);
_alert("You are logging in as $customer[fullname],<br>don't logout just close tab.", 'info', "home", 10); _alert("You are logging in as $customer[fullname],<br>don't logout just close tab.", 'info', "home", 10);
@ -308,6 +330,7 @@ switch ($action) {
$ui->assign('d', $customer); $ui->assign('d', $customer);
$ui->assign('customFields', $customFields); $ui->assign('customFields', $customFields);
$ui->assign('xheader', $leafletpickerHeader); $ui->assign('xheader', $leafletpickerHeader);
$ui->assign('csrf_token', Csrf::generateAndStoreToken());
$ui->display('customers-view.tpl'); $ui->display('customers-view.tpl');
} else { } else {
r2(U . 'customers/list', 'e', Lang::T('Account Not Found')); r2(U . 'customers/list', 'e', Lang::T('Account Not Found'));
@ -318,6 +341,10 @@ switch ($action) {
_alert(Lang::T('You do not have permission to access this page'), 'danger', "dashboard"); _alert(Lang::T('You do not have permission to access this page'), 'danger', "dashboard");
} }
$id = $routes['2']; $id = $routes['2'];
$csrf_token = _req('token');
if (!Csrf::check($csrf_token)) {
r2(U . 'customers/view/' . $id, 'e', Lang::T('Invalid or Expired CSRF Token') . ".");
}
run_hook('edit_customer'); #HOOK run_hook('edit_customer'); #HOOK
$d = ORM::for_table('tbl_customers')->find_one($id); $d = ORM::for_table('tbl_customers')->find_one($id);
// Fetch the Customers Attributes values from the tbl_customers_fields table // Fetch the Customers Attributes values from the tbl_customers_fields table
@ -329,6 +356,7 @@ switch ($action) {
$ui->assign('statuses', ORM::for_table('tbl_customers')->getEnum("status")); $ui->assign('statuses', ORM::for_table('tbl_customers')->getEnum("status"));
$ui->assign('customFields', $customFields); $ui->assign('customFields', $customFields);
$ui->assign('xheader', $leafletpickerHeader); $ui->assign('xheader', $leafletpickerHeader);
$ui->assign('csrf_token', Csrf::generateAndStoreToken());
$ui->display('customers-edit.tpl'); $ui->display('customers-edit.tpl');
} else { } else {
r2(U . 'customers/list', 'e', Lang::T('Account Not Found')); r2(U . 'customers/list', 'e', Lang::T('Account Not Found'));
@ -340,6 +368,10 @@ switch ($action) {
_alert(Lang::T('You do not have permission to access this page'), 'danger', "dashboard"); _alert(Lang::T('You do not have permission to access this page'), 'danger', "dashboard");
} }
$id = $routes['2']; $id = $routes['2'];
$csrf_token = _req('token');
if (!Csrf::check($csrf_token)) {
r2(U . 'customers/view/' . $id, 'e', Lang::T('Invalid or Expired CSRF Token') . ".");
}
run_hook('delete_customer'); #HOOK run_hook('delete_customer'); #HOOK
$c = ORM::for_table('tbl_customers')->find_one($id); $c = ORM::for_table('tbl_customers')->find_one($id);
if ($c) { if ($c) {
@ -375,6 +407,11 @@ switch ($action) {
break; break;
case 'add-post': case 'add-post':
$csrf_token = _post('csrf_token');
if (!Csrf::check($csrf_token)) {
r2(U . 'customers/add', 'e', Lang::T('Invalid or Expired CSRF Token') . ".");
}
$username = alphanumeric(_post('username'), ":+_.@-"); $username = alphanumeric(_post('username'), ":+_.@-");
$fullname = _post('fullname'); $fullname = _post('fullname');
$password = trim(_post('password')); $password = trim(_post('password'));
@ -499,6 +536,11 @@ switch ($action) {
break; break;
case 'edit-post': case 'edit-post':
$id = _post('id');
$csrf_token = _post('csrf_token');
if (!Csrf::check($csrf_token)) {
r2(U . 'customers/edit/' . $id, 'e', Lang::T('Invalid or Expired CSRF Token') . ".");
}
$username = alphanumeric(_post('username'), ":+_.@-"); $username = alphanumeric(_post('username'), ":+_.@-");
$fullname = _post('fullname'); $fullname = _post('fullname');
$account_type = _post('account_type'); $account_type = _post('account_type');
@ -526,7 +568,6 @@ switch ($action) {
$msg .= 'Full Name should be between 2 to 25 characters' . '<br>'; $msg .= 'Full Name should be between 2 to 25 characters' . '<br>';
} }
$id = _post('id');
$c = ORM::for_table('tbl_customers')->find_one($id); $c = ORM::for_table('tbl_customers')->find_one($id);
if (!$c) { if (!$c) {
@ -551,8 +592,8 @@ switch ($action) {
if (ORM::for_table('tbl_customers')->where('username', $username)->find_one()) { if (ORM::for_table('tbl_customers')->where('username', $username)->find_one()) {
$msg .= Lang::T('Username already used by another customer') . '<br>'; $msg .= Lang::T('Username already used by another customer') . '<br>';
} }
if(ORM::for_table('tbl_customers')->where('pppoe_username', $username)->find_one()){ if (ORM::for_table('tbl_customers')->where('pppoe_username', $username)->find_one()) {
$msg.= Lang::T('Username already used by another pppoe username customer') . '<br>'; $msg .= Lang::T('Username already used by another pppoe username customer') . '<br>';
} }
$userDiff = true; $userDiff = true;
} }
@ -659,13 +700,13 @@ switch ($action) {
(new $p['device'])->change_username($p, $oldusername, $username); (new $p['device'])->change_username($p, $oldusername, $username);
} }
if ($pppoeDiff && $tur['type'] == 'PPPOE') { if ($pppoeDiff && $tur['type'] == 'PPPOE') {
if(empty($oldPppoeUsername) && !empty($pppoe_username)){ if (empty($oldPppoeUsername) && !empty($pppoe_username)) {
// admin just add pppoe username // admin just add pppoe username
(new $p['device'])->change_username($p, $username, $pppoe_username); (new $p['device'])->change_username($p, $username, $pppoe_username);
}else if(empty($pppoe_username) && !empty($oldPppoeUsername)){ } else if (empty($pppoe_username) && !empty($oldPppoeUsername)) {
// admin want to use customer username // admin want to use customer username
(new $p['device'])->change_username($p, $oldPppoeUsername, $username); (new $p['device'])->change_username($p, $oldPppoeUsername, $username);
}else{ } else {
// regular change pppoe username // regular change pppoe username
(new $p['device'])->change_username($p, $oldPppoeUsername, $pppoe_username); (new $p['device'])->change_username($p, $oldPppoeUsername, $pppoe_username);
} }
@ -715,6 +756,10 @@ switch ($action) {
$query->order_by_desc($order); $query->order_by_desc($order);
} }
if (_post('export', '') == 'csv') { if (_post('export', '') == 'csv') {
$csrf_token = _post('csrf_token');
if (!Csrf::check($csrf_token)) {
r2(U . 'customers', 'e', Lang::T('Invalid or Expired CSRF Token') . ".");
}
$d = $query->findMany(); $d = $query->findMany();
$h = false; $h = false;
set_time_limit(-1); set_time_limit(-1);
@ -764,6 +809,7 @@ switch ($action) {
$ui->assign('order', $order); $ui->assign('order', $order);
$ui->assign('order_pos', $order_pos[$order]); $ui->assign('order_pos', $order_pos[$order]);
$ui->assign('orderby', $orderby); $ui->assign('orderby', $orderby);
$ui->assign('csrf_token', Csrf::generateAndStoreToken());
$ui->display('customers.tpl'); $ui->display('customers.tpl');
break; break;
} }

View File

@ -1,6 +1,7 @@
{include file="sections/header.tpl"} {include file="sections/header.tpl"}
<form class="form-horizontal" method="post" role="form" action="{$_url}customers/add-post"> <form class="form-horizontal" method="post" role="form" action="{$_url}customers/add-post">
<input type="hidden" name="csrf_token" value="{$csrf_token}">
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
<div class="panel panel-primary panel-hovered panel-stacked mb30"> <div class="panel panel-primary panel-hovered panel-stacked mb30">

View File

@ -1,6 +1,7 @@
{include file="sections/header.tpl"} {include file="sections/header.tpl"}
<form class="form-horizontal" method="post" role="form" action="{$_url}customers/edit-post"> <form class="form-horizontal" method="post" role="form" action="{$_url}customers/edit-post">
<input type="hidden" name="csrf_token" value="{$csrf_token}">
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
<div <div

View File

@ -111,12 +111,12 @@
</ul> </ul>
<div class="row"> <div class="row">
<div class="col-xs-4"> <div class="col-xs-4">
<a href="{$_url}customers/delete/{$d['id']}" id="{$d['id']}" <a href="{$_url}customers/delete/{$d['id']}&token={$csrf_token}" id="{$d['id']}"
class="btn btn-danger btn-block btn-sm" class="btn btn-danger btn-block btn-sm"
onclick="return confirm('{Lang::T('Delete')}?')"><span class="fa fa-trash"></span></a> onclick="return confirm('{Lang::T('Delete')}?')"><span class="fa fa-trash"></span></a>
</div> </div>
<div class="col-xs-8"> <div class="col-xs-8">
<a href="{$_url}customers/edit/{$d['id']}" <a href="{$_url}customers/edit/{$d['id']}&token={$csrf_token}"
class="btn btn-warning btn-sm btn-block">{Lang::T('Edit')}</a> class="btn btn-warning btn-sm btn-block">{Lang::T('Edit')}</a>
</div> </div>
</div> </div>
@ -239,12 +239,12 @@
</ul> </ul>
<div class="row"> <div class="row">
<div class="col-xs-4"> <div class="col-xs-4">
<a href="{$_url}customers/deactivate/{$d['id']}/{$package['plan_id']}" id="{$d['id']}" <a href="{$_url}customers/deactivate/{$d['id']}/{$package['plan_id']}&token={$csrf_token}" id="{$d['id']}"
class="btn btn-danger btn-block btn-sm" class="btn btn-danger btn-block btn-sm"
onclick="return confirm('This will deactivate Customer Plan, and make it expired')">{Lang::T('Deactivate')}</a> onclick="return confirm('This will deactivate Customer Plan, and make it expired')">{Lang::T('Deactivate')}</a>
</div> </div>
<div class="col-xs-8"> <div class="col-xs-8">
<a href="{$_url}customers/recharge/{$d['id']}/{$package['plan_id']}" <a href="{$_url}customers/recharge/{$d['id']}/{$package['plan_id']}&token={$csrf_token}"
class="btn btn-success btn-sm btn-block">{Lang::T('Recharge')}</a> class="btn btn-success btn-sm btn-block">{Lang::T('Recharge')}</a>
</div> </div>
</div> </div>
@ -261,16 +261,16 @@
<a href="{$_url}customers/list" class="btn btn-primary btn-sm btn-block">{Lang::T('Back')}</a> <a href="{$_url}customers/list" class="btn btn-primary btn-sm btn-block">{Lang::T('Back')}</a>
</div> </div>
<div class="col-xs-6 col-md-3"> <div class="col-xs-6 col-md-3">
<a href="{$_url}customers/sync/{$d['id']}" onclick="return confirm('This will sync Customer to Mikrotik?')" <a href="{$_url}customers/sync/{$d['id']}&token={$csrf_token}" onclick="return confirm('This will sync Customer to Mikrotik?')"
class="btn btn-info btn-sm btn-block">{Lang::T('Sync')}</a> class="btn btn-info btn-sm btn-block">{Lang::T('Sync')}</a>
</div> </div>
<div class="col-xs-6 col-md-3"> <div class="col-xs-6 col-md-3">
<a href="{$_url}message/send/{$d['id']}" class="btn btn-success btn-sm btn-block"> <a href="{$_url}message/send/{$d['id']}&token={$csrf_token}" class="btn btn-success btn-sm btn-block">
{Lang::T('Send Message')} {Lang::T('Send Message')}
</a> </a>
</div> </div>
<div class="col-xs-6 col-md-3"> <div class="col-xs-6 col-md-3">
<a href="{$_url}customers/login/{$d['id']}" target="_blank" class="btn btn-warning btn-sm btn-block"> <a href="{$_url}customers/login/{$d['id']}&token={$csrf_token}" target="_blank" class="btn btn-warning btn-sm btn-block">
{Lang::T('Login as Customer')} {Lang::T('Login as Customer')}
</a> </a>
</div> </div>

View File

@ -17,7 +17,7 @@
<div class="panel-heading"> <div class="panel-heading">
{if in_array($_admin['user_type'],['SuperAdmin','Admin'])} {if in_array($_admin['user_type'],['SuperAdmin','Admin'])}
<div class="btn-group pull-right"> <div class="btn-group pull-right">
<a class="btn btn-primary btn-xs" title="save" href="{$_url}customers/csv" <a class="btn btn-primary btn-xs" title="save" href="{$_url}customers/csv&token={$csrf_token}"
onclick="return confirm('This will export to CSV?')"><span class="glyphicon glyphicon-download" onclick="return confirm('This will export to CSV?')"><span class="glyphicon glyphicon-download"
aria-hidden="true"></span> CSV</a> aria-hidden="true"></span> CSV</a>
</div> </div>
@ -26,6 +26,7 @@
</div> </div>
<div class="panel-body"> <div class="panel-body">
<form id="site-search" method="post" action="{$_url}customers"> <form id="site-search" method="post" action="{$_url}customers">
<input type="hidden" name="csrf_token" value="{$csrf_token}">
<div class="md-whiteframe-z1 mb20 text-center" style="padding: 15px"> <div class="md-whiteframe-z1 mb20 text-center" style="padding: 15px">
<div class="col-lg-4"> <div class="col-lg-4">
<div class="input-group"> <div class="input-group">
@ -147,13 +148,13 @@
<a href="{$_url}customers/view/{$ds['id']}" id="{$ds['id']}" <a href="{$_url}customers/view/{$ds['id']}" id="{$ds['id']}"
style="margin: 0px; color:black" style="margin: 0px; color:black"
class="btn btn-success btn-xs">&nbsp;&nbsp;{Lang::T('View')}&nbsp;&nbsp;</a> class="btn btn-success btn-xs">&nbsp;&nbsp;{Lang::T('View')}&nbsp;&nbsp;</a>
<a href="{$_url}customers/edit/{$ds['id']}" id="{$ds['id']}" <a href="{$_url}customers/edit/{$ds['id']}&token={$csrf_token}" id="{$ds['id']}"
style="margin: 0px; color:black" style="margin: 0px; color:black"
class="btn btn-info btn-xs">&nbsp;&nbsp;{Lang::T('Edit')}&nbsp;&nbsp;</a> class="btn btn-info btn-xs">&nbsp;&nbsp;{Lang::T('Edit')}&nbsp;&nbsp;</a>
<a href="{$_url}customers/sync/{$ds['id']}" id="{$ds['id']}" <a href="{$_url}customers/sync/{$ds['id']}&token={$csrf_token}" id="{$ds['id']}"
style="margin: 5px; color:black" style="margin: 5px; color:black"
class="btn btn-success btn-xs">&nbsp;&nbsp;{Lang::T('Sync')}&nbsp;&nbsp;</a> class="btn btn-success btn-xs">&nbsp;&nbsp;{Lang::T('Sync')}&nbsp;&nbsp;</a>
<a href="{$_url}plan/recharge/{$ds['id']}" id="{$ds['id']}" style="margin: 0px;" <a href="{$_url}plan/recharge/{$ds['id']}&token={$csrf_token}" id="{$ds['id']}" style="margin: 0px;"
class="btn btn-primary btn-xs">{Lang::T('Recharge')}</a> class="btn btn-primary btn-xs">{Lang::T('Recharge')}</a>
</td> </td>
</tr> </tr>

View File

@ -185,8 +185,6 @@
color: #a94442; color: #a94442;
background-color: #f2dede; background-color: #f2dede;
border-color: #ebccd1; border-color: #ebccd1;
border-bottom-right-radius: 21px;
border-bottom-left-radius: 21px;
} }
.panel-heading { .panel-heading {
@ -278,6 +276,10 @@
font-weight: bold; font-weight: bold;
} }
.box.box-solid.box-primary > .box-header .btn {
color: inherit;
}
.box-header>.fa, .box-header>.fa,
.box-header>.glyphicon, .box-header>.glyphicon,
.box-header>.ion, .box-header>.ion,