1
0
mirror of https://github.com/cydrobolt/polr.git synced 2024-11-13 21:52:29 +01:00
polr/app/Http/Controllers/UserController.php

207 lines
7.1 KiB
PHP

<?php
namespace App\Http\Controllers;
use Mail;
use Hash;
use App\Models\User;
use Illuminate\Http\Request;
use App\Helpers\CryptoHelper;
use App\Helpers\UserHelper;
use App\Factories\UserFactory;
class UserController extends Controller {
/**
* Show pages related to the user control panel.
*
* @return Response
*/
public function displayLoginPage(Request $request) {
return view('login');
}
public function displaySignupPage(Request $request) {
return view('signup');
}
public function displayLostPasswordPage(Request $request) {
return view('lost_password');
}
public function performLogoutUser(Request $request) {
$request->session()->forget('username');
$request->session()->forget('role');
return redirect()->route('index');
}
public function performLogin(Request $request) {
$username = $request->input('username');
$password = $request->input('password');
$credentials_valid = UserHelper::checkCredentials($username, $password);
if ($credentials_valid != false) {
// log user in
$role = $credentials_valid['role'];
$request->session()->put('username', $username);
$request->session()->put('role', $role);
return redirect()->route('index');
}
else {
return redirect('login')->with('error', 'Invalid password or inactivated account. Try again.');
}
}
public function performSignup(Request $request) {
if (env('POLR_ALLOW_ACCT_CREATION') == false) {
return redirect(route('index'))->with('error', 'Sorry, but registration is disabled.');
}
if (env('POLR_ACCT_CREATION_RECAPTCHA')) {
// Verify reCAPTCHA if setting is enabled
$gRecaptchaResponse = $request->input('g-recaptcha-response');
$recaptcha = new \ReCaptcha\ReCaptcha(env('POLR_RECAPTCHA_SECRET_KEY'));
$recaptcha_resp = $recaptcha->verify($gRecaptchaResponse, $request->ip());
if (!$recaptcha_resp->isSuccess()) {
return redirect(route('signup'))->with('error', 'You must complete the reCAPTCHA to register.');
}
}
// Validate signup form data
$this->validate($request, [
'username' => 'required|alpha_dash',
'password' => 'required',
'email' => 'required|email'
]);
$username = $request->input('username');
$password = $request->input('password');
$email = $request->input('email');
if (env('SETTING_RESTRICT_EMAIL_DOMAIN')) {
$email_domain = explode('@', $email)[1];
$permitted_email_domains = explode(',', env('SETTING_ALLOWED_EMAIL_DOMAINS'));
if (!in_array($email_domain, $permitted_email_domains)) {
return redirect(route('signup'))->with('error', 'Sorry, your email\'s domain is not permitted to create new accounts.');
}
}
$ip = $request->ip();
$user_exists = UserHelper::userExists($username);
$email_exists = UserHelper::emailExists($email);
if ($user_exists || $email_exists) {
// if user or email email
return redirect(route('signup'))->with('error', 'Sorry, your email or username already exists. Try again.');
}
$acct_activation_needed = env('POLR_ACCT_ACTIVATION');
if ($acct_activation_needed == false) {
// if no activation is necessary
$active = 1;
$response = redirect(route('login'))->with('success', 'Thanks for signing up! You may now log in.');
}
else {
// email activation is necessary
$response = redirect(route('login'))->with('success', 'Thanks for signing up! Please confirm your email to continue.');
$active = 0;
}
$api_active = false;
$api_key = null;
if (env('SETTING_AUTO_API')) {
// if automatic API key assignment is on
$api_active = 1;
$api_key = CryptoHelper::generateRandomHex(env('_API_KEY_LENGTH'));
}
$user = UserFactory::createUser($username, $email, $password, $active, $ip, $api_key, $api_active);
if ($acct_activation_needed) {
Mail::send('emails.activation', [
'username' => $username, 'recovery_key' => $user->recovery_key, 'ip' => $ip
], function ($m) use ($user) {
$m->from(env('MAIL_FROM_ADDRESS'), env('MAIL_FROM_NAME'));
$m->to($user->email, $user->username)->subject(env('APP_NAME') . ' account activation');
});
}
return $response;
}
public function performSendPasswordResetCode(Request $request) {
if (!env('SETTING_PASSWORD_RECOV')) {
return redirect(route('index'))->with('error', 'Password recovery is disabled.');
}
$email = $request->input('email');
$ip = $request->ip();
$user = UserHelper::getUserByEmail($email);
if (!$user) {
return redirect(route('lost_password'))->with('error', 'Email is not associated with a user.');
}
$recovery_key = UserHelper::resetRecoveryKey($user->username);
Mail::send('emails.lost_password', [
'username' => $user->username, 'recovery_key' => $recovery_key, 'ip' => $ip
], function ($m) use ($user) {
$m->from(env('MAIL_FROM_ADDRESS'), env('MAIL_FROM_NAME'));
$m->to($user->email, $user->username)->subject(env('APP_NAME') . ' Password Reset');
});
return redirect(route('index'))->with('success', 'Password reset email sent. Check your inbox for details.');
}
public function performActivation(Request $request, $username, $recovery_key) {
$user = UserHelper::getUserByUsername($username, true);
if (UserHelper::userResetKeyCorrect($username, $recovery_key, true)) {
// Key is correct
// Activate account and reset recovery key
$user->active = 1;
$user->save();
UserHelper::resetRecoveryKey($username);
return redirect(route('login'))->with('success', 'Account activated. You may now login.');
}
else {
return redirect(route('index'))->with('error', 'Username or activation key incorrect.');
}
}
public function performPasswordReset(Request $request, $username, $recovery_key) {
$new_password = $request->input('new_password');
$user = UserHelper::getUserByUsername($username);
if (UserHelper::userResetKeyCorrect($username, $recovery_key)) {
if (!$new_password) {
return view('reset_password');
}
// Key is correct
// Reset password
$user->password = Hash::make($new_password);
$user->save();
UserHelper::resetRecoveryKey($username);
return redirect(route('login'))->with('success', 'Password reset. You may now login.');
}
else {
return redirect(route('index'))->with('error', 'Username or reset key incorrect.');
}
}
}