diff --git a/application/controllers/AccountController.php b/application/controllers/AccountController.php index 378848b14..25bc97756 100644 --- a/application/controllers/AccountController.php +++ b/application/controllers/AccountController.php @@ -4,7 +4,10 @@ namespace Icinga\Controllers; use Icinga\Application\Config; +use Icinga\Authentication\User\UserBackend; use Icinga\Data\ConfigObject; +use Icinga\Exception\ConfigurationError; +use Icinga\Forms\Account\ChangePasswordForm; use Icinga\Forms\PreferenceForm; use Icinga\User\Preferences\PreferencesStore; use Icinga\Web\Controller; @@ -39,6 +42,20 @@ class AccountController extends Controller { $config = Config::app()->getSection('global'); $user = $this->Auth()->getUser(); + if ($user->getAdditional('backend_type') === 'db') { + try { + $userBackend = UserBackend::create($user->getAdditional('backend_name')); + } catch (ConfigurationError $e) { + $userBackend = null; + } + if ($userBackend !== null) { + $changePasswordForm = new ChangePasswordForm(); + $changePasswordForm + ->setBackend($userBackend) + ->handleRequest(); + $this->view->changePasswordForm = $changePasswordForm; + } + } $form = new PreferenceForm(); $form->setPreferences($user->getPreferences()); diff --git a/application/forms/Account/ChangePasswordForm.php b/application/forms/Account/ChangePasswordForm.php new file mode 100644 index 000000000..60c58604b --- /dev/null +++ b/application/forms/Account/ChangePasswordForm.php @@ -0,0 +1,123 @@ +setSubmitLabel($this->translate('Update Account')); + } + + /** + * {@inheritdoc} + */ + public function createElements(array $formData) + { + $this->addElement( + 'password', + 'old_password', + array( + 'label' => $this->translate('Old Password'), + 'required' => true + ) + ); + $this->addElement( + 'password', + 'new_password', + array( + 'label' => $this->translate('New Password'), + 'required' => true + ) + ); + $this->addElement( + 'password', + 'new_password_confirmation', + array( + 'label' => $this->translate('Confirm New Password'), + 'required' => true, + 'validators' => array( + array('identical', false, array('new_password')) + ) + ) + ); + } + + /** + * {@inheritdoc} + */ + public function onSuccess() + { + $backend = $this->getBackend(); + $backend->update( + $backend->getBaseTable(), + array('password' => $this->getElement('new_password')->getValue()), + Filter::where('user_name', $this->Auth()->getUser()->getUsername()) + ); + Notification::success($this->translate('Account updated')); + } + + /** + * {@inheritdoc} + */ + public function isValid($formData) + { + $valid = parent::isValid($formData); + if (! $valid) { + return false; + } + + $oldPasswordEl = $this->getElement('old_password'); + + if (! $this->backend->authenticate($this->Auth()->getUser(), $oldPasswordEl->getValue())) { + $oldPasswordEl->addError($this->translate('Old password is invalid')); + $this->markAsError(); + return false; + } + + return true; + } + + /** + * Get the user backend + * + * @return DbUserBackend + */ + public function getBackend() + { + return $this->backend; + } + + /** + * Set the user backend + * + * @param DbUserBackend $backend + * + * @return $this + */ + public function setBackend(DbUserBackend $backend) + { + $this->backend = $backend; + return $this; + } +} diff --git a/application/views/scripts/account/index.phtml b/application/views/scripts/account/index.phtml index 4ca5e6821..efc2bcbf6 100644 --- a/application/views/scripts/account/index.phtml +++ b/application/views/scripts/account/index.phtml @@ -1,6 +1,11 @@