From b1bd223cabb6ae60160218c5ac4d3d5f6c3778a8 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 14 Nov 2017 15:58:50 +0200 Subject: [PATCH 1/5] Fix for login page --- app/Http/Controllers/Auth/LoginController.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 9145743d015c..aff9502a31f9 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -10,6 +10,7 @@ use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Contracts\Auth\Authenticatable; use Event; use Cache; +use Lang; use App\Events\UserLoggedIn; use App\Http\Requests\ValidateTwoFactorRequest; @@ -186,7 +187,7 @@ class LoginController extends Controller $reason = htmlentities(request()->reason); if (!empty($reason) && Lang::has("texts.{$reason}_logout")) { - sesion()->flash('warning', trans("texts.{$reason}_logout")); + session()->flash('warning', trans("texts.{$reason}_logout")); } return $response; From 435fd5b89ea4618d390eeb7e040b5854c817db3a Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 14 Nov 2017 16:04:29 +0200 Subject: [PATCH 2/5] Update version --- app/Constants.php | 2 +- docs/conf.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Constants.php b/app/Constants.php index 1a82695a2574..b1634af99de4 100644 --- a/app/Constants.php +++ b/app/Constants.php @@ -310,7 +310,7 @@ if (! defined('APP_NAME')) { define('NINJA_APP_URL', env('NINJA_APP_URL', 'https://app.invoiceninja.com')); define('NINJA_DOCS_URL', env('NINJA_DOCS_URL', 'http://docs.invoiceninja.com/en/latest')); define('NINJA_DATE', '2000-01-01'); - define('NINJA_VERSION', '3.9.0' . env('NINJA_VERSION_SUFFIX')); + define('NINJA_VERSION', '3.9.1' . env('NINJA_VERSION_SUFFIX')); define('SOCIAL_LINK_FACEBOOK', env('SOCIAL_LINK_FACEBOOK', 'https://www.facebook.com/invoiceninja')); define('SOCIAL_LINK_TWITTER', env('SOCIAL_LINK_TWITTER', 'https://twitter.com/invoiceninja')); diff --git a/docs/conf.py b/docs/conf.py index 35f226f87d61..8e400cae5317 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -59,7 +59,7 @@ author = u'Invoice Ninja' # The short X.Y version. version = u'3.9' # The full version, including alpha/beta/rc tags. -release = u'3.9.0' +release = u'3.9.1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 7dd7fd16babac593cabb964d35af7aceabead73e Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 14 Nov 2017 20:07:58 +0200 Subject: [PATCH 3/5] Working in tests... --- app/Models/PaymentMethod.php | 2 +- tests/_support/AcceptanceTester.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Models/PaymentMethod.php b/app/Models/PaymentMethod.php index 76dce0891bf0..c4efaac6a6ab 100644 --- a/app/Models/PaymentMethod.php +++ b/app/Models/PaymentMethod.php @@ -256,7 +256,7 @@ class PaymentMethod extends EntityModel PaymentMethod::deleting(function ($paymentMethod) { $accountGatewayToken = $paymentMethod->account_gateway_token; if ($accountGatewayToken->default_payment_method_id == $paymentMethod->id) { - $newDefault = $accountGatewayToken->payment_methods->first(function ($i, $paymentMethdod) use ($accountGatewayToken) { + $newDefault = $accountGatewayToken->payment_methods->first(function ($paymentMethdod) use ($accountGatewayToken) { return $paymentMethdod->id != $accountGatewayToken->default_payment_method_id; }); $accountGatewayToken->default_payment_method_id = $newDefault ? $newDefault->id : null; diff --git a/tests/_support/AcceptanceTester.php b/tests/_support/AcceptanceTester.php index 7e675fc98381..ce3efc36d1ec 100644 --- a/tests/_support/AcceptanceTester.php +++ b/tests/_support/AcceptanceTester.php @@ -132,7 +132,7 @@ class AcceptanceTester extends \Codeception\Actor $I->selectOption('#expiration_month', 12); $I->selectOption('#expiration_year', date('Y')); $I->click('.btn-success'); - $I->wait(3); + $I->wait(5); $I->see('Successfully applied payment'); }); } From 38d322389b289ae12b07a88ae4ef5d8fed10069d Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 14 Nov 2017 22:34:56 +0200 Subject: [PATCH 4/5] Fix client reset password --- .../ClientAuth/ResetPasswordController.php | 5 +++-- app/Http/routes.php | 2 +- app/Models/Contact.php | 6 ++++++ app/Models/User.php | 6 ++++++ app/Ninja/Mailers/ContactMailer.php | 15 +++++++++++++++ app/Ninja/Mailers/UserMailer.php | 15 +++++++++++++++ resources/lang/en/texts.php | 1 + .../views/clientauth/passwords/reset.blade.php | 1 + ...d.blade.php => client_password_html.blade.php} | 0 .../views/emails/client_password_text.blade.php | 10 ++++++++++ ...password.blade.php => password_html.blade.php} | 0 resources/views/emails/password_text.blade.php | 8 ++++++++ 12 files changed, 66 insertions(+), 3 deletions(-) rename resources/views/emails/{client_password.blade.php => client_password_html.blade.php} (100%) create mode 100644 resources/views/emails/client_password_text.blade.php rename resources/views/emails/{password.blade.php => password_html.blade.php} (100%) create mode 100644 resources/views/emails/password_text.blade.php diff --git a/app/Http/Controllers/ClientAuth/ResetPasswordController.php b/app/Http/Controllers/ClientAuth/ResetPasswordController.php index 6a53f42a33ef..511c10cfa92e 100644 --- a/app/Http/Controllers/ClientAuth/ResetPasswordController.php +++ b/app/Http/Controllers/ClientAuth/ResetPasswordController.php @@ -6,6 +6,7 @@ use Password; use Config; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\ResetsPasswords; +use Illuminate\Http\Request; class ResetPasswordController extends Controller { @@ -48,13 +49,13 @@ class ResetPasswordController extends Controller protected function guard() { - return auth()->guard('clients'); + return auth()->guard('client'); } public function showResetForm(Request $request, $token = null) { return view('clientauth.passwords.reset')->with( - ['token' => $token, 'email' => $request->email] + ['token' => $token] ); } diff --git a/app/Http/routes.php b/app/Http/routes.php index 728ce8fe6101..bec7a83eec16 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -104,7 +104,7 @@ Route::get('/client/login', ['as' => 'login', 'uses' => 'ClientAuth\LoginControl Route::get('/client/logout', ['as' => 'logout', 'uses' => 'ClientAuth\LoginController@getLogout']); Route::get('/client/session_expired', ['as' => 'logout', 'uses' => 'ClientAuth\LoginController@getSessionExpired']); Route::get('/client/recover_password', ['as' => 'forgot', 'uses' => 'ClientAuth\ForgotPasswordController@showLinkRequestForm']); -Route::get('/client/password/reset/{token}', ['as' => 'forgot', 'uses' => 'Auth\ResetPasswordController@showResetForm']); +Route::get('/client/password/reset/{token}', ['as' => 'forgot', 'uses' => 'ClientAuth\ResetPasswordController@showResetForm']); Route::group(['middleware' => ['lookup:contact']], function () { Route::post('/client/login', ['as' => 'login', 'uses' => 'ClientAuth\LoginController@login']); diff --git a/app/Models/Contact.php b/app/Models/Contact.php index e651671e5e9d..799f8e8e80bc 100644 --- a/app/Models/Contact.php +++ b/app/Models/Contact.php @@ -183,6 +183,12 @@ class Contact extends EntityModel implements AuthenticatableContract, CanResetPa return "{$url}/client/dashboard/{$this->contact_key}"; } + + public function sendPasswordResetNotification($token) + { + //$this->notify(new ResetPasswordNotification($token)); + app('App\Ninja\Mailers\ContactMailer')->sendPasswordReset($this, $token); + } } Contact::creating(function ($contact) diff --git a/app/Models/User.php b/app/Models/User.php index 19bd048eb2d4..321d71f304e1 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -421,6 +421,12 @@ class User extends Authenticatable { return $this->account->company->accounts->sortBy('id')->first(); } + + public function sendPasswordResetNotification($token) + { + //$this->notify(new ResetPasswordNotification($token)); + app('App\Ninja\Mailers\UserMailer')->sendPasswordReset($this, $token); + } } User::created(function ($user) diff --git a/app/Ninja/Mailers/ContactMailer.php b/app/Ninja/Mailers/ContactMailer.php index 5507ef2ccfce..6647f56d5ebc 100644 --- a/app/Ninja/Mailers/ContactMailer.php +++ b/app/Ninja/Mailers/ContactMailer.php @@ -327,4 +327,19 @@ class ContactMailer extends Mailer $this->sendTo($email, CONTACT_EMAIL, CONTACT_NAME, $subject, $view, $data); } + + public function sendPasswordReset($contact, $token) + { + if (! $contact->email) { + return; + } + + $subject = trans('texts.your_password_reset_link'); + $view = 'client_password'; + $data = [ + 'token' => $token, + ]; + + $this->sendTo($contact->email, CONTACT_EMAIL, CONTACT_NAME, $subject, $view, $data); + } } diff --git a/app/Ninja/Mailers/UserMailer.php b/app/Ninja/Mailers/UserMailer.php index bc464525e438..c2f9fd37b460 100644 --- a/app/Ninja/Mailers/UserMailer.php +++ b/app/Ninja/Mailers/UserMailer.php @@ -154,4 +154,19 @@ class UserMailer extends Mailer $this->sendTo($user->email, CONTACT_EMAIL, CONTACT_NAME, $subject, $view, $data); } + + public function sendPasswordReset($user, $token) + { + if (! $user->email) { + return; + } + + $subject = trans('texts.your_password_reset_link'); + $view = 'password'; + $data = [ + 'token' => $token, + ]; + + $this->sendTo($user->email, CONTACT_EMAIL, CONTACT_NAME, $subject, $view, $data); + } } diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index 2f1d5be30aa1..315cbc56786c 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -2521,6 +2521,7 @@ $LANG = array( 'self_host_login' => 'Self-Host Login', 'set_self_hoat_url' => 'Self-Host URL', 'local_storage_required' => 'Error: local storage is not available.', + 'your_password_reset_link' => 'Your Password Reset Link', ); diff --git a/resources/views/clientauth/passwords/reset.blade.php b/resources/views/clientauth/passwords/reset.blade.php index 62f7336eea4d..8261983a512d 100644 --- a/resources/views/clientauth/passwords/reset.blade.php +++ b/resources/views/clientauth/passwords/reset.blade.php @@ -35,6 +35,7 @@
+ {!! Former::text('email')->placeholder(trans('texts.email'))->raw() !!} {!! Former::password('password')->placeholder(trans('texts.password'))->raw() !!} {!! Former::password('password_confirmation')->placeholder(trans('texts.confirm_password'))->raw() !!}
diff --git a/resources/views/emails/client_password.blade.php b/resources/views/emails/client_password_html.blade.php similarity index 100% rename from resources/views/emails/client_password.blade.php rename to resources/views/emails/client_password_html.blade.php diff --git a/resources/views/emails/client_password_text.blade.php b/resources/views/emails/client_password_text.blade.php new file mode 100644 index 000000000000..178ed24c1273 --- /dev/null +++ b/resources/views/emails/client_password_text.blade.php @@ -0,0 +1,10 @@ +{{ trans('texts.reset_password') }} + +{!! URL::to(SITE_URL . "/client/password/reset/{$token}") !!} + +@if (Utils::isNinja() || ! Utils::isWhiteLabel()) + {{ trans('texts.email_signature') }}
+ {{ trans('texts.email_from') }} +@endif + +{{ trans('texts.reset_password_footer', ['email' => env('CONTACT_EMAIL', CONTACT_EMAIL)]) }} diff --git a/resources/views/emails/password.blade.php b/resources/views/emails/password_html.blade.php similarity index 100% rename from resources/views/emails/password.blade.php rename to resources/views/emails/password_html.blade.php diff --git a/resources/views/emails/password_text.blade.php b/resources/views/emails/password_text.blade.php new file mode 100644 index 000000000000..15f449af8f53 --- /dev/null +++ b/resources/views/emails/password_text.blade.php @@ -0,0 +1,8 @@ +{{ trans('texts.reset_password') }} + +{!! URL::to(SITE_URL . "/password/reset/{$token}") !!} + +{{ trans('texts.email_signature') }} +{{ trans('texts.email_from') }} + +{{ trans('texts.reset_password_footer', ['email' => env('CONTACT_EMAIL', CONTACT_EMAIL)]) }} From 6dde9de1915e16d23231312eb16813035edeb63d Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 15 Nov 2017 09:51:49 +0200 Subject: [PATCH 5/5] Working on password reset --- .../Controllers/Auth/ResetPasswordController.php | 10 ++++++++++ .../ClientAuth/ResetPasswordController.php | 6 +++++- app/Models/PasswordReset.php | 13 +++++++++++++ resources/views/auth/passwords/reset.blade.php | 13 +++++++++---- .../views/clientauth/passwords/reset.blade.php | 13 +++++++++---- resources/views/partials/autocomplete_fix.blade.php | 2 +- 6 files changed, 47 insertions(+), 10 deletions(-) create mode 100644 app/Models/PasswordReset.php diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php index a07a372f8642..4303afa40a04 100644 --- a/app/Http/Controllers/Auth/ResetPasswordController.php +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -54,4 +54,14 @@ class ResetPasswordController extends Controller return $this->traitSendResetResponse($response); } } + + public function showResetForm(Request $request, $token = null) + { + $passwordReset = PasswordReset::whereToken($token)->first(); + $email = $passwordReset ? $passwordReset->email : ''; + + return view('auth.passwords.reset')->with( + ['token' => $token, 'email' => $email] + ); + } } diff --git a/app/Http/Controllers/ClientAuth/ResetPasswordController.php b/app/Http/Controllers/ClientAuth/ResetPasswordController.php index 511c10cfa92e..a2b379a4191d 100644 --- a/app/Http/Controllers/ClientAuth/ResetPasswordController.php +++ b/app/Http/Controllers/ClientAuth/ResetPasswordController.php @@ -7,6 +7,7 @@ use Config; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\ResetsPasswords; use Illuminate\Http\Request; +use App\Models\PasswordReset; class ResetPasswordController extends Controller { @@ -54,8 +55,11 @@ class ResetPasswordController extends Controller public function showResetForm(Request $request, $token = null) { + $passwordReset = PasswordReset::whereToken($token)->first(); + $email = $passwordReset ? $passwordReset->email : ''; + return view('clientauth.passwords.reset')->with( - ['token' => $token] + ['token' => $token, 'email' => $email] ); } diff --git a/app/Models/PasswordReset.php b/app/Models/PasswordReset.php new file mode 100644 index 000000000000..468c9901e72b --- /dev/null +++ b/app/Models/PasswordReset.php @@ -0,0 +1,13 @@ + - {!! Former::open('/password/reset')->addClass('form-signin')->rules(array( + {!! Former::open('/password/reset') + ->addClass('form-signin') + ->autocomplete('off') + ->rules(array( 'password' => 'required', 'password_confirmation' => 'required', )) !!} + @include('partials.autocomplete_fix') +
@@ -35,9 +40,9 @@
- {!! Former::text('email')->placeholder(trans('texts.email'))->raw() !!} - {!! Former::password('password')->placeholder(trans('texts.password'))->raw() !!} - {!! Former::password('password_confirmation')->placeholder(trans('texts.confirm_password'))->raw() !!} + {!! Former::text('email')->placeholder(trans('texts.password'))->value($email)->raw() !!} + {!! Former::password('password')->placeholder(trans('texts.password'))->autocomplete('new-password')->raw() !!} + {!! Former::password('password_confirmation')->placeholder(trans('texts.confirm_password'))->autocomplete('new-password')->raw() !!}

{!! Button::success(trans('texts.save'))->large()->submit()->withAttributes(['class' => 'green'])->block() !!}

diff --git a/resources/views/clientauth/passwords/reset.blade.php b/resources/views/clientauth/passwords/reset.blade.php index 8261983a512d..0c2a50005e8a 100644 --- a/resources/views/clientauth/passwords/reset.blade.php +++ b/resources/views/clientauth/passwords/reset.blade.php @@ -3,11 +3,16 @@ @section('form')
- {!! Former::open('/client/password/reset')->addClass('form-signin')->rules(array( + {!! Former::open('/client/password/reset') + ->addClass('form-signin') + ->autocomplete('false') + ->rules(array( 'password' => 'required', 'password_confirmation' => 'required', )) !!} + @include('partials.autocomplete_fix') +
@@ -35,9 +40,9 @@
- {!! Former::text('email')->placeholder(trans('texts.email'))->raw() !!} - {!! Former::password('password')->placeholder(trans('texts.password'))->raw() !!} - {!! Former::password('password_confirmation')->placeholder(trans('texts.confirm_password'))->raw() !!} + {!! Former::text('email')->placeholder(trans('texts.password'))->value($email)->raw() !!} + {!! Former::password('password')->placeholder(trans('texts.password'))->autocomplete('new-password')->raw() !!} + {!! Former::password('password_confirmation')->placeholder(trans('texts.confirm_password'))->autocomplete('new-password')->raw() !!}

{!! Button::success(trans('texts.save'))->large()->submit()->withAttributes(['class' => 'green'])->block() !!}

diff --git a/resources/views/partials/autocomplete_fix.blade.php b/resources/views/partials/autocomplete_fix.blade.php index ec3f8c5cdb9b..cc0f61d3f7a1 100644 --- a/resources/views/partials/autocomplete_fix.blade.php +++ b/resources/views/partials/autocomplete_fix.blade.php @@ -1,4 +1,4 @@
-
\ No newline at end of file +