import main config
This commit is contained in:
parent
38293656b6
commit
00c5a014b4
|
@ -2705,7 +2705,7 @@ class LAMCfgMain {
|
||||||
logNewMessage(LOG_WARNING, 'Ignored setting during import: ' . $dataKey);
|
logNewMessage(LOG_WARNING, 'Ignored setting during import: ' . $dataKey);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!(is_array($dataValue) || is_string($dataValue) || is_int($dataValue) || is_bool($dataValue))) {
|
if (!(($dataValue === null) || is_array($dataValue) || is_string($dataValue) || is_int($dataValue) || is_bool($dataValue))) {
|
||||||
throw new LAMException('Invalid import data type for ' . htmlspecialchars($dataKey) . ': ' . gettype($dataValue));
|
throw new LAMException('Invalid import data type for ' . htmlspecialchars($dataKey) . ': ' . gettype($dataValue));
|
||||||
}
|
}
|
||||||
$this->$dataKey = $dataValue;
|
$this->$dataKey = $dataValue;
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
<?php
|
<?php
|
||||||
namespace LAM\PERSISTENCE;
|
namespace LAM\PERSISTENCE;
|
||||||
|
use LAMCfgMain;
|
||||||
|
use LAMException;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
|
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
|
||||||
|
@ -31,7 +34,7 @@ namespace LAM\PERSISTENCE;
|
||||||
include_once __DIR__ . '/config.inc';
|
include_once __DIR__ . '/config.inc';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exprter for LAM's configuration data.
|
* Exporter for LAM's configuration data.
|
||||||
*/
|
*/
|
||||||
class ConfigDataExporter {
|
class ConfigDataExporter {
|
||||||
|
|
||||||
|
@ -40,7 +43,7 @@ class ConfigDataExporter {
|
||||||
*/
|
*/
|
||||||
public function exportAsJson() {
|
public function exportAsJson() {
|
||||||
$jsonData = array();
|
$jsonData = array();
|
||||||
$jsonData['mainconfig'] = $this->_getMainConfigData();
|
$jsonData['mainConfig'] = $this->_getMainConfigData();
|
||||||
return json_encode($jsonData);
|
return json_encode($jsonData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,9 +53,137 @@ class ConfigDataExporter {
|
||||||
* @return array data
|
* @return array data
|
||||||
*/
|
*/
|
||||||
public function _getMainConfigData() {
|
public function _getMainConfigData() {
|
||||||
$mainCfg = new \LAMCfgMain();
|
$mainCfg = new LAMCfgMain();
|
||||||
return $mainCfg->exportData();
|
return $mainCfg->exportData();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Importer for LAM's configuration data.
|
||||||
|
*/
|
||||||
|
class ConfigDataImporter {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a list of possible import objects.
|
||||||
|
*
|
||||||
|
* @param string $json JSON data
|
||||||
|
* @return ImporterStep[] steps
|
||||||
|
* @throws LAMException if invalid format
|
||||||
|
*/
|
||||||
|
public function getPossibleImportSteps($json) {
|
||||||
|
$data = json_decode($json);
|
||||||
|
if ($data === null) {
|
||||||
|
throw new LAMException(_('Unable to read import file.'));
|
||||||
|
}
|
||||||
|
$steps = array();
|
||||||
|
foreach ($data as $key => $value) {
|
||||||
|
switch ($key) {
|
||||||
|
case 'mainConfig':
|
||||||
|
$steps[] = new ImporterStep(_('General settings'), 'mainConfig', $value);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
logNewMessage(LOG_WARNING, 'Unknown import type: ' . $key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (empty($steps)) {
|
||||||
|
throw new LAMException(_('Unable to read import file.'));
|
||||||
|
}
|
||||||
|
return $steps;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs the actual import.
|
||||||
|
*
|
||||||
|
* @param ImporterStep[] $steps import steps
|
||||||
|
* @throws LAMException if error occured
|
||||||
|
*/
|
||||||
|
public function runImport($steps) {
|
||||||
|
foreach ($steps as $step) {
|
||||||
|
if (!$step->isActive()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$key = $step->getKey();
|
||||||
|
switch ($key) {
|
||||||
|
case 'mainConfig':
|
||||||
|
$cfgMain = new LAMCfgMain();
|
||||||
|
$cfgMain->importData($step->getValue());
|
||||||
|
$cfgMain->save();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
logNewMessage(LOG_WARNING, 'Unknown import type: ' . $key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Step of the import process.
|
||||||
|
*/
|
||||||
|
class ImporterStep {
|
||||||
|
|
||||||
|
private $label;
|
||||||
|
private $key;
|
||||||
|
private $value;
|
||||||
|
private $active = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* @param string $label label
|
||||||
|
* @param string $key key
|
||||||
|
* @param array $value value
|
||||||
|
*/
|
||||||
|
public function __construct($label, $key, &$value) {
|
||||||
|
$this->label = $label;
|
||||||
|
$this->key = $key;
|
||||||
|
$this->value = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the label.
|
||||||
|
*
|
||||||
|
* @return string label
|
||||||
|
*/
|
||||||
|
public function getLabel() {
|
||||||
|
return $this->label;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the key.
|
||||||
|
*
|
||||||
|
* @return string key
|
||||||
|
*/
|
||||||
|
public function getKey() {
|
||||||
|
return $this->key;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns if this step should be executed.
|
||||||
|
*
|
||||||
|
* @return bool active
|
||||||
|
*/
|
||||||
|
public function isActive(): bool {
|
||||||
|
return $this->active;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets if this step should be executed.
|
||||||
|
*
|
||||||
|
* @param bool $active active
|
||||||
|
*/
|
||||||
|
public function setActive(bool $active) {
|
||||||
|
$this->active = $active;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the value.
|
||||||
|
*
|
||||||
|
* @return string value
|
||||||
|
*/
|
||||||
|
public function getValue() {
|
||||||
|
return $this->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -1,13 +1,18 @@
|
||||||
<?php
|
<?php
|
||||||
namespace LAM\CONFIG;
|
namespace LAM\CONFIG;
|
||||||
use htmlButton;
|
use htmlButton;
|
||||||
|
use htmlInputFileUpload;
|
||||||
|
use htmlLink;
|
||||||
use htmlOutputText;
|
use htmlOutputText;
|
||||||
|
use htmlResponsiveInputCheckbox;
|
||||||
use htmlResponsiveInputField;
|
use htmlResponsiveInputField;
|
||||||
use htmlResponsiveRow;
|
use htmlResponsiveRow;
|
||||||
use htmlStatusMessage;
|
use htmlStatusMessage;
|
||||||
use htmlSubTitle;
|
use htmlSubTitle;
|
||||||
use LAM\PERSISTENCE\ConfigDataExporter;
|
use LAM\PERSISTENCE\ConfigDataExporter;
|
||||||
|
use LAM\PERSISTENCE\ConfigDataImporter;
|
||||||
use LAMCfgMain;
|
use LAMCfgMain;
|
||||||
|
use LAMException;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
|
@ -86,7 +91,7 @@ printHeaderContents(_("Import and export configuration"), '../..');
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<form action="confImportExport.php" method="post" autocomplete="off">
|
<form action="confImportExport.php" method="post" autocomplete="off" enctype="multipart/form-data">
|
||||||
<br><br>
|
<br><br>
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
@ -120,6 +125,7 @@ printHeaderContents(_("Import and export configuration"), '../..');
|
||||||
}
|
}
|
||||||
$pwdInput = new htmlResponsiveInputField(_("Master password"), 'password', '', '236');
|
$pwdInput = new htmlResponsiveInputField(_("Master password"), 'password', '', '236');
|
||||||
$pwdInput->setIsPassword(true);
|
$pwdInput->setIsPassword(true);
|
||||||
|
$pwdInput->setCSSClasses(array('lam-initial-focus'));
|
||||||
$loginContent->add($pwdInput, 12);
|
$loginContent->add($pwdInput, 12);
|
||||||
$loginContent->addLabel(new htmlOutputText(' ', false));
|
$loginContent->addLabel(new htmlOutputText(' ', false));
|
||||||
$loginContent->addField(new htmlButton('submitLogin', _("Ok")));
|
$loginContent->addField(new htmlButton('submitLogin', _("Ok")));
|
||||||
|
@ -127,8 +133,21 @@ printHeaderContents(_("Import and export configuration"), '../..');
|
||||||
$content->add($loginContent, 12);
|
$content->add($loginContent, 12);
|
||||||
|
|
||||||
parseHtml(null, $content, array(), false, $tabindex, null);
|
parseHtml(null, $content, array(), false, $tabindex, null);
|
||||||
|
renderBackLink();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renders the link back to login page.
|
||||||
|
*/
|
||||||
|
function renderBackLink() {
|
||||||
|
$tabindex = 0;
|
||||||
|
$content = new htmlResponsiveRow();
|
||||||
|
$content->addVerticalSpacer('2rem');
|
||||||
|
$content->add(new htmlLink(_('Back to login'), '../login.php', '../../graphics/undo.png'), 12);
|
||||||
|
$content->addVerticalSpacer('1rem');
|
||||||
|
parseHtml(null, $content, array(), false, $tabindex, null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks the login password.
|
* Checks the login password.
|
||||||
*
|
*
|
||||||
|
@ -158,8 +177,73 @@ printHeaderContents(_("Import and export configuration"), '../..');
|
||||||
$content->add(new htmlButton('exportConfig', _('Export')), 12);
|
$content->add(new htmlButton('exportConfig', _('Export')), 12);
|
||||||
|
|
||||||
$content->add(new htmlSubTitle(_('Import')), 12);
|
$content->add(new htmlSubTitle(_('Import')), 12);
|
||||||
|
renderImportPart($content);
|
||||||
|
|
||||||
parseHtml(null, $content, array(), false, $tabindex, null);
|
parseHtml(null, $content, array(), false, $tabindex, null);
|
||||||
|
renderBackLink();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renders the import area.
|
||||||
|
*
|
||||||
|
* @param htmlResponsiveRow $content content where to add import part
|
||||||
|
*/
|
||||||
|
function renderImportPart($content) {
|
||||||
|
$fileContent = null;
|
||||||
|
$validUpload = false;
|
||||||
|
$importSteps = array();
|
||||||
|
if (isset($_POST['importConfig'])) {
|
||||||
|
$handle = fopen($_FILES['import-file']['tmp_name'], "r");
|
||||||
|
$data = fread($handle, 100000000);
|
||||||
|
fclose($handle);
|
||||||
|
try {
|
||||||
|
$importer = new ConfigDataImporter();
|
||||||
|
$importSteps = $importer->getPossibleImportSteps($data);
|
||||||
|
$tmpFile = __DIR__ . '/../../tmp/internal/import_' . getRandomNumber() . '.tmp';
|
||||||
|
$file = @fopen($tmpFile, "w");
|
||||||
|
if ($file) {
|
||||||
|
fputs($file, $data);
|
||||||
|
fclose($file);
|
||||||
|
chmod($tmpFile, 0600);
|
||||||
|
}
|
||||||
|
$_SESSION['configImportFile'] = $tmpFile;
|
||||||
|
$validUpload = true;
|
||||||
|
}
|
||||||
|
catch (LAMException $e) {
|
||||||
|
$content->add(new htmlStatusMessage('ERROR', $e->getTitle(), $e->getMessage()), 12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isset($_POST['importConfigConfirm']) && !$validUpload) {
|
||||||
|
$content->add(new htmlInputFileUpload('import-file'), 12);
|
||||||
|
$content->add(new htmlButton('importConfig', _('Submit')), 12);
|
||||||
|
}
|
||||||
|
elseif (isset($_POST['importConfig'])) {
|
||||||
|
$content->add(new htmlOutputText(_('Import steps')), 12);
|
||||||
|
foreach ($importSteps as $importStep) {
|
||||||
|
$content->add(new htmlResponsiveInputCheckbox('step_' . $importStep->getKey(), true, $importStep->getLabel()), 12);
|
||||||
|
}
|
||||||
|
$content->add(new htmlButton('importConfigConfirm', _('Import')), 12);
|
||||||
|
$content->add(new htmlButton('importCancel', _('Cancel')), 12);
|
||||||
|
}
|
||||||
|
elseif (isset($_POST['importConfigConfirm'])) {
|
||||||
|
$handle = fopen($_SESSION['configImportFile'], "r");
|
||||||
|
$data = fread($handle, 100000000);
|
||||||
|
fclose($handle);
|
||||||
|
try {
|
||||||
|
$importer = new ConfigDataImporter();
|
||||||
|
$importSteps = $importer->getPossibleImportSteps($data);
|
||||||
|
foreach ($importSteps as $importStep) {
|
||||||
|
$importStep->setActive(isset($_POST['step_' . $importStep->getKey()]));
|
||||||
|
}
|
||||||
|
$importer->runImport($importSteps);
|
||||||
|
unlink($_SESSION['configImportFile']);
|
||||||
|
$content->add(new htmlStatusMessage('INFO', _('Configuration import ended successful.')), 12);
|
||||||
|
}
|
||||||
|
catch (LAMException $e) {
|
||||||
|
$content->add(new htmlStatusMessage('ERROR', $e->getTitle(), $e->getMessage()), 12);
|
||||||
|
$content->add(new htmlButton('importCancel', _('Cancel')), 12);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
|
@ -146,6 +146,7 @@ class LAMCfgMainTest extends TestCase {
|
||||||
$importData['sessionTimeout'] = 240;
|
$importData['sessionTimeout'] = 240;
|
||||||
$importData['logLevel'] = LOG_ERR;
|
$importData['logLevel'] = LOG_ERR;
|
||||||
$importData['mailServer'] = 'mailserver';
|
$importData['mailServer'] = 'mailserver';
|
||||||
|
$importData['allowedHosts'] = null;
|
||||||
$importData['IGNORE_ME'] = 'ignore';
|
$importData['IGNORE_ME'] = 'ignore';
|
||||||
|
|
||||||
$this->conf->importData($importData);
|
$this->conf->importData($importData);
|
||||||
|
@ -154,6 +155,7 @@ class LAMCfgMainTest extends TestCase {
|
||||||
$this->assertEquals(240, $this->conf->sessionTimeout);
|
$this->assertEquals(240, $this->conf->sessionTimeout);
|
||||||
$this->assertEquals(LOG_ERR, $this->conf->logLevel);
|
$this->assertEquals(LOG_ERR, $this->conf->logLevel);
|
||||||
$this->assertEquals('mailserver', $this->conf->mailServer);
|
$this->assertEquals('mailserver', $this->conf->mailServer);
|
||||||
|
$this->assertNull($this->conf->allowedHosts);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -37,7 +37,7 @@ class ConfigDataExporterTest extends TestCase {
|
||||||
'confMainKey2' => 4,
|
'confMainKey2' => 4,
|
||||||
'confMainKey3' => '',
|
'confMainKey3' => '',
|
||||||
);
|
);
|
||||||
$expectedJson = json_encode(array('mainconfig' => $mainData));
|
$expectedJson = json_encode(array('mainConfig' => $mainData));
|
||||||
|
|
||||||
$exporter = $this->getMockBuilder('\LAM\PERSISTENCE\ConfigDataExporter')
|
$exporter = $this->getMockBuilder('\LAM\PERSISTENCE\ConfigDataExporter')
|
||||||
->setMethods(array('_getMainConfigData'))
|
->setMethods(array('_getMainConfigData'))
|
||||||
|
|
Loading…
Reference in New Issue