diff --git a/app/Http/Controllers/Auth/PasswordController.php b/app/Http/Controllers/Auth/PasswordController.php index 5f3747b4a..053979288 100644 --- a/app/Http/Controllers/Auth/PasswordController.php +++ b/app/Http/Controllers/Auth/PasswordController.php @@ -20,10 +20,10 @@ class PasswordController extends Controller use ResetsPasswords; + protected $redirectTo = '/'; + /** * Create a new password controller instance. - * - * @return void */ public function __construct() { diff --git a/app/Http/routes.php b/app/Http/routes.php index a6cda78e6..4811b74d0 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -86,6 +86,13 @@ Route::group(['middleware' => 'auth'], function() { }); +// Login/Logout routes Route::get('/login', 'Auth\AuthController@getLogin'); Route::post('/login', 'Auth\AuthController@postLogin'); Route::get('/logout', 'Auth\AuthController@getLogout'); +// Password reset link request routes... +Route::get('/password/email', 'Auth\PasswordController@getEmail'); +Route::post('/password/email', 'Auth\PasswordController@postEmail'); +// Password reset routes... +Route::get('/password/reset/{token}', 'Auth\PasswordController@getReset'); +Route::post('/password/reset', 'Auth\PasswordController@postReset'); \ No newline at end of file diff --git a/config/mail.php b/config/mail.php index a22807e71..a45145309 100644 --- a/config/mail.php +++ b/config/mail.php @@ -54,7 +54,7 @@ return [ | */ - 'from' => ['address' => null, 'name' => null], + 'from' => ['address' => env('MAIL_FROM', 'mail@bookstackapp.com'), 'name' => 'BookStack'], /* |-------------------------------------------------------------------------- diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index 97062cb79..dbf6db87b 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -29,6 +29,7 @@ <div class="form-group"> <label for="password">Password</label> @include('form/password', ['name' => 'password']) + <span class="block small"><a href="/password/email">Forgot Password?</a></span> </div> <div class="from-group"> diff --git a/resources/views/auth/password.blade.php b/resources/views/auth/password.blade.php new file mode 100644 index 000000000..6b9f46ec7 --- /dev/null +++ b/resources/views/auth/password.blade.php @@ -0,0 +1,29 @@ +@extends('public') + +@section('body-class', 'image-cover login') + +@section('sidebar') + + + <div class="text-center"> + <div class="center-box text-left"> + <h1>Reset Password</h1> + + <p class="muted small">Enter your email below and you will be sent an email with a password reset link.</p> + + <form action="/password/email" method="POST"> + {!! csrf_field() !!} + + <div class="form-group"> + <label for="email">Email</label> + @include('form/text', ['name' => 'email']) + </div> + + <div class="from-group"> + <button class="button block pos">Send Reset Link</button> + </div> + </form> + </div> + </div> + +@stop \ No newline at end of file diff --git a/resources/views/auth/reset.blade.php b/resources/views/auth/reset.blade.php new file mode 100644 index 000000000..6762ef2f0 --- /dev/null +++ b/resources/views/auth/reset.blade.php @@ -0,0 +1,38 @@ +@extends('public') + +@section('body-class', 'image-cover login') + +@section('sidebar') + + + <div class="text-center"> + <div class="center-box text-left"> + <h1>Reset Password</h1> + + <form action="/password/reset" method="POST"> + {!! csrf_field() !!} + <input type="hidden" name="token" value="{{ $token }}"> + + <div class="form-group"> + <label for="email">Email</label> + @include('form/text', ['name' => 'email']) + </div> + + <div class="form-group"> + <label for="password">Password</label> + @include('form/password', ['name' => 'password']) + </div> + + <div class="form-group"> + <label for="password_confirmation">Confirm Password</label> + @include('form/password', ['name' => 'password_confirmation']) + </div> + + <div class="from-group"> + <button class="button block pos">Reset Password</button> + </div> + </form> + </div> + </div> + +@stop \ No newline at end of file diff --git a/resources/views/emails/password.blade.php b/resources/views/emails/password.blade.php new file mode 100644 index 000000000..6d4827272 --- /dev/null +++ b/resources/views/emails/password.blade.php @@ -0,0 +1,186 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" style="margin-top:0;margin-bottom:0;margin-right:0;margin-left:0;padding-top:0;padding-bottom:0;padding-right:0;padding-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;font-size:100%;line-height:1.6;" > +<head style="margin-top:0;margin-bottom:0;margin-right:0;margin-left:0;padding-top:0;padding-bottom:0;padding-right:0;padding-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;font-size:100%;line-height:1.6;" > + <meta name="viewport" content="width=device-width" style="margin-top:0;margin-bottom:0;margin-right:0;margin-left:0;padding-top:0;padding-bottom:0;padding-right:0;padding-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;font-size:100%;line-height:1.6;" /> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" style="margin-top:0;margin-bottom:0;margin-right:0;margin-left:0;padding-top:0;padding-bottom:0;padding-right:0;padding-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;font-size:100%;line-height:1.6;" /> + <title>Password Reset</title> + <style style="margin-top:0;margin-bottom:0;margin-right:0;margin-left:0;padding-top:0;padding-bottom:0;padding-right:0;padding-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;font-size:100%;line-height:1.6;" > + + * { + margin: 0; + padding: 0; + font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; + font-size: 100%; + line-height: 1.6; + } + + img { + max-width: 100%; + } + + body { + -webkit-font-smoothing: antialiased; + -webkit-text-size-adjust: none; + width: 100%!important; + height: 100%; + } + + + + a { + color: #348eda; + } + + .btn-primary { + text-decoration: none; + color: #FFF; + background-color: #348eda; + border: solid #348eda; + border-width: 10px 20px; + line-height: 2; + font-weight: bold; + margin-right: 10px; + text-align: center; + cursor: pointer; + display: inline-block; + border-radius: 4px; + } + + .btn-secondary { + text-decoration: none; + color: #FFF; + background-color: #aaa; + border: solid #aaa; + border-width: 10px 20px; + line-height: 2; + font-weight: bold; + margin-right: 10px; + text-align: center; + cursor: pointer; + display: inline-block; + border-radius: 25px; + } + + .last { + margin-bottom: 0; + } + + .first { + margin-top: 0; + } + + .padding { + padding: 10px 0; + } + + + + table.body-wrap { + width: 100%; + padding: 20px; + } + + table.body-wrap .container { + border: 1px solid #f0f0f0; + } + + + + + h1, h2, h3 { + font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; + color: #444; + margin: 10px 0 10px; + line-height: 1.2; + font-weight: 200; + } + + h1 { + font-size: 36px; + } + h2 { + font-size: 28px; + } + h3 { + font-size: 22px; + } + + p, ul, ol { + margin-bottom: 10px; + font-weight: normal; + font-size: 14px; + color: #888888; + } + + ul li, ol li { + margin-left: 5px; + list-style-position: inside; + } + + + + + .container { + display: block!important; + max-width: 600px!important; + margin: 0 auto!important; + clear: both!important; + } + + + .body-wrap .container { + padding: 20px; + } + + + .content { + max-width: 600px; + margin: 0 auto; + display: block; + } + + + .content table { + width: 100%; + } + + </style> + </head> + + <body bgcolor="#f6f6f6" style="margin-top:0;margin-bottom:0;margin-right:0;margin-left:0;padding-top:0;padding-bottom:0;padding-right:0;padding-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;font-size:100%;line-height:1.6;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:none;width:100%!important;height:100%;" > + + <!-- body --> + <table class="body-wrap" bgcolor="#f6f6f6" style="margin-top:0;margin-bottom:0;margin-right:0;margin-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;font-size:100%;line-height:1.6;width:100%;padding-top:20px;padding-bottom:20px;padding-right:20px;padding-left:20px;" > + <tr style="margin-top:0;margin-bottom:0;margin-right:0;margin-left:0;padding-top:0;padding-bottom:0;padding-right:0;padding-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;font-size:100%;line-height:1.6;" > + <td style="margin-top:0;margin-bottom:0;margin-right:0;margin-left:0;padding-top:0;padding-bottom:0;padding-right:0;padding-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;font-size:100%;line-height:1.6;" ></td> + <td class="container" bgcolor="#FFFFFF" style="font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;font-size:100%;line-height:1.6;display:block!important;max-width:600px!important;margin-top:0 !important;margin-bottom:0 !important;margin-right:auto !important;margin-left:auto !important;clear:both!important;padding-top:20px;padding-bottom:20px;padding-right:20px;padding-left:20px;border-width:1px;border-style:solid;border-color:#f0f0f0;" > + + <!-- content --> + <div class="content" style="padding-top:0;padding-bottom:0;padding-right:0;padding-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;font-size:100%;line-height:1.6;max-width:600px;margin-top:0;margin-bottom:0;margin-right:auto;margin-left:auto;display:block;" > + <table style="margin-top:0;margin-bottom:0;margin-right:0;margin-left:0;padding-top:0;padding-bottom:0;padding-right:0;padding-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;font-size:100%;line-height:1.6;width:100%;" > + <tr style="margin-top:0;margin-bottom:0;margin-right:0;margin-left:0;padding-top:0;padding-bottom:0;padding-right:0;padding-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;font-size:100%;line-height:1.6;" > + <td style="margin-top:0;margin-bottom:0;margin-right:0;margin-left:0;padding-top:0;padding-bottom:0;padding-right:0;padding-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;font-size:100%;line-height:1.6;" > + <h1 style="padding-top:0;padding-bottom:0;padding-right:0;padding-left:0;font-family:'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;color:#444;margin-top:10px;margin-bottom:10px;margin-right:0;margin-left:0;line-height:1.2;font-weight:200;font-size:36px;" >Password Reset</h1> + <p style="margin-top:0;margin-right:0;margin-left:0;padding-top:0;padding-bottom:0;padding-right:0;padding-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;line-height:1.6;margin-bottom:10px;font-weight:normal;font-size:14px;color:#888888;" >A password reset was requested for this email address on the application found at {{url('/')}}. If you did not request a password change please ignore this email.</p> + <table style="margin-top:0;margin-bottom:0;margin-right:0;margin-left:0;padding-top:0;padding-bottom:0;padding-right:0;padding-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;font-size:100%;line-height:1.6;width:100%;" > + <tr style="margin-top:0;margin-bottom:0;margin-right:0;margin-left:0;padding-top:0;padding-bottom:0;padding-right:0;padding-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;font-size:100%;line-height:1.6;" > + <td class="padding" style="margin-top:0;margin-bottom:0;margin-right:0;margin-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;font-size:100%;line-height:1.6;padding-top:10px;padding-bottom:10px;padding-right:0;padding-left:0;" > + <p style="margin-top:0;margin-right:0;margin-left:0;padding-top:0;padding-bottom:0;padding-right:0;padding-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;line-height:1.6;margin-bottom:10px;font-weight:normal;font-size:14px;color:#888888;" ><a class="btn-primary" href="{{ url('password/reset/'.$token) }}" style="margin-top:0;margin-bottom:0;margin-left:0;padding-top:0;padding-bottom:0;padding-right:0;padding-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;font-size:100%;text-decoration:none;color:#FFF;background-color:#348eda;border-style:solid;border-color:#348eda;border-width:10px 20px;line-height:2;font-weight:bold;margin-right:10px;text-align:center;cursor:pointer;display:inline-block;border-radius:4px;" >Click here to reset your password</a></p> + </td> + </tr> + </table> + </td> + </tr> + </table> + </div> + <!-- /content --> + + </td> + <td style="margin-top:0;margin-bottom:0;margin-right:0;margin-left:0;padding-top:0;padding-bottom:0;padding-right:0;padding-left:0;font-family:'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;font-size:100%;line-height:1.6;" ></td> + </tr> + </table> + <!-- /body --> + + + </body> + </html> \ No newline at end of file