Index: branches/unlabeled/unlabeled-1.22.2/kernel/units/categories/categories_event_handler.php =================================================================== diff -u -r6015 -r6026 --- branches/unlabeled/unlabeled-1.22.2/kernel/units/categories/categories_event_handler.php (.../categories_event_handler.php) (revision 6015) +++ branches/unlabeled/unlabeled-1.22.2/kernel/units/categories/categories_event_handler.php (.../categories_event_handler.php) (revision 6026) @@ -11,11 +11,62 @@ parent::mapPermissions(); $permissions = Array( 'OnRebuildCache' => Array('self' => 'add|edit'), +// 'OnSave' => Array('self' => 'add|edit') ); $this->permMapping = array_merge($this->permMapping, $permissions); } /** + * Checks permissions of user + * + * @param kEvent $event + */ + function CheckPermission(&$event) + { + if (!$this->Application->IsAdmin()) { + if ($event->Name == 'OnSetSortingDirect') { + // allow sorting on front event without view permission + return true; + } + } + + if ($event->Name == 'OnEdit' || $event->Name == 'OnSave') { + // check each id from selected individually and only if all are allowed proceed next + if ($event->Name == 'OnEdit') { + $selected_ids = implode(',', $this->StoreSelectedIDs($event)); + } + else { + $selected_ids = $this->Application->RecallVar($event->getPrefixSpecial().'_selected_ids'); + } + + $id_field = $this->Application->getUnitOption($event->Prefix, 'IDField'); + $table_name = $this->Application->getUnitOption($event->Prefix, 'TableName'); + $sql = 'SELECT '.$id_field.', CreatedById + FROM '.$table_name.' item_table + WHERE '.$id_field.' IN ('.$selected_ids.')'; + $items = $this->Conn->Query($sql, $id_field); + + $perm_value = true; + $perm_helper =& $this->Application->recallObject('PermissionsHelper'); + foreach ($items as $item_id => $item_data) { + if ($perm_helper->ModifyCheckPermission($item_data['CreatedById'], $item_data[$id_field], $event->Prefix) == 0) { + // one of items selected has no permission + $perm_value = false; + break; + } + } + + if (!$perm_value) { + $event->status = erPERM_FAIL; + } + + return $perm_value; + } + + return parent::CheckPermission($event); + } + + /** * Apply system filter to categories list * * @param kEvent $event