Вход Регистрация
Файл: contao-3.5.8/system/modules/core/modules/ModuleChangePassword.php
Строк: 107
<?php

/**
 * Contao Open Source CMS
 *
 * Copyright (c) 2005-2016 Leo Feyer
 *
 * @license LGPL-3.0+
 */

namespace Contao;


/**
 * Front end module "change password".
 *
 * @author Leo Feyer <https://github.com/leofeyer>
 */
class ModuleChangePassword extends Module
{

    
/**
     * Template
     * @var string
     */
    
protected $strTemplate 'mod_change_password';


    
/**
     * Display a wildcard in the back end
     *
     * @return string
     */
    
public function generate()
    {
        if (
TL_MODE == 'BE')
        {
            
/** @var BackendTemplate|object $objTemplate */
            
$objTemplate = new BackendTemplate('be_wildcard');

            
$objTemplate->wildcard '### ' utf8_strtoupper($GLOBALS['TL_LANG']['FMD']['changePassword'][0]) . ' ###';
            
$objTemplate->title $this->headline;
            
$objTemplate->id $this->id;
            
$objTemplate->link $this->name;
            
$objTemplate->href 'contao/main.php?do=themes&amp;table=tl_module&amp;act=edit&amp;id=' $this->id;

            return 
$objTemplate->parse();
        }

        
// Return if there is no logged in user
        
if (!FE_USER_LOGGED_IN)
        {
            return 
'';
        }

        return 
parent::generate();
    }


    
/**
     * Generate the module
     */
    
protected function compile()
    {
        
/** @var PageModel $objPage */
        
global $objPage;

        
$this->import('FrontendUser''User');

        
$GLOBALS['TL_LANGUAGE'] = $objPage->language;

        
System::loadLanguageFile('tl_member');
        
$this->loadDataContainer('tl_member');

        
// Old password widget
        
$arrFields['oldPassword'] = array
        (
            
'name'      => 'oldpassword',
            
'label'     => &$GLOBALS['TL_LANG']['MSC']['oldPassword'],
            
'inputType' => 'text',
            
'eval'      => array('mandatory'=>true'preserveTags'=>true'hideInput'=>true),
        );

        
// New password widget
        
$arrFields['newPassword'] = $GLOBALS['TL_DCA']['tl_member']['fields']['password'];
        
$arrFields['newPassword']['name'] = 'password';
        
$arrFields['newPassword']['label'] = &$GLOBALS['TL_LANG']['MSC']['newPassword'];

        
$row 0;
        
$strFields '';
        
$doNotSubmit false;
        
$objMember MemberModel::findByPk($this->User->id);

        
/** @var FormTextField $objOldPassword */
        
$objOldPassword null;

        
/** @var FormPassword $objNewPassword */
        
$objNewPassword null;

        
// Initialize the widgets
        
foreach ($arrFields as $strKey=>$arrField)
        {
            
/** @var Widget $strClass */
            
$strClass $GLOBALS['TL_FFL'][$arrField['inputType']];

            
// Continue if the class is not defined
            
if (!class_exists($strClass))
            {
                continue;
            }

            
$arrField['eval']['tableless'] = $this->tableless;
            
$arrField['eval']['required'] = $arrField['eval']['mandatory'];

            
/** @var Widget $objWidget */
            
$objWidget = new $strClass($strClass::getAttributesFromDca($arrField$arrField['name']));

            
$objWidget->storeValues true;
            
$objWidget->rowClass 'row_' $row . (($row == 0) ? ' row_first' '') . ((($row 2) == 0) ? ' even' ' odd');

            
// Increase the row count if it is a password field
            
if ($objWidget instanceof FormPassword)
            {
                
$objWidget->rowClassConfirm 'row_' . ++$row . ((($row 2) == 0) ? ' even' ' odd');
            }

            ++
$row;

            
// Store the widget objects
            
$strVar  'obj' ucfirst($strKey);
            $
$strVar $objWidget;

            
// Validate the widget
            
if (Input::post('FORM_SUBMIT') == 'tl_change_password')
            {
                
$objWidget->validate();

                
// Validate the old password
                
if ($strKey == 'oldPassword')
                {
                    if (
Encryption::test($objMember->password))
                    {
                        
$blnAuthenticated Encryption::verify($objWidget->value$objMember->password);
                    }
                    else
                    {
                        list(
$strPassword$strSalt) = explode(':'$objMember->password);
                        
$blnAuthenticated = ($strSalt == '') ? ($strPassword === sha1($objWidget->value)) : ($strPassword === sha1($strSalt $objWidget->value));
                    }

                    if (!
$blnAuthenticated)
                    {
                        
$objWidget->value '';
                        
$objWidget->addError($GLOBALS['TL_LANG']['MSC']['oldPasswordWrong']);
                        
sleep(2); // Wait 2 seconds while brute forcing :)
                    
}
                }

                if (
$objWidget->hasErrors())
                {
                    
$doNotSubmit true;
                }
            }

            
$strFields .= $objWidget->parse();
        }

        
$this->Template->fields $strFields;
        
$this->Template->hasError $doNotSubmit;

        
// Store the new password
        
if (Input::post('FORM_SUBMIT') == 'tl_change_password' && !$doNotSubmit)
        {
            
$objMember->tstamp time();
            
$objMember->password $objNewPassword->value;
            
$objMember->save();

            
// HOOK: set new password callback
            
if (isset($GLOBALS['TL_HOOKS']['setNewPassword']) && is_array($GLOBALS['TL_HOOKS']['setNewPassword']))
            {
                foreach (
$GLOBALS['TL_HOOKS']['setNewPassword'] as $callback)
                {
                    
$this->import($callback[0]);
                    
$this->{$callback[0]}->{$callback[1]}($objMember$objNewPassword->value$this);
                }
            }

            
// Check whether there is a jumpTo page
            
if (($objJumpTo $this->objModel->getRelated('jumpTo')) !== null)
            {
                
$this->jumpToOrReload($objJumpTo->row());
            }

            
Message::addConfirmation($GLOBALS['TL_LANG']['MSC']['newPasswordSet']);
            
$this->reload();
        }

        
$this->Template->action Environment::get('indexFreeRequest');
        
$this->Template->slabel specialchars($GLOBALS['TL_LANG']['MSC']['changePassword']);
        
$this->Template->rowLast 'row_' $row ' row_last' . ((($row 2) == 0) ? ' even' ' odd');
        
$this->Template->tableless $this->tableless;
        
$this->Template->message Message::generate(falsetrue);
    }
}
Онлайн: 0
Реклама