From f0966d1c97855d4c279502c1451ec5b11dd24be6 Mon Sep 17 00:00:00 2001 From: Roland Gruber Date: Sat, 7 Nov 2015 15:43:43 +0000 Subject: [PATCH] support more attributes --- lam/lib/modules/windowsUser.inc | 125 ++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) diff --git a/lam/lib/modules/windowsUser.inc b/lam/lib/modules/windowsUser.inc index 42705907..80520ba5 100644 --- a/lam/lib/modules/windowsUser.inc +++ b/lam/lib/modules/windowsUser.inc @@ -335,6 +335,14 @@ class windowsUser extends baseModule implements passwordService { "Headline" => _("Manager"), 'attr' => 'manager', "Text" => _("This is the LDAP DN of the user's manager. Use this property to represent hierarchies in your company.") ), + 'crop' => array( + "Headline" => _('Image cropping'), + "Text" => _('Uploaded images will be cropped to these maximum values.') + ), + 'photoUpload' => array( + "Headline" => _("Add photo"), 'attr' => 'jpegPhoto', + "Text" => _("Please select an image file to upload. It must be in JPG format (.jpg/.jpeg).") + ), ); // upload fields $return['upload_columns'] = array( @@ -851,6 +859,10 @@ class windowsUser extends baseModule implements passwordService { $this->messages['employeeType'][1] = array('ERROR', _('Account %s:') . ' windowsUser_employeeType', _('Please enter a valid employee type!')); $this->messages['businessCategory'][0] = array('ERROR', _('Business category'), _('Please enter a valid business category!')); $this->messages['businessCategory'][1] = array('ERROR', _('Account %s:') . ' windowsUser_businessCategory', _('Please enter a valid business category!')); + $this->messages['file'][0] = array('ERROR', _('No file selected.')); + $this->messages['file'][1] = array('ERROR', _('Please upload a .jpg/.jpeg file.')); + $this->messages['file'][2] = array('ERROR', _('Unable to process this file.')); + $this->messages['file'][3] = array('ERROR', _('File is too large. Maximum allowed size is %s kB.')); } /** @@ -1034,6 +1046,33 @@ class windowsUser extends baseModule implements passwordService { $containerRight = new htmlTable(); $containerRight->alignment = htmlElement::ALIGN_TOP; + // photo + if (!$this->isBooleanConfigOptionSet('windowsUser_hidejpegPhoto', true)) { + $imageContainer = new htmlTable(); + $imageContainer->alignment = htmlElement::ALIGN_TOP; + $photoFile = '../../graphics/userDefault.png'; + $noPhoto = true; + if (isset($this->attributes['jpegPhoto'][0])) { + $jpeg_filename = 'jpg' . getRandomNumber() . '.jpg'; + $outjpeg = @fopen(dirname(__FILE__) . '/../../tmp/' . $jpeg_filename, "wb"); + fwrite($outjpeg, $this->attributes['jpegPhoto'][0]); + fclose ($outjpeg); + $photoFile = '../../tmp/' . $jpeg_filename; + $noPhoto = false; + } + $img = new htmlImage($photoFile); + $img->setCSSClasses(array('photo')); + $imageContainer->addElement($img, true); + if ($noPhoto) { + $imageContainer->addElement(new htmlAccountPageButton(get_class($this), 'photo', 'open', _('Add photo'))); + } + else { + $imageContainer->addElement(new htmlButton('delPhoto', _('Delete photo'))); + } + $containerRight->addElement($imageContainer, true); + $containerRight->addElement(new htmlSpacer(null, '20px'), true); + } + // groups $containerRight->addElement(new htmlSubTitle(_('Groups')), true); $containerRight->addElement(new htmlAccountPageButton(get_class($this), 'group', 'edit', _('Edit groups')), true); $containerRight->addElement(new htmlSpacer(null, '10px'), true); @@ -1460,6 +1499,79 @@ class windowsUser extends baseModule implements passwordService { return array(); } + /** + * Displays the photo upload page. + * + * @return array meta HTML code + */ + function display_html_photo() { + $container = new htmlTable(); + $label = _('Photo file (JPG format)'); + if (extension_loaded('imagick')) { + $label = _('Photo file'); + } + $container->addElement(new htmlTableExtendedInputFileUpload('photoFile', $label, 'photoUpload'), true); + $buttonContainer = new htmlTable(); + $buttonContainer->addElement(new htmlAccountPageButton(get_class($this), 'attributes', 'submit', _('Add photo'))); + $buttonContainer->addElement(new htmlAccountPageButton(get_class($this), 'attributes', 'back', _('Back'))); + $container->addElement($buttonContainer); + return $container; + } + + /** + * Sets a new photo. + */ + function process_photo() { + if (!isset($_POST['form_subpage_' . get_class($this) . '_attributes_submit'])) { + return array(); + } + $messages = array(); + if ($_FILES['photoFile'] && ($_FILES['photoFile']['size'] > 0)) { + $name = $_FILES['photoFile']['name']; + $extension = strtolower(substr($name, strpos($name, '.') + 1)); + if (!extension_loaded('imagick') && !($extension == 'jpg') && !($extension == 'jpeg')) { + $messages[] = $this->messages['file'][1]; + return $messages; + } + $handle = fopen($_FILES['photoFile']['tmp_name'], "r"); + $data = fread($handle, 10000000); + if (!empty($this->moduleSettings['windowsUser_jpegPhoto_maxSize'][0]) && (strlen($data) > (1024 * $this->moduleSettings['windowsUser_jpegPhoto_maxSize'][0]))) { + $errMsg = $this->messages['file'][3]; + $errMsg[] = null; + $errMsg[] = array($this->moduleSettings['windowsUser_jpegPhoto_maxSize'][0]); + return array($errMsg); + } + fclose($handle); + if (extension_loaded('imagick')) { + // convert to JPG if imagick extension is available + $image = new Imagick(); + try { + $image->readImageBlob($data); + // resize if maximum values specified + if (!empty($this->moduleSettings['windowsUser_jpegPhoto_maxWidth'][0]) || !empty($this->moduleSettings['windowsUser_jpegPhoto_maxHeight'][0])) { + $maxWidth = empty($this->moduleSettings['windowsUser_jpegPhoto_maxWidth'][0]) ? $image->getimagewidth() : $this->moduleSettings['windowsUser_jpegPhoto_maxWidth'][0]; + $maxHeight = empty($this->moduleSettings['windowsUser_jpegPhoto_maxHeight'][0]) ? $image->getimageheight() : $this->moduleSettings['windowsUser_jpegPhoto_maxHeight'][0]; + $image->thumbnailimage($maxWidth, $maxHeight, true); + } + $image->setImageCompression(Imagick::COMPRESSION_JPEG); + $image->setImageFormat('jpeg'); + $data = $image->getimageblob(); + } + catch (Exception $e) { + $msg = $this->messages['file'][2]; + $msg[] = htmlspecialchars($e->getMessage()); + $messages[] = $msg; + return $messages; + } + } + $this->attributes['jpegPhoto'][0] = $data; + } + else { + $messages[] = $this->messages['file'][0]; + } + return $messages; + } + /** * Runs the postmodify actions. * @@ -2689,6 +2801,19 @@ class windowsUser extends baseModule implements passwordService { $configContainerOptions->addElement(new htmlTableExtendedInputCheckbox('windowsUser_hideo', true, _('Organisation'), null, false)); $configContainerOptions->addElement(new htmlTableExtendedInputCheckbox('windowsUser_hidemanager', true, _('Manager'), null, false)); $configContainer->addElement($configContainerOptions, true); + $advancedOptions = new htmlTable(); + $advancedOptions->addElement(new htmlSubTitle(_('Photo')), true); + $photoTable = new htmlTable(); + $photoTable->colspan = 2; + if (extension_loaded('imagick')) { + $photoTable->addElement(new htmlTableExtendedInputField(_('Maximum width (px)'), 'windowsUser_jpegPhoto_maxWidth', null, 'crop'), true); + $photoTable->addElement(new htmlTableExtendedInputField(_('Maximum height (px)'), 'windowsUser_jpegPhoto_maxHeight', null, 'crop'), true); + } + $photoTable->addElement(new htmlTableExtendedInputField(_('Maximum file size (kB)'), 'windowsUser_jpegPhoto_maxSize'), true); + $advancedOptions->addElement($photoTable, true); + $advancedOptionsAccordion = new htmlAccordion('inetOrgPersonAdvancedOptions', array(_('Advanced options') => $advancedOptions), false); + $advancedOptionsAccordion->colspan = 5; + $configContainer->addElement($advancedOptionsAccordion); return $configContainer; }