add_objectClass(\'inetOrgPerson\');'), E_USER_ERROR); // posixAccount is only a valid objectClass for user and host if ($basearray->get_type() != 'user') trigger_error(_('inetOrgPerson can only be used for users.'), E_USER_WARNING); /* Create a reference to basearray so we can read all other modules * php will avaois recousrion itself */ $this->base = &$basearray; // Add attributes which should be cached $_SESSION['cache']->add_cache(array ('user' => array('cn', 'uid'), 'host' => array('cn', 'uid') )); // Add Array with all attributes and type $basearray->add_attributes ('inetOrgPerson'); // Add account type to object $line=-1; for ($i=0; $ibase->ldap->objectClasses) || $i==-1; $i++) { if (strpos($this->base->ldap->objectClasses[$i], "NAME 'inetOrgPerson'")) $line = $i; } // Return error if objectClass isn't found if ($line==-1) trigger_error (_("objectClass objectClass required but not defined in ldap."), E_USER_WARNING); // create array with must-attributes // Get startposition in string if (strpos($this->base->ldap->objectClasses[$line], 'MUST (')) { $string_withtail = substr($this->base->ldap->objectClasses[$line], strpos($this->base->ldap->objectClasses[$line], 'MUST (')+6); // Now we have a string with all must-attributes $string = substr($string_withtail, 0, strpos($string_withtail, ')')); $string = trim($string); // Ad must foreach (explode(" $ ", $string) as $attribute) { $this->attributes[$attribute] = ''; } } // create array with may-attributes // Get startposition in string if (strpos($this->base->ldap->objectClasses[$line], 'MAY (')) { $string_withtail = substr($this->base->ldap->objectClasses[$line], strpos($this->base->ldap->objectClasses[$line], 'MAY (')+5); // Now we have a string with all must-attributes $string = substr($string_withtail, 0, strpos($string_withtail, ')')); $string = trim($string); // Ad may foreach (explode(" $ ", $string) as $attribute) { $this->attributes[$attribute] = ''; } } // Get attributes of subclasses while (strpos($this->base->ldap->objectClasses[$line], "SUP ")) { $string_withtail = substr($this->base->ldap->objectClasses[$line], strpos($this->base->ldap->objectClasses[$line], 'SUP ')+4); $subclass = substr($string_withtail, 0, strpos($string_withtail, ' ')); // Add account type to object for ($i=0; $ibase->ldap->objectClasses) || $i==-1; $i++) { if (strpos($this->base->ldap->objectClasses[$i], "NAME '$subclass'")) $line = $i; } // Return error if objectClass isn't found if ($line==-1) trigger_error (_("objectClass objectClass required but not defined in ldap."), E_USER_WARNING); // create array with must-attributes // Get startposition in string if (strpos($this->base->ldap->objectClasses[$line], 'MUST (')) { $string_withtail = substr($this->base->ldap->objectClasses[$line], strpos($this->base->ldap->objectClasses[$line], 'MUST (')+6); // Now we have a string with all must-attributes $string = substr($string_withtail, 0, strpos($string_withtail, ')')); $string = trim($string); // Ad must foreach (explode(" $ ", $string) as $attribute) { $this->attributes[$attribute] = ''; } } // create array with may-attributes // Get startposition in string if (strpos($this->base->ldap->objectClasses[$line], 'MAY (')) { $string_withtail = substr($this->base->ldap->objectClasses[$line], strpos($this->base->ldap->objectClasses[$line], 'MAY (')+5); // Now we have a string with all must-attributes $string = substr($string_withtail, 0, strpos($string_withtail, ')')); $string = trim($string); // Ad may foreach (explode(" $ ", $string) as $attribute) { $this->attributes[$attribute] = ''; } } } $this->attributes = $this->orig; $this->alias = _('inetOrgPerson'); } // Variables // Alias Name. This name is shown in the menu instead of posixAccount var $alias; // reference to base-array so we can read other classes in basearray var $base; // This variable contains all inetOrgPerson Attributes var $attributes; /* If an account was loaded all attributes are kept in this array * to compare it with new changed attributes */ var $orig; /* $attribute['password'] can't accessed directly because it's enrcypted * To read / write password function userPassword is needed */ /* This function returns a list with all required modules */ function dependencies() { // return error if unsupported type is used return array(); } /* Write variables into object and do some regexp checks */ function proccess_attributes() { // Load attributes $this->attributes['uid'] = $_POST['form_inetOrgPerson_uid']; $this->attributes['cn'] &= $this->attributes['cn']; // Check if Username contains only valid characters if ( !ereg('^([a-z]|[A-Z]|[0-9]|[.]|[-]|[_])*$', $this->attributes['uid'])) $errors[] = array('ERROR', _('Username'), _('Username contains invalid characters. Valid characters are: a-z, A-Z, 0-9 and .-_ !')); // Create automatic useraccount with number if original user already exists // Reset name to original name if new name is in use // *** fixme make incache modularized. Incache will return the found attribute // Set username back to original name if new username is in use if (incache($this->attributes['uid'],'uid', '*')!=$this->orig['uid'] && ($this->orig['uid']!='')) $this->attributes['uid'] = $this->orig['uid']; // Change uid to a new uid until a free uid is found while (incache($this->attributes['uid'], 'uid', '*')) { // get last character of username $lastchar = substr($this->attributes['uid'], strlen($this->attributes['uid'])-1, 1); // Last character is no number if ( !ereg('^([0-9])+$', $lastchar)) /* Last character is no number. Therefore we only have to * add "2" to it. */ $this->attributes['uid'] = $this->attributes['uid'] . '2'; else { /* Last character is a number -> we have to increase the number until we've * found a groupname with trailing number which is not in use. * * $i will show us were we have to split groupname so we get a part * with the groupname and a part with the trailing number */ $i=strlen($this->attributes['uid'])-1; $mark = false; // Set $i to the last character which is a number in $account_new->general_username while (!$mark) { if (ereg('^([0-9])+$',substr($this->attributes['uid'], $i, strlen($this->attributes['uid'])-$i))) $i--; else $mark=true; } // increase last number with one $firstchars = substr($this->attributes['uid'], 0, $i+1); $lastchars = substr($this->attributes['uid'], $i+1, strlen($this->attributes['uid'])-$i); // Put username together $this->attributes['uid'] = $firstchars . (intval($lastchars)+1); } } // Show warning if lam has changed username if ($this->attributes['uid'] != $_POST['form_inetOrgPerson_uid']) $errors[] = array('WARN', _('Username'), _('Username in use. Selected next free username.')); // Return error-messages if (is_array($errors)) return $errors; return 0; } /* This function loads all attributes into the object * $attr is an array as it's retured from ldap_get_attributes */ function load_attributes($attr) { // Load attributes which are displayed // Values are kept as copy so we can compare old attributes with new attributes } /* This function returns an array with 3 entries: * array( DN1 ('add' => array($attr), 'remove' => array($attr), 'modify' => array($attr)), DN2 .... ) * DN is the DN to change. It may be possible to change several DNs, * e.g. create a new user and add him to some groups via attribute memberUid * add are attributes which have to be added to ldap entry * remove are attributes which have to be removed from ldap entry * modify are attributes which have to been modified in ldap entry */ function save_attributes() { /* Exmaples * Add new attribute * if ($this->cn!='' && $this->orig['cn']=='') $return[$this->base['dn']]['add']['cn'] = $this->cn; * Modify existing attribute * if ($this->cn!='' && $this->orig['cn']!='') $return[$this->base['dn']]['modify']['cn'] = $this->cn; * Remove existing attribute * if ($this->cn=='' && $this->orig['cn']!='') $return[$this->base['dn']]['remove']['cn'] = $this->cn; */ // Get list off all attributes $attributes = $this->orig; // Remove attributes which are not as easy to set unset ($attributes['enc_userPassword']); unset ($attributes['groups']); // Get list of all "easy" attributes $attr_names = array_keys($attributes); foreach ($attr_names as $attr_name) { if ($this->$attr_name!='' && $this->orig[$attr_name]=='') $return[$this->base['dn']]['add'][$attr_name] = $this->cn; if ($this->$attr_name!='' && $this->orig[$attr_name]!='') $return[$this->base['dn']]['modify'][$attr_name] = $this->cn; if ($this->$attr_name=='' && $this->orig[$attr_name]!='') $return[$this->base['dn']]['remove'][$attr_name] = $this->cn; } // Set unix password if ($this->orig['enc_userPassword']=='') { // New user or no old password set if ($this->userPassword_no) $return[$this->base['dn']]['modify']['userPassword'] = pwd_hash ('', !$this->userPassword_lock); else $return[$this->base['dn']]['modify']['userPassword'] = pwd_hash ($this->userPassword(), !$this->userPassword_lock); } else { if ($this->userPassword()!='' || $this->userPassword_no) { // Write new password if ($this->userPassword_no) $return[$this->base['dn']]['modify']['userPassword'] = pwd_hash ('', !$this->userPassword_lock); else $return[$this->base['dn']]['modify']['userPassword'] = pwd_hash ($this->userPassword(), !$this->userPassword_lock); } else { // No new password but old password // (un)lock password if ($this->userPassword_lock == pwd_is_enabled($this->orig['enc_userPassword'])) { // Split old password hash in {CRYPT} and password-hash $i = 0; while ($this->orig['enc_userPassword']{$i} != '}') $i++; $passwd = substr($this->orig['enc_userPassword'], $i+1 ); $crypt = substr($this->orig['enc_userPassword'], 0, $i+1 ); // remove trailing ! from password hash if ($passwd{0} == '!') $passwd = substr($passwd, 1); // Write new password if ($this->userPassword_lock) $return[$this->base['dn']]['modify']['userPassword'] = "$crypt!$passwd"; else $return[$this->base['dn']]['modify']['userPassword'] = "$crypt$passwd"; } } } } /* This function returns all ldap attributes * which are part of posixAccount and returns * also their values. */ function get_attributes() { if ($userPassword_no) $return['userPassword'] = ''; else $return['userPassword'] = $this->userPassword(); $return['cn'] = $this->cn; $return['uid'] = $this->uid; $return['uidNumber'] = $this->uidNumber; $return['gidNumber'] = $this->gidNumber; $return['homeDirectory'] = $this->homeDirectory; $return['loginShell'] = $this->loginShell; $return['gecos'] = $this->gecos; $return['description'] = $this->description; // Not really ldap attributes but return values may be required $return['groups'] = $this->groups; if ($userPassword_lock) $return['userPasswordLocked'] = true; else $return['userPasswordLocked'] = false; return $return; } /* This function will create the html-page * to show a page with all attributes. * It will output a complete html-table */ function display_html_attributes() { $groups = findgroups(); // list of all groupnames $shelllist = getshells(); // list of all valid shells echo "\n\n"; echo '\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; if ($this->base['type']=='user') { echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; } echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; if ($this->base['type']=='user') { if (count($shelllist)!=0) { echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; } echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; } echo "
' . _('Username') . "*uid\">" . _('Help') . "
" . _('UID number') . "uidNumber\">" . _('Help') . "
" . _('Primary group') . "*" . _('Help') . "
" . _('Additional groups') . "" . _('Help') . "
" . _('Home directory') . "*homeDirectory\">" . _('Help') . "
" . _('Gecos') . "gecos\">" . _('Help') . "
" . _('Description') . "description\">" . _('Help') . "
" . _('Login shell') . "*" . _('Help') . "
" . _('Password') . "userPassword()\">
" . _('Repeat password') . "userPassword(); echo "\">
" . _('Use no password') . "userPassword_no) echo " checked "; echo ">" . _('Help') . "
\n"; return 0; } function display_html_group() { // load list with all groups $dn_groups = getcache('uidNumber', 'posixGroup', 'group'); foreach ($dn_groups as $group) $groups[] = $group[0]; // sort groups sort($groups, SORT_STRING); // remove groups the user is member of from grouplist $groups = array_delete($this->groups, $groups); // *** fixme primary group mut also be removed if it has changed after setting additional groups // Remove primary group from grouplist $groups = array_flip($groups); if (isset($groups[getgrnam($this->gidNumber)])) unset ($groups[getgrnam($this->gidNumber)]); $groups = array_flip($groups); echo "\n\n"; echo "
"; echo "" . _("Additional groups") . "\n"; echo "\n\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "
"; echo "
"; echo "" . _("Selected groups") . "\n"; // Show all groups the user is additional member of if (count($this->groups)!=0) { echo "\n"; } echo "
"; echo " "; echo "\">

"; echo ""._('Help')."
\n"; echo "
"; echo "" . _('Available groups') . "\n"; // show all groups expect these the user is member of if (count($groups)!=0) { echo "\n"; } echo "
\n"; echo "\n"; echo "
\n"; echo "
\n"; return 0; } } ?>