diff --git a/gosa-core/plugins/admin/users/class_userManagement.inc b/gosa-core/plugins/admin/users/class_userManagement.inc
index 7c7e19f76df555c17343f19ba5b29120c30ee45b..f3bb656588e81fc3f83daa842aa21eab0336e824 100644 (file)
class userManagement extends plugin
{
/* Plugin definitions */
- var $plHeadline= "Users";
- var $plDescription= "Manage users";
+ var $plHeadline = "Users";
+ var $plDescription = "Manage users";
+ var $plIcon = "plugins/users/images/user.png";
/* Dialog attributes */
var $usertab = NULL;
var $templates = array();
var $got_uid = false;
var $CopyPasteHandler = NULL;
+ var $SnapshotHandler = NULL;
var $CPPasswordChange = ""; // Contains the entry id which should get a new password
var $DivListUsers;
var $start_pasting_copied_objects = FALSE;
var $msg_dialog= NULL;
-
- var $dns =array();
+ var $acl_module = array("users");
+ var $dns = array();
+
+ // Filter/headpage tests
+ var $filter= null;
+ var $headpage= null;
+
function userManagement(&$config, $ui)
{
$this->ui= &$ui;
/* Copy & Paste handler */
- if ($this->config->boolValueIsTrue("main", "enableCopyPaste")){
+ if ($this->config->boolValueIsTrue("main", "copyPaste")){
$this->CopyPasteHandler= new CopyPasteHandler($this->config);
}
+ if($this->config->get_cfg_value("enableSnapshots") == "true"){
+ $this->SnapshotHandler= new SnapshotHandler($this->config);
+ }
/* Creat dialog object */
$this->DivListUsers = new divListUsers($this->config,$this);
$type = $events['BY_CLASS'][$event];
$this->usertab = new $type['CLASS_NAME']($this->config);
$this->usertab->add_users($uids);
- $this->usertab->set_type(TRIGGERED_EVENT);
+ $this->usertab->set_type(SCHEDULED_EVENT);
}
}
}
if(!change_password ($this->usertab->dn, $_POST['new_password'],0, $obj->pw_storage)){
return($smarty->fetch(get_template_path('password.tpl', TRUE)));
}
- if (isset($config->data['MAIN']['EXTERNALPWDHOOK'])){
- exec($config->data['MAIN']['EXTERNALPWDHOOK']." ".$username." ".$_POST['new_password'], $resarr);
+ if ($config->get_cfg_value("passwordHook") != ""){
+ exec($config->get_cfg_value("passwordHook")." ".$username." ".$_POST['new_password'], $resarr);
}
new log("modify","users/".get_class($this),$this->usertab->dn,array(),"Password has been changed");
unset($this->usertab);
if(!change_password ($this->dn, $_POST['new_password'])){
return($smarty->fetch(get_template_path('password.tpl', TRUE)));
}
- if (isset($config->data['MAIN']['EXTERNALPWDHOOK'])){
- exec($config->data['MAIN']['EXTERNALPWDHOOK']." ".$username." ".$_POST['new_password'], $resarr);
+ if ($config->get_cfg_value("passwordHook") != ""){
+ exec($config->get_cfg_value("passwordHook")." ".$username." ".$_POST['new_password'], $resarr);
}
new log("modify","users/".get_class($this),$this->dn,array(),"Password has been changed");
}
$this->sn= "";
$this->givenName= "";
$this->uid= "";
- session::un_set('objectinfo');
+ set_object_info();
}
if($s_action == "multiple_password_change"){
$this->pwd_change_queue = $this->list_get_selected_items();
+ $disallowed = array();
+ foreach($this->pwd_change_queue as $key => $id){
+ if(!preg_match("/w/",$this->ui->get_permissions($this->list[trim($id)]['dn'],"users/password"))){
+ unset($this->pwd_change_queue[$key]);
+ $disallowed[] = $this->list[trim($id)]['dn'];
+ }
+ }
+ if(count($disallowed)){
+ msg_dialog::display(_("Permission"),msgPool::permModify($disallowed),INFO_DIALOG);
+ }
}
/* User is allowed to change passwords, save 'dn' and 'acl' for next
dialog. */
- session::set('objectinfo',$this->dn);
+ set_object_info($this->dn);
return ($smarty->fetch(get_template_path('password.tpl', TRUE)));
} else {
/* User is not allowed. Show message and cancel. */
/* Check locking, save current plugin in 'back_plugin', so
the dialog knows where to return. */
+
if (($user= get_lock($this->dn)) != ""){
- return(gen_locked_message ($user, $this->dn));
+ return(gen_locked_message ($user, $this->dn,TRUE));
}
/* Lock the current entry, so everyone will get the
/* Set ACL and move DN to the headline */
$this->usertab->set_acl_base($this->dn);
- session::set('objectinfo',$this->dn);
+ set_object_info($this->dn);
}
if($tmp->multiple_available()){
$this->usertab = $tmp;
$this->usertab->set_active_tab($s_tab);
- session::set('objectinfo',$this->usertab->get_object_info());
+ set_object_info($this->usertab->get_object_info());
}
}
$this->sn= "";
$this->givenName= "";
$this->uid= "";
- session::un_set('objectinfo');
+ set_object_info();
}
foreach ($this->config->departments as $key => $value){
/* Get acls from different ou's */
- $acl = $this->ui->get_permissions("cn=dummy,".get_people_ou().$value,"users/user") ;
+ $acl = $this->ui->get_permissions($value,"users/user") ;
/* If creation of a new user is allowed, append this template */
if (preg_match("/c/",$acl)){
if ($ldap->count() != 0){
while ($attrs= $ldap->fetch()){
$this->templates[$ldap->getDN()]=
- $attrs['uid'][0]." - ".@LDAP::fix($key);
+ $attrs['uid'][0]." - ".LDAP::fix($key);
}
if ($s_action != "templatize_multiple"){
$this->templates['none']= _("none");
$this->dns = array();
if(count($ids)){
+ $disallowed = array();
foreach($ids as $id){
- $this->dns[$id] = $this->list[$id]['dn'];
+ $dn = $this->list[$id]['dn'];
+ $acl = $this->ui->get_permissions($dn, "users/user");
+ if(preg_match("/d/",$acl)){
+ $this->dns[$id] = $dn;
+ }else{
+ $disallowed[] = $dn;
+ }
}
-
- /* Check locks */
- if ($user= get_multiple_locks($this->dns)){
- return(gen_locked_message($user,$this->dns));
+
+ if(count($disallowed)){
+ msg_dialog::display(_("Permission"),msgPool::permDelete($disallowed),INFO_DIALOG);
}
- $dns_names = array();
- foreach($this->dns as $dn){
- $dns_names[] = @LDAP::fix($dn);
- }
+ if(count($this->dns)){
- add_lock($this->dns, $this->ui->dn);
+ /* Check locks */
+ if ($user= get_multiple_locks($this->dns)){
+ return(gen_locked_message($user,$this->dns));
+ }
- /* Lock the current entry, so nobody will edit it during deletion */
- $info = sprintf(msgPool::deleteInfo($dns_names,_("user")));
+ $dns_names = array();
+ foreach($this->dns as $dn){
+ $dns_names[] = LDAP::fix($dn);
+ }
- /* Lock the current entry, so nobody will edit it during deletion */
- $smarty->assign("info", msgPool::deleteInfo($dns_names));
- return($smarty->fetch(get_template_path('remove.tpl', TRUE)));
+ add_lock($this->dns, $this->ui->dn);
+ /* Lock the current entry, so nobody will edit it during deletion */
+ $info = sprintf(msgPool::deleteInfo($dns_names,_("user")));
+ /* Lock the current entry, so nobody will edit it during deletion */
+ $smarty->assign("info", msgPool::deleteInfo($dns_names));
+ return($smarty->fetch(get_template_path('remove.tpl', TRUE)));
+ }
}
}
/* Get entry check current status */
$val = $this->list[$s_entry];
- $pwd = $val['userPassword'][0];
-
-
if (!preg_match("/w/",$this->ui->get_permissions($val['dn'],"users/password"))){
-
- /* Missing permissions, show message */
- msg_dialog::display(_("Password change"),_("You have no permission to change the lock status for this user!"),WARNING_DIALOG);
-
+ msg_dialog::display(_("Account locking"),
+ _("You have no permission to change the lock status for this user!"),WARNING_DIALOG);
}else{
-
- if(!preg_match("/^\{[^\}]/",$pwd)){
- trigger_error("Can not deactivate user which is using clear password encryption.");
- }else{
-
- $locked = false;
- if(preg_match("/^[^\}]*+\}!/",$pwd)){
- $locked = true;
- }
-
- /* Create ldap array to update status */
- $attrs = array("userPassword" => $pwd);
- if($locked){
- $attrs['userPassword'] = preg_replace("/(^[^\}]+\})!(.*$)/","\\1\\2",$attrs['userPassword']);
+ $pwd = $val['userPassword'][0];
+ $method = passwordMethod::get_method($pwd,$val['dn']);
+ $success= false;
+ if($method instanceOf passwordMethod){
+ if($method->is_locked($this->config,$val['dn'])){
+ $success= $method->unlock_account($this->config,$val['dn']);
}else{
- $attrs['userPassword'] = preg_replace("/(^[^\}]+\})(.*$)/","\\1!\\2",$attrs['userPassword']);
+ $success= $method->lock_account($this->config,$val['dn']);
}
- /* Write new status back to ldap */
- $ldap = $this->config->get_ldap_link();
- $ldap->cd($val['dn']);
- $ldap->modify($attrs);
- if (!$ldap->success()){
- msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $val['dn'], 0, get_class()));
+ /* Check for success */
+ if (!$success){
+ $hn= $method->get_hash_name();
+ if (is_array($hn)){
+ $hn= $hn[0];
+ }
+ msg_dialog::display(_("Account locking"),
+ sprintf(_("Password method '%s' does not support locking. Account has not been locked!"), $hn),WARNING_DIALOG);
}
+ }else{
+ // Can't lock unknown methods.
}
+
}
}
-
/********************
Delete entry Canceled
********************/
unset ($this->usertab);
$this->usertab= NULL;
- session::un_set('objectinfo');
+ set_object_info();
}else{
/* Reinitialize tab */
react on this. */
$this->dn= "new";
- if (isset($this->config->current['IDGEN'])){
- $this->got_uid= false;
- } else {
- $this->got_uid= true;
- }
+ $this->got_uid= ($this->config->get_cfg_value("idGenerator") == "");
/* Create new usertab object */
$this->usertab= new usertabs($this->config,$this->config->data['TABS']['USERTABS'], $this->dn);
$this->usertab->by_object['user']->base= $this->DivListUsers->selectedBase;
- $this->usertab->set_acl_base('dummy,'.$this->DivListUsers->selectedBase);
+ $this->usertab->set_acl_base($this->DivListUsers->selectedBase);
/* Take care about templates */
if ($s_action=="new_tpl"){
msg_dialog::displayChecks($message);
} else {
$attributes= array('sn' => $this->sn, 'givenName' => $this->givenName);
- if (isset($this->config->current['IDGEN']) &&
- $this->config->current['IDGEN'] != ""){
- $uids= gen_uids ($this->config->current['IDGEN'], $attributes);
+ if ($this->config->get_cfg_value("idGenerator") != ""){
+ $uids= gen_uids ($this->config->get_cfg_value("idGenerator"), $attributes);
if (count($uids)){
$smarty->assign("edit_uid", "false");
$smarty->assign("uids", $uids);
/* Finish template preamble */
if (isset($_POST['template_continue']) && $_POST['template'] != 'none' && (isset($_POST['uid']))){
- /* Might not be filled if IDGEN is unset */
- $this->sn = $_POST['sn'];
- $this->givenName = $_POST['givenName'];
-
/* Move user supplied data to sub plugins */
- $this->uid = $_POST['uid'];
- $this->usertab->uid = $this->uid;
- $this->usertab->sn = $this->sn;
- $this->usertab->givenName = $this->givenName;
+ foreach(array("uid","sn","givenName") as $attr){
+ $this->$attr = $_POST[$attr];
+ $this->usertab->$attr = $this->$attr;
+ $this->usertab->by_object['user']->$attr = $this->$attr;
+ }
+
$template_dn = $_POST['template'];
- $this->usertab->adapt_from_template($template_dn);
- $template_base = preg_replace("/^[^,]+,".normalizePreg(get_people_ou())."/", '', $template_dn);
+ $this->usertab->adapt_from_template($template_dn, array("uid","cn","givenName","sn"));
+ $template_base = preg_replace("/^[^,]+,".preg_quote(get_people_ou(), '/')."/", '', $template_dn);
$this->usertab->by_object['user']->base= $template_base;
}
}
if(!is_object($dia) && $dia != TRUE){
- $display.= "<p style=\"text-align:right\">\n";
- $display.= "<input type=submit name=\"edit_finish\" style=\"width:80px\" value=\"".msgPool::okButton()."\">\n";
- $display.= " \n";
- if ($this->dn != "new"){
- $display.= "<input type=submit name=\"edit_apply\" value=\"".msgPool::applyButton()."\">\n";
+ if(($this->usertab instanceOf tabs || $this->usertab instanceOf plugin) && $this->usertab->read_only == TRUE){
+ $display.= "<p style=\"text-align:right\">
+ <input type=submit name=\"edit_cancel\" value=\"".msgPool::cancelButton()."\">
+ </p>";
+ }else{
+ $display.= "<p style=\"text-align:right\">\n";
+ $display.= "<input type=submit name=\"edit_finish\" style=\"width:80px\" value=\"".msgPool::okButton()."\">\n";
$display.= " \n";
+ if ($this->dn != "new"){
+ $display.= "<input type=submit name=\"edit_apply\" value=\"".msgPool::applyButton()."\">\n";
+ $display.= " \n";
+ }
+ $display.= "<input type=submit name=\"edit_cancel\" value=\"".msgPool::cancelButton()."\">\n";
+ $display.= "</p>";
}
- $display.= "<input type=submit name=\"edit_cancel\" value=\"".msgPool::cancelButton()."\">\n";
- $display.= "</p>";
}
return ($display);
}
/* Check if there is a snapshot dialog open */
$base = $this->DivListUsers->selectedBase;
- if($str = $this->showSnapshotDialog($base,$this->get_used_snapshot_bases())){
+ if($str = $this->showSnapshotDialog($base,$this->get_used_snapshot_bases(),$this)){
return($str);
}
/* Return rendered main page */
- /* Display dialog with system list */
$this->DivListUsers->parent = $this;
$this->DivListUsers->execute();
}
$this->reload();
$this->DivListUsers->setEntries($this->list);
+
+ # FILTER Test #################################################
+ ## Build filter
+ #if (!$this->filter) {
+ # $this->filter = new filter(get_template_path("user-filter.xml", true));
+ # $this->filter->setObjectStorage(get_people_ou());
+ #}
+ #$this->filter->update();
+ #session::set('autocomplete', $this->filter);
+ #if (!$this->filter->isValid()){
+ # msg_dialog::display(_("Filter error"), _("The filter is uncomplete!"), ERROR_DIALOG);
+ #}
+
+ ## Build headpage
+ #if (!$this->headpage){
+ # $this->headpage = new listing(get_template_path("user-list.xml", true));
+ # $this->headpage->registerElementFilter("accountProperties", "userManagement::filterProperties");
+ # $this->headpage->registerElementFilter("lockLabel", "userManagement::filterLockLabel");
+ # $this->headpage->registerElementFilter("lockImage", "userManagement::filterLockImage");
+ # $this->headpage->setFilter($this->filter);
+ #}
+
+ ## Needs to be called before update!
+ #$action= $this->headpage->getAction();
+ #if ($action['action'] != '') {
+ # echo "List detected action:";
+ # print_a($action);
+ #}
+
+ ## Refresh for filter
+ #$this->headpage->update();
+ #
+ #return($this->headpage->render());
+ ################################################### FILTER Test
+
return($this->DivListUsers->Draw());
}
+ static function filterLockImage($userPassword)
+ {
+ $image= "images/empty.png";
+
+ if(isset($userPassword[0]) && preg_match("/^\{[^\}]/",$userPassword[0])){
+ if(preg_match("/^[^\}]*+\}!/",$userPassword[0])){
+ $image= "images/lists/locked.png";
+ }else{
+ $image= "images/lists/unlocked.png";
+ }
+ }
+
+ return $image;
+ }
+
+
+ static function filterLockLabel($userPassword)
+ {
+ $label= "";
+
+ if(isset($userPassword[0]) && preg_match("/^\{[^\}]/",$userPassword[0])){
+ if(preg_match("/^[^\}]*+\}!/",$userPassword[0])){
+ $label= _("Unlock account");
+ }else{
+ $label= _("Lock account");
+ }
+ }
+
+ return $label;
+ }
+
+
+ static function filterProperties($dn, $row, $class)
+ {
+ $result= "";
+
+ $map= array( "gosaAccount" => array( "image" => "plugins/users/images/select_user.png",
+ "plugin" => "user",
+ "alt" => _("Generic"),
+ "title" => _("Edit generic properties")),
+ "posixAccount" => array("image" => "images/penguin.png",
+ "plugin" => "posixAccount",
+ "alt" => _("POSIX"),
+ "title" => _("Edit POSIX properties")),
+ "gosaMailAccount" => array("image" => "images/mailto.png",
+ "alt" => _("Mail"),
+ "plugin" => "mailAccount",
+ "title" => _("Edit mail properties")),
+ "sambaSamAccount" => array("image" => "plugins/systems/images/select_winstation.png",
+ "plugin" => "sambaAccount",
+ "alt" => _("Samba"),
+ "title" => _("Edit samba properties")),
+ "apple-user" => array("image" => "plugins/netatalk/images/select_netatalk.png",
+ "plugin" => "sambaAccount",
+ "alt" => _("Netatalk"),
+ "title" => _("Edit netatalk properties")),
+ "gotoEnvironment" => array("image" => "plugins/users/images/small_environment.png",
+ "plugin" => "gotoEnvironment",
+ "alt" => _("Environment"),
+ "title" => _("Edit environment properties")),
+ "goFaxAccount" => array("image" => "plugins/users/images/fax_small.png",
+ "plugin" => "goFaxAccount",
+ "alt" => _("FAX"),
+ "title" => _("Edit FAX properties")),
+ "goFonAccount" => array("image" => "plugins/gofon/images/select_phone.png",
+ "plugin" => "goFonAccount",
+ "alt" => _("Phone"),
+ "title" => _("Edit phone properties")));
+
+ // Walk thru map
+ foreach ($map as $oc => $properties) {
+ if (in_array($oc, $class)) {
+ $result.="<input class='center' type='image' src='".$properties['image']."' ".
+ "alt='".$properties['alt']."' title='".$properties['title'].
+ "' name='listing_edit_".$properties['plugin']."_$row' style='padding:1px'>";
+ } else {
+ $result.="<img src='images/empty.png' alt=' ' class='center' style='padding:1px'>";
+ }
+ }
+
+ return $result;
+ }
+
+
+
/* Return departments, that will be included within snapshot detection */
function get_used_snapshot_bases()
{
/* Setup filter depending on selection */
$filter="";
- if ($this->config->current['SAMBAVERSION'] == 3){
- $samba= "sambaSamAccount";
- } else {
- $samba= "sambaAccount";
- }
+ $samba= "sambaSamAccount";
if ($ShowFunctionalUsers){
$filter.= "(&(objectClass=gosaAccount)(!(|(objectClass=posixAccount)".
if ($ShowTemplates){
$filter= "(|(objectClass=gosaUserTemplate)(&(objectClass=gosaAccount)(|$filter)))";
} else {
- $filter= "(&(objectClass=gosaAccount)(!(objectClass=gosaUserTemplate))(|$filter))";
+ $filter= "(&(objectClass=gosaAccount)(objectClass=person)".
+ "(objectClass=inetOrgPerson)(objectClass=organizationalPerson)".
+ "(!(objectClass=gosaUserTemplate))(|$filter))";
}
$filter= "(&(|(uid=".normalizeLdap($Regex).")(sn=".normalizeLdap($Regex).")(givenName=".normalizeLdap($Regex)."))$filter)";
}
$SortTemp = array();
$List = array();
+
foreach($ListTemp as $Key => $Entry){
+
+ /* Due to the fact that "inetOrgPerson" is derived from "organizationalPerson" and that openldap
+ doesn't differentiate both classes in search filters, we have to skip entries that do not provide
+ both classes. (Both classes are required for a valid GOsa user Account.)
+ */
+ if(!in_array("inetOrgPerson",$Entry['objectClass'])|| !in_array("organizationalPerson",$Entry['objectClass'])){
+ continue;
+ }
/* Skip entries that are not located under the people ou (normaly 'ou=people,')
* Else winstations will be listed too, if you use the subtree flag.
*/
- if(!preg_match("/".normalizePreg(get_people_ou())."/i",$Entry['dn'])){
+ if(!preg_match("/".preg_quote(get_people_ou(), '/')."/i",$Entry['dn'])){
continue;
}else{
/* Remove user lock if a DN is marked as "currently edited" */
if (isset($this->usertab->dn)){
del_lock ($this->usertab->dn);
- }
- if(isset($this->dn) && !empty($this->dn) && $this->dn != "new"){
+ }elseif(isset($this->dn) && !empty($this->dn) && $this->dn != "new"){
del_lock($this->dn);
}
if(isset($this->dns) && is_array($this->dns) && count($this->dns)){
if(!is_object($this->CopyPasteHandler)){
return("");
}
-
+
+ $ui = get_userinfo();
+
/* Add a single entry to queue */
if($s_action == "cut" || $s_action == "copy"){
+
/* Cleanup object queue */
$this->CopyPasteHandler->cleanup_queue();
$dn = $this->list[$s_entry]['dn'];
- $this->CopyPasteHandler->add_to_queue($dn,$s_action,"usertabs","USERTABS","users");
+ if($s_action == "copy" && $ui->is_copyable($dn,"users","user")){
+ $this->CopyPasteHandler->add_to_queue($dn,$s_action,"usertabs","USERTABS","users");
+ }
+ if($s_action == "cut" && $ui->is_cutable($dn,"users","user")){
+ $this->CopyPasteHandler->add_to_queue($dn,$s_action,"usertabs","USERTABS","users");
+ }
}
/* Add entries to queue */
foreach($this->list_get_selected_items() as $id){
$dn = $this->list[$id]['dn'];
- if($s_action == "copy_multiple"){
+ if($s_action == "copy_multiple" && $ui->is_copyable($dn,"users","user")){
$this->CopyPasteHandler->add_to_queue($dn,"copy","usertabs","USERTABS","users");
}
- if($s_action == "cut_multiple"){
+ if($s_action == "cut_multiple" && $ui->is_cutable($dn,"users","user")){
$this->CopyPasteHandler->add_to_queue($dn,"cut","usertabs","USERTABS","users");
}
}
if($this->start_pasting_copied_objects && $this->CopyPasteHandler->entries_queued()){
/* Get dialog */
- $data = $this->CopyPasteHandler->execute();
$this->CopyPasteHandler->SetVar("base",$this->DivListUsers->selectedBase);
+ $data = $this->CopyPasteHandler->execute();
/* Set CPPasswordChange to s_entry which indicates that this entry requires a new password. */
if(isset($_POST['passwordTodo']) && ($_POST['passwordTodo'] == "new")){