mirror of
https://github.com/Icinga/icingaweb2.git
synced 2025-07-30 01:04:09 +02:00
Split up authentication form, logic connectivity check
refs #4606 refs #4622 refs #4602 refs #4546
This commit is contained in:
parent
c5dca9062b
commit
17e6402aa9
@ -33,10 +33,11 @@ use \Icinga\Web\Hook\Configuration\ConfigurationTabBuilder;
|
||||
use \Icinga\Application\Icinga;
|
||||
use \Icinga\Application\Config as IcingaConfig;
|
||||
use \Icinga\Form\Config\GeneralForm;
|
||||
use \Icinga\Form\Config\AuthenticationForm;
|
||||
use \Icinga\Form\Config\Authentication\ReorderForm;
|
||||
use \Icinga\Form\Config\Authentication\LdapBackendForm;
|
||||
use \Icinga\Form\Config\Authentication\DbBackendForm;
|
||||
use \Icinga\Form\Config\LoggingForm;
|
||||
use \Icinga\Form\Config\ConfirmRemovalForm;
|
||||
use \Icinga\Config\PreservingIniWriter;
|
||||
|
||||
/**
|
||||
@ -44,6 +45,7 @@ use \Icinga\Config\PreservingIniWriter;
|
||||
*/
|
||||
class ConfigController extends BaseConfigController
|
||||
{
|
||||
|
||||
/**
|
||||
* Create tabs for this configuration controller
|
||||
*
|
||||
@ -97,7 +99,7 @@ class ConfigController extends BaseConfigController
|
||||
$form->setRequest($this->_request);
|
||||
if ($form->isSubmittedAndValid()) {
|
||||
if (!$this->writeConfigFile($form->getConfig(), 'config')) {
|
||||
return false;
|
||||
return;
|
||||
}
|
||||
$this->redirectNow('/config');
|
||||
}
|
||||
@ -158,24 +160,69 @@ class ConfigController extends BaseConfigController
|
||||
/**
|
||||
* Action for creating a new authentication backend
|
||||
*/
|
||||
public function authenticationAction()
|
||||
public function authenticationAction($showOnly = false)
|
||||
{
|
||||
$form = new AuthenticationForm();
|
||||
$config = IcingaConfig::app('authentication');
|
||||
$form->setConfiguration($config);
|
||||
$form->setRequest($this->_request);
|
||||
$config = IcingaConfig::app('authentication', true);
|
||||
$order = array_keys($config->toArray());
|
||||
$this->view->backends = array();
|
||||
|
||||
foreach ($config as $backend=>$backendConfig) {
|
||||
$form = new ReorderForm();
|
||||
$form->setName('form_reorder_backend_' . $backend);
|
||||
$form->setAuthenticationBackend($backend);
|
||||
$form->setCurrentOrder($order);
|
||||
$form->setRequest($this->_request);
|
||||
|
||||
|
||||
if (!$showOnly && $form->isSubmittedAndValid()) {
|
||||
if ($this->writeAuthenticationFile($form->getReorderedConfig($config))) {
|
||||
$this->view->successMessage = 'Authentication Order Updated';
|
||||
$this->authenticationAction(true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
$this->view->backends[] = (object) array(
|
||||
'name' => $backend,
|
||||
'reorderForm' => $form
|
||||
);
|
||||
}
|
||||
$this->render('authentication');
|
||||
}
|
||||
|
||||
/**
|
||||
* Action for removing a backend from the authentication list.
|
||||
*
|
||||
* Redirects to the overview after removal is finished
|
||||
*/
|
||||
public function removeauthenticationbackendAction()
|
||||
{
|
||||
$configArray = IcingaConfig::app('authentication', true)->toArray();
|
||||
$authBackend = $this->getParam('auth_backend');
|
||||
if (!isset($configArray[$authBackend])) {
|
||||
$this->view->errorMessage = 'Can\'t perform removal: Unknown Authentication Backend Provided';
|
||||
$this->authenticationAction(true);
|
||||
return;
|
||||
}
|
||||
|
||||
$form = new ConfirmRemovalForm();
|
||||
$form->setRequest($this->getRequest());
|
||||
$form->setRemoveTarget('auth_backend', $authBackend);
|
||||
|
||||
|
||||
if ($form->isSubmittedAndValid()) {
|
||||
$modifiedConfig = $form->getConfig();
|
||||
if (empty($modifiedConfig)) {
|
||||
$form->addError('You need at least one authentication backend.');
|
||||
} else if (!$this->writeAuthenticationFile($modifiedConfig)) {
|
||||
return;
|
||||
} else {
|
||||
$this->redirectNow('/config/authentication');
|
||||
unset($configArray[$authBackend]);
|
||||
if ($this->writeAuthenticationFile($configArray)) {
|
||||
$this->view->successMessage = 'Authentication Backend "' . $authBackend . '" Removed';
|
||||
$this->authenticationAction(true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
$this->view->form = $form;
|
||||
|
||||
$this->view->name = $authBackend;
|
||||
$this->render('authentication/remove');
|
||||
}
|
||||
|
||||
/**
|
||||
@ -188,18 +235,78 @@ class ConfigController extends BaseConfigController
|
||||
} else {
|
||||
$form = new DbBackendForm();
|
||||
}
|
||||
if ($this->getParam('auth_backend')) {
|
||||
$form->setBackendName($this->getParam('auth_backend'));
|
||||
}
|
||||
$form->setRequest($this->getRequest());
|
||||
|
||||
if ($form->isSubmittedAndValid()) {
|
||||
$backendCfg = IcingaConfig::app('authentication')->toArray();
|
||||
foreach ($form->getConfig() as $backendName => $settings) {
|
||||
if (isset($backendCfg[$backendName])) {
|
||||
$this->view->errorMessage = 'Backend name already exists';
|
||||
$this->view->form = $form;
|
||||
$this->render('authentication/create');
|
||||
return;
|
||||
}
|
||||
$backendCfg[$backendName] = $settings;
|
||||
}
|
||||
if ($this->writeAuthenticationFile($backendCfg)) {
|
||||
// redirect to overview with success message
|
||||
$this->view->successMessage = 'Backend Modification Written';
|
||||
$this->authenticationAction(true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
$this->view->form = $form;
|
||||
$this->render('authentication/create');
|
||||
}
|
||||
|
||||
/**
|
||||
* Form for editing backends
|
||||
*
|
||||
* Mostly the same like the createAuthenticationBackendAction, but with additional checks for backend existence
|
||||
* and form population
|
||||
*/
|
||||
public function editauthenticationbackendAction()
|
||||
{
|
||||
$configArray = IcingaConfig::app('authentication', true)->toArray();
|
||||
$authBackend = $this->getParam('auth_backend');
|
||||
if (!isset($configArray[$authBackend])) {
|
||||
$this->view->errorMessage = 'Can\'t edit: Unknown Authentication Backend Provided';
|
||||
$this->authenticationAction(true);
|
||||
return;
|
||||
}
|
||||
|
||||
if ($configArray[$authBackend]['backend'] === 'ldap') {
|
||||
$form = new LdapBackendForm();
|
||||
} else {
|
||||
$form = new DbBackendForm();
|
||||
}
|
||||
|
||||
$form->setBackendName($this->getParam('auth_backend'));
|
||||
$form->setBackend(IcingaConfig::app('authentication', true)->$authBackend);
|
||||
$form->setRequest($this->getRequest());
|
||||
|
||||
if ($form->isSubmittedAndValid()) {
|
||||
$backendCfg = IcingaConfig::app('authentication')->toArray();
|
||||
foreach ($form->getConfig() as $backendName => $settings) {
|
||||
$backendCfg[$backendName] = $settings;
|
||||
// Remove the old section if the backend is renamed
|
||||
if ($backendName != $authBackend) {
|
||||
unset($backendCfg[$authBackend]);
|
||||
}
|
||||
}
|
||||
if (!$this->writeAuthenticationFile($backendCfg)) {
|
||||
return;
|
||||
if ($this->writeAuthenticationFile($backendCfg)) {
|
||||
// redirect to overview with success message
|
||||
$this->view->successMessage = 'Backend "' . $authBackend . '" created';
|
||||
$this->authenticationAction(true);
|
||||
}
|
||||
$this->redirectNow('/config/authentication');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
$this->view->name = $authBackend;
|
||||
$this->view->form = $form;
|
||||
$this->render('authentication/modify');
|
||||
}
|
||||
|
@ -129,6 +129,48 @@ abstract class BaseBackendForm extends Form
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a forcebox at the beginning of the form which allows to skip logic connection validation
|
||||
*
|
||||
*/
|
||||
private function addForceCreationCheckbox() {
|
||||
$checkbox = new \Zend_Form_Element_Checkbox(
|
||||
array(
|
||||
'name' => 'backend_force_creation',
|
||||
'label' => 'Force Changes',
|
||||
'helptext' => 'Check this box to enforce changes without connectivity validation',
|
||||
'order' => 0
|
||||
)
|
||||
);
|
||||
$checkbox->addDecorator(new HelpText());
|
||||
$this->addElement($checkbox);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate this form with the Zend validation mechanismn and perform a logic validation of the connection.
|
||||
*
|
||||
* If logic validation fails, the 'backend_force_creation' checkbox is prepended to the form to allow users to
|
||||
* skip the logic connection validation.
|
||||
*
|
||||
* @param array $data The form input to validate
|
||||
*
|
||||
* @return bool True when validation succeeded, false if not
|
||||
*/
|
||||
public function isValid($data)
|
||||
{
|
||||
if (!parent::isValid($data)) {
|
||||
return false;
|
||||
}
|
||||
if ($this->getRequest()->getPost('backend_force_creation')) {
|
||||
return true;
|
||||
}
|
||||
if(!$this->validateAuthenticationBackend()) {
|
||||
$this->addForceCreationCheckbox();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an array containing all sections defined by this form as the key and all settings
|
||||
* as an key-value sub-array
|
||||
@ -136,4 +178,14 @@ abstract class BaseBackendForm extends Form
|
||||
* @return array
|
||||
*/
|
||||
abstract public function getConfig();
|
||||
|
||||
/**
|
||||
* Validate the configuration state of this backend with the concrete authentication backend.
|
||||
*
|
||||
* An implementation should not throw any exception, but use the add/setErrorMessages method of
|
||||
* Zend_Form. If the 'backend_force_creation' checkbox is set, this method won't be called.
|
||||
*
|
||||
* @return bool True when validation succeeded, otherwise false
|
||||
*/
|
||||
abstract public function validateAuthenticationBackend();
|
||||
}
|
||||
|
@ -29,6 +29,7 @@
|
||||
|
||||
namespace Icinga\Form\Config\Authentication;
|
||||
|
||||
use Icinga\Authentication\Backend\DbUserBackend;
|
||||
use \Zend_Config;
|
||||
use \Icinga\Application\Config as IcingaConfig;
|
||||
use \Icinga\Application\Icinga;
|
||||
@ -118,4 +119,9 @@ class DbBackendForm extends BaseBackendForm
|
||||
$section => $cfg
|
||||
);
|
||||
}
|
||||
|
||||
public function validateAuthenticationBackend()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -28,10 +28,13 @@
|
||||
|
||||
namespace Icinga\Form\Config\Authentication;
|
||||
|
||||
use \Icinga\Authentication\Backend\LdapUserBackend;
|
||||
use \Exception;
|
||||
use \Zend_Config;
|
||||
use \Icinga\Application\Config as IcingaConfig;
|
||||
use \Icinga\Application\Icinga;
|
||||
use \Icinga\Application\Logger;
|
||||
use \Icinga\Web\Form\Decorator\HelpText;
|
||||
use \Icinga\Application\DbAdapterFactory;
|
||||
use \Icinga\Web\Form;
|
||||
|
||||
@ -133,6 +136,7 @@ class LdapBackendForm extends BaseBackendForm
|
||||
$this->setSubmitLabel('{{SAVE_ICON}} Save Backend');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the ldap authentication backend configuration for this form
|
||||
*
|
||||
@ -160,4 +164,28 @@ class LdapBackendForm extends BaseBackendForm
|
||||
$section => $cfg
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function validateAuthenticationBackend()
|
||||
{
|
||||
try {
|
||||
$cfg = $this->getConfig();
|
||||
$testConn = new LdapUserBackend(
|
||||
new Zend_Config($cfg[$this->getValue('backend_' . $this->filterName($this->getBackendName()) . '_name')])
|
||||
);
|
||||
|
||||
if ($testConn->getUserCount() === 0) {
|
||||
throw new Exception('No Users Found On Directory Server');
|
||||
}
|
||||
} catch(Exception $exc) {
|
||||
|
||||
$this->addErrorMessage(
|
||||
'Connection Validation Failed:'.
|
||||
$exc->getMessage()
|
||||
);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
266
application/forms/Config/Authentication/ReorderForm.php
Normal file
266
application/forms/Config/Authentication/ReorderForm.php
Normal file
@ -0,0 +1,266 @@
|
||||
<?php
|
||||
// {{{ICINGA_LICENSE_HEADER}}}
|
||||
/**
|
||||
* This file is part of Icinga 2 Web.
|
||||
*
|
||||
* Icinga 2 Web - Head for multiple monitoring backends.
|
||||
* Copyright (C) 2013 Icinga Development Team
|
||||
*
|
||||
* 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 the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* @copyright 2013 Icinga Development Team <info@icinga.org>
|
||||
* @license http://www.gnu.org/licenses/gpl-2.0.txt GPL, version 2
|
||||
* @author Icinga Development Team <info@icinga.org>
|
||||
*/
|
||||
// {{{ICINGA_LICENSE_HEADER}}}
|
||||
|
||||
namespace Icinga\Form\Config\Authentication;
|
||||
|
||||
use \Zend_Config;
|
||||
use \Icinga\Application\Config as IcingaConfig;
|
||||
use \Icinga\Application\Icinga;
|
||||
use \Icinga\Application\Logger;
|
||||
use \Icinga\Application\DbAdapterFactory;
|
||||
use \Icinga\Web\Form;
|
||||
use \Icinga\Web\Url;
|
||||
|
||||
/**
|
||||
* Form for modifying the authentication provider order.
|
||||
*
|
||||
*/
|
||||
class ReorderForm extends Form
|
||||
{
|
||||
/**
|
||||
* The name of the current backend which will get action buttons for up and down movement
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $backend = null;
|
||||
|
||||
/**
|
||||
* The current ordering of all backends, required to determine possible changes
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $currentOrder = array();
|
||||
|
||||
/**
|
||||
* Set an array with the current order of all backends
|
||||
*
|
||||
* @param array $order An array containing backend names in the order they are defined in the authentication.ini
|
||||
*/
|
||||
public function setCurrentOrder(array $order)
|
||||
{
|
||||
$this->currentOrder = $order;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the name of the authentication backend for which to create the form
|
||||
*
|
||||
* @param string $backend The name of the authentication backend
|
||||
*/
|
||||
public function setAuthenticationBackend($backend)
|
||||
{
|
||||
$this->backend = $backend;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the name of the currently set backend as it will appear in the forms
|
||||
*
|
||||
* This calls the Zend Filtername function in order to filter specific chars
|
||||
*
|
||||
* @return string The filtered name of the backend
|
||||
* @see Form::filterName()
|
||||
*/
|
||||
public function getBackendName()
|
||||
{
|
||||
return $this->filterName($this->backend);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create this form.
|
||||
*
|
||||
* Note: The form action will be set here to the authentication overview
|
||||
*
|
||||
* @see Form::create
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
$this->upForm = new Form();
|
||||
$this->downForm = new Form();
|
||||
|
||||
if ($this->moveElementUp($this->backend, $this->currentOrder) !== $this->currentOrder) {
|
||||
|
||||
$this->upForm->addElement(
|
||||
'hidden',
|
||||
'form_backend_order',
|
||||
array(
|
||||
'required' => true,
|
||||
'value' => join(',', $this->moveElementUp($this->backend, $this->currentOrder))
|
||||
)
|
||||
);
|
||||
$this->upForm->addElement(
|
||||
'submit',
|
||||
'btn_' . $this->getBackendName() . '_reorder_up',
|
||||
array(
|
||||
'name' => 'btn_' . $this->getBackendName() . '_reorder_up',
|
||||
'label' => '{{ICON_UP}} Move up in authentication order',
|
||||
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
if ($this->moveElementDown($this->backend, $this->currentOrder) !== $this->currentOrder) {
|
||||
$this->downForm->addElement(
|
||||
'hidden',
|
||||
'form_backend_order',
|
||||
array(
|
||||
'required' => true,
|
||||
'value' => join(',', $this->moveElementDown($this->backend, $this->currentOrder))
|
||||
)
|
||||
);
|
||||
$this->downForm->addElement(
|
||||
'submit',
|
||||
'btn_' . $this->getBackendName() . '_reorder_down',
|
||||
array(
|
||||
'name' => 'btn_' . $this->getBackendName() . '_reorder_down',
|
||||
'label' => '{{ICON_UP}} Move down in authentication order',
|
||||
|
||||
)
|
||||
);
|
||||
}
|
||||
$this->setAction(Url::fromPath("config/authentication",array())->getAbsoluteUrl());
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the result of $this->getValues but flatten the result
|
||||
*
|
||||
* The result will be a key=>value array without subarrays
|
||||
*
|
||||
* @param bool $supressArrayNotation passed to getValues
|
||||
*
|
||||
* @return array The currently set values
|
||||
* @see Form::getValues()
|
||||
*/
|
||||
public function getFlattenedValues($supressArrayNotation = false)
|
||||
{
|
||||
$values = parent::getValues($supressArrayNotation);
|
||||
$result = array();
|
||||
foreach ($values as $key => &$value) {
|
||||
if (is_array($value)) {
|
||||
$result += $value;
|
||||
} else {
|
||||
$result[$key] = $value;
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether this form is submitted by testing the submit buttons of both subforms
|
||||
*
|
||||
* @return bool True when the form is submitted, otherwise false
|
||||
*/
|
||||
public function isSubmitted()
|
||||
{
|
||||
$checkData = $this->getRequest()->getParams();
|
||||
return isset ($checkData['btn_' . $this->getBackendName() . '_reorder_up']) ||
|
||||
isset ($checkData['btn_' . $this->getBackendName() . '_reorder_down']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the reordered configuration after a reorder button has been submited
|
||||
*
|
||||
* @param Zend_Config $config The configuration to reorder
|
||||
*
|
||||
* @return array An array containing the reordered configuration
|
||||
*/
|
||||
public function getReorderedConfig(Zend_Config $config)
|
||||
{
|
||||
$originalConfig = $config->toArray();
|
||||
$reordered = array();
|
||||
$newOrder = $this->getFlattenedValues();
|
||||
$order = explode(',', $newOrder['form_backend_order']);
|
||||
foreach ($order as $key) {
|
||||
if (!isset($originalConfig[$key])) {
|
||||
continue;
|
||||
}
|
||||
$reordered[$key] = $originalConfig[$key];
|
||||
}
|
||||
|
||||
return $reordered;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Static helper for moving an element in an array one slot up, if possible
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* <pre>
|
||||
* $array = array('first', 'second', 'third');
|
||||
* moveElementUp('third', $array); // returns ['first', 'third', 'second']
|
||||
* </pre>
|
||||
*
|
||||
* @param string $key The key to bubble up one slot
|
||||
* @param array $array The array to work with
|
||||
*
|
||||
* @return array The modified array
|
||||
*/
|
||||
private static function moveElementUp($key, array $array)
|
||||
{
|
||||
$swap = null;
|
||||
for ($i=0; $i<count($array)-1; $i++) {
|
||||
if ($array[$i+1] !== $key) {
|
||||
continue;
|
||||
}
|
||||
$swap = $array[$i];
|
||||
$array[$i] = $array[$i+1];
|
||||
$array[$i+1] = $swap;
|
||||
return $array;
|
||||
}
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* Static helper for moving an element in an array one slot up, if possible
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* <pre>
|
||||
* $array = array('first', 'second', 'third');
|
||||
* moveElementDown('first', $array); // returns ['second', 'first', 'third']
|
||||
* </pre>
|
||||
*
|
||||
* @param string $key The key to bubble up one slot
|
||||
* @param array $array The array to work with
|
||||
*
|
||||
* @return array The modified array
|
||||
*/
|
||||
private static function moveElementDown($key, array $array)
|
||||
{
|
||||
$swap = null;
|
||||
for ($i=0; $i<count($array)-1; $i++) {
|
||||
if ($array[$i] !== $key) {
|
||||
continue;
|
||||
}
|
||||
$swap = $array[$i+1];
|
||||
$array[$i+1] = $array[$i];
|
||||
$array[$i] = $swap;
|
||||
return $array;
|
||||
}
|
||||
return $array;
|
||||
}
|
||||
}
|
@ -1,385 +0,0 @@
|
||||
<?php
|
||||
// {{{ICINGA_LICENSE_HEADER}}}
|
||||
/**
|
||||
* This file is part of Icinga 2 Web.
|
||||
*
|
||||
* Icinga 2 Web - Head for multiple monitoring backends.
|
||||
* Copyright (C) 2013 Icinga Development Team
|
||||
*
|
||||
* 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 the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* @copyright 2013 Icinga Development Team <info@icinga.org>
|
||||
* @license http://www.gnu.org/licenses/gpl-2.0.txt GPL, version 2
|
||||
* @author Icinga Development Team <info@icinga.org>
|
||||
*/
|
||||
// {{{ICINGA_LICENSE_HEADER}}}
|
||||
|
||||
namespace Icinga\Form\Config;
|
||||
|
||||
use \Zend_Config;
|
||||
use \Icinga\Application\Config as IcingaConfig;
|
||||
use \Icinga\Application\Logger;
|
||||
use \Icinga\Web\Form;
|
||||
use \Icinga\Web\Form\Decorator\ConditionalHidden;
|
||||
|
||||
/**
|
||||
* Form for modifying the authentication provider and order.
|
||||
*
|
||||
* This is a composite form from one or more forms under the Authentication folder
|
||||
*/
|
||||
class AuthenticationForm extends Form
|
||||
{
|
||||
/**
|
||||
* The configuration to use for populating this form
|
||||
*
|
||||
* @var IcingaConfig
|
||||
*/
|
||||
private $config = null;
|
||||
|
||||
/**
|
||||
* The resources to use instead of the factory provided ones (use for testing)
|
||||
*
|
||||
* @var null
|
||||
*/
|
||||
private $resources = null;
|
||||
|
||||
/**
|
||||
* An array containing all provider subforms currently displayed
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $backendForms = array();
|
||||
|
||||
|
||||
/**
|
||||
* Set an alternative array of resources that should be used instead of the DBFactory resource set
|
||||
* (used for testing)
|
||||
*
|
||||
* @param array $resources The resources to use for populating the db selection field
|
||||
*/
|
||||
public function setResources(array $resources)
|
||||
{
|
||||
$this->resources = $resources;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the configuration to be used for this form
|
||||
*
|
||||
* @param IcingaConfig $cfg
|
||||
*/
|
||||
public function setConfiguration($cfg)
|
||||
{
|
||||
$this->config = $cfg;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a hint to remove the backend identified by $name
|
||||
*
|
||||
* The button will have the name "backend_$name_remove"
|
||||
*
|
||||
* @param string $name The backend to add this button for
|
||||
*
|
||||
* @return string The id of the added button
|
||||
*/
|
||||
private function addRemoveHint($name)
|
||||
{
|
||||
$this->addElement(
|
||||
'checkbox',
|
||||
'backend_' . $name . '_remove',
|
||||
array(
|
||||
'name' => 'backend_' . $name . '_remove',
|
||||
'label' => 'Remove this authentication provider',
|
||||
'value' => $name,
|
||||
'checked' => $this->isMarkedForDeletion($name)
|
||||
)
|
||||
);
|
||||
$this->enableAutoSubmit(array('backend_' . $name . '_remove'));
|
||||
return 'backend_' . $name . '_remove';
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the form for the provider identified by $name, with the configuration $backend
|
||||
*
|
||||
* Supported backends are backends with a form found under \Icinga\Form\Config\Authentication.
|
||||
* The backend name ist the (uppercase first) prefix with 'BackendForm' as the suffix.
|
||||
*
|
||||
* Originally it was intended to add the provider as a subform. As this didn't really work with
|
||||
* the Zend validation logic (maybe our own validation logic breaks it), we now create the form, but add
|
||||
* all elements to this form explicitly.
|
||||
*
|
||||
* @param string $name The name of the backend to add
|
||||
* @param Zend_Config $backend The configuration of the backend
|
||||
*/
|
||||
private function addProviderForm($name, $backend)
|
||||
{
|
||||
$type = ucfirst(strtolower($backend->get('backend')));
|
||||
$formClass = '\Icinga\Form\Config\Authentication\\' . $type . 'BackendForm';
|
||||
if (!class_exists($formClass)) {
|
||||
Logger::error('Unsupported backend found in authentication configuration: ' . $backend->get('backend'));
|
||||
return;
|
||||
}
|
||||
|
||||
$form = new $formClass();
|
||||
$form->setBackendName($name);
|
||||
$form->setBackend($backend);
|
||||
|
||||
if ($this->resources) {
|
||||
$form->setResources($this->resources);
|
||||
}
|
||||
|
||||
// It would be nice to directly set the form via
|
||||
// this->setForm, but Zend doesn't handle form validation
|
||||
// properly if doing so.
|
||||
$form->create();
|
||||
foreach ($form->getElements() as $elName => $element) {
|
||||
if ($elName === 'backend_' . $this->filterName($name) . '_name') {
|
||||
continue;
|
||||
}
|
||||
$this->addElement($element, $elName);
|
||||
}
|
||||
$this->backendForms[] = $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the buttons for modifying authentication priorities
|
||||
*
|
||||
* @param string $name The name of the backend to add the buttons for
|
||||
* @param array $order The current order which will be used to determine the changed order
|
||||
*
|
||||
* @return array An array containing the newly added form element ids as strings
|
||||
*/
|
||||
public function addPriorityButtons($name, $order = array())
|
||||
{
|
||||
$formEls = array();
|
||||
$priorities = array(
|
||||
'up' => join(',', self::moveElementUp($name, $order)),
|
||||
'down' => join(',', self::moveElementDown($name, $order))
|
||||
);
|
||||
if ($priorities['up'] != join(',', $order)) {
|
||||
$this->addElement(
|
||||
'button',
|
||||
'priority' . $name . '_up',
|
||||
array(
|
||||
'name' => 'priority',
|
||||
'label' => 'Move up in authentication order',
|
||||
'value' => $priorities['up'],
|
||||
'type' => 'submit'
|
||||
)
|
||||
);
|
||||
$formEls[] = 'priority' . $name . '_up';
|
||||
}
|
||||
if ($priorities['down'] != join(',', $order)) {
|
||||
$this->addElement(
|
||||
'button',
|
||||
'priority' . $name . '_down',
|
||||
array(
|
||||
'name' => 'priority',
|
||||
'label' => 'Move down in authentication order',
|
||||
'value' => $priorities['down'],
|
||||
'type' => 'submit'
|
||||
)
|
||||
);
|
||||
$formEls[] = 'priority' . $name . '_down';
|
||||
}
|
||||
|
||||
return $formEls;
|
||||
}
|
||||
|
||||
/**
|
||||
* Overwrite for Zend_Form::populate in order to preserve the modified priority of the backends
|
||||
*
|
||||
* @param array $values The values to populate the form with
|
||||
*
|
||||
* @return self
|
||||
*
|
||||
* @see Zend_Form::populate()
|
||||
*/
|
||||
public function populate(array $values)
|
||||
{
|
||||
$last_priority = $this->getValue('current_priority');
|
||||
parent::populate($values);
|
||||
$this->getElement('current_priority')->setValue($last_priority);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an array containing all authentication providers in the order they should be used
|
||||
*
|
||||
* @return array An array containing the identifiers (section names) of the authentication backend in
|
||||
* the order they should be persisted
|
||||
*/
|
||||
private function getAuthenticationOrder()
|
||||
{
|
||||
$request = $this->getRequest();
|
||||
$order = $request->getParam(
|
||||
'priority',
|
||||
$request->getParam('current_priority', null)
|
||||
);
|
||||
|
||||
if ($order === null) {
|
||||
$order = array_keys($this->config->toArray());
|
||||
} else {
|
||||
$order = explode(',', $order);
|
||||
}
|
||||
|
||||
return $order;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return true if the backend should be deleted when the changes are persisted
|
||||
*
|
||||
* @param string $backendName The name of the backend to check for being in a 'delete' state
|
||||
*
|
||||
* @return bool Whether this backend will be deleted on save
|
||||
*/
|
||||
private function isMarkedForDeletion($backendName)
|
||||
{
|
||||
return intval($this->getRequest()->getParam('backend_' . $backendName . '_remove', 0)) === 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add persistent values to the form in hidden fields
|
||||
*
|
||||
* Currently this adds the 'current_priority' field to persist priority modifications. This prevents changes in the
|
||||
* authentication order to be lost as soon as other changes are submitted (like marking a backend for deletion)
|
||||
*/
|
||||
private function addPersistentState()
|
||||
{
|
||||
$this->addElement(
|
||||
'hidden',
|
||||
'current_priority',
|
||||
array(
|
||||
'name' => 'current_priority',
|
||||
'value' => join(',', $this->getAuthenticationOrder())
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the authentication provider configuration form
|
||||
*
|
||||
* @see IcingaForm::create()
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
$order = $this->getAuthenticationOrder();
|
||||
|
||||
foreach ($order as $name) {
|
||||
$this->addNote('Backend ' . $name, 4);
|
||||
$this->addRemoveHint($this->filterName($name));
|
||||
$backend = $this->config->get($name, null);
|
||||
if ($backend === null) {
|
||||
continue;
|
||||
}
|
||||
if (!$this->isMarkedForDeletion($this->filterName($name))) {
|
||||
$this->addProviderForm($name, $backend);
|
||||
$this->addPriorityButtons($name, $order);
|
||||
}
|
||||
}
|
||||
|
||||
$this->addPersistentState();
|
||||
$this->enableConditionalDecorator();
|
||||
$this->setSubmitLabel('{{SAVE_ICON}} Save Changes');
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the configuration state defined by this form
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getConfig()
|
||||
{
|
||||
$result = array();
|
||||
foreach ($this->backendForms as $name) {
|
||||
|
||||
$name->populate($this->getRequest()->getParams());
|
||||
$result += $name->getConfig();
|
||||
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable the "ConditionalHidden" Decorator for all elements in this form
|
||||
*
|
||||
* @see ConditionalHidden
|
||||
*/
|
||||
private function enableConditionalDecorator()
|
||||
{
|
||||
foreach ($this->getElements() as $element) {
|
||||
$element->addDecorator(new ConditionalHidden());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Static helper for moving an element in an array one slot up, if possible
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* <pre>
|
||||
* $array = array('first', 'second', 'third');
|
||||
* moveElementUp('third', $array); // returns ['first', 'third', 'second']
|
||||
* </pre>
|
||||
*
|
||||
* @param string $key The key to bubble up one slot
|
||||
* @param array $array The array to work with
|
||||
*
|
||||
* @return array The modified array
|
||||
*/
|
||||
private static function moveElementUp($key, array $array)
|
||||
{
|
||||
$swap = null;
|
||||
for ($i=0; $i<count($array)-1; $i++) {
|
||||
if ($array[$i+1] !== $key) {
|
||||
continue;
|
||||
}
|
||||
$swap = $array[$i];
|
||||
$array[$i] = $array[$i+1];
|
||||
$array[$i+1] = $swap;
|
||||
return $array;
|
||||
}
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* Static helper for moving an element in an array one slot up, if possible
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* <pre>
|
||||
* $array = array('first', 'second', 'third');
|
||||
* moveElementDown('first', $array); // returns ['second', 'first', 'third']
|
||||
* </pre>
|
||||
*
|
||||
* @param string $key The key to bubble up one slot
|
||||
* @param array $array The array to work with
|
||||
*
|
||||
* @return array The modified array
|
||||
*/
|
||||
private static function moveElementDown($key, array $array)
|
||||
{
|
||||
$swap = null;
|
||||
for ($i=0; $i<count($array)-1; $i++) {
|
||||
if ($array[$i] !== $key) {
|
||||
continue;
|
||||
}
|
||||
$swap = $array[$i+1];
|
||||
$array[$i+1] = $array[$i];
|
||||
$array[$i] = $swap;
|
||||
return $array;
|
||||
}
|
||||
return $array;
|
||||
}
|
||||
}
|
82
application/forms/Config/ConfirmRemovalForm.php
Normal file
82
application/forms/Config/ConfirmRemovalForm.php
Normal file
@ -0,0 +1,82 @@
|
||||
<?php
|
||||
// {{{ICINGA_LICENSE_HEADER}}}
|
||||
/**
|
||||
* This file is part of Icinga 2 Web.
|
||||
*
|
||||
* Icinga 2 Web - Head for multiple monitoring backends.
|
||||
* Copyright (C) 2013 Icinga Development Team
|
||||
*
|
||||
* 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 the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* @copyright 2013 Icinga Development Team <info@icinga.org>
|
||||
* @license http://www.gnu.org/licenses/gpl-2.0.txt GPL, version 2
|
||||
* @author Icinga Development Team <info@icinga.org>
|
||||
*/
|
||||
// {{{ICINGA_LICENSE_HEADER}}}
|
||||
|
||||
|
||||
namespace Icinga\Form\Config;
|
||||
|
||||
use Icinga\Web\Form;
|
||||
|
||||
/**
|
||||
* Form for confirming removal of an object
|
||||
*/
|
||||
class ConfirmRemovalForm extends Form
|
||||
{
|
||||
/**
|
||||
* The value of the target to remove
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $removeTarget;
|
||||
|
||||
/**
|
||||
* The name of the target parameter to remove
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $targetName;
|
||||
|
||||
/**
|
||||
* Set the remove target in this field to be a hidden field with $name and value $target
|
||||
*
|
||||
* @param string $name The name to be set in the hidden field
|
||||
* @param string $target The value to be set in the hidden field
|
||||
*/
|
||||
public function setRemoveTarget($name, $target)
|
||||
{
|
||||
$this->targetName = $name;
|
||||
$this->removeTarget = $target;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the confirmation form
|
||||
*
|
||||
* @see Form::create()
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
$this->addElement(
|
||||
'hidden',
|
||||
$this->targetName,
|
||||
array(
|
||||
'value' => $this->removeTarget,
|
||||
'required' => true
|
||||
)
|
||||
);
|
||||
$this->setSubmitLabel('{{REMOVE_ICON}} Confirm Removal');
|
||||
}
|
||||
}
|
@ -1,35 +1,56 @@
|
||||
<?php
|
||||
use Icinga\Web\Url;
|
||||
$createLdapBackend = Url::fromPath(
|
||||
'/config/createAuthenticationBackend',
|
||||
array('type' => 'ldap')
|
||||
)->getAbsoluteUrl();
|
||||
|
||||
$createDbBackend = Url::fromPath(
|
||||
'/config/createAuthenticationBackend',
|
||||
array('type' => 'db')
|
||||
)->getAbsoluteUrl();
|
||||
$createLdapBackend = $this->href('/config/createAuthenticationBackend', array('type' => 'ldap'));
|
||||
$createDbBackend = $this->href('/config/createAuthenticationBackend', array('type' => 'db'));
|
||||
|
||||
?>
|
||||
|
||||
<?= $this->tabs->render($this); ?>
|
||||
|
||||
<?php
|
||||
$errors = $this->form->getErrorMessages();
|
||||
if (!empty($errors)):
|
||||
?>
|
||||
<div class="alert alert-danger">
|
||||
<h4>{{ERROR_ICON}} There are errors in your configuration:</h4>
|
||||
<br/>
|
||||
<ul>
|
||||
<?php foreach($errors as $error): ?>
|
||||
<li><?= $error ?></li>
|
||||
<?php endforeach;?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php if ($this->errorMessage): ?>
|
||||
<div class="alert alert-danger">
|
||||
<i>{{ERROR_ICON}}</i>
|
||||
<strong><?= $this->escape($this->errorMessage); ?></strong>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div>
|
||||
<a href="<?= $createLdapBackend ?>">{{CREATE_ICON}} Create A New LDAP Authentication Backend</a><br/>
|
||||
<a href="<?= $createDbBackend ?>">{{CREATE_ICON}} Create A New DB Authentication Backend</a>
|
||||
|
||||
<?php if ($this->successMessage): ?>
|
||||
<div class="alert alert-success">
|
||||
<i>{{OK_ICON}}</i>
|
||||
<strong><?= $this->escape($this->successMessage); ?></strong>
|
||||
</div>
|
||||
<?= $this->form ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading panel-title">
|
||||
Create Authentication Provider
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<a href="<?= $createLdapBackend ?>">{{CREATE_ICON}} Create A New LDAP Authentication Backend</a><br/>
|
||||
<a href="<?= $createDbBackend ?>">{{CREATE_ICON}} Create A New DB Authentication Backend</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<?php foreach ($this->backends as $backend): ?>
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading panel-title">
|
||||
Backend <?= $this->escape($backend->name); ?>
|
||||
<br/>
|
||||
<?= $backend->reorderForm; ?>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<a href="<?= $this->href('config/editAuthenticationBackend', array('auth_backend' => $backend->name));?>">
|
||||
{{EDIT_ICON}} Edit This Authentication Provider
|
||||
</a>
|
||||
<br/>
|
||||
<?php if (count($this->backends) > 1): ?>
|
||||
<a href="<?= $this->href('config/removeAuthenticationBackend', array('auth_backend' => $backend->name));?>">
|
||||
{{REMOVE_ICON}} Remove This Authentication Provider
|
||||
</a>
|
||||
<br/>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
15
application/views/scripts/config/authentication/create.phtml
Normal file
15
application/views/scripts/config/authentication/create.phtml
Normal file
@ -0,0 +1,15 @@
|
||||
<?= $this->tabs->render($this); ?>
|
||||
|
||||
<h4>{{CREATE_ICON}} Create New Authentication Backend</h4>
|
||||
|
||||
<?php if ($this->errorMessage): ?>
|
||||
<div class="alert alert-danger">
|
||||
<?= $this->escape($this->errorMessage); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<p>
|
||||
Create a new backend for authenticating your users. This backend will be added at the end of your authentication order.
|
||||
</p>
|
||||
|
||||
<?= $this->form ?>
|
@ -1,4 +1,14 @@
|
||||
<?= $this->tabs->render($this); ?>
|
||||
|
||||
<h4>{{CREATE_ICON}} Create New Backend</h4>
|
||||
<h4>{{CREATE_ICON}} Edit Backend "<?= $this->escape($this->name); ?>"</h4>
|
||||
|
||||
<?php if ($this->errorMessage || $this->form->getErrorMessages()): ?>
|
||||
<div class="alert alert-danger">
|
||||
<?= $this->escape($this->errorMessage); ?>
|
||||
<?php foreach ($this->form->getErrorMessages() as $error): ?>
|
||||
<?= $this->escape($error); ?><br/>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?= $this->form ?>
|
@ -0,0 +1,4 @@
|
||||
<?= $this->tabs->render($this); ?>
|
||||
|
||||
<h4>{{REMOVE_ICON}} Remove Backend "<?= $this->escape($this->name); ?>"</h4>
|
||||
<?= $this->form ?>
|
@ -37,24 +37,28 @@ class Config extends Zend_Config_Ini
|
||||
{
|
||||
/**
|
||||
* Configuration directory where ALL (application and module) configuration is located
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public static $configDir;
|
||||
|
||||
/**
|
||||
* The INI file this configuration has been loaded from
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $configFile;
|
||||
|
||||
/**
|
||||
* Application config instances per file
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected static $app = array();
|
||||
|
||||
/**
|
||||
* Module config instances per file
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected static $modules = array();
|
||||
@ -62,10 +66,10 @@ class Config extends Zend_Config_Ini
|
||||
/**
|
||||
* Load configuration from the config file $filename
|
||||
*
|
||||
* @param string $filename The filename to parse
|
||||
|
||||
* @see Zend_Config_Ini::__construct
|
||||
*
|
||||
* @param string $filename
|
||||
* @throws Exception
|
||||
* @throws Exception When the file can't be read
|
||||
*/
|
||||
public function __construct($filename)
|
||||
{
|
||||
@ -83,12 +87,15 @@ class Config extends Zend_Config_Ini
|
||||
/**
|
||||
* Retrieve a application config instance
|
||||
*
|
||||
* @param string $configname
|
||||
* @return mixed
|
||||
* @param string $configname The configuration name (without ini suffix) to read and return
|
||||
* @param bool $fromDisk When set true, the configuration will be read from the disk, even
|
||||
* if it already has been read
|
||||
*
|
||||
* @return Config The configuration object that has been requested
|
||||
*/
|
||||
public static function app($configname = 'config')
|
||||
public static function app($configname = 'config', $fromDisk = false)
|
||||
{
|
||||
if (!isset(self::$app[$configname])) {
|
||||
if (!isset(self::$app[$configname]) || $fromDisk) {
|
||||
$filename = self::$configDir . '/' . $configname . '.ini';
|
||||
self::$app[$configname] = new Config(realpath($filename));
|
||||
}
|
||||
|
@ -356,8 +356,6 @@ class Web extends ApplicationBootstrap
|
||||
$view->setView(new View());
|
||||
|
||||
$view->view->addHelperPath($this->getApplicationDir('/views/helpers'));
|
||||
// TODO: find out how to avoid this additional helper path:
|
||||
$view->view->addHelperPath($this->getApplicationDir('/views/helpers/layout'));
|
||||
|
||||
$view->view->setEncoding('UTF-8');
|
||||
$view->view->headTitle()->prepend(
|
||||
|
@ -120,9 +120,9 @@ class LdapUserBackend implements UserBackend
|
||||
public function authenticate(Credentials $credentials)
|
||||
{
|
||||
if (!$this->connection->testCredentials(
|
||||
$this->connection->fetchDN($this->selectUsername($credentials->getUsername())),
|
||||
$credentials->getPassword()
|
||||
)
|
||||
$this->connection->fetchDN($this->selectUsername($credentials->getUsername())),
|
||||
$credentials->getPassword()
|
||||
)
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
@ -130,4 +130,16 @@ class LdapUserBackend implements UserBackend
|
||||
|
||||
return $user;
|
||||
}
|
||||
|
||||
public function getUserCount() {
|
||||
return $this->connection->count(
|
||||
$this->connection->select()->from(
|
||||
$this->config->user_class,
|
||||
array(
|
||||
$this->config->user_name_attribute
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ use \Icinga\Web\Form\Element\Note;
|
||||
/**
|
||||
* Base class for forms providing CSRF protection, confirmation logic and auto submission
|
||||
*/
|
||||
abstract class Form extends Zend_Form
|
||||
class Form extends Zend_Form
|
||||
{
|
||||
/**
|
||||
* The form's request object
|
||||
@ -161,7 +161,8 @@ abstract class Form extends Zend_Form
|
||||
/**
|
||||
* Add elements to this form (used by extending classes)
|
||||
*/
|
||||
abstract protected function create();
|
||||
protected function create()
|
||||
{}
|
||||
|
||||
/**
|
||||
* Method called before validation
|
||||
@ -322,7 +323,9 @@ abstract class Form extends Zend_Form
|
||||
* Ensures that the current request method is POST, that the form was manually submitted and that the data provided
|
||||
* in the request is valid and gets repopulated in case its invalid.
|
||||
*
|
||||
* @return bool
|
||||
* @return bool True when the form is submitted and valid, otherwise false
|
||||
* @see Form::isValid()
|
||||
* @see Form::isSubmitted()
|
||||
*/
|
||||
public function isSubmittedAndValid()
|
||||
{
|
||||
@ -334,12 +337,7 @@ abstract class Form extends Zend_Form
|
||||
$checkData = $this->getRequest()->getParams();
|
||||
$this->assertValidCsrfToken($checkData);
|
||||
|
||||
$submitted = true;
|
||||
if ($this->submitLabel) {
|
||||
$submitted = isset($checkData['btn_submit']);
|
||||
}
|
||||
|
||||
if ($submitted) {
|
||||
if ($this->isSubmitted()) {
|
||||
// perform full validation if submitted
|
||||
$this->preValidation($checkData);
|
||||
return $this->isValid($checkData);
|
||||
@ -350,6 +348,24 @@ abstract class Form extends Zend_Form
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether this form has been submitted
|
||||
*
|
||||
* Per default, this checks whether the button set with the 'setSubmitLabel' method
|
||||
* is being submitted. For custom submission logic, this method must be overwritten
|
||||
*
|
||||
* @return bool True when the form is marked as submitted, otherwise false
|
||||
*/
|
||||
public function isSubmitted()
|
||||
{
|
||||
$submitted = true;
|
||||
if ($this->submitLabel) {
|
||||
$checkData = $this->getRequest()->getParams();
|
||||
$submitted = isset($checkData['btn_submit']);
|
||||
}
|
||||
return $submitted;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable CSRF counter measure and remove its field if already added
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user