Skip to content
Merged
9 changes: 4 additions & 5 deletions resources/views/access/index.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,6 @@ class="min-w-0 flex-1"

<div class="grid gap-3 lg:grid-cols-2">
@foreach ($permissions as $permission)
@php($isSystemPermission = in_array($permission->name, config('lazy.admin.permissions.defaults', []), true))
<x-lazy-card compact class="border border-base-300 bg-base-100 shadow-sm">
<form
method="POST"
Expand All @@ -331,7 +330,7 @@ class="flex items-center gap-2"
@csrf
@method('PUT')

@if ($canEditPermissions && ! $isSystemPermission)
@if ($canEditPermissions && ! in_array($permission->name, config('lazy.admin.permissions.defaults', []), true))
<x-lazy-input
type="text"
name="name"
Expand All @@ -345,13 +344,13 @@ class="min-w-0 flex-1"
@else
<span class="min-w-0 flex-1 break-all font-medium">
{{ $permission->name }}
@if ($isSystemPermission)
@if (in_array($permission->name, config('lazy.admin.permissions.defaults', []), true))
<span class="mt-1 block text-xs font-normal opacity-60">{{ __('lazy-admin::access.system_permission') }}</span>
@endif
</span>
@endif

@if ($canDeletePermissions && ! $isSystemPermission)
@if ($canDeletePermissions && ! in_array($permission->name, config('lazy.admin.permissions.defaults', []), true))
<x-lazy-btn
ghost
sm
Expand All @@ -363,7 +362,7 @@ class="text-error"
@endif
</form>

@if ($canDeletePermissions && ! $isSystemPermission)
@if ($canDeletePermissions && ! in_array($permission->name, config('lazy.admin.permissions.defaults', []), true))
<form
id="delete-permission-{{ $permission->getKey() }}"
method="POST"
Expand Down
1 change: 1 addition & 0 deletions resources/views/icons/activity.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 12a9 9 0 1 0 3-6.7"/><path d="M3 3v5h5"/><path d="M12 7v5l3 2"/></svg>
1 change: 1 addition & 0 deletions resources/views/icons/redirect.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 7h11a5 5 0 0 1 0 10H9"/><path d="m12 4 3 3-3 3"/><path d="m12 14-3 3 3 3"/></svg>
1 change: 1 addition & 0 deletions resources/views/icons/shield.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10Z"/><path d="m9 12 2 2 4-4"/></svg>
4 changes: 3 additions & 1 deletion src/Controllers/LoginController.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@ public function login(Request $request): RedirectResponse
$field => $request->string('email')->toString(),
'password' => $request->string('password')->toString(),
];
$candidate = $guard->getProvider()->retrieveByCredentials($credentials);
$candidate = method_exists($guard, 'getProvider')
? $guard->getProvider()->retrieveByCredentials($credentials)
: null;
if ($candidate && data_get($candidate, 'two_factor_secret')) {
return back()->withErrors(['email' => __('auth.failed')])->onlyInput('email');
}
Expand Down
4 changes: 3 additions & 1 deletion src/Controllers/ProfileController.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ public function password(Request $request): RedirectResponse
'password' => ['required', 'string', Password::defaults(), 'confirmed'],
]);
$user->setAttribute('password', Hash::make($validated['password']));
$user->setAttribute($user->getRememberTokenName(), Str::random(60));
if (method_exists($user, 'getRememberTokenName')) {
$user->setAttribute($user->getRememberTokenName(), Str::random(60));
}
$user->save();
$request->session()->regenerate();
AdminActivity::log('password_changed', 'User password changed', $user, properties: ['self' => true]);
Expand Down
4 changes: 3 additions & 1 deletion src/Controllers/UserController.php
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,9 @@ public function password(Request $request, string $user): RedirectResponse
]);

$model->setAttribute('password', Hash::make($request->string('password')->toString()));
$model->setAttribute($model->getRememberTokenName(), Str::random(60));
if (method_exists($model, 'getRememberTokenName')) {
$model->setAttribute($model->getRememberTokenName(), Str::random(60));
}
$model->save();
$request->session()->regenerate();
AdminActivity::log('password_changed', 'User password changed', $model, properties: [
Expand Down
14 changes: 9 additions & 5 deletions src/LazyAdminServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -206,13 +206,14 @@ public function packageBooted(): void
View::composer('lazy::header', static function ($view): void {
$guard = (string) config('lazy.auth.guard', 'web');
$user = Auth::guard($guard)->user();
$profileRoute = trim((string) config('lazy.admin.route.name', 'admin.'), '.').'.profile.show';

$view->with([
'user' => $user,
'dashboardUrl' => Route::has('admin.dashboard')
? route('admin.dashboard')
: url((string) config('lazy.admin.home', '/')),
'profileUrl' => route(trim((string) config('lazy.admin.route.name', 'admin.'), '.').'.profile.show'),
'profileUrl' => Route::has($profileRoute) ? route($profileRoute) : null,
'settingsUrl' => Route::has('admin.setting.index') ? route('admin.setting.index') : null,
'logoUrl' => (static function (): ?string {
$logo = setting('admin.logo', config('lazy.admin.logo'));
Expand Down Expand Up @@ -468,7 +469,7 @@ public function packageBooted(): void
$prefix = trim((string) config('lazy.admin.route.name', 'admin.'), '.');

$menu->group(__('lazy-admin::admin.navigation.overview'));
$menu->addItem($prefix.'.dashboard', __('lazy-admin::admin.navigation.dashboard'));
$menu->addItem($prefix.'.dashboard', __('lazy-admin::admin.navigation.dashboard'), iconView: 'lazy::icons.dashboard');
}, id: 'lazy-admin-dashboard', priority: 10);

MenuFacade::register(function (MenuManager $menu): void {
Expand All @@ -480,11 +481,11 @@ public function packageBooted(): void
$menu->group(__('lazy-admin::admin.navigation.system'));

if (! $enforce || $user?->can('settings.view')) {
$menu->addItem($prefix.'.setting.index', __('lazy-admin::admin.navigation.settings'));
$menu->addItem($prefix.'.setting.index', __('lazy-admin::admin.navigation.settings'), iconView: 'lazy::icons.settings');
}

if (! $enforce || $user?->can('activity.view')) {
$menu->addItem($prefix.'.activity.index', __('lazy-admin::admin.navigation.activity_log'));
$menu->addItem($prefix.'.activity.index', __('lazy-admin::admin.navigation.activity_log'), iconView: 'lazy::icons.activity');
}
}
}, id: 'lazy-admin-system', priority: 90);
Expand All @@ -508,6 +509,7 @@ public function packageBooted(): void
$menu->addItem(
$routeTarget,
__('lazy-admin::admin.navigation.redirects'),
iconView: 'lazy::icons.redirect',
);
}, id: 'lazy-admin-seo-redirects', priority: 70);
}
Expand All @@ -522,7 +524,8 @@ public function packageBooted(): void
$menu->group(__('lazy-admin::admin.navigation.content'));
$menu->addItem(
$prefix.'.page.index',
__('Pages'),
__('lazy-admin::admin.navigation.pages'),
iconView: 'lazy::icons.page',
);
}
}, id: 'lazy-admin-pages', priority: 60);
Expand All @@ -543,6 +546,7 @@ public function packageBooted(): void
$menu->addItem(
$prefix.'.access.index',
__('lazy-admin::admin.navigation.access'),
iconView: 'lazy::icons.shield',
);
}, id: 'lazy-admin-access', priority: 80);
}
Expand Down
3 changes: 3 additions & 0 deletions tests/Feature/UserSecurityTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Schema;
use Spatie\Permission\PermissionRegistrar;
use Spatie\Permission\PermissionServiceProvider;
Expand All @@ -11,6 +12,8 @@

beforeEach(function (): void {
$this->withoutVite();
Route::get('/login', fn () => 'Login')->name('login');
Route::getRoutes()->refreshNameLookups();
config()->set([
'database.connections.testing' => ['driver' => 'sqlite', 'database' => ':memory:', 'prefix' => ''],
'auth.providers.users.model' => User::class,
Expand Down
Loading