Merge branch 'dev/user_roles' into 'main'

Dev/user roles

See merge request jjimenez/safekat!1
This commit is contained in:
2023-04-26 16:14:47 +00:00
9 changed files with 2365 additions and 39 deletions

File diff suppressed because it is too large Load Diff

138
ci4/.env Normal file
View File

@ -0,0 +1,138 @@
#--------------------------------------------------------------------
# Example Environment Configuration file
#
# This file can be used as a starting point for your own
# custom .env files, and contains most of the possible settings
# available in a default install.
#
# By default, all of the settings are commented out. If you want
# to override the setting, you must un-comment it by removing the '#'
# at the beginning of the line.
#--------------------------------------------------------------------
#--------------------------------------------------------------------
# ENVIRONMENT
#--------------------------------------------------------------------
CI_ENVIRONMENT = development
# CI_ENVIRONMENT = testing
# CI_ENVIRONMENT = production
#--------------------------------------------------------------------
# APP
#--------------------------------------------------------------------
app.baseURL = 'http://safekat.test'
# app.forceGlobalSecureRequests = false
# app.sessionDriver = 'CodeIgniter\Session\Handlers\FileHandler'
# app.sessionCookieName = 'ci_session'
# app.sessionExpiration = 7200
# app.sessionSavePath = null
# app.sessionMatchIP = false
# app.sessionTimeToUpdate = 300
# app.sessionRegenerateDestroy = false
# app.CSPEnabled = false
#--------------------------------------------------------------------
# DATABASE
#--------------------------------------------------------------------
database.default.hostname = localhost
database.default.database = sk_main
database.default.username = sk_main
database.default.password = 61tv&G1Zf^XY
database.default.DBDriver = MySQLi
database.default.DBPrefix =
database.default.dump =
# database.tests.hostname = localhost
# database.tests.database = ci4
# database.tests.username = root
# database.tests.password = root
# database.tests.DBDriver = MySQLi
# database.tests.DBPrefix =
#--------------------------------------------------------------------
# CONTENT SECURITY POLICY
#--------------------------------------------------------------------
# contentsecuritypolicy.reportOnly = false
# contentsecuritypolicy.defaultSrc = 'none'
# contentsecuritypolicy.scriptSrc = 'self'
# contentsecuritypolicy.styleSrc = 'self'
# contentsecuritypolicy.imageSrc = 'self'
# contentsecuritypolicy.base_uri = null
# contentsecuritypolicy.childSrc = null
# contentsecuritypolicy.connectSrc = 'self'
# contentsecuritypolicy.fontSrc = null
# contentsecuritypolicy.formAction = null
# contentsecuritypolicy.frameAncestors = null
# contentsecuritypolicy.frameSrc = null
# contentsecuritypolicy.mediaSrc = null
# contentsecuritypolicy.objectSrc = null
# contentsecuritypolicy.pluginTypes = null
# contentsecuritypolicy.reportURI = null
# contentsecuritypolicy.sandbox = false
# contentsecuritypolicy.upgradeInsecureRequests = false
#--------------------------------------------------------------------
# COOKIE
#--------------------------------------------------------------------
# cookie.prefix = ''
# cookie.expires = 0
# cookie.path = '/'
# cookie.domain = ''
# cookie.secure = false
# cookie.httponly = false
# cookie.samesite = 'Lax'
# cookie.raw = false
#--------------------------------------------------------------------
# ENCRYPTION
#--------------------------------------------------------------------
# encryption.key =
# encryption.driver = OpenSSL
# encryption.blockSize = 16
# encryption.digest = SHA512
#--------------------------------------------------------------------
# HONEYPOT
#--------------------------------------------------------------------
# honeypot.hidden = 'true'
# honeypot.label = 'Fill This Field'
# honeypot.name = 'honeypot'
# honeypot.template = '<label>{label}</label><input type="text" name="{name}" value=""/>'
# honeypot.container = '<div style="display:none">{template}</div>'
#--------------------------------------------------------------------
# SECURITY
#--------------------------------------------------------------------
security.tokenName = 'webguard_token'
security.headerName = 'X-CSRF-TOKEN'
security.cookieName = 'webguard_cookie'
security.expires = 7200
security.regenerate = true
security.redirect = true
security.samesite = 'Lax'
#--------------------------------------------------------------------
# LOGGER
#--------------------------------------------------------------------
# logger.threshold = 4
#--------------------------------------------------------------------
# CUSTOMIZED
#--------------------------------------------------------------------
theme.path = 'themes/backend/focus2/'
themef.path = 'themes/frontend/tivo/'
api.return = 'json'
demo.mode = false
purchase.code = '1234'

2
ci4/.gitignore vendored
View File

@ -41,7 +41,7 @@ $RECYCLE.BIN/
#-------------------------
# These should never be under version control,
# as it poses a security risk.
.env
#.env
.vagrant
Vagrantfile

View File

@ -56,24 +56,27 @@ class Ajax extends ResourceController
//Total number of records without filtering
$totalRecords = $this->user_model->select('id_user')
->join('auth_user_group','auth_user_group.token = auth_user.group')
//->join('auth_user_group','auth_user_group.token = auth_user.group')
->countAllResults();
//Total number of records with filtering
$totalRecordwithFilter = $this->user_model->select('id_user')
->join('auth_user_group','auth_user_group.token = auth_user.group')
//->join('auth_user_group','auth_user_group.token = auth_user.group')
->orLike('first_name', $searchValue)
->orLike('email', $searchValue)
->countAllResults();
//Fetch records
$records = $this->user_model->select('auth_user.*,auth_user_group.title')
->join('auth_user_group','auth_user_group.token = auth_user.group')
//$records = $this->user_model->select('auth_user.*,auth_user_group.title')
$records = $this->user_model->select('auth_user.*')
//->join('auth_user_group','auth_user_group.token = auth_user.group')
->orLike('first_name', $searchValue)
->orLike('email', $searchValue)
->orderBy($columnName,$columnSortOrder)
->findAll($rowperpage, $start);
//Format records
foreach ($records as $key => $value){
if($records[$key]['email_confirmed'] == 1){
@ -96,10 +99,26 @@ class Ajax extends ResourceController
//Data records
$data = array();
foreach($records as $record ){
$groups_token = $this->group_user_model->select('token_group')
->where('token_user',$record['token'])
->findAll();
$groups_names = [];
foreach($groups_token as $g_t){
$title = $this->group_model->select('title')
->where('token',$g_t)
->first()['title'];
array_push($groups_names, $title);
}
$data[] = array(
"first_name"=>$record['first_name'],
"email"=>$record['email'],
"group"=>$record['title'],
"group"=>$groups_names,//JJO$record['title'],
"mobile"=>$record['mobile'],
"last_access"=>$record['last_access'],
"last_ip"=>$record['last_ip'],

View File

@ -11,6 +11,7 @@ use App\Models\SettingsModel;
use App\Models\TemplateModel;
use App\Models\UserModel;
use App\Models\UserGroupModel;
use App\Models\GroupUserModel;
class login extends BaseController
{
@ -23,6 +24,7 @@ class login extends BaseController
private $template_model;
private $confirmation_model;
private $integration;
private $group_user_model;
function __construct()
{
@ -38,6 +40,8 @@ class login extends BaseController
// Get Settings
$loginAuthFilter = new \App\Filters\LoginAuthFilter();
$loginAuthFilter->getSettings();
$this->group_user_model = new GroupUserModel();
}
public function index()
@ -184,17 +188,56 @@ class login extends BaseController
}
// Get access rules
$rules = $this->group_model->where('token', $login['group'])->first();
#$rules = $this->group_model->where('token', $login['group'])->first();
$groups = $this->group_user_model
->select('token_group')
->where('token_user',$login['token'])->findAll();
if (sizeof($groups)>1){
$rules = $this->group_model->select('rules')->where('token',$groups[0])->first()['rules'];
$rules = json_decode(html_entity_decode($rules), true);
for ($i=1; $i<sizeof($groups); $i++){
$temp_rules = $this->group_model->select('rules')->where('token',$groups[$i])->first()['rules'];
foreach ($rules as $key => $value){
if (array_key_exists($key, json_decode(html_entity_decode($temp_rules), true))){
$value2 = json_decode(html_entity_decode($temp_rules), true)[$key];
$rules[$key] = array_unique(array_merge($value, $value2));
}
else{
$rules[$key]= $value;
}
}
foreach (json_decode(html_entity_decode($temp_rules), true) as $key2 => $value2){
if (!array_key_exists($key2, $rules)){
$rules[$key2] = $value2;
}
}
}
}
else{
$rules = $this->group_model->select('rules')->where('token',$groups[0])->first();
}
// Save data in session
$session->set('id_user', $login['id_user']);
$session->set('group', $login['group']);
//$session->set('group', $login['group']);
$session->set('first_name', $login['first_name']);
$session->set('last_name', $login['last_name']);
$session->set('email', $login['email']);
$session->set('token', $login['token']);
$session->set('dashboard', $rules['dashboard']);
$session->set('rules', html_entity_decode($rules['rules']));
// JJO
$dashboard = 'user';
foreach ($groups as $group){
if($this->group_model->select('dashboard')->where('token',$group)->first()['dashboard'] == 'admin')
$dashboard = 'admin';
}
$session->set('dashboard', $dashboard);
$session->set('rules', html_entity_decode(json_encode($rules)));
$session->set('picture', $login['picture']);
$session->set('tfa', $login['tfa']);
$session->set('tfa_secret', $login['tfa_secret']);

View File

@ -3,22 +3,84 @@
namespace App\Controllers;
use App\Models\UserModel;
use App\Models\UserGroupModel;
use App\Models\GroupUserModel;
class Test extends BaseController
{
private $user_model;
private $group_user_model;
private $group_model;
function __construct()
{
$this->user_model = new UserModel();
$this->group_user_model = new GroupUserModel();
$this->group_model = new UserGroupModel();
}
public function index()
{
["id_user"]=>
string(1) "1"
$test = [
"115b5ad39b853084209caf6824224f6b",
"fff26488a4249d76a8de5c0426acb8f7",
"72f5e898a67bb2fb72b185d9138585b2"];
echo "Hola";
/////////////////////////////////7
// Join groups access rules
/*$user_token = "a4a60f9f064218b09cf108418e585507";
$groups = $this->group_user_model
->select('token_group')
->where('token_user', $user_token)->findAll();
if(sizeof($groups)>0){
$rules = html_entity_decode($this->group_model->select('rules')->where('token',$groups[0]['token_group'])->first()['rules']);
}
for ($i = 1; $i<sizeof($groups); $i++) {
echo var_dump($this->group_model->select('rules')->where('token',$groups[$i]['token_group'])->first()['rules']);
$rules = json_encode(
array_merge(
json_decode($rules, true),
json_decode($this->group_model->select('rules')->where('token',$groups[$i]['token_group'])->first()['rules'], true)
)
);
} */
$user_token = 'c0bf18621f78cb2ffc4a67cf8d5173c7';
$groups_token = $this->group_user_model->select('token_group')
->where('token_user',$user_token)
->findAll();
$groups_names = [];
foreach($groups_token as $g_t){
$title = $this->group_model->select('title')
->where('token',$g_t)
->first()['title'];
array_push($groups_names, $title);
}
echo '<pre>';
var_dump($groups_names);
echo '</pre>';
dd();
//Total number of records without filtering
$totalRecords = $this->user_model->select('id_user')
->join('auth_user_group','auth_user_group.token = auth_user.group')
->countAllResults();
//Total number of records with filtering
$totalRecordwithFilter = $this->user_model->select('id_user')
->join('auth_user_group','auth_user_group.token = auth_user.group')
->orLike('first_name', $searchValue)
->orLike('email', $searchValue)
->countAllResults();
}
}

View File

@ -81,9 +81,12 @@ class User extends BaseController
'icon' => 'fas fa-save'
];
$data['group'] = $this->group_user_model->select('token,title')->findAll();
$data['selected_groups'] = [];
$data['group'] = $this->group_model->select('token,title')->findAll();
$data['country'] = $this->countries_model->select('code,name')->where('data_lang',session()->get('lang')??'en')->findAll();
echo view(getenv('theme.path').'main/header');
echo view(getenv('theme.path').'form/user/form',$data);
echo view(getenv('theme.path').'main/footer');
@ -132,6 +135,7 @@ class User extends BaseController
}
$data['selected_groups'] = $this->group_user_model->select('token_group')->where('token_user', $token)->findAll();
$data['group'] = $this->group_model->select('token,title')->findAll();
$data['country'] = $this->countries_model->select('code,name')->where('data_lang',session()->get('lang')??'en')->findAll();
@ -156,7 +160,7 @@ class User extends BaseController
$email = 'required|valid_email';
if(empty($this->request->getPost('id_user'))){
$email = 'required|valid_email|is_unique[user.email]';
$email = 'required|valid_email|is_unique[auth_user.email]';
$password = 'required|min_length[8]';
$confirm_password = 'matches[password]';
}else{
@ -200,7 +204,7 @@ class User extends BaseController
$phpass = new PasswordHash(8, true);
$this->user_model->save([
'id_user' => null,
'group' => $this->request->getPost('group'),
//'group' => $this->request->getPost('group'),
'first_name' => $this->request->getPost('first_name'),
'last_name' => $this->request->getPost('last_name'),
'date_birth' => $date_birth,
@ -223,12 +227,6 @@ class User extends BaseController
}else{
echo "<pre>";
var_dump($this->request->getPost());
echo "</pre>" ;
dd();
$this->user_model->save([
'id_user' => $this->request->getPost('id_user'),
//'group' => $this->request->getPost('group'),
@ -254,22 +252,19 @@ class User extends BaseController
]);
}
// Update group_user pivot table
$user_token = $this->user_model
->select('token')
->where('id_user',$this->request->getPost('id_user'))->first();
$this->group_user_model->delete(['user_token' => $user_token]);
$groups = implode(",",$this->request->getPost('group')??[]);
->where('id_user',$this->request->getPost('id_user'))->first()['token'];
$this->group_user_model->where('token_user', $user_token)->delete();
$groups = $this->request->getPost('group');
foreach ($groups as $group){
$group_user_data = [
'token_user' => $this->request->getPost('id_user'),
'token_user' => $user_token,
'token_group' => $group
];
$this->group_user_model->insert($group_user_data);
}
}
@ -278,8 +273,40 @@ class User extends BaseController
return redirect()->to('/user');
}else{
if($session->get('id_user') == $this->request->getPost('id_user')){
$access_rules = $this->group_model->select('rules')->where('token',$this->request->getPost('group'))->first();
$session->set('rules', html_entity_decode($access_rules['rules']));
// Get groups tokens
$user_token = $this->user_model
->select('token')
->where('id_user',$this->request->getPost('id_user'))->first()['token'];
$groups = $this->group_user_model
->select('token_group')
->where('token_user',$user_token)->findAll();
if (sizeof($groups)>1){
$access_rules = $this->group_model->select('rules')->where('token',$groups[0])->first()['rules'];
$access_rules = json_decode(html_entity_decode($access_rules), true);
for ($i=1; $i<sizeof($groups); $i++){
$temp_rules = $this->group_model->select('rules')->where('token',$groups[$i])->first()['rules'];
foreach ($access_rules as $key => $value){
if (array_key_exists($key, json_decode(html_entity_decode($temp_rules), true))){
$value2 = json_decode(html_entity_decode($temp_rules), true)[$key];
$access_rules[$key] = array_unique(array_merge($value, $value2));
}
else{
$access_rules[$key]= $value;
}
}
foreach (json_decode(html_entity_decode($temp_rules), true) as $key2 => $value2){
if (!array_key_exists($key2, $access_rules)){
$access_rules[$key2] = $value2;
}
}
}
}
else{
$access_rules = $this->group_model->select('rules')->where('token',$groups)->first();
}
$session->set('rules', html_entity_decode(json_encode($access_rules)));
}
$session->setFlashdata('sweet', ['success',lang("App.user_alert_edit")]);
return redirect()->to('/user');

View File

@ -0,0 +1,19 @@
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class RemoveGroupFromUser extends Migration
{
public function up()
{
$this->forge->dropColumn('auth_user', ['group']);
}
public function down()
{
$sql = "ALTER TABLE `auth_user` ADD `group` varchar(216) COLLATE latin1_general_ci;";
$this->db->query($sql);
}
}

View File

@ -91,10 +91,14 @@
<?php
if ($id_select['token_group'] == $item['token']){
$selItem = 'selected';
break;
}
else{
$selItem = '';
}
?>
<?php endforeach; ?>
<option value="<?=$item['token']??''?>" <?= (isset($selItem))?'selected':'' ?>> <?=$item['title']??''?></option>
<option value="<?=$item['token']??''?>" <?= isset($selItem)?$selItem:"" ?>> <?=$item['title']??''?></option>
<?php endforeach; ?>
</select>
</div>