1de02284cSSzymon Olewniczak<?php 2de02284cSSzymon Olewniczak 3de02284cSSzymon Olewniczak//if(!defined('DOKU_INC')) die('meh.'); 4de02284cSSzymon Olewniczak// 5de02284cSSzymon Olewniczak//include_once DOKU_PLUGIN."bez/models/tokens.php"; 6de02284cSSzymon Olewniczak 7de02284cSSzymon Olewniczaknamespace dokuwiki\plugin\bez\mdl; 8de02284cSSzymon Olewniczak 9de02284cSSzymon Olewniczak//ACL level defines 10de02284cSSzymon Olewniczakuse dokuwiki\plugin\bez\meta\PermissionDeniedException; 11de02284cSSzymon Olewniczak 12de02284cSSzymon Olewniczakdefine('BEZ_AUTH_NONE', 0); 13de02284cSSzymon Olewniczakdefine('BEZ_AUTH_VIEWER', 2); 14de02284cSSzymon Olewniczakdefine('BEZ_AUTH_USER', 5); 15de02284cSSzymon Olewniczakdefine('BEZ_AUTH_LEADER', 10); 16de02284cSSzymon Olewniczakdefine('BEZ_AUTH_ADMIN', 20); 17de02284cSSzymon Olewniczak 18de02284cSSzymon Olewniczakdefine('BEZ_PERMISSION_UNKNOWN', -1); 19de02284cSSzymon Olewniczakdefine('BEZ_PERMISSION_NONE', 0); 20de02284cSSzymon Olewniczakdefine('BEZ_PERMISSION_VIEW', 1); 21de02284cSSzymon Olewniczakdefine('BEZ_PERMISSION_CHANGE', 2); 228a638198SSzymon Olewniczakdefine('BEZ_PERMISSION_DELETE', 3); 23de02284cSSzymon Olewniczak 24de02284cSSzymon Olewniczakclass Acl { 25de02284cSSzymon Olewniczak /** @var Model */ 26de02284cSSzymon Olewniczak private $model; 27de02284cSSzymon Olewniczak 28de02284cSSzymon Olewniczak private $level = BEZ_AUTH_NONE; 29de02284cSSzymon Olewniczak 30de02284cSSzymon Olewniczak// private $threads = array(); 31de02284cSSzymon Olewniczak// private $commcauses = array(); 32de02284cSSzymon Olewniczak// private $tasks = array(); 33de02284cSSzymon Olewniczak 34de02284cSSzymon Olewniczak private function update_level($level) { 35de02284cSSzymon Olewniczak if ($level > $this->level) { 36de02284cSSzymon Olewniczak $this->level = $level; 37de02284cSSzymon Olewniczak } 38de02284cSSzymon Olewniczak } 39de02284cSSzymon Olewniczak 40de02284cSSzymon Olewniczak public function get_level() { 41de02284cSSzymon Olewniczak return $this->level; 42de02284cSSzymon Olewniczak } 43de02284cSSzymon Olewniczak 44de02284cSSzymon Olewniczak public function __construct(Model $model) { 45de02284cSSzymon Olewniczak $this->model = $model; 46de02284cSSzymon Olewniczak 47de02284cSSzymon Olewniczak $userd = $this->model->dw_auth->getUserData($this->model->user_nick); 48de02284cSSzymon Olewniczak if ($userd !== false && is_array($userd['grps'])) { 49de02284cSSzymon Olewniczak $grps = $userd['grps']; 50de02284cSSzymon Olewniczak if (in_array('admin', $grps ) || in_array('bez_admin', $grps )) { 51de02284cSSzymon Olewniczak $this->update_level(BEZ_AUTH_ADMIN); 52de02284cSSzymon Olewniczak } elseif (in_array('bez_leader', $grps )) { 53de02284cSSzymon Olewniczak $this->update_level(BEZ_AUTH_LEADER); 54de02284cSSzymon Olewniczak } else { 55de02284cSSzymon Olewniczak $this->update_level(BEZ_AUTH_USER); 56de02284cSSzymon Olewniczak } 57de02284cSSzymon Olewniczak } elseif (isset($_GET['t'])) { 58e8827d73SSzymon Olewniczak $page_id = $this->model->action->id(); 59e8827d73SSzymon Olewniczak 60e8827d73SSzymon Olewniczak $user_tok = trim($_GET['t']); 61e8827d73SSzymon Olewniczak if ($this->model->authentication_tokenFactory->get_token($page_id) == $user_tok) { 62e8827d73SSzymon Olewniczak $this->update_level(BEZ_AUTH_VIEWER); 63e8827d73SSzymon Olewniczak } 64de02284cSSzymon Olewniczak } 65de02284cSSzymon Olewniczak } 66de02284cSSzymon Olewniczak 67de02284cSSzymon Olewniczak private function static_thread() { 68de02284cSSzymon Olewniczak $acl = array_fill_keys(Thread::get_columns(), BEZ_PERMISSION_NONE); 69de02284cSSzymon Olewniczak 70de02284cSSzymon Olewniczak //virtual columns 71de02284cSSzymon Olewniczak $acl['participants'] = BEZ_PERMISSION_NONE; 72de02284cSSzymon Olewniczak $acl['labels'] = BEZ_PERMISSION_NONE; 73de02284cSSzymon Olewniczak 74de02284cSSzymon Olewniczak //BEZ_AUTH_VIEWER is also token viewer 75de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_VIEWER) { 76de02284cSSzymon Olewniczak //user can display everythig 77de02284cSSzymon Olewniczak $acl = array_map(function($value) { 78de02284cSSzymon Olewniczak return BEZ_PERMISSION_VIEW; 79de02284cSSzymon Olewniczak }, $acl); 80de02284cSSzymon Olewniczak } 81de02284cSSzymon Olewniczak 82de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_ADMIN) { 83de02284cSSzymon Olewniczak //user can edit everythig 84de02284cSSzymon Olewniczak $acl = array_map(function($value) { 858a638198SSzymon Olewniczak return BEZ_PERMISSION_DELETE; 86de02284cSSzymon Olewniczak }, $acl); 87de02284cSSzymon Olewniczak 88de02284cSSzymon Olewniczak return $acl; 89de02284cSSzymon Olewniczak } 90de02284cSSzymon Olewniczak } 91de02284cSSzymon Olewniczak 92de02284cSSzymon Olewniczak 93de02284cSSzymon Olewniczak private function check_thread(Thread $thread) { 94de02284cSSzymon Olewniczak $acl = $this->static_thread(); 95de02284cSSzymon Olewniczak 96de02284cSSzymon Olewniczak //we create new issue 97de02284cSSzymon Olewniczak if ($thread->id === NULL) { 98de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_USER) { 99de02284cSSzymon Olewniczak $acl['title'] = BEZ_PERMISSION_CHANGE; 100de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 101de02284cSSzymon Olewniczak //$acl['type'] = BEZ_PERMISSION_CHANGE; 102de02284cSSzymon Olewniczak } 103de02284cSSzymon Olewniczak 104de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_LEADER) { 105de02284cSSzymon Olewniczak $acl['coordinator'] = BEZ_PERMISSION_CHANGE; 106de02284cSSzymon Olewniczak } 107de02284cSSzymon Olewniczak 108de02284cSSzymon Olewniczak return $acl; 109de02284cSSzymon Olewniczak } 110de02284cSSzymon Olewniczak 111de02284cSSzymon Olewniczak if ($thread->state === 'proposal' && 112de02284cSSzymon Olewniczak $thread->original_poster === $this->model->user_nick) { 113de02284cSSzymon Olewniczak $acl['title'] = BEZ_PERMISSION_CHANGE; 114de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 115de02284cSSzymon Olewniczak //$acl['type'] = BEZ_PERMISSION_CHANGE; 116de02284cSSzymon Olewniczak } 117de02284cSSzymon Olewniczak 118de02284cSSzymon Olewniczak if ($thread->coordinator === $this->model->user_nick) { 119de02284cSSzymon Olewniczak $acl['title'] = BEZ_PERMISSION_CHANGE; 120de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 121de02284cSSzymon Olewniczak //$acl['type'] = BEZ_PERMISSION_CHANGE; 122de02284cSSzymon Olewniczak 123de02284cSSzymon Olewniczak //coordinator can change coordinator 124de02284cSSzymon Olewniczak $acl['coordinator'] = BEZ_PERMISSION_CHANGE; 125de02284cSSzymon Olewniczak 126de02284cSSzymon Olewniczak $acl['state'] = BEZ_PERMISSION_CHANGE; 127de02284cSSzymon Olewniczak //$acl['opinion'] = BEZ_PERMISSION_CHANGE; 128de02284cSSzymon Olewniczak } 129de02284cSSzymon Olewniczak 130de02284cSSzymon Olewniczak return $acl; 131de02284cSSzymon Olewniczak } 132de02284cSSzymon Olewniczak 1338a638198SSzymon Olewniczak private function static_task() { 1348a638198SSzymon Olewniczak $acl = array_fill_keys(Task::get_columns(), BEZ_PERMISSION_NONE); 135de02284cSSzymon Olewniczak 136e8827d73SSzymon Olewniczak //virtual columns 137e8827d73SSzymon Olewniczak $acl['participants'] = BEZ_PERMISSION_NONE; 138e8827d73SSzymon Olewniczak 1398a638198SSzymon Olewniczak //BEZ_AUTH_VIEWER is also token viewer 140de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_VIEWER) { 141de02284cSSzymon Olewniczak //user can display everythig 142de02284cSSzymon Olewniczak $acl = array_map(function($value) { 143de02284cSSzymon Olewniczak return BEZ_PERMISSION_VIEW; 144de02284cSSzymon Olewniczak }, $acl); 145de02284cSSzymon Olewniczak } 146de02284cSSzymon Olewniczak 147de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_ADMIN) { 1488a638198SSzymon Olewniczak //user can edit everythig 149de02284cSSzymon Olewniczak $acl = array_map(function($value) { 1508a638198SSzymon Olewniczak return BEZ_PERMISSION_DELETE; 151de02284cSSzymon Olewniczak }, $acl); 152de02284cSSzymon Olewniczak 153de02284cSSzymon Olewniczak return $acl; 154de02284cSSzymon Olewniczak } 1558a638198SSzymon Olewniczak } 1568a638198SSzymon Olewniczak 1578a638198SSzymon Olewniczak //if user can chante id => he can delete record 1588a638198SSzymon Olewniczak private function check_task($task) { 1598a638198SSzymon Olewniczak $acl = $this->static_task(); 160de02284cSSzymon Olewniczak 161de02284cSSzymon Olewniczak //we create new task 162de02284cSSzymon Olewniczak if ($task->id === NULL) { 163de02284cSSzymon Olewniczak 164*ff14b107SSzymon Olewniczak if ($task->coordinator == $this->model->user_nick || 1658a638198SSzymon Olewniczak ($task->thread_id == '' && $this->level >= BEZ_AUTH_LEADER)) { 1668a638198SSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 1678a638198SSzymon Olewniczak $acl['task_program_id'] = BEZ_PERMISSION_CHANGE; 1688a638198SSzymon Olewniczak $acl['assignee'] = BEZ_PERMISSION_CHANGE; 169de02284cSSzymon Olewniczak $acl['cost'] = BEZ_PERMISSION_CHANGE; 170de02284cSSzymon Olewniczak $acl['plan_date'] = BEZ_PERMISSION_CHANGE; 171de02284cSSzymon Olewniczak $acl['all_day_event'] = BEZ_PERMISSION_CHANGE; 172de02284cSSzymon Olewniczak $acl['start_time'] = BEZ_PERMISSION_CHANGE; 173de02284cSSzymon Olewniczak $acl['finish_time'] = BEZ_PERMISSION_CHANGE; 174de02284cSSzymon Olewniczak } 175de02284cSSzymon Olewniczak 176de02284cSSzymon Olewniczak //przypisujemy zadanie programowe samemu sobie 1778a638198SSzymon Olewniczak //no assignee 1788a638198SSzymon Olewniczak if ($task->thread_id == '') { 1798a638198SSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 1808a638198SSzymon Olewniczak $acl['task_program_id'] = BEZ_PERMISSION_CHANGE; 181de02284cSSzymon Olewniczak $acl['cost'] = BEZ_PERMISSION_CHANGE; 182de02284cSSzymon Olewniczak $acl['plan_date'] = BEZ_PERMISSION_CHANGE; 183de02284cSSzymon Olewniczak $acl['all_day_event'] = BEZ_PERMISSION_CHANGE; 184de02284cSSzymon Olewniczak $acl['start_time'] = BEZ_PERMISSION_CHANGE; 185de02284cSSzymon Olewniczak $acl['finish_time'] = BEZ_PERMISSION_CHANGE; 186de02284cSSzymon Olewniczak } 187de02284cSSzymon Olewniczak 188de02284cSSzymon Olewniczak return $acl; 189de02284cSSzymon Olewniczak } 190de02284cSSzymon Olewniczak 191de02284cSSzymon Olewniczak //user can change state 1928a638198SSzymon Olewniczak// if ($task->assignee == $this->model->user_nick) { 1938a638198SSzymon Olewniczak//// $acl['reason'] = BEZ_PERMISSION_CHANGE; 1948a638198SSzymon Olewniczak// $acl['state'] = BEZ_PERMISSION_CHANGE; 1958a638198SSzymon Olewniczak// } 196de02284cSSzymon Olewniczak 197de02284cSSzymon Olewniczak //reporters can add subscribents to programme task 1988a638198SSzymon Olewniczak// if ($task->original_poster === $this->model->user_nick) { 1998a638198SSzymon Olewniczak// $acl['subscribents'] = BEZ_PERMISSION_CHANGE; 2008a638198SSzymon Olewniczak// } 201de02284cSSzymon Olewniczak 202*ff14b107SSzymon Olewniczak if ($task->coordinator == $this->model->user_nick || 2038a638198SSzymon Olewniczak ($task->thread_id == '' && $this->level >= BEZ_AUTH_LEADER)) { 204de02284cSSzymon Olewniczak 2058a638198SSzymon Olewniczak// $acl['reason'] = BEZ_PERMISSION_CHANGE; 2068a638198SSzymon Olewniczak //$acl['state'] = BEZ_PERMISSION_CHANGE; 207de02284cSSzymon Olewniczak 208de02284cSSzymon Olewniczak //we can chante cause 2098a638198SSzymon Olewniczak $acl['thread_comment_id'] = BEZ_PERMISSION_CHANGE; 210de02284cSSzymon Olewniczak 2118a638198SSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 2128a638198SSzymon Olewniczak $acl['task_program_id'] = BEZ_PERMISSION_CHANGE; 2138a638198SSzymon Olewniczak $acl['assignee'] = BEZ_PERMISSION_CHANGE; 214de02284cSSzymon Olewniczak $acl['cost'] = BEZ_PERMISSION_CHANGE; 2158a638198SSzymon Olewniczak //$acl['reason'] = BEZ_PERMISSION_CHANGE; 216de02284cSSzymon Olewniczak $acl['plan_date'] = BEZ_PERMISSION_CHANGE; 217de02284cSSzymon Olewniczak $acl['all_day_event'] = BEZ_PERMISSION_CHANGE; 218de02284cSSzymon Olewniczak $acl['start_time'] = BEZ_PERMISSION_CHANGE; 219de02284cSSzymon Olewniczak $acl['finish_time'] = BEZ_PERMISSION_CHANGE; 220de02284cSSzymon Olewniczak 221de02284cSSzymon Olewniczak 222de02284cSSzymon Olewniczak //leaders can add subscribents to programme tasks 2238a638198SSzymon Olewniczak //$acl['subscribents'] = BEZ_PERMISSION_CHANGE; 224de02284cSSzymon Olewniczak } 225de02284cSSzymon Olewniczak 2268a638198SSzymon Olewniczak if ($task->thread_id == '' && 2278a638198SSzymon Olewniczak $task->original_poster == $this->model->user_nick && 2288a638198SSzymon Olewniczak $task->assignee == $this->model->user_nick) { 2298a638198SSzymon Olewniczak //$acl['reason'] = BEZ_PERMISSION_CHANGE; 2308a638198SSzymon Olewniczak //$acl['state'] = BEZ_PERMISSION_CHANGE; 231de02284cSSzymon Olewniczak 2328a638198SSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 2338a638198SSzymon Olewniczak $acl['task_program_id'] = BEZ_PERMISSION_CHANGE; 234de02284cSSzymon Olewniczak //no executor 235de02284cSSzymon Olewniczak $acl['cost'] = BEZ_PERMISSION_CHANGE; 2368a638198SSzymon Olewniczak //$acl['reason'] = BEZ_PERMISSION_CHANGE; 237de02284cSSzymon Olewniczak $acl['plan_date'] = BEZ_PERMISSION_CHANGE; 238de02284cSSzymon Olewniczak $acl['all_day_event'] = BEZ_PERMISSION_CHANGE; 239de02284cSSzymon Olewniczak $acl['start_time'] = BEZ_PERMISSION_CHANGE; 240de02284cSSzymon Olewniczak $acl['finish_time'] = BEZ_PERMISSION_CHANGE; 241de02284cSSzymon Olewniczak } 242de02284cSSzymon Olewniczak 243de02284cSSzymon Olewniczak 244de02284cSSzymon Olewniczak return $acl; 245de02284cSSzymon Olewniczak 246de02284cSSzymon Olewniczak } 2477fbf4c39SSzymon Olewniczak 2487fbf4c39SSzymon Olewniczak private function static_thread_comment() { 2497fbf4c39SSzymon Olewniczak $acl = array_fill_keys(Thread_comment::get_columns(), BEZ_PERMISSION_NONE); 2507fbf4c39SSzymon Olewniczak 2517fbf4c39SSzymon Olewniczak //virtual columns 2527fbf4c39SSzymon Olewniczak 2537fbf4c39SSzymon Olewniczak //BEZ_AUTH_VIEWER is also token viewer 2547fbf4c39SSzymon Olewniczak if ($this->level >= BEZ_AUTH_VIEWER) { 2557fbf4c39SSzymon Olewniczak //user can display everythig 2567fbf4c39SSzymon Olewniczak $acl = array_map(function($value) { 2577fbf4c39SSzymon Olewniczak return BEZ_PERMISSION_VIEW; 2587fbf4c39SSzymon Olewniczak }, $acl); 2597fbf4c39SSzymon Olewniczak } 2607fbf4c39SSzymon Olewniczak 2617fbf4c39SSzymon Olewniczak if ($this->level >= BEZ_AUTH_ADMIN) { 2627fbf4c39SSzymon Olewniczak //user can edit everythig 2637fbf4c39SSzymon Olewniczak $acl = array_map(function($value) { 2648a638198SSzymon Olewniczak return BEZ_PERMISSION_DELETE; 2657fbf4c39SSzymon Olewniczak }, $acl); 2667fbf4c39SSzymon Olewniczak 2677fbf4c39SSzymon Olewniczak return $acl; 2687fbf4c39SSzymon Olewniczak } 2697fbf4c39SSzymon Olewniczak } 270de02284cSSzymon Olewniczak 2718a638198SSzymon Olewniczak private function check_thread_comment(Thread_comment $thread_comment) { 2728a638198SSzymon Olewniczak $acl = $this->static_thread_comment(); 273de02284cSSzymon Olewniczak 274de02284cSSzymon Olewniczak //we create new commcause 2758a638198SSzymon Olewniczak if ($thread_comment->id === NULL) { 276e8827d73SSzymon Olewniczak if ($this->level >= BEZ_AUTH_USER) { 277de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 278de02284cSSzymon Olewniczak } 279de02284cSSzymon Olewniczak 2808a638198SSzymon Olewniczak if ($thread_comment->coordinator === $this->model->user_nick) { 281de02284cSSzymon Olewniczak $acl['type'] = BEZ_PERMISSION_CHANGE; 282de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 283de02284cSSzymon Olewniczak } 284de02284cSSzymon Olewniczak 285de02284cSSzymon Olewniczak return $acl; 286de02284cSSzymon Olewniczak } 287de02284cSSzymon Olewniczak 288de02284cSSzymon Olewniczak 2898a638198SSzymon Olewniczak if ($thread_comment->coordinator === $this->model->user_nick) { 290de02284cSSzymon Olewniczak $acl['type'] = BEZ_PERMISSION_CHANGE; 291de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 292de02284cSSzymon Olewniczak 293de02284cSSzymon Olewniczak //we can only delete records when there is no tasks subscribed to issue 2948a638198SSzymon Olewniczak if ($thread_comment->task_count === 0) { 295de02284cSSzymon Olewniczak $acl['id'] = BEZ_PERMISSION_CHANGE; 296de02284cSSzymon Olewniczak } 297de02284cSSzymon Olewniczak 298de02284cSSzymon Olewniczak } 299de02284cSSzymon Olewniczak 300de02284cSSzymon Olewniczak //jeżeli ktoś zmieni typ z komentarza na przyczynę, tracimy możliwość edycji 3018a638198SSzymon Olewniczak if ($thread_comment->author === $this->model->user_nick && 3028a638198SSzymon Olewniczak $thread_comment->type == '0') { 303de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 304de02284cSSzymon Olewniczak 305de02284cSSzymon Olewniczak //we can only delete records when there is no tasks subscribed to issue 3068a638198SSzymon Olewniczak if ($thread_comment->task_count === 0) { 307de02284cSSzymon Olewniczak $acl['id'] = BEZ_PERMISSION_CHANGE; 308de02284cSSzymon Olewniczak } 309de02284cSSzymon Olewniczak } 310de02284cSSzymon Olewniczak 311de02284cSSzymon Olewniczak return $acl; 312de02284cSSzymon Olewniczak 313de02284cSSzymon Olewniczak } 314de02284cSSzymon Olewniczak 315de02284cSSzymon Olewniczak private function static_label() { 316de02284cSSzymon Olewniczak $acl = array_fill_keys(Label::get_columns(), BEZ_PERMISSION_NONE); 317de02284cSSzymon Olewniczak 318de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_USER) { 319de02284cSSzymon Olewniczak //user can display everythig 320de02284cSSzymon Olewniczak $acl = array_map(function($value) { 321de02284cSSzymon Olewniczak return BEZ_PERMISSION_VIEW; 322de02284cSSzymon Olewniczak }, $acl); 323de02284cSSzymon Olewniczak } 324de02284cSSzymon Olewniczak 325de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_ADMIN) { 326de02284cSSzymon Olewniczak //admin can edit everythig 327de02284cSSzymon Olewniczak $acl = array_map(function($value) { 3288a638198SSzymon Olewniczak return BEZ_PERMISSION_DELETE; 329de02284cSSzymon Olewniczak }, $acl); 330de02284cSSzymon Olewniczak } 331de02284cSSzymon Olewniczak 332de02284cSSzymon Olewniczak return $acl; 333de02284cSSzymon Olewniczak } 334de02284cSSzymon Olewniczak 335de02284cSSzymon Olewniczak private function check_label(Label $label) { 336de02284cSSzymon Olewniczak return $this->static_label(); 337de02284cSSzymon Olewniczak } 338de02284cSSzymon Olewniczak 339e8827d73SSzymon Olewniczak private function static_task_program() { 340e8827d73SSzymon Olewniczak $acl = array_fill_keys(Task_program::get_columns(), BEZ_PERMISSION_NONE); 341de02284cSSzymon Olewniczak 342de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_USER) { 343de02284cSSzymon Olewniczak //user can display everythig 344de02284cSSzymon Olewniczak $acl = array_map(function($value) { 345de02284cSSzymon Olewniczak return BEZ_PERMISSION_VIEW; 346de02284cSSzymon Olewniczak }, $acl); 347de02284cSSzymon Olewniczak } 348de02284cSSzymon Olewniczak 349de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_ADMIN) { 350de02284cSSzymon Olewniczak //admin can edit everythig 351de02284cSSzymon Olewniczak $acl = array_map(function($value) { 352e8827d73SSzymon Olewniczak return BEZ_PERMISSION_DELETE; 353de02284cSSzymon Olewniczak }, $acl); 354de02284cSSzymon Olewniczak } 355de02284cSSzymon Olewniczak 356de02284cSSzymon Olewniczak return $acl; 357de02284cSSzymon Olewniczak } 358de02284cSSzymon Olewniczak 359e8827d73SSzymon Olewniczak private function check_task_program(Task_program $task_program) { 360e8827d73SSzymon Olewniczak return $this->static_label(); 361e8827d73SSzymon Olewniczak } 362e8827d73SSzymon Olewniczak 363e8827d73SSzymon Olewniczak private function static_task_comment() { 364e8827d73SSzymon Olewniczak $acl = array_fill_keys(Task_comment::get_columns(), BEZ_PERMISSION_NONE); 365e8827d73SSzymon Olewniczak 366e8827d73SSzymon Olewniczak //BEZ_AUTH_VIEWER is also token viewer 367e8827d73SSzymon Olewniczak if ($this->level >= BEZ_AUTH_VIEWER) { 368e8827d73SSzymon Olewniczak //user can display everythig 369e8827d73SSzymon Olewniczak $acl = array_map(function($value) { 370e8827d73SSzymon Olewniczak return BEZ_PERMISSION_VIEW; 371e8827d73SSzymon Olewniczak }, $acl); 372e8827d73SSzymon Olewniczak } 373e8827d73SSzymon Olewniczak 374e8827d73SSzymon Olewniczak if ($this->level >= BEZ_AUTH_ADMIN) { 375e8827d73SSzymon Olewniczak //user can edit everything 376e8827d73SSzymon Olewniczak $acl = array_map(function($value) { 377e8827d73SSzymon Olewniczak return BEZ_PERMISSION_DELETE; 378e8827d73SSzymon Olewniczak }, $acl); 379e8827d73SSzymon Olewniczak 380e8827d73SSzymon Olewniczak return $acl; 381e8827d73SSzymon Olewniczak } 382e8827d73SSzymon Olewniczak } 383e8827d73SSzymon Olewniczak 384e8827d73SSzymon Olewniczak private function check_task_comment(Task_comment $task_comment) { 385e8827d73SSzymon Olewniczak $acl = $this->static_task_comment(); 386e8827d73SSzymon Olewniczak 387e8827d73SSzymon Olewniczak //we create new comment 388e8827d73SSzymon Olewniczak if ($task_comment->id == NULL) { 389e8827d73SSzymon Olewniczak if ($this->level >= BEZ_AUTH_USER) { 390e8827d73SSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 391e8827d73SSzymon Olewniczak } 392e8827d73SSzymon Olewniczak 393e8827d73SSzymon Olewniczak return $acl; 394e8827d73SSzymon Olewniczak } 395e8827d73SSzymon Olewniczak 396e8827d73SSzymon Olewniczak 397e8827d73SSzymon Olewniczak if ($this->level >= BEZ_AUTH_LEADER) { 398e8827d73SSzymon Olewniczak $acl['id'] = BEZ_PERMISSION_DELETE; 399e8827d73SSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 400e8827d73SSzymon Olewniczak } 401e8827d73SSzymon Olewniczak 402e8827d73SSzymon Olewniczak 403e8827d73SSzymon Olewniczak if ($task_comment->author === $this->model->user_nick) { 404e8827d73SSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 405e8827d73SSzymon Olewniczak $acl['id'] = BEZ_PERMISSION_DELETE; 406e8827d73SSzymon Olewniczak } 407e8827d73SSzymon Olewniczak 408e8827d73SSzymon Olewniczak return $acl; 409e8827d73SSzymon Olewniczak 410e8827d73SSzymon Olewniczak } 411e8827d73SSzymon Olewniczak 412e8827d73SSzymon Olewniczak// private function check_tasktype($tasktype) { 413e8827d73SSzymon Olewniczak// $acl = array( 414e8827d73SSzymon Olewniczak// 'id' => BEZ_PERMISSION_NONE, 415e8827d73SSzymon Olewniczak// 'pl' => BEZ_PERMISSION_NONE, 416e8827d73SSzymon Olewniczak// 'en' => BEZ_PERMISSION_NONE 417e8827d73SSzymon Olewniczak// ); 418e8827d73SSzymon Olewniczak// 419e8827d73SSzymon Olewniczak// if ($this->level >= BEZ_AUTH_USER) { 420e8827d73SSzymon Olewniczak// //user can display everythig 421e8827d73SSzymon Olewniczak// $acl = array_map(function($value) { 422e8827d73SSzymon Olewniczak// return BEZ_PERMISSION_VIEW; 423e8827d73SSzymon Olewniczak// }, $acl); 424e8827d73SSzymon Olewniczak// } 425e8827d73SSzymon Olewniczak// 426e8827d73SSzymon Olewniczak// if ($this->level >= BEZ_AUTH_ADMIN) { 427e8827d73SSzymon Olewniczak// //admin can edit everythig 428e8827d73SSzymon Olewniczak// $acl = array_map(function($value) { 429e8827d73SSzymon Olewniczak// return BEZ_PERMISSION_CHANGE; 430e8827d73SSzymon Olewniczak// }, $acl); 431e8827d73SSzymon Olewniczak// } 432e8827d73SSzymon Olewniczak// 433e8827d73SSzymon Olewniczak// return $acl; 434e8827d73SSzymon Olewniczak// } 435e8827d73SSzymon Olewniczak 436de02284cSSzymon Olewniczak /*returns array */ 437de02284cSSzymon Olewniczak public function check(Entity $obj) { 438de02284cSSzymon Olewniczak $method = 'check_'.$obj->get_table_name(); 439de02284cSSzymon Olewniczak if (!method_exists($this, $method)) { 440de02284cSSzymon Olewniczak throw new \Exception('no acl rules set for table: '.$obj->get_table_name()); 441de02284cSSzymon Olewniczak } 442de02284cSSzymon Olewniczak return $this->$method($obj); 443de02284cSSzymon Olewniczak } 444de02284cSSzymon Olewniczak 445de02284cSSzymon Olewniczak public function check_field(Entity $obj, $field) { 446de02284cSSzymon Olewniczak $acl = $this->check($obj); 447de02284cSSzymon Olewniczak 448de02284cSSzymon Olewniczak if (isset($acl[$field])) { 449de02284cSSzymon Olewniczak return $acl[$field]; 450de02284cSSzymon Olewniczak } 451de02284cSSzymon Olewniczak return BEZ_PERMISSION_UNKNOWN; 452de02284cSSzymon Olewniczak } 453de02284cSSzymon Olewniczak 454de02284cSSzymon Olewniczak public function check_static($table) { 455de02284cSSzymon Olewniczak $method = 'static_'.$table; 456de02284cSSzymon Olewniczak if (!method_exists($this, $method)) { 457de02284cSSzymon Olewniczak throw new \Exception('no acl rules set for table: '.$table); 458de02284cSSzymon Olewniczak } 459de02284cSSzymon Olewniczak return $this->$method($table); 460de02284cSSzymon Olewniczak } 461de02284cSSzymon Olewniczak 462de02284cSSzymon Olewniczak public function check_static_field($table, $field) { 463de02284cSSzymon Olewniczak $acl = $this->check_static($table); 464de02284cSSzymon Olewniczak return $acl[$field]; 465de02284cSSzymon Olewniczak } 466de02284cSSzymon Olewniczak 467de02284cSSzymon Olewniczak 4688a638198SSzymon Olewniczak public function can(Entity $obj, $field, $what=BEZ_PERMISSION_CHANGE) { 4698a638198SSzymon Olewniczak if ($this->check_field($obj, $field) < $what) { 470de02284cSSzymon Olewniczak $table = $obj->get_table_name(); 471de02284cSSzymon Olewniczak $id = $obj->id; 472de02284cSSzymon Olewniczak throw new PermissionDeniedException('user cannot change field "'.$field.'" in table "'.$table.', rowid: "'.$id.'"'); 473de02284cSSzymon Olewniczak } 474de02284cSSzymon Olewniczak } 475de02284cSSzymon Olewniczak} 476