Файл: concrete5.7.5.6/concrete/controllers/single_page/login.php
Строк: 401
<?php
namespace ConcreteControllerSinglePage;
use ConcreteCoreAuthenticationAuthenticationType;
use ConcreteCoreAuthenticationAuthenticationTypeFailureException;
use ConcreteCoreRoutingRedirectResponse;
use Config;
use Events;
use Core;
use Localization;
use Page;
use PageController;
use Permissions;
use Session;
use User;
use UserAttributeKey;
use UserInfo;
use View;
class Login extends PageController
{
public $helpers = array('form');
protected $locales = array();
public function on_before_render()
{
if ($this->error->has()) {
$this->set('error', $this->error);
}
}
/* automagically run by the controller once we're done with the current method */
/* method is passed to this method, the method that we were just finished running */
public function account_deactivated()
{
$this->error->add(t('This user is inactive. Please contact us regarding this account.'));
}
public function session_invalidated()
{
$this->error->add(t('Your session has expired. Please sign in again.'));
}
/**
* Concrete5_Controller_Login::callback
* Call an AuthenticationTypeController method throw a uri.
* Use: /login/TYPE/METHOD/PARAM1/.../PARAM10.
*
* @param string $type
* @param string $method
* @param null $a
* @param null $b
* @param null $c
* @param null $d
* @param null $e
* @param null $f
* @param null $g
* @param null $h
* @param null $i
* @param null $j
*
* @throws ConcreteCoreAuthenticationAuthenticationTypeFailureException
* @throws Exception
*/
public function callback($type = null, $method = 'callback', $a = null, $b = null, $c = null, $d = null, $e = null, $f = null, $g = null, $h = null, $i = null, $j = null)
{
if (!$type) {
return $this->view();
}
$at = AuthenticationType::getByHandle($type);
if ($at) {
$this->set('authType', $at);
}
if (!method_exists($at->controller, $method)) {
return $this->view();
}
if ($method != 'callback') {
if (!is_array($at->controller->apiMethods) || !in_array($method, $at->controller->apiMethods)) {
return $this->view();
}
}
try {
$params = func_get_args();
array_shift($params);
array_shift($params);
$this->view();
$this->set('authTypeParams', $params);
$this->set('authTypeElement', $method);
} catch (exception $e) {
if ($e instanceof AuthenticationTypeFailureException) {
// Throw again if this is a big`n
throw $e;
}
$this->error->add($e->getMessage());
}
}
/**
* Concrete5_Controller_Login::authenticate
* Authenticate the user using a specific authentication type.
*
* @param $type AuthenticationType handle
*/
public function authenticate($type = '')
{
$valt = Core::make('helper/validation/token');
if (!$valt->validate('login_' . $type)) {
$this->error->add($valt->getErrorMessage());
} else {
try {
$at = AuthenticationType::getByHandle($type);
$user = $at->controller->authenticate();
if ($user && $user->isLoggedIn()) {
$this->finishAuthentication($at);
}
} catch (exception $e) {
$this->error->add($e->getMessage());
}
}
if (isset($at)) {
$this->set('lastAuthType', $at);
}
$this->view();
}
/**
* @param AuthenticationType $type Required
*
* @throws Exception
*/
public function finishAuthentication(/* AuthenticationType */
$type = null
) {
if (!$type || !($type instanceof AuthenticationType)) {
return $this->view();
}
$u = new User();
if (Config::get('concrete.i18n.choose_language_login')) {
$userLocale = $this->post('USER_LOCALE');
if (is_string($userLocale) && ($userLocale !== '')) {
if ($userLocale !== 'en_US') {
$availableLocales = Localization::getAvailableInterfaceLanguages();
if (!in_array($userLocale, $availableLocales)) {
$userLocale = '';
}
}
if ($userLocale !== '') {
if (Localization::activeLocale() !== $userLocale) {
Localization::changeLocale($userLocale);
}
$u->setUserDefaultLanguage($userLocale);
}
}
}
$ui = UserInfo::getByID($u->getUserID());
$aks = UserAttributeKey::getRegistrationList();
$unfilled = array_values(
array_filter(
$aks,
function ($ak) use ($ui) {
return $ak->isAttributeKeyRequiredOnRegister() && !is_object($ui->getAttributeValueObject($ak));
}));
if (count($unfilled)) {
$u->logout(false);
if (!$this->error) {
$this->on_start();
}
$this->set('required_attributes', $unfilled);
$this->set('u', $u);
Session::set('uRequiredAttributeUser', $u->getUserID());
Session::set('uRequiredAttributeUserAuthenticationType', $type->getAuthenticationTypeHandle());
$this->view();
echo $this->getViewObject()->render();
exit;
}
$u->setLastAuthType($type);
$ue = new ConcreteCoreUserEventUser($u);
Events::dispatch('on_user_login', $ue);
$this->chooseRedirect();
}
public function on_start()
{
$this->error = Core::make('helper/validation/error');
$this->set('valt', Core::make('helper/validation/token'));
if (Config::get('concrete.user.registration.email_registration')) {
$this->set('uNameLabel', t('Email Address'));
} else {
$this->set('uNameLabel', t('Username'));
}
$txt = Core::make('helper/text');
if (isset($_GET['uName']) && strlen($_GET['uName'])
) { // pre-populate the username if supplied, if its an email address with special characters the email needs to be urlencoded first,
$this->set("uName", trim($txt->email($_GET['uName'])));
}
$languages = array();
$locales = array();
if (Config::get('concrete.i18n.choose_language_login')) {
$languages = Localization::getAvailableInterfaceLanguages();
if (count($languages) > 0) {
array_unshift($languages, 'en_US');
}
$locales = array();
foreach ($languages as $lang) {
$locales[$lang] = PunicLanguage::getName($lang, $lang);
}
asort($locales);
$locales = array_merge(array('' => tc('Default locale', '** Default')), $locales);
}
$this->locales = $locales;
$this->set('locales', $locales);
}
public function chooseRedirect()
{
if (!$this->error) {
$this->error = Core::make('helper/validation/error');
}
$nh = Core::make('helper/validation/numbers');
$navigation = Core::make('helper/navigation');
$rUrl = false;
$u = new User(); // added for the required registration attribute change above. We recalc the user and make sure they're still logged in
if ($u->isRegistered()) {
if ($u->config('NEWSFLOW_LAST_VIEWED') == 'FIRSTRUN') {
$u->saveConfig('NEWSFLOW_LAST_VIEWED', 0);
}
do {
// redirect to original destination
if (Session::has('rcID')) {
$rcID = Session::get('rcID');
if ($nh->integer($rcID)) {
$rc = Page::getByID($rcID);
} elseif (strlen($rcID)) {
$rcID = trim($rcID, '/');
$rc = Page::getByPath('/' . $rcID);
}
if ($rc instanceof Page && !$rc->isError()) {
$rUrl = $navigation->getLinkToCollection($rc);
break;
}
}
// admin to dashboard?
$dash = Page::getByPath("/dashboard", "RECENT");
$dbp = new Permissions($dash);
//should administrator be redirected to dashboard? defaults to yes if not set.
$adminToDash = intval(Config::get('concrete.misc.login_admin_to_dashboard'));
if ($dbp->canRead() && $adminToDash) {
if (!$rc instanceof Page || $rc->isError()) {
$rc = $dash;
}
$rUrl = $navigation->getLinkToCollection($rc);
break;
}
//options set in dashboard/users/registration
$login_redirect_mode = Config::get('concrete.misc.login_redirect');
//redirect to user profile
if ($login_redirect_mode == 'PROFILE') {
$profileURL = $u->getUserInfoObject()->getUserPublicProfileUrl();
if ($profileURL) {
$rUrl = $profileURL;
}
break;
}
//redirect to custom page
$login_redirect_cid = intval(Config::get('concrete.misc.login_redirect_cid'));
if ($login_redirect_mode == 'CUSTOM' && $login_redirect_cid > 0) {
$rc = Page::getByID($login_redirect_cid);
if ($rc instanceof Page && !$rc->isError()) {
$rUrl = $navigation->getLinkToCollection($rc);
break;
}
}
break;
} while (false);
if ($rUrl) {
$r = new RedirectResponse($rUrl);
$r->send();
exit;
} else {
$this->redirect('/');
}
} else {
$this->error->add(t('User is not registered. Check your authentication controller.'));
$u->logout();
}
}
public function view($type = null, $element = 'form')
{
$this->requireAsset('javascript', 'backstretch');
$this->set('authTypeParams', $this->getSets());
if (strlen($type)) {
$at = AuthenticationType::getByHandle($type);
$this->set('authType', $at);
$this->set('authTypeElement', $element);
}
}
public function fill_attributes()
{
try {
if (!Session::has('uRequiredAttributeUser') ||
intval(Session::get('uRequiredAttributeUser')) < 1 ||
!Session::has('uRequiredAttributeUserAuthenticationType') ||
!Session::get('uRequiredAttributeUserAuthenticationType')
) {
Session::remove('uRequiredAttributeUser');
Session::remove('uRequiredAttributeUserAuthenticationType');
throw new Exception(t('Invalid Request, please attempt login again.'));
}
User::loginByUserID(Session::get('uRequiredAttributeUser'));
Session::remove('uRequiredAttributeUser');
$u = new User();
$at = AuthenticationType::getByHandle(Session::get('uRequiredAttributeUserAuthenticationType'));
Session::remove('uRequiredAttributeUserAuthenticationType');
if (!$at) {
throw new Exception(t("Invalid Authentication Type"));
}
$ui = UserInfo::getByID($u->getUserID());
$aks = UserAttributeKey::getRegistrationList();
$unfilled = array_values(
array_filter(
$aks,
function ($ak) use ($ui) {
return $ak->isAttributeKeyRequiredOnRegister() && !is_object($ui->getAttributeValueObject($ak));
}));
$saveAttributes = array();
foreach ($unfilled as $attribute) {
$err = $attribute->validateAttributeForm();
if ($err == false) {
$this->error->add(t('The field "%s" is required', $attribute->getAttributeKeyDisplayName()));
} elseif ($err instanceof ConcreteCoreErrorError) {
$this->error->add($err);
} else {
$saveAttributes[] = $attribute;
}
}
if (count($saveAttributes) > 0) {
$ui->saveUserAttributesForm($saveAttributes);
}
$this->finishAuthentication($at);
} catch (Exception $e) {
$this->error->add($e->getMessage());
}
}
public function logout($token = false)
{
if (Core::make('helper/validation/token')->validate('logout', $token)) {
$u = new User();
$u->logout();
$this->redirect('/');
}
}
public function forward($cID = 0)
{
$nh = Core::make('helper/validation/numbers');
if ($nh->integer($cID) && intval($cID) > 0) {
$this->set('rcID', intval($cID));
Session::set('rcID', intval($cID));
}
}
}