GetUserOperations();
$adminuser = ($userops->UserInGroup($userid,1) || $userid == 1);
$group_name = '';
$message = '';
include_once("header.php");
$db = $gCms->GetDb();
$smarty = $gCms->GetSmarty();
$load_perms = function() use ($db) {
$query = "SELECT p.permission_id, p.permission_source, p.permission_text, up.group_id FROM ".
cms_db_prefix()."permissions p LEFT JOIN ".cms_db_prefix().
"group_perms up ON p.permission_id = up.permission_id ORDER BY p.permission_text";
$result = $db->Execute($query);
// use hooks to localize permissions.
\CMSMS\HookManager::add_hook('localizeperm',function($perm_name){
$key = 'perm_'.str_replace(' ','_',$perm_name);
if( \CmsLangOperations::lang_key_exists('admin',$key) ) return \CmsLangOperations::lang_from_realm('admin',$key);
return $perm_name;
},\CMSMS\HookManager::PRIORITY_HIGH);
\CMSMS\HookManager::add_hook('getperminfo',function($perm_name){
$key = 'permdesc_'.str_replace(' ','_',$perm_name);
if( \CmsLangOperations::lang_key_exists('admin',$key) ) return \CmsLangOperations::lang_from_realm('admin',$key);
// return null
},\CMSMS\HookManager::PRIORITY_HIGH);
$perm_struct = array();
while($result && $row = $result->FetchRow()) {
if (isset($perm_struct[$row['permission_id']])) {
$str = &$perm_struct[$row['permission_id']];
$str->group[$row['group_id']]=1;
}
else {
$thisPerm = new \stdClass();
$thisPerm->group = array();
if (!empty($row['group_id'])) $thisPerm->group[$row['group_id']] = 1;
$thisPerm->id = $row['permission_id'];
$thisPerm->name = $thisPerm->label = $row['permission_text'];
$thisPerm->source = $row['permission_source'];
$thisPerm->label = \CMSMS\HookManager::do_hook_first_result('localizeperm',$thisPerm->name);
$thisPerm->description = \CMSMS\HookManager::do_hook_first_result('getperminfo',$thisPerm->name);
$perm_struct[$row['permission_id']] = $thisPerm;
}
}
return $perm_struct;
};
$group_perms = function($in_struct) {
usort($in_struct,function($a,$b){
// sort by name
return strcasecmp($a->name,$b->name);
});
$out = [];;
foreach( $in_struct as $one ) {
$source = $one->source;
if( !isset($out[$source]) ) $out[$source] = [];
$out[$source][] = $one;
}
uksort($out,function($a,$b){
$a = strtolower($a);
$b = strtolower($b);
if( $a == 'core' ) return -1;
if( $b == 'core' ) return 1;
if( empty($a) ) return 1;
if( empty($b) ) return 1;
return strcmp($a,$b);
});
return $out;
};
if (!$access) die('permission denied');
if( isset($_POST['filter']) ) {
$disp_group = $_POST['groupsel'];
cms_userprefs::set_for_user($userid,'changegroupassign_group',$disp_group);
}
$disp_group = cms_userprefs::get_for_user($userid,'changegroupassign_group',-1);
// always display the group pull down
$groupops = $gCms->GetGroupOperations();
$tmp = new stdClass();
$tmp->name = lang('all_groups');
$tmp->id=-1;
$allgroups = array($tmp);
$sel_groups = array($tmp);
$group_list = $groupops->LoadGroups();
$sel_group_ids = array();
foreach( $group_list as $onegroup ) {
if( $onegroup->id == 1 && $adminuser == false ) continue;
$allgroups[] = $onegroup;
if( $disp_group == -1 || $disp_group == $onegroup->id ) {
$sel_groups[] = $onegroup;
$sel_group_ids[] = $onegroup->id;
}
}
$smarty->assign('group_list',$sel_groups);
$smarty->assign('allgroups',$allgroups);
if ($submitted == 1) {
// we have group permissions
$now = $db->DbTimeStamp(time());
$iquery = "INSERT INTO ".cms_db_prefix().
"group_perms (group_perm_id, group_id, permission_id, create_date, modified_date)
VALUES (?,?,?,$now,$now)";
$parts = explode('::',$_POST['sel_groups']);
if( count($parts) == 2 ) {
if( md5(__FILE__.$parts[1]) == $parts[0] ) {
$selected_groups = (array) json_decode(base64_decode($parts[1]),TRUE);
if( is_array($selected_groups) && count($selected_groups) ) {
// clean this array
$tmp = array();
foreach( $selected_groups as &$one ) {
$one = (int)$one;
if( $one > 0 ) $tmp[] = $one;
}
$query = 'DELETE FROM '.cms_db_prefix().'group_perms WHERE group_id IN ('.implode(',',$tmp).')';
$db->Execute($query);
}
unset($selected_groups);
}
}
unset($parts);
foreach ($_POST as $key=>$value) {
if (strpos($key,"pg") == 0 && strpos($key,"pg") !== false) {
$keyparts = explode('_',$key);
$keyparts[1] = (int)$keyparts[1];
if ($keyparts[1] > 0 && $keyparts[2] != '1' && $value == '1') {
$new_id = $db->GenID(cms_db_prefix()."group_perms_seq");
$result = $db->Execute($iquery, array($new_id,$keyparts[2],$keyparts[1]));
if( !$result ) {
echo "FATAL: ".$db->ErrorMsg().'
'.$db->sql; exit();
}
}
}
}
// put mention into the admin log
audit($userid, 'Permission Group ID: '.$userid, 'Changed');
$message = lang('permissionschanged');
$gCms->clear_cached_files();
}
$perm_struct = $load_perms();
$perm_struct = $group_perms($perm_struct);
$smarty->assign('perms',$perm_struct);
$smarty->assign('cms_secure_param_name',CMS_SECURE_PARAM_NAME);
$smarty->assign('cms_user_key',$_SESSION[CMS_USER_KEY]);
$smarty->assign('form_start','