Version 5.0.0 beta 9
This commit is contained in:
1 parent
214f649f1d
commit
56979f8ee8
202 files changed
+4403
-1123
No files matched your search
@@ -238,45 +238,52 @@ class login extends Controller
|
||||
{
|
||||
Output::i()->redirect( Url::internal( 'app=core&module=system&controller=login', 'front', 'login' ) );
|
||||
}
|
||||
|
||||
$details = json_decode( $_SESSION['linkAccounts'], TRUE );
|
||||
$member = Member::load( $details['member'] );
|
||||
if ( !$member->member_id )
|
||||
{
|
||||
Output::i()->redirect( Url::internal( 'app=core&module=system&controller=login', 'front', 'login' ) );
|
||||
}
|
||||
|
||||
|
||||
/* And then handler to link with */
|
||||
$handler = Handler::load( $details['handler'] );
|
||||
|
||||
|
||||
/* Init reauthentication */
|
||||
$login = new LoginClass( Url::internal( 'app=core&module=system&controller=login&do=link', 'front', 'login' )->setQueryString( 'ref', isset( Request::i()->ref ) ? Request::i()->ref : NULL ), LoginClass::LOGIN_REAUTHENTICATE );
|
||||
$login->reauthenticateAs = $member;
|
||||
$error = NULL;
|
||||
|
||||
/* If successful (or if there's no way to reauthenticate which would only happen if a login handler has been deleted)) complete the link... */
|
||||
try
|
||||
|
||||
/* Did we submit the merge form? */
|
||||
if( isset( Request::i()->mergeAccount ) and Request::i()->mergeAccount )
|
||||
{
|
||||
if ( $success = $login->authenticate() or ( !count( $login->usernamePasswordMethods() ) and !count( $login->buttonMethods() ) ) )
|
||||
{
|
||||
$handler->completeLink( $member, $details['details'] );
|
||||
|
||||
unset( $_SESSION['linkAccounts'] );
|
||||
|
||||
$destination = Request::i()->referrer( FALSE, TRUE ) ?: Url::internal( '' );
|
||||
|
||||
$success = new Success( $member, $handler );
|
||||
if ( $success->mfa() )
|
||||
Session::i()->csrfCheck();
|
||||
|
||||
/* If successful (or if there's no way to reauthenticate which would only happen if a login handler has been deleted)) complete the link... */
|
||||
try
|
||||
{
|
||||
if ( $success = $login->authenticate() or ( !count( $login->usernamePasswordMethods() ) and !count( $login->buttonMethods() ) ) )
|
||||
{
|
||||
$_SESSION['processing2FA'] = array( 'memberId' => $success->member->member_id, 'anonymous' => $success->anonymous, 'remember' => $success->rememberMe, 'destination' => (string) $destination, 'handler' => $success->handler->id );
|
||||
Output::i()->redirect( $destination->setQueryString( '_mfaLogin', 1 ) );
|
||||
$handler->completeLink( $member, $details['details'] ?? null );
|
||||
|
||||
unset( $_SESSION['linkAccounts'] );
|
||||
|
||||
$destination = Request::i()->referrer( FALSE, TRUE ) ?: Url::internal( '' );
|
||||
|
||||
$success = new Success( $member, $handler );
|
||||
if ( $success->mfa() )
|
||||
{
|
||||
$_SESSION['processing2FA'] = array( 'memberId' => $success->member->member_id, 'anonymous' => $success->anonymous, 'remember' => $success->rememberMe, 'destination' => (string) $destination, 'handler' => $success->handler->id );
|
||||
Output::i()->redirect( $destination->setQueryString( '_mfaLogin', 1 ) );
|
||||
}
|
||||
$success->process();
|
||||
Output::i()->redirect( $destination->setQueryString( '_fromLogin', 1 ) );
|
||||
}
|
||||
$success->process();
|
||||
Output::i()->redirect( $destination->setQueryString( '_fromLogin', 1 ) );
|
||||
}
|
||||
}
|
||||
catch ( Exception $e )
|
||||
{
|
||||
$error = $e->getMessage();
|
||||
catch ( Exception $e )
|
||||
{
|
||||
$error = $e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
/* Otherwise show the reauthenticate form */
|
||||
|
||||
@@ -12,7 +12,6 @@ namespace IPS\core\modules\front\system;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
|
||||
use BadMethodCallException;
|
||||
use DateInterval;
|
||||
use DomainException;
|
||||
use Exception;
|
||||
@@ -24,7 +23,6 @@ use IPS\DateTime;
|
||||
use IPS\Db;
|
||||
use IPS\Dispatcher\Controller;
|
||||
use IPS\Email;
|
||||
use IPS\Events\Event;
|
||||
use IPS\Helpers\Form;
|
||||
use IPS\Helpers\Form\Captcha;
|
||||
use IPS\Helpers\Form\Checkbox;
|
||||
@@ -550,6 +548,12 @@ class register extends Controller
|
||||
}
|
||||
|
||||
$captcha = new Captcha;
|
||||
|
||||
/* If PBR request is from the last 5 minutes, don't ask for a captcha again */
|
||||
if( $postBeforeRegister !== NULL AND DateTime::ts( $postBeforeRegister['timestamp'] )->add( new \DateInterval('PT5M' ) )->getTimestamp() > time() )
|
||||
{
|
||||
$captcha = '';
|
||||
}
|
||||
|
||||
if ( (string) $captcha !== '' )
|
||||
{
|
||||
@@ -865,7 +869,7 @@ class register extends Controller
|
||||
$plainSecurityKey = Login::generateRandomString();
|
||||
Db::i()->update( 'core_validating', [ 'security_key' => Encrypt::fromPlaintext( $plainSecurityKey )->tag(), 'email_sent' => time() ], [ 'vid=?', $reg['vid'] ] );
|
||||
|
||||
Email::buildFromTemplate( 'core', $reg['email_chg'] ? 'email_change' : 'registration_validate', array( Member::loggedIn(), $reg['vid'], $plainSecurityKey ), Email::TYPE_TRANSACTIONAL )->send( Member::loggedIn() );
|
||||
Email::buildFromTemplate( 'core', $reg['email_chg'] ? 'email_change' : 'registration_validate', array( Member::loggedIn(), $reg['vid'], $plainSecurityKey, $reg['new_email'] ), Email::TYPE_TRANSACTIONAL )->send( Member::loggedIn() );
|
||||
}
|
||||
|
||||
Output::i()->redirect( Url::internal( 'app=core&module=system&controller=register&do=validating', 'front', 'register' ), 'reg_email_resent' );
|
||||
@@ -935,15 +939,15 @@ class register extends Controller
|
||||
}
|
||||
else
|
||||
{
|
||||
$oldEmail = $member->email;
|
||||
$member->changeEmail( $record['new_email'] );
|
||||
$member->members_bitoptions['validating'] = FALSE;
|
||||
$member->save();
|
||||
|
||||
Event::fire( 'onEmailChange', $member, array( $member->email, $record['prev_email'] ) );
|
||||
|
||||
Db::i()->delete( 'core_validating', array( 'member_id=?', $member->member_id ) );
|
||||
|
||||
/* Send a confirmation email */
|
||||
Email::buildFromTemplate( 'core', 'email_address_changed', array( $member, $record['prev_email'] ), Email::TYPE_TRANSACTIONAL )->send( $record['prev_email'], array(), array(), NULL, NULL, array( 'Reply-To' => Settings::i()->email_in ) );
|
||||
Email::buildFromTemplate( 'core', 'email_address_changed', array( $member, $oldEmail ), Email::TYPE_TRANSACTIONAL )->send( $oldEmail, array(), array(), NULL, NULL, array( 'Reply-To' => Settings::i()->email_in ) );
|
||||
}
|
||||
|
||||
/* Log in */
|
||||
@@ -1148,28 +1152,6 @@ class register extends Controller
|
||||
}
|
||||
}
|
||||
|
||||
/* Change the email */
|
||||
$oldEmail = Member::loggedIn()->email;
|
||||
Member::loggedIn()->email = $values['new_email'];
|
||||
Member::loggedIn()->save();
|
||||
foreach ( Login::methods() as $method )
|
||||
{
|
||||
try
|
||||
{
|
||||
$method->changeEmail( Member::loggedIn(), $oldEmail, $values['new_email'] );
|
||||
}
|
||||
catch( BadMethodCallException $e ) {}
|
||||
}
|
||||
|
||||
Member::loggedIn()->logHistory( 'core', 'email_change', array( 'old' => $oldEmail, 'new' => $values['new_email'], 'by' => 'manual' ) );
|
||||
|
||||
/* Invalidate sessions except this one */
|
||||
Member::loggedIn()->invalidateSessionsAndLogins( Session::i()->id );
|
||||
if( isset( Request::i()->cookie['login_key'] ) )
|
||||
{
|
||||
Device::loadOrCreate( Member::loggedIn() )->updateAfterAuthentication( TRUE );
|
||||
}
|
||||
|
||||
/* If email validation is required, do that... */
|
||||
if ( in_array( Settings::i()->reg_auth_type, array( 'user', 'admin_user' ) ) )
|
||||
{
|
||||
@@ -1191,14 +1173,34 @@ class register extends Controller
|
||||
'user_verified' => ( Settings::i()->reg_auth_type == 'admin' ),
|
||||
'ip_address' => Request::i()->ipAddress(),
|
||||
'email_sent' => time(),
|
||||
'security_key' => Encrypt::fromPlaintext( $plainSecurityKey )->tag()
|
||||
'security_key' => Encrypt::fromPlaintext( $plainSecurityKey )->tag(),
|
||||
'new_email' => $values['new_email']
|
||||
] );
|
||||
|
||||
Email::buildFromTemplate( 'core', $pending['email_chg'] ? 'email_change' : 'registration_validate', array( Member::loggedIn(), $vid, $plainSecurityKey ), Email::TYPE_TRANSACTIONAL )->send( Member::loggedIn() );
|
||||
|
||||
if( $pending['email_chg'] )
|
||||
{
|
||||
Email::buildFromTemplate( 'core', 'email_change', [ Member::loggedIn(), $vid, $plainSecurityKey, $values['new_email'] ], Email::TYPE_TRANSACTIONAL )->send( $values['new_email'], array(), array(), NULL, NULL, array( 'Reply-To' => Settings::i()->email_in ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
Email::buildFromTemplate( 'core', 'registration_validate', [ Member::loggedIn(), $vid, $plainSecurityKey, $values['new_email'] ], Email::TYPE_TRANSACTIONAL )->send( Member::loggedIn() );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Event::fire( 'onEmailChange', Member::loggedIn(), array( $values['new_email'], $oldEmail ) );
|
||||
/* If we don't need validation, just change it */
|
||||
$oldEmail = Member::loggedIn()->email;
|
||||
Member::loggedIn()->changeEmail( $values['new_email'] );
|
||||
|
||||
/* Invalidate sessions except this one */
|
||||
Member::loggedIn()->invalidateSessionsAndLogins( Session::i()->id );
|
||||
if( isset( Request::i()->cookie['login_key'] ) )
|
||||
{
|
||||
Device::loadOrCreate( Member::loggedIn() )->updateAfterAuthentication( TRUE );
|
||||
}
|
||||
|
||||
/* Send a confirmation email */
|
||||
Email::buildFromTemplate( 'core', 'email_address_changed', array( Member::loggedIn(), $oldEmail ), Email::TYPE_TRANSACTIONAL )->send( $oldEmail, array(), array(), NULL, NULL, array( 'Reply-To' => Settings::i()->email_in ) );
|
||||
}
|
||||
|
||||
/* Redirect */
|
||||
|
||||
@@ -23,7 +23,6 @@ use IPS\DateTime;
|
||||
use IPS\Db;
|
||||
use IPS\Dispatcher\Controller;
|
||||
use IPS\Email;
|
||||
use IPS\Events\Event;
|
||||
use IPS\Extensions\SSOAbstract;
|
||||
use IPS\File;
|
||||
use IPS\GeoLocation;
|
||||
@@ -432,44 +431,9 @@ class settings extends Controller
|
||||
|
||||
if ( !count( $login->buttonMethods() ) or $success = $login->authenticate() )
|
||||
{
|
||||
/* Disable syncing */
|
||||
$profileSync = Member::loggedIn()->profilesync;
|
||||
if ( isset( $profileSync['email'] ) )
|
||||
{
|
||||
unset( $profileSync['email'] );
|
||||
Member::loggedIn()->profilesync = $profileSync;
|
||||
Member::loggedIn()->save();
|
||||
}
|
||||
|
||||
/* Change the email */
|
||||
$oldEmail = Member::loggedIn()->email;
|
||||
Member::loggedIn()->email = $_SESSION['newEmail'];
|
||||
Member::loggedIn()->save();
|
||||
foreach ( Login::methods() as $method )
|
||||
{
|
||||
try
|
||||
{
|
||||
$method->changeEmail( Member::loggedIn(), $oldEmail, $_SESSION['newEmail'] );
|
||||
}
|
||||
catch( BadMethodCallException $e )
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
Member::loggedIn()->logHistory( 'core', 'email_change', array( 'old' => $oldEmail, 'new' => Member::loggedIn()->email, 'by' => 'manual' ) );
|
||||
|
||||
/* Invalidate sessions except this one */
|
||||
Member::loggedIn()->invalidateSessionsAndLogins( Session::i()->id );
|
||||
if( isset( Request::i()->cookie['login_key'] ) )
|
||||
{
|
||||
Device::loadOrCreate( Member::loggedIn() )->updateAfterAuthentication( TRUE );
|
||||
}
|
||||
|
||||
/* Send a validation email if we need to */
|
||||
if ( SettingsClass::i()->reg_auth_type == 'user' or SettingsClass::i()->reg_auth_type == 'admin_user' )
|
||||
{
|
||||
unset( $_SESSION['newEmail'] );
|
||||
|
||||
$vid = Login::generateRandomString();
|
||||
$plainSecurityKey = Login::generateRandomString();
|
||||
|
||||
@@ -479,7 +443,7 @@ class settings extends Controller
|
||||
'entry_date' => time(),
|
||||
'email_chg' => TRUE,
|
||||
'ip_address' => Request::i()->ipAddress(),
|
||||
'prev_email' => $oldEmail,
|
||||
'new_email' => $_SESSION['newEmail'],
|
||||
'email_sent' => time(),
|
||||
'security_key' => Encrypt::fromPlaintext( $plainSecurityKey )->tag()
|
||||
) );
|
||||
@@ -487,15 +451,26 @@ class settings extends Controller
|
||||
Member::loggedIn()->members_bitoptions['validating'] = TRUE;
|
||||
Member::loggedIn()->save();
|
||||
|
||||
Email::buildFromTemplate( 'core', 'email_change', array( Member::loggedIn(), $vid, $plainSecurityKey ), Email::TYPE_TRANSACTIONAL )->send( Member::loggedIn() );
|
||||
Email::buildFromTemplate( 'core', 'email_change', array( Member::loggedIn(), $vid, $plainSecurityKey, $_SESSION['newEmail'] ), Email::TYPE_TRANSACTIONAL )->send( $_SESSION['newEmail'], array(), array(), NULL, NULL, array( 'Reply-To' => SettingsClass::i()->email_in ) );
|
||||
|
||||
unset( $_SESSION['newEmail'] );
|
||||
|
||||
Output::i()->redirect( Url::internal( '' ) );
|
||||
}
|
||||
|
||||
/* Or just redirect */
|
||||
/* If we don't need validation, just change it */
|
||||
else
|
||||
{
|
||||
Event::fire( 'onEmailChange', Member::loggedIn(), array( $_SESSION['newEmail'], $oldEmail ) );
|
||||
$oldEmail = Member::loggedIn()->email;
|
||||
Member::loggedIn()->changeEmail( $_SESSION['newEmail'] );
|
||||
|
||||
/* Invalidate sessions except this one */
|
||||
Member::loggedIn()->invalidateSessionsAndLogins( Session::i()->id );
|
||||
if( isset( Request::i()->cookie['login_key'] ) )
|
||||
{
|
||||
Device::loadOrCreate( Member::loggedIn() )->updateAfterAuthentication( TRUE );
|
||||
}
|
||||
|
||||
unset( $_SESSION['newEmail'] );
|
||||
|
||||
/* Send a confirmation email */
|
||||
@@ -505,7 +480,7 @@ class settings extends Controller
|
||||
}
|
||||
}
|
||||
}
|
||||
catch ( LoginException|\Exception $e )
|
||||
catch ( LoginException|Exception $e )
|
||||
{
|
||||
$error = $e->getMessage();
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user