X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModule%2FLogin.php;h=c84af17ccb99483ce42b2347f6215df2e0cb046c;hb=d48d3d1db28572e055689097d923b6cf389f9ec9;hp=82d70498281fc6547a6e7a79520c6bca96793c8b;hpb=fabc90e9dd5f1c4280a9bfa6c6930a3fc985f87a;p=friendica.git diff --git a/src/Module/Login.php b/src/Module/Login.php index 82d7049828..c84af17ccb 100644 --- a/src/Module/Login.php +++ b/src/Module/Login.php @@ -1,17 +1,20 @@ internalRedirect(); } - return self::form(defaults($_SESSION, 'return_path', null), intval(Config::get('config', 'register_policy')) !== REGISTER_CLOSED); + return self::form(Session::get('return_path'), intval(Config::get('config', 'register_policy')) !== \Friendica\Module\Register::CLOSED); } - public static function post() + public static function post(array $parameters = []) { - $return_path = $_SESSION['return_path']; + $openid_identity = Session::get('openid_identity'); + $openid_server = Session::get('openid_server'); + + $return_path = Session::get('return_path'); session_unset(); - $_SESSION['return_path'] = $return_path; - + Session::set('return_path', $return_path); + // OpenId Login if ( empty($_POST['password']) - && ( - !empty($_POST['openid_url']) - || !empty($_POST['username']) - ) + && (!empty($_POST['openid_url']) + || !empty($_POST['username'])) ) { - $openid_url = trim(defaults($_POST, 'openid_url', $_POST['username'])); + $openid_url = trim(($_POST['openid_url'] ?? '') ?: $_POST['username']); self::openIdAuthentication($openid_url, !empty($_POST['remember'])); } @@ -72,7 +65,9 @@ class Login extends BaseModule self::passwordAuthentication( trim($_POST['username']), trim($_POST['password']), - !empty($_POST['remember']) + !empty($_POST['remember']), + $openid_identity, + $openid_server ); } } @@ -82,6 +77,7 @@ class Login extends BaseModule * * @param string $openid_url OpenID URL string * @param bool $remember Whether to set the session remember flag + * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ private static function openIdAuthentication($openid_url, $remember) { @@ -100,9 +96,10 @@ class Login extends BaseModule try { $openid = new LightOpenID($a->getHostName()); $openid->identity = $openid_url; - $_SESSION['openid'] = $openid_url; - $_SESSION['remember'] = $remember; + Session::set('openid', $openid_url); + Session::set('remember', $remember); $openid->returnUrl = $a->getBaseURL(true) . '/openid'; + $openid->optional = ['namePerson/friendly', 'contact/email', 'namePerson', 'namePerson/first', 'media/image/aspect11', 'media/image/default']; System::externalRedirect($openid->authUrl()); } catch (Exception $e) { notice(L10n::t('We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID.') . '

' . L10n::t('The error message was:') . ' ' . $e->getMessage()); @@ -112,11 +109,14 @@ class Login extends BaseModule /** * Attempts to authenticate using login/password * - * @param string $username User name - * @param string $password Clear password - * @param bool $remember Whether to set the session remember flag + * @param string $username User name + * @param string $password Clear password + * @param bool $remember Whether to set the session remember flag + * @param string $openid_identity OpenID identity + * @param string $openid_server OpenID URL + * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - private static function passwordAuthentication($username, $password, $remember) + private static function passwordAuthentication($username, $password, $remember, $openid_identity, $openid_server) { $record = null; @@ -134,7 +134,7 @@ class Login extends BaseModule * Addons should never set 'authenticated' except to indicate success - as hooks may be chained * and later addons should not interfere with an earlier one that succeeded. */ - Addon::callHooks('authenticate', $addon_auth); + Hook::callAll('authenticate', $addon_auth); try { if ($addon_auth['authenticated']) { @@ -144,12 +144,14 @@ class Login extends BaseModule throw new Exception(L10n::t('Login failed.')); } } else { - $record = DBA::selectFirst('user', [], + $record = DBA::selectFirst( + 'user', + [], ['uid' => User::getIdFromPasswordAuthentication($username, $password)] ); } } catch (Exception $e) { - Logger::log('authenticate: failed login attempt: ' . Strings::escapeTags($username) . ' from IP ' . $_SERVER['REMOTE_ADDR']); + Logger::warning('authenticate: failed login attempt', ['action' => 'login', 'username' => Strings::escapeTags($username), 'ip' => $_SERVER['REMOTE_ADDR']]); info('Login failed. Please check your credentials.' . EOL); $a->internalRedirect(); } @@ -159,17 +161,18 @@ class Login extends BaseModule } // if we haven't failed up this point, log them in. - $_SESSION['remember'] = $remember; - $_SESSION['last_login_date'] = DateTimeFormat::utcNow(); - Authentication::setAuthenticatedSessionForUser($record, true, true); + Session::set('remember', $remember); + Session::set('last_login_date', DateTimeFormat::utcNow()); - if (!empty($_SESSION['return_path'])) { - $return_path = $_SESSION['return_path']; - unset($_SESSION['return_path']); - } else { - $return_path = ''; + if (!empty($openid_identity) || !empty($openid_server)) { + DBA::update('user', ['openid' => $openid_identity, 'openidserver' => $openid_server], ['uid' => $record['uid']]); } + Session::setAuthenticatedForUser($a, $record, true, true); + + $return_path = Session::get('return_path', ''); + Session::remove('return_path'); + $a->internalRedirect($return_path); } @@ -187,7 +190,9 @@ class Login extends BaseModule $data = json_decode($_COOKIE["Friendica"]); if (isset($data->uid)) { - $user = DBA::selectFirst('user', [], + $user = DBA::selectFirst( + 'user', + [], [ 'uid' => $data->uid, 'blocked' => false, @@ -197,7 +202,10 @@ class Login extends BaseModule ] ); if (DBA::isResult($user)) { - if ($data->hash != Authentication::getCookieHashForUser($user)) { + if (!hash_equals( + Authentication::getCookieHashForUser($user), + $data->hash + )) { Logger::log("Hash for user " . $data->uid . " doesn't fit."); Authentication::deleteSession(); $a->internalRedirect(); @@ -211,7 +219,7 @@ class Login extends BaseModule // Do the authentification if not done by now if (!isset($_SESSION) || !isset($_SESSION['authenticated'])) { - Authentication::setAuthenticatedSessionForUser($user); + Session::setAuthenticatedForUser($a, $user); if (Config::get('system', 'paranoia')) { $_SESSION['addr'] = $data->ip; @@ -240,7 +248,9 @@ class Login extends BaseModule $a->internalRedirect(); } - $user = DBA::selectFirst('user', [], + $user = DBA::selectFirst( + 'user', + [], [ 'uid' => $_SESSION['uid'], 'blocked' => false, @@ -264,7 +274,8 @@ class Login extends BaseModule $_SESSION['last_login_date'] = DateTimeFormat::utcNow(); $login_refresh = true; } - Authentication::setAuthenticatedSessionForUser($user, false, false, $login_refresh); + + Session::setAuthenticatedForUser($a, $user, false, false, $login_refresh); } } } @@ -272,30 +283,38 @@ class Login extends BaseModule /** * @brief Wrapper for adding a login box. * - * @param string $return_path The path relative to the base the user should be sent - * back to after login completes - * @param bool $register If $register == true provide a registration link. - * This will most always depend on the value of config.register_policy. - * @param array $hiddens optional + * @param string $return_path The path relative to the base the user should be sent + * back to after login completes + * @param bool $register If $register == true provide a registration link. + * This will most always depend on the value of config.register_policy. + * @param array $hiddens optional * * @return string Returns the complete html for inserting into the page * + * @throws \Friendica\Network\HTTPException\InternalServerErrorException * @hooks 'login_hook' string $o */ public static function form($return_path = null, $register = false, $hiddens = []) { $a = self::getApp(); $o = ''; + + $noid = Config::get('system', 'no_openid'); + + if ($noid) { + Session::remove('openid_identity'); + Session::remove('openid_attributes'); + } + $reg = false; - if ($register) { + if ($register && intval($a->getConfig()->get('config', 'register_policy')) !== Register::CLOSED) { $reg = [ 'title' => L10n::t('Create a New Account'), - 'desc' => L10n::t('Register') + 'desc' => L10n::t('Register'), + 'url' => self::getRegisterURL() ]; } - $noid = Config::get('system', 'no_openid'); - if (is_null($return_path)) { $return_path = $a->query_string; } @@ -314,6 +333,18 @@ class Login extends BaseModule $_SESSION['return_path'] = $return_path; } + if (!empty(Session::get('openid_identity'))) { + $openid_title = L10n::t('Your OpenID: '); + $openid_readonly = true; + $identity = Session::get('openid_identity'); + $username_desc = L10n::t('Please enter your username and password to add the OpenID to your existing account.'); + } else { + $openid_title = L10n::t('Or login using OpenID: '); + $openid_readonly = false; + $identity = ''; + $username_desc = ''; + } + $o .= Renderer::replaceMacros( $tpl, [ @@ -321,12 +352,12 @@ class Login extends BaseModule '$logout' => L10n::t('Logout'), '$login' => L10n::t('Login'), - '$lname' => ['username', L10n::t('Nickname or Email: ') , '', ''], + '$lname' => ['username', L10n::t('Nickname or Email: '), '', $username_desc], '$lpassword' => ['password', L10n::t('Password: '), '', ''], '$lremember' => ['remember', L10n::t('Remember me'), 0, ''], '$openid' => !$noid, - '$lopenid' => ['openid_url', L10n::t('Or login using OpenID: '),'',''], + '$lopenid' => ['openid_url', $openid_title, $identity, '', $openid_readonly], '$hiddens' => $hiddens, @@ -343,8 +374,60 @@ class Login extends BaseModule ] ); - Addon::callHooks('login_hook', $o); + Hook::callAll('login_hook', $o); return $o; } + + /** + * Get the URL to the register page and add OpenID parameters to it + */ + private static function getRegisterURL() + { + if (empty(Session::get('openid_identity'))) { + return 'register'; + } + + $args = []; + $attr = Session::get('openid_attributes', []); + + if (is_array($attr) && count($attr)) { + foreach ($attr as $k => $v) { + if ($k === 'namePerson/friendly') { + $nick = Strings::escapeTags(trim($v)); + } + if ($k === 'namePerson/first') { + $first = Strings::escapeTags(trim($v)); + } + if ($k === 'namePerson') { + $args['username'] = Strings::escapeTags(trim($v)); + } + if ($k === 'contact/email') { + $args['email'] = Strings::escapeTags(trim($v)); + } + if ($k === 'media/image/aspect11') { + $photosq = bin2hex(trim($v)); + } + if ($k === 'media/image/default') { + $photo = bin2hex(trim($v)); + } + } + } + + if (!empty($nick)) { + $args['nickname'] = $nick; + } elseif (!empty($first)) { + $args['nickname'] = $first; + } + + if (!empty($photosq)) { + $args['photo'] = $photosq; + } elseif (!empty($photo)) { + $args['photo'] = $photo; + } + + $args['openid_url'] = Strings::escapeTags(trim(Session::get('openid_identity'))); + + return 'register?' . http_build_query($args); + } }