Files
coolify/app/Livewire/Admin/Index.php
T
Andras BacsaiandClaude Opus 5.5 3379fa448a fix(audit): keep personal data and credentials out of audit events
Anonymize the audit events of a deleted user, store only the ID and
name of other users, and drop the metadata copy of actor_email.
Store URLs without query strings, registries without user info, and
the exception class instead of raw SSH errors.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 09:31:44 +01:00

105 lines
2.9 KiB
PHP

<?php
namespace App\Livewire\Admin;
use App\Models\Team;
use App\Models\User;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Auth;
use Livewire\Component;
class Index extends Component
{
public int $activeSubscribers;
public int $inactiveSubscribers;
public Collection $foundUsers;
public string $search = '';
public function mount()
{
if (! isCloud() && ! isDev()) {
abort(403);
}
$this->authorizeAdminAccess();
$this->getSubscribers();
}
public function back()
{
$this->authorizeAdminAccess();
if (session('impersonator_id') === 0) {
session()->forget(['impersonator_id', 'impersonating']);
$user = User::find(0);
$team_to_switch_to = $user->resolveStoredTeam() ?? $user->teams->first();
Auth::login($user);
refreshSession($team_to_switch_to);
return redirect()->route('admin.index');
}
}
public function submitSearch()
{
$this->authorizeAdminAccess();
if ($this->search !== '') {
$this->foundUsers = User::where(function ($query) {
$query->where('name', 'like', "%{$this->search}%")
->orWhere('email', 'like', "%{$this->search}%");
})->get();
}
}
public function getSubscribers()
{
if (Auth::id() !== 0 && session('impersonator_id') !== 0) {
return redirect()->route('dashboard');
}
$this->inactiveSubscribers = Team::whereRelation('subscription', 'stripe_invoice_paid', false)->count();
$this->activeSubscribers = Team::whereRelation('subscription', 'stripe_invoice_paid', true)->count();
}
public function switchUser(int $user_id)
{
$this->authorizeRootOnly();
session(['impersonator_id' => Auth::id(), 'impersonating' => true]);
$user = User::find($user_id);
if (! $user) {
abort(404);
}
$team_to_switch_to = $user->resolveStoredTeam() ?? $user->teams->first();
auditLog('ui.user.impersonated', [
'team_id' => currentTeam()?->id,
'resource' => 'user',
'user_name' => $user->name,
'target_user_id' => $user->id,
'target_team_id' => $team_to_switch_to?->id,
]);
Auth::login($user);
refreshSession($team_to_switch_to);
return redirect()->route('dashboard');
}
private function authorizeAdminAccess(): void
{
if (! Auth::check() || (Auth::id() !== 0 && session('impersonator_id') !== 0)) {
abort(403);
}
}
private function authorizeRootOnly(): void
{
if (! Auth::check() || Auth::id() !== 0) {
abort(403);
}
}
public function render()
{
return view('livewire.admin.index');
}
}