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