Compare commits

..

8 Commits

Author SHA1 Message Date
Charles
4042e0416b Revert toolbar change (#2218) 2026-02-11 17:54:58 -05:00
Lance Pioch
cc8973cf00 Laravel 12.51.0 Shift (#2213)
Co-authored-by: Shift <shift@laravelshift.com>
2026-02-11 11:18:33 -05:00
Quinten
8ebe75b947 fix: composer not been installed in the docker image (#2211) 2026-02-10 16:00:18 -05:00
Hythera
f8144407d1 fix: composer content hash (#2209) 2026-02-09 22:26:01 -05:00
Charles
e431ccb66a add rounding to list-files header (#2207) 2026-02-09 22:19:10 -05:00
Lance Pioch
9291bb4477 Fix webhook processing for event objects (#2198) 2026-02-09 08:47:09 -05:00
Lance Pioch
e8c80ae420 Fix SFTP access denied for subuser when view role is assigned (#2196) 2026-02-09 08:46:47 -05:00
stdpi
f1be003276 Change file browser sticky header again... (#2203) 2026-02-08 15:17:48 -05:00
11 changed files with 204 additions and 164 deletions

View File

@@ -68,6 +68,9 @@ RUN apk add --no-cache \
# required for installing plugins. Pulled from https://github.com/pelican-dev/panel/pull/2034
zip unzip 7zip bzip2-dev yarn git
# Copy composer binary for runtime plugin dependency management
COPY --from=composer /usr/local/bin/composer /usr/local/bin/composer
COPY --chown=root:www-data --chmod=770 --from=composerbuild /build .
COPY --chown=root:www-data --chmod=770 --from=yarnbuild /build/public ./public

View File

@@ -73,6 +73,9 @@ RUN apk add --no-cache \
# required for installing plugins. Pulled from https://github.com/pelican-dev/panel/pull/2034
zip unzip 7zip bzip2-dev yarn git
# Copy composer binary for runtime plugin dependency management
COPY --from=composer /usr/local/bin/composer /usr/local/bin/composer
COPY --chown=root:www-data --chmod=770 --from=composerbuild /build .
COPY --chown=root:www-data --chmod=770 --from=yarnbuild /build/public ./public

View File

@@ -318,7 +318,6 @@ class EditEgg extends EditRecord
->helperText(trans('admin/egg.start_config_help')),
Textarea::make('config_files')->rows(10)->json()
->label(trans('admin/egg.config_files'))
->dehydrateStateUsing(fn ($state) => blank($state) ? '{}' : $state)
->helperText(trans('admin/egg.config_files_help')),
Textarea::make('config_logs')->rows(10)->json()
->label(trans('admin/egg.log_config'))

View File

@@ -34,6 +34,10 @@ class ProcessWebhook implements ShouldQueue
$data = reset($data);
}
if (is_object($data)) {
$data = get_object_vars($data);
}
if (is_string($data)) {
$data = Arr::wrap(json_decode($data, true) ?? []);
}

View File

@@ -32,10 +32,10 @@ class EggConfigurationService
*/
public function handle(Server $server): array
{
$configFiles = json_decode($server->egg->inherit_config_files ?? '{}');
$configs = is_object($configFiles) || is_array($configFiles)
? $this->replacePlaceholders($server, $configFiles)
: [];
$configs = $this->replacePlaceholders(
$server,
json_decode($server->egg->inherit_config_files)
);
return [
'startup' => $this->convertStartupToNewFormat(json_decode($server->egg->inherit_config_startup, true)),

View File

@@ -31,13 +31,22 @@ class GetUserPermissionsService
'admin.websocket.transfer',
];
if ($isAdmin) {
return $isOwner || $user->can('update', $server) ? array_merge(['*'], $adminPermissions) : array_merge([SubuserPermission::WebsocketConnect->value], $adminPermissions);
if ($isAdmin && ($isOwner || $user->can('update', $server))) {
return array_merge(['*'], $adminPermissions);
}
/** @var Subuser|null $subuser */
$subuser = $server->subusers()->where('user_id', $user->id)->first();
$subuserPermissions = $subuser !== null ? $subuser->permissions : [];
return $subuser->permissions ?? [];
if ($isAdmin) {
return array_unique(array_merge(
[SubuserPermission::WebsocketConnect->value],
$adminPermissions,
$subuserPermissions,
));
}
return $subuserPermissions;
}
}

View File

@@ -36,7 +36,7 @@ class EggTransformer extends BaseTransformer
{
$model->loadMissing('configFrom');
$files = json_decode($model->inherit_config_files ?: '{}', true, 512, JSON_THROW_ON_ERROR);
$files = json_decode($model->inherit_config_files, true, 512, JSON_THROW_ON_ERROR);
$model->loadMissing('scriptFrom');
@@ -53,9 +53,9 @@ class EggTransformer extends BaseTransformer
'docker_images' => $model->docker_images,
'config' => [
'files' => $files,
'startup' => json_decode($model->inherit_config_startup ?: '{}', true),
'startup' => json_decode($model->inherit_config_startup, true),
'stop' => $model->inherit_config_stop,
'logs' => json_decode($model->inherit_config_logs ?: '{}', true),
'logs' => json_decode($model->inherit_config_logs, true),
'file_denylist' => $model->inherit_file_denylist,
'extends' => $model->config_from,
],

View File

@@ -15,7 +15,7 @@
"filament/filament": "^4.5",
"gboquizosanchez/filament-log-viewer": "^2.1",
"guzzlehttp/guzzle": "^7.10",
"laravel/framework": "^12.49",
"laravel/framework": "^12.51",
"laravel/helpers": "^1.8",
"laravel/sanctum": "^4.2",
"laravel/socialite": "^5.24",

280
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "ee0e729079d522f013d1203a624a4765",
"content-hash": "784a5e04d3c28e0dba289d45a239075e",
"packages": [
{
"name": "anourvalar/eloquent-serialize",
@@ -128,16 +128,16 @@
},
{
"name": "aws/aws-sdk-php",
"version": "3.369.29",
"version": "3.369.31",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
"reference": "068195b2980cf5cf4ade2515850d461186db3310"
"reference": "c7bf53dfb09bea3ebfd19b89213625aa134dcc71"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/068195b2980cf5cf4ade2515850d461186db3310",
"reference": "068195b2980cf5cf4ade2515850d461186db3310",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/c7bf53dfb09bea3ebfd19b89213625aa134dcc71",
"reference": "c7bf53dfb09bea3ebfd19b89213625aa134dcc71",
"shasum": ""
},
"require": {
@@ -219,9 +219,9 @@
"support": {
"forum": "https://github.com/aws/aws-sdk-php/discussions",
"issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.369.29"
"source": "https://github.com/aws/aws-sdk-php/tree/3.369.31"
},
"time": "2026-02-06T19:08:50+00:00"
"time": "2026-02-10T19:13:30+00:00"
},
{
"name": "blade-ui-kit/blade-heroicons",
@@ -375,16 +375,16 @@
},
{
"name": "brick/math",
"version": "0.14.7",
"version": "0.14.8",
"source": {
"type": "git",
"url": "https://github.com/brick/math.git",
"reference": "07ff363b16ef8aca9692bba3be9e73fe63f34e50"
"reference": "63422359a44b7f06cae63c3b429b59e8efcc0629"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/brick/math/zipball/07ff363b16ef8aca9692bba3be9e73fe63f34e50",
"reference": "07ff363b16ef8aca9692bba3be9e73fe63f34e50",
"url": "https://api.github.com/repos/brick/math/zipball/63422359a44b7f06cae63c3b429b59e8efcc0629",
"reference": "63422359a44b7f06cae63c3b429b59e8efcc0629",
"shasum": ""
},
"require": {
@@ -423,7 +423,7 @@
],
"support": {
"issues": "https://github.com/brick/math/issues",
"source": "https://github.com/brick/math/tree/0.14.7"
"source": "https://github.com/brick/math/tree/0.14.8"
},
"funding": [
{
@@ -431,7 +431,7 @@
"type": "github"
}
],
"time": "2026-02-07T10:57:35+00:00"
"time": "2026-02-10T14:33:43+00:00"
},
{
"name": "calebporzio/sushi",
@@ -1323,16 +1323,16 @@
},
{
"name": "filament/actions",
"version": "v4.7.0",
"version": "v4.7.1",
"source": {
"type": "git",
"url": "https://github.com/filamentphp/actions.git",
"reference": "fff2f4db8fa8c4f9142eda762f2db099bd65a44f"
"reference": "8e51f01af732d50e1d52843011bbdeceb2e0b249"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/filamentphp/actions/zipball/fff2f4db8fa8c4f9142eda762f2db099bd65a44f",
"reference": "fff2f4db8fa8c4f9142eda762f2db099bd65a44f",
"url": "https://api.github.com/repos/filamentphp/actions/zipball/8e51f01af732d50e1d52843011bbdeceb2e0b249",
"reference": "8e51f01af732d50e1d52843011bbdeceb2e0b249",
"shasum": ""
},
"require": {
@@ -1368,20 +1368,20 @@
"issues": "https://github.com/filamentphp/filament/issues",
"source": "https://github.com/filamentphp/filament"
},
"time": "2026-02-04T16:09:51+00:00"
"time": "2026-02-10T13:13:35+00:00"
},
{
"name": "filament/filament",
"version": "v4.7.0",
"version": "v4.7.1",
"source": {
"type": "git",
"url": "https://github.com/filamentphp/panels.git",
"reference": "b9dcd1dc287d6affea1f678fb9128227486eb4a7"
"reference": "ff56a6958f3a14fd34198c68f6fbe98bb567e6ca"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/filamentphp/panels/zipball/b9dcd1dc287d6affea1f678fb9128227486eb4a7",
"reference": "b9dcd1dc287d6affea1f678fb9128227486eb4a7",
"url": "https://api.github.com/repos/filamentphp/panels/zipball/ff56a6958f3a14fd34198c68f6fbe98bb567e6ca",
"reference": "ff56a6958f3a14fd34198c68f6fbe98bb567e6ca",
"shasum": ""
},
"require": {
@@ -1425,20 +1425,20 @@
"issues": "https://github.com/filamentphp/filament/issues",
"source": "https://github.com/filamentphp/filament"
},
"time": "2026-02-04T16:15:24+00:00"
"time": "2026-02-10T13:11:29+00:00"
},
{
"name": "filament/forms",
"version": "v4.7.0",
"version": "v4.7.1",
"source": {
"type": "git",
"url": "https://github.com/filamentphp/forms.git",
"reference": "3839d9c939a5d8583f2e059fc549cdfd55b86d51"
"reference": "351b6fbf8abd015cc157aef2463df86c1ccf252a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/filamentphp/forms/zipball/3839d9c939a5d8583f2e059fc549cdfd55b86d51",
"reference": "3839d9c939a5d8583f2e059fc549cdfd55b86d51",
"url": "https://api.github.com/repos/filamentphp/forms/zipball/351b6fbf8abd015cc157aef2463df86c1ccf252a",
"reference": "351b6fbf8abd015cc157aef2463df86c1ccf252a",
"shasum": ""
},
"require": {
@@ -1475,20 +1475,20 @@
"issues": "https://github.com/filamentphp/filament/issues",
"source": "https://github.com/filamentphp/filament"
},
"time": "2026-02-04T16:14:02+00:00"
"time": "2026-02-10T13:13:01+00:00"
},
{
"name": "filament/infolists",
"version": "v4.7.0",
"version": "v4.7.1",
"source": {
"type": "git",
"url": "https://github.com/filamentphp/infolists.git",
"reference": "03228d5cf9310598712299d49ac38b75d61d7c1c"
"reference": "6e0fc7ebc96cafe3bac4df0c1b8a9c1e2b129318"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/filamentphp/infolists/zipball/03228d5cf9310598712299d49ac38b75d61d7c1c",
"reference": "03228d5cf9310598712299d49ac38b75d61d7c1c",
"url": "https://api.github.com/repos/filamentphp/infolists/zipball/6e0fc7ebc96cafe3bac4df0c1b8a9c1e2b129318",
"reference": "6e0fc7ebc96cafe3bac4df0c1b8a9c1e2b129318",
"shasum": ""
},
"require": {
@@ -1520,11 +1520,11 @@
"issues": "https://github.com/filamentphp/filament/issues",
"source": "https://github.com/filamentphp/filament"
},
"time": "2026-01-29T21:00:53+00:00"
"time": "2026-02-10T13:12:24+00:00"
},
{
"name": "filament/notifications",
"version": "v4.7.0",
"version": "v4.7.1",
"source": {
"type": "git",
"url": "https://github.com/filamentphp/notifications.git",
@@ -1571,7 +1571,7 @@
},
{
"name": "filament/query-builder",
"version": "v4.7.0",
"version": "v4.7.1",
"source": {
"type": "git",
"url": "https://github.com/filamentphp/query-builder.git",
@@ -1617,7 +1617,7 @@
},
{
"name": "filament/schemas",
"version": "v4.7.0",
"version": "v4.7.1",
"source": {
"type": "git",
"url": "https://github.com/filamentphp/schemas.git",
@@ -1662,16 +1662,16 @@
},
{
"name": "filament/support",
"version": "v4.7.0",
"version": "v4.7.1",
"source": {
"type": "git",
"url": "https://github.com/filamentphp/support.git",
"reference": "bed43ce30c778ff8cfbfb69498c34da79fa473b2"
"reference": "40eb45db0d6b00229f5731b5ea465baee082fa5d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/filamentphp/support/zipball/bed43ce30c778ff8cfbfb69498c34da79fa473b2",
"reference": "bed43ce30c778ff8cfbfb69498c34da79fa473b2",
"url": "https://api.github.com/repos/filamentphp/support/zipball/40eb45db0d6b00229f5731b5ea465baee082fa5d",
"reference": "40eb45db0d6b00229f5731b5ea465baee082fa5d",
"shasum": ""
},
"require": {
@@ -1716,20 +1716,20 @@
"issues": "https://github.com/filamentphp/filament/issues",
"source": "https://github.com/filamentphp/filament"
},
"time": "2026-02-04T16:09:55+00:00"
"time": "2026-02-10T13:13:39+00:00"
},
{
"name": "filament/tables",
"version": "v4.7.0",
"version": "v4.7.1",
"source": {
"type": "git",
"url": "https://github.com/filamentphp/tables.git",
"reference": "6c637ffe6b03ccd2f9960a83ac979b9bda9649e3"
"reference": "dae5fe85bd504ea12287d5b9b20ff6976aa1a40a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/filamentphp/tables/zipball/6c637ffe6b03ccd2f9960a83ac979b9bda9649e3",
"reference": "6c637ffe6b03ccd2f9960a83ac979b9bda9649e3",
"url": "https://api.github.com/repos/filamentphp/tables/zipball/dae5fe85bd504ea12287d5b9b20ff6976aa1a40a",
"reference": "dae5fe85bd504ea12287d5b9b20ff6976aa1a40a",
"shasum": ""
},
"require": {
@@ -1762,20 +1762,20 @@
"issues": "https://github.com/filamentphp/filament/issues",
"source": "https://github.com/filamentphp/filament"
},
"time": "2026-02-04T16:14:21+00:00"
"time": "2026-02-10T13:12:07+00:00"
},
{
"name": "filament/widgets",
"version": "v4.7.0",
"version": "v4.7.1",
"source": {
"type": "git",
"url": "https://github.com/filamentphp/widgets.git",
"reference": "eaeeffe0ca8b8a3bdc416b03dd216a3e5333986b"
"reference": "bbe126e5e4e7f8073be19d22ec8f8bd298f40529"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/filamentphp/widgets/zipball/eaeeffe0ca8b8a3bdc416b03dd216a3e5333986b",
"reference": "eaeeffe0ca8b8a3bdc416b03dd216a3e5333986b",
"url": "https://api.github.com/repos/filamentphp/widgets/zipball/bbe126e5e4e7f8073be19d22ec8f8bd298f40529",
"reference": "bbe126e5e4e7f8073be19d22ec8f8bd298f40529",
"shasum": ""
},
"require": {
@@ -1806,7 +1806,7 @@
"issues": "https://github.com/filamentphp/filament/issues",
"source": "https://github.com/filamentphp/filament"
},
"time": "2026-02-04T16:10:11+00:00"
"time": "2026-02-10T13:13:04+00:00"
},
{
"name": "firebase/php-jwt",
@@ -2544,16 +2544,16 @@
},
{
"name": "laravel/framework",
"version": "v12.49.0",
"version": "v12.51.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
"reference": "4bde4530545111d8bdd1de6f545fa8824039fcb5"
"reference": "ce4de3feb211e47c4f959d309ccf8a2733b1bc16"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/4bde4530545111d8bdd1de6f545fa8824039fcb5",
"reference": "4bde4530545111d8bdd1de6f545fa8824039fcb5",
"url": "https://api.github.com/repos/laravel/framework/zipball/ce4de3feb211e47c4f959d309ccf8a2733b1bc16",
"reference": "ce4de3feb211e47c4f959d309ccf8a2733b1bc16",
"shasum": ""
},
"require": {
@@ -2762,7 +2762,7 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
"time": "2026-01-28T03:40:49+00:00"
"time": "2026-02-10T18:20:19+00:00"
},
{
"name": "laravel/helpers",
@@ -2823,16 +2823,16 @@
},
{
"name": "laravel/prompts",
"version": "v0.3.12",
"version": "v0.3.13",
"source": {
"type": "git",
"url": "https://github.com/laravel/prompts.git",
"reference": "4861ded9003b7f8a158176a0b7666f74ee761be8"
"reference": "ed8c466571b37e977532fb2fd3c272c784d7050d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/prompts/zipball/4861ded9003b7f8a158176a0b7666f74ee761be8",
"reference": "4861ded9003b7f8a158176a0b7666f74ee761be8",
"url": "https://api.github.com/repos/laravel/prompts/zipball/ed8c466571b37e977532fb2fd3c272c784d7050d",
"reference": "ed8c466571b37e977532fb2fd3c272c784d7050d",
"shasum": ""
},
"require": {
@@ -2876,36 +2876,36 @@
"description": "Add beautiful and user-friendly forms to your command-line applications.",
"support": {
"issues": "https://github.com/laravel/prompts/issues",
"source": "https://github.com/laravel/prompts/tree/v0.3.12"
"source": "https://github.com/laravel/prompts/tree/v0.3.13"
},
"time": "2026-02-03T06:57:26+00:00"
"time": "2026-02-06T12:17:10+00:00"
},
{
"name": "laravel/sanctum",
"version": "v4.3.0",
"version": "v4.3.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/sanctum.git",
"reference": "c978c82b2b8ab685468a7ca35224497d541b775a"
"reference": "e3b85d6e36ad00e5db2d1dcc27c81ffdf15cbf76"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/sanctum/zipball/c978c82b2b8ab685468a7ca35224497d541b775a",
"reference": "c978c82b2b8ab685468a7ca35224497d541b775a",
"url": "https://api.github.com/repos/laravel/sanctum/zipball/e3b85d6e36ad00e5db2d1dcc27c81ffdf15cbf76",
"reference": "e3b85d6e36ad00e5db2d1dcc27c81ffdf15cbf76",
"shasum": ""
},
"require": {
"ext-json": "*",
"illuminate/console": "^11.0|^12.0",
"illuminate/contracts": "^11.0|^12.0",
"illuminate/database": "^11.0|^12.0",
"illuminate/support": "^11.0|^12.0",
"illuminate/console": "^11.0|^12.0|^13.0",
"illuminate/contracts": "^11.0|^12.0|^13.0",
"illuminate/database": "^11.0|^12.0|^13.0",
"illuminate/support": "^11.0|^12.0|^13.0",
"php": "^8.2",
"symfony/console": "^7.0"
"symfony/console": "^7.0|^8.0"
},
"require-dev": {
"mockery/mockery": "^1.6",
"orchestra/testbench": "^9.15|^10.8",
"orchestra/testbench": "^9.15|^10.8|^11.0",
"phpstan/phpstan": "^1.10"
},
"type": "library",
@@ -2941,7 +2941,7 @@
"issues": "https://github.com/laravel/sanctum/issues",
"source": "https://github.com/laravel/sanctum"
},
"time": "2026-01-22T22:27:01+00:00"
"time": "2026-02-07T17:19:31+00:00"
},
{
"name": "laravel/serializable-closure",
@@ -3078,16 +3078,16 @@
},
{
"name": "laravel/tinker",
"version": "v2.11.0",
"version": "v2.11.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/tinker.git",
"reference": "3d34b97c9a1747a81a3fde90482c092bd8b66468"
"reference": "c9f80cc835649b5c1842898fb043f8cc098dd741"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/tinker/zipball/3d34b97c9a1747a81a3fde90482c092bd8b66468",
"reference": "3d34b97c9a1747a81a3fde90482c092bd8b66468",
"url": "https://api.github.com/repos/laravel/tinker/zipball/c9f80cc835649b5c1842898fb043f8cc098dd741",
"reference": "c9f80cc835649b5c1842898fb043f8cc098dd741",
"shasum": ""
},
"require": {
@@ -3138,9 +3138,9 @@
],
"support": {
"issues": "https://github.com/laravel/tinker/issues",
"source": "https://github.com/laravel/tinker/tree/v2.11.0"
"source": "https://github.com/laravel/tinker/tree/v2.11.1"
},
"time": "2025-12-19T19:16:45+00:00"
"time": "2026-02-06T14:12:35+00:00"
},
{
"name": "laravel/ui",
@@ -4263,16 +4263,16 @@
},
{
"name": "livewire/livewire",
"version": "v3.7.9",
"version": "v3.7.10",
"source": {
"type": "git",
"url": "https://github.com/livewire/livewire.git",
"reference": "112b27e41e87e89d828a96e37b257aff2a058c7a"
"reference": "0dc679eb4c8b4470cb12522b5927ef08ca2358bb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/livewire/livewire/zipball/112b27e41e87e89d828a96e37b257aff2a058c7a",
"reference": "112b27e41e87e89d828a96e37b257aff2a058c7a",
"url": "https://api.github.com/repos/livewire/livewire/zipball/0dc679eb4c8b4470cb12522b5927ef08ca2358bb",
"reference": "0dc679eb4c8b4470cb12522b5927ef08ca2358bb",
"shasum": ""
},
"require": {
@@ -4327,7 +4327,7 @@
"description": "A front-end framework for Laravel.",
"support": {
"issues": "https://github.com/livewire/livewire/issues",
"source": "https://github.com/livewire/livewire/tree/v3.7.9"
"source": "https://github.com/livewire/livewire/tree/v3.7.10"
},
"funding": [
{
@@ -4335,7 +4335,7 @@
"type": "github"
}
],
"time": "2026-02-05T23:27:27+00:00"
"time": "2026-02-09T22:49:33+00:00"
},
{
"name": "masterminds/html5",
@@ -4740,16 +4740,16 @@
},
{
"name": "nette/php-generator",
"version": "v4.2.0",
"version": "v4.2.1",
"source": {
"type": "git",
"url": "https://github.com/nette/php-generator.git",
"reference": "4707546a1f11badd72f5d82af4f8a6bc64bd56ac"
"reference": "52aff4d9b12f20ca9f3e31a559b646d2fd21dd61"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nette/php-generator/zipball/4707546a1f11badd72f5d82af4f8a6bc64bd56ac",
"reference": "4707546a1f11badd72f5d82af4f8a6bc64bd56ac",
"url": "https://api.github.com/repos/nette/php-generator/zipball/52aff4d9b12f20ca9f3e31a559b646d2fd21dd61",
"reference": "52aff4d9b12f20ca9f3e31a559b646d2fd21dd61",
"shasum": ""
},
"require": {
@@ -4758,9 +4758,9 @@
},
"require-dev": {
"jetbrains/phpstorm-attributes": "^1.2",
"nette/tester": "^2.4",
"nette/tester": "^2.6",
"nikic/php-parser": "^5.0",
"phpstan/phpstan-nette": "^2.0@stable",
"phpstan/phpstan": "^2.0@stable",
"tracy/tracy": "^2.8"
},
"suggest": {
@@ -4806,22 +4806,22 @@
],
"support": {
"issues": "https://github.com/nette/php-generator/issues",
"source": "https://github.com/nette/php-generator/tree/v4.2.0"
"source": "https://github.com/nette/php-generator/tree/v4.2.1"
},
"time": "2025-08-06T18:24:31+00:00"
"time": "2026-02-09T05:43:31+00:00"
},
{
"name": "nette/schema",
"version": "v1.3.3",
"version": "v1.3.4",
"source": {
"type": "git",
"url": "https://github.com/nette/schema.git",
"reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004"
"reference": "086497a2f34b82fede9b5a41cc8e131d087cd8f7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nette/schema/zipball/2befc2f42d7c715fd9d95efc31b1081e5d765004",
"reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004",
"url": "https://api.github.com/repos/nette/schema/zipball/086497a2f34b82fede9b5a41cc8e131d087cd8f7",
"reference": "086497a2f34b82fede9b5a41cc8e131d087cd8f7",
"shasum": ""
},
"require": {
@@ -4829,8 +4829,8 @@
"php": "8.1 - 8.5"
},
"require-dev": {
"nette/tester": "^2.5.2",
"phpstan/phpstan-nette": "^2.0@stable",
"nette/tester": "^2.6",
"phpstan/phpstan": "^2.0@stable",
"tracy/tracy": "^2.8"
},
"type": "library",
@@ -4871,9 +4871,9 @@
],
"support": {
"issues": "https://github.com/nette/schema/issues",
"source": "https://github.com/nette/schema/tree/v1.3.3"
"source": "https://github.com/nette/schema/tree/v1.3.4"
},
"time": "2025-10-30T22:57:59+00:00"
"time": "2026-02-08T02:54:00+00:00"
},
{
"name": "nette/utils",
@@ -7657,16 +7657,16 @@
},
{
"name": "spatie/laravel-health",
"version": "1.35.0",
"version": "1.36.0",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-health.git",
"reference": "40c1b0688a8fa4a4fde13f883982e6b3a9d00a8c"
"reference": "e2a84e886cb38ab0a53f136e4554c64e0480e634"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/laravel-health/zipball/40c1b0688a8fa4a4fde13f883982e6b3a9d00a8c",
"reference": "40c1b0688a8fa4a4fde13f883982e6b3a9d00a8c",
"url": "https://api.github.com/repos/spatie/laravel-health/zipball/e2a84e886cb38ab0a53f136e4554c64e0480e634",
"reference": "e2a84e886cb38ab0a53f136e4554c64e0480e634",
"shasum": ""
},
"require": {
@@ -7698,7 +7698,7 @@
"phpstan/phpstan-phpunit": "^1.1.1",
"phpunit/phpunit": "^9.5.21|^9.5.10|^10.5|^11.0|^12.0",
"spatie/laravel-ray": "^1.30",
"spatie/pest-plugin-snapshots": "^1.1|^2.1|^3.0",
"spatie/pest-plugin-snapshots": "^1.1|^2.3|^3.0",
"spatie/pest-plugin-test-time": "^1.1.1|^1.1|^2.0|^3.0",
"spatie/test-time": "^1.3|^2.0"
},
@@ -7738,7 +7738,7 @@
"spatie"
],
"support": {
"source": "https://github.com/spatie/laravel-health/tree/1.35.0"
"source": "https://github.com/spatie/laravel-health/tree/1.36.0"
},
"funding": [
{
@@ -7746,7 +7746,7 @@
"type": "github"
}
],
"time": "2026-02-01T08:13:12+00:00"
"time": "2026-02-09T15:38:27+00:00"
},
{
"name": "spatie/laravel-package-tools",
@@ -7811,16 +7811,16 @@
},
{
"name": "spatie/laravel-permission",
"version": "6.24.0",
"version": "6.24.1",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-permission.git",
"reference": "76adb1fc8d07c16a0721c35c4cc330b7a12598d7"
"reference": "eefc9d17eba80d023d6bff313f882cb2bcd691a3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/laravel-permission/zipball/76adb1fc8d07c16a0721c35c4cc330b7a12598d7",
"reference": "76adb1fc8d07c16a0721c35c4cc330b7a12598d7",
"url": "https://api.github.com/repos/spatie/laravel-permission/zipball/eefc9d17eba80d023d6bff313f882cb2bcd691a3",
"reference": "eefc9d17eba80d023d6bff313f882cb2bcd691a3",
"shasum": ""
},
"require": {
@@ -7882,7 +7882,7 @@
],
"support": {
"issues": "https://github.com/spatie/laravel-permission/issues",
"source": "https://github.com/spatie/laravel-permission/tree/6.24.0"
"source": "https://github.com/spatie/laravel-permission/tree/6.24.1"
},
"funding": [
{
@@ -7890,7 +7890,7 @@
"type": "github"
}
],
"time": "2025-12-13T21:45:21+00:00"
"time": "2026-02-09T21:10:03+00:00"
},
{
"name": "spatie/laravel-query-builder",
@@ -12451,16 +12451,16 @@
},
{
"name": "laravel/pail",
"version": "v1.2.5",
"version": "v1.2.6",
"source": {
"type": "git",
"url": "https://github.com/laravel/pail.git",
"reference": "fdb73f5eacf03db576c710d5a00101ba185f2254"
"reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/pail/zipball/fdb73f5eacf03db576c710d5a00101ba185f2254",
"reference": "fdb73f5eacf03db576c710d5a00101ba185f2254",
"url": "https://api.github.com/repos/laravel/pail/zipball/aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf",
"reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf",
"shasum": ""
},
"require": {
@@ -12527,20 +12527,20 @@
"issues": "https://github.com/laravel/pail/issues",
"source": "https://github.com/laravel/pail"
},
"time": "2026-02-04T15:10:32+00:00"
"time": "2026-02-09T13:44:54+00:00"
},
{
"name": "laravel/pint",
"version": "v1.27.0",
"version": "v1.27.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/pint.git",
"reference": "c67b4195b75491e4dfc6b00b1c78b68d86f54c90"
"reference": "54cca2de13790570c7b6f0f94f37896bee4abcb5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/pint/zipball/c67b4195b75491e4dfc6b00b1c78b68d86f54c90",
"reference": "c67b4195b75491e4dfc6b00b1c78b68d86f54c90",
"url": "https://api.github.com/repos/laravel/pint/zipball/54cca2de13790570c7b6f0f94f37896bee4abcb5",
"reference": "54cca2de13790570c7b6f0f94f37896bee4abcb5",
"shasum": ""
},
"require": {
@@ -12551,13 +12551,13 @@
"php": "^8.2.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.92.4",
"illuminate/view": "^12.44.0",
"larastan/larastan": "^3.8.1",
"laravel-zero/framework": "^12.0.4",
"friendsofphp/php-cs-fixer": "^3.93.1",
"illuminate/view": "^12.51.0",
"larastan/larastan": "^3.9.2",
"laravel-zero/framework": "^12.0.5",
"mockery/mockery": "^1.6.12",
"nunomaduro/termwind": "^2.3.3",
"pestphp/pest": "^3.8.4"
"pestphp/pest": "^3.8.5"
},
"bin": [
"builds/pint"
@@ -12594,32 +12594,32 @@
"issues": "https://github.com/laravel/pint/issues",
"source": "https://github.com/laravel/pint"
},
"time": "2026-01-05T16:49:17+00:00"
"time": "2026-02-10T20:00:20+00:00"
},
{
"name": "laravel/sail",
"version": "v1.52.0",
"version": "v1.53.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/sail.git",
"reference": "64ac7d8abb2dbcf2b76e61289451bae79066b0b3"
"reference": "e340eaa2bea9b99192570c48ed837155dbf24fbb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/sail/zipball/64ac7d8abb2dbcf2b76e61289451bae79066b0b3",
"reference": "64ac7d8abb2dbcf2b76e61289451bae79066b0b3",
"url": "https://api.github.com/repos/laravel/sail/zipball/e340eaa2bea9b99192570c48ed837155dbf24fbb",
"reference": "e340eaa2bea9b99192570c48ed837155dbf24fbb",
"shasum": ""
},
"require": {
"illuminate/console": "^9.52.16|^10.0|^11.0|^12.0",
"illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0",
"illuminate/support": "^9.52.16|^10.0|^11.0|^12.0",
"illuminate/console": "^9.52.16|^10.0|^11.0|^12.0|^13.0",
"illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0|^13.0",
"illuminate/support": "^9.52.16|^10.0|^11.0|^12.0|^13.0",
"php": "^8.0",
"symfony/console": "^6.0|^7.0",
"symfony/yaml": "^6.0|^7.0"
"symfony/console": "^6.0|^7.0|^8.0",
"symfony/yaml": "^6.0|^7.0|^8.0"
},
"require-dev": {
"orchestra/testbench": "^7.0|^8.0|^9.0|^10.0",
"orchestra/testbench": "^7.0|^8.0|^9.0|^10.0|^11.0",
"phpstan/phpstan": "^2.0"
},
"bin": [
@@ -12657,7 +12657,7 @@
"issues": "https://github.com/laravel/sail/issues",
"source": "https://github.com/laravel/sail"
},
"time": "2026-01-01T02:46:03+00:00"
"time": "2026-02-06T12:16:02+00:00"
},
{
"name": "mockery/mockery",

View File

@@ -1,16 +1,4 @@
<x-filament-panels::page>
@once
<style>
.files-selection-merged .fi-ta-header-ctn {
position: sticky;
top: 0;
z-index: 1;
-webkit-backdrop-filter: blur(8px);
backdrop-filter: blur(8px);
}
</style>
@endonce
<div
x-data="
{

View File

@@ -11,6 +11,7 @@ use App\Models\User;
use App\Models\UserSSHKey;
use App\Tests\Integration\IntegrationTestCase;
use PHPUnit\Framework\Attributes\DataProvider;
use Spatie\Permission\Models\Permission;
class SftpAuthenticationControllerTest extends IntegrationTestCase
{
@@ -195,6 +196,39 @@ class SftpAuthenticationControllerTest extends IntegrationTestCase
$this->post('/api/remote/sftp/auth', $data)->assertForbidden();
}
public function test_subuser_sftp_works_when_user_has_view_only_role(): void
{
[$user, $server] = $this->generateTestAccount([SubuserPermission::FileRead, SubuserPermission::FileSftp]);
$user->update(['password' => password_hash('foobar', PASSWORD_DEFAULT)]);
$this->setAuthorization($server->node);
$data = [
'username' => $user->username . '.' . $server->uuid_short,
'password' => 'foobar',
];
// SFTP works as a plain subuser
$this->postJson('/api/remote/sftp/auth', $data)
->assertOk()
->assertJsonPath('permissions', [SubuserPermission::FileRead->value, SubuserPermission::FileSftp->value]);
// Assign a role with only "view server" permission
$role = Role::findOrCreate('view-only-test', 'web');
$permission = Permission::findOrCreate('view server', 'web');
$role->givePermissionTo($permission);
$user->syncRoles($role);
// SFTP should still work — subuser permissions must be merged with admin permissions
$response = $this->postJson('/api/remote/sftp/auth', $data)
->assertOk();
$permissions = $response->json('permissions');
$this->assertContains(SubuserPermission::FileSftp->value, $permissions);
$this->assertContains(SubuserPermission::FileRead->value, $permissions);
}
public static function authorizationTypeDataProvider(): array
{
return [