gosaAclEntry= array(); if (isset($this->attrs['gosaAclEntry'])){ for ($i= 0; $i<$this->attrs['gosaAclEntry']['count']; $i++){ $acl= $this->attrs['gosaAclEntry'][$i]; $this->gosaAclEntry= array_merge($this->gosaAclEntry, $this->explodeACL($acl)); } } ksort($this->gosaAclEntry); /* Save parent - we've to know more about it than other plugins... */ $this->parent= $parent; /* Container? */ if (preg_match('/^(ou|c|l|dc)=/i', $dn)){ $this->isContainer= TRUE; } /* Users */ $ui= get_userinfo(); $tag= $ui->gosaUnitTag; $ldap= $config->get_ldap_link(); $ldap->cd($config->current['BASE']); if ($tag == ""){ $ldap->search('(objectClass=gosaAccount)', array('uid', 'cn')); } else { $ldap->search('(&(objectClass=gosaAccount)(gosaUnitTag='.$tag.'))', array('uid', 'cn')); } while ($attrs= $ldap->fetch()){ $this->users['U:'.$attrs['dn']]= $attrs['cn'][0].' ['.$attrs['uid'][0].']'; } ksort($this->users); /* Groups */ $ldap->cd($config->current['BASE']); if ($tag == ""){ $ldap->search('(objectClass=posixGroup)', array('cn', 'description')); } else { $ldap->search('(&(objectClass=posixGroup)(gosaUnitTag='.$tag.'))', array('cn', 'description')); } while ($attrs= $ldap->fetch()){ $dsc= ""; if (isset($attrs['description'][0])){ $dsc= $attrs['description'][0]; } $this->groups['G:'.$attrs['dn']]= $attrs['cn'][0].' ['.$dsc.']'; } ksort($this->groups); /* Objects */ $tmp= get_global('plist'); $plist= $tmp->info; if (isset($this->parent) && $this->parent != NULL){ $oc= array(); foreach ($this->parent->by_object as $key => $obj){ $oc= array_merge($oc, $obj->objectclasses); } if (in_array_ics('organizationalUnit', $oc)){ $this->isContainer= TRUE; } } else { $oc= $this->attrs['objectClass']; } /* Extract available categories from plugin info list */ foreach ($plist as $class => $acls){ /* Only feed categories */ if (isset($acls['plCategory'])){ /* Walk through supplied list and feed only translated categories */ foreach($acls['plCategory'] as $idx => $data){ /* Non numeric index means -> base object containing more informations */ if (preg_match('/^[0-9]+$/', $idx)){ if (!isset($this->ocMapping[$data])){ $this->ocMapping[$data]= array(); $this->ocMapping[$data][]= '0'; } $this->ocMapping[$data][]= $class; } else { if (!isset($this->ocMapping[$idx])){ $this->ocMapping[$idx]= array(); $this->ocMapping[$idx][]= '0'; } $this->ocMapping[$idx][]= $class; $this->aclObjects[$idx]= $data['description']; /* Additionally filter the classes we're interested in in "self edit" mode */ if (is_array($data['objectClass'])){ foreach($data['objectClass'] as $objectClass){ if (in_array_ics($objectClass, $oc)){ $this->myAclObjects[$idx.'/'.$class]= $acls['plDescription']; break; } } } else { if (in_array_ics($data['objectClass'], $oc)){ $this->myAclObjects[$idx.'/'.$class]= $acls['plDescription']; } } } } } } $this->aclObjects['all']= '* '._("All categories"); $this->ocMapping['all']= array('0' => 'all'); /* Sort categories */ asort($this->aclObjects); /* Fill acl types */ if ($this->isContainer){ $this->aclTypes= array("reset" => _("Reset ACLs"), "one" => _("One level"), "base" => _("Current object"), "sub" => _("Complete subtree"), "psub" => _("Complete subtree (permanent)")); //"role" => _("Use ACL defined in role")); } else { $this->aclTypes= array("base" => _("Current object"), "role" => _("Use ACL defined in role")); } asort($this->aclTypes); $this->targets= array("user" => _("Users"), "group" => _("Groups")); asort($this->targets); /* Finally - we want to get saved... */ $this->is_account= TRUE; } function execute() { /* Call parent execute */ plugin::execute(); $tmp= get_global('plist'); $plist= $tmp->info; /* Handle posts */ if (isset($_POST['new_acl'])){ $this->dialogState= 'create'; $this->dialog= TRUE; $this->currentIndex= count($this->gosaAclEntry); $this->loadAclEntry(TRUE); } $new_acl= array(); $aclDialog= FALSE; foreach($_POST as $name => $post){ /* Actions... */ if (preg_match('/^acl_edit_.*_x/', $name)){ $this->dialogState= 'create'; $this->dialog= TRUE; $this->currentIndex= preg_replace('/^acl_edit_([0-9]+).*$/', '\1', $name); $this->loadAclEntry(); continue; } if (preg_match('/^acl_del_.*_x/', $name)){ unset($this->gosaAclEntry[preg_replace('/^acl_del_([0-9]+).*$/', '\1', $name)]); continue; } if (preg_match('/^cat_edit_.*_x/', $name)){ $this->aclObject= preg_replace('/^cat_edit_([^_]+)_.*$/', '\1', $name); $this->dialogState= 'edit'; foreach ($this->ocMapping[$this->aclObject] as $oc){ if (isset($this->aclContents[$oc])){ $this->savedAclContents[$oc]= $this->aclContents[$oc]; } } continue; } if (preg_match('/^cat_del_.*_x/', $name)){ $idx= preg_replace('/^cat_del_([^_]+)_.*$/', '\1', $name); foreach ($this->ocMapping[$idx] as $key){ unset($this->aclContents[$key]); } continue; } /* Sorting... */ if (preg_match('/^sortup_.*_x/', $name)){ $index= preg_replace('/^sortup_([0-9]+).*$/', '\1', $name); if ($index > 0){ $tmp= $this->gosaAclEntry[$index]; $this->gosaAclEntry[$index]= $this->gosaAclEntry[$index-1]; $this->gosaAclEntry[$index-1]= $tmp; } continue; } if (preg_match('/^sortdown_.*_x/', $name)){ $index= preg_replace('/^sortdown_([0-9]+).*$/', '\1', $name); if ($index < count($this->gosaAclEntry)-1){ $tmp= $this->gosaAclEntry[$index]; $this->gosaAclEntry[$index]= $this->gosaAclEntry[$index+1]; $this->gosaAclEntry[$index+1]= $tmp; } continue; } /* ACL saving... */ if (preg_match('/^acl_.*_[^xy]$/', $name)){ $aclDialog= TRUE; list($dummy, $object, $attribute, $value)= split('_', $name); /* Ordinary ACLs */ if (!isset($new_acl[$object])){ $new_acl[$object]= array(); } if (isset($new_acl[$object][$attribute])){ $new_acl[$object][$attribute].= $value; } else { $new_acl[$object][$attribute]= $value; } } } /* Only be interested in new acl's, if we're in the right _POST place */ if ($aclDialog && isset($this->ocMapping[$this->aclObject])){ foreach ($this->ocMapping[$this->aclObject] as $oc){ unset($this->aclContents[$oc]); unset($this->aclContents[$this->aclObject.'/'.$oc]); if (isset($new_acl[$oc])){ $this->aclContents[$oc]= $new_acl[$oc]; } if (isset($new_acl[$this->aclObject.'/'.$oc])){ $this->aclContents[$this->aclObject.'/'.$oc]= $new_acl[$this->aclObject.'/'.$oc]; } } } /* Save new acl in case of base edit mode */ if ($this->aclType == 'base'){ $this->aclContents= $new_acl; } /* Cancel new acl? */ if (isset($_POST['cancel_new_acl'])){ $this->dialogState= 'head'; $this->dialog= FALSE; if ($this->wasNewEntry){ unset ($this->gosaAclEntry[$this->currentIndex]); } } /* Store ACL in main object? */ if (isset($_POST['submit_new_acl'])){ $this->gosaAclEntry[$this->currentIndex]['type']= $this->aclType; $this->gosaAclEntry[$this->currentIndex]['members']= $this->recipients; $this->gosaAclEntry[$this->currentIndex]['acl']= $this->aclContents; $this->dialogState= 'head'; $this->dialog= FALSE; } /* Cancel edit acl? */ if (isset($_POST['cancel_edit_acl'])){ $this->dialogState= 'create'; foreach ($this->ocMapping[$this->aclObject] as $oc){ if (isset($this->savedAclContents[$oc])){ $this->aclContents[$oc]= $this->savedAclContents[$oc]; } } } /* Save edit acl? */ if (isset($_POST['submit_edit_acl'])){ $this->dialogState= 'create'; } /* Add acl? */ if (isset($_POST['add_acl']) && $_POST['aclObject'] != ""){ $this->dialogState= 'edit'; $this->savedAclContents= array(); foreach ($this->ocMapping[$this->aclObject] as $oc){ if (isset($this->aclContents[$oc])){ $this->savedAclContents[$oc]= $this->aclContents[$oc]; } } } /* Add to list? */ if (isset($_POST['add']) && isset($_POST['source'])){ foreach ($_POST['source'] as $key){ if ($this->target == 'user'){ $this->recipients[$key]= $this->users[$key]; } if ($this->target == 'group'){ $this->recipients[$key]= $this->groups[$key]; } } ksort($this->recipients); } /* Remove from list? */ if (isset($_POST['del']) && isset($_POST['recipient'])){ foreach ($_POST['recipient'] as $key){ unset($this->recipients[$key]); } } /* Save common values */ foreach (array("aclType", "aclObject", "target") as $key){ if (isset($_POST[$key])){ $this->$key= validate($_POST[$key]); } } /* Create templating instance */ $smarty= get_smarty(); if ($this->dialogState == 'head'){ /* Draw list */ $aclList= new DivSelectBox("aclList"); $aclList->SetHeight(450); /* Fill in entries */ foreach ($this->gosaAclEntry as $key => $entry){ $field1= array("string" => $this->aclTypes[$entry['type']], "attach" => "style='width:100px'"); $field2= array("string" => $this->assembleAclSummary($entry)); $action= ""; $action.= ""; $action.= ""; $action.= ""; $field3= array("string" => $action, "attach" => "style='border-right:0px;width:50px;text-align:right;'"); $aclList->AddEntry(array($field1, $field2, $field3)); } $smarty->assign("aclList", $aclList->DrawList()); } if ($this->dialogState == 'create'){ /* Draw list */ $aclList= new DivSelectBox("aclList"); $aclList->SetHeight(150); /* Add settings for all categories to the (permanent) list */ foreach ($this->aclObjects as $section => $dsc){ $summary= ""; foreach($this->ocMapping[$section] as $oc){ if (isset($this->aclContents[$oc]) && count($this->aclContents[$oc]) && isset($this->aclContents[$oc][0]) && $this->aclContents[$oc][0] != ""){ $summary.= "$oc, "; continue; } if (isset($this->aclContents["$section/$oc"]) && count($this->aclContents["$section/$oc"]) && isset($this->aclContents["$section/$oc"][0]) && $this->aclContents["$section/$oc"][0] != ""){ $summary.= "$oc, "; continue; } if (isset($this->aclContents[$oc]) && !isset($this->aclContents[$oc][0]) && count($this->aclContents[$oc])){ $summary.= "$oc, "; } } /* Set summary... */ if ($summary == ""){ $summary= ''._("No ACL settings for this category").''; } else { $summary= sprintf(_("Contains ACLs for these objects: %s"), preg_replace('/, $/', '', $summary)); } $field1= array("string" => $dsc, "attach" => "style='width:100px'"); $field2= array("string" => $summary); $action= ""; $action.= ""; $field3= array("string" => $action, "attach" => "style='border-right:0px;width:50px'"); $aclList->AddEntry(array($field1, $field2, $field3)); } $smarty->assign("aclList", $aclList->DrawList()); $smarty->assign("aclType", $this->aclType); $smarty->assign("aclTypes", $this->aclTypes); $smarty->assign("target", $this->target); $smarty->assign("targets", $this->targets); /* Assign possible target types */ $smarty->assign("targets", $this->targets); foreach ($this->attributes as $attr){ $smarty->assign($attr, $this->$attr); } /* Generate list */ $tmp= array(); foreach (array("user" => "users", "group" => "groups") as $field => $arr){ if ($this->target == $field){ foreach ($this->$arr as $key => $value){ if (!isset($this->recipients[$key])){ $tmp[$key]= $value; } } } } $smarty->assign('sources', $tmp); $smarty->assign('recipients', $this->recipients); /* Acl selector if scope is base */ if ($this->aclType == 'base'){ $smarty->assign('aclSelector', $this->buildAclSelector($this->myAclObjects)); } } if ($this->dialogState == 'edit'){ $smarty->assign('headline', sprintf(_("Edit ACL for '%s', scope is '%s'"), $this->aclObjects[$this->aclObject], $this->aclTypes[$this->aclType])); /* Collect objects for selected category */ foreach ($this->ocMapping[$this->aclObject] as $idx => $class){ if ($idx == 0){ continue; } $aclObjects[$this->aclObject.'/'.$class]= $plist[$class]['plDescription']; } if ($this->aclObject == 'all'){ $aclObjects['all']= _("All objects in current subtree"); } $smarty->assign('aclSelector', $this->buildAclSelector($aclObjects)); } /* Show main page */ $smarty->assign("dialogState", $this->dialogState); return ($smarty->fetch (get_template_path('acl.tpl'))); } function buildAclSelector($list) { $display= ""; $cols= 3; $tmp= get_global('plist'); $plist= $tmp->info; asort($plist); /* Build general objects */ foreach ($list as $key => $name){ /* Create sub acl if it does not exist */ if (!isset($this->aclContents[$key])){ $this->aclContents[$key]= array(); $this->aclContents[$key][0]= ''; } $currentAcl= $this->aclContents[$key]; /* Object header */ if($_SESSION['js']) { if(isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/gecko/i",$_SERVER['HTTP_USER_AGENT'])) { $display.= ""; } else if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/ie/i",$_SERVER['HTTP_USER_AGENT'])) { $display.= "
"._("Object").": $name
"; } else { $display.= "
"._("Object").": $name
"; } } else { $display.= "
"._("Object").": $name
"; } /* Generate options */ $spc= "  "; if ($this->isContainer && $this->aclType != 'base'){ $options= $this->mkchkbx($key."_0_c", _("Create objects"), preg_match('/c/', $currentAcl[0])).$spc; $options.= $this->mkchkbx($key."_0_m", _("Move objects"), preg_match('/m/', $currentAcl[0])).$spc; $options.= $this->mkchkbx($key."_0_d", _("Remove objects"), preg_match('/d/', $currentAcl[0])).$spc; if ($plist[preg_replace('%^.*/%', '', $key)]['plSelfModify']){ $options.= $this->mkchkbx($key."_0_s", _("Modifyable by owner"), preg_match('/s/', $currentAcl[0])).$spc; } } else { $options= $this->mkchkbx($key."_0_m", _("Move object"), preg_match('/m/', $currentAcl[0])).$spc; $options.= $this->mkchkbx($key."_0_d", _("Remove object"), preg_match('/d/', $currentAcl[0])).$spc; if ($plist[preg_replace('%^.*/%', '', $key)]['plSelfModify']){ $options.= $this->mkchkbx($key."_0_s", _("Modifyable by owner"), preg_match('/s/', $currentAcl[0])).$spc; } } /* Global options */ $more_options= $this->mkchkbx($key."_0_r", _("read"), preg_match('/r/', $currentAcl[0])).$spc; $more_options.= $this->mkchkbx($key."_0_w", _("write"), preg_match('/w/', $currentAcl[0])); $display.= ""; /* Walk through the list of attributes */ $cnt= 1; $splist= $plist[preg_replace('%^.*/%', '', $key)]['plProvidedAcls']; asort($splist); if($_SESSION['js']) { if(isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/gecko/i",$_SERVER['HTTP_USER_AGENT'])) { $display.= "
"._("Object").": $name
$options ".("Complete object:")." $more_options