| 
									
										
										
										
											2016-10-22 09:31:27 +02:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * UserEventHandler.php | 
					
						
							| 
									
										
										
										
											2017-10-21 08:40:00 +02:00
										 |  |  |  * Copyright (c) 2017 thegrumpydictator@gmail.com | 
					
						
							| 
									
										
										
										
											2016-10-22 09:31:27 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2017-10-21 08:40:00 +02:00
										 |  |  |  * This file is part of Firefly III. | 
					
						
							| 
									
										
										
										
											2016-10-22 09:31:27 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2017-10-21 08:40:00 +02:00
										 |  |  |  * Firefly III is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Firefly III 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 General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU General Public License | 
					
						
							| 
									
										
										
										
											2017-12-17 14:41:58 +01:00
										 |  |  |  * along with Firefly III. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2016-10-22 09:31:27 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-07-07 07:48:10 +02:00
										 |  |  | /** @noinspection NullPointerExceptionInspection */ | 
					
						
							| 
									
										
										
										
											2017-04-09 07:44:22 +02:00
										 |  |  | declare(strict_types=1); | 
					
						
							| 
									
										
										
										
											2016-10-22 09:31:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace FireflyIII\Handlers\Events; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-02 14:42:07 +02:00
										 |  |  | use Exception; | 
					
						
							| 
									
										
										
										
											2016-10-22 09:31:27 +02:00
										 |  |  | use FireflyIII\Events\RegisteredUser; | 
					
						
							| 
									
										
										
										
											2016-11-22 21:21:11 +01:00
										 |  |  | use FireflyIII\Events\RequestedNewPassword; | 
					
						
							| 
									
										
										
										
											2017-09-26 08:52:16 +02:00
										 |  |  | use FireflyIII\Events\UserChangedEmail; | 
					
						
							|  |  |  | use FireflyIII\Mail\ConfirmEmailChangeMail; | 
					
						
							| 
									
										
										
										
											2017-04-27 08:03:15 +02:00
										 |  |  | use FireflyIII\Mail\RegisteredUser as RegisteredUserMail; | 
					
						
							| 
									
										
										
										
											2017-04-27 08:26:58 +02:00
										 |  |  | use FireflyIII\Mail\RequestedNewPassword as RequestedNewPasswordMail; | 
					
						
							| 
									
										
										
										
											2017-09-26 08:52:16 +02:00
										 |  |  | use FireflyIII\Mail\UndoEmailChangeMail; | 
					
						
							| 
									
										
										
										
											2016-10-22 09:31:27 +02:00
										 |  |  | use FireflyIII\Repositories\User\UserRepositoryInterface; | 
					
						
							| 
									
										
										
										
											2017-12-05 20:50:04 +01:00
										 |  |  | use FireflyIII\User; | 
					
						
							|  |  |  | use Illuminate\Auth\Events\Login; | 
					
						
							| 
									
										
										
										
											2016-10-22 09:31:27 +02:00
										 |  |  | use Log; | 
					
						
							|  |  |  | use Mail; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2017-11-15 12:25:49 +01:00
										 |  |  |  * Class UserEventHandler. | 
					
						
							| 
									
										
										
										
											2016-10-22 09:31:27 +02:00
										 |  |  |  * | 
					
						
							|  |  |  |  * This class responds to any events that have anything to do with the User object. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The method name reflects what is being done. This is in the present tense. | 
					
						
							| 
									
										
										
										
											2018-07-07 07:48:10 +02:00
										 |  |  |  * @SuppressWarnings(PHPMD.CouplingBetweenObjects) | 
					
						
							| 
									
										
										
										
											2016-10-22 09:31:27 +02:00
										 |  |  |  */ | 
					
						
							|  |  |  | class UserEventHandler | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * This method will bestow upon a user the "owner" role if he is the first user in the system. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param RegisteredUser $event | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function attachUserRole(RegisteredUser $event): bool | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         /** @var UserRepositoryInterface $repository */ | 
					
						
							|  |  |  |         $repository = app(UserRepositoryInterface::class); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // first user ever?
 | 
					
						
							| 
									
										
										
										
											2017-11-15 12:25:49 +01:00
										 |  |  |         if (1 === $repository->count()) { | 
					
						
							| 
									
										
										
										
											2016-10-22 09:31:27 +02:00
										 |  |  |             $repository->attachRole($event->user, 'owner'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-05 20:50:04 +01:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2018-07-07 07:48:10 +02:00
										 |  |  |      * Fires to see if a user is admin. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-12-05 20:50:04 +01:00
										 |  |  |      * @param Login $event | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function checkSingleUserIsAdmin(Login $event): bool | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-01-21 18:06:57 +01:00
										 |  |  |         /** @var UserRepositoryInterface $repository */ | 
					
						
							|  |  |  |         $repository = app(UserRepositoryInterface::class); | 
					
						
							| 
									
										
										
										
											2017-12-05 20:50:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-29 09:05:35 +01:00
										 |  |  |         /** @var User $user */ | 
					
						
							| 
									
										
										
										
											2017-12-05 20:50:04 +01:00
										 |  |  |         $user  = $event->user; | 
					
						
							| 
									
										
										
										
											2018-01-21 18:06:57 +01:00
										 |  |  |         $count = $repository->count(); | 
					
						
							| 
									
										
										
										
											2017-12-05 20:50:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-07 07:48:10 +02:00
										 |  |  |         // only act when there is 1 user in the system and he has no admin rights.
 | 
					
						
							|  |  |  |         if (1 === $count && !$repository->hasRole($user, 'owner')) { | 
					
						
							|  |  |  |             // user is the only user but does not have role "owner".
 | 
					
						
							|  |  |  |             $role = $repository->getRole('owner'); | 
					
						
							|  |  |  |             if (null === $role) { | 
					
						
							|  |  |  |                 // create role, does not exist. Very strange situation so let's raise a big fuss about it.
 | 
					
						
							|  |  |  |                 $role = $repository->createRole('owner', 'Site Owner', 'User runs this instance of FF3'); | 
					
						
							|  |  |  |                 Log::error('Could not find role "owner". This is weird.'); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             Log::info(sprintf('Gave user #%d role #%d ("%s")', $user->id, $role->id, $role->name)); | 
					
						
							|  |  |  |             // give user the role
 | 
					
						
							|  |  |  |             $repository->attachRole($user, 'owner'); | 
					
						
							| 
									
										
										
										
											2017-12-05 20:50:04 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-12 21:41:58 +02:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2018-07-07 07:48:10 +02:00
										 |  |  |      * Set the demo user back to English. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2018-06-12 21:41:58 +02:00
										 |  |  |      * @param Login $event | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-06-25 16:01:45 +02:00
										 |  |  |     public function demoUserBackToEnglish(Login $event): bool | 
					
						
							| 
									
										
										
										
											2018-06-12 21:41:58 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         /** @var UserRepositoryInterface $repository */ | 
					
						
							|  |  |  |         $repository = app(UserRepositoryInterface::class); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** @var User $user */ | 
					
						
							|  |  |  |         $user = $event->user; | 
					
						
							|  |  |  |         if ($repository->hasRole($user, 'demo')) { | 
					
						
							|  |  |  |             // set user back to English.
 | 
					
						
							|  |  |  |             app('preferences')->setForUser($user, 'language', 'en_US'); | 
					
						
							|  |  |  |             app('preferences')->mark(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-26 08:52:16 +02:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2018-07-07 07:48:10 +02:00
										 |  |  |      * Send email to confirm email change. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-09-26 08:52:16 +02:00
										 |  |  |      * @param UserChangedEmail $event | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function sendEmailChangeConfirmMail(UserChangedEmail $event): bool | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $newEmail  = $event->newEmail; | 
					
						
							|  |  |  |         $oldEmail  = $event->oldEmail; | 
					
						
							|  |  |  |         $user      = $event->user; | 
					
						
							|  |  |  |         $ipAddress = $event->ipAddress; | 
					
						
							| 
									
										
										
										
											2018-07-15 09:27:38 +02:00
										 |  |  |         $token     = app('preferences')->getForUser($user, 'email_change_confirm_token', 'invalid'); | 
					
						
							| 
									
										
										
										
											2017-09-26 08:52:16 +02:00
										 |  |  |         $uri       = route('profile.confirm-email-change', [$token->data]); | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |             Mail::to($newEmail)->send(new ConfirmEmailChangeMail($newEmail, $oldEmail, $uri, $ipAddress)); | 
					
						
							|  |  |  |             // @codeCoverageIgnoreStart
 | 
					
						
							| 
									
										
										
										
											2018-04-02 14:42:07 +02:00
										 |  |  |         } catch (Exception $e) { | 
					
						
							| 
									
										
										
										
											2017-09-26 08:52:16 +02:00
										 |  |  |             Log::error($e->getMessage()); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // @codeCoverageIgnoreEnd
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2018-07-07 07:48:10 +02:00
										 |  |  |      * Send email to be able to undo email change. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-09-26 08:52:16 +02:00
										 |  |  |      * @param UserChangedEmail $event | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function sendEmailChangeUndoMail(UserChangedEmail $event): bool | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $newEmail  = $event->newEmail; | 
					
						
							|  |  |  |         $oldEmail  = $event->oldEmail; | 
					
						
							|  |  |  |         $user      = $event->user; | 
					
						
							|  |  |  |         $ipAddress = $event->ipAddress; | 
					
						
							| 
									
										
										
										
											2018-07-15 09:27:38 +02:00
										 |  |  |         $token     = app('preferences')->getForUser($user, 'email_change_undo_token', 'invalid'); | 
					
						
							| 
									
										
										
										
											2017-09-26 08:52:16 +02:00
										 |  |  |         $uri       = route('profile.undo-email-change', [$token->data, hash('sha256', $oldEmail)]); | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |             Mail::to($oldEmail)->send(new UndoEmailChangeMail($newEmail, $oldEmail, $uri, $ipAddress)); | 
					
						
							|  |  |  |             // @codeCoverageIgnoreStart
 | 
					
						
							| 
									
										
										
										
											2018-04-02 14:42:07 +02:00
										 |  |  |         } catch (Exception $e) { | 
					
						
							| 
									
										
										
										
											2017-09-26 08:52:16 +02:00
										 |  |  |             Log::error($e->getMessage()); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // @codeCoverageIgnoreEnd
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-22 21:21:11 +01:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2018-07-07 07:48:10 +02:00
										 |  |  |      * Send a new password to the user. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2016-11-22 21:21:11 +01:00
										 |  |  |      * @param RequestedNewPassword $event | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function sendNewPassword(RequestedNewPassword $event): bool | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $email     = $event->user->email; | 
					
						
							|  |  |  |         $ipAddress = $event->ipAddress; | 
					
						
							|  |  |  |         $token     = $event->token; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $url = route('password.reset', [$token]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // send email.
 | 
					
						
							|  |  |  |         try { | 
					
						
							| 
									
										
										
										
											2017-04-27 08:26:58 +02:00
										 |  |  |             Mail::to($email)->send(new RequestedNewPasswordMail($url, $ipAddress)); | 
					
						
							|  |  |  |             // @codeCoverageIgnoreStart
 | 
					
						
							| 
									
										
										
										
											2018-04-02 14:42:07 +02:00
										 |  |  |         } catch (Exception $e) { | 
					
						
							| 
									
										
										
										
											2016-11-22 21:21:11 +01:00
										 |  |  |             Log::error($e->getMessage()); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-06-05 11:12:50 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-27 08:26:58 +02:00
										 |  |  |         // @codeCoverageIgnoreEnd
 | 
					
						
							| 
									
										
										
										
											2016-11-22 21:21:11 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-22 09:31:27 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * This method will send the user a registration mail, welcoming him or her to Firefly III. | 
					
						
							|  |  |  |      * This message is only sent when the configuration of Firefly III says so. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param RegisteredUser $event | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-07-07 07:48:10 +02:00
										 |  |  |     public function sendRegistrationMail(RegisteredUser $event): bool | 
					
						
							| 
									
										
										
										
											2016-10-22 09:31:27 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         $sendMail = env('SEND_REGISTRATION_MAIL', true); | 
					
						
							| 
									
										
										
										
											2018-07-07 07:48:10 +02:00
										 |  |  |         if ($sendMail) { | 
					
						
							|  |  |  |             // get the email address
 | 
					
						
							|  |  |  |             $email     = $event->user->email; | 
					
						
							|  |  |  |             $uri       = route('index'); | 
					
						
							|  |  |  |             $ipAddress = $event->ipAddress; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // send email.
 | 
					
						
							|  |  |  |             try { | 
					
						
							|  |  |  |                 Mail::to($email)->send(new RegisteredUserMail($uri, $ipAddress)); | 
					
						
							|  |  |  |                 // @codeCoverageIgnoreStart
 | 
					
						
							|  |  |  |             } catch (Exception $e) { | 
					
						
							|  |  |  |                 Log::error($e->getMessage()); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             // @codeCoverageIgnoreEnd
 | 
					
						
							| 
									
										
										
										
											2016-10-22 09:31:27 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-10-23 12:42:44 +02:00
										 |  |  | } |