diff --git a/gosa-core/plugins/personal/generic/class_user.inc b/gosa-core/plugins/personal/generic/class_user.inc
index b3ac780bf1c89ceefd4c147834b97404db938154..437ac728f0bb1b865800784cff628dc179ca62fd 100644 (file)
var $manager = "";
var $manager_name = "";
-
+ var $passwordClass = NULL;
/* attribute list for save action */
var $attributes= array("sn", "givenName", "uid", "personalTitle", "academicTitle",
"homePostalAddress", "homePhone", "labeledURI", "ou", "o", "dateOfBirth", "gender","preferredLanguage",
"departmentNumber", "employeeNumber", "employeeType", "l", "st","jpegPhoto",
- "roomNumber", "telephoneNumber", "mobile", "pager", "cn", "userPKCS12",
+ "roomNumber", "telephoneNumber", "mobile", "pager", "cn", "userPKCS12", "street", "postalCode",
"postalAddress", "facsimileTelephoneNumber", "userSMIMECertificate", "gosaLoginRestriction", "manager");
var $objectclasses= array("top", "person", "organizationalPerson", "inetOrgPerson",
if(preg_match("/ editManager/i", " ".implode(array_keys($_POST),' ')." ")){
$this->dialog = new singleUserSelect($this->config, get_userinfo());
}
- if($this->dialog && count($this->dialog->detectPostActions())){
+ if($this->dialog instanceOf singleUserSelect && count($this->dialog->detectPostActions())){
$users = $this->dialog->detectPostActions();
if(isset($users['targets']) && count($users['targets'])){
if(isset($_POST['add_users_cancel'])){
$this->dialog = NULL;
}
- if($this->dialog) return($this->dialog->execute());
+ if($this->dialog instanceOf singleUserSelect) return($this->dialog->execute());
$smarty= get_smarty();
$this->dialog= false;
}
- /* Dialog handling */
- if(is_object($this->dialog)){
- /* Must be called before save_object */
- $this->dialog->save_object();
-
- if($this->dialog->isClosed()){
- $this->dialog = false;
- }elseif($this->dialog->isSelected()){
-
- /* check if selected base is allowed to move to / create a new object */
- $tmp = $this->get_allowed_bases();
- if(isset($tmp[$this->dialog->isSelected()])){
- $this->base = $this->dialog->isSelected();
- }
- $this->dialog= false;
- }else{
- return($this->dialog->execute());
- }
- }
-
/* Want password method editing? */
if ($this->acl_is_writeable("userPassword")){
if (isset($_POST['edit_pw_method'])){
/* Prepare password hashes */
if ($this->pw_storage == ""){
- $this->pw_storage= $this->config->get_cfg_value("hash");
+ $this->pw_storage= $this->config->get_cfg_value("passwordDefaultHash");
}
$temp= passwordMethod::get_available_methods();
$ui =get_userinfo();
foreach($this->attributes as $val){
$smarty->assign("$val", $this->$val);
- if(in_array($val,$this->multi_boxes)){
+ if(in_array_strict($val,$this->multi_boxes)){
$smarty->assign("use_".$val,TRUE);
}else{
$smarty->assign("use_".$val,FALSE);
}
}
foreach(array("base","pw_storage","edit_picture") as $val){
- if(in_array($val,$this->multi_boxes)){
+ if(in_array_strict($val,$this->multi_boxes)){
$smarty->assign("use_".$val,TRUE);
}else{
$smarty->assign("use_".$val,FALSE);
while ($ldap->fetch()){
$og= new ogroup($this->config, $ldap->getDN());
unset($og->member[$this->dn]);
- $og->member= array_values($og->member);
$og->save ();
}
+ // Update 'manager' attributes from gosaDepartment and inetOrgPerson
+ $filter = "(&(objectClass=inetOrgPerson)(manager=".LDAP::prepare4filter($this->dn)."))";
+ $ocs = $ldap->get_objectclasses();
+ if(isset($ocs['gosaDepartment']['MAY']) && in_array_strict('manager', $ocs['gosaDepartment']['MAY'])){
+ $filter = "(|".$filter."(&(objectClass=gosaDepartment)(manager=".LDAP::prepare4filter($this->dn).")))";
+ }
+ $leaf_deps= get_list($filter,array("all"),$this->config->current['BASE'],
+ array("manager","dn","objectClass"),GL_SUBSEARCH | GL_NO_ACL_CHECK);
+ foreach($leaf_deps as $entry){
+ $update = array('manager' => array());
+ $ldap->cd($entry['dn']);
+ $ldap->modify($update);
+ if(!$ldap->success()){
+ trigger_error(sprintf("Failed to update manager for '%s', error was '%s'", $entry['dn'], $ldap->get_error()));
+ }
+ }
+
/* Delete references to roles */
$ldap->cd ($this->config->current['BASE']);
$ldap->search ("(&(objectClass=organizationalRole)(roleOccupant=".LDAP::prepare4filter($this->dn)."))", array("cn"));
plugin::save_object ();
/* Refresh base */
- if ($this->acl_is_moveable($this->base)){
+ if ($this->acl_is_moveable($this->base) ||
+ ($this->dn == "new" && $this->acl_is_createable($this->base))){
if (!$this->baseSelector->update()) {
msg_dialog::display(_("Error"), msgPool::permMove(), ERROR_DIALOG);
}
/* Special handling for attribute jpegPhote needed, scale image via
image magick to 147x200 pixels and inject resulting data. */
if ($this->jpegPhoto == "*removed*"){
-
- /* Reset attribute to avoid writing *removed* as value */
- $this->attrs["jpegPhoto"] = array();
-
- } else {
-
- /* Fallback if there's no image magick inside PHP */
- if (!function_exists("imagick_blob2image")){
- /* Get temporary file name for conversation */
- $fname = tempnam (TEMP_DIR, "GOsa");
-
- /* Open file and write out photoData */
- $fp = fopen ($fname, "w");
- fwrite ($fp, $this->photoData);
- fclose ($fp);
-
- /* Build conversation query. Filename is generated automatically, so
- we do not need any special security checks. Exec command and save
- output. For PHP safe mode, you'll need a configuration which respects
- image magick as executable... */
- $query= "convert -size 147x200 $fname -resize 147x200 +profile \"*\" -";
- @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__,
- $query, "Execute");
-
- /* Read data written by convert */
- $output= "";
- $sh= popen($query, 'r');
- while (!feof($sh)){
- $output.= fread($sh, 4096);
- }
- pclose($sh);
-
- unlink($fname);
-
- /* Save attribute */
- $this->attrs["jpegPhoto"] = $output;
- } else {
+ /* Reset attribute to avoid writing *removed* as value */
+ $this->attrs["jpegPhoto"] = array();
- /* Load the new uploaded Photo */
- if(!$handle = imagick_blob2image($this->photoData)) {
- new log("debug","users/".get_class($this),$this->dn,array(),"Could not access uploaded image");
- }
+ } else {
- /* Resizing image to 147x200 and blur */
- if(!imagick_resize($handle,147,200,IMAGICK_FILTER_GAUSSIAN,0)){
- new log("debug","users/".get_class($this),$this->dn,array(),"Could not resize uploaded image");
- }
+ if(class_exists('Imagick')){
+
+ $im = new Imagick();
+ $im->readImageBlob($this->photoData);
+ $im->setImageOpacity(1.0);
+ $im->resizeImage(147,200,Imagick::FILTER_UNDEFINED,0.5,TRUE);
+ $im->setCompressionQuality(90);
+ $im->setImageFormat('jpeg');
+ $this->attrs["jpegPhoto"] = $im->getImageBlob();
+
+ }elseif(exec('convert')){
+
+ /* Get temporary file name for conversation */
+ $fname = tempnam (TEMP_DIR, "GOsa");
+
+ /* Open file and write out photoData */
+ $fp = fopen ($fname, "w");
+ fwrite ($fp, $this->photoData);
+ fclose ($fp);
+
+ /* Build conversation query. Filename is generated automatically, so
+ we do not need any special security checks. Exec command and save
+ output. For PHP safe mode, you'll need a configuration which respects
+ image magick as executable... */
+ $query= "convert -size 147x200 $fname -resize 147x200 +profile \"*\" -";
+ @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__,
+ $query, "Execute");
+
+ /* Read data written by convert */
+ $output= "";
+ $sh= popen($query, 'r');
+ while (!feof($sh)){
+ $output.= fread($sh, 4096);
+ }
+ pclose($sh);
- /* Converting image to JPEG */
- if(!imagick_convert($handle,"JPEG")) {
- new log("debug","users/".get_class($this),$this->dn,array(),"Could not convert uploaded image to jepg");
- }
+ unlink($fname);
- /* Creating binary Code for the Image */
- if(!$dump = imagick_image2blob($handle)){
- new log("debug","users/".get_class($this),$this->dn,array(),"Could not create new user image");
+ /* Save attribute */
+ $this->attrs["jpegPhoto"] = $output;
+ }else{
+ msg_dialog::display(_("Error"),
+ _("Cannot save user picture, GOsa requires the package 'imagemagick' or 'php5-imagick' to be installed!"),
+ ERROR_DIALOG);
}
-
- /* Sending Image */
- $output= $dump;
-
- /* Save attribute */
- $this->attrs["jpegPhoto"] = $output;
- }
-
}
/* This only gets called when user is renaming himself */
/* Indicate whether a password change is needed or not */
function password_change_needed()
{
- if(in_array("pw_storage",$this->multi_boxes)){
- return(TRUE);
+ if($this->multiple_support_active){
+ return(FALSE);
+ }else{
+
+ if(in_array_strict("pw_storage",$this->multi_boxes)){
+ return(TRUE);
+ }
+ return($this->pw_storage != $this->last_pw_storage && !$this->is_template);
}
- return($this->pw_storage != $this->last_pw_storage && !$this->is_template);
}
$this->jpegPhoto= "*removed*";
}
+ clearstatcache();
$fd = fopen ($filename, "rb");
$this->photoData= fread ($fd, filesize ($filename));
session::set('binary',$this->photoData);
/* Load certificate from file to object */
function set_cert($cert, $filename)
{
+ clearstatcache();
if(!$this->acl_is_writeable("Certificate",(!is_object($this->parent) && !session::is_set('edit')))) return;
$fd = fopen ($filename, "rb");
if (filesize($filename)>0) {
/* Get base */
$this->base= preg_replace('/^[^,]+,'.preg_quote(get_people_ou(), '/').'/i', '', $dn);
+ $this->baseSelector->setBase($this->base);
if($this->governmentmode){
/* Walk through govattrs */
foreach ($this->govattrs as $val){
- if (in_array($val, $skip)){
+ if (in_array_strict($val, $skip)){
continue;
}
$this->givenName= $this->parent->givenName;
}
- if ($this->dateOfBirth) {
+
+ /* Generate dateOfBirth entry */
+ if (isset ($this->attrs['dateOfBirth'])){
/* This entry is ISO 8601 conform */
- list($year, $month, $day)= explode("-", $this->dateOfBirth, 3);
-
+ list($year, $month, $day)= explode("-", $this->attrs['dateOfBirth'][0], 3);
+
#TODO: use $lang to convert date
$this->dateOfBirth= "$day.$month.$year";
+ } else {
+ $this->dateOfBirth= "";
}
+
}
$this->old_userPKCS12= "";
$this->old_userSMIMECertificate= "";
$this->old_userCertificate= "";
+
+ /* Generate dateOfBirth entry */
+ if (isset ($source['dateOfBirth'])){
+ list($year, $month, $day)= explode("-", $source['dateOfBirth'][0], 3);
+ $this->dateOfBirth= "$day.$month.$year";
+ } else {
+ $this->dateOfBirth= "";
+ }
+
+ // Try to load the user picture
+ $tmp_dn = $this->dn;
+ $this->dn = $source['dn'];
+ $this->load_picture();
+ $this->dn = $tmp_dn;
}
function get_multi_edit_values()
{
$ret = plugin::get_multi_edit_values();
- if(in_array("pw_storage",$this->multi_boxes)){
+ if(in_array_strict("pw_storage",$this->multi_boxes)){
$ret['pw_storage'] = $this->pw_storage;
}
- if(in_array("edit_picture",$this->multi_boxes)){
+ if(in_array_strict("edit_picture",$this->multi_boxes)){
$ret['jpegPhoto'] = $this->jpegPhoto;
$ret['photoData'] = $this->photoData;
$ret['old_jpegPhoto'] = $this->old_jpegPhoto;
unset($ret['cn']);
}
$ret['is_modified'] = $this->is_modified;
- if(in_array("base",$this->multi_boxes)){
+ if(in_array_strict("base",$this->multi_boxes)){
$ret['orig_base']="Changed_by_Multi_Plug";
$ret['base']=$this->base;
}
function multiple_save_object()
{
+
+ if(!isset($_POST['user_mulitple_edit'])) return;
+
plugin::multiple_save_object();
/* Get pw_storage mode */
if($this->dn == "new") {
$this->set_acl_base($this->base);
}
- if (!tests::is_url($this->labeledURI) && in_array("labeledURI",$this->multi_boxes)){
+ if (!tests::is_url($this->labeledURI) && in_array_strict("labeledURI",$this->multi_boxes)){
$message[]= msgPool::invalid(_("Homepage"));
}
- if (!tests::is_phone_nr($this->telephoneNumber) && in_array("telephoneNumber",$this->multi_boxes)){
+ if (!tests::is_phone_nr($this->telephoneNumber) && in_array_strict("telephoneNumber",$this->multi_boxes)){
$message[]= msgPool::invalid(_("Phone"), $this->telephoneNumber, "/[\/0-9 ()+*-]/");
}
- if (!tests::is_phone_nr($this->facsimileTelephoneNumber) && in_array("facsimileTelephoneNumber",$this->multi_boxes)){
+ if (!tests::is_phone_nr($this->facsimileTelephoneNumber) && in_array_strict("facsimileTelephoneNumber",$this->multi_boxes)){
$message[]= msgPool::invalid(_("Fax"), $this->facsimileTelephoneNumber, "/[\/0-9 ()+*-]/");
}
- if (!tests::is_phone_nr($this->mobile) && in_array("mobile",$this->multi_boxes)){
+ if (!tests::is_phone_nr($this->mobile) && in_array_strict("mobile",$this->multi_boxes)){
$message[]= msgPool::invalid(_("Mobile"), $this->mobile, "/[\/0-9 ()+*-]/");
}
- if (!tests::is_phone_nr($this->pager) && in_array("pager",$this->multi_boxes)){
+ if (!tests::is_phone_nr($this->pager) && in_array_strict("pager",$this->multi_boxes)){
$message[]= msgPool::invalid(_("Pager"), $this->pager, "/[\/0-9 ()+*-]/");
}
- if (preg_match ('/[,+"?\'()=<>;\\\\]/', $this->givenName) && in_array("givenName",$this->multi_boxes)){
+ if (preg_match ('/[,+"?\'()=<>;\\\\]/', $this->givenName) && in_array_strict("givenName",$this->multi_boxes)){
$message[]= msgPool::invalid(_("Given name"), $this->giveName, '/[^,+"?\'()=<>;\\\\]/');
}
- if (preg_match ('/[,+"?\'()=<>;\\\\]/', $this->sn) && in_array("sn",$this->multi_boxes)){
+ if (preg_match ('/[,+"?\'()=<>;\\\\]/', $this->sn) && in_array_strict("sn",$this->multi_boxes)){
$message[]= msgPool::invalid(_("Name"), $this->sn, '/[^,+"?\'()=<>;\\\\]/');
}
return($message);
}
}
+ // Detect the managers name
+ $this->manager_name = "";
+ $ldap = $this->config->get_ldap_link();
+ if(!empty($this->manager)){
+ $ldap->cat($this->manager, array('cn'));
+ if($ldap->count()){
+ $attrs = $ldap->fetch();
+ $this->manager_name = $attrs['cn'][0];
+ }else{
+ $this->manager_name = "("._("Unknown")."!): ".$this->manager;
+ }
+ }
+
// Detect login restriction not used in all user objects.
$this->gosaLoginRestriction_some = array();
if(isset($all['gosaLoginRestriction'])){
// Update loginRestrictions, keep my settings while ip is optional
foreach($attrs['gosaLoginRestriction_some'] as $ip){
- if(in_array($ip, $this->gosaLoginRestriction) && in_array($ip, $attrs['gosaLoginRestriction'])){
+ if(in_array_strict($ip, $this->gosaLoginRestriction) && in_array_strict($ip, $attrs['gosaLoginRestriction'])){
$lR[] = $ip;
}
}
$data = array();
foreach($all as $ip){
$data['data'][] = $ip;
- if(!in_array($ip, $this->gosaLoginRestriction)){
+ if(!in_array_strict($ip, $this->gosaLoginRestriction)){
$data['displayData'][] = array('mode' => LIST_MARKED , 'data' => array($ip.' ('._("Entries differ").')'));
}else{
$data['displayData'][] = array('mode' => 0 , 'data' => array($ip));