permissionNames["A"] = true; $this->permissionNames["D"] = true; $this->permissionNames["E"] = true; $this->permissionNames["S"] = true; $this->permissionNames["P"] = true; $this->permissionNames["I"] = true; $this->permissionNames["M"] = true; $this->cbxNames = array( 'add' => array('mask' => 'A', 'rightName' => 'add'), 'edt' => array('mask' => 'E', 'rightName' => 'edit'), 'del' => array('mask' => 'D', 'rightName' => 'delete'), 'lst' => array('mask' => 'S', 'rightName' => 'list'), 'exp' => array('mask' => 'P', 'rightName' => 'export'), 'imp' => array('mask' => 'I', 'rightName' => 'import'), 'adm' => array('mask' => 'M') ); // Set language params, if have more than one language $this->initLogin(); $this->setLangParams(); $this->sortTables(); $this->fillGroupsArr(); } /** * select groups list */ function fillGroupsArr() { global $cman; $grConnection = $cman->getForUserGroups(); $this->groups[-1] = "<".mlang_message("AA_GROUP_ADMIN").">"; $this->groups[-2] = "<".mlang_message("AA_GROUP_DEFAULT").">"; $this->groups[-3] = "<".mlang_message("AA_GROUP_GUEST").">"; $sql = "select ". $grConnection->addFieldWrappers( "GroupID" ) .", ". $grConnection->addFieldWrappers( "Label" ) ." from ". $grConnection->addTableWrappers( "online account opening_uggroups" ) ." order by ". $grConnection->addFieldWrappers( "Label" ); $qResult = $grConnection->query( $sql ); while( $tdata = $qResult->fetchNumeric() ) { $this->groups[ $tdata[0] ] = $tdata[1]; } } /** * Fill and prepare rights array * Call it only after save new data, for get fresh data */ function fillSmartyAndRights() { $first = true; foreach($this->groups as $id => $name) { $sg = array(); $sg["group_attrs"] = "value=\"".$id."\""; if( $first ) { $sg["group_class"] = "active"; $first = false; } $sg["groupname"] = runner_htmlspecialchars($name); $this->smartyGroups[] = $sg; } } /** * Fill rights array * Call it only after save new data, for get fresh data */ function getRights() { // It's expected that $this->tName is equal to 'admin_right' so the page's db connection is used #9875 $sql = "select ". $this->connection->addFieldWrappers( "GroupID" ) .", ". $this->connection->addFieldWrappers( "TableName" ) .", ". $this->connection->addFieldWrappers( "AccessMask" ) ." from ". $this->connection->addTableWrappers( "online account opening_ugrights" ) ." order by ". $this->connection->addFieldWrappers( "GroupID" ); $qResult = $this->connection->query( $sql ); while( $tdata = $qResult->fetchNumeric() ) { $group = $tdata[0]; $table = $tdata[1]; $mask = $tdata[2]; // check whether the table exists in the project if( !isset($this->tables[ $table ]) ) continue; // check whether the group exists if( !isset($this->groups[ $group ]) ) continue; // add permissions if( !isset($this->rights[ $table ]) ) $this->rights[ $table ] = array(); $this->rights[ $table ][ $group ] = $this->fixMask($mask, $this->pageMasks[ $table ]); } } /** * Prepare JS arrays with groups and tables data */ function addJsGroupsAndRights() { $this->jsSettings['tableSettings'][$this->tName]['warnOnLeaving'] = true; $this->jsSettings['tableSettings'][$this->tName]['rights'] = $this->rights; $this->jsSettings['tableSettings'][$this->tName]['groups'] = $this->groups; $this->jsSettings['tableSettings'][$this->tName]['tables'] = $this->tables; $this->jsSettings['tableSettings'][$this->tName]['pageMasks'] = $this->pageMasks; $this->jsSettings['tableSettings'][$this->tName]['menuOrderedTables'] = $this->menuOrderedTables; $this->jsSettings['tableSettings'][$this->tName]['alphaOrderedTables'] = $this->alphaOrderedTables; } function commonAssign() { $this->xt->assign_loopsection("groups", $this->smartyGroups); parent::commonAssign(); // assign headcheckboxes foreach( $this->permissionNames as $perm => $t ) { $this->xt->assign( $perm."_headcheckbox", " id=\"colbox".$perm."\" data-perm=\"".$perm."\""); } // assign attrs $this->xt->assign("addgroup_attrs", "id=\"addGroupBtn\""); $this->xt->assign("delgroup_attrs", "id=\"delGroupBtn\""); $this->xt->assign("rengroup_attrs", "id=\"renGroupBtn\""); $this->xt->assign("savegroup_attrs", "id=\"saveGroupBtn\""); $this->xt->assign("savebutton_attrs", "id=\"saveBtn\""); $this->xt->assign("resetbutton_attrs", "id=\"resetBtn\""); $this->xt->assign("cancelgroup_attrs", "id=\"cancelBtn\""); // assign blocks $this->xt->assign("grid_block", true); $this->xt->assign("menu_block", true); $this->xt->assign("left_block", true); $this->xt->assign("rights_block", true); $this->xt->assign("message_block", true); $this->xt->assign("security_block", true); $this->xt->assign("logoutbutton",isSingleSign()); $this->xt->assign("savebuttons_block", true); $this->xt->assign("search_records_block", true); $this->xt->assign("recordcontrols_block", true); // assign user settings // The user might rewrite $_SESSION["UserName"] value with HTML code in an event, so no encoding will be performed while printing this value. $this->xt->assign("username", $_SESSION["UserName"]); if ($this->createLoginPage) $this->xt->assign("userid", runner_htmlspecialchars($_SESSION["UserID"])); $this->xt->displayBrickHidden("message"); $this->prepareBreadcrumbs("adminarea"); } /** * Sort tables array * @param unknown_type $tables */ function sortTables() { // build $this->alphaOrderedTables and $this->sortedTables $this->sortedTables = array(); // order tables by caption foreach($this->tables as $table => $tbl) { $this->sortedTables[] = array($table, $tbl[1]); } usort( $this->sortedTables, "rightsSortFunc" ); $this->alphaOrderedTables = array(); foreach($this->sortedTables as $t) { $this->alphaOrderedTables[] = $t[0]; } // build $this->menuOrderedTables $this->menuOrderedTables = array(); $menu = $this->getMenuNodes(); $addedTables = array(); $groupsMap = array(); foreach($menu as $m) { $arr = array(); if ( $m["pageType"] == "WebReports" || $m["type"] == "Separator" ) continue; if( $m["table"] && !$addedTables[ $m["table"] ] ) { $addedTables[ $m["table"] ] = true; $arr["table"] = $m["table"]; } // else if( $m["type"] == "Leaf" ) // continue; if( $m["parent"] ) { $arr["parent"] = $groupsMap[ $m["parent"] ]; $this->menuOrderedTables[ $arr["parent"] ]["items"][] = count($this->menuOrderedTables); } if( true || $m["type"] == "Group" ) { $groupsMap[ $m["id"] ] = count($this->menuOrderedTables); // add all groups $arr["title"] = $m["title"]; $arr["items"] = array(); $arr["collapsed"] = true; } $this->menuOrderedTables[] = $arr; } // add the rest of tables alphabetically if(count($this->alphaOrderedTables) > count($addedTables)) { $unlistedId = count($this->menuOrderedTables); $arr = array(); $arr["collapsed"] = true; $arr["title"] = mlang_message("UNLISTED"); $arr["items"] = array(); $this->menuOrderedTables[] = $arr; foreach( $this->alphaOrderedTables as $table) { if( !$addedTables[ $table ] ) { $this->menuOrderedTables[$unlistedId]["items"][] = count( $this->menuOrderedTables ); $this->menuOrderedTables[] = array( "table" => $table, "parent" => $unlistedId); } } } } /** * Get items count in group * @param item index */ function getItemsCount($itemIdx) { $count = 0; foreach($this->menuOrderedTables[$itemIdx]["items"] as $idx) { if(isset($this->menuOrderedTables[$idx]["items"])) $count += $this->getItemsCount($idx); if(isset($this->menuOrderedTables[$idx]["table"])) $count++; } return $count; } /** * Fills info in array about grid. * @param array $rowInfoArr array with total info, that assignes grid */ function fillTablesGrid(&$rowInfoArr) { // fill $rowInfoArr array $rowClass = false; $recno = 1; $editlink = ""; $copylink = ""; $parentStack = array(); foreach($this->menuOrderedTables as $idx => $tbl) { $table = @$tbl["table"]; $parent = @$tbl["parent"]; if( strlen($table) ) { $caption = $this->tables[$table][1]; $shortTable = $this->tables[$table][0]; $row = array(); if($caption == $table) $row["tablename"] = runner_htmlspecialchars($table); else $row["tablename"] = "".runner_htmlspecialchars($caption)." (".runner_htmlspecialchars($table).")"; $row["tablerowattrs"] = " id=\"row_".$shortTable."\""; $row["tablecheckbox_attrs"]= "id=\"rowbox".$shortTable."\" data-table=\"".$shortTable."\" data-checked=0"; $row["tbl_cell"] = " id=\"tblcell".$shortTable."\""; // create permission controls $mask = $this->pageMasks[$table]; foreach( $this->permissionNames as $perm => $x ) { if( strpos($mask, $perm) === FALSE ) continue; $row[$perm."_group"] = true; $row[$perm."_checkbox"] = " id=\"box".$perm.$shortTable."\" data-checked=0"; $row[$perm."_cell"] = " id=\"cell".$perm.$shortTable."\""; } } else { $title = $tbl["title"]; $row = array(); $row["tablename"] = runner_htmlspecialchars($title); $row["tablecheckbox_attrs"]= " data-checked=-2"; $row["tablerowattrs"] = " id=\"grouprow_".$idx."\""; } if(!isset($parent)) { // clear stack $parentStack = array(); } else { $stackPos = array_search( $parent, $parentStack ); if( $stackPos === FALSE ) $parentStack[] = $parent; else { $parentStack = array_slice( $parentStack, 0, $stackPos + 1); } $row["tblrowclass"] .= "rightsindent" . count($parentStack); } $childrenCount = $this->getItemsCount($idx); if( isset($tbl["items"]) && $childrenCount ) { $row["tablename"] .= " (".$this->getItemsCount($idx).")"; $row["tablerowattrs"] .= " data-groupid=\"".$idx."\""; $row["groupControl"] = true; $row["groupControlState"] = " data-state='closed'"; $row["groupControlClass"] = " data-state='closed'"; $row["tblrowclass"] .= " menugroup"; if( !strlen($table) ) { // the item is just a group // add the class to hide it in alpha mode $row["tblrowclass"] .= " menugrouponly"; } } else if( !strlen($table) ) { // empty menu group continue; } // hide second-level tables initially if($parent) { $row["tablerowattrs"] .= " style='display:none;'"; } $rowInfoArr[] = $row; } } /** * Fill premissions grid */ function fillGridData() { // fill $rowinfo array $rowInfo = array(); $this->fillTablesGrid($rowInfo); $this->xt->assign_loopsection("grid_row", $rowInfo); } /** * Fill session vars, override parent, do nothing */ function setSessionVariables() { } /** * Main function, call to build page * Do not change methods call oreder!! */ function prepareForBuildPage() { // prepare array, only after save, for get new data $this->fillSmartyAndRights(); // get rights, only after save, for fresh data $this->getRights(); // fill grid data $this->fillGridData(); // add common js code $this->addCommonJs(); // add common html code $this->addCommonHtml(); // Set common assign $this->commonAssign(); // build admin block $this->assignAdmin(); } /** * show page at the end of its proccess, depending on mode */ function showPage() { $this->display($this->templatefile); } /** * Adds HTML and JS */ function addCommonHtml() { $this->body ["begin"] .= GetBaseScriptsForPage($this->isDisplayLoading); // assign body end $this->body['end'] = XTempl::create_method_assignment( "assignBodyEnd", $this ); } /** * A stub */ function prepareForResizeColumns() { } /** * Add js files and scripts */ function addCommonJs() { // call parent if need RunnerJS API RunnerPage::addCommonJs(); $this->addJsGroupsAndRights(); } /** * Removes permissions from $mask that are not defined in $possibleMask * I.e. $mask = "ADE", $possibleMask = "AESP", return "AE" */ function fixMask($mask, $possibleMask) { $outMask = ""; $l = strlen($possibleMask); for($i=0; $i < $l; ++$i) { if(strpos($mask, $possibleMask[$i]) !== FALSE) $outMask .= $possibleMask[$i]; } return $outMask; } function saveRights( &$modifiedRights ) { foreach($modifiedRights as $group => $rights) { foreach($modifiedRights[$group] as $table => $mask) { $this->updateTablePermissions($table, $group, $mask); } } echo my_json_encode(array( 'success' => true )); } /** * Save permissions for those pages only, that are defined in the project. * This is required when using the same permission tables in several projects * @param String table * @param Number group * @param String mask */ function updateTablePermissions( $table, $group, $mask ) { $rightWTableName = $this->connection->addTableWrappers( "online account opening_ugrights" ); $accessMaskWFieldName = $this->connection->addFieldWrappers( "AccessMask" ); $groupisWFieldName = $this->connection->addFieldWrappers( "GroupID" ); $tableNameWFieldName = $this->connection->addFieldWrappers( "TableName" ); $groupWhere = $groupisWFieldName."=". $group ." and ". $tableNameWFieldName ."=". $this->connection->prepareString( $table ); // It's expected that $this->tName is equal to 'admin_right' so the page's db connection is used #9875 $sql = "select ". $accessMaskWFieldName ." from ". $rightWTableName. "where" . $groupWhere; // select rights from the database $data = $this->connection->query( $sql )->fetchNumeric(); if( $data ) { // correct the mask according to the table's pageMask $savedMask = $data[0]; $pageMask = $this->pageMasks[$table]; $correctedMask = ""; foreach( $this->permissionNames as $perm => $t ) { if( strpos( $pageMask, $perm ) !== false ) { if( strpos( $mask, $perm ) !== false ) $correctedMask.= $perm; } else { if( strpos( $savedMask, $perm ) !== false ) $correctedMask.= $perm; } } $mask = $correctedMask; if( strlen($mask) ) $sql = "update ". $rightWTableName ." set ". $accessMaskWFieldName ."='". $mask ."' where ". $groupWhere; else $sql = "delete from ". $rightWTableName ." where ". $groupWhere; } else { if( !strlen($mask) ) return; $sql = "insert into ". $rightWTableName ." (". $groupisWFieldName .", ".$tableNameWFieldName.", ". $accessMaskWFieldName .")" ." values (". $group .", ".$this->connection->prepareString( $table ).", '". $mask ."')"; } $this->connection->exec( $sql ); } } function rightsSortFunc($a, $b) { if($a[1]==$b[1]) return 0; if($a[1]<$b[1]) return -1; return 1; } ?>