2024-01-11 08:35:15 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
|
|
|
|
use Illuminate\Http\Request;
|
|
|
|
use App\Models\ParentalControls;
|
|
|
|
use App\Models\UserRoles;
|
2024-01-11 13:31:19 +00:00
|
|
|
use App\Profile;
|
2024-01-11 08:35:15 +00:00
|
|
|
use App\User;
|
|
|
|
use App\Http\Controllers\Auth\RegisterController;
|
|
|
|
use Illuminate\Auth\Events\Registered;
|
|
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
use App\Services\UserRoleService;
|
|
|
|
use App\Jobs\ParentalControlsPipeline\DispatchChildInvitePipeline;
|
|
|
|
|
|
|
|
class ParentalControlsController extends Controller
|
|
|
|
{
|
|
|
|
public function authPreflight($request, $maxUserCheck = false, $authCheck = true)
|
|
|
|
{
|
|
|
|
if($authCheck) {
|
|
|
|
abort_unless($request->user(), 404);
|
2024-01-11 13:52:12 +00:00
|
|
|
abort_unless($request->user()->has_roles === 0, 404);
|
2024-01-11 08:35:15 +00:00
|
|
|
}
|
|
|
|
abort_unless(config('instance.parental_controls.enabled'), 404);
|
|
|
|
if(config_cache('pixelfed.open_registration') == false) {
|
|
|
|
abort_if(config('instance.parental_controls.limits.respect_open_registration'), 404);
|
|
|
|
}
|
|
|
|
if($maxUserCheck == true) {
|
|
|
|
$hasLimit = config('pixelfed.enforce_max_users');
|
|
|
|
if($hasLimit) {
|
|
|
|
$count = User::where(function($q){ return $q->whereNull('status')->orWhereNotIn('status', ['deleted','delete']); })->count();
|
|
|
|
$limit = (int) config('pixelfed.max_users');
|
|
|
|
|
|
|
|
abort_if($limit && $limit <= $count, 404);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function index(Request $request)
|
|
|
|
{
|
|
|
|
$this->authPreflight($request);
|
|
|
|
$children = ParentalControls::whereParentId($request->user()->id)->latest()->paginate(5);
|
|
|
|
return view('settings.parental-controls.index', compact('children'));
|
|
|
|
}
|
|
|
|
|
|
|
|
public function add(Request $request)
|
|
|
|
{
|
|
|
|
$this->authPreflight($request, true);
|
|
|
|
return view('settings.parental-controls.add');
|
|
|
|
}
|
|
|
|
|
|
|
|
public function view(Request $request, $id)
|
|
|
|
{
|
|
|
|
$this->authPreflight($request);
|
|
|
|
$uid = $request->user()->id;
|
|
|
|
$pc = ParentalControls::whereParentId($uid)->findOrFail($id);
|
|
|
|
return view('settings.parental-controls.manage', compact('pc'));
|
|
|
|
}
|
|
|
|
|
|
|
|
public function update(Request $request, $id)
|
|
|
|
{
|
|
|
|
$this->authPreflight($request);
|
|
|
|
$uid = $request->user()->id;
|
2024-01-11 11:41:38 +00:00
|
|
|
$ff = $this->requestFormFields($request);
|
2024-01-11 08:35:15 +00:00
|
|
|
$pc = ParentalControls::whereParentId($uid)->findOrFail($id);
|
2024-01-11 11:41:38 +00:00
|
|
|
$pc->permissions = $ff;
|
2024-01-11 08:35:15 +00:00
|
|
|
$pc->save();
|
2024-01-11 11:41:38 +00:00
|
|
|
|
|
|
|
$roles = UserRoleService::mapActions($pc->child_id, $ff);
|
2024-01-11 13:31:19 +00:00
|
|
|
if(isset($roles['account-force-private'])) {
|
|
|
|
$c = Profile::whereUserId($pc->child_id)->first();
|
|
|
|
$c->is_private = $roles['account-force-private'];
|
|
|
|
$c->save();
|
|
|
|
}
|
2024-01-11 11:41:38 +00:00
|
|
|
UserRoles::whereUserId($pc->child_id)->update(['roles' => $roles]);
|
2024-01-11 08:35:15 +00:00
|
|
|
return redirect($pc->manageUrl() . '?permissions');
|
|
|
|
}
|
|
|
|
|
|
|
|
public function store(Request $request)
|
|
|
|
{
|
|
|
|
$this->authPreflight($request, true);
|
|
|
|
$this->validate($request, [
|
|
|
|
'email' => 'required|email|unique:parental_controls,email|unique:users,email',
|
|
|
|
]);
|
|
|
|
|
|
|
|
$state = $this->requestFormFields($request);
|
|
|
|
|
|
|
|
$pc = new ParentalControls;
|
|
|
|
$pc->parent_id = $request->user()->id;
|
|
|
|
$pc->email = $request->input('email');
|
|
|
|
$pc->verify_code = str_random(32);
|
|
|
|
$pc->permissions = $state;
|
|
|
|
$pc->save();
|
|
|
|
|
|
|
|
DispatchChildInvitePipeline::dispatch($pc);
|
|
|
|
return redirect($pc->manageUrl());
|
|
|
|
}
|
|
|
|
|
|
|
|
public function inviteRegister(Request $request, $id, $code)
|
|
|
|
{
|
2024-01-11 09:12:54 +00:00
|
|
|
if($request->user()) {
|
|
|
|
$title = 'You cannot complete this action on this device.';
|
|
|
|
$body = 'Please log out or use a different device or browser to complete the invitation registration.';
|
|
|
|
return view('errors.custom', compact('title', 'body'));
|
|
|
|
}
|
|
|
|
|
2024-01-11 08:35:15 +00:00
|
|
|
$this->authPreflight($request, true, false);
|
2024-01-11 09:12:54 +00:00
|
|
|
|
2024-01-11 08:35:15 +00:00
|
|
|
$pc = ParentalControls::whereRaw('verify_code = BINARY ?', $code)->whereNull(['email_verified_at', 'child_id'])->findOrFail($id);
|
|
|
|
abort_unless(User::whereId($pc->parent_id)->exists(), 404);
|
|
|
|
return view('settings.parental-controls.invite-register-form', compact('pc'));
|
|
|
|
}
|
|
|
|
|
|
|
|
public function inviteRegisterStore(Request $request, $id, $code)
|
|
|
|
{
|
2024-01-11 09:12:54 +00:00
|
|
|
if($request->user()) {
|
|
|
|
$title = 'You cannot complete this action on this device.';
|
|
|
|
$body = 'Please log out or use a different device or browser to complete the invitation registration.';
|
|
|
|
return view('errors.custom', compact('title', 'body'));
|
|
|
|
}
|
|
|
|
|
2024-01-11 08:35:15 +00:00
|
|
|
$this->authPreflight($request, true, false);
|
|
|
|
|
|
|
|
$pc = ParentalControls::whereRaw('verify_code = BINARY ?', $code)->whereNull('email_verified_at')->findOrFail($id);
|
|
|
|
|
|
|
|
$fields = $request->all();
|
|
|
|
$fields['email'] = $pc->email;
|
|
|
|
$defaults = UserRoleService::defaultRoles();
|
|
|
|
$validator = (new RegisterController)->validator($fields);
|
|
|
|
$valid = $validator->validate();
|
|
|
|
abort_if(!$valid, 404);
|
|
|
|
event(new Registered($user = (new RegisterController)->create($fields)));
|
|
|
|
sleep(5);
|
|
|
|
$user->has_roles = true;
|
|
|
|
$user->parent_id = $pc->parent_id;
|
|
|
|
if(config('instance.parental_controls.limits.auto_verify_email')) {
|
|
|
|
$user->email_verified_at = now();
|
|
|
|
$user->save();
|
|
|
|
sleep(3);
|
|
|
|
} else {
|
|
|
|
$user->save();
|
|
|
|
sleep(3);
|
|
|
|
}
|
|
|
|
$ur = UserRoles::updateOrCreate([
|
|
|
|
'user_id' => $user->id,
|
|
|
|
],[
|
|
|
|
'roles' => UserRoleService::mapInvite($user->id, $pc->permissions)
|
|
|
|
]);
|
|
|
|
$pc->email_verified_at = now();
|
|
|
|
$pc->child_id = $user->id;
|
|
|
|
$pc->save();
|
|
|
|
sleep(2);
|
|
|
|
Auth::guard()->login($user);
|
|
|
|
|
|
|
|
return redirect('/i/web');
|
|
|
|
}
|
|
|
|
|
|
|
|
public function cancelInvite(Request $request, $id)
|
|
|
|
{
|
|
|
|
$this->authPreflight($request);
|
|
|
|
$pc = ParentalControls::whereParentId($request->user()->id)
|
|
|
|
->whereNull(['email_verified_at', 'child_id'])
|
|
|
|
->findOrFail($id);
|
|
|
|
|
|
|
|
return view('settings.parental-controls.delete-invite', compact('pc'));
|
|
|
|
}
|
|
|
|
|
|
|
|
public function cancelInviteHandle(Request $request, $id)
|
|
|
|
{
|
|
|
|
$this->authPreflight($request);
|
|
|
|
$pc = ParentalControls::whereParentId($request->user()->id)
|
|
|
|
->whereNull(['email_verified_at', 'child_id'])
|
|
|
|
->findOrFail($id);
|
|
|
|
|
|
|
|
$pc->delete();
|
|
|
|
|
|
|
|
return redirect('/settings/parental-controls');
|
|
|
|
}
|
|
|
|
|
|
|
|
public function stopManaging(Request $request, $id)
|
|
|
|
{
|
|
|
|
$this->authPreflight($request);
|
|
|
|
$pc = ParentalControls::whereParentId($request->user()->id)
|
|
|
|
->whereNotNull(['email_verified_at', 'child_id'])
|
|
|
|
->findOrFail($id);
|
|
|
|
|
|
|
|
return view('settings.parental-controls.stop-managing', compact('pc'));
|
|
|
|
}
|
|
|
|
|
|
|
|
public function stopManagingHandle(Request $request, $id)
|
|
|
|
{
|
|
|
|
$this->authPreflight($request);
|
|
|
|
$pc = ParentalControls::whereParentId($request->user()->id)
|
|
|
|
->whereNotNull(['email_verified_at', 'child_id'])
|
|
|
|
->findOrFail($id);
|
|
|
|
$pc->child()->update([
|
|
|
|
'has_roles' => false,
|
|
|
|
'parent_id' => null,
|
|
|
|
]);
|
|
|
|
$pc->delete();
|
|
|
|
|
|
|
|
return redirect('/settings/parental-controls');
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function requestFormFields($request)
|
|
|
|
{
|
|
|
|
$state = [];
|
|
|
|
$fields = [
|
|
|
|
'post',
|
|
|
|
'comment',
|
|
|
|
'like',
|
|
|
|
'share',
|
|
|
|
'follow',
|
|
|
|
'bookmark',
|
|
|
|
'story',
|
|
|
|
'collection',
|
|
|
|
'discovery_feeds',
|
|
|
|
'dms',
|
|
|
|
'federation',
|
|
|
|
'hide_network',
|
|
|
|
'private',
|
|
|
|
'hide_cw'
|
|
|
|
];
|
|
|
|
|
|
|
|
foreach ($fields as $field) {
|
|
|
|
$state[$field] = $request->input($field) == 'on';
|
|
|
|
}
|
|
|
|
|
|
|
|
return $state;
|
|
|
|
}
|
|
|
|
}
|