2008-06-18 06:26:38 +01:00
< ? php
/*
2009-08-25 23:14:12 +01:00
* StatusNet - the distributed open - source microblogging tool
2009-08-25 23:12:20 +01:00
* Copyright ( C ) 2008 , 2009 , StatusNet , Inc .
2008-06-18 06:26:38 +01:00
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation , either version 3 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 Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < http :// www . gnu . org / licenses />.
*/
2010-10-08 19:23:53 +01:00
if ( ! defined ( 'STATUSNET' )) {
exit ( 1 );
}
2008-06-18 06:26:38 +01:00
2009-08-04 12:45:16 +01:00
require_once INSTALLDIR . '/plugins/OpenID/openid.php' ;
2008-06-18 06:26:38 +01:00
2008-12-23 19:49:23 +00:00
class FinishopenidloginAction extends Action
{
2019-06-04 16:55:49 +01:00
public $error = null ;
public $username = null ;
public $message = null ;
2008-06-18 06:26:38 +01:00
2019-06-04 16:55:49 +01:00
public function handle ()
2008-12-23 19:33:23 +00:00
{
2016-06-01 03:05:11 +01:00
parent :: handle ();
2009-08-21 21:38:39 +01:00
if ( common_is_real_login ()) {
2010-04-30 22:07:19 +01:00
// TRANS: Client error message trying to log on with OpenID while already logged on.
2009-12-08 20:17:11 +00:00
$this -> clientError ( _m ( 'Already logged in.' ));
2019-06-04 16:55:49 +01:00
} elseif ( $_SERVER [ 'REQUEST_METHOD' ] == 'POST' ) {
2008-12-23 19:19:07 +00:00
$token = $this -> trimmed ( 'token' );
if ( ! $token || $token != common_session_token ()) {
2010-04-30 22:07:19 +01:00
// TRANS: Message given when there is a problem with the user's session token.
2009-12-08 20:17:11 +00:00
$this -> showForm ( _m ( 'There was a problem with your session token. Try again, please.' ));
2008-12-23 19:19:07 +00:00
return ;
}
if ( $this -> arg ( 'create' )) {
if ( ! $this -> boolean ( 'license' )) {
2010-04-30 22:07:19 +01:00
// TRANS: Message given if user does not agree with the site's license.
2019-06-04 16:55:49 +01:00
$this -> showForm (
_m ( 'You cannot register if you do not agree to the license.' ),
$this -> trimmed ( 'newname' )
);
2008-12-23 19:19:07 +00:00
return ;
}
2009-01-22 23:30:57 +00:00
$this -> createNewUser ();
2019-06-04 16:55:49 +01:00
} elseif ( $this -> arg ( 'connect' )) {
2009-01-22 23:30:57 +00:00
$this -> connectUser ();
2008-12-23 19:19:07 +00:00
} else {
2010-04-30 22:07:19 +01:00
// TRANS: Messag given on an unknown error.
2019-06-04 16:55:49 +01:00
$this -> showForm (
_m ( 'An unknown error has occured.' ),
$this -> trimmed ( 'newname' )
);
2008-12-23 19:19:07 +00:00
}
} else {
2009-01-22 23:30:57 +00:00
$this -> tryLogin ();
2008-12-23 19:19:07 +00:00
}
}
2019-06-04 16:55:49 +01:00
public function showPageNotice ()
2008-12-23 19:33:23 +00:00
{
2009-01-22 23:30:57 +00:00
if ( $this -> error ) {
2019-06-04 16:55:49 +01:00
$this -> element ( 'div' , [ 'class' => 'error' ], $this -> error );
2008-12-23 19:19:07 +00:00
} else {
2009-01-15 22:57:15 +00:00
$this -> element ( 'div' , 'instructions' ,
2010-04-30 22:07:19 +01:00
// TRANS: Instructions given after a first successful logon using OpenID.
// TRANS: %s is the site name.
2011-04-27 19:37:44 +01:00
sprintf ( _m ( 'This is the first time you have logged into %s so we must connect your OpenID to a local account. You can either create a new account, or connect with your existing account, if you have one.' ), common_config ( 'site' , 'name' )));
2008-12-23 19:19:07 +00:00
}
}
2019-06-04 16:55:49 +01:00
public function title ()
2008-12-23 19:33:23 +00:00
{
2010-04-30 22:07:19 +01:00
// TRANS: Title
2019-06-04 16:55:49 +01:00
return _m ( 'TITLE' , 'OpenID Account Setup' );
2009-01-22 23:30:57 +00:00
}
2019-06-04 16:55:49 +01:00
public function showForm ( $error = null , $username = null )
2009-01-22 23:30:57 +00:00
{
$this -> error = $error ;
$this -> username = $username ;
$this -> showPage ();
}
2010-04-09 18:11:11 +01:00
/**
* @ fixme much of this duplicates core code , which is very fragile .
* Should probably be replaced with an extensible mini version of
* the core registration form .
*/
2019-06-04 16:55:49 +01:00
public function showContent ()
2009-01-22 23:30:57 +00:00
{
2009-02-18 04:22:56 +00:00
if ( ! empty ( $this -> message_text )) {
2019-06-04 16:55:49 +01:00
$this -> element ( 'div' , [ 'class' => 'error' ], $this -> message_text );
2009-01-22 23:30:57 +00:00
return ;
}
2008-12-23 19:19:07 +00:00
2010-12-01 20:21:00 +00:00
// We don't recognize this OpenID, so we're going to give the user
// two options, each in its own mini-form.
//
// First, they can create a new account using their OpenID auth
// info. The profile will be pre-populated with whatever name,
// email, and location we can get from the OpenID provider, so
// all we ask for is the license confirmation.
2019-06-04 16:55:49 +01:00
$this -> elementStart ( 'form' , [ 'method' => 'post' ,
'id' => 'account_create' ,
'class' => 'form_settings' ,
'action' => common_local_url ( 'finishopenidlogin' )]);
2009-01-15 22:57:15 +00:00
$this -> hidden ( 'token' , common_session_token ());
2019-06-04 16:55:49 +01:00
$this -> elementStart ( 'fieldset' , [ 'id' => 'form_openid_createaccount' ]);
2009-11-20 05:48:05 +00:00
$this -> element ( 'legend' , null ,
2011-04-27 19:37:44 +01:00
// TRANS: Fieldset legend.
2009-12-08 20:17:11 +00:00
_m ( 'Create new account' ));
2009-01-15 22:57:15 +00:00
$this -> element ( 'p' , null ,
2011-04-27 19:37:44 +01:00
// TRANS: Form guide.
2009-12-08 20:17:11 +00:00
_m ( 'Create a new user with this nickname.' ));
2009-11-20 05:48:05 +00:00
$this -> elementStart ( 'ul' , 'form_data' );
2011-01-20 23:40:59 +00:00
// Hook point for captcha etc
2019-06-04 16:55:49 +01:00
Event :: handle ( 'StartRegistrationFormData' , [ $this ]);
2011-01-20 23:40:59 +00:00
2009-11-20 05:48:05 +00:00
$this -> elementStart ( 'li' );
2011-04-27 19:37:44 +01:00
// TRANS: Field label.
2019-06-04 16:55:49 +01:00
$this -> input ( 'newname' ,
_m ( 'New nickname' ),
2009-01-22 23:30:57 +00:00
( $this -> username ) ? $this -> username : '' ,
2011-04-27 19:37:44 +01:00
// TRANS: Field title.
2011-03-30 21:30:23 +01:00
_m ( '1-64 lowercase letters or numbers, no punctuation or spaces.' ));
2009-11-20 05:48:05 +00:00
$this -> elementEnd ( 'li' );
2011-01-21 00:56:48 +00:00
$this -> elementStart ( 'li' );
2011-04-27 19:37:44 +01:00
// TRANS: Field label.
2019-06-04 16:55:49 +01:00
$this -> input ( 'email' , _m ( 'Email' ),
$this -> getEmail (),
2011-04-27 19:37:44 +01:00
// TRANS: Field title.
2011-03-30 21:30:23 +01:00
_m ( 'Used only for updates, announcements, ' .
2019-06-04 16:55:49 +01:00
'and password recovery.' ));
2011-01-21 00:56:48 +00:00
$this -> elementEnd ( 'li' );
2011-01-20 23:40:59 +00:00
// Hook point for captcha etc
2019-06-04 16:55:49 +01:00
Event :: handle ( 'EndRegistrationFormData' , [ $this ]);
2011-01-20 23:40:59 +00:00
2009-11-20 05:48:05 +00:00
$this -> elementStart ( 'li' );
2019-06-04 16:55:49 +01:00
$this -> element ( 'input' , [ 'type' => 'checkbox' ,
'id' => 'license' ,
'class' => 'checkbox' ,
'name' => 'license' ,
'value' => 'true' ]);
$this -> elementStart ( 'label' , [ 'for' => 'license' ,
'class' => 'checkbox' ]);
2010-04-30 22:07:19 +01:00
// TRANS: OpenID plugin link text.
2011-04-27 19:37:44 +01:00
// TRANS: %s is a link to a license with the license name as link text.
2011-03-30 21:30:23 +01:00
$message = _m ( 'My text and files are available under %s ' .
2019-06-04 16:55:49 +01:00
'except this private data: password, ' .
'email address, IM address, and phone number.' );
2010-04-09 18:11:11 +01:00
$link = '<a href="' .
htmlspecialchars ( common_config ( 'license' , 'url' )) .
'">' .
htmlspecialchars ( common_config ( 'license' , 'title' )) .
'</a>' ;
$this -> raw ( sprintf ( htmlspecialchars ( $message ), $link ));
2009-11-20 05:48:05 +00:00
$this -> elementEnd ( 'label' );
$this -> elementEnd ( 'li' );
$this -> elementEnd ( 'ul' );
2010-04-30 22:07:19 +01:00
// TRANS: Button label in form in which to create a new user on the site for an OpenID.
$this -> submit ( 'create' , _m ( 'BUTTON' , 'Create' ));
2009-11-20 05:48:05 +00:00
$this -> elementEnd ( 'fieldset' );
2010-12-01 20:21:00 +00:00
$this -> elementEnd ( 'form' );
2009-11-20 05:48:05 +00:00
2010-12-01 20:21:00 +00:00
// The second option is to attach this OpenID to an existing account
// on the local system, which they need to provide a password for.
2019-06-04 16:55:49 +01:00
$this -> elementStart ( 'form' , [ 'method' => 'post' ,
'id' => 'account_connect' ,
'class' => 'form_settings' ,
'action' => common_local_url ( 'finishopenidlogin' )]);
2010-12-01 20:21:00 +00:00
$this -> hidden ( 'token' , common_session_token ());
2019-06-04 16:55:49 +01:00
$this -> elementStart ( 'fieldset' , [ 'id' => 'form_openid_createaccount' ]);
2009-11-20 05:48:05 +00:00
$this -> element ( 'legend' , null ,
2010-04-30 22:07:19 +01:00
// TRANS: Used as form legend for form in which to connect an OpenID to an existing user on the site.
2009-12-08 20:17:11 +00:00
_m ( 'Connect existing account' ));
2009-01-15 22:57:15 +00:00
$this -> element ( 'p' , null ,
2010-04-30 22:07:19 +01:00
// TRANS: User instructions for form in which to connect an OpenID to an existing user on the site.
2009-12-08 20:17:11 +00:00
_m ( 'If you already have an account, login with your username and password to connect it to your OpenID.' ));
2009-11-20 05:48:05 +00:00
$this -> elementStart ( 'ul' , 'form_data' );
$this -> elementStart ( 'li' );
2010-04-30 22:07:19 +01:00
// TRANS: Field label in form in which to connect an OpenID to an existing user on the site.
2009-12-08 20:17:11 +00:00
$this -> input ( 'nickname' , _m ( 'Existing nickname' ));
2009-11-20 05:48:05 +00:00
$this -> elementEnd ( 'li' );
$this -> elementStart ( 'li' );
2010-04-30 22:07:19 +01:00
// TRANS: Field label in form in which to connect an OpenID to an existing user on the site.
2009-12-08 20:17:11 +00:00
$this -> password ( 'password' , _m ( 'Password' ));
2009-11-20 05:48:05 +00:00
$this -> elementEnd ( 'li' );
2019-06-04 16:55:49 +01:00
$this -> elementStart ( 'li' );
// TRANS: Field label in form in which to connect an OpenID to an existing user on the site.
2019-06-10 14:55:38 +01:00
$this -> checkbox ( 'openid-synch' , _m ( 'Synchronize Account' ), false ,
_m ( 'Synchronize GNU social profile with this OpenID identity.' ));
2019-06-04 16:55:49 +01:00
$this -> elementEnd ( 'li' );
2009-11-20 05:48:05 +00:00
$this -> elementEnd ( 'ul' );
2011-04-27 19:37:44 +01:00
// TRANS: Button text in form in which to connect an OpenID to an existing user on the site.
2010-04-30 22:07:19 +01:00
$this -> submit ( 'connect' , _m ( 'BUTTON' , 'Connect' ));
2009-11-20 05:48:05 +00:00
$this -> elementEnd ( 'fieldset' );
2009-01-15 22:57:15 +00:00
$this -> elementEnd ( 'form' );
2008-12-23 19:19:07 +00:00
}
2011-01-21 00:56:48 +00:00
/**
* Get specified e - mail from the form , or the OpenID sreg info , or the
* invite code .
*
* @ return string
*/
2019-06-04 16:55:49 +01:00
public function getEmail ()
2011-01-21 00:56:48 +00:00
{
$email = $this -> trimmed ( 'email' );
if ( ! empty ( $email )) {
return $email ;
}
// Pull from openid thingy
list ( $display , $canonical , $sreg ) = $this -> getSavedValues ();
if ( ! empty ( $sreg [ 'email' ])) {
return $sreg [ 'email' ];
}
// Terrible hack for invites...
if ( common_config ( 'site' , 'inviteonly' )) {
$code = $_SESSION [ 'invitecode' ];
if ( $code ) {
2013-08-18 12:04:58 +01:00
$invite = Invitation :: getKV ( $code );
2011-01-21 00:56:48 +00:00
if ( $invite && $invite -> address_type == 'email' ) {
return $invite -> address ;
}
}
}
return '' ;
}
2019-06-04 16:55:49 +01:00
public function tryLogin ()
2008-12-23 19:33:23 +00:00
{
2008-12-23 19:19:07 +00:00
$consumer = oid_consumer ();
$response = $consumer -> complete ( common_local_url ( 'finishopenidlogin' ));
if ( $response -> status == Auth_OpenID_CANCEL ) {
2010-04-30 22:07:19 +01:00
// TRANS: Status message in case the response from the OpenID provider is that the logon attempt was cancelled.
2009-12-08 20:17:11 +00:00
$this -> message ( _m ( 'OpenID authentication cancelled.' ));
2008-12-23 19:19:07 +00:00
return ;
2019-06-04 16:55:49 +01:00
} elseif ( $response -> status == Auth_OpenID_FAILURE ) {
2010-04-30 22:07:19 +01:00
// TRANS: OpenID authentication failed; display the error message. %s is the error message.
2011-04-27 19:37:44 +01:00
$this -> message ( sprintf ( _m ( 'OpenID authentication failed: %s.' ), $response -> message ));
2019-06-04 16:55:49 +01:00
} elseif ( $response -> status == Auth_OpenID_SUCCESS ) {
2008-12-23 19:19:07 +00:00
// This means the authentication succeeded; extract the
// identity URL and Simple Registration data (if it was
// returned).
$display = $response -> getDisplayIdentifier ();
$canonical = ( $response -> endpoint -> canonicalID ) ?
$response -> endpoint -> canonicalID : $response -> getDisplayIdentifier ();
2010-03-25 20:58:05 +00:00
oid_assert_allowed ( $display );
oid_assert_allowed ( $canonical );
2008-12-23 19:19:07 +00:00
$sreg_resp = Auth_OpenID_SRegResponse :: fromSuccessResponse ( $response );
if ( $sreg_resp ) {
$sreg = $sreg_resp -> contents ();
}
2010-05-18 18:39:56 +01:00
// Launchpad teams extension
if ( ! oid_check_teams ( $response )) {
2011-04-27 19:37:44 +01:00
// TRANS: Message displayed when OpenID authentication is aborted.
$this -> message ( _m ( 'OpenID authentication aborted: You are not allowed to login to this site.' ));
2010-05-18 18:39:56 +01:00
return ;
}
2008-12-23 19:19:07 +00:00
$user = oid_get_user ( $canonical );
if ( $user ) {
oid_set_last ( $display );
2011-03-22 15:54:23 +00:00
// XXX: commented out at @edd's request until better
// control over how data flows from OpenID provider.
// oid_update_user($user, $sreg);
2008-12-23 19:19:07 +00:00
common_set_user ( $user );
common_real_login ( true );
if ( isset ( $_SESSION [ 'openid_rememberme' ]) && $_SESSION [ 'openid_rememberme' ]) {
common_rememberme ( $user );
}
2008-12-09 18:03:30 +00:00
unset ( $_SESSION [ 'openid_rememberme' ]);
2009-01-22 23:30:57 +00:00
$this -> goHome ( $user -> nickname );
2008-12-23 19:19:07 +00:00
} else {
2009-01-22 23:30:57 +00:00
$this -> saveValues ( $display , $canonical , $sreg );
$this -> showForm ( null , $this -> bestNewNickname ( $display , $sreg ));
2008-12-23 19:19:07 +00:00
}
}
}
2019-06-04 16:55:49 +01:00
public function message ( $msg )
2008-12-23 19:33:23 +00:00
{
2009-01-22 23:30:57 +00:00
$this -> message_text = $msg ;
$this -> showPage ();
2008-12-23 19:19:07 +00:00
}
2019-06-04 16:55:49 +01:00
public function saveValues ( $display , $canonical , $sreg )
2008-12-23 19:33:23 +00:00
{
2008-12-23 19:19:07 +00:00
common_ensure_session ();
$_SESSION [ 'openid_display' ] = $display ;
$_SESSION [ 'openid_canonical' ] = $canonical ;
$_SESSION [ 'openid_sreg' ] = $sreg ;
}
2019-06-04 16:55:49 +01:00
public function getSavedValues ()
2008-12-23 19:33:23 +00:00
{
2019-06-04 16:55:49 +01:00
return [ $_SESSION [ 'openid_display' ],
$_SESSION [ 'openid_canonical' ],
$_SESSION [ 'openid_sreg' ]];
2008-12-23 19:19:07 +00:00
}
2019-06-04 16:55:49 +01:00
public function createNewUser ()
2008-12-23 19:33:23 +00:00
{
2011-03-22 15:54:23 +00:00
// FIXME: save invite code before redirect, and check here
2008-12-03 18:50:22 +00:00
2019-06-04 16:55:49 +01:00
if ( ! Event :: handle ( 'StartRegistrationTry' , [ $this ])) {
2011-01-05 20:26:20 +00:00
return ;
}
2009-04-17 20:52:26 +01:00
if ( common_config ( 'site' , 'closed' )) {
2010-04-30 22:07:19 +01:00
// TRANS: OpenID plugin message. No new user registration is allowed on the site.
2009-12-08 20:17:11 +00:00
$this -> clientError ( _m ( 'Registration not allowed.' ));
2008-12-03 18:50:22 +00:00
}
2009-04-17 20:52:26 +01:00
$invite = null ;
if ( common_config ( 'site' , 'inviteonly' )) {
$code = $_SESSION [ 'invitecode' ];
if ( empty ( $code )) {
2010-04-30 22:07:19 +01:00
// TRANS: OpenID plugin message. No new user registration is allowed on the site without an invitation code, and none was provided.
2009-12-08 20:17:11 +00:00
$this -> clientError ( _m ( 'Registration not allowed.' ));
2009-04-17 20:52:26 +01:00
}
2013-08-18 12:04:58 +01:00
$invite = Invitation :: getKV ( $code );
2009-04-17 20:52:26 +01:00
if ( empty ( $invite )) {
2010-04-30 22:07:19 +01:00
// TRANS: OpenID plugin message. No new user registration is allowed on the site without an invitation code, and the one provided was not valid.
2009-12-08 20:17:11 +00:00
$this -> clientError ( _m ( 'Not a valid invitation code.' ));
2009-04-17 20:52:26 +01:00
}
}
2010-11-29 22:15:25 +00:00
try {
2013-10-16 13:58:22 +01:00
$nickname = Nickname :: normalize ( $this -> trimmed ( 'newname' ), true );
2010-11-29 22:15:25 +00:00
} catch ( NicknameException $e ) {
$this -> showForm ( $e -> getMessage ());
2008-12-23 19:19:07 +00:00
return ;
}
2008-06-22 19:04:37 +01:00
2009-01-22 23:30:57 +00:00
list ( $display , $canonical , $sreg ) = $this -> getSavedValues ();
2008-07-02 14:15:07 +01:00
2008-12-23 19:19:07 +00:00
if ( ! $display || ! $canonical ) {
2010-04-30 22:07:19 +01:00
// TRANS: OpenID plugin server error. A stored OpenID cannot be retrieved.
2009-12-08 20:17:11 +00:00
$this -> serverError ( _m ( 'Stored OpenID not found.' ));
2008-12-23 19:19:07 +00:00
}
2008-07-02 14:15:07 +01:00
2011-03-22 15:54:23 +00:00
// Possible race condition... let's be paranoid
2008-07-02 14:15:07 +01:00
2008-12-23 19:19:07 +00:00
$other = oid_get_user ( $canonical );
2008-07-02 14:15:07 +01:00
2008-12-23 19:19:07 +00:00
if ( $other ) {
2010-04-30 22:07:19 +01:00
// TRANS: OpenID plugin server error.
2009-12-08 20:17:11 +00:00
$this -> serverError ( _m ( 'Creating new account for OpenID that already has a user.' ));
2008-12-23 19:19:07 +00:00
}
2008-07-02 14:15:07 +01:00
2019-06-04 16:55:49 +01:00
Event :: handle ( 'StartOpenIDCreateNewUser' , [ $canonical , & $sreg ]);
2010-05-20 20:21:29 +01:00
2009-02-18 04:22:56 +00:00
$location = '' ;
if ( ! empty ( $sreg [ 'country' ])) {
2008-12-23 19:19:07 +00:00
if ( $sreg [ 'postcode' ]) {
2011-03-22 15:54:23 +00:00
// XXX: use postcode to get city and region
// XXX: also, store postcode somewhere -- it's valuable!
2008-12-23 19:19:07 +00:00
$location = $sreg [ 'postcode' ] . ', ' . $sreg [ 'country' ];
} else {
$location = $sreg [ 'country' ];
}
}
2008-12-10 01:46:19 +00:00
2009-02-18 04:22:56 +00:00
if ( ! empty ( $sreg [ 'fullname' ]) && mb_strlen ( $sreg [ 'fullname' ]) <= 255 ) {
2008-12-23 19:19:07 +00:00
$fullname = $sreg [ 'fullname' ];
2009-02-18 04:22:56 +00:00
} else {
$fullname = '' ;
2008-12-23 19:19:07 +00:00
}
2008-12-10 01:46:19 +00:00
2011-01-21 00:56:48 +00:00
$email = $this -> getEmail ();
2008-07-02 14:15:07 +01:00
2011-03-22 15:54:23 +00:00
// XXX: add language
// XXX: add timezone
2008-12-10 01:46:19 +00:00
2019-06-04 16:55:49 +01:00
$args = [ 'nickname' => $nickname ,
'email' => $email ,
'fullname' => $fullname ,
'location' => $location ];
2009-04-17 20:52:26 +01:00
if ( ! empty ( $invite )) {
$args [ 'code' ] = $invite -> code ;
}
$user = User :: register ( $args );
2008-06-18 06:26:38 +01:00
2008-12-23 19:19:07 +00:00
$result = oid_link_user ( $user -> id , $canonical , $display );
2008-12-10 01:46:19 +00:00
2019-06-04 16:55:49 +01:00
Event :: handle ( 'EndOpenIDCreateNewUser' , [ $user , $canonical , $sreg ]);
2010-05-20 20:21:29 +01:00
2008-12-23 19:19:07 +00:00
oid_set_last ( $display );
common_set_user ( $user );
common_real_login ( true );
2008-12-09 18:03:30 +00:00
if ( isset ( $_SESSION [ 'openid_rememberme' ]) && $_SESSION [ 'openid_rememberme' ]) {
2008-12-23 19:19:07 +00:00
common_rememberme ( $user );
}
2008-12-09 18:03:30 +00:00
unset ( $_SESSION [ 'openid_rememberme' ]);
2011-01-05 20:26:20 +00:00
2019-06-04 16:55:49 +01:00
Event :: handle ( 'EndRegistrationTry' , [ $this ]);
2011-01-05 20:26:20 +00:00
2019-06-04 16:55:49 +01:00
common_redirect ( common_local_url ( 'showstream' , [ 'nickname' => $user -> nickname ]), 303 );
2008-12-23 19:19:07 +00:00
}
2008-07-02 14:15:07 +01:00
2019-06-04 16:55:49 +01:00
public function connectUser ()
2008-12-23 19:33:23 +00:00
{
2008-12-23 19:19:07 +00:00
$nickname = $this -> trimmed ( 'nickname' );
$password = $this -> trimmed ( 'password' );
2019-06-10 14:55:38 +01:00
$synch = $this -> boolean ( 'openid-synch' );
2008-12-23 19:19:07 +00:00
if ( ! common_check_user ( $nickname , $password )) {
2010-04-30 22:07:19 +01:00
// TRANS: OpenID plugin message.
2009-12-08 20:17:11 +00:00
$this -> showForm ( _m ( 'Invalid username or password.' ));
2008-12-23 19:19:07 +00:00
return ;
}
2008-06-18 06:26:38 +01:00
2011-03-22 15:54:23 +00:00
// They're legit!
2008-07-02 14:15:07 +01:00
2013-08-18 12:04:58 +01:00
$user = User :: getKV ( 'nickname' , $nickname );
2008-06-18 06:26:38 +01:00
2009-01-22 23:30:57 +00:00
list ( $display , $canonical , $sreg ) = $this -> getSavedValues ();
2008-06-18 06:26:38 +01:00
2008-12-23 19:19:07 +00:00
if ( ! $display || ! $canonical ) {
2010-04-30 22:07:19 +01:00
// TRANS: OpenID plugin server error. A stored OpenID cannot be found.
2009-12-08 20:17:11 +00:00
$this -> serverError ( _m ( 'Stored OpenID not found.' ));
2008-12-23 19:19:07 +00:00
}
2008-07-02 14:15:07 +01:00
2008-12-23 19:19:07 +00:00
$result = oid_link_user ( $user -> id , $canonical , $display );
2008-07-02 14:15:07 +01:00
2008-12-23 19:19:07 +00:00
if ( ! $result ) {
2010-04-30 22:07:19 +01:00
// TRANS: OpenID plugin server error. The user or user profile could not be saved.
2009-12-08 20:17:11 +00:00
$this -> serverError ( _m ( 'Error connecting user to OpenID.' ));
2008-12-23 19:19:07 +00:00
}
2008-07-02 14:15:07 +01:00
2019-06-10 14:55:38 +01:00
if ( $synch ) {
2019-06-04 16:55:49 +01:00
if ( Event :: handle ( 'StartOpenIDUpdateUser' , [ $user , $canonical , & $sreg ])) {
oid_update_user ( $user , $sreg );
}
Event :: handle ( 'EndOpenIDUpdateUser' , [ $user , $canonical , $sreg ]);
2010-05-20 20:21:29 +01:00
}
2008-12-23 19:19:07 +00:00
oid_set_last ( $display );
common_set_user ( $user );
common_real_login ( true );
2008-12-09 18:03:30 +00:00
if ( isset ( $_SESSION [ 'openid_rememberme' ]) && $_SESSION [ 'openid_rememberme' ]) {
2008-12-23 19:19:07 +00:00
common_rememberme ( $user );
}
unset ( $_SESSION [ 'openid_rememberme' ]);
2009-01-22 23:30:57 +00:00
$this -> goHome ( $user -> nickname );
2008-12-23 19:19:07 +00:00
}
2019-06-04 16:55:49 +01:00
public function goHome ( $nickname )
2008-12-23 19:33:23 +00:00
{
2008-12-23 19:19:07 +00:00
$url = common_get_returnto ();
if ( $url ) {
2011-03-22 15:54:23 +00:00
// We don't have to return to it again
2008-12-23 19:21:29 +00:00
common_set_returnto ( null );
2019-06-04 16:55:49 +01:00
$url = common_inject_session ( $url );
2008-12-23 19:19:07 +00:00
} else {
2019-06-04 16:55:49 +01:00
$url = common_local_url ( 'all' , [ 'nickname' => $nickname ]);
2008-12-23 19:19:07 +00:00
}
2009-04-01 20:30:59 +01:00
common_redirect ( $url , 303 );
2008-12-23 19:19:07 +00:00
}
2019-06-04 16:55:49 +01:00
public function bestNewNickname ( $display , $sreg )
2008-12-23 19:33:23 +00:00
{
2011-03-22 15:54:23 +00:00
// Try the passed-in nickname
2008-12-23 19:19:07 +00:00
2009-02-18 04:22:56 +00:00
if ( ! empty ( $sreg [ 'nickname' ])) {
2013-10-16 13:58:22 +01:00
$nickname = common_nicknamize ( $sreg [ 'nickname' ]);
if ( Nickname :: isValid ( $nickname , true )) {
2008-12-23 19:19:07 +00:00
return $nickname ;
}
}
2011-03-22 15:54:23 +00:00
// Try the full name
2008-12-23 19:19:07 +00:00
2009-02-18 04:22:56 +00:00
if ( ! empty ( $sreg [ 'fullname' ])) {
2013-10-16 13:58:22 +01:00
$fullname = common_nicknamize ( $sreg [ 'fullname' ]);
if ( Nickname :: isValid ( $fullname , true )) {
2008-12-23 19:19:07 +00:00
return $fullname ;
}
}
2011-03-22 15:54:23 +00:00
// Try the URL
2008-12-23 19:19:07 +00:00
2009-01-22 23:30:57 +00:00
$from_url = $this -> openidToNickname ( $display );
2008-12-23 19:19:07 +00:00
2013-10-16 13:58:22 +01:00
if ( $from_url && Nickname :: isValid ( $from_url , true )) {
2008-12-23 19:19:07 +00:00
return $from_url ;
}
2011-03-22 15:54:23 +00:00
// XXX: others?
2008-12-23 19:19:07 +00:00
2008-12-23 19:21:29 +00:00
return null ;
2008-12-23 19:19:07 +00:00
}
2019-06-04 16:55:49 +01:00
public function openidToNickname ( $openid )
2008-12-23 19:33:23 +00:00
{
2008-06-18 06:26:38 +01:00
if ( Auth_Yadis_identifierScheme ( $openid ) == 'XRI' ) {
2009-01-22 23:30:57 +00:00
return $this -> xriToNickname ( $openid );
2008-12-23 19:19:07 +00:00
} else {
2009-01-22 23:30:57 +00:00
return $this -> urlToNickname ( $openid );
2008-12-23 19:19:07 +00:00
}
}
2008-06-18 06:26:38 +01:00
2011-03-22 15:54:23 +00:00
// We try to use an OpenID URL as a legal StatusNet user name in this order
// 1. Plain hostname, like http://evanp.myopenid.com/
// 2. One element in path, like http://profile.typekey.com/EvanProdromou/
// or http://getopenid.com/evanprodromou
2019-06-04 16:55:49 +01:00
public function urlToNickname ( $openid )
2008-12-23 19:33:23 +00:00
{
2010-02-16 16:06:10 +00:00
return common_url_to_nickname ( $openid );
2008-12-23 19:19:07 +00:00
}
2019-06-04 16:55:49 +01:00
public function xriToNickname ( $xri )
2008-12-23 19:33:23 +00:00
{
2009-01-22 23:30:57 +00:00
$base = $this -> xriBase ( $xri );
2008-12-23 19:19:07 +00:00
if ( ! $base ) {
2008-12-23 19:21:29 +00:00
return null ;
2008-12-23 19:19:07 +00:00
} else {
2011-03-22 15:54:23 +00:00
// =evan.prodromou
// or @gratis*evan.prodromou
2008-12-23 19:19:07 +00:00
$parts = explode ( '*' , substr ( $base , 1 ));
2013-10-16 13:58:22 +01:00
return common_nicknamize ( array_pop ( $parts ));
2008-12-23 19:19:07 +00:00
}
}
2019-06-04 16:55:49 +01:00
public function xriBase ( $xri )
2008-12-23 19:33:23 +00:00
{
2008-12-23 19:19:07 +00:00
if ( substr ( $xri , 0 , 6 ) == 'xri://' ) {
return substr ( $xri , 6 );
} else {
return $xri ;
}
}
2008-06-18 06:26:38 +01:00
}