Skip to content

Commit b47b6dd

Browse files
committed
[SECURITY] Deny directly modifying file abstraction layer entities
Write access to table `sys_file` is denied per default, unless data is being imported. In addition, write access to related FAL entities `sys_file_reference` and `sys_file_metadata` is denied in case a file on legacy storage (uid=0) is used or corresponding user does not have permissions to access a particular file. Resolves: #93969 Releases: main, 13.0, 12.4, 11.5 Change-Id: Ic8ac7132d732bd117aa63f6a33545ceb1d1f421d Security-Bulletin: TYPO3-CORE-SA-2024-006 Security-References: CVE-2024-25121 Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/82950 Tested-by: Oliver Hader <[email protected]> Reviewed-by: Oliver Hader <[email protected]>
1 parent 33f4d27 commit b47b6dd

20 files changed

+361
-0
lines changed

typo3/sysext/core/Classes/DataHandling/DataHandler.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -882,6 +882,10 @@ public function process_datamap()
882882
foreach ($hookObjectsArr as $hookObj) {
883883
if (method_exists($hookObj, 'processDatamap_preProcessFieldArray')) {
884884
$hookObj->processDatamap_preProcessFieldArray($incomingFieldArray, $table, $id, $this);
885+
// in case hook invalidated `$incomingFieldArray`, skip the record completely
886+
if (!is_array($incomingFieldArray)) {
887+
continue 2;
888+
}
885889
}
886890
}
887891
// ******************************
Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/*
6+
* This file is part of the TYPO3 CMS project.
7+
*
8+
* It is free software; you can redistribute it and/or modify it under
9+
* the terms of the GNU General Public License, either version 2
10+
* of the License, or any later version.
11+
*
12+
* For the full copyright and license information, please read the
13+
* LICENSE.txt file that was distributed with this source code.
14+
*
15+
* The TYPO3 project - inspiring people to share!
16+
*/
17+
18+
namespace TYPO3\CMS\Core\Resource\Security;
19+
20+
use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
21+
use TYPO3\CMS\Core\DataHandling\DataHandler;
22+
use TYPO3\CMS\Core\DataHandling\DataHandlerCheckModifyAccessListHookInterface;
23+
use TYPO3\CMS\Core\Resource\File;
24+
use TYPO3\CMS\Core\Resource\ResourceFactory;
25+
use TYPO3\CMS\Core\SysLog\Action\Database as SystemLogDatabaseAction;
26+
use TYPO3\CMS\Core\SysLog\Error as SystemLogErrorClassification;
27+
use TYPO3\CMS\Core\Utility\GeneralUtility;
28+
use TYPO3\CMS\Core\Utility\MathUtility;
29+
30+
/**
31+
* `DataHandler` hook handling to avoid direct access to `sys_file` related entities:
32+
*
33+
* + denies any write access to `sys_file` (in datamap and cmdmap, unless it is an internal process)
34+
* + denies any write access to `sys_file` that is on legacy storage
35+
* + denies any write access to `sys_file_reference`, referencing a file on legacy storage,
36+
* or not part of the file-mounts of the corresponding user
37+
* + denies any write access to `sys_file_metadata`, referencing a file on legacy storage,
38+
* or not part of the file-mounts of the corresponding user
39+
*/
40+
class FilePermissionAspect implements DataHandlerCheckModifyAccessListHookInterface
41+
{
42+
protected ResourceFactory $resourceFactory;
43+
44+
public function __construct(ResourceFactory $resourceFactory = null)
45+
{
46+
$this->resourceFactory = $resourceFactory ?? GeneralUtility::makeInstance(ResourceFactory::class);
47+
}
48+
49+
/**
50+
* Denies write access to `sys_file` in general, unless it is an internal process.
51+
*
52+
* @param bool &$accessAllowed
53+
* @param string $table
54+
* @param DataHandler $parent
55+
*/
56+
public function checkModifyAccessList(&$accessAllowed, $table, DataHandler $parent): void
57+
{
58+
$isInternalProcess = $parent->isImporting || $parent->bypassAccessCheckForRecords;
59+
if ($table === 'sys_file' && !$isInternalProcess) {
60+
$accessAllowed = false;
61+
}
62+
}
63+
64+
/**
65+
* Checks file related data being processed in `DataHandler`:
66+
* + `sys_file` (only if `checkModifyAccessList` passed -> during internal process)
67+
* + `sys_file_reference`
68+
* + `sys_file_metadata`
69+
*
70+
* @param mixed $incomingFieldArray
71+
* @param string $table
72+
* @param int|string $id
73+
* @param DataHandler $dataHandler
74+
*/
75+
public function processDatamap_preProcessFieldArray(&$incomingFieldArray, string $table, $id, DataHandler $dataHandler): void
76+
{
77+
if (!is_array($incomingFieldArray) || !is_scalar($id)) {
78+
$incomingFieldArray = null;
79+
return;
80+
}
81+
$isInternalProcess = $dataHandler->isImporting || $dataHandler->bypassAccessCheckForRecords;
82+
$isNew = !MathUtility::canBeInterpretedAsInteger($id);
83+
$logId = $isNew ? 0 : (int)$id;
84+
if ($table === 'sys_file') {
85+
$file = $this->resolveFile((int)$id);
86+
if (!$this->isValidStorageData($incomingFieldArray)
87+
|| (!$isNew && $file !== null && $this->usesLegacyStorage($file))
88+
) {
89+
$incomingFieldArray = null;
90+
$this->logError($table, $logId, 'Attempt to set legacy storage directly is disallowed', $dataHandler);
91+
}
92+
} elseif ($table === 'sys_file_reference') {
93+
$files = $this->resolveReferencedFiles($incomingFieldArray, 'uid_local');
94+
foreach ($files as $file) {
95+
if ($file === null) {
96+
$incomingFieldArray = null;
97+
$this->logError($table, $logId, 'Attempt to reference invalid file is disallowed', $dataHandler);
98+
} elseif ($this->usesLegacyStorage($file)) {
99+
$incomingFieldArray = null;
100+
$this->logError($table, $logId, sprintf('Attempt to reference file "%d" in legacy storage is disallowed', $file->getUid()), $dataHandler);
101+
} elseif (!$isInternalProcess && $this->usesDisallowedFileMount($file, 'read', $dataHandler->BE_USER)) {
102+
$incomingFieldArray = null;
103+
$this->logError($table, $logId, sprintf('Attempt to reference file "%d" without permission is disallowed', $file->getUid()), $dataHandler);
104+
}
105+
}
106+
} elseif ($table === 'sys_file_metadata') {
107+
$file = $this->resolveReferencedFile($incomingFieldArray, 'file');
108+
if ($file !== null && $this->usesLegacyStorage($file)) {
109+
$incomingFieldArray = null;
110+
$this->logError($table, $logId, sprintf('Attempt to alter metadata of file "%d" in legacy storage is disallowed', $file->getUid()), $dataHandler);
111+
} elseif (!$isInternalProcess && $file !== null && $this->usesDisallowedFileMount($file, 'editMeta', $dataHandler->BE_USER)) {
112+
$incomingFieldArray = null;
113+
$this->logError($table, $logId, sprintf('Attempt to alter metadata of file "%d" without permission is disallowed', $file->getUid()), $dataHandler);
114+
}
115+
}
116+
}
117+
118+
protected function logError(string $table, int $id, string $message, DataHandler $dataHandler): void
119+
{
120+
$dataHandler->log(
121+
$table,
122+
$id,
123+
SystemLogDatabaseAction::UPDATE,
124+
0,
125+
SystemLogErrorClassification::USER_ERROR,
126+
$message,
127+
1,
128+
[$table]
129+
);
130+
}
131+
132+
protected function usesLegacyStorage(File $file): bool
133+
{
134+
return $file->getStorage()->getUid() === 0;
135+
}
136+
137+
/**
138+
* @param non-empty-string $fileAction
139+
* @param BackendUserAuthentication|mixed $backendUser
140+
* @return bool
141+
*/
142+
protected function usesDisallowedFileMount(File $file, string $fileAction, mixed $backendUser): bool
143+
{
144+
// strict: disallow, in case it cannot be determined from BE_USER
145+
if (!$backendUser instanceof BackendUserAuthentication) {
146+
return true;
147+
}
148+
foreach ($backendUser->getFileStorages() as $storage) {
149+
if ($storage->getUid() === $file->getStorage()->getUid()) {
150+
return !$storage->checkFileActionPermission($fileAction, $file);
151+
}
152+
}
153+
return false;
154+
}
155+
156+
/**
157+
* @return list<?File>
158+
*/
159+
protected function resolveReferencedFiles(array $data, string $propertyName): array
160+
{
161+
$propertyItems = GeneralUtility::trimExplode(',', (string)($data[$propertyName] ?? ''), true);
162+
return array_map(
163+
function (string $item): ?File {
164+
if (MathUtility::canBeInterpretedAsInteger($item)) {
165+
return $this->resolveFile((int)$item);
166+
}
167+
if (preg_match('/^sys_file_(?P<fileId>\d+)$/', $item, $matches) && (int)$matches['fileId'] > 0) {
168+
return $this->resolveFile((int)$matches['fileId']);
169+
}
170+
return null;
171+
},
172+
$propertyItems
173+
);
174+
}
175+
176+
protected function resolveReferencedFile(array $data, string $propertyName): ?File
177+
{
178+
$propertyValue = $data[$propertyName] ?? null;
179+
if ($propertyValue === null || !MathUtility::canBeInterpretedAsInteger($propertyValue)) {
180+
return null;
181+
}
182+
return $this->resolveFile((int)$propertyValue);
183+
}
184+
185+
protected function resolveFile(int $fileId): ?File
186+
{
187+
try {
188+
return $this->resourceFactory->getFileObject($fileId);
189+
} catch (\Throwable $t) {
190+
return null;
191+
}
192+
}
193+
194+
protected function isValidStorageData(array $data): bool
195+
{
196+
$storage = $data['storage'] ?? '';
197+
if (!MathUtility::canBeInterpretedAsInteger($storage)) {
198+
return false;
199+
}
200+
return (int)$storage > 0;
201+
}
202+
}

typo3/sysext/core/Tests/Functional/DataScenarios/FAL/DataSet/ImportDefault.csv

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
"sys_file",,,,,,,,,,,,,,,,,,,,
88
,"uid","pid","type","storage","identifier","extension","mime_type","name","sha1","size","creation_date","modification_date","missing","metadata","identifier_hash","folder_hash","last_indexed",,,
99
,1,0,2,1,"/_migrated/pics/kasper-skarhoj1_01.jpeg","jpeg","image/jpeg","kasper-skarhoj1_01.jpeg","b841902021bbe23bd71e4a5b5b97626da7734b90",39056,1375080761,1374139442,0,0,"2a4941658e4bd943048a234a5e1f305a1f736b10","f6e391567e01bdb14eac504413794a3bc1300abd",0,,,
10+
,9,0,2,0,"/legacy-storage-file.txt","txt","text/plain","legacy-storage-file.txt","3333333333333333333333333333333333333333",1234,1375080761,1374139442,0,0,"2707d25218a2fa6a0faef9fa85a10694aa07a4c7","f6e391567e01bdb14eac504413794a3bc1300abd",0,,,
1011
,21,0,2,1,"/_migrated/pics/typo3_image5_01.jpg","jpg","image/jpeg","typo3_image5_01.jpg","ce136877a22606a6e44ce9b1f8ed3be70c74e6ee",126872,1375080761,1374139442,0,0,"9df04e41b37d2c29777ee64ced3f612b2422a02e","f6e391567e01bdb14eac504413794a3bc1300abd",0,,,
1112
"sys_file_metadata",,,,,,,,,,,,,,,,,,,,
1213
,"uid","pid","sys_language_uid","l10n_parent","t3_origuid","t3ver_wsid","t3ver_state","t3ver_stage","t3ver_oid","file","title","width","height","description","alternative","categories","l10n_diffsource",,,
1314
,1,0,0,0,0,0,0,0,0,1,"Image Kasper",401,600,,,0,,,,
15+
,9,0,0,0,0,0,0,0,0,9,"Legacy Storage File",0,0,,,0,,,,
1416
,21,0,0,0,0,0,0,0,0,21,"Image T3BOARD",1024,683,,,0,,,,
1517
"sys_file_reference",,,,,,,,,,,,,,,,,,,,
1618
,"uid","pid","deleted","sys_language_uid","l10n_parent","t3ver_wsid","t3ver_state","t3ver_stage","t3ver_oid","uid_local","uid_foreign","tablenames","fieldname","sorting_foreign","title","description","alternative","link","l10n_diffsource"
@@ -26,9 +28,11 @@
2628
,"hash","tablename","recuid","field","flexpointer","softref_key","softref_id","sorting","workspace","ref_table","ref_uid","ref_string",,,,,,,,
2729
,"39433ea4a82060704109046e4828d3c8","sys_file",1,"storage",,,,0,0,"sys_file_storage",1,,,,,,,,,
2830
,"fe80a6589cac9798aa13ab5e0192cb56","sys_file",1,"metadata",,,,0,0,"sys_file_metadata",1,,,,,,,,,
31+
,"a87344067faefa9fb880a404a4790d94","sys_file",9,"metadata",,,,0,0,"sys_file_metadata",9,,,,,,,,,
2932
,"45491331fdb3cba18904110be4b946ea","sys_file",21,"storage",,,,0,0,"sys_file_storage",1,,,,,,,,,
3033
,"f68c0805e7b937b9dd993024a7e3e74f","sys_file",21,"metadata",,,,0,0,"sys_file_metadata",21,,,,,,,,,
3134
,"bb9038a252bcfeadc2e1e8a6b5266986","sys_file_metadata",1,"file",,,,0,0,"sys_file",1,,,,,,,,,
35+
,"7522fc0217031429d17920232b22c08b","sys_file_metadata",9,"file",,,,0,0,"sys_file",9,,,,,,,,,
3236
,"c78c9588e7aadd6bcfc994551fe0540c","sys_file_metadata",21,"file",,,,0,0,"sys_file",21,,,,,,,,,
3337
,"3c5c7becb1384c7157ffe4cf218cb70e","sys_file_reference",126,"uid_local",,,,0,0,"sys_file",1,,,,,,,,,
3438
,"6d8283ea74e4379720297750955d2352","sys_file_reference",127,"uid_local",,,,0,0,"sys_file",21,,,,,,,,,

typo3/sysext/core/Tests/Functional/DataScenarios/FAL/Modify/ActionTest.php

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,4 +298,62 @@ public function createContentWithFileReferenceAndDeleteFileReference(): void
298298
$this->assertCSVDataSet(__DIR__ . '/DataSet/createContentWFileReferenceNDeleteFileReference.csv');
299299
// No FE test: Create and delete scenarios have FE coverage, this test is only about DB state.
300300
}
301+
302+
/**
303+
* @test
304+
*/
305+
public function creatingFileIsDenied(): void
306+
{
307+
$this->expectedErrorLogEntries = 1;
308+
$this->actionService->createNewRecord('sys_file', 0, [
309+
'storage' => 1,
310+
'name' => 'any.file',
311+
'extension' => 'file',
312+
'identifer' => '/any.file',
313+
'mime_type' => 'text/plain',
314+
'sha1' => 'this-is-not-a-hash-value',
315+
]);
316+
$this->assertCSVDataSet(__DIR__ . '/DataSet/sysFileUnchanged.csv');
317+
}
318+
319+
/**
320+
* @test
321+
*/
322+
public function modifyingFileIsDenied(): void
323+
{
324+
$this->expectedErrorLogEntries = 1;
325+
$this->actionService->modifyRecord('sys_file', 21, [
326+
'storage' => 1,
327+
'name' => 'any.file',
328+
'extension' => 'file',
329+
'identifer' => '/any.file',
330+
'mime_type' => 'text/plain',
331+
'sha1' => 'this-is-not-a-hash-value',
332+
]);
333+
$this->assertCSVDataSet(__DIR__ . '/DataSet/sysFileUnchanged.csv');
334+
}
335+
336+
/**
337+
* @test
338+
*/
339+
public function usingLegacyStorageFileInFileReferenceIsDenied(): void
340+
{
341+
$this->expectedErrorLogEntries = 1;
342+
$this->actionService->modifyRecord('sys_file_reference', 127, [
343+
'uid_local' => 9,
344+
]);
345+
$this->assertCSVDataSet(__DIR__ . '/DataSet/sysFileUnchanged.csv');
346+
}
347+
348+
/**
349+
* @test
350+
*/
351+
public function usingLegacyStorageFileInFileMetadataIsDenied(): void
352+
{
353+
$this->expectedErrorLogEntries = 1;
354+
$this->actionService->modifyRecord('sys_file_metadata', 21, [
355+
'file' => 9,
356+
]);
357+
$this->assertCSVDataSet(__DIR__ . '/DataSet/sysFileUnchanged.csv');
358+
}
301359
}

typo3/sysext/core/Tests/Functional/DataScenarios/FAL/Modify/DataSet/changeContentSorting.csv

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
"sys_file",,,,,,,,,,,,,,,,,,,
88
,"uid","pid","type","storage","identifier","extension","mime_type","name","sha1","size","creation_date","modification_date","missing","metadata","identifier_hash","folder_hash","last_indexed",,
99
,1,0,2,1,"/_migrated/pics/kasper-skarhoj1_01.jpeg","jpeg","image/jpeg","kasper-skarhoj1_01.jpeg","b841902021bbe23bd71e4a5b5b97626da7734b90",39056,1375080761,1374139442,0,0,"2a4941658e4bd943048a234a5e1f305a1f736b10","f6e391567e01bdb14eac504413794a3bc1300abd",0,,
10+
,9,0,2,0,"/legacy-storage-file.txt","txt","text/plain","legacy-storage-file.txt","3333333333333333333333333333333333333333",1234,1375080761,1374139442,0,0,"2707d25218a2fa6a0faef9fa85a10694aa07a4c7","f6e391567e01bdb14eac504413794a3bc1300abd",0,,
1011
,21,0,2,1,"/_migrated/pics/typo3_image5_01.jpg","jpg","image/jpeg","typo3_image5_01.jpg","ce136877a22606a6e44ce9b1f8ed3be70c74e6ee",126872,1375080761,1374139442,0,0,"9df04e41b37d2c29777ee64ced3f612b2422a02e","f6e391567e01bdb14eac504413794a3bc1300abd",0,,
1112
"sys_file_metadata",,,,,,,,,,,,,,,,,,,
1213
,"uid","pid","sys_language_uid","l10n_parent","t3_origuid","t3ver_wsid","t3ver_state","t3ver_stage","t3ver_oid","file","title","width","height","description","alternative","categories","l10n_diffsource",,
1314
,1,0,0,0,0,0,0,0,0,1,"Image Kasper",401,600,,,0,,,
15+
,9,0,0,0,0,0,0,0,0,9,"Legacy Storage File",0,0,,,0,,,
1416
,21,0,0,0,0,0,0,0,0,21,"Image T3BOARD",1024,683,,,0,,,
1517
"sys_file_reference",,,,,,,,,,,,,,,,,,,
1618
,"uid","pid","deleted","sys_language_uid","l10n_parent","t3ver_wsid","t3ver_state","t3ver_stage","t3ver_oid","uid_local","uid_foreign","tablenames","fieldname","sorting_foreign","title","description","alternative","link"
@@ -26,9 +28,11 @@
2628
,"hash","tablename","recuid","field","flexpointer","softref_key","softref_id","sorting","workspace","ref_table","ref_uid","ref_string",,,,,,,
2729
,"39433ea4a82060704109046e4828d3c8","sys_file",1,"storage",,,,0,0,"sys_file_storage",1,,,,,,,,
2830
,"fe80a6589cac9798aa13ab5e0192cb56","sys_file",1,"metadata",,,,0,0,"sys_file_metadata",1,,,,,,,,
31+
,"a87344067faefa9fb880a404a4790d94","sys_file",9,"metadata",,,,0,0,"sys_file_metadata",9,,,,,,,,,
2932
,"45491331fdb3cba18904110be4b946ea","sys_file",21,"storage",,,,0,0,"sys_file_storage",1,,,,,,,,
3033
,"f68c0805e7b937b9dd993024a7e3e74f","sys_file",21,"metadata",,,,0,0,"sys_file_metadata",21,,,,,,,,
3134
,"bb9038a252bcfeadc2e1e8a6b5266986","sys_file_metadata",1,"file",,,,0,0,"sys_file",1,,,,,,,,
35+
,"7522fc0217031429d17920232b22c08b","sys_file_metadata",9,"file",,,,0,0,"sys_file",9,,,,,,,,,
3236
,"c78c9588e7aadd6bcfc994551fe0540c","sys_file_metadata",21,"file",,,,0,0,"sys_file",21,,,,,,,,
3337
,"3c5c7becb1384c7157ffe4cf218cb70e","sys_file_reference",126,"uid_local",,,,0,0,"sys_file",1,,,,,,,,
3438
,"6d8283ea74e4379720297750955d2352","sys_file_reference",127,"uid_local",,,,0,0,"sys_file",21,,,,,,,,

typo3/sysext/core/Tests/Functional/DataScenarios/FAL/Modify/DataSet/copyContent.csv

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
"sys_file",,,,,,,,,,,,,,,,,,,
88
,"uid","pid","type","storage","identifier","extension","mime_type","name","sha1","size","creation_date","modification_date","missing","metadata","identifier_hash","folder_hash","last_indexed",,
99
,1,0,2,1,"/_migrated/pics/kasper-skarhoj1_01.jpeg","jpeg","image/jpeg","kasper-skarhoj1_01.jpeg","b841902021bbe23bd71e4a5b5b97626da7734b90",39056,1375080761,1374139442,0,0,"2a4941658e4bd943048a234a5e1f305a1f736b10","f6e391567e01bdb14eac504413794a3bc1300abd",0,,
10+
,9,0,2,0,"/legacy-storage-file.txt","txt","text/plain","legacy-storage-file.txt","3333333333333333333333333333333333333333",1234,1375080761,1374139442,0,0,"2707d25218a2fa6a0faef9fa85a10694aa07a4c7","f6e391567e01bdb14eac504413794a3bc1300abd",0,,
1011
,21,0,2,1,"/_migrated/pics/typo3_image5_01.jpg","jpg","image/jpeg","typo3_image5_01.jpg","ce136877a22606a6e44ce9b1f8ed3be70c74e6ee",126872,1375080761,1374139442,0,0,"9df04e41b37d2c29777ee64ced3f612b2422a02e","f6e391567e01bdb14eac504413794a3bc1300abd",0,,
1112
"sys_file_metadata",,,,,,,,,,,,,,,,,,,
1213
,"uid","pid","sys_language_uid","l10n_parent","t3_origuid","t3ver_wsid","t3ver_state","t3ver_stage","t3ver_oid","file","title","width","height","description","alternative","categories","l10n_diffsource",,
1314
,1,0,0,0,0,0,0,0,0,1,"Image Kasper",401,600,,,0,,,
15+
,9,0,0,0,0,0,0,0,0,9,"Legacy Storage File",0,0,,,0,,,
1416
,21,0,0,0,0,0,0,0,0,21,"Image T3BOARD",1024,683,,,0,,,
1517
"sys_file_reference",,,,,,,,,,,,,,,,,,,
1618
,"uid","pid","deleted","sys_language_uid","l10n_parent","t3ver_wsid","t3ver_state","t3ver_stage","t3ver_oid","uid_local","uid_foreign","tablenames","fieldname","sorting_foreign","title","description","alternative","link"
@@ -29,9 +31,11 @@
2931
,"hash","tablename","recuid","field","flexpointer","softref_key","softref_id","sorting","workspace","ref_table","ref_uid","ref_string",,,,,,,
3032
,"39433ea4a82060704109046e4828d3c8","sys_file",1,"storage",,,,0,0,"sys_file_storage",1,,,,,,,,
3133
,"fe80a6589cac9798aa13ab5e0192cb56","sys_file",1,"metadata",,,,0,0,"sys_file_metadata",1,,,,,,,,
34+
,"a87344067faefa9fb880a404a4790d94","sys_file",9,"metadata",,,,0,0,"sys_file_metadata",9,,,,,,,,,
3235
,"45491331fdb3cba18904110be4b946ea","sys_file",21,"storage",,,,0,0,"sys_file_storage",1,,,,,,,,
3336
,"f68c0805e7b937b9dd993024a7e3e74f","sys_file",21,"metadata",,,,0,0,"sys_file_metadata",21,,,,,,,,
3437
,"bb9038a252bcfeadc2e1e8a6b5266986","sys_file_metadata",1,"file",,,,0,0,"sys_file",1,,,,,,,,
38+
,"7522fc0217031429d17920232b22c08b","sys_file_metadata",9,"file",,,,0,0,"sys_file",9,,,,,,,,,
3539
,"c78c9588e7aadd6bcfc994551fe0540c","sys_file_metadata",21,"file",,,,0,0,"sys_file",21,,,,,,,,
3640
,"3c5c7becb1384c7157ffe4cf218cb70e","sys_file_reference",126,"uid_local",,,,0,0,"sys_file",1,,,,,,,,
3741
,"6d8283ea74e4379720297750955d2352","sys_file_reference",127,"uid_local",,,,0,0,"sys_file",21,,,,,,,,

0 commit comments

Comments
 (0)