diff --git a/app/Http/Controllers/Gallery/UserController.php b/app/Http/Controllers/Gallery/UserController.php index a8ae63f..3809354 100644 --- a/app/Http/Controllers/Gallery/UserController.php +++ b/app/Http/Controllers/Gallery/UserController.php @@ -8,10 +8,12 @@ use App\Facade\UserConfig; use App\Helpers\DbHelper; use App\Http\Controllers\Controller; use App\Http\Requests\SaveUserSettingsRequest; +use App\Mail\UserChangeEmailRequired; use App\User; use Illuminate\Support\Collection; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Mail; use Symfony\Component\HttpFoundation\Request; class UserController extends Controller @@ -19,15 +21,36 @@ class UserController extends Controller public function saveSettings(SaveUserSettingsRequest $request) { $data = $request->only(['name', 'email', 'profile_alias', 'enable_profile_page']); + $user = $this->getUser(); if (UserConfig::get('require_email_verification')) { // 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())); + $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->is_email_change_in_progress = true; + $user->email = $oldEmailAddress; + $user->save(); + + unset($data['email']); + } + + // Don't allow e-mail address to be changed if a change is in progress + if ($user->is_email_change_in_progress) + { unset($data['email']); } - $user = $this->getUser(); $user->fill($data); $user->enable_profile_page = (isset($data['enable_profile_page']) && strtolower($data['enable_profile_page']) == 'on'); $user->save(); @@ -40,6 +63,7 @@ class UserController extends Controller public function settings(Request $request) { return Theme::render('gallery.user_settings', [ + 'info' => $request->session()->get('info'), 'success' => $request->session()->get('success'), 'user' => $this->getUser() ]); diff --git a/app/Mail/UserChangeEmailRequired.php b/app/Mail/UserChangeEmailRequired.php new file mode 100644 index 0000000..6f39a27 --- /dev/null +++ b/app/Mail/UserChangeEmailRequired.php @@ -0,0 +1,46 @@ +user = $user; + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { + $subject = trans('email.change_email_required_subject', ['app_name' => UserConfig::get('app_name')]); + + return $this + ->subject($subject) + ->markdown(Theme::viewName('email.user_change_email_required')) + ->with([ + 'subject' => $subject, + 'user' => $this->user + ]); + } +} diff --git a/database/migrations/2018_09_12_142055_add_user_email_change_columns.php b/database/migrations/2018_09_12_142055_add_user_email_change_columns.php new file mode 100644 index 0000000..727bf75 --- /dev/null +++ b/database/migrations/2018_09_12_142055_add_user_email_change_columns.php @@ -0,0 +1,36 @@ +boolean('is_email_change_in_progress')->default(false); + $table->string('new_email_address')->nullable(true); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) + { + $table->dropColumn('is_email_change_in_progress'); + $table->dropColumn('new_email_address'); + }); + } +} diff --git a/resources/lang/en/auth.php b/resources/lang/en/auth.php index 545f1b6..8ba7e21 100644 --- a/resources/lang/en/auth.php +++ b/resources/lang/en/auth.php @@ -20,6 +20,8 @@ return [ 'and password you provided when you registered.', 'activation_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 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_password_action' => 'Change password', 'change_password_title' => 'Change your password', 'email_password_login' => 'Alternatively, login with your e-mail address and password:', diff --git a/resources/lang/en/email.php b/resources/lang/en/email.php index 698bc6a..15d7776 100644 --- a/resources/lang/en/email.php +++ b/resources/lang/en/email.php @@ -4,6 +4,9 @@ return [ 'activation_required_p2' => 'To confirm your e-mail address and activate your account, please click the link below. ' . 'You may also need to copy + paste this into your browser\'s address bar if your e-mail reader has split this line.', 'activation_required_subject' => 'Activate your :app_name account', + 'change_email_required_p1' => 'A change was requested to your e-mail address on :app_name.', + 'change_email_required_p2' => 'To confirm this e-mail address is valid and update the e-mail address on your account, please click the button below.', + 'change_email_required_subject' => 'Confirm the e-mail change to your :app_name account', 'generic_intro' => 'Hi :user_name,', 'generic_regards' => 'Regards,', 'test_email_subject' => 'Test e-mail from :app_name' diff --git a/resources/lang/en/forms.php b/resources/lang/en/forms.php index d040f4b..b96752f 100644 --- a/resources/lang/en/forms.php +++ b/resources/lang/en/forms.php @@ -14,6 +14,7 @@ return [ 'bulk_edit_photos_placeholder' => 'Select an action', 'cancel_action' => 'Cancel', 'close_action' => 'Close', + 'confirm_email_action' => 'Confirm e-mail address', 'continue_action' => 'Continue', 'create_action' => 'Create', 'create_album_label' => 'Create a new album:', diff --git a/resources/views/themes/base/email/user_change_email_required.blade.php b/resources/views/themes/base/email/user_change_email_required.blade.php new file mode 100644 index 0000000..62018b6 --- /dev/null +++ b/resources/views/themes/base/email/user_change_email_required.blade.php @@ -0,0 +1,17 @@ +@component('mail::message') +@lang('email.generic_intro', ['user_name' => $user->name]) + + +@lang('email.change_email_required_p1', ['app_name' => UserConfig::get('app_name')]) + + +@lang('email.change_email_required_p2') + +@component('mail::button', ['url' => route('auth.activate', ['token' => $user->activation_token]), 'color' => 'blue']) + @lang('forms.confirm_email_action') +@endcomponent + +@lang('email.generic_regards')
+{{ UserConfig::get('app_name') }}
+{{ route('home') }} +@endcomponent \ No newline at end of file diff --git a/resources/views/themes/base/gallery/user_settings.blade.php b/resources/views/themes/base/gallery/user_settings.blade.php index 5c8e8b8..5bfc8b3 100644 --- a/resources/views/themes/base/gallery/user_settings.blade.php +++ b/resources/views/themes/base/gallery/user_settings.blade.php @@ -35,7 +35,7 @@
- + is_email_change_in_progress ? ' readonly="readonly"' : '' }}> @if ($errors->has('email'))