xref: /plugin/bez/mdl/Acl.php (revision 16c7b168a60daa2c9b9ddcfa51e05d123a2a17dc)
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
66de02284cSSzymon Olewniczak        //virtual columns
67de02284cSSzymon Olewniczak        $acl['participants'] = BEZ_PERMISSION_NONE;
68de02284cSSzymon Olewniczak        $acl['labels'] = BEZ_PERMISSION_NONE;
69de02284cSSzymon Olewniczak
70de02284cSSzymon Olewniczak        //BEZ_AUTH_VIEWER is also token viewer
71de02284cSSzymon Olewniczak        if ($this->level >= BEZ_AUTH_VIEWER) {
72de02284cSSzymon Olewniczak            //user can display everythig
73de02284cSSzymon Olewniczak            $acl = array_map(function($value) {
74de02284cSSzymon Olewniczak                return BEZ_PERMISSION_VIEW;
75de02284cSSzymon Olewniczak            }, $acl);
76de02284cSSzymon Olewniczak        }
77de02284cSSzymon Olewniczak
78de02284cSSzymon Olewniczak        if ($this->level >= BEZ_AUTH_ADMIN) {
79de02284cSSzymon Olewniczak            //user can edit everythig
80de02284cSSzymon Olewniczak            $acl = array_map(function($value) {
818a638198SSzymon Olewniczak                return BEZ_PERMISSION_DELETE;
82de02284cSSzymon Olewniczak            }, $acl);
83de02284cSSzymon Olewniczak
84de02284cSSzymon Olewniczak            return $acl;
85de02284cSSzymon Olewniczak        }
86de02284cSSzymon Olewniczak    }
87de02284cSSzymon Olewniczak
88de02284cSSzymon Olewniczak
89de02284cSSzymon Olewniczak    private function check_thread(Thread $thread) {
90de02284cSSzymon Olewniczak        $acl = $this->static_thread();
91de02284cSSzymon Olewniczak
92de02284cSSzymon Olewniczak        //we create new issue
93de02284cSSzymon Olewniczak        if ($thread->id === NULL) {
94de02284cSSzymon Olewniczak            if ($this->level >= BEZ_AUTH_USER) {
95de02284cSSzymon Olewniczak                $acl['title'] = BEZ_PERMISSION_CHANGE;
96de02284cSSzymon Olewniczak                $acl['content'] = BEZ_PERMISSION_CHANGE;
97de02284cSSzymon Olewniczak            }
98de02284cSSzymon Olewniczak
99de02284cSSzymon Olewniczak            if ($this->level >= BEZ_AUTH_LEADER) {
100de02284cSSzymon Olewniczak                $acl['coordinator'] = BEZ_PERMISSION_CHANGE;
101de02284cSSzymon Olewniczak            }
102de02284cSSzymon Olewniczak
103de02284cSSzymon Olewniczak            return $acl;
104de02284cSSzymon Olewniczak        }
105de02284cSSzymon Olewniczak
106de02284cSSzymon Olewniczak        if ($thread->state === 'proposal' &&
107de02284cSSzymon Olewniczak            $thread->original_poster === $this->model->user_nick) {
108de02284cSSzymon Olewniczak            $acl['title'] = BEZ_PERMISSION_CHANGE;
109de02284cSSzymon Olewniczak            $acl['content'] = BEZ_PERMISSION_CHANGE;
110de02284cSSzymon Olewniczak        }
111de02284cSSzymon Olewniczak
112de02284cSSzymon Olewniczak        if ($thread->coordinator === $this->model->user_nick) {
113de02284cSSzymon Olewniczak            $acl['title'] = BEZ_PERMISSION_CHANGE;
114de02284cSSzymon Olewniczak            $acl['content'] = BEZ_PERMISSION_CHANGE;
115de02284cSSzymon Olewniczak
116de02284cSSzymon Olewniczak            //coordinator can change coordinator
117de02284cSSzymon Olewniczak            $acl['coordinator'] = BEZ_PERMISSION_CHANGE;
118de02284cSSzymon Olewniczak
119de02284cSSzymon Olewniczak            $acl['state'] = BEZ_PERMISSION_CHANGE;
120de02284cSSzymon Olewniczak        }
121de02284cSSzymon Olewniczak
122de02284cSSzymon Olewniczak        return $acl;
123de02284cSSzymon Olewniczak    }
124de02284cSSzymon Olewniczak
1258a638198SSzymon Olewniczak    private function static_task() {
1268a638198SSzymon Olewniczak        $acl = array_fill_keys(Task::get_columns(), BEZ_PERMISSION_NONE);
127de02284cSSzymon Olewniczak
128e8827d73SSzymon Olewniczak        //virtual columns
129e8827d73SSzymon Olewniczak        $acl['participants'] = BEZ_PERMISSION_NONE;
130e8827d73SSzymon Olewniczak
1318a638198SSzymon Olewniczak        //BEZ_AUTH_VIEWER is also token viewer
132de02284cSSzymon Olewniczak        if ($this->level >= BEZ_AUTH_VIEWER) {
133de02284cSSzymon Olewniczak            //user can display everythig
134de02284cSSzymon Olewniczak            $acl = array_map(function($value) {
135de02284cSSzymon Olewniczak                return BEZ_PERMISSION_VIEW;
136de02284cSSzymon Olewniczak            }, $acl);
137de02284cSSzymon Olewniczak        }
138de02284cSSzymon Olewniczak
139de02284cSSzymon Olewniczak        if ($this->level >= BEZ_AUTH_ADMIN) {
1408a638198SSzymon Olewniczak            //user can edit everythig
141de02284cSSzymon Olewniczak            $acl = array_map(function($value) {
1428a638198SSzymon Olewniczak                return BEZ_PERMISSION_DELETE;
143de02284cSSzymon Olewniczak            }, $acl);
144de02284cSSzymon Olewniczak
145de02284cSSzymon Olewniczak            return $acl;
146de02284cSSzymon Olewniczak        }
1478a638198SSzymon Olewniczak    }
1488a638198SSzymon Olewniczak
1498a638198SSzymon Olewniczak    //if user can chante id => he can delete record
1508a638198SSzymon Olewniczak    private function check_task($task) {
1518a638198SSzymon Olewniczak        $acl = $this->static_task();
152de02284cSSzymon Olewniczak
153de02284cSSzymon Olewniczak        //we create new task
154de02284cSSzymon Olewniczak        if ($task->id === NULL) {
155de02284cSSzymon Olewniczak
156ff14b107SSzymon Olewniczak            if ($task->coordinator == $this->model->user_nick ||
1578a638198SSzymon Olewniczak               ($task->thread_id == '' && $this->level >= BEZ_AUTH_LEADER)) {
1588a638198SSzymon Olewniczak                $acl['content'] = BEZ_PERMISSION_CHANGE;
1598a638198SSzymon Olewniczak                $acl['task_program_id'] = BEZ_PERMISSION_CHANGE;
1608a638198SSzymon Olewniczak                $acl['assignee'] = BEZ_PERMISSION_CHANGE;
161de02284cSSzymon Olewniczak                $acl['cost'] = BEZ_PERMISSION_CHANGE;
162de02284cSSzymon Olewniczak                $acl['plan_date'] = BEZ_PERMISSION_CHANGE;
163de02284cSSzymon Olewniczak                $acl['all_day_event'] = BEZ_PERMISSION_CHANGE;
164de02284cSSzymon Olewniczak                $acl['start_time'] = BEZ_PERMISSION_CHANGE;
165de02284cSSzymon Olewniczak                $acl['finish_time'] = BEZ_PERMISSION_CHANGE;
166de02284cSSzymon Olewniczak            }
167de02284cSSzymon Olewniczak
1688a638198SSzymon Olewniczak            //no assignee
1698a638198SSzymon Olewniczak            if ($task->thread_id == '') {
1708a638198SSzymon Olewniczak                $acl['content'] = BEZ_PERMISSION_CHANGE;
1718a638198SSzymon Olewniczak                $acl['task_program_id'] = BEZ_PERMISSION_CHANGE;
172de02284cSSzymon Olewniczak                $acl['cost'] = BEZ_PERMISSION_CHANGE;
173de02284cSSzymon Olewniczak                $acl['plan_date'] = BEZ_PERMISSION_CHANGE;
174de02284cSSzymon Olewniczak                $acl['all_day_event'] = BEZ_PERMISSION_CHANGE;
175de02284cSSzymon Olewniczak                $acl['start_time'] = BEZ_PERMISSION_CHANGE;
176de02284cSSzymon Olewniczak                $acl['finish_time'] = BEZ_PERMISSION_CHANGE;
177de02284cSSzymon Olewniczak            }
178de02284cSSzymon Olewniczak
179de02284cSSzymon Olewniczak            return $acl;
180de02284cSSzymon Olewniczak        }
181de02284cSSzymon Olewniczak
182de02284cSSzymon Olewniczak
183ff14b107SSzymon Olewniczak        if ($task->coordinator == $this->model->user_nick ||
1848a638198SSzymon Olewniczak            ($task->thread_id == '' && $this->level >= BEZ_AUTH_LEADER)) {
185de02284cSSzymon Olewniczak
186de02284cSSzymon Olewniczak            //we can chante cause
1878a638198SSzymon Olewniczak            $acl['thread_comment_id'] =  BEZ_PERMISSION_CHANGE;
188de02284cSSzymon Olewniczak
1898a638198SSzymon Olewniczak            $acl['content'] = BEZ_PERMISSION_CHANGE;
1908a638198SSzymon Olewniczak            $acl['task_program_id'] = BEZ_PERMISSION_CHANGE;
1918a638198SSzymon Olewniczak            $acl['assignee'] = BEZ_PERMISSION_CHANGE;
192de02284cSSzymon Olewniczak            $acl['cost'] = BEZ_PERMISSION_CHANGE;
1938a638198SSzymon Olewniczak            //$acl['reason'] = BEZ_PERMISSION_CHANGE;
194de02284cSSzymon Olewniczak            $acl['plan_date'] = BEZ_PERMISSION_CHANGE;
195de02284cSSzymon Olewniczak            $acl['all_day_event'] = BEZ_PERMISSION_CHANGE;
196de02284cSSzymon Olewniczak            $acl['start_time'] = BEZ_PERMISSION_CHANGE;
197de02284cSSzymon Olewniczak            $acl['finish_time'] = BEZ_PERMISSION_CHANGE;
198de02284cSSzymon Olewniczak        }
199de02284cSSzymon Olewniczak
2008a638198SSzymon Olewniczak        if ($task->thread_id == '' &&
2018a638198SSzymon Olewniczak            $task->original_poster == $this->model->user_nick &&
2028a638198SSzymon Olewniczak            $task->assignee == $this->model->user_nick) {
203*16c7b168SSzymon Olewniczak
204de02284cSSzymon Olewniczak
2058a638198SSzymon Olewniczak            $acl['content'] = BEZ_PERMISSION_CHANGE;
2068a638198SSzymon Olewniczak            $acl['task_program_id'] = BEZ_PERMISSION_CHANGE;
207de02284cSSzymon Olewniczak            //no executor
208de02284cSSzymon Olewniczak            $acl['cost'] = BEZ_PERMISSION_CHANGE;
209de02284cSSzymon Olewniczak            $acl['plan_date'] = BEZ_PERMISSION_CHANGE;
210de02284cSSzymon Olewniczak            $acl['all_day_event'] = BEZ_PERMISSION_CHANGE;
211de02284cSSzymon Olewniczak            $acl['start_time'] = BEZ_PERMISSION_CHANGE;
212de02284cSSzymon Olewniczak            $acl['finish_time'] = BEZ_PERMISSION_CHANGE;
213de02284cSSzymon Olewniczak        }
214de02284cSSzymon Olewniczak
215de02284cSSzymon Olewniczak
216de02284cSSzymon Olewniczak        return $acl;
217de02284cSSzymon Olewniczak
218de02284cSSzymon Olewniczak    }
2197fbf4c39SSzymon Olewniczak
2207fbf4c39SSzymon Olewniczak    private function static_thread_comment() {
2217fbf4c39SSzymon Olewniczak        $acl = array_fill_keys(Thread_comment::get_columns(), BEZ_PERMISSION_NONE);
2227fbf4c39SSzymon Olewniczak
2237fbf4c39SSzymon Olewniczak        //virtual columns
2247fbf4c39SSzymon Olewniczak
2257fbf4c39SSzymon Olewniczak        //BEZ_AUTH_VIEWER is also token viewer
2267fbf4c39SSzymon Olewniczak        if ($this->level >= BEZ_AUTH_VIEWER) {
2277fbf4c39SSzymon Olewniczak            //user can display everythig
2287fbf4c39SSzymon Olewniczak            $acl = array_map(function($value) {
2297fbf4c39SSzymon Olewniczak                return BEZ_PERMISSION_VIEW;
2307fbf4c39SSzymon Olewniczak            }, $acl);
2317fbf4c39SSzymon Olewniczak        }
2327fbf4c39SSzymon Olewniczak
2337fbf4c39SSzymon Olewniczak        if ($this->level >= BEZ_AUTH_ADMIN) {
2347fbf4c39SSzymon Olewniczak            //user can edit everythig
2357fbf4c39SSzymon Olewniczak            $acl = array_map(function($value) {
2368a638198SSzymon Olewniczak                return BEZ_PERMISSION_DELETE;
2377fbf4c39SSzymon Olewniczak            }, $acl);
2387fbf4c39SSzymon Olewniczak
2397fbf4c39SSzymon Olewniczak            return $acl;
2407fbf4c39SSzymon Olewniczak        }
2417fbf4c39SSzymon Olewniczak    }
242de02284cSSzymon Olewniczak
2438a638198SSzymon Olewniczak    private function check_thread_comment(Thread_comment $thread_comment) {
2448a638198SSzymon Olewniczak        $acl = $this->static_thread_comment();
245de02284cSSzymon Olewniczak
246de02284cSSzymon Olewniczak        //we create new commcause
2478a638198SSzymon Olewniczak        if ($thread_comment->id === NULL) {
248e8827d73SSzymon Olewniczak            if ($this->level >= BEZ_AUTH_USER) {
249de02284cSSzymon Olewniczak                $acl['content'] = BEZ_PERMISSION_CHANGE;
250de02284cSSzymon Olewniczak            }
251de02284cSSzymon Olewniczak
2528a638198SSzymon Olewniczak            if ($thread_comment->coordinator === $this->model->user_nick) {
253de02284cSSzymon Olewniczak                $acl['type'] = BEZ_PERMISSION_CHANGE;
254de02284cSSzymon Olewniczak                $acl['content'] = BEZ_PERMISSION_CHANGE;
255de02284cSSzymon Olewniczak            }
256de02284cSSzymon Olewniczak
257de02284cSSzymon Olewniczak            return $acl;
258de02284cSSzymon Olewniczak        }
259de02284cSSzymon Olewniczak
260de02284cSSzymon Olewniczak
2618a638198SSzymon Olewniczak        if ($thread_comment->coordinator === $this->model->user_nick) {
262de02284cSSzymon Olewniczak            $acl['type'] = BEZ_PERMISSION_CHANGE;
263de02284cSSzymon Olewniczak            $acl['content'] = BEZ_PERMISSION_CHANGE;
264de02284cSSzymon Olewniczak
265de02284cSSzymon Olewniczak            //we can only delete records when there is no tasks subscribed to issue
2668a638198SSzymon Olewniczak            if ($thread_comment->task_count === 0) {
267de02284cSSzymon Olewniczak                 $acl['id'] = BEZ_PERMISSION_CHANGE;
268de02284cSSzymon Olewniczak            }
269de02284cSSzymon Olewniczak
270de02284cSSzymon Olewniczak        }
271de02284cSSzymon Olewniczak
272de02284cSSzymon Olewniczak        //jeżeli ktoś zmieni typ z komentarza na przyczynę, tracimy możliwość edycji
2738a638198SSzymon Olewniczak        if ($thread_comment->author === $this->model->user_nick &&
2748a638198SSzymon Olewniczak            $thread_comment->type == '0') {
275de02284cSSzymon Olewniczak            $acl['content'] = BEZ_PERMISSION_CHANGE;
276de02284cSSzymon Olewniczak
277de02284cSSzymon Olewniczak            //we can only delete records when there is no tasks subscribed to issue
2788a638198SSzymon Olewniczak            if ($thread_comment->task_count === 0) {
279de02284cSSzymon Olewniczak                 $acl['id'] = BEZ_PERMISSION_CHANGE;
280de02284cSSzymon Olewniczak            }
281de02284cSSzymon Olewniczak        }
282de02284cSSzymon Olewniczak
283de02284cSSzymon Olewniczak        return $acl;
284de02284cSSzymon Olewniczak
285de02284cSSzymon Olewniczak    }
286de02284cSSzymon Olewniczak
287de02284cSSzymon Olewniczak    private function static_label() {
288de02284cSSzymon Olewniczak        $acl = array_fill_keys(Label::get_columns(), BEZ_PERMISSION_NONE);
289de02284cSSzymon Olewniczak
290de02284cSSzymon Olewniczak        if ($this->level >= BEZ_AUTH_USER) {
291de02284cSSzymon Olewniczak            //user can display everythig
292de02284cSSzymon Olewniczak            $acl = array_map(function($value) {
293de02284cSSzymon Olewniczak                return BEZ_PERMISSION_VIEW;
294de02284cSSzymon Olewniczak            }, $acl);
295de02284cSSzymon Olewniczak        }
296de02284cSSzymon Olewniczak
297de02284cSSzymon Olewniczak        if ($this->level >= BEZ_AUTH_ADMIN) {
298de02284cSSzymon Olewniczak            //admin can edit everythig
299de02284cSSzymon Olewniczak            $acl = array_map(function($value) {
3008a638198SSzymon Olewniczak                return BEZ_PERMISSION_DELETE;
301de02284cSSzymon Olewniczak            }, $acl);
302de02284cSSzymon Olewniczak        }
303de02284cSSzymon Olewniczak
304de02284cSSzymon Olewniczak        return $acl;
305de02284cSSzymon Olewniczak    }
306de02284cSSzymon Olewniczak
307de02284cSSzymon Olewniczak    private function check_label(Label $label) {
308de02284cSSzymon Olewniczak        return $this->static_label();
309de02284cSSzymon Olewniczak    }
310de02284cSSzymon Olewniczak
311e8827d73SSzymon Olewniczak    private function static_task_program() {
312e8827d73SSzymon Olewniczak        $acl = array_fill_keys(Task_program::get_columns(), BEZ_PERMISSION_NONE);
313de02284cSSzymon Olewniczak
314de02284cSSzymon Olewniczak        if ($this->level >= BEZ_AUTH_USER) {
315de02284cSSzymon Olewniczak            //user can display everythig
316de02284cSSzymon Olewniczak            $acl = array_map(function($value) {
317de02284cSSzymon Olewniczak                return BEZ_PERMISSION_VIEW;
318de02284cSSzymon Olewniczak            }, $acl);
319de02284cSSzymon Olewniczak        }
320de02284cSSzymon Olewniczak
321de02284cSSzymon Olewniczak        if ($this->level >= BEZ_AUTH_ADMIN) {
322de02284cSSzymon Olewniczak            //admin can edit everythig
323de02284cSSzymon Olewniczak            $acl = array_map(function($value) {
324e8827d73SSzymon Olewniczak                return BEZ_PERMISSION_DELETE;
325de02284cSSzymon Olewniczak            }, $acl);
326de02284cSSzymon Olewniczak        }
327de02284cSSzymon Olewniczak
328de02284cSSzymon Olewniczak        return $acl;
329de02284cSSzymon Olewniczak    }
330de02284cSSzymon Olewniczak
331e8827d73SSzymon Olewniczak    private function check_task_program(Task_program $task_program) {
332e8827d73SSzymon Olewniczak        return $this->static_label();
333e8827d73SSzymon Olewniczak    }
334e8827d73SSzymon Olewniczak
335e8827d73SSzymon Olewniczak    private function static_task_comment() {
336e8827d73SSzymon Olewniczak        $acl = array_fill_keys(Task_comment::get_columns(), BEZ_PERMISSION_NONE);
337e8827d73SSzymon Olewniczak
338e8827d73SSzymon Olewniczak        //BEZ_AUTH_VIEWER is also token viewer
339e8827d73SSzymon Olewniczak        if ($this->level >= BEZ_AUTH_VIEWER) {
340e8827d73SSzymon Olewniczak            //user can display everythig
341e8827d73SSzymon Olewniczak            $acl = array_map(function($value) {
342e8827d73SSzymon Olewniczak                return BEZ_PERMISSION_VIEW;
343e8827d73SSzymon Olewniczak            }, $acl);
344e8827d73SSzymon Olewniczak        }
345e8827d73SSzymon Olewniczak
346e8827d73SSzymon Olewniczak        if ($this->level >= BEZ_AUTH_ADMIN) {
347e8827d73SSzymon Olewniczak            //user can edit everything
348e8827d73SSzymon Olewniczak            $acl = array_map(function($value) {
349e8827d73SSzymon Olewniczak                return BEZ_PERMISSION_DELETE;
350e8827d73SSzymon Olewniczak            }, $acl);
351e8827d73SSzymon Olewniczak
352e8827d73SSzymon Olewniczak            return $acl;
353e8827d73SSzymon Olewniczak        }
354e8827d73SSzymon Olewniczak    }
355e8827d73SSzymon Olewniczak
356e8827d73SSzymon Olewniczak    private function check_task_comment(Task_comment $task_comment) {
357e8827d73SSzymon Olewniczak        $acl = $this->static_task_comment();
358e8827d73SSzymon Olewniczak
359e8827d73SSzymon Olewniczak        //we create new comment
360e8827d73SSzymon Olewniczak        if ($task_comment->id == NULL) {
361e8827d73SSzymon Olewniczak            if ($this->level >= BEZ_AUTH_USER) {
362e8827d73SSzymon Olewniczak                $acl['content'] = BEZ_PERMISSION_CHANGE;
363e8827d73SSzymon Olewniczak            }
364e8827d73SSzymon Olewniczak
365e8827d73SSzymon Olewniczak            return $acl;
366e8827d73SSzymon Olewniczak        }
367e8827d73SSzymon Olewniczak
368e8827d73SSzymon Olewniczak
369e8827d73SSzymon Olewniczak        if ($this->level >= BEZ_AUTH_LEADER) {
370e8827d73SSzymon Olewniczak            $acl['id'] = BEZ_PERMISSION_DELETE;
371e8827d73SSzymon Olewniczak            $acl['content'] = BEZ_PERMISSION_CHANGE;
372e8827d73SSzymon Olewniczak        }
373e8827d73SSzymon Olewniczak
374e8827d73SSzymon Olewniczak
375e8827d73SSzymon Olewniczak        if ($task_comment->author === $this->model->user_nick) {
376e8827d73SSzymon Olewniczak            $acl['content'] = BEZ_PERMISSION_CHANGE;
377e8827d73SSzymon Olewniczak            $acl['id'] = BEZ_PERMISSION_DELETE;
378e8827d73SSzymon Olewniczak        }
379e8827d73SSzymon Olewniczak
380e8827d73SSzymon Olewniczak        return $acl;
381e8827d73SSzymon Olewniczak
382e8827d73SSzymon Olewniczak    }
383e8827d73SSzymon Olewniczak
384de02284cSSzymon Olewniczak    /*returns array */
385de02284cSSzymon Olewniczak    public function check(Entity $obj) {
386de02284cSSzymon Olewniczak        $method = 'check_'.$obj->get_table_name();
387de02284cSSzymon Olewniczak        if (!method_exists($this, $method)) {
388de02284cSSzymon Olewniczak            throw new \Exception('no acl rules set for table: '.$obj->get_table_name());
389de02284cSSzymon Olewniczak        }
390de02284cSSzymon Olewniczak        return $this->$method($obj);
391de02284cSSzymon Olewniczak    }
392de02284cSSzymon Olewniczak
393de02284cSSzymon Olewniczak    public function check_field(Entity $obj, $field) {
394de02284cSSzymon Olewniczak        $acl = $this->check($obj);
395de02284cSSzymon Olewniczak
396de02284cSSzymon Olewniczak        if (isset($acl[$field])) {
397de02284cSSzymon Olewniczak            return $acl[$field];
398de02284cSSzymon Olewniczak        }
399de02284cSSzymon Olewniczak        return BEZ_PERMISSION_UNKNOWN;
400de02284cSSzymon Olewniczak    }
401de02284cSSzymon Olewniczak
402de02284cSSzymon Olewniczak    public function check_static($table) {
403de02284cSSzymon Olewniczak        $method = 'static_'.$table;
404de02284cSSzymon Olewniczak        if (!method_exists($this, $method)) {
405de02284cSSzymon Olewniczak            throw new \Exception('no acl rules set for table: '.$table);
406de02284cSSzymon Olewniczak        }
407de02284cSSzymon Olewniczak        return $this->$method($table);
408de02284cSSzymon Olewniczak    }
409de02284cSSzymon Olewniczak
410de02284cSSzymon Olewniczak    public function check_static_field($table, $field) {
411de02284cSSzymon Olewniczak        $acl = $this->check_static($table);
412de02284cSSzymon Olewniczak        return $acl[$field];
413de02284cSSzymon Olewniczak    }
414de02284cSSzymon Olewniczak
415de02284cSSzymon Olewniczak
4168a638198SSzymon Olewniczak    public function can(Entity $obj, $field, $what=BEZ_PERMISSION_CHANGE) {
4178a638198SSzymon Olewniczak        if ($this->check_field($obj, $field) < $what) {
418de02284cSSzymon Olewniczak            $table = $obj->get_table_name();
419de02284cSSzymon Olewniczak            $id = $obj->id;
420de02284cSSzymon Olewniczak            throw new PermissionDeniedException('user cannot change field "'.$field.'" in table "'.$table.', rowid: "'.$id.'"');
421de02284cSSzymon Olewniczak        }
422de02284cSSzymon Olewniczak    }
423de02284cSSzymon Olewniczak}
424