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, acl::explodeACL($acl)); } } ksort($this->gosaAclEntry); /* Save parent - we've to know more about it than other plugins... */ $this->parent= &$parent; /* Container? */ if (preg_match('/^(o|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); /* Roles */ $ldap->cd($config->current['BASE']); # if ($tag == ""){ $ldap->search('(objectClass=gosaRole)', array('cn', 'description','gosaAclTemplate','dn')); # } else { # $ldap->search('(&(objectClass=gosaRole)(gosaUnitTag='.$tag.'))', array('cn', 'description','gosaAclTemplate','dn')); # } while ($attrs= $ldap->fetch()){ $dsc= ""; if (isset($attrs['description'][0])){ $dsc= $attrs['description'][0]; } $role_id = $attrs['dn']; $this->roles[$role_id]['acls'] =array(); for ($i= 0; $i < $attrs['gosaAclTemplate']['count']; $i++){ $acl= $attrs['gosaAclTemplate'][$i]; $this->roles[$role_id]['acls'] = array_merge($this->roles[$role_id]['acls'],acl::explodeACL($acl)); } $this->roles[$role_id]['description'] = $dsc; $this->roles[$role_id]['cn'] = $attrs['cn'][0]; } /* Objects */ $tmp= session::get('plist'); $plist= $tmp->info; $cats = array(); if (isset($this->parent) && $this->parent !== NULL){ $oc= array(); foreach ($this->parent->by_object as $key => $obj){ $oc= array_merge($oc, $obj->objectclasses); if(isset($obj->acl_category)){ $cats[preg_replace("/\//","",$obj->acl_category)] = preg_replace("/\//","",$obj->acl_category); } } 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'; } if(isset($cats[$data])){ $this->myAclObjects[$data.'/'.$class]= $acls['plDescription']; } $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= session::get('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; $firstedit= FALSE; foreach($_POST as $name => $post){ /* Actions... */ if (preg_match('/^acl_edit_.*_x/', $name)){ $this->dialogState= 'create'; $firstedit= TRUE; $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["$idx/$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); /* Skip for detection entry */ if ($object == 'dummy') { continue; } /* 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; } } if(isset($_POST['selected_role'])){ $this->aclContents = ""; $this->aclContents = base64_decode($_POST['selected_role']); } } if($this->acl_is_writeable("")){ /* Only be interested in new acl's, if we're in the right _POST place */ if ($aclDialog && $this->aclObject != "" && is_array($this->ocMapping[$this->aclObject])){ foreach ($this->ocMapping[$this->aclObject] as $oc){ if(isset($this->aclContents[$oc]) && is_array($this->aclContents)){ unset($this->aclContents[$oc]); unset($this->aclContents[$this->aclObject.'/'.$oc]); }else{ # trigger_error("Huhm?"); } if (isset($new_acl[$oc]) && is_array($new_acl)){ $this->aclContents[$oc]= $new_acl[$oc]; } if (isset($new_acl[$this->aclObject.'/'.$oc]) && is_array($new_acl)){ $this->aclContents[$this->aclObject.'/'.$oc]= $new_acl[$this->aclObject.'/'.$oc]; } } } /* Save new acl in case of base edit mode */ if ($this->aclType == 'base' && !$firstedit){ $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->gosaAclEntry[$this->currentIndex]['filter']= $this->aclFilter; $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 */ if($this->acl_is_writeable("")){ foreach (array("aclType","aclFilter", "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){ if(!$this->acl_is_readable("")) continue; $action =""; $field1= array("string" => $this->aclTypes[$entry['type']], "attach" => "style='width:150px'"); $field2= array("string" => $this->assembleAclSummary($entry)); if($this->acl_is_writeable("")){ $action.= ""; $action.= ""; } $action.= ""; if($this->acl_is_removeable()){ $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"])){ $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("aclFilter", $this->aclFilter); $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)); } /* Role selector if scope is base */ if ($this->aclType == 'role'){ $smarty->assign('roleSelector', "Role selector");#, $this->buildRoleSelector($this->myAclObjects)); $smarty->assign('roleSelector', $this->buildRoleSelector($this->roles)); } } 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"); } /* Role selector if scope is base */ if ($this->aclType == 'role'){ $smarty->assign('roleSelector', $this->buildRoleSelector($this->roles)); } else { $smarty->assign('aclSelector', $this->buildAclSelector($aclObjects)); } } /* Show main page */ $smarty->assign("dialogState", $this->dialogState); /* Assign acls */ $smarty->assign("acl_createable",$this->acl_is_createable()); $smarty->assign("acl_writeable" ,$this->acl_is_writeable("")); $smarty->assign("acl_readable" ,$this->acl_is_readable("")); $smarty->assign("acl_removeable",$this->acl_is_removeable()); return ($smarty->fetch (get_template_path('acl.tpl'))); } function sort_by_priority($list) { $tmp= session::get('plist'); $plist= $tmp->info; asort($plist); $newSort = array(); foreach($list as $name => $translation){ $na = preg_replace("/^.*\//","",$name); $prio = 0; if(isset($plist[$na]['plPriority'])){ $prio= $plist[$na]['plPriority'] ; } $newSort[$name] = $prio; } asort($newSort); $ret = array(); foreach($newSort as $name => $prio){ $ret[$name] = $list[$name]; } return($ret); } function buildRoleSelector($list) { $D_List =new divSelectBox("Acl_Roles"); $selected = $this->aclContents; if(!is_string($this->aclContents) || !isset($list[$this->aclContents])){ $selected = key($list); } $str =""; foreach($list as $dn => $values){ if($dn == $selected){ $option = ""; }else{ $option = ""; } $field1 = array("string" => $option) ; $field2 = array("string" => $values['cn'], "attach" => "style='width:200px;'") ; $field3 = array("string" => $values['description'],"attach" => "style='border-right:0px;'") ; $D_List->AddEntry(array($field1,$field2,$field3)); } return($D_List->DrawList()); } function buildAclSelector($list) { $display= ""; $cols= 3; $tmp= session::get('plist'); $plist= $tmp->info; asort($plist); /* Add select all/none buttons */ $style = "style='width:100px;'"; if($this->acl_is_writeable("")){ $display .= ""; $display .= ""; $display .= " - "; $display .= ""; $display .= " - "; $display .= ""; $display .= ""; $display .= "
"; $style = "style='width:50px;'"; $display .= ""; $display .= ""; $display .= ""; $display .= ""; $display .= ""; $display .= " - "; $display .= ""; $display .= ""; $display .= ""; $display .= " - "; $display .= ""; $display .= ""; $display .= ""; $display .= ""; } /* Build general objects */ $list =$this->sort_by_priority($list); 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]; /* Get the overall plugin acls */ $overall_acl =""; if(isset($currentAcl[0])){ $overall_acl = $currentAcl[0]; } /* Object header */ if(session::get('js')) { if(isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/gecko/i",$_SERVER['HTTP_USER_AGENT'])) { $display.= "\n". "\n ". "\n ". "\n ". "\n "; } else if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/ie/i",$_SERVER['HTTP_USER_AGENT'])) { $display.= "\n
"._("Object").": $name". "\n
". "\n ". "\n ". "\n ". "\n "; } else { $display.= "\n
"._("Object").": $name". "\n
". "\n ". "\n ". "\n "; } } else { $display.= "\n
"._("Object").": $name
". "\n ". "\n ". "\n "; } /* Generate options */ $spc= "  "; # if ($this->isContainer && $this->aclType != 'base'){ $options= $this->mkchkbx($key."_0_c", _("Create objects"), preg_match('/c/', $overall_acl)).$spc; $options.= $this->mkchkbx($key."_0_m", _("Move objects"), preg_match('/m/', $overall_acl)).$spc; $options.= $this->mkchkbx($key."_0_d", _("Remove objects"), preg_match('/d/', $overall_acl)).$spc; if ($plist[preg_replace('%^.*/%', '', $key)]['plSelfModify']){ $options.= $this->mkchkbx($key."_0_s", _("Modifyable by owner"), preg_match('/s/', $overall_acl)).$spc; } # } else { # $options= $this->mkchkbx($key."_0_m", _("Move object"), preg_match('/m/', $overall_acl)).$spc; # $options.= $this->mkchkbx($key."_0_d", _("Remove object"), preg_match('/d/', $overall_acl)).$spc; # if ($plist[preg_replace('%^.*/%', '', $key)]['plSelfModify']){ # $options.= $this->mkchkbx($key."_0_s", _("Modifyable by owner"), preg_match('/s/', $overall_acl)).$spc; # } # } /* Global options */ $more_options= $this->mkchkbx($key."_0_r", _("read"), preg_match('/r/', $overall_acl)).$spc; $more_options.= $this->mkchkbx($key."_0_w", _("write"), preg_match('/w/', $overall_acl)); $display.= "\n ". "\n ". "\n ". "\n "; /* Walk through the list of attributes */ $cnt= 1; $splist= $plist[preg_replace('%^.*/%', '', $key)]['plProvidedAcls']; # asort($splist); if(session::get('js')) { if(isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/gecko/i",$_SERVER['HTTP_USER_AGENT'])) { $display.= "\n ". "\n
"._("Object").": $name
$options "._("Complete object").": $more_options
". "\n