Skip to content

Commit

Permalink
Update invite code
Browse files Browse the repository at this point in the history
  • Loading branch information
DariusIII committed Aug 6, 2019
1 parent 7087fc6 commit 8f78472
Show file tree
Hide file tree
Showing 10 changed files with 183 additions and 86 deletions.
2 changes: 2 additions & 0 deletions Changelog
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
2019-08-06 DariusIII
* Chg: Update invite code
2019-08-05 DariusIII
* Chg: Fix sending invites when site is in invite mode
2019-08-04 DariusIII
Expand Down
4 changes: 4 additions & 0 deletions app/Http/Controllers/AjaxController.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@

class AjaxController extends BasePageController
{
/**
* @param Request $request
* @throws \Exception
*/
public function profile(Request $request)
{
$this->setPrefs();
Expand Down
154 changes: 79 additions & 75 deletions app/Http/Controllers/Auth/RegisterController.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,14 @@
use App\Models\User;
use App\Models\Settings;
use App\Models\Invitation;
use Illuminate\Http\RedirectResponse;
use Illuminate\Routing\Redirector;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use Blacklight\utility\Utility;
use Illuminate\Validation\ValidationException;
use Junaidnasir\Larainvite\Facades\Invite;
use Spatie\Permission\Models\Role;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Password;
Expand Down Expand Up @@ -50,9 +54,7 @@ public function __construct()
}

/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @param array $data
* @return \App\Models\User
*/
protected function create(array $data): User
Expand All @@ -73,14 +75,14 @@ protected function create(array $data): User
}

/**
* @param \Illuminate\Http\Request $request
* @param Request $request
*
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|void
* @throws \Illuminate\Validation\ValidationException
* @return RedirectResponse|Redirector|void
* @throws ValidationException
*/
public function register(Request $request)
{
$error = $userName = $password = $confirmPassword = $email = $inviteCode = $inviteCodeQuery = '';
$error = $userName = $password = $confirmPassword = $email = $inviteCode = '';
$showRegister = 1;

if ($request->has('invitecode')) {
Expand All @@ -102,73 +104,61 @@ public function register(Request $request)
if ($validator->fails()) {
$error = implode('', Arr::collapse($validator->errors()->toArray()));

return $this->showRegistrationForm($error);
return $this->showRegistrationForm($request, $error);
}

if (Settings::settingValue('..registerstatus') === Settings::REGISTER_STATUS_INVITE && (! $request->has('invitecode') || empty($request->input('invitecode')))) {
/*if (empty($inviteCode) && (int) Settings::settingValue('..registerstatus') === Settings::REGISTER_STATUS_INVITE) {
$error = 'Registrations are currently invite only.';
$showRegister = 0;
return $this->showRegistrationForm($error);
}
return $this->showRegistrationForm($request, $error, $showRegister);
}*/

if ($showRegister === 1) {
$action = $request->input('action') ?? 'view';

switch ($action) {
case 'submit':
$userName = $request->input('username');
$password = $request->input('password');
$confirmPassword = $request->input('password_confirmation');
$email = $request->input('email');

// Get the default user role.
$userDefault = Role::query()->where('isdefault', '=', 1)->first();

if ((int) Settings::settingValue('..registerstatus') === Settings::REGISTER_STATUS_INVITE) {
if ($inviteCode === '') {
$error = 'Sorry, the invite code is old or has been used.';
break;
}

$invitedBy = User::checkAndUseInvite($inviteCode);
if ($invitedBy < 0) {
$error = 'Sorry, the invite code is old or has been used.';
break;
}
}

if (! empty($error)) {
return $this->showRegistrationForm($error);
}

$user = $this->create(
[
'username' => $userName,
'password' => $password,
'email' => $email,
'host' => $request->ip(),
'roles_id' => $userDefault !== null ? $userDefault['id'] : User::ROLE_USER,
'notes' => '',
'defaultinvites' => $userDefault !== null ? $userDefault['defaultinvites'] : Invitation::DEFAULT_INVITES,
]
);

return $this->registered($request, $user) ?: redirect($this->redirectPath());
$action = $request->input('action') ?? 'view';

switch ($action) {
case 'submit':
$userName = $request->input('username');
$password = $request->input('password');
$confirmPassword = $request->input('password_confirmation');
$email = $request->input('email');

break;
case 'view': {
if ($inviteCode !== null) {
// 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'];
}
// Get the default user role.
$userDefault = Role::query()->where('isdefault', '=', 1)->first();

if (! empty($error)) {
return $this->showRegistrationForm($request, $error);
}
break;

if( Invite::isAllowed($inviteCode,$email) || Settings::settingValue('..registerstatus') !== Settings::REGISTER_STATUS_INVITE ){

$user = $this->create(
[
'username' => $userName,
'password' => $password,
'email' => $email,
'host' => $request->ip(),
'roles_id' => $userDefault !== null ? $userDefault['id'] : User::ROLE_USER,
'notes' => '',
'defaultinvites' => $userDefault !== null ? $userDefault['defaultinvites'] : Invitation::DEFAULT_INVITES,
]
);
Invite::consume($inviteCode);

return $this->registered($request, $user) ?: redirect($this->redirectPath());

}
break;
case 'view': {
// See if it is a valid invite.
if (($inviteCode !== null) && ! Invite::isValid($inviteCode)) {
$error = 'Invalid invitation token!';
$showRegister = 0;
} else {
$showRegister = 1;
}
break;
}
}
app('smarty.view')->assign(
Expand All @@ -178,29 +168,43 @@ public function register(Request $request)
'password_confirmation' => Utility::htmlfmt($confirmPassword),
'email' => Utility::htmlfmt($email),
'invitecode' => Utility::htmlfmt($inviteCode),
'invite_code_query' => Utility::htmlfmt($inviteCodeQuery),
'showregister' => $showRegister,
]
);

return $this->showRegistrationForm($error, $inviteCode);
return $this->showRegistrationForm($request, $error, $showRegister);
}

/**
* @param Request $request
* @param string $error
* @param string $inviteCode
* @param int $showRegister
*/
public function showRegistrationForm($error = '', $inviteCode = '')
public function showRegistrationForm(Request $request, $error = '', $showRegister = 0)
{
$showRegister = 1;
if ((int) Settings::settingValue('..registerstatus') === Settings::REGISTER_STATUS_CLOSED) {
$error = 'Registrations are currently disabled.';
$showRegister = 0;
$inviteCode = '';
if ($request->has('invitecode')) {
$inviteCode = $request->input('invitecode');
}
if (empty($inviteCode) && ((int) Settings::settingValue('..registerstatus') === Settings::REGISTER_STATUS_INVITE)) {
$error = 'Registrations are currently invite only.';

if ((int) Settings::settingValue('..registerstatus') === Settings::REGISTER_STATUS_INVITE) {
if (! empty($inviteCode)) {
if (Invite::isValid($inviteCode)) {
$error = '';
$showRegister = 1;
} else {
$error = 'Invalid or expired invitation token!';
$showRegister = 0;
}
} else {
$error = 'Registrations are currently invite only.';
$showRegister = 0;
}
} elseif ((int) Settings::settingValue('..registerstatus') === Settings::REGISTER_STATUS_CLOSED) {
$error = 'Registrations are currently closed.';
$showRegister = 0;
}

app('smarty.view')->assign('showregister', $showRegister);
app('smarty.view')->assign('error', $error);
$theme = Settings::settingValue('site.main.style');
Expand Down
9 changes: 6 additions & 3 deletions app/Models/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
use Illuminate\Http\Request;
use App\Jobs\SendInviteEmail;
use Illuminate\Support\Carbon;
use Junaidnasir\Larainvite\Facades\Invite;
use Junaidnasir\Larainvite\InviteTrait;
use Spatie\Permission\Models\Role;
use Illuminate\Support\Facades\Hash;
use App\Jobs\SendAccountExpiredEmail;
Expand All @@ -20,6 +22,7 @@
use Illuminate\Foundation\Auth\User as Authenticatable;

/**
* App\Models\User.
* App\Models\User.
*
* @property int $id
Expand Down Expand Up @@ -116,7 +119,7 @@
*/
class User extends Authenticatable
{
use Notifiable, UserVerification, HasRoles;
use Notifiable, UserVerification, HasRoles, InviteTrait;

public const ERR_SIGNUP_BADUNAME = -1;
public const ERR_SIGNUP_BADPASS = -2;
Expand Down Expand Up @@ -880,9 +883,9 @@ public static function getUsersByMonth()
*/
public static function sendInvite($serverUrl, $uid, $emailTo): string
{
$token = \Token::randomString(40);
$url = $serverUrl.'/register?invitecode='.$token;
$user = self::find($uid);
$token = Invite::invite($emailTo, $user->id);
$url = $serverUrl.'/register?invitecode='.$token;

Invitation::addInvite($uid, $token);
SendInviteEmail::dispatch($emailTo, $user, $url)->onQueue('emails');
Expand Down
2 changes: 1 addition & 1 deletion app/Observers/UserServiceObserver.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public function created(User $user)
SendWelcomeEmail::dispatch($user)->onQueue('welcomeemails');
UserVerification::generate($user);

UserVerification::send($user, 'User email verification required');
UserVerification::send($user, 'User email verification required', Settings::settingValue('site.main.email'));
}
}

Expand Down
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@
"james-heinrich/getid3": "1.9.*",
"joshpinkney/tv-maze-php-api": "dev-master",
"jrean/laravel-user-verification": "^7.0",
"junaidnasir/larainvite": "^2.0",
"kevinlebrun/colors.php": "^1.0",
"laravel/framework": "5.8.*",
"laravel/horizon": "^3.0",
Expand Down
60 changes: 59 additions & 1 deletion composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 28 additions & 0 deletions config/larainvite.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php
return [

/*
|--------------------------------------------------------------------------
| Invitation Expiration Default
|--------------------------------------------------------------------------
|
| Default Expiry time in Hours from current time.
| i.e now() + expires (hours)
|
*/
'expires' => 48,

/*
|--------------------------------------------------------------------------
| User Model
|--------------------------------------------------------------------------
*/
'UserModel' => 'App\Models\User',

/*
|--------------------------------------------------------------------------
| Invitation Model
|--------------------------------------------------------------------------
*/
'InvitationModel' => 'Junaidnasir\Larainvite\Models\LaraInviteModel'
];
Loading

0 comments on commit 8f78472

Please sign in to comment.