X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=include%2Fclass_acl.inc;h=a8fd374e1f7abacb20e811909ad1b3014abfc88b;hb=4e21fc2c719f4175c9b0e72ee9fbc95249a16ddf;hp=8103ba16e8e4a756dfbf215a447f9113d656eeef;hpb=9a7a2ec9cf7dad5bbef318ccb13f293ea6b27b0d;p=gosa.git diff --git a/include/class_acl.inc b/include/class_acl.inc index 8103ba16e..a8fd374e1 100644 --- a/include/class_acl.inc +++ b/include/class_acl.inc @@ -21,15 +21,15 @@ class acl extends plugin var $aclObjects= array(); var $aclMyObjects= array(); var $users= array(); + var $roles= array(); var $groups= array(); var $recipients= array(); var $isContainer= FALSE; var $currentIndex= 0; var $wasNewEntry= FALSE; var $ocMapping= array(); - var $multiClass= array(); var $savedAclContents= array(); - + var $myAclObjects = array(); function acl ($config, $parent, $dn= NULL) { @@ -50,7 +50,7 @@ class acl extends plugin $this->parent= $parent; /* Container? */ - if (preg_match('/^(ou|c|l|dc)=/i', $dn)){ + if (preg_match('/^(o|ou|c|l|dc)=/i', $dn)){ $this->isContainer= TRUE; } @@ -85,6 +85,30 @@ class acl extends plugin } 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'],$this->explodeACL($acl)); + } + $this->roles[$role_id]['description'] = $dsc; + $this->roles[$role_id]['cn'] = $attrs['cn'][0]; + } + /* Objects */ $tmp= get_global('plist'); $plist= $tmp->info; @@ -107,11 +131,6 @@ class acl extends plugin /* Only feed categories */ if (isset($acls['plCategory'])){ - /* Find multi homed classes */ - if (count($acls['plCategory']) > 1){ - $this->multiClass[$class]= $class; - } - /* Walk through supplied list and feed only translated categories */ foreach($acls['plCategory'] as $idx => $data){ @@ -134,21 +153,13 @@ class acl extends plugin if (is_array($data['objectClass'])){ foreach($data['objectClass'] as $objectClass){ if (in_array_ics($objectClass, $oc)){ - if (isset($this->multiClass[$class])){ - $this->myAclObjects[$idx.'/'.$class]= $acls['plDescription']; - } else { - $this->myAclObjects[$class]= $acls['plDescription']; - } + $this->myAclObjects[$idx.'/'.$class]= $acls['plDescription']; break; } } } else { if (in_array_ics($data['objectClass'], $oc)){ - if (isset($this->multiClass[$class])){ - $this->myAclObjects[$idx.'/'.$class]= $acls['plDescription']; - } else { - $this->myAclObjects[$class]= $acls['plDescription']; - } + $this->myAclObjects[$idx.'/'.$class]= $acls['plDescription']; } } } @@ -156,6 +167,8 @@ class acl extends plugin } } } + $this->aclObjects['all']= '* '._("All categories"); + $this->ocMapping['all']= array('0' => 'all'); /* Sort categories */ asort($this->aclObjects); @@ -166,8 +179,8 @@ class acl extends plugin "one" => _("One level"), "base" => _("Current object"), "sub" => _("Complete subtree"), - "psub" => _("Complete subtree (permanent)")); - //"role" => _("Use ACL defined in role")); + "psub" => _("Complete subtree (permanent)"), + "role" => _("Use ACL defined in role")); } else { $this->aclTypes= array("base" => _("Current object"), "role" => _("Use ACL defined in role")); @@ -185,7 +198,7 @@ class acl extends plugin { /* Call parent execute */ plugin::execute(); - + $tmp= get_global('plist'); $plist= $tmp->info; @@ -199,11 +212,13 @@ class acl extends plugin $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(); @@ -227,7 +242,7 @@ class acl extends plugin if (preg_match('/^cat_del_.*_x/', $name)){ $idx= preg_replace('/^cat_del_([^_]+)_.*$/', '\1', $name); foreach ($this->ocMapping[$idx] as $key){ - unset($this->aclContents[$key]); + unset($this->aclContents["$idx/$key"]); } continue; } @@ -257,6 +272,11 @@ class acl extends plugin $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(); @@ -267,10 +287,16 @@ class acl extends plugin $new_acl[$object][$attribute]= $value; } } + + if(isset($_POST['selected_role'])){ + $this->aclContents = ""; + $this->aclContents = base64_decode($_POST['selected_role']); + } } /* Only be interested in new acl's, if we're in the right _POST place */ - if ($aclDialog && isset($this->ocMapping[$this->aclObject])){ + if ($aclDialog && $this->aclObject != "" && is_array($this->ocMapping[$this->aclObject])){ + foreach ($this->ocMapping[$this->aclObject] as $oc){ unset($this->aclContents[$oc]); unset($this->aclContents[$this->aclObject.'/'.$oc]); @@ -284,7 +310,7 @@ class acl extends plugin } /* Save new acl in case of base edit mode */ - if ($this->aclType == 'base'){ + if ($this->aclType == 'base' && !$firstedit){ $this->aclContents= $new_acl; } @@ -369,14 +395,14 @@ class acl extends plugin /* Fill in entries */ foreach ($this->gosaAclEntry as $key => $entry){ - $field1= array("string" => $this->aclTypes[$entry['type']], "attach" => "style='width:100px'"); + $field1= array("string" => $this->aclTypes[$entry['type']], "attach" => "style='width:150px'"); $field2= array("string" => $this->assembleAclSummary($entry)); $action= ""; $action.= ""; $action.= ""; $action.= ""; - $field3= array("string" => $action, "attach" => "style='border-right:0px;width:50px';text-align:right"); + $field3= array("string" => $action, "attach" => "style='border-right:0px;width:50px;text-align:right;'"); $aclList->AddEntry(array($field1, $field2, $field3)); } @@ -455,24 +481,34 @@ class acl extends plugin 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 */ - $aclObjects= array(); foreach ($this->ocMapping[$this->aclObject] as $idx => $class){ if ($idx == 0){ continue; } - if (isset($this->multiClass[$class])){ - $aclObjects[$this->aclObject.'/'.$class]= $plist[$class]['plDescription']; - } else { - $aclObjects[$class]= $plist[$class]['plDescription']; - } + $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)); } - $smarty->assign('aclSelector', $this->buildAclSelector($aclObjects)); } /* Show main page */ @@ -481,16 +517,103 @@ class acl extends plugin return ($smarty->fetch (get_template_path('acl.tpl'))); } - + + function sort_by_priority($list) + { + $tmp= get_global('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= ""; + $display= ""; $cols= 3; $tmp= get_global('plist'); $plist= $tmp->info; asort($plist); + /* Add select all/none buttons */ + $style = "style='width:100px;'"; + + $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 */ @@ -501,7 +624,33 @@ class acl extends plugin $currentAcl= $this->aclContents[$key]; /* Object header */ - $display.= ""; + if($_SESSION['js']) { + if(isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/gecko/i",$_SERVER['HTTP_USER_AGENT'])) { + $display.= "\n
"._("Object").": $name
". + "\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= "  "; @@ -524,12 +673,28 @@ class acl extends plugin $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.= ""; + $display.= "\n ". + "\n ". + "\n ". + "\n "; /* 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.= "\n ". + "\n
"._("Object").": $name
$options ".("Complete object:")." $more_options
$options "._("Complete object").": $more_options
". + "\n

\n"; } return ($display); @@ -576,7 +751,8 @@ class acl extends plugin function mkchkbx($name, $text, $state= FALSE) { $state= $state?"checked":""; - return ""; + return "\n ". + "\n "; } @@ -584,8 +760,10 @@ class acl extends plugin { $rstate= preg_match('/r/', $state)?'checked':''; $wstate= preg_match('/w/', $state)?'checked':''; - return ("". - ""); + return ("\n ". + "\n ". + "\n ". + "\n "); } @@ -593,8 +771,8 @@ class acl extends plugin { list($index, $type)= split(':', $acl); $a= array( $index => array("type" => $type, - "members" => acl::extractMembers($acl))); - + "members" => acl::extractMembers($acl,$type == "role"))); + /* Handle different types */ switch ($type){ @@ -606,7 +784,7 @@ class acl extends plugin break; case 'role': - echo "Role"; + $a[$index]['acl']= base64_decode(preg_replace('/^[^:]+:[^:]+:([^:]+).*$/', '\1', $acl)); break; case 'reset': @@ -616,18 +794,21 @@ class acl extends plugin print_red(sprintf(_("Unkown ACL type '%s'. Don't know how to handle it."), $type)); $a= array(); } - return ($a); } - function extractMembers($acl) + function extractMembers($acl,$role = FALSE) { global $config; $a= array(); /* Rip acl off the string, seperate by ',' and place it in an array */ - $ms= preg_replace('/^[^:]+:[^:]+:([^:]+).*$/', '\1', $acl); + if($role){ + $ms= preg_replace('/^[^:]+:[^:]+:[^:]+:([^:]+).*$/', '\1', $acl); + }else{ + $ms= preg_replace('/^[^:]+:[^:]+:([^:]+).*$/', '\1', $acl); + } if ($ms == $acl){ return $a; } @@ -709,12 +890,22 @@ class acl extends plugin /* Summarize ACL */ if (isset($entry['acl'])){ $acl= ""; - foreach ($entry['acl'] as $name => $object){ - if (count($object)){ - $acl.= "$name, "; + + if($entry['type'] == "role"){ + + if(isset($this->roles[$entry['acl']])){ + $summary.= sprintf(_("Role: %s"), $this->roles[$entry['acl']]['cn']); + }else{ + $summary.= sprintf(_("Role: %s"), ""._("Unknown role, possibly removed").""); } + }else{ + foreach ($entry['acl'] as $name => $object){ + if (count($object)){ + $acl.= "$name, "; + } + } + $summary.= sprintf(_("Contains settings for these objects: %s"), preg_replace('/, $/', '', $acl)); } - $summary.= sprintf(_("Contains settings for these objects: %s"), preg_replace('/, $/', '', $acl)); } /* Summarize members */ @@ -776,7 +967,12 @@ class acl extends plugin $members.= base64_encode(preg_replace('/^.:/', '', $key)).','; } } - $final= $prio.":".$entry['type'].":".preg_replace('/,$/', '', $members); + + if($entry['type'] != "role"){ + $final= $prio.":".$entry['type'].":".preg_replace('/,$/', '', $members); + }else{ + $final= $prio.":".$entry['type'].":".base64_encode($entry['acl']).":".preg_replace('/,$/', '', $members); + } /* ACL's if needed */ if ($entry['type'] != "reset" && $entry['type'] != "role"){ @@ -847,6 +1043,17 @@ class acl extends plugin function remove_from_parent() { + plugin::remove_from_parent(); + + /* include global link_info */ + $ldap= $this->config->get_ldap_link(); + + $ldap->cd($this->dn); + $this->cleanup(); + $ldap->modify ($this->attrs); + + /* Optionally execute a command after we're done */ + $this->handle_post_events("remove",array("uid" => $this->uid)); } }