1*de02284cSSzymon Olewniczak<?php 2*de02284cSSzymon Olewniczak 3*de02284cSSzymon Olewniczak//if(!defined('DOKU_INC')) die('meh.'); 4*de02284cSSzymon Olewniczak// 5*de02284cSSzymon Olewniczak//include_once DOKU_PLUGIN."bez/models/tokens.php"; 6*de02284cSSzymon Olewniczak 7*de02284cSSzymon Olewniczaknamespace dokuwiki\plugin\bez\mdl; 8*de02284cSSzymon Olewniczak 9*de02284cSSzymon Olewniczak//ACL level defines 10*de02284cSSzymon Olewniczakuse dokuwiki\plugin\bez\meta\PermissionDeniedException; 11*de02284cSSzymon Olewniczak 12*de02284cSSzymon Olewniczakdefine('BEZ_AUTH_NONE', 0); 13*de02284cSSzymon Olewniczakdefine('BEZ_AUTH_VIEWER', 2); 14*de02284cSSzymon Olewniczakdefine('BEZ_AUTH_USER', 5); 15*de02284cSSzymon Olewniczakdefine('BEZ_AUTH_LEADER', 10); 16*de02284cSSzymon Olewniczakdefine('BEZ_AUTH_ADMIN', 20); 17*de02284cSSzymon Olewniczak 18*de02284cSSzymon Olewniczakdefine('BEZ_PERMISSION_UNKNOWN', -1); 19*de02284cSSzymon Olewniczakdefine('BEZ_PERMISSION_NONE', 0); 20*de02284cSSzymon Olewniczakdefine('BEZ_PERMISSION_VIEW', 1); 21*de02284cSSzymon Olewniczakdefine('BEZ_PERMISSION_CHANGE', 2); 22*de02284cSSzymon Olewniczak 23*de02284cSSzymon Olewniczakclass Acl { 24*de02284cSSzymon Olewniczak /** @var Model */ 25*de02284cSSzymon Olewniczak private $model; 26*de02284cSSzymon Olewniczak 27*de02284cSSzymon Olewniczak private $level = BEZ_AUTH_NONE; 28*de02284cSSzymon Olewniczak 29*de02284cSSzymon Olewniczak// private $threads = array(); 30*de02284cSSzymon Olewniczak// private $commcauses = array(); 31*de02284cSSzymon Olewniczak// private $tasks = array(); 32*de02284cSSzymon Olewniczak 33*de02284cSSzymon Olewniczak private function update_level($level) { 34*de02284cSSzymon Olewniczak if ($level > $this->level) { 35*de02284cSSzymon Olewniczak $this->level = $level; 36*de02284cSSzymon Olewniczak } 37*de02284cSSzymon Olewniczak } 38*de02284cSSzymon Olewniczak 39*de02284cSSzymon Olewniczak public function get_level() { 40*de02284cSSzymon Olewniczak return $this->level; 41*de02284cSSzymon Olewniczak } 42*de02284cSSzymon Olewniczak 43*de02284cSSzymon Olewniczak public function __construct(Model $model) { 44*de02284cSSzymon Olewniczak $this->model = $model; 45*de02284cSSzymon Olewniczak 46*de02284cSSzymon Olewniczak $userd = $this->model->dw_auth->getUserData($this->model->user_nick); 47*de02284cSSzymon Olewniczak if ($userd !== false && is_array($userd['grps'])) { 48*de02284cSSzymon Olewniczak $grps = $userd['grps']; 49*de02284cSSzymon Olewniczak if (in_array('admin', $grps ) || in_array('bez_admin', $grps )) { 50*de02284cSSzymon Olewniczak $this->update_level(BEZ_AUTH_ADMIN); 51*de02284cSSzymon Olewniczak } elseif (in_array('bez_leader', $grps )) { 52*de02284cSSzymon Olewniczak $this->update_level(BEZ_AUTH_LEADER); 53*de02284cSSzymon Olewniczak } else { 54*de02284cSSzymon Olewniczak $this->update_level(BEZ_AUTH_USER); 55*de02284cSSzymon Olewniczak } 56*de02284cSSzymon Olewniczak } elseif (isset($_GET['t'])) { 57*de02284cSSzymon Olewniczak// $page_id = $this->model->action->page_id(); 58*de02284cSSzymon Olewniczak// $toko = new Tokens(); 59*de02284cSSzymon Olewniczak// 60*de02284cSSzymon Olewniczak// if ($toko->check(trim($_GET['t']), $page_id)) { 61*de02284cSSzymon Olewniczak// $this->update_level(BEZ_AUTH_VIEWER); 62*de02284cSSzymon Olewniczak// } 63*de02284cSSzymon Olewniczak } 64*de02284cSSzymon Olewniczak } 65*de02284cSSzymon Olewniczak 66*de02284cSSzymon Olewniczak private function static_thread() { 67*de02284cSSzymon Olewniczak $acl = array_fill_keys(Thread::get_columns(), BEZ_PERMISSION_NONE); 68*de02284cSSzymon Olewniczak 69*de02284cSSzymon Olewniczak //virtual columns 70*de02284cSSzymon Olewniczak $acl['participants'] = BEZ_PERMISSION_NONE; 71*de02284cSSzymon Olewniczak $acl['labels'] = BEZ_PERMISSION_NONE; 72*de02284cSSzymon Olewniczak 73*de02284cSSzymon Olewniczak //BEZ_AUTH_VIEWER is also token viewer 74*de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_VIEWER) { 75*de02284cSSzymon Olewniczak //user can display everythig 76*de02284cSSzymon Olewniczak $acl = array_map(function($value) { 77*de02284cSSzymon Olewniczak return BEZ_PERMISSION_VIEW; 78*de02284cSSzymon Olewniczak }, $acl); 79*de02284cSSzymon Olewniczak } 80*de02284cSSzymon Olewniczak 81*de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_ADMIN) { 82*de02284cSSzymon Olewniczak //user can edit everythig 83*de02284cSSzymon Olewniczak $acl = array_map(function($value) { 84*de02284cSSzymon Olewniczak return BEZ_PERMISSION_CHANGE; 85*de02284cSSzymon Olewniczak }, $acl); 86*de02284cSSzymon Olewniczak 87*de02284cSSzymon Olewniczak return $acl; 88*de02284cSSzymon Olewniczak } 89*de02284cSSzymon Olewniczak } 90*de02284cSSzymon Olewniczak 91*de02284cSSzymon Olewniczak 92*de02284cSSzymon Olewniczak private function check_thread(Thread $thread) { 93*de02284cSSzymon Olewniczak// $acl = array( 94*de02284cSSzymon Olewniczak// 'id' => BEZ_PERMISSION_NONE, 95*de02284cSSzymon Olewniczak// 'title' => BEZ_PERMISSION_NONE, 96*de02284cSSzymon Olewniczak// 'description' => BEZ_PERMISSION_NONE, 97*de02284cSSzymon Olewniczak// 'state' => BEZ_PERMISSION_NONE, 98*de02284cSSzymon Olewniczak// 'opinion' => BEZ_PERMISSION_NONE, 99*de02284cSSzymon Olewniczak// 'type' => BEZ_PERMISSION_NONE, 100*de02284cSSzymon Olewniczak// 'coordinator' => BEZ_PERMISSION_NONE, 101*de02284cSSzymon Olewniczak// 'reporter' => BEZ_PERMISSION_NONE, 102*de02284cSSzymon Olewniczak// 'date' => BEZ_PERMISSION_NONE, 103*de02284cSSzymon Olewniczak// 'last_mod' => BEZ_PERMISSION_NONE, 104*de02284cSSzymon Olewniczak// 'last_activity' => BEZ_PERMISSION_NONE, 105*de02284cSSzymon Olewniczak// 'participants' => BEZ_PERMISSION_NONE, 106*de02284cSSzymon Olewniczak// 'subscribents' => BEZ_PERMISSION_NONE, 107*de02284cSSzymon Olewniczak// 'description_cache' => BEZ_PERMISSION_NONE, 108*de02284cSSzymon Olewniczak// 'opinion_cache' => BEZ_PERMISSION_NONE 109*de02284cSSzymon Olewniczak// ); 110*de02284cSSzymon Olewniczak 111*de02284cSSzymon Olewniczak $acl = $this->static_thread(); 112*de02284cSSzymon Olewniczak 113*de02284cSSzymon Olewniczak //we create new issue 114*de02284cSSzymon Olewniczak if ($thread->id === NULL) { 115*de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_USER) { 116*de02284cSSzymon Olewniczak $acl['title'] = BEZ_PERMISSION_CHANGE; 117*de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 118*de02284cSSzymon Olewniczak //$acl['type'] = BEZ_PERMISSION_CHANGE; 119*de02284cSSzymon Olewniczak } 120*de02284cSSzymon Olewniczak 121*de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_LEADER) { 122*de02284cSSzymon Olewniczak $acl['coordinator'] = BEZ_PERMISSION_CHANGE; 123*de02284cSSzymon Olewniczak } 124*de02284cSSzymon Olewniczak 125*de02284cSSzymon Olewniczak return $acl; 126*de02284cSSzymon Olewniczak } 127*de02284cSSzymon Olewniczak 128*de02284cSSzymon Olewniczak if ($thread->state === 'proposal' && 129*de02284cSSzymon Olewniczak $thread->original_poster === $this->model->user_nick) { 130*de02284cSSzymon Olewniczak $acl['title'] = BEZ_PERMISSION_CHANGE; 131*de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 132*de02284cSSzymon Olewniczak //$acl['type'] = BEZ_PERMISSION_CHANGE; 133*de02284cSSzymon Olewniczak } 134*de02284cSSzymon Olewniczak 135*de02284cSSzymon Olewniczak if ($thread->coordinator === $this->model->user_nick) { 136*de02284cSSzymon Olewniczak $acl['title'] = BEZ_PERMISSION_CHANGE; 137*de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 138*de02284cSSzymon Olewniczak //$acl['type'] = BEZ_PERMISSION_CHANGE; 139*de02284cSSzymon Olewniczak 140*de02284cSSzymon Olewniczak //coordinator can change coordinator 141*de02284cSSzymon Olewniczak $acl['coordinator'] = BEZ_PERMISSION_CHANGE; 142*de02284cSSzymon Olewniczak 143*de02284cSSzymon Olewniczak $acl['state'] = BEZ_PERMISSION_CHANGE; 144*de02284cSSzymon Olewniczak //$acl['opinion'] = BEZ_PERMISSION_CHANGE; 145*de02284cSSzymon Olewniczak } 146*de02284cSSzymon Olewniczak 147*de02284cSSzymon Olewniczak return $acl; 148*de02284cSSzymon Olewniczak } 149*de02284cSSzymon Olewniczak 150*de02284cSSzymon Olewniczak //if user can chante id => he can delete record 151*de02284cSSzymon Olewniczak private function check_task($task) { 152*de02284cSSzymon Olewniczak $acl = array( 153*de02284cSSzymon Olewniczak 'id' => BEZ_PERMISSION_NONE, 154*de02284cSSzymon Olewniczak 'task' => BEZ_PERMISSION_NONE, 155*de02284cSSzymon Olewniczak 'state' => BEZ_PERMISSION_NONE, 156*de02284cSSzymon Olewniczak 'tasktype' => BEZ_PERMISSION_NONE, 157*de02284cSSzymon Olewniczak 'executor' => BEZ_PERMISSION_NONE, 158*de02284cSSzymon Olewniczak 'cost' => BEZ_PERMISSION_NONE, 159*de02284cSSzymon Olewniczak 'reason' => BEZ_PERMISSION_NONE, 160*de02284cSSzymon Olewniczak 'reporter' => BEZ_PERMISSION_NONE, 161*de02284cSSzymon Olewniczak 'date' => BEZ_PERMISSION_NONE, 162*de02284cSSzymon Olewniczak 'close_date' => BEZ_PERMISSION_NONE, 163*de02284cSSzymon Olewniczak 'cause' => BEZ_PERMISSION_NONE, 164*de02284cSSzymon Olewniczak 'plan_date' => BEZ_PERMISSION_NONE, 165*de02284cSSzymon Olewniczak 'all_day_event' => BEZ_PERMISSION_NONE, 166*de02284cSSzymon Olewniczak 'start_time' => BEZ_PERMISSION_NONE, 167*de02284cSSzymon Olewniczak 'finish_time' => BEZ_PERMISSION_NONE, 168*de02284cSSzymon Olewniczak 'issue' => BEZ_PERMISSION_NONE, 169*de02284cSSzymon Olewniczak 'task_cache' => BEZ_PERMISSION_NONE, 170*de02284cSSzymon Olewniczak 'reason_cache' => BEZ_PERMISSION_NONE, 171*de02284cSSzymon Olewniczak 'subscribents' => BEZ_PERMISSION_NONE 172*de02284cSSzymon Olewniczak ); 173*de02284cSSzymon Olewniczak 174*de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_VIEWER) { 175*de02284cSSzymon Olewniczak //user can display everythig 176*de02284cSSzymon Olewniczak $acl = array_map(function($value) { 177*de02284cSSzymon Olewniczak return BEZ_PERMISSION_VIEW; 178*de02284cSSzymon Olewniczak }, $acl); 179*de02284cSSzymon Olewniczak } 180*de02284cSSzymon Olewniczak 181*de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_ADMIN) { 182*de02284cSSzymon Olewniczak //admin can edit everythig 183*de02284cSSzymon Olewniczak $acl = array_map(function($value) { 184*de02284cSSzymon Olewniczak return BEZ_PERMISSION_CHANGE; 185*de02284cSSzymon Olewniczak }, $acl); 186*de02284cSSzymon Olewniczak 187*de02284cSSzymon Olewniczak return $acl; 188*de02284cSSzymon Olewniczak } 189*de02284cSSzymon Olewniczak 190*de02284cSSzymon Olewniczak //we create new task 191*de02284cSSzymon Olewniczak if ($task->id === NULL) { 192*de02284cSSzymon Olewniczak 193*de02284cSSzymon Olewniczak if ($task->coordinator === $this->model->user_nick || 194*de02284cSSzymon Olewniczak ($task->issue === '' && $this->level >= BEZ_AUTH_LEADER)) { 195*de02284cSSzymon Olewniczak $acl['task'] = BEZ_PERMISSION_CHANGE; 196*de02284cSSzymon Olewniczak $acl['tasktype'] = BEZ_PERMISSION_CHANGE; 197*de02284cSSzymon Olewniczak $acl['executor'] = BEZ_PERMISSION_CHANGE; 198*de02284cSSzymon Olewniczak $acl['cost'] = BEZ_PERMISSION_CHANGE; 199*de02284cSSzymon Olewniczak $acl['plan_date'] = BEZ_PERMISSION_CHANGE; 200*de02284cSSzymon Olewniczak $acl['all_day_event'] = BEZ_PERMISSION_CHANGE; 201*de02284cSSzymon Olewniczak $acl['start_time'] = BEZ_PERMISSION_CHANGE; 202*de02284cSSzymon Olewniczak $acl['finish_time'] = BEZ_PERMISSION_CHANGE; 203*de02284cSSzymon Olewniczak } 204*de02284cSSzymon Olewniczak 205*de02284cSSzymon Olewniczak //przypisujemy zadanie programowe samemu sobie 206*de02284cSSzymon Olewniczak //no executor 207*de02284cSSzymon Olewniczak if ($task->issue === '') { 208*de02284cSSzymon Olewniczak $acl['task'] = BEZ_PERMISSION_CHANGE; 209*de02284cSSzymon Olewniczak $acl['tasktype'] = BEZ_PERMISSION_CHANGE; 210*de02284cSSzymon Olewniczak $acl['cost'] = BEZ_PERMISSION_CHANGE; 211*de02284cSSzymon Olewniczak $acl['plan_date'] = BEZ_PERMISSION_CHANGE; 212*de02284cSSzymon Olewniczak $acl['all_day_event'] = BEZ_PERMISSION_CHANGE; 213*de02284cSSzymon Olewniczak $acl['start_time'] = BEZ_PERMISSION_CHANGE; 214*de02284cSSzymon Olewniczak $acl['finish_time'] = BEZ_PERMISSION_CHANGE; 215*de02284cSSzymon Olewniczak } 216*de02284cSSzymon Olewniczak 217*de02284cSSzymon Olewniczak return $acl; 218*de02284cSSzymon Olewniczak } 219*de02284cSSzymon Olewniczak 220*de02284cSSzymon Olewniczak //user can change state 221*de02284cSSzymon Olewniczak if ($task->executor === $this->model->user_nick) { 222*de02284cSSzymon Olewniczak $acl['reason'] = BEZ_PERMISSION_CHANGE; 223*de02284cSSzymon Olewniczak $acl['state'] = BEZ_PERMISSION_CHANGE; 224*de02284cSSzymon Olewniczak } 225*de02284cSSzymon Olewniczak 226*de02284cSSzymon Olewniczak //reporters can add subscribents to programme task 227*de02284cSSzymon Olewniczak if ($task->reporter === $this->model->user_nick) { 228*de02284cSSzymon Olewniczak $acl['subscribents'] = BEZ_PERMISSION_CHANGE; 229*de02284cSSzymon Olewniczak } 230*de02284cSSzymon Olewniczak 231*de02284cSSzymon Olewniczak if ($task->coordinator === $this->model->user_nick || 232*de02284cSSzymon Olewniczak ($task->issue === '' && $this->level >= BEZ_AUTH_LEADER)) { 233*de02284cSSzymon Olewniczak 234*de02284cSSzymon Olewniczak $acl['reason'] = BEZ_PERMISSION_CHANGE; 235*de02284cSSzymon Olewniczak $acl['state'] = BEZ_PERMISSION_CHANGE; 236*de02284cSSzymon Olewniczak 237*de02284cSSzymon Olewniczak //we can chante cause 238*de02284cSSzymon Olewniczak $acl['cause'] = BEZ_PERMISSION_CHANGE; 239*de02284cSSzymon Olewniczak 240*de02284cSSzymon Olewniczak $acl['task'] = BEZ_PERMISSION_CHANGE; 241*de02284cSSzymon Olewniczak $acl['tasktype'] = BEZ_PERMISSION_CHANGE; 242*de02284cSSzymon Olewniczak $acl['executor'] = BEZ_PERMISSION_CHANGE; 243*de02284cSSzymon Olewniczak $acl['cost'] = BEZ_PERMISSION_CHANGE; 244*de02284cSSzymon Olewniczak $acl['reason'] = BEZ_PERMISSION_CHANGE; 245*de02284cSSzymon Olewniczak $acl['plan_date'] = BEZ_PERMISSION_CHANGE; 246*de02284cSSzymon Olewniczak $acl['all_day_event'] = BEZ_PERMISSION_CHANGE; 247*de02284cSSzymon Olewniczak $acl['start_time'] = BEZ_PERMISSION_CHANGE; 248*de02284cSSzymon Olewniczak $acl['finish_time'] = BEZ_PERMISSION_CHANGE; 249*de02284cSSzymon Olewniczak 250*de02284cSSzymon Olewniczak 251*de02284cSSzymon Olewniczak //leaders can add subscribents to programme tasks 252*de02284cSSzymon Olewniczak $acl['subscribents'] = BEZ_PERMISSION_CHANGE; 253*de02284cSSzymon Olewniczak } 254*de02284cSSzymon Olewniczak 255*de02284cSSzymon Olewniczak if ($task->issue === '' && 256*de02284cSSzymon Olewniczak $task->reporter === $this->model->user_nick && 257*de02284cSSzymon Olewniczak $task->executor === $this->model->user_nick) { 258*de02284cSSzymon Olewniczak $acl['reason'] = BEZ_PERMISSION_CHANGE; 259*de02284cSSzymon Olewniczak $acl['state'] = BEZ_PERMISSION_CHANGE; 260*de02284cSSzymon Olewniczak 261*de02284cSSzymon Olewniczak $acl['task'] = BEZ_PERMISSION_CHANGE; 262*de02284cSSzymon Olewniczak $acl['tasktype'] = BEZ_PERMISSION_CHANGE; 263*de02284cSSzymon Olewniczak //no executor 264*de02284cSSzymon Olewniczak $acl['cost'] = BEZ_PERMISSION_CHANGE; 265*de02284cSSzymon Olewniczak $acl['reason'] = BEZ_PERMISSION_CHANGE; 266*de02284cSSzymon Olewniczak $acl['plan_date'] = BEZ_PERMISSION_CHANGE; 267*de02284cSSzymon Olewniczak $acl['all_day_event'] = BEZ_PERMISSION_CHANGE; 268*de02284cSSzymon Olewniczak $acl['start_time'] = BEZ_PERMISSION_CHANGE; 269*de02284cSSzymon Olewniczak $acl['finish_time'] = BEZ_PERMISSION_CHANGE; 270*de02284cSSzymon Olewniczak } 271*de02284cSSzymon Olewniczak 272*de02284cSSzymon Olewniczak 273*de02284cSSzymon Olewniczak return $acl; 274*de02284cSSzymon Olewniczak 275*de02284cSSzymon Olewniczak } 276*de02284cSSzymon Olewniczak 277*de02284cSSzymon Olewniczak private function check_commcause($commcause) { 278*de02284cSSzymon Olewniczak $acl = array( 279*de02284cSSzymon Olewniczak 'id' => BEZ_PERMISSION_NONE, 280*de02284cSSzymon Olewniczak 'issue' => BEZ_PERMISSION_NONE, 281*de02284cSSzymon Olewniczak 'datetime' => BEZ_PERMISSION_NONE, 282*de02284cSSzymon Olewniczak 'reporter' => BEZ_PERMISSION_NONE, 283*de02284cSSzymon Olewniczak 'type' => BEZ_PERMISSION_NONE, 284*de02284cSSzymon Olewniczak 'content' => BEZ_PERMISSION_NONE, 285*de02284cSSzymon Olewniczak 'content_cache' => BEZ_PERMISSION_NONE 286*de02284cSSzymon Olewniczak ); 287*de02284cSSzymon Olewniczak 288*de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_VIEWER) { 289*de02284cSSzymon Olewniczak //user can display everythig 290*de02284cSSzymon Olewniczak $acl = array_map(function($value) { 291*de02284cSSzymon Olewniczak return BEZ_PERMISSION_VIEW; 292*de02284cSSzymon Olewniczak }, $acl); 293*de02284cSSzymon Olewniczak } 294*de02284cSSzymon Olewniczak 295*de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_ADMIN) { 296*de02284cSSzymon Olewniczak //admin can edit everythig 297*de02284cSSzymon Olewniczak $acl = array_map(function($value) { 298*de02284cSSzymon Olewniczak return BEZ_PERMISSION_CHANGE; 299*de02284cSSzymon Olewniczak }, $acl); 300*de02284cSSzymon Olewniczak 301*de02284cSSzymon Olewniczak return $acl; 302*de02284cSSzymon Olewniczak } 303*de02284cSSzymon Olewniczak //we create new commcause 304*de02284cSSzymon Olewniczak if ($commcause->id === NULL) { 305*de02284cSSzymon Olewniczak if ($this->level >= BEZ_USER) { 306*de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 307*de02284cSSzymon Olewniczak } 308*de02284cSSzymon Olewniczak 309*de02284cSSzymon Olewniczak if ($commcause->coordinator === $this->model->user_nick) { 310*de02284cSSzymon Olewniczak $acl['type'] = BEZ_PERMISSION_CHANGE; 311*de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 312*de02284cSSzymon Olewniczak } 313*de02284cSSzymon Olewniczak 314*de02284cSSzymon Olewniczak return $acl; 315*de02284cSSzymon Olewniczak } 316*de02284cSSzymon Olewniczak 317*de02284cSSzymon Olewniczak 318*de02284cSSzymon Olewniczak if ($commcause->coordinator === $this->model->user_nick) { 319*de02284cSSzymon Olewniczak $acl['type'] = BEZ_PERMISSION_CHANGE; 320*de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 321*de02284cSSzymon Olewniczak 322*de02284cSSzymon Olewniczak //we can only delete records when there is no tasks subscribed to issue 323*de02284cSSzymon Olewniczak if ($commcause->tasks_count === 0) { 324*de02284cSSzymon Olewniczak $acl['id'] = BEZ_PERMISSION_CHANGE; 325*de02284cSSzymon Olewniczak } 326*de02284cSSzymon Olewniczak 327*de02284cSSzymon Olewniczak } 328*de02284cSSzymon Olewniczak 329*de02284cSSzymon Olewniczak //jeżeli ktoś zmieni typ z komentarza na przyczynę, tracimy możliwość edycji 330*de02284cSSzymon Olewniczak if ($commcause->reporter === $this->model->user_nick && 331*de02284cSSzymon Olewniczak $commcause->type === '0') { 332*de02284cSSzymon Olewniczak $acl['content'] = BEZ_PERMISSION_CHANGE; 333*de02284cSSzymon Olewniczak 334*de02284cSSzymon Olewniczak //we can only delete records when there is no tasks subscribed to issue 335*de02284cSSzymon Olewniczak if ($commcause->tasks_count === 0) { 336*de02284cSSzymon Olewniczak $acl['id'] = BEZ_PERMISSION_CHANGE; 337*de02284cSSzymon Olewniczak } 338*de02284cSSzymon Olewniczak } 339*de02284cSSzymon Olewniczak 340*de02284cSSzymon Olewniczak return $acl; 341*de02284cSSzymon Olewniczak 342*de02284cSSzymon Olewniczak } 343*de02284cSSzymon Olewniczak 344*de02284cSSzymon Olewniczak private function static_label() { 345*de02284cSSzymon Olewniczak $acl = array_fill_keys(Label::get_columns(), BEZ_PERMISSION_NONE); 346*de02284cSSzymon Olewniczak 347*de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_USER) { 348*de02284cSSzymon Olewniczak //user can display everythig 349*de02284cSSzymon Olewniczak $acl = array_map(function($value) { 350*de02284cSSzymon Olewniczak return BEZ_PERMISSION_VIEW; 351*de02284cSSzymon Olewniczak }, $acl); 352*de02284cSSzymon Olewniczak } 353*de02284cSSzymon Olewniczak 354*de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_ADMIN) { 355*de02284cSSzymon Olewniczak //admin can edit everythig 356*de02284cSSzymon Olewniczak $acl = array_map(function($value) { 357*de02284cSSzymon Olewniczak return BEZ_PERMISSION_CHANGE; 358*de02284cSSzymon Olewniczak }, $acl); 359*de02284cSSzymon Olewniczak } 360*de02284cSSzymon Olewniczak 361*de02284cSSzymon Olewniczak return $acl; 362*de02284cSSzymon Olewniczak } 363*de02284cSSzymon Olewniczak 364*de02284cSSzymon Olewniczak private function check_label(Label $label) { 365*de02284cSSzymon Olewniczak return $this->static_label(); 366*de02284cSSzymon Olewniczak } 367*de02284cSSzymon Olewniczak 368*de02284cSSzymon Olewniczak private function check_tasktype($tasktype) { 369*de02284cSSzymon Olewniczak $acl = array( 370*de02284cSSzymon Olewniczak 'id' => BEZ_PERMISSION_NONE, 371*de02284cSSzymon Olewniczak 'pl' => BEZ_PERMISSION_NONE, 372*de02284cSSzymon Olewniczak 'en' => BEZ_PERMISSION_NONE 373*de02284cSSzymon Olewniczak ); 374*de02284cSSzymon Olewniczak 375*de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_USER) { 376*de02284cSSzymon Olewniczak //user can display everythig 377*de02284cSSzymon Olewniczak $acl = array_map(function($value) { 378*de02284cSSzymon Olewniczak return BEZ_PERMISSION_VIEW; 379*de02284cSSzymon Olewniczak }, $acl); 380*de02284cSSzymon Olewniczak } 381*de02284cSSzymon Olewniczak 382*de02284cSSzymon Olewniczak if ($this->level >= BEZ_AUTH_ADMIN) { 383*de02284cSSzymon Olewniczak //admin can edit everythig 384*de02284cSSzymon Olewniczak $acl = array_map(function($value) { 385*de02284cSSzymon Olewniczak return BEZ_PERMISSION_CHANGE; 386*de02284cSSzymon Olewniczak }, $acl); 387*de02284cSSzymon Olewniczak } 388*de02284cSSzymon Olewniczak 389*de02284cSSzymon Olewniczak return $acl; 390*de02284cSSzymon Olewniczak } 391*de02284cSSzymon Olewniczak 392*de02284cSSzymon Olewniczak /*returns array */ 393*de02284cSSzymon Olewniczak public function check(Entity $obj) { 394*de02284cSSzymon Olewniczak $method = 'check_'.$obj->get_table_name(); 395*de02284cSSzymon Olewniczak if (!method_exists($this, $method)) { 396*de02284cSSzymon Olewniczak throw new \Exception('no acl rules set for table: '.$obj->get_table_name()); 397*de02284cSSzymon Olewniczak } 398*de02284cSSzymon Olewniczak return $this->$method($obj); 399*de02284cSSzymon Olewniczak } 400*de02284cSSzymon Olewniczak 401*de02284cSSzymon Olewniczak public function check_field(Entity $obj, $field) { 402*de02284cSSzymon Olewniczak $acl = $this->check($obj); 403*de02284cSSzymon Olewniczak 404*de02284cSSzymon Olewniczak if (isset($acl[$field])) { 405*de02284cSSzymon Olewniczak return $acl[$field]; 406*de02284cSSzymon Olewniczak } 407*de02284cSSzymon Olewniczak return BEZ_PERMISSION_UNKNOWN; 408*de02284cSSzymon Olewniczak } 409*de02284cSSzymon Olewniczak 410*de02284cSSzymon Olewniczak public function check_static($table) { 411*de02284cSSzymon Olewniczak $method = 'static_'.$table; 412*de02284cSSzymon Olewniczak if (!method_exists($this, $method)) { 413*de02284cSSzymon Olewniczak throw new \Exception('no acl rules set for table: '.$table); 414*de02284cSSzymon Olewniczak } 415*de02284cSSzymon Olewniczak return $this->$method($table); 416*de02284cSSzymon Olewniczak } 417*de02284cSSzymon Olewniczak 418*de02284cSSzymon Olewniczak public function check_static_field($table, $field) { 419*de02284cSSzymon Olewniczak $acl = $this->check_static($table); 420*de02284cSSzymon Olewniczak return $acl[$field]; 421*de02284cSSzymon Olewniczak } 422*de02284cSSzymon Olewniczak 423*de02284cSSzymon Olewniczak 424*de02284cSSzymon Olewniczak public function can_change(Entity $obj, $field) { 425*de02284cSSzymon Olewniczak if ($this->check_field($obj, $field) < BEZ_PERMISSION_CHANGE) { 426*de02284cSSzymon Olewniczak $table = $obj->get_table_name(); 427*de02284cSSzymon Olewniczak $id = $obj->id; 428*de02284cSSzymon Olewniczak throw new PermissionDeniedException('user cannot change field "'.$field.'" in table "'.$table.', rowid: "'.$id.'"'); 429*de02284cSSzymon Olewniczak } 430*de02284cSSzymon Olewniczak } 431*de02284cSSzymon Olewniczak} 432