#99: Email address can now be changed and confirmed with registration

This commit is contained in:
Andy Heathershaw 2018-09-12 17:08:27 +01:00
parent 5a04247621
commit 2e0e98810a
6 changed files with 88 additions and 11 deletions

View File

@ -18,31 +18,78 @@ use Symfony\Component\HttpFoundation\Request;
class UserController extends Controller
{
public function confirmEmailChangeState(Request $request)
{
$user = $this->getUser();
if (!$user->is_email_change_in_progress)
{
return redirect(route('userSettings'));
}
// Update the e-mail address
$user->email = $user->new_email_address;
// Reset the e-mail change state
$user->is_email_change_in_progress = false;
$user->new_email_address = null;
$user->save();
$request->session()->flash('success', trans('auth.change_email_success_message'));
return redirect(route('userSettings'));
}
public function resetEmailChangeState(Request $request)
{
$user = $this->getUser();
if (!$user->is_email_change_in_progress)
{
return redirect(route('userSettings'));
}
$data = $request->all();
if (isset($data['resend_email']))
{
$this->sendEmailChangeConfirmationEmail($user, $user->new_email_address);
$request->session()->flash('info', trans('auth.change_email_required_message'));
}
if (isset($data['cancel_change']))
{
$user->is_email_change_in_progress = false;
$user->new_email_address = null;
$user->save();
}
return redirect(route('userSettings'));
}
public function saveSettings(SaveUserSettingsRequest $request)
{
$data = $request->only(['name', 'email', 'profile_alias', 'enable_profile_page']);
$user = $this->getUser();
if (UserConfig::get('require_email_verification'))
if (
UserConfig::get('require_email_verification') &&
isset($data['email']) &&
$data['email'] != $user->email &&
!$user->is_email_change_in_progress
)
{
// Can't update the e-mail directly until the new e-mail address has been verified.
// TODO - send e-mail and handle response, flag e-mail as being "change in-progress"
// Send activation e-mail
// Temporarily change the e-mail address so we can send the activation message
$oldEmailAddress = $user->getEmailForPasswordReset();
$user->email = $data['email'];
Mail::to($this->getUser())->send(new UserChangeEmailRequired($this->getUser()));
$this->sendEmailChangeConfirmationEmail($user, $data['email']);
$request->session()->flash('info', trans('auth.change_email_required_message'));
// Flag the user as a change e-mail in progress
$user->new_email_address = $user->email;
$user->new_email_address = $data['email'];
$user->is_email_change_in_progress = true;
$user->email = $oldEmailAddress;
$user->save();
unset($data['email']);
$request->session()->flash('info', trans('auth.change_email_required_message'));
}
// Don't allow e-mail address to be changed if a change is in progress
@ -252,4 +299,13 @@ class UserController extends Controller
return $results;
}
private function sendEmailChangeConfirmationEmail(User $user, $newEmailAddress)
{
$oldEmailAddress = $user->email;
$user->email = $newEmailAddress;
Mail::to($user)->send(new UserChangeEmailRequired($user));
$user->email = $oldEmailAddress;
}
}

View File

@ -22,6 +22,7 @@ return [
'Please click the link in this e-mail to activate your account.',
'change_email_required_message' => 'An e-mail containing an activation link has been sent to the e-mail address you provided. ' .
'Please click the link in this e-mail to confirm your new e-mail address.',
'change_email_success_message' => 'Your e-mail address change has been confirmed. You will now need to login with your new e-mail address.',
'change_password_action' => 'Change password',
'change_password_title' => 'Change your password',
'email_password_login' => 'Alternatively, login with your e-mail address and password:',

View File

@ -79,6 +79,9 @@ return [
'no_albums_p2' => ':user_name has not created any albums yet.'
],
'user_settings' => [
'cancel_email_change' => 'Don\'t change e-mail address',
'change_email_in_progress' => 'To confirm your new e-mail address, please click on the &quot;confirm&quot; link in the e-mail that was sent to: <b>:new_email_address</b>.',
'change_email_resend' => 'Re-send confirmation e-mail.',
'change_password' => 'Change password',
'settings_saved' => 'Your settings were updated successfully.',
'title' => 'Change my settings'

View File

@ -7,7 +7,7 @@
@lang('email.change_email_required_p2')
@component('mail::button', ['url' => route('auth.activate', ['token' => $user->activation_token]), 'color' => 'blue'])
@component('mail::button', ['url' => route('userSettings.confirmEmailChangeState'), 'color' => 'blue'])
@lang('forms.confirm_email_action')
@endcomponent

View File

@ -4,7 +4,7 @@
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 mr-md-auto ml-md-auto">
<div class="col-lg-8 mr-lg-auto ml-lg-auto">
<div class="card">
<div class="card-header">
<ul class="nav nav-tabs card-header-tabs">
@ -14,6 +14,17 @@
</ul>
</div>
<div class="card-body">
@if ($user->is_email_change_in_progress)
<div class="alert alert-warning mb-4" role="alert">
<p>@lang('gallery.user_settings.change_email_in_progress', ['new_email_address' => $user->new_email_address])</p>
<form action="{{ route('userSettings.resetEmailChangeState') }}" method="post">
{{ csrf_field() }}
<button type="submit" class="btn btn-outline-info" name="resend_email">@lang('gallery.user_settings.change_email_resend')</button>
<button type="submit" class="btn btn-outline-info" name="cancel_change">@lang('gallery.user_settings.cancel_email_change')</button>
</form>
</div>
@endif
<form action="{{ route('saveUserSettings') }}" method="post">
{{ csrf_field() }}

View File

@ -117,6 +117,12 @@ Route::get('label/{labelAlias}', 'Gallery\LabelController@show')
Route::get('u/{idOrAlias}', 'Gallery\UserController@show')
->name('viewUser')
->where('idOrAlias', '.*');
Route::get('me/confirm-email-change', 'Gallery\UserController@confirmEmailChangeState')
->name('userSettings.confirmEmailChangeState')
->middleware('auth');
Route::post('me/reset-email-change', 'Gallery\UserController@resetEmailChangeState')
->name('userSettings.resetEmailChangeState')
->middleware('auth');
Route::get('me/settings', 'Gallery\UserController@settings')
->name('userSettings')
->middleware('auth');