Index: trunk/admin/relation_select.php =================================================================== diff -u -N -r4457 -r4689 --- trunk/admin/relation_select.php (.../relation_select.php) (revision 4457) +++ trunk/admin/relation_select.php (.../relation_select.php) (revision 4689) @@ -33,8 +33,11 @@ $application->Init(); $application->ProcessRequest(); -$application->InitParser(); -$application->ProcessParsedTag('adm', 'StoreMainPrefix', Array()); +// save K4 redirection from popup stuff: begin +$application->LinkVar('main_prefix'); // window prefix, that opened selector +$application->LinkVar('dst_field'); // field to set value choosed in selector +$application->LinkVar('return_template'); // template to go, when something was coosen from popup (from finalizePopup) +// save K4 redirection from popup stuff: end if( $application->GetVar('CatId') ) $application->SetVar('m_cat_id', $application->GetVar('CatId') ); //KERNEL4 END Index: trunk/core/units/categories/categories_config.php =================================================================== diff -u -N -r4675 -r4689 --- trunk/core/units/categories/categories_config.php (.../categories_config.php) (revision 4675) +++ trunk/core/units/categories/categories_config.php (.../categories_config.php) (revision 4689) @@ -53,7 +53,7 @@ 'tree_site' => Array('format' => '!la_selecting_categories!'), ), - 'PermSection' => Array(/*'search' => 'in-portal:configuration_search',*/ 'email' => 'in-portal:configuration_email', 'custom' => 'in-portal:configuration_custom'), + 'PermSection' => Array('main' => 'in-portal:categories', /*'search' => 'in-portal:configuration_search',*/ 'email' => 'in-portal:configuration_email', 'custom' => 'in-portal:configuration_custom'), 'Sections' => Array( // "Structure & Data" section Index: trunk/core/kernel/event_handler.php =================================================================== diff -u -N -r4637 -r4689 --- trunk/core/kernel/event_handler.php (.../event_handler.php) (revision 4637) +++ trunk/core/kernel/event_handler.php (.../event_handler.php) (revision 4689) @@ -308,46 +308,10 @@ */ function CheckPermission(&$event) { - $section = $event->getSection(); - $main_prefix = $this->Application->GetTopmostPrefix($event->Prefix); - - $pefix_type = ($main_prefix == $event->Prefix) ? 'self' : 'subitem'; - $perm_mapping = getArrayValue($this->permMapping, $event->Name); - - if (!$perm_mapping[$pefix_type]) { - trigger_error('Permission mappings not defined for event '.$main_prefix.' <- '.$event->Prefix.':'.$event->Name.'', E_USER_ERROR); - } - - $perm_status = false; - if ($perm_mapping[$pefix_type] === true) { - // event is defined in mapping but is not checked by permissions - return true; - } - - $check_perms = explode('|', $perm_mapping[$pefix_type]); - - foreach ($check_perms as $perm_name) { - // check if at least one of required permissions is set - $perm_name = $section.'.'.$perm_name; - $perm_status = $this->Application->CheckPermission($perm_name, 1); - if (($perm_name == $section.'.add') && $perm_status && ($main_prefix == $event->Prefix)) { - // main item, add permission allowed, but ID is > 0, then deny permission - // how to get id here - } - if ($perm_status) { - return $perm_status; - } - } - - if (!$perm_status) { - // for debugging purposes - $event->SetRedirectParam('section', $section); - $event->SetRedirectParam('main_prefix', $main_prefix); - $event->SetRedirectParam('event_name', $event->Name); - $event->status = erPERM_FAIL; - } - return $perm_status; + $perm_helper =& $this->Application->recallObject('PermissionsHelper'); + return $perm_helper->CheckPermission($event, $this->permMapping); } + } Index: trunk/kernel/units/categories/categories_config.php =================================================================== diff -u -N -r4675 -r4689 --- trunk/kernel/units/categories/categories_config.php (.../categories_config.php) (revision 4675) +++ trunk/kernel/units/categories/categories_config.php (.../categories_config.php) (revision 4689) @@ -53,7 +53,7 @@ 'tree_site' => Array('format' => '!la_selecting_categories!'), ), - 'PermSection' => Array(/*'search' => 'in-portal:configuration_search',*/ 'email' => 'in-portal:configuration_email', 'custom' => 'in-portal:configuration_custom'), + 'PermSection' => Array('main' => 'in-portal:categories', /*'search' => 'in-portal:configuration_search',*/ 'email' => 'in-portal:configuration_email', 'custom' => 'in-portal:configuration_custom'), 'Sections' => Array( // "Structure & Data" section Index: trunk/kernel/units/reviews/reviews_event_handler.php =================================================================== diff -u -N -r4637 -r4689 --- trunk/kernel/units/reviews/reviews_event_handler.php (.../reviews_event_handler.php) (revision 4637) +++ trunk/kernel/units/reviews/reviews_event_handler.php (.../reviews_event_handler.php) (revision 4689) @@ -27,8 +27,6 @@ $main_prefix = $this->Application->GetTopmostPrefix($event->Prefix); // this will return LINK for l, ARTICLE for n, TOPIC for bb, PRODUCT for p $item_prefix = $this->Application->getUnitOption($main_prefix, 'PermItemPrefix'); - - if (!$item_prefix) $item_prefix = 'PRODUCT'; return $item_prefix; } Index: trunk/core/kernel/event_manager.php =================================================================== diff -u -N -r4637 -r4689 --- trunk/core/kernel/event_manager.php (.../event_manager.php) (revision 4637) +++ trunk/core/kernel/event_manager.php (.../event_manager.php) (revision 4689) @@ -265,6 +265,7 @@ $event->redirect = true; $event_handler =& $this->Application->recallObject($event->Prefix.'_EventHandler'); + $event->setEventParam('top_prefix', $this->Application->GetTopmostPrefix($event->Prefix)); if (($this->Application->GetVar('u_id') == -1) || $event_handler->CheckPermission($event)) { $this->HandleEvent($event); } Index: trunk/core/units/reviews/reviews_event_handler.php =================================================================== diff -u -N -r4637 -r4689 --- trunk/core/units/reviews/reviews_event_handler.php (.../reviews_event_handler.php) (revision 4637) +++ trunk/core/units/reviews/reviews_event_handler.php (.../reviews_event_handler.php) (revision 4689) @@ -27,8 +27,6 @@ $main_prefix = $this->Application->GetTopmostPrefix($event->Prefix); // this will return LINK for l, ARTICLE for n, TOPIC for bb, PRODUCT for p $item_prefix = $this->Application->getUnitOption($main_prefix, 'PermItemPrefix'); - - if (!$item_prefix) $item_prefix = 'PRODUCT'; return $item_prefix; } Index: trunk/kernel/action.php =================================================================== diff -u -N -r4645 -r4689 --- trunk/kernel/action.php (.../action.php) (revision 4645) +++ trunk/kernel/action.php (.../action.php) (revision 4689) @@ -2338,7 +2338,7 @@ $rs->MoveNext(); } - if(($_REQUEST['CategoryId'] > 0) || ($Action == 'm_add_category')) // not root category is updated + if(($_REQUEST['CategoryId'] > 0) || ($Action == 'm_add_category') || ($Action == 'm_edit_category')) // not root category is updated { $cat_ids = $objCatList->CopyFromEditTable("CategoryId"); if ($cat_ids) { Index: trunk/core/units/general/helpers/permissions_helper.php =================================================================== diff -u -N -r4611 -r4689 --- trunk/core/units/general/helpers/permissions_helper.php (.../permissions_helper.php) (revision 4611) +++ trunk/core/units/general/helpers/permissions_helper.php (.../permissions_helper.php) (revision 4689) @@ -49,6 +49,157 @@ { return $section_name == 'in-portal:root' && $perm_name != 'view'; } + + /** + * Returns permission names to check based on event name and item prefix (main item or subitem) + * + * @param kEvent $event + * @return Array + */ + function getPermissionByEvent(&$event, $perm_mapping) + { + $top_prefix = $event->getEventParam('top_prefix'); + + $pefix_type = ($top_prefix == $event->Prefix) ? 'self' : 'subitem'; + $perm_mapping = getArrayValue($perm_mapping, $event->Name); + + if (!$perm_mapping[$pefix_type]) { + trigger_error('Permission mappings not defined for event '.$top_prefix.' <- '.$event->Prefix.':'.$event->Name.'', E_USER_ERROR); + } + + if ($perm_mapping[$pefix_type] === true) { + // event is defined in mapping but is not checked by permissions + return true; + } + + return explode('|', $perm_mapping[$pefix_type]); + } + + /** + * Checks permissions of user + * + * @param kEvent $event + */ + function CheckPermission(&$event, $perm_mapping) + { + $section = $event->getSection(); + if (preg_match('/^CATEGORY:(.*)/', $section)) { + return $this->CheckCategoryPermission($event, $perm_mapping); + } + + $top_prefix = $event->getEventParam('top_prefix'); + $check_perms = $this->getPermissionByEvent($event, $perm_mapping); + + if ($check_perms === true) { + // event is defined in mapping but is not checked by permissions + return true; + } + + $perm_status = false; + foreach ($check_perms as $perm_name) { + // check if at least one of required permissions is set + $perm_name = $section.'.'.$perm_name; + $perm_status = $this->Application->CheckPermission($perm_name, 1); + if (($perm_name == $section.'.add') && $perm_status && ($top_prefix == $event->Prefix)) { + // main item, add permission allowed, but ID is > 0, then deny permission + // how to get id here + } + if ($perm_status) { + return $perm_status; + } + } + + if (!$perm_status) { + // for debugging purposes + $event->SetRedirectParam('section', $section); + $event->SetRedirectParam('main_prefix', $top_prefix); + $event->SetRedirectParam('event_name', $event->Name); + $event->status = erPERM_FAIL; + } + return $perm_status; + } + + /** + * Check permissions + * + * @param kEvent $event + */ + function CheckCategoryPermission(&$event, $event_perm_mapping) + { + // would be better to check this too, but we have no such ermission for now + /*if ($event->Name == 'OnRateProduct') { + return $this->Application->CheckPermission('PRODUCT.RATE', 0); + }*/ + + // mapping between specific permissions and common permissions + $perm_mapping = Array('add' => 'ADD', 'edit' => 'MODIFY', 'delete' => 'DELETE', 'view' => 'VIEW'); + + $top_prefix = $event->getEventParam('top_prefix'); + $event_handler =& $this->Application->recallObject($event->Prefix.'_EventHandler'); + if ($event->Prefix != $top_prefix) { + $top_event = new kEvent($top_prefix.':'.$event->Name); + $id = $event_handler->getPassedID($top_event); + } + else { + $id = $event_handler->getPassedID($event); + } + + $item_prefix = $this->Application->getUnitOption($top_prefix, 'PermItemPrefix'); + + // 1. get primary category of category item + $id_field = $this->Application->getUnitOption($top_prefix, 'IDField'); + $table_name = $this->Application->getUnitOption($top_prefix, 'TableName'); + $ci_table = $this->Application->getUnitOption($top_prefix.'-ci', 'TableName'); + + if (!$id) { + // item being created -> check by current (before editing started, saved in OnPreCreate event) category permissions + $category_id = $this->Application->RecallVar('m_cat_id'); + } + else { + // item being edited -> check by it's primary category permissions + $sql = 'SELECT ci.CategoryId + FROM '.$table_name.' main_table + LEFT JOIN '.$ci_table.' ci ON ci.ItemResourceId = main_table.ResourceId + WHERE (main_table.'.$id_field.' = '.$id.') AND (ci.PrimaryCat = 1)'; + $category_id = $this->Conn->GetOne($sql); + } + + if ((substr($event->Name, 0, 9) == 'OnPreSave') || ($event->Name == 'OnSave')) { + if ($event_handler->isNewItemCreate($event)) { + return $this->Application->CheckPermission($item_prefix.'.ADD', 0, $category_id); + } + else { + return $this->Application->CheckPermission($item_prefix.'.ADD', 0, $category_id) || $this->Application->CheckPermission($item_prefix.'.MODIFY', 0, $category_id); + } + } + + $perm_status = false; + $check_perms = $this->getPermissionByEvent($event, $event_perm_mapping); + + foreach ($check_perms as $perm_name) { + // check if at least one of required permissions is set + if (!isset($perm_mapping[$perm_name])) { + // not mapped permission (e.g. advanced:approve) -> skip + continue; + } + $perm_name = $item_prefix.'.'.$perm_mapping[$perm_name]; + echo 'event_name: '.$event->Name.'; permission: '.$perm_name.'
'; + $perm_status = $this->Application->CheckPermission($perm_name, 0, $category_id); + + if ($perm_status) { + return $perm_status; + } + } + + if (!$perm_status) { + // for debugging purposes + $event->SetRedirectParam('section', $event->getSection()); + $event->SetRedirectParam('main_prefix', $top_prefix); + $event->SetRedirectParam('event_name', $event->Name); + $event->status = erPERM_FAIL; + } + return $perm_status; + } } ?> \ No newline at end of file Index: trunk/kernel/units/general/helpers/permissions_helper.php =================================================================== diff -u -N -r4611 -r4689 --- trunk/kernel/units/general/helpers/permissions_helper.php (.../permissions_helper.php) (revision 4611) +++ trunk/kernel/units/general/helpers/permissions_helper.php (.../permissions_helper.php) (revision 4689) @@ -49,6 +49,157 @@ { return $section_name == 'in-portal:root' && $perm_name != 'view'; } + + /** + * Returns permission names to check based on event name and item prefix (main item or subitem) + * + * @param kEvent $event + * @return Array + */ + function getPermissionByEvent(&$event, $perm_mapping) + { + $top_prefix = $event->getEventParam('top_prefix'); + + $pefix_type = ($top_prefix == $event->Prefix) ? 'self' : 'subitem'; + $perm_mapping = getArrayValue($perm_mapping, $event->Name); + + if (!$perm_mapping[$pefix_type]) { + trigger_error('Permission mappings not defined for event '.$top_prefix.' <- '.$event->Prefix.':'.$event->Name.'', E_USER_ERROR); + } + + if ($perm_mapping[$pefix_type] === true) { + // event is defined in mapping but is not checked by permissions + return true; + } + + return explode('|', $perm_mapping[$pefix_type]); + } + + /** + * Checks permissions of user + * + * @param kEvent $event + */ + function CheckPermission(&$event, $perm_mapping) + { + $section = $event->getSection(); + if (preg_match('/^CATEGORY:(.*)/', $section)) { + return $this->CheckCategoryPermission($event, $perm_mapping); + } + + $top_prefix = $event->getEventParam('top_prefix'); + $check_perms = $this->getPermissionByEvent($event, $perm_mapping); + + if ($check_perms === true) { + // event is defined in mapping but is not checked by permissions + return true; + } + + $perm_status = false; + foreach ($check_perms as $perm_name) { + // check if at least one of required permissions is set + $perm_name = $section.'.'.$perm_name; + $perm_status = $this->Application->CheckPermission($perm_name, 1); + if (($perm_name == $section.'.add') && $perm_status && ($top_prefix == $event->Prefix)) { + // main item, add permission allowed, but ID is > 0, then deny permission + // how to get id here + } + if ($perm_status) { + return $perm_status; + } + } + + if (!$perm_status) { + // for debugging purposes + $event->SetRedirectParam('section', $section); + $event->SetRedirectParam('main_prefix', $top_prefix); + $event->SetRedirectParam('event_name', $event->Name); + $event->status = erPERM_FAIL; + } + return $perm_status; + } + + /** + * Check permissions + * + * @param kEvent $event + */ + function CheckCategoryPermission(&$event, $event_perm_mapping) + { + // would be better to check this too, but we have no such ermission for now + /*if ($event->Name == 'OnRateProduct') { + return $this->Application->CheckPermission('PRODUCT.RATE', 0); + }*/ + + // mapping between specific permissions and common permissions + $perm_mapping = Array('add' => 'ADD', 'edit' => 'MODIFY', 'delete' => 'DELETE', 'view' => 'VIEW'); + + $top_prefix = $event->getEventParam('top_prefix'); + $event_handler =& $this->Application->recallObject($event->Prefix.'_EventHandler'); + if ($event->Prefix != $top_prefix) { + $top_event = new kEvent($top_prefix.':'.$event->Name); + $id = $event_handler->getPassedID($top_event); + } + else { + $id = $event_handler->getPassedID($event); + } + + $item_prefix = $this->Application->getUnitOption($top_prefix, 'PermItemPrefix'); + + // 1. get primary category of category item + $id_field = $this->Application->getUnitOption($top_prefix, 'IDField'); + $table_name = $this->Application->getUnitOption($top_prefix, 'TableName'); + $ci_table = $this->Application->getUnitOption($top_prefix.'-ci', 'TableName'); + + if (!$id) { + // item being created -> check by current (before editing started, saved in OnPreCreate event) category permissions + $category_id = $this->Application->RecallVar('m_cat_id'); + } + else { + // item being edited -> check by it's primary category permissions + $sql = 'SELECT ci.CategoryId + FROM '.$table_name.' main_table + LEFT JOIN '.$ci_table.' ci ON ci.ItemResourceId = main_table.ResourceId + WHERE (main_table.'.$id_field.' = '.$id.') AND (ci.PrimaryCat = 1)'; + $category_id = $this->Conn->GetOne($sql); + } + + if ((substr($event->Name, 0, 9) == 'OnPreSave') || ($event->Name == 'OnSave')) { + if ($event_handler->isNewItemCreate($event)) { + return $this->Application->CheckPermission($item_prefix.'.ADD', 0, $category_id); + } + else { + return $this->Application->CheckPermission($item_prefix.'.ADD', 0, $category_id) || $this->Application->CheckPermission($item_prefix.'.MODIFY', 0, $category_id); + } + } + + $perm_status = false; + $check_perms = $this->getPermissionByEvent($event, $event_perm_mapping); + + foreach ($check_perms as $perm_name) { + // check if at least one of required permissions is set + if (!isset($perm_mapping[$perm_name])) { + // not mapped permission (e.g. advanced:approve) -> skip + continue; + } + $perm_name = $item_prefix.'.'.$perm_mapping[$perm_name]; + echo 'event_name: '.$event->Name.'; permission: '.$perm_name.'
'; + $perm_status = $this->Application->CheckPermission($perm_name, 0, $category_id); + + if ($perm_status) { + return $perm_status; + } + } + + if (!$perm_status) { + // for debugging purposes + $event->SetRedirectParam('section', $event->getSection()); + $event->SetRedirectParam('main_prefix', $top_prefix); + $event->SetRedirectParam('event_name', $event->Name); + $event->status = erPERM_FAIL; + } + return $perm_status; + } } ?> \ No newline at end of file Index: trunk/kernel/units/general/cat_event_handler.php =================================================================== diff -u -N -r4476 -r4689 --- trunk/kernel/units/general/cat_event_handler.php (.../cat_event_handler.php) (revision 4476) +++ trunk/kernel/units/general/cat_event_handler.php (.../cat_event_handler.php) (revision 4689) @@ -4,7 +4,7 @@ $application->Factory->includeClassFile('kDBEventHandler'); class kCatDBEventHandler extends InpDBEventHandler { - + function OnCopy(&$event) { $object = $event->getObject(); Index: trunk/kernel/units/relationship/relationship_event_handler.php =================================================================== diff -u -N -r4309 -r4689 --- trunk/kernel/units/relationship/relationship_event_handler.php (.../relationship_event_handler.php) (revision 4309) +++ trunk/kernel/units/relationship/relationship_event_handler.php (.../relationship_event_handler.php) (revision 4689) @@ -3,6 +3,19 @@ class RelationshipEventHandler extends InpDBEventHandler { /** + * Allows to override standart permission mapping + * + */ + function mapPermissions() + { + parent::mapPermissions(); + $permissions = Array( + 'OnAddRelation' => Array('subitem' => 'add|edit'), + ); + $this->permMapping = array_merge($this->permMapping, $permissions); + } + + /** * Add new relation * * @param kEvent $event Index: trunk/core/units/general/cat_event_handler.php =================================================================== diff -u -N -r4476 -r4689 --- trunk/core/units/general/cat_event_handler.php (.../cat_event_handler.php) (revision 4476) +++ trunk/core/units/general/cat_event_handler.php (.../cat_event_handler.php) (revision 4689) @@ -4,7 +4,7 @@ $application->Factory->includeClassFile('kDBEventHandler'); class kCatDBEventHandler extends InpDBEventHandler { - + function OnCopy(&$event) { $object = $event->getObject(); Index: trunk/core/units/relationship/relationship_event_handler.php =================================================================== diff -u -N -r4309 -r4689 --- trunk/core/units/relationship/relationship_event_handler.php (.../relationship_event_handler.php) (revision 4309) +++ trunk/core/units/relationship/relationship_event_handler.php (.../relationship_event_handler.php) (revision 4689) @@ -3,6 +3,19 @@ class RelationshipEventHandler extends InpDBEventHandler { /** + * Allows to override standart permission mapping + * + */ + function mapPermissions() + { + parent::mapPermissions(); + $permissions = Array( + 'OnAddRelation' => Array('subitem' => 'add|edit'), + ); + $this->permMapping = array_merge($this->permMapping, $permissions); + } + + /** * Add new relation * * @param kEvent $event Index: trunk/core/kernel/db/db_event_handler.php =================================================================== diff -u -N -r4679 -r4689 --- trunk/core/kernel/db/db_event_handler.php (.../db_event_handler.php) (revision 4679) +++ trunk/core/kernel/db/db_event_handler.php (.../db_event_handler.php) (revision 4689) @@ -57,16 +57,24 @@ */ function CheckPermission(&$event) { - if ((substr($event->Name, 0, 9) == 'OnPreSave') || ($event->Name == 'OnSave')) { - $section = $event->getSection(); - if ($this->isNewItemCreate($event)) { - return $this->Application->CheckPermission($section.'.add'); + $section = $event->getSection(); + if (!preg_match('/^CATEGORY:(.*)/', $section)) { + // only if not category item events + if ((substr($event->Name, 0, 9) == 'OnPreSave') || ($event->Name == 'OnSave')) { + if ($this->isNewItemCreate($event)) { + return $this->Application->CheckPermission($section.'.add', 1); + } + else { + return $this->Application->CheckPermission($section.'.add', 1) || $this->Application->CheckPermission($section.'.edit', 1); + } } - else { - return $this->Application->CheckPermission($section.'.add', 1) || $this->Application->CheckPermission($section.'.edit', 1); - } } + if ($event->Name == 'OnPreCreate') { + // save category_id before item create (for item category selector not to destroy permission checking category) + $this->Application->LinkVar('m_cat_id'); + } + return parent::CheckPermission($event); } @@ -78,7 +86,7 @@ { parent::mapPermissions(); $permissions = Array( - 'OnNew' => Array('self' => 'add', 'subitem' => 'add'), + 'OnNew' => Array('self' => 'add', 'subitem' => 'add|edit'), 'OnCreate' => Array('self' => 'add', 'subitem' => 'add|edit'), 'OnUpdate' => Array('self' => 'edit', 'subitem' => 'add|edit'), 'OnSetPrimary' => Array('self' => 'add|edit', 'subitem' => 'add|edit'), @@ -944,7 +952,7 @@ function OnEdit(&$event) { $this->StoreSelectedIDs($event); - + $temp =& $this->Application->recallObject($event->getPrefixSpecial().'_TempHandler', 'kTempTablesHandler'); $temp->PrepareEdit(); @@ -1114,7 +1122,7 @@ $this->Application->setUnitOption($event->Prefix,'AutoLoad',false); $object =& $event->getObject(); - + $temp =& $this->Application->recallObject($event->Prefix.'_TempHandler', 'kTempTablesHandler'); $temp->PrepareEdit(); Index: trunk/core/kernel/utility/event.php =================================================================== diff -u -N -r4670 -r4689 --- trunk/core/kernel/utility/event.php (.../event.php) (revision 4670) +++ trunk/core/kernel/utility/event.php (.../event.php) (revision 4689) @@ -287,11 +287,11 @@ return $perm_section; } - $main_prefix = $this->Application->GetTopmostPrefix($this->Prefix); - $section = $this->Application->getUnitOption($main_prefix.'.main', 'PermSection'); + $top_prefix = $this->getEventParam('top_prefix'); + $section = $this->Application->getUnitOption($top_prefix.'.main', 'PermSection'); if (!$section) { - trigger_error('Permission section not specified for prefix '.$main_prefix.'', E_USER_ERROR); + trigger_error('Permission section not specified for prefix '.$top_prefix.'', E_USER_ERROR); } return $section; }