new type API

This commit is contained in:
Roland Gruber 2017-01-03 20:02:29 +01:00
parent e93d59740c
commit 22cfb56f60
5 changed files with 326 additions and 165 deletions

View File

@ -1461,4 +1461,31 @@ function validateReCAPTCHA($secretKey) {
return $responseJSON->{'success'} === true;
}
class LAMException extends Exception {
private $title;
/**
* Constructor.
*
* @param string $title title
* @param string $message message (optional)
* @param Exception $cause (optional)
*/
public function __construct($title, $message = null, $cause = null) {
parent::__construct($message, null, $cause);
$this->title = $title;
}
/**
* Returns the message title.
*
* @return string title
*/
public function getTitle() {
return $this->title;
}
}
?>

View File

@ -3,7 +3,7 @@
$Id$
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
Copyright (C) 2003 - 2006 Roland Gruber
Copyright (C) 2003 - 2016 Roland Gruber
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -32,26 +32,26 @@ $Id$
/**
* Returns an array of string with all available profiles for the given account type
*
* @param string $scope account type
* @param string $typeId account type
* @param string $profile server profile name
* @return array profile names
*/
function getAccountProfiles($scope, $profile = null) {
function getAccountProfiles($typeId, $profile = null) {
if (!isset($profile)) {
$profile = $_SESSION['config']->getName();
}
$dir = @dir(substr(__FILE__, 0, strlen(__FILE__) - 17) . "/config/profiles/" . $profile);
$dir = @dir(dirname(__FILE__) . "/../config/profiles/" . $profile);
$ret = array();
$pos = 0;
if ($dir) {
$entry = $dir->read();
while ($entry){
// check if filename ends with .<scope>
// check if filename ends with .<typeId>
if (strrpos($entry, '.')) {
$pos = strrpos($entry, '.');
if (substr($entry, $pos + 1) == $scope) {
if (substr($entry, $pos + 1) == $typeId) {
$name = substr($entry, 0, $pos);
$ret[] = $name;
}
@ -67,13 +67,17 @@ function getAccountProfiles($scope, $profile = null) {
* Loads an profile of the given account type
*
* @param string $profile name of the profile (without .<scope> extension)
* @param string $scope account type
* @param string $typeId account type
* @return array hash array (attribute => value)
*/
function loadAccountProfile($profile, $scope) {
if (!preg_match("/^[0-9a-z _-]+$/i", $profile) || !preg_match("/^[a-z]+$/i", $scope)) return false;
function loadAccountProfile($profile, $typeId) {
$typeManager = new \LAM\TYPES\TypeManager();
$type = $typeManager->getConfiguredType($typeId);
if (!isValidProfileName($profile) || !preg_match("/^[a-z0-9_]+$/i", $typeId) || ($type == null)) {
return false;
}
$settings = array();
$file = substr(__FILE__, 0, strlen(__FILE__) - 17) . "/config/profiles/" . $_SESSION['config']->getName() . '/' . $profile . "." . $scope;
$file = substr(__FILE__, 0, strlen(__FILE__) - 17) . "/config/profiles/" . $_SESSION['config']->getName() . '/' . $profile . "." . $typeId;
if (is_file($file) == True) {
$file = @fopen($file, "r");
if ($file) {
@ -111,17 +115,21 @@ function loadAccountProfile($profile, $scope) {
*
* @param array $attributes hash array (attribute => value)
* @param string $profile name of the account profile (without .<scope> extension)
* @param string $scope account type
* @param string $typeId account type
* @return boolean true, if saving succeeded
*/
function saveAccountProfile($attributes, $profile, $scope) {
function saveAccountProfile($attributes, $profile, $typeId) {
if (!isLoggedIn()) return false;
// check profile name
if (!preg_match("/^[0-9a-z _-]+$/i", $profile) || !preg_match("/^[a-z]+$/i", $scope)) return false;
// check profile name and type id
$typeManager = new \LAM\TYPES\TypeManager();
$type = $typeManager->getConfiguredType($typeId);
if (!isValidProfileName($profile) || !preg_match("/^[a-z0-9_]+$/i", $typeId) || ($type == null)) {
return false;
}
if (!is_array($attributes)) {
return false;
}
$path = substr(__FILE__, 0, strlen(__FILE__) - 17) . "/config/profiles/" . $_SESSION['config']->getName() . '/' . $profile . "." . $scope;
$path = substr(__FILE__, 0, strlen(__FILE__) - 17) . "/config/profiles/" . $_SESSION['config']->getName() . '/' . $profile . "." . $typeId;
$file = @fopen($path, "w");
if ($file) {
// write attributes
@ -148,59 +156,78 @@ function saveAccountProfile($attributes, $profile, $scope) {
* Deletes an account profile
*
* @param string $file name of profile (Without .<scope> extension)
* @param string $scope account type
* @param string $typeId account type
* @return boolean true if profile was deleted
*/
function delAccountProfile($file, $scope) {
if (!isLoggedIn()) return false;
if (!preg_match("/^[0-9a-z _-]+$/i", $file) || !preg_match("/^[a-z]+$/i", $scope)) return false;
$prof = substr(__FILE__, 0, strlen(__FILE__) - 16) . "config/profiles/". $_SESSION['config']->getName() . '/' . $file . "." . $scope;
function delAccountProfile($file, $typeId) {
if (!isLoggedIn()) {
return false;
}
$typeManager = new \LAM\TYPES\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);
}
else 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 account profiles to other server profiles.
* Copies an account profile from the given source to target.
*
* @param array $accountProfiles account profile names
* @param String $scope account scope
* @param array $dests destinations
*
* @return boolean operation succeeded
* @param \LAM\TYPES\ConfiguredType $sourceType source type
* @param string $sourceProfileName profile name
* @param \LAM\TYPES\ConfiguredType $targetType target type
* @throws Exception
*/
function copyAccountProfiles($accountProfiles, $scope, $dests = array()) {
$state = true;
$profilePath = substr(__FILE__, 0, strlen(__FILE__) - 17) . '/config/profiles/';
foreach ($accountProfiles as $profile) {
//part 1: server profile
//part 2: account profile
$tmpArr = explode('##', $profile);
$src = $profilePath . $tmpArr[0] . '/' . $tmpArr[1] . '.' . $scope;
if (!empty($dests)) {
foreach ($dests as $dest) {
if ($dest == 'templates*') {
$dst = substr(__FILE__, 0, strlen(__FILE__) - 17) . '/config/templates/profiles/' . $tmpArr[1] . '.' . $scope;
} else {
$dst = $profilePath . $dest . '/' . $tmpArr[1] . '.' . $scope;
}
if (!@copy($src, $dst)) {
StatusMessage('ERROR', _('Failed to export!'), $tmpArr[1] . '.' . $scope);
$state = false;
}
}
} else {
$dst = $profilePath . $_SESSION['config']->getName() . '/' . $tmpArr[1] . '.' . $scope;
if (!@copy($src, $dst)) {
StatusMessage('ERROR', _('Failed to import!'), $tmpArr[1] . '.' . $scope);
$state = false;
}
}
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);
}
}
return $state;
/**
* Copies an account profile from the given source to global templates.
*
* @param \LAM\TYPES\ConfiguredType $sourceType source type
* @param string $sourceProfileName profile name
* @throws Exception
*/
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);
}
}
?>

View File

@ -172,9 +172,12 @@ class ConfiguredType {
private $baseType;
private $typeManager;
/**
* Constructor
*
* @param TypeManager $typeManager type manager
* @param string $scope account type
* @param string $id unique ID for this configuration
* @param string $suffix LDAP base suffix
@ -183,8 +186,9 @@ class ConfiguredType {
* @param string $ldapFilter additional LDAP filter
* @param boolean $hidden hidden in GUI
*/
public function __construct($scope, $id, $suffix, $attributes, $alias,
public function __construct(&$typeManager, $scope, $id, $suffix, $attributes, $alias,
$ldapFilter, $hidden) {
$this->typeManager = &$typeManager;
$this->scope = $scope;
$this->id = $id;
$this->suffix = $suffix;
@ -194,10 +198,19 @@ class ConfiguredType {
$this->hidden = $hidden;
}
/**
* Returns the owning type manager.
*
* @return TypeManager type manager
*/
public function getTypeManager() {
return $this->typeManager;
}
/**
* Returns the account type (e.g. 'user').
*
* @return string $scope account type
* @return string account type
*/
public function getScope() {
return $this->scope;
@ -206,7 +219,7 @@ class ConfiguredType {
/**
* Returns a unique id for this configuration.
*
* @return string $id unique id
* @return string unique id
*/
public function getId() {
return $this->id;
@ -215,7 +228,7 @@ class ConfiguredType {
/**
* Returns the LDAP suffix.
*
* @return string $suffix LDAP suffix
* @return string LDAP suffix
*/
public function getSuffix() {
return $this->suffix;
@ -224,7 +237,7 @@ class ConfiguredType {
/**
* Returns a list of configured attributes.
*
* @return ListAttribute[] $attributes list of ListAttribute
* @return ListAttribute[] list of ListAttribute
*/
public function getAttributes() {
return $this->attributes;
@ -233,7 +246,7 @@ class ConfiguredType {
/**
* Returns the alias name.
*
* @return string $alias alias name
* @return string alias name
*/
public function getAlias() {
return $this->alias;
@ -242,7 +255,7 @@ class ConfiguredType {
/**
* Returns the additional LDAP filter.
*
* @return string $ldapFilter LDAP filter
* @return string LDAP filter
*/
public function getAdditionalLdapFilter() {
return $this->additionalLdapFilter;
@ -251,7 +264,7 @@ class ConfiguredType {
/**
* Returns if this configuration is hidden.
*
* @return boolean $hidden hidden
* @return boolean hidden
*/
public function isHidden() {
return $this->hidden;
@ -458,7 +471,7 @@ class TypeManager {
$alias = getTypeAlias($typeId, $this->config);
$ldapFilter = $this->config->get_Suffix($typeId);
$hidden = isAccountTypeHidden($typeId);
return new ConfiguredType($scope, $typeId, $suffix, $attributes, $alias, $ldapFilter, $hidden);
return new ConfiguredType($this, $scope, $typeId, $suffix, $attributes, $alias, $ldapFilter, $hidden);
}
/**
@ -495,6 +508,15 @@ class TypeManager {
return $scope . '_' . $counter;
}
/**
* Returns the associated config object.
*
* @return \LAMConfig config
*/
public function getConfig() {
return $this->config;
}
}
?>

View File

@ -422,33 +422,21 @@ function equalHeight(elementIDs) {
* @param title dialog title
* @param okText text for Ok button
* @param cancelText text for Cancel button
* @param scope account type
* @param typeId account type
* @param selectFieldName name of select box with profile name
* @param serverProfile profile name
*/
function showDistributionDialog(title, okText, cancelText, scope, type, selectFieldName, serverProfile) {
function showDistributionDialog(title, okText, cancelText, typeId, type, selectFieldName) {
// show dialog
var buttonList = {};
var dialogId = '';
if (type == 'export') {
// show structure name to export
jQuery('#exportName').text(jQuery('[name=' + selectFieldName + ']').val());
dialogId = 'exportDialog';
buttonList[okText] = function() { document.forms["exportDialogForm"].submit(); };
jQuery('<input>').attr({
type: 'hidden',
name: 'exportProfiles[]',
value: serverProfile + '##' + jQuery('[name=' + selectFieldName + ']').val()
}).appendTo('form');
jQuery('<input>').attr({
type: 'hidden',
name: 'scope',
value: scope
}).appendTo('form');
jQuery('#name_' + typeId).val(jQuery('#' + selectFieldName).val());
dialogId = 'exportDialog_' + typeId;
buttonList[okText] = function() { document.forms["exportDialogForm_" + typeId].submit(); };
} else if (type == 'import') {
dialogId = 'importDialog_' + scope;
buttonList[okText] = function() { document.forms["importDialogForm_" + scope].submit(); };
dialogId = 'importDialog_' + typeId;
buttonList[okText] = function() { document.forms["importDialogForm_" + typeId].submit(); };
}
buttonList[cancelText] = function() { jQuery(this).dialog("close"); };
@ -460,9 +448,9 @@ function showDistributionDialog(title, okText, cancelText, scope, type, selectFi
width: 'auto'
});
if (type == 'export') {
equalWidth(new Array('#passwd', '#destServerProfiles'));
equalWidth(new Array('#passwd_' + typeId, '#destServerProfiles_' + typeId));
} else if (type == 'import') {
equalWidth(new Array('#passwd_' + scope, '#importProfiles_' + scope));
equalWidth(new Array('#passwd_' + typeId, '#importProfiles'));
}
}

View File

@ -77,6 +77,7 @@ foreach ($types as $type) {
}
$profileClassesTemp[$type->getAlias()] = array(
'typeId' => $type->getId(),
'scope' => $type->getScope(),
'title' => $type->getAlias(),
'profiles' => "");
}
@ -134,30 +135,54 @@ if (isset($_POST['deleteProfile']) && ($_POST['deleteProfile'] == 'true')) {
}
}
// check if profiles should be imported or exported
if (isset($_POST['importexport']) && ($_POST['importexport'] === '1')) {
$configProfiles = getConfigProfiles();
$serverProfiles = array();
foreach ($configProfiles as $profileName) {
$serverProfiles[$profileName] = new \LAMConfig($profileName);
}
// import profiles
if (!empty($_POST['import'])) {
$cfg = new LAMCfgMain();
$impExpMessage = null;
if (isset($_POST['importProfiles_' . $_POST['typeId']])) {
// check master password
if (!$cfg->checkPassword($_POST['passwd_' . $_POST['typeId']])) {
$impExpMessage = new htmlStatusMessage('ERROR', _('Master password is wrong!'));
}
elseif (copyAccountProfiles($_POST['importProfiles_' . $_POST['typeId']], $_POST['typeId'])) {
$impExpMessage = new htmlStatusMessage('INFO', _('Import successful'));
}
} else if (isset($_POST['exportProfiles'])) {
// check master password
if (!$cfg->checkPassword($_POST['passwd'])) {
$impExpMessage = new htmlStatusMessage('ERROR', _('Master password is wrong!'));
}
elseif (copyAccountProfiles($_POST['exportProfiles'], $_POST['typeId'], $_POST['destServerProfiles'])) {
$impExpMessage = new htmlStatusMessage('INFO', _('Export successful'));
}
// check master password
$impMessage = null;
if (!$cfg->checkPassword($_POST['passwd_i_' . $_POST['typeId']])) {
$impMessage = new htmlStatusMessage('ERROR', _('Master password is wrong!'));
}
if ($impExpMessage != null) {
$impExpMessage->colspan = 10;
$container->addElement($impExpMessage, true);
elseif (!empty($_POST['importProfiles'])) {
$options = array();
foreach ($_POST['importProfiles'] as $importProfiles) {
$parts = explode('##', $importProfiles);
$options[] = array('conf' => $parts[0], 'typeId' => $parts[1], 'name' => $parts[2]);
}
$impMessage = importProfiles($_POST['typeId'], $options, $serverProfiles, $typeManager);
}
if ($impMessage != null) {
$impMessage->colspan = 10;
$container->addElement($impMessage, true);
}
}
// export profiles
if (!empty($_POST['export'])) {
$cfg = new LAMCfgMain();
// check master password
$impMessage = null;
if (!$cfg->checkPassword($_POST['passwd_e_' . $_POST['typeId']])) {
$impMessage = new htmlStatusMessage('ERROR', _('Master password is wrong!'));
}
elseif (!empty($_POST['exportProfiles'])) {
$options = array();
foreach ($_POST['exportProfiles'] as $importProfiles) {
$parts = explode('##', $importProfiles);
$options[] = array('conf' => $parts[0], 'typeId' => $parts[1]);
}
$typeId = $_POST['typeId'];
$name = $_POST['name_' . $typeId];
$impMessage = exportProfiles($typeId, $name, $options, $serverProfiles, $typeManager);
}
if ($impMessage != null) {
$impMessage->colspan = 10;
$container->addElement($impMessage, true);
}
}
@ -199,8 +224,6 @@ $container->addElement(new htmlSubTitle(_('Manage existing profiles')), true);
$existingContainer = new htmlTable();
$existingContainer->colspan = 5;
$configProfiles = getConfigProfiles();
for ($i = 0; $i < sizeof($profileClasses); $i++) {
if ($i > 0) {
$existingContainer->addElement(new htmlSpacer(null, '10px'), true);
@ -231,7 +254,7 @@ for ($i = 0; $i < sizeof($profileClasses); $i++) {
$exportLink = new htmlLink(null, '#', '../../graphics/export.png');
$exportLink->setTitle(_('Export profile'));
$exportLink->setOnClick("showDistributionDialog('" . _("Export profile") . "', '" .
_('Ok') . "', '" . _('Cancel') . "', '" . $profileClasses[$i]['typeId'] . "', 'export', '" . 'profile_' . $profileClasses[$i]['typeId'] . "', '" . $_SESSION['config']->getName() . "');");
_('Ok') . "', '" . _('Cancel') . "', '" . $profileClasses[$i]['typeId'] . "', 'export', '" . 'profile_' . $profileClasses[$i]['typeId'] . "');");
$existingContainer->addElement($exportLink);
$existingContainer->addNewLine();
}
@ -247,13 +270,18 @@ echo "</div>\n";
for ($i = 0; $i < sizeof($profileClasses); $i++) {
$typeId = $profileClasses[$i]['typeId'];
$tmpArr = array();
$scope = $profileClasses[$i]['scope'];
$importOptions = array();
foreach ($configProfiles as $profile) {
if ($profile != $_SESSION['config']->getName()) {
$accountProfiles = getAccountProfiles($typeId, $profile);
if (!empty($accountProfiles)) {
for ($p = 0; $p < sizeof($accountProfiles); $p++) {
$tmpArr[$profile][$accountProfiles[$p]] = $profile . '##' . $accountProfiles[$p];
$typeManagerImport = new \LAM\TYPES\TypeManager($serverProfiles[$profile]);
$typesImport = $typeManagerImport->getConfiguredTypesForScope($scope);
foreach ($typesImport as $typeImport) {
if (($profile != $_SESSION['config']->getName()) || ($typeImport->getId() != $typeId)) {
$accountProfiles = getAccountProfiles($typeImport->getId(), $profile);
if (!empty($accountProfiles)) {
for ($p = 0; $p < sizeof($accountProfiles); $p++) {
$importOptions[$profile][$typeImport->getAlias() . ': ' . $accountProfiles[$p]] = $profile . '##' . $typeImport->getId() . '##' . $accountProfiles[$p];
}
}
}
}
@ -266,7 +294,7 @@ for ($i = 0; $i < sizeof($profileClasses); $i++) {
$container = new htmlTable();
$container->addElement(new htmlOutputText(_('Profiles')), true);
$select = new htmlSelect('importProfiles_' . $typeId, $tmpArr, array(), count($tmpArr, 1) < 15 ? count($tmpArr, 1) : 15);
$select = new htmlSelect('importProfiles', $importOptions, array(), count($importOptions, 1) < 15 ? count($importOptions, 1) : 15);
$select->setMultiSelect(true);
$select->setHasDescriptiveElements(true);
$select->setContainsOptgroups(true);
@ -278,11 +306,11 @@ for ($i = 0; $i < sizeof($profileClasses); $i++) {
$container->addElement(new htmlSpacer(null, '10px'), true);
$container->addElement(new htmlOutputText(_("Master password")), true);
$exportPasswd = new htmlInputField('passwd_' . $typeId);
$exportPasswd = new htmlInputField('passwd_i_' . $typeId);
$exportPasswd->setIsPassword(true);
$container->addElement($exportPasswd);
$container->addElement(new htmlHelpLink('236'));
$container->addElement(new htmlHiddenInput('importexport', '1'));
$container->addElement(new htmlHiddenInput('import', '1'));
$container->addElement(new htmlHiddenInput('typeId', $typeId), true);
addSecurityTokenToMetaHTML($container);
@ -290,55 +318,53 @@ for ($i = 0; $i < sizeof($profileClasses); $i++) {
echo '</form>';
echo "</div>\n";
//export dialog
echo "<div id=\"exportDialog_$typeId\" class=\"hidden\">\n";
echo "<form id=\"exportDialogForm_$typeId\" method=\"post\" action=\"profilemain.php\">\n";
$container = new htmlTable();
$container->addElement(new htmlOutputText(_("Target server profile")), true);
$exportOptions = array();
foreach ($configProfiles as $profile) {
$typeManagerExport = new \LAM\TYPES\TypeManager($serverProfiles[$profile]);
$typesExport = $typeManagerExport->getConfiguredTypesForScope($scope);
foreach ($typesExport as $typeExport) {
if (($profile != $_SESSION['config']->getName()) || ($typeExport->getId() != $typeId)) {
$exportOptions[$typeManagerExport->getConfig()->getName()][$typeExport->getAlias()] = $profile . '##' . $typeExport->getId();
}
}
}
$exportOptions['*' . _('Global templates')][_('Global templates')] = 'templates*##';
$select = new htmlSelect('exportProfiles', $exportOptions, array(), count($exportOptions) < 10 ? count($exportOptions) : 10);
$select->setHasDescriptiveElements(true);
$select->setContainsOptgroups(true);
$select->setMultiSelect(true);
$container->addElement($select);
$container->addElement(new htmlHelpLink('363'), true);
$container->addElement(new htmlSpacer(null, '10px'), true);
$container->addElement(new htmlOutputText(_("Master password")), true);
$exportPasswd = new htmlInputField('passwd_e_' . $typeId);
$exportPasswd->setIsPassword(true);
$container->addElement($exportPasswd);
$container->addElement(new htmlHelpLink('236'));
$container->addElement(new htmlHiddenInput('export', '1'), true);
$container->addElement(new htmlHiddenInput('typeId', $typeId), true);
$container->addElement(new htmlHiddenInput('name_' . $typeId, '_'), true);
addSecurityTokenToMetaHTML($container);
parseHtml(null, $container, array(), false, $tabindex, 'user');
echo '</form>';
echo "</div>\n";
}
//export dialog
echo "<div id=\"exportDialog\" class=\"hidden\">\n";
echo "<form id=\"exportDialogForm\" method=\"post\" action=\"profilemain.php\">\n";
$container = new htmlTable();
$container->addElement(new htmlOutputText(_('Profile name')), true);
$expStructGroup = new htmlTable();
$expStructGroup->addElement(new htmlSpacer('10px', null));
$expStructGroup->addElement(new htmlDiv('exportName', ''));
$container->addElement($expStructGroup, true);
$container->addElement(new htmlSpacer(null, '10px'), true);
$container->addElement(new htmlOutputText(_("Target server profile")), true);
foreach ($configProfiles as $key => $value) {
$tmpProfiles[$value] = $value;
}
natcasesort($tmpProfiles);
$tmpProfiles['*' . _('Global templates')] = 'templates*';
$findProfile = array_search($_SESSION['config']->getName(), $tmpProfiles);
if ($findProfile !== false) {
unset($tmpProfiles[$findProfile]);
}
$select = new htmlSelect('destServerProfiles', $tmpProfiles, array(), count($tmpProfiles) < 10 ? count($tmpProfiles) : 10);
$select->setHasDescriptiveElements(true);
$select->setSortElements(false);
$select->setMultiSelect(true);
$container->addElement($select);
$container->addElement(new htmlHelpLink('363'), true);
$container->addElement(new htmlSpacer(null, '10px'), true);
$container->addElement(new htmlOutputText(_("Master password")), true);
$exportPasswd = new htmlInputField('passwd');
$exportPasswd->setIsPassword(true);
$container->addElement($exportPasswd);
$container->addElement(new htmlHelpLink('236'));
$container->addElement(new htmlHiddenInput('importexport', '1'), true);
addSecurityTokenToMetaHTML($container);
parseHtml(null, $container, array(), false, $tabindex, 'user');
echo '</form>';
echo "</div>\n";
// form for delete action
echo '<div id="deleteProfileDialog" class="hidden"><form id="deleteProfileForm" action="profilemain.php" method="post">';
echo _("Do you really want to delete this profile?");
@ -352,4 +378,75 @@ echo '</form></div>';
include '../main_footer.php';
/**
* Imports the selected account profiles.
*
* @param string $typeId type id
* @param array $options options
* @param \LAMConfig[] $serverProfiles server profiles (name => profile object)
* @param \LAM\TYPES\TypeManager $typeManager type manager
* @return \htmlStatusMessage message or null
*/
function importProfiles($typeId, $options, &$serverProfiles, &$typeManager) {
foreach ($options as $option) {
$sourceConfName = $option['conf'];
$sourceTypeId = $option['typeId'];
$sourceName = $option['name'];
$sourceTypeManager = new \LAM\TYPES\TypeManager($serverProfiles[$sourceConfName]);
$sourceType = $sourceTypeManager->getConfiguredType($sourceTypeId);
$targetType = $typeManager->getConfiguredType($typeId);
if (($sourceType != null) && ($targetType != null)) {
try {
\copyAccountProfile($sourceType, $sourceName, $targetType);
}
catch (\LAMException $e) {
return new \htmlStatusMessage('ERROR', $e->getTitle(), $e->getMessage());
}
}
}
return new \htmlStatusMessage('INFO', _('Import successful'));
}
/**
* Exports the selected account profile.
*
* @param string $typeId source type id
* @param string $name profile name
* @param array $options options
* @param \LAMConfig[] $serverProfiles server profiles (name => profile object)
* @param \LAM\TYPES\TypeManager $typeManager type manager
* @return \htmlStatusMessage message or null
*/
function exportProfiles($typeId, $name, $options, &$serverProfiles, &$typeManager) {
$sourceType = $typeManager->getConfiguredType($typeId);
if ($sourceType == null) {
return null;
}
foreach ($options as $option) {
$targetConfName = $option['conf'];
if ($targetConfName == 'templates*') {
try {
\copyAccountProfileToTemplates($sourceType, $name);
}
catch (\LAMException $e) {
return new \htmlStatusMessage('ERROR', $e->getTitle(), $e->getMessage());
}
}
else {
$targetTypeId = $option['typeId'];
$targetTypeManager = new \LAM\TYPES\TypeManager($serverProfiles[$targetConfName]);
$targetType = $targetTypeManager->getConfiguredType($targetTypeId);
if ($targetType != null) {
try {
\copyAccountProfile($sourceType, $name, $targetType);
}
catch (\LAMException $e) {
return new \htmlStatusMessage('ERROR', $e->getTitle(), $e->getMessage());
}
}
}
}
return new \htmlStatusMessage('INFO', _('Export successful'));
}
?>