xref: /plugin/bez/mdl/Acl.php (revision 53df74e7ac5ae4234aac1fa716a33878a039026f)
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