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 function update_level($level) { 31de02284cSSzymon Olewniczak if ($level > $this->level) { 32de02284cSSzymon Olewniczak $this->level = $level; 33de02284cSSzymon Olewniczak } 34de02284cSSzymon Olewniczak } 35de02284cSSzymon Olewniczak 36de02284cSSzymon Olewniczak public function get_level() { 37de02284cSSzymon Olewniczak return $this->level; 38de02284cSSzymon Olewniczak } 39de02284cSSzymon Olewniczak 40de02284cSSzymon Olewniczak public function __construct(Model $model) { 41de02284cSSzymon Olewniczak $this->model = $model; 42de02284cSSzymon Olewniczak 43de02284cSSzymon Olewniczak $userd = $this->model->dw_auth->getUserData($this->model->user_nick); 44de02284cSSzymon Olewniczak if ($userd !== false && is_array($userd['grps'])) { 45de02284cSSzymon Olewniczak $grps = $userd['grps']; 46de02284cSSzymon Olewniczak if (in_array('admin', $grps ) || in_array('bez_admin', $grps )) { 47de02284cSSzymon Olewniczak $this->update_level(BEZ_AUTH_ADMIN); 48de02284cSSzymon Olewniczak } elseif (in_array('bez_leader', $grps )) { 49de02284cSSzymon Olewniczak $this->update_level(BEZ_AUTH_LEADER); 50de02284cSSzymon Olewniczak } else { 51de02284cSSzymon Olewniczak $this->update_level(BEZ_AUTH_USER); 52de02284cSSzymon Olewniczak } 53de02284cSSzymon Olewniczak } elseif (isset($_GET['t'])) { 54e8827d73SSzymon Olewniczak $page_id = $this->model->action->id(); 55e8827d73SSzymon Olewniczak 56e8827d73SSzymon Olewniczak $user_tok = trim($_GET['t']); 57e8827d73SSzymon Olewniczak if ($this->model->authentication_tokenFactory->get_token($page_id) == $user_tok) { 58e8827d73SSzymon Olewniczak $this->update_level(BEZ_AUTH_VIEWER); 59e8827d73SSzymon Olewniczak } 60de02284cSSzymon Olewniczak } 61de02284cSSzymon Olewniczak } 62de02284cSSzymon Olewniczak 63de02284cSSzymon Olewniczak private function static_thread() { 64de02284cSSzymon Olewniczak $acl = array_fill_keys(Thread::get_columns(), BEZ_PERMISSION_NONE); 65de02284cSSzymon Olewniczak 66*53df74e7SSzymon Olewniczak $acl['label_id'] = BEZ_PERMISSION_NONE; 67de02284cSSzymon Olewniczak $acl['participants'] = BEZ_PERMISSION_NONE; 68de02284cSSzymon Olewniczak 69de02284cSSzymon Olewniczak //BEZ_AUTH_VIEWER is also token viewer 70de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_VIEWER) { 71*53df74e7SSzymon Olewniczak //user can display everything 72de02284cSSzymon Olewniczak $acl = array_map(function($value) { 73de02284cSSzymon Olewniczak return BEZ_PERMISSION_VIEW; 74de02284cSSzymon Olewniczak }, $acl); 75de02284cSSzymon Olewniczak } 76de02284cSSzymon Olewniczak 77*53df74e7SSzymon Olewniczak if ($this->level >= BEZ_AUTH_USER) { 78*53df74e7SSzymon Olewniczak $acl['id'] = BEZ_PERMISSION_CHANGE; 79*53df74e7SSzymon Olewniczak } 80*53df74e7SSzymon Olewniczak 81*53df74e7SSzymon Olewniczak if ($this->level >= BEZ_AUTH_LEADER) { 82*53df74e7SSzymon Olewniczak $acl['title'] = BEZ_PERMISSION_CHANGE; 83*53df74e7SSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 84*53df74e7SSzymon Olewniczak $acl['coordinator'] = BEZ_PERMISSION_CHANGE; 85*53df74e7SSzymon Olewniczak $acl['label_id'] = BEZ_PERMISSION_CHANGE; 86*53df74e7SSzymon Olewniczak $acl['private'] = BEZ_PERMISSION_CHANGE; 87*53df74e7SSzymon Olewniczak } 88*53df74e7SSzymon Olewniczak 89de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_ADMIN) { 90de02284cSSzymon Olewniczak //user can edit everythig 91de02284cSSzymon Olewniczak $acl = array_map(function($value) { 928a638198SSzymon Olewniczak return BEZ_PERMISSION_DELETE; 93de02284cSSzymon Olewniczak }, $acl); 94*53df74e7SSzymon Olewniczak } 95de02284cSSzymon Olewniczak 96de02284cSSzymon Olewniczak return $acl; 97de02284cSSzymon Olewniczak } 98de02284cSSzymon Olewniczak 99de02284cSSzymon Olewniczak 100de02284cSSzymon Olewniczak private function check_thread(Thread $thread) { 101de02284cSSzymon Olewniczak $acl = $this->static_thread(); 102de02284cSSzymon Olewniczak 103de02284cSSzymon Olewniczak //we create new issue 104de02284cSSzymon Olewniczak if ($thread->id === NULL) { 105de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_USER) { 106de02284cSSzymon Olewniczak $acl['title'] = BEZ_PERMISSION_CHANGE; 107de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 108*53df74e7SSzymon Olewniczak $acl['type'] = BEZ_PERMISSION_CHANGE; 109de02284cSSzymon Olewniczak } 110de02284cSSzymon Olewniczak 111de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_LEADER) { 112de02284cSSzymon Olewniczak $acl['coordinator'] = BEZ_PERMISSION_CHANGE; 113*53df74e7SSzymon Olewniczak $acl['label_id'] = BEZ_PERMISSION_CHANGE; 114de02284cSSzymon Olewniczak } 115de02284cSSzymon Olewniczak 116de02284cSSzymon Olewniczak return $acl; 117de02284cSSzymon Olewniczak } 118de02284cSSzymon Olewniczak 119*53df74e7SSzymon Olewniczak //private threads 120*53df74e7SSzymon Olewniczak if ($this->level < BEZ_AUTH_ADMIN && $thread->private == '1') { 121*53df74e7SSzymon Olewniczak if ($thread->get_participant($this->model->user_nick) === false) { 122*53df74e7SSzymon Olewniczak return array_fill_keys(Thread::get_columns(), BEZ_PERMISSION_NONE); 123*53df74e7SSzymon Olewniczak } 124*53df74e7SSzymon Olewniczak } 125*53df74e7SSzymon Olewniczak 126*53df74e7SSzymon Olewniczak if ($this->level <= BEZ_AUTH_LEADER) { 127*53df74e7SSzymon Olewniczak $acl['title'] = BEZ_PERMISSION_VIEW; 128*53df74e7SSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_VIEW; 129*53df74e7SSzymon Olewniczak $acl['coordinator'] = BEZ_PERMISSION_VIEW; 130*53df74e7SSzymon Olewniczak $acl['label_id'] = BEZ_PERMISSION_VIEW; 131*53df74e7SSzymon Olewniczak $acl['private'] = BEZ_PERMISSION_VIEW; 132*53df74e7SSzymon Olewniczak } 133*53df74e7SSzymon Olewniczak 134*53df74e7SSzymon Olewniczak 135*53df74e7SSzymon Olewniczak if ($thread->state == 'proposal' && 136*53df74e7SSzymon Olewniczak $thread->original_poster == $this->model->user_nick) { 137de02284cSSzymon Olewniczak $acl['title'] = BEZ_PERMISSION_CHANGE; 138de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 139de02284cSSzymon Olewniczak } 140de02284cSSzymon Olewniczak 141*53df74e7SSzymon Olewniczak //leader can change coordinator 142*53df74e7SSzymon Olewniczak if ($thread->state == 'proposal' && 143*53df74e7SSzymon Olewniczak $this->level >= BEZ_AUTH_LEADER) { 144*53df74e7SSzymon Olewniczak 145*53df74e7SSzymon Olewniczak $acl['title'] = BEZ_PERMISSION_CHANGE; 146*53df74e7SSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 147*53df74e7SSzymon Olewniczak 148*53df74e7SSzymon Olewniczak //coordinator can change coordinator 149*53df74e7SSzymon Olewniczak $acl['coordinator'] = BEZ_PERMISSION_CHANGE; 150*53df74e7SSzymon Olewniczak } 151*53df74e7SSzymon Olewniczak 152*53df74e7SSzymon Olewniczak if ($thread->coordinator == $this->model->user_nick) { 153de02284cSSzymon Olewniczak $acl['title'] = BEZ_PERMISSION_CHANGE; 154de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 155de02284cSSzymon Olewniczak 156de02284cSSzymon Olewniczak //coordinator can change coordinator 157de02284cSSzymon Olewniczak $acl['coordinator'] = BEZ_PERMISSION_CHANGE; 158de02284cSSzymon Olewniczak 159de02284cSSzymon Olewniczak $acl['state'] = BEZ_PERMISSION_CHANGE; 160*53df74e7SSzymon Olewniczak 161*53df74e7SSzymon Olewniczak $acl['label_id'] = BEZ_PERMISSION_CHANGE; 162*53df74e7SSzymon Olewniczak 163*53df74e7SSzymon Olewniczak $acl['private'] = BEZ_PERMISSION_CHANGE; 164de02284cSSzymon Olewniczak } 165de02284cSSzymon Olewniczak 166de02284cSSzymon Olewniczak return $acl; 167de02284cSSzymon Olewniczak } 168de02284cSSzymon Olewniczak 1698a638198SSzymon Olewniczak private function static_task() { 1708a638198SSzymon Olewniczak $acl = array_fill_keys(Task::get_columns(), BEZ_PERMISSION_NONE); 171de02284cSSzymon Olewniczak 1728a638198SSzymon Olewniczak //BEZ_AUTH_VIEWER is also token viewer 173de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_VIEWER) { 174de02284cSSzymon Olewniczak //user can display everythig 175de02284cSSzymon Olewniczak $acl = array_map(function($value) { 176de02284cSSzymon Olewniczak return BEZ_PERMISSION_VIEW; 177de02284cSSzymon Olewniczak }, $acl); 178de02284cSSzymon Olewniczak } 179de02284cSSzymon Olewniczak 180*53df74e7SSzymon Olewniczak //user can add tasks 181*53df74e7SSzymon Olewniczak if ($this->level >= BEZ_AUTH_USER) { 182*53df74e7SSzymon Olewniczak $acl['id'] = BEZ_PERMISSION_CHANGE; 183*53df74e7SSzymon Olewniczak } 184*53df74e7SSzymon Olewniczak 185de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_ADMIN) { 1868a638198SSzymon Olewniczak //user can edit everythig 187de02284cSSzymon Olewniczak $acl = array_map(function($value) { 1888a638198SSzymon Olewniczak return BEZ_PERMISSION_DELETE; 189de02284cSSzymon Olewniczak }, $acl); 190*53df74e7SSzymon Olewniczak } 191de02284cSSzymon Olewniczak 192de02284cSSzymon Olewniczak return $acl; 193de02284cSSzymon Olewniczak } 1948a638198SSzymon Olewniczak 1958a638198SSzymon Olewniczak //if user can chante id => he can delete record 1968a638198SSzymon Olewniczak private function check_task($task) { 1978a638198SSzymon Olewniczak $acl = $this->static_task(); 198de02284cSSzymon Olewniczak 199de02284cSSzymon Olewniczak //we create new task 200de02284cSSzymon Olewniczak if ($task->id === NULL) { 201de02284cSSzymon Olewniczak 202ff14b107SSzymon Olewniczak if ($task->coordinator == $this->model->user_nick || 2038a638198SSzymon Olewniczak ($task->thread_id == '' && $this->level >= BEZ_AUTH_LEADER)) { 2048a638198SSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 2058a638198SSzymon Olewniczak $acl['task_program_id'] = BEZ_PERMISSION_CHANGE; 2068a638198SSzymon Olewniczak $acl['assignee'] = BEZ_PERMISSION_CHANGE; 207de02284cSSzymon Olewniczak $acl['cost'] = BEZ_PERMISSION_CHANGE; 208de02284cSSzymon Olewniczak $acl['plan_date'] = BEZ_PERMISSION_CHANGE; 209de02284cSSzymon Olewniczak $acl['all_day_event'] = BEZ_PERMISSION_CHANGE; 210de02284cSSzymon Olewniczak $acl['start_time'] = BEZ_PERMISSION_CHANGE; 211de02284cSSzymon Olewniczak $acl['finish_time'] = BEZ_PERMISSION_CHANGE; 212de02284cSSzymon Olewniczak } 213de02284cSSzymon Olewniczak 2148a638198SSzymon Olewniczak //no assignee 2158a638198SSzymon Olewniczak if ($task->thread_id == '') { 2168a638198SSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 2178a638198SSzymon Olewniczak $acl['task_program_id'] = BEZ_PERMISSION_CHANGE; 218de02284cSSzymon Olewniczak $acl['cost'] = BEZ_PERMISSION_CHANGE; 219de02284cSSzymon Olewniczak $acl['plan_date'] = BEZ_PERMISSION_CHANGE; 220de02284cSSzymon Olewniczak $acl['all_day_event'] = BEZ_PERMISSION_CHANGE; 221de02284cSSzymon Olewniczak $acl['start_time'] = BEZ_PERMISSION_CHANGE; 222de02284cSSzymon Olewniczak $acl['finish_time'] = BEZ_PERMISSION_CHANGE; 223de02284cSSzymon Olewniczak } 224de02284cSSzymon Olewniczak 225de02284cSSzymon Olewniczak return $acl; 226de02284cSSzymon Olewniczak } 227de02284cSSzymon Olewniczak 228de02284cSSzymon Olewniczak 229ff14b107SSzymon Olewniczak if ($task->coordinator == $this->model->user_nick || 2308a638198SSzymon Olewniczak ($task->thread_id == '' && $this->level >= BEZ_AUTH_LEADER)) { 231de02284cSSzymon Olewniczak 232*53df74e7SSzymon Olewniczak //we can change cause 2338a638198SSzymon Olewniczak $acl['thread_comment_id'] = BEZ_PERMISSION_CHANGE; 234de02284cSSzymon Olewniczak 235*53df74e7SSzymon Olewniczak $acl['state'] = BEZ_PERMISSION_CHANGE; 236*53df74e7SSzymon Olewniczak 2378a638198SSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 2388a638198SSzymon Olewniczak $acl['task_program_id'] = BEZ_PERMISSION_CHANGE; 2398a638198SSzymon Olewniczak $acl['assignee'] = BEZ_PERMISSION_CHANGE; 240de02284cSSzymon Olewniczak $acl['cost'] = BEZ_PERMISSION_CHANGE; 241*53df74e7SSzymon Olewniczak 242de02284cSSzymon Olewniczak $acl['plan_date'] = BEZ_PERMISSION_CHANGE; 243de02284cSSzymon Olewniczak $acl['all_day_event'] = BEZ_PERMISSION_CHANGE; 244de02284cSSzymon Olewniczak $acl['start_time'] = BEZ_PERMISSION_CHANGE; 245de02284cSSzymon Olewniczak $acl['finish_time'] = BEZ_PERMISSION_CHANGE; 246de02284cSSzymon Olewniczak } 247de02284cSSzymon Olewniczak 2488a638198SSzymon Olewniczak if ($task->thread_id == '' && 2498a638198SSzymon Olewniczak $task->original_poster == $this->model->user_nick && 2508a638198SSzymon Olewniczak $task->assignee == $this->model->user_nick) { 25116c7b168SSzymon Olewniczak 252de02284cSSzymon Olewniczak 2538a638198SSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 2548a638198SSzymon Olewniczak $acl['task_program_id'] = BEZ_PERMISSION_CHANGE; 255de02284cSSzymon Olewniczak //no executor 256de02284cSSzymon Olewniczak $acl['cost'] = BEZ_PERMISSION_CHANGE; 257de02284cSSzymon Olewniczak $acl['plan_date'] = BEZ_PERMISSION_CHANGE; 258de02284cSSzymon Olewniczak $acl['all_day_event'] = BEZ_PERMISSION_CHANGE; 259de02284cSSzymon Olewniczak $acl['start_time'] = BEZ_PERMISSION_CHANGE; 260de02284cSSzymon Olewniczak $acl['finish_time'] = BEZ_PERMISSION_CHANGE; 261de02284cSSzymon Olewniczak } 262de02284cSSzymon Olewniczak 263*53df74e7SSzymon Olewniczak //user can solve his tasks 264*53df74e7SSzymon Olewniczak if ($task->assignee == $this->model->user_nick) { 265*53df74e7SSzymon Olewniczak $acl['state'] = BEZ_PERMISSION_CHANGE; 266*53df74e7SSzymon Olewniczak } 267de02284cSSzymon Olewniczak 268de02284cSSzymon Olewniczak return $acl; 269de02284cSSzymon Olewniczak 270de02284cSSzymon Olewniczak } 2717fbf4c39SSzymon Olewniczak 2727fbf4c39SSzymon Olewniczak private function static_thread_comment() { 2737fbf4c39SSzymon Olewniczak $acl = array_fill_keys(Thread_comment::get_columns(), BEZ_PERMISSION_NONE); 2747fbf4c39SSzymon Olewniczak 2757fbf4c39SSzymon Olewniczak //virtual columns 2767fbf4c39SSzymon Olewniczak 2777fbf4c39SSzymon Olewniczak //BEZ_AUTH_VIEWER is also token viewer 2787fbf4c39SSzymon Olewniczak if ($this->level >= BEZ_AUTH_VIEWER) { 2797fbf4c39SSzymon Olewniczak //user can display everythig 2807fbf4c39SSzymon Olewniczak $acl = array_map(function($value) { 2817fbf4c39SSzymon Olewniczak return BEZ_PERMISSION_VIEW; 2827fbf4c39SSzymon Olewniczak }, $acl); 2837fbf4c39SSzymon Olewniczak } 2847fbf4c39SSzymon Olewniczak 2857fbf4c39SSzymon Olewniczak if ($this->level >= BEZ_AUTH_ADMIN) { 2867fbf4c39SSzymon Olewniczak //user can edit everythig 2877fbf4c39SSzymon Olewniczak $acl = array_map(function($value) { 2888a638198SSzymon Olewniczak return BEZ_PERMISSION_DELETE; 2897fbf4c39SSzymon Olewniczak }, $acl); 290*53df74e7SSzymon Olewniczak } 2917fbf4c39SSzymon Olewniczak 2927fbf4c39SSzymon Olewniczak return $acl; 2937fbf4c39SSzymon Olewniczak } 294de02284cSSzymon Olewniczak 2958a638198SSzymon Olewniczak private function check_thread_comment(Thread_comment $thread_comment) { 2968a638198SSzymon Olewniczak $acl = $this->static_thread_comment(); 297de02284cSSzymon Olewniczak 298de02284cSSzymon Olewniczak //we create new commcause 2998a638198SSzymon Olewniczak if ($thread_comment->id === NULL) { 300e8827d73SSzymon Olewniczak if ($this->level >= BEZ_AUTH_USER) { 301de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 302de02284cSSzymon Olewniczak } 303de02284cSSzymon Olewniczak 3048a638198SSzymon Olewniczak if ($thread_comment->coordinator === $this->model->user_nick) { 305de02284cSSzymon Olewniczak $acl['type'] = BEZ_PERMISSION_CHANGE; 306de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 307de02284cSSzymon Olewniczak } 308de02284cSSzymon Olewniczak 309de02284cSSzymon Olewniczak return $acl; 310de02284cSSzymon Olewniczak } 311de02284cSSzymon Olewniczak 312de02284cSSzymon Olewniczak 3138a638198SSzymon Olewniczak if ($thread_comment->coordinator === $this->model->user_nick) { 314de02284cSSzymon Olewniczak $acl['type'] = BEZ_PERMISSION_CHANGE; 315de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 316de02284cSSzymon Olewniczak 317de02284cSSzymon Olewniczak //we can only delete records when there is no tasks subscribed to issue 3188a638198SSzymon Olewniczak if ($thread_comment->task_count === 0) { 319de02284cSSzymon Olewniczak $acl['id'] = BEZ_PERMISSION_CHANGE; 320de02284cSSzymon Olewniczak } 321de02284cSSzymon Olewniczak 322de02284cSSzymon Olewniczak } 323de02284cSSzymon Olewniczak 324de02284cSSzymon Olewniczak //jeżeli ktoś zmieni typ z komentarza na przyczynę, tracimy możliwość edycji 3258a638198SSzymon Olewniczak if ($thread_comment->author === $this->model->user_nick && 3268a638198SSzymon Olewniczak $thread_comment->type == '0') { 327de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 328de02284cSSzymon Olewniczak 329de02284cSSzymon Olewniczak //we can only delete records when there is no tasks subscribed to issue 3308a638198SSzymon Olewniczak if ($thread_comment->task_count === 0) { 331de02284cSSzymon Olewniczak $acl['id'] = BEZ_PERMISSION_CHANGE; 332de02284cSSzymon Olewniczak } 333de02284cSSzymon Olewniczak } 334de02284cSSzymon Olewniczak 335de02284cSSzymon Olewniczak return $acl; 336de02284cSSzymon Olewniczak 337de02284cSSzymon Olewniczak } 338de02284cSSzymon Olewniczak 339de02284cSSzymon Olewniczak private function static_label() { 340de02284cSSzymon Olewniczak $acl = array_fill_keys(Label::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) { 3528a638198SSzymon Olewniczak return BEZ_PERMISSION_DELETE; 353de02284cSSzymon Olewniczak }, $acl); 354de02284cSSzymon Olewniczak } 355de02284cSSzymon Olewniczak 356de02284cSSzymon Olewniczak return $acl; 357de02284cSSzymon Olewniczak } 358de02284cSSzymon Olewniczak 359de02284cSSzymon Olewniczak private function check_label(Label $label) { 360de02284cSSzymon Olewniczak return $this->static_label(); 361de02284cSSzymon Olewniczak } 362de02284cSSzymon Olewniczak 363e8827d73SSzymon Olewniczak private function static_task_program() { 364e8827d73SSzymon Olewniczak $acl = array_fill_keys(Task_program::get_columns(), BEZ_PERMISSION_NONE); 365de02284cSSzymon Olewniczak 366de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_USER) { 367de02284cSSzymon Olewniczak //user can display everythig 368de02284cSSzymon Olewniczak $acl = array_map(function($value) { 369de02284cSSzymon Olewniczak return BEZ_PERMISSION_VIEW; 370de02284cSSzymon Olewniczak }, $acl); 371de02284cSSzymon Olewniczak } 372de02284cSSzymon Olewniczak 373de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_ADMIN) { 374de02284cSSzymon Olewniczak //admin can edit everythig 375de02284cSSzymon Olewniczak $acl = array_map(function($value) { 376e8827d73SSzymon Olewniczak return BEZ_PERMISSION_DELETE; 377de02284cSSzymon Olewniczak }, $acl); 378de02284cSSzymon Olewniczak } 379de02284cSSzymon Olewniczak 380de02284cSSzymon Olewniczak return $acl; 381de02284cSSzymon Olewniczak } 382de02284cSSzymon Olewniczak 383e8827d73SSzymon Olewniczak private function check_task_program(Task_program $task_program) { 384e8827d73SSzymon Olewniczak return $this->static_label(); 385e8827d73SSzymon Olewniczak } 386e8827d73SSzymon Olewniczak 387e8827d73SSzymon Olewniczak private function static_task_comment() { 388e8827d73SSzymon Olewniczak $acl = array_fill_keys(Task_comment::get_columns(), BEZ_PERMISSION_NONE); 389e8827d73SSzymon Olewniczak 390e8827d73SSzymon Olewniczak //BEZ_AUTH_VIEWER is also token viewer 391e8827d73SSzymon Olewniczak if ($this->level >= BEZ_AUTH_VIEWER) { 392e8827d73SSzymon Olewniczak //user can display everythig 393e8827d73SSzymon Olewniczak $acl = array_map(function($value) { 394e8827d73SSzymon Olewniczak return BEZ_PERMISSION_VIEW; 395e8827d73SSzymon Olewniczak }, $acl); 396e8827d73SSzymon Olewniczak } 397e8827d73SSzymon Olewniczak 398e8827d73SSzymon Olewniczak if ($this->level >= BEZ_AUTH_ADMIN) { 399e8827d73SSzymon Olewniczak //user can edit everything 400e8827d73SSzymon Olewniczak $acl = array_map(function($value) { 401e8827d73SSzymon Olewniczak return BEZ_PERMISSION_DELETE; 402e8827d73SSzymon Olewniczak }, $acl); 403*53df74e7SSzymon Olewniczak } 404e8827d73SSzymon Olewniczak 405e8827d73SSzymon Olewniczak return $acl; 406e8827d73SSzymon Olewniczak } 407e8827d73SSzymon Olewniczak 408e8827d73SSzymon Olewniczak private function check_task_comment(Task_comment $task_comment) { 409e8827d73SSzymon Olewniczak $acl = $this->static_task_comment(); 410e8827d73SSzymon Olewniczak 411e8827d73SSzymon Olewniczak //we create new comment 412e8827d73SSzymon Olewniczak if ($task_comment->id == NULL) { 413e8827d73SSzymon Olewniczak if ($this->level >= BEZ_AUTH_USER) { 414e8827d73SSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 415e8827d73SSzymon Olewniczak } 416e8827d73SSzymon Olewniczak 417e8827d73SSzymon Olewniczak return $acl; 418e8827d73SSzymon Olewniczak } 419e8827d73SSzymon Olewniczak 420e8827d73SSzymon Olewniczak 421e8827d73SSzymon Olewniczak if ($this->level >= BEZ_AUTH_LEADER) { 422e8827d73SSzymon Olewniczak $acl['id'] = BEZ_PERMISSION_DELETE; 423e8827d73SSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 424e8827d73SSzymon Olewniczak } 425e8827d73SSzymon Olewniczak 426e8827d73SSzymon Olewniczak 427e8827d73SSzymon Olewniczak if ($task_comment->author === $this->model->user_nick) { 428e8827d73SSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 429e8827d73SSzymon Olewniczak $acl['id'] = BEZ_PERMISSION_DELETE; 430e8827d73SSzymon Olewniczak } 431e8827d73SSzymon Olewniczak 432e8827d73SSzymon Olewniczak return $acl; 433e8827d73SSzymon Olewniczak 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