From d397b28f578500ebf7dead37257c4e9235f39416 Mon Sep 17 00:00:00 2001 From: DariusIII Date: Wed, 28 Mar 2018 15:53:25 +0200 Subject: [PATCH] Change login/register pages --- .env.example | 6 +- Changelog | 1 + app/Http/Controllers/Auth/LoginController.php | 1 + .../Controllers/Auth/RegisterController.php | 121 +++++++++++++++++- composer.json | 1 + composer.lock | 61 ++++++++- public/pages/forgottenpassword.php | 4 - public/pages/register.php | 93 -------------- resources/views/themes/shared/captcha.tpl | 28 +--- routes/web.php | 4 +- 10 files changed, 190 insertions(+), 130 deletions(-) diff --git a/.env.example b/.env.example index daffbb77c..5b1304d63 100644 --- a/.env.example +++ b/.env.example @@ -64,9 +64,9 @@ PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= -RECAPTCHA_ENABLED= -RECAPTCHA_SITEKEY= -RECAPTCHA_SECRETKEY= +NOCAPTCHA_ENABLED= +NOCAPTCHA_SITEKEY= +NOCAPTCHA_SECRET= MYCELIUM_GATEWAY_ID= MYCELIUM_GATEWAY_SECRET= diff --git a/Changelog b/Changelog index 8fb7b39a4..8d21e7da7 100755 --- a/Changelog +++ b/Changelog @@ -1,4 +1,5 @@ 2018-03-28 DariusIII + * Chg: Change login/register pages * Chg: Change from Page to BasePage in Captcha class, remove unused use statement in SABNzbd class * Chg: Remove Page and AdminPage classes, adjust pages accordingly * Chg: Update font-awesome to version 5.0.9 diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 89e271770..a2de7bf57 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -48,6 +48,7 @@ class LoginController extends Controller $this->validate($request, [ 'username' => 'required', 'password' => 'required', + 'g-recaptcha-response' => 'required|captcha' ]); $rememberMe = $request->has('rememberme') && $request->input('rememberme') === 'on'; diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index a72165e68..d799fd403 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -2,10 +2,15 @@ namespace App\Http\Controllers\Auth; +use App\Models\Invitation; +use App\Models\Settings; use App\Models\User; +use App\Models\UserRole; +use Blacklight\http\BasePage; use Illuminate\Http\Request; use Blacklight\utility\Utility; use App\Http\Controllers\Controller; +use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Password; use Illuminate\Support\Facades\Validator; use Illuminate\Foundation\Auth\RegistersUsers; @@ -54,6 +59,7 @@ class RegisterController extends Controller 'username' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:8|confirmed', + 'g-recaptcha-response' => 'required|captcha' ]); } @@ -65,13 +71,126 @@ class RegisterController extends Controller */ protected function create(array $data): User { + return User::create([ 'username' => $data['username'], 'email' => $data['email'], 'password' => User::hashPassword($data['password']), - 'user_roles_id' => User::ROLE_USER, + 'host' => $data['host'] ?? '', + 'user_roles_id' => $data['user_roles_id'], + 'notes' => $data['notes'], + 'invites' => $data['defaultinvites'], 'rsstoken' => md5(Password::getRepository()->createNewToken()), 'userseed' => md5(Utility::generateUuid()), ]); } + + public function register(Request $request) + { + $userName = $password = $confirmPassword = $email = $inviteCode = $inviteCodeQuery = ''; + $showRegister = 1; + + if ((int) Settings::settingValue('..registerstatus') === Settings::REGISTER_STATUS_CLOSED) { + session()->flash('status', 'Registrations are currently disabled.'); + $showRegister = 0; + } elseif (Settings::settingValue('..registerstatus') === Settings::REGISTER_STATUS_INVITE && (! $request->has('invitecode') || empty($request->input('invitecode')))) { + session()->flash('status', 'Registrations are currently invite only.'); + $showRegister = 0; + } + + if ($showRegister === 1) { + $action = $request->input('action') ?? 'view'; + + switch ($action) { + case 'submit': + $userName = $request->input('username'); + $password = $request->input('password'); + $confirmPassword = $request->input('confirmpassword'); + $email = $request->input('email'); + if (! empty($request->input('invitecode'))) { + $inviteCode = $request->input('invitecode'); + } + + // Check uname/email isn't in use, password valid. If all good create new user account and redirect back to home page. + if ($password !== $confirmPassword) { + session()->flash('status', 'Password Mismatch'); + } else { + // Get the default user role. + $userDefault = UserRole::getDefaultRole(); + + if ((int) Settings::settingValue('..registerstatus') === Settings::REGISTER_STATUS_INVITE) { + if ($inviteCode === '') { + echo 'Sorry, the invite code is old or has been used.'; + break; + } + + $invitedBy = User::checkAndUseInvite($inviteCode); + if ($invitedBy < 0) { + echo 'Sorry, the invite code is old or has been used.'; + break; + } + } + + if (! User::isValidUsername($userName)) { + echo 'Your username must be at least five characters.'; + break; + } + + if (! User::isValidPassword($password)) { + echo 'Your password must be longer than eight characters, have at least 1 number, at least 1 capital and at least one lowercase letter'; + break; + } + + if (! User::isValidEmail($email)) { + echo 'Your email is not a valid format.'; + break; + } + + $res = User::getByUsername($userName); + if ($res) { + echo 'Sorry, the username is already taken.'; + break; + } + + $res = User::getByEmail($email); + if ($res) { + echo 'Sorry, the email is already in use.'; + break; + } + + $ret = $this->create( + [ + 'username' => $userName, + 'password' => $password, + 'email' => $email, + 'host' => $request->ip(), + 'user_roles_id' => $userDefault['id'], + 'notes' => '', + 'defaultinvites' => $userDefault['defaultinvites'], + ] + ); + + if ($ret->id > 0) { + Auth::loginUsingId($ret->id); + return redirect()->intended($this->redirectPath()); + } + } + break; + case 'view': { + $inviteCode = $request->input('invitecode') ?? null; + if ($inviteCode !== null) { + // See if it is a valid invite. + $invite = Invitation::getInvite($inviteCode); + if (! $invite) { + echo sprintf('Bad or invite code older than %d days.', Invitation::DEFAULT_INVITE_EXPIRY_DAYS); + $showRegister = 0; + } else { + $inviteCode = $invite['guid']; + } + } + break; + } + } + } + } } diff --git a/composer.json b/composer.json index 28f016b33..7206f3b8c 100755 --- a/composer.json +++ b/composer.json @@ -87,6 +87,7 @@ "ext-zlib": "*", "adrenth/thetvdb2": "~2.0", "aharen/omdbapi": "^2.0", + "anhskohbo/no-captcha": "^3.0", "b3rs3rk/steamfront": "dev-master", "barracudanetworks/forkdaemon-php": "~1.0", "bhuvidya/laravel-countries": "^1.0", diff --git a/composer.lock b/composer.lock index 42df19961..9bd6efce5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "439e26c2e47faf4a00450444c7bdb639", + "content-hash": "f2acc7e27df924cddabf69bac8e8aa04", "packages": [ { "name": "adrenth/thetvdb2", @@ -103,6 +103,65 @@ ], "time": "2017-05-19T02:39:02+00:00" }, + { + "name": "anhskohbo/no-captcha", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/anhskohbo/no-captcha.git", + "reference": "f6c3a006b8c74f692d232d861c3e104621f50dcc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/anhskohbo/no-captcha/zipball/f6c3a006b8c74f692d232d861c3e104621f50dcc", + "reference": "f6c3a006b8c74f692d232d861c3e104621f50dcc", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.2", + "illuminate/support": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*|5.6.*", + "php": ">=5.5.5" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Anhskohbo\\NoCaptcha\\NoCaptchaServiceProvider" + ], + "aliases": { + "NoCaptcha": "Anhskohbo\\NoCaptcha\\Facades\\NoCaptcha" + } + } + }, + "autoload": { + "psr-4": { + "Anhskohbo\\NoCaptcha\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "anhskohbo", + "email": "anhskohbo@gmail.com" + } + ], + "description": "No CAPTCHA reCAPTCHA For Laravel.", + "keywords": [ + "captcha", + "laravel", + "laravel4", + "laravel5", + "no-captcha", + "recaptcha" + ], + "time": "2018-02-09T02:04:49+00:00" + }, { "name": "b3rs3rk/steamfront", "version": "dev-master", diff --git a/public/pages/forgottenpassword.php b/public/pages/forgottenpassword.php index 1895817ad..ea5c926fe 100644 --- a/public/pages/forgottenpassword.php +++ b/public/pages/forgottenpassword.php @@ -13,7 +13,6 @@ if (Auth::check()) { $action = request()->input('action') ?? 'view'; -$captcha = new Captcha($page); $email = $rssToken = $sent = $confirmed = ''; switch ($action) { @@ -45,8 +44,6 @@ switch ($action) { break; case 'submit': - - if ($captcha->getError() === false) { $email = request()->input('email') ?? ''; $rssToken = request()->input('apikey') ?? ''; if (empty($email) && empty($rssToken)) { @@ -75,7 +72,6 @@ switch ($action) { break; } break; - } } $page->smarty->assign( [ diff --git a/public/pages/register.php b/public/pages/register.php index 733fd2458..08371a56b 100644 --- a/public/pages/register.php +++ b/public/pages/register.php @@ -15,100 +15,7 @@ if (Auth::check()) { $error = $userName = $password = $confirmPassword = $email = $inviteCode = $inviteCodeQuery = ''; $showRegister = 1; -if ((int) Settings::settingValue('..registerstatus') === Settings::REGISTER_STATUS_CLOSED) { - $error = 'Registrations are currently disabled.'; - $showRegister = 0; -} elseif (Settings::settingValue('..registerstatus') === Settings::REGISTER_STATUS_INVITE && (! request()->has('invitecode') || empty(request()->input('invitecode')))) { - $error = 'Registrations are currently invite only.'; - $showRegister = 0; -} -if ($showRegister === 1) { - $action = request()->input('action') ?? 'view'; - - //Be sure to persist the invite code in the event of multiple form submissions. (errors) - if (request()->has('invitecode')) { - $inviteCodeQuery = '&invitecode='.request()->input('invitecode'); - } - - $captcha = new Captcha($page); - - switch ($action) { - case 'submit': - if ($captcha->getError() === false) { - $userName = request()->input('username'); - $password = request()->input('password'); - $confirmPassword = request()->input('confirmpassword'); - $email = request()->input('email'); - if (! empty(request()->input('invitecode'))) { - $inviteCode = request()->input('invitecode'); - } - - // Check uname/email isn't in use, password valid. If all good create new user account and redirect back to home page. - if ($password !== $confirmPassword) { - $error = 'Password Mismatch'; - } else { - // Get the default user role. - $userDefault = UserRole::getDefaultRole(); - - $ret = User::signup( - $userName, - $password, - $email, - request()->ip(), - $userDefault['id'], - '', - $userDefault['defaultinvites'], - $inviteCode - ); - - if ($ret > 0) { - session()->flash('You are already a member!'); - redirect('/'); - } else { - switch ($ret) { - case User::ERR_SIGNUP_BADUNAME: - $error = 'Your username must be at least five characters.'; - break; - case User::ERR_SIGNUP_BADPASS: - $error = 'Your password must be longer than eight characters, have at least 1 number, at least 1 capital and at least one lowercase letter'; - break; - case User::ERR_SIGNUP_BADEMAIL: - $error = 'Your email is not a valid format.'; - break; - case User::ERR_SIGNUP_UNAMEINUSE: - $error = 'Sorry, the username is already taken.'; - break; - case User::ERR_SIGNUP_EMAILINUSE: - $error = 'Sorry, the email is already in use.'; - break; - case User::ERR_SIGNUP_BADINVITECODE: - $error = 'Sorry, the invite code is old or has been used.'; - break; - default: - $error = 'Failed to register.'; - break; - } - } - } - } - break; - case 'view': { - $inviteCode = request()->input('invitecode') ?? null; - if (isset($inviteCode)) { - // See if it is a valid invite. - $invite = Invitation::getInvite($inviteCode); - if (! $invite) { - $error = sprintf('Bad or invite code older than %d days.', Invitation::DEFAULT_INVITE_EXPIRY_DAYS); - $showRegister = 0; - } else { - $inviteCode = $invite['guid']; - } - } - break; - } - } -} $page->smarty->assign( [ 'username' => Utility::htmlfmt($userName), diff --git a/resources/views/themes/shared/captcha.tpl b/resources/views/themes/shared/captcha.tpl index 07f1cbe4e..5cb1d862b 100755 --- a/resources/views/themes/shared/captcha.tpl +++ b/resources/views/themes/shared/captcha.tpl @@ -1,25 +1,3 @@ -{if !empty($sitekey)} - -
- -{/if} +{NoCaptcha::display()} +{NoCaptcha::renderJs()} + diff --git a/routes/web.php b/routes/web.php index a089b5adf..488a11291 100644 --- a/routes/web.php +++ b/routes/web.php @@ -37,9 +37,7 @@ Route::get('/register', function () { redirect('/register'); })->middleware('guest'); -Route::post('/register', function () { - redirect('/register'); -})->middleware('guest'); +Route::post('/register', 'Auth\RegisterController@register'); Route::get('/forgottenpassword', function () { redirect('/forgottenpassword');