getName(); } $dir = @dir(dirname(__FILE__) . "/../config/profiles/" . $profile); $ret = array(); if ($dir) { $entry = $dir->read(); while ($entry){ // check if filename ends with . if (strrpos($entry, '.')) { $pos = strrpos($entry, '.'); if (substr($entry, $pos + 1) == $typeId) { $name = substr($entry, 0, $pos); $ret[] = $name; } } $entry = $dir->read(); } } return $ret; } /** * Returns if the given profile exists. * * @param string name profile name * @param string $typeId type id * @return bool exists */ function profileExists($name, $typeId) { if (!isValidProfileName($name) || !preg_match("/^[a-z0-9_]+$/i", $typeId) || ($typeId == null)) { return false; } $file = substr(__FILE__, 0, strlen(__FILE__) - 17) . "/config/profiles/" . $_SESSION['config']->getName() . '/' . $name . "." . $typeId; return is_file($file); } /** * Loads an profile of the given account type * * @param string $profile name of the profile (without . extension) * @param string $typeId account type * @param string $serverProfileName server profile name * @return array hash array (attribute => value) */ function loadAccountProfile($profile, $typeId, $serverProfileName) { if (!isValidProfileName($profile) || !preg_match("/^[a-z0-9_]+$/i", $typeId)) { logNewMessage(LOG_NOTICE, "Invalid account profile name: $serverProfileName:$profile:$typeId"); return array(); } $file = substr(__FILE__, 0, strlen(__FILE__) - 17) . "/config/profiles/" . $serverProfileName . '/' . $profile . "." . $typeId; try { return readAccountProfileFile($file); } catch (LAMException $e) { StatusMessage('ERROR', $e->getTitle(), $e->getMessage()); } return array(); } /** * Reads an account profile from the given file name. * * @param string $fileName file name * @return array hash array (attribute => value) * @throws LAMException error reading file */ function readAccountProfileFile($fileName) { $settings = array(); if (is_file($fileName)) { $file = @fopen($fileName, "r"); if ($file) { while (!feof($file)) { $line = fgets($file, 1024); if (($line === false) || ($line == '') || ($line == "\n") || ($line[0] == "#")) { continue; // ignore comments } // search keywords $parts = explode(": ", $line); if (sizeof($parts) == 2) { $option = $parts[0]; $value = $parts[1]; // remove line ends $value = chop($value); $settings[$option] = explode("+::+", $value); } } fclose($file); return $settings; } else { throw new LAMException(_("Unable to load profile!"), $fileName); } } else { throw new LAMException(_("Unable to load profile!"), $fileName); } } /** * Saves an hash array (attribute => value) to an account profile * * file is created, if needed * * @param array $attributes hash array (attribute => value) * @param string $profile name of the account profile (without . extension) * @param string $typeId account type * @param \LAMConfig $serverProfile server profile * @return boolean true, if saving succeeded */ function saveAccountProfile($attributes, $profile, $typeId, $serverProfile) { // check profile name and type id $typeManager = new TypeManager($serverProfile); $type = $typeManager->getConfiguredType($typeId); if (!isValidProfileName($profile) || !preg_match("/^[a-z0-9_]+$/i", $typeId) || ($type == null)) { logNewMessage(LOG_NOTICE, 'Invalid account profile name: ' . $profile . ':' . $typeId); return false; } if (!is_array($attributes)) { logNewMessage(LOG_NOTICE, 'Invalid account profile data'); return false; } $path = substr(__FILE__, 0, strlen(__FILE__) - 17) . "/config/profiles/" . $serverProfile->getName() . '/' . $profile . "." . $typeId; return writeProfileDataToFile($path, $attributes); } /** * Writes the profile data to the given file. * * @param string $fileName file name * @param array $data profile data * @return bool writing was ok */ function writeProfileDataToFile($fileName, $data) { $file = @fopen($fileName, "w"); if ($file) { // write attributes $keys = array_keys($data); for ($i = 0; $i < sizeof($keys); $i++) { if (isset($data[$keys[$i]])) { $line = $keys[$i] . ": " . implode("+::+", $data[$keys[$i]]) . "\n"; } else { $line = $keys[$i] . ": \n"; } fputs($file, $line); } // close file fclose($file); } else { logNewMessage(LOG_NOTICE, 'Unable to open account profile file: ' . $fileName); return false; } return true; } /** * Deletes an account profile * * @param string $file name of profile (Without . extension) * @param string $typeId account type * @return boolean true if profile was deleted */ function delAccountProfile($file, $typeId) { if (!isLoggedIn()) { return false; } $typeManager = new TypeManager(); $type = $typeManager->getConfiguredType($typeId); if (!isValidProfileName($file) || !preg_match("/^[a-z0-9_]+$/i", $typeId) || ($type == null)) { return false; } $prof = substr(__FILE__, 0, strlen(__FILE__) - 16) . "config/profiles/". $_SESSION['config']->getName() . '/' . $file . "." . $typeId; if (is_file($prof)) { return @unlink($prof); } return false; } /** * Returns if the given profile name is valid. * * @param string $name profile name */ function isValidProfileName($name) { return preg_match("/^[0-9a-z _-]+$/i", $name); } /** * Copies an account profile from the given source to target. * * @param \LAM\TYPES\ConfiguredType $sourceType source type * @param string $sourceProfileName profile name * @param \LAM\TYPES\ConfiguredType $targetType target type * @throws LAMException error during copy */ function copyAccountProfile($sourceType, $sourceProfileName, $targetType) { if (!isValidProfileName($sourceProfileName)) { throw new LAMException(_('Failed to copy')); } $sourceConfig = $sourceType->getTypeManager()->getConfig()->getName(); $sourceTypeId = $sourceType->getId(); $targetConfig = $targetType->getTypeManager()->getConfig()->getName(); $targetTypeId = $targetType->getId(); $profilePath = dirname(__FILE__) . '/../config/profiles/'; $src = $profilePath . $sourceConfig . '/' . $sourceProfileName . '.' . $sourceTypeId; $dst = $profilePath . $targetConfig . '/' . $sourceProfileName . '.' . $targetTypeId; if (!@copy($src, $dst)) { throw new LAMException(_('Failed to copy'), $sourceConfig . ': ' . $sourceProfileName); } } /** * Copies an account profile from the given source to global templates. * * @param \LAM\TYPES\ConfiguredType $sourceType source type * @param string $sourceProfileName profile name * @throws LAMException error during copy */ function copyAccountProfileToTemplates($sourceType, $sourceProfileName) { if (!isValidProfileName($sourceProfileName)) { throw new LAMException(_('Failed to copy')); } $sourceConfig = $sourceType->getTypeManager()->getConfig()->getName(); $sourceTypeId = $sourceType->getId(); $profilePath = dirname(__FILE__) . '/../config/profiles/'; $templatePath = dirname(__FILE__) . '/../config/templates/profiles/'; $src = $profilePath . $sourceConfig . '/' . $sourceProfileName . '.' . $sourceTypeId; $dst = $templatePath . $sourceProfileName . '.' . $sourceType->getScope(); if (!@copy($src, $dst)) { throw new LAMException(_('Failed to copy'), $sourceConfig . ': ' . $sourceProfileName); } } /** * Installs template profiles to the current server profile. */ function installProfileTemplates() { $allTemplates = getProfileTemplateNames(); $basePath = dirname(__FILE__) . '/../config/profiles/' . $_SESSION['config']->getName(); if (!file_exists($basePath)) { mkdir($basePath, 0700, true); } $typeManager = new TypeManager(); foreach ($typeManager->getConfiguredTypes() as $type) { if (empty($allTemplates[$type->getScope()])) { continue; } foreach ($allTemplates[$type->getScope()] as $templateName) { $path = $basePath . '/' . $templateName . '.' . $type->getId(); if (!is_file($path)) { $template = getProfileTemplateFileName($type->getScope(), $templateName); logNewMessage(LOG_DEBUG, 'Copy template ' . $template . ' to ' . $path); @copy($template, $path); } } } } /** * Returns a list of all global profile templates. * * @return array names (array('user' => array('default', 'extra'))) */ function getProfileTemplateNames() { $templatePath = __DIR__ . '/../config/templates/profiles'; $templateDir = @dir($templatePath); $allTemplates = array(); if ($templateDir) { $entry = $templateDir->read(); while ($entry){ $parts = explode('.', $entry); if ((strlen($entry) > 3) && (sizeof($parts) == 2)) { $name = $parts[0]; $scope = $parts[1]; $allTemplates[$scope][] = $name; } $entry = $templateDir->read(); } } return $allTemplates; } /** * Returns the file name of a global template. * * @param string $scope e.g. user * @param string $name profile name * @return string file name */ function getProfileTemplateFileName($scope, $name) { return __DIR__ . '/../config/templates/profiles' . '/' . $name . '.' . $scope; } /** * Loads a template profile of the given account scope. * * @param string $profile name of the profile (without . extension) * @param string $scope account type * @return array hash array (attribute => value) * @throws LAMException error reading profile template */ function loadTemplateAccountProfile($profile, $scope) { if (!isValidProfileName($profile) || !preg_match("/^[a-z0-9_]+$/i", $scope)) { logNewMessage(LOG_NOTICE, "Invalid account profile name: $profile:$scope"); return array(); } $fileName = getProfileTemplateFileName($scope, $profile); return readAccountProfileFile($fileName); } /** * Installs a single template from the given data. * * @param string $scope account type (e.g. user) * @param string $name template name * @param array $data profile data * @throws LAMException error saving file */ function installTemplateAccountProfile($scope, $name, $data) { if (!isValidProfileName($name) || !preg_match("/^[a-z0-9_]+$/i", $scope)) { logNewMessage(LOG_NOTICE, "Invalid account profile name: $name:$scope"); return; } $fileName = getProfileTemplateFileName($scope, $name); $success = writeProfileDataToFile($fileName, $data); if (!$success) { throw new LAMException('Unable to write account profile template: ' . $fileName); } }