Папки, загруженные с помощью CLI, не имеют надлежащего ACL (файлы в порядке, проблемы возникают только у папок) - PullRequest
0 голосов
/ 23 января 2019

Итак, я пытаюсь переместить ресурсы с сервера на S3.

Активы предназначены для среды typo3.Кажется, моя проблема с S3.По некоторым причинам это не обеспечивает надлежащие права доступа к папкам.

Созданные папки работают правильно, а папки, загруженные через браузер или aws-cli, не получают надлежащих разрешений.Файлы внутри папок в порядке, доступны для чтения и записи.Но TYPO3 также нужны папки.В противном случае я везде получаю большие неприятные ошибки.

Я впервые работаю с S3, поэтому возникает вопрос: я что-то не так делаю в разрешениях / настройках или это известная проблема с S3?И если я что-то напутал, какие-нибудь указатели, где искать?

Это моя политика ведра для проекта.пользователь / проект изменен по соображениям безопасности.

{
    "Version": "2012-10-17",
    "Id": "someID",
    "Statement": [
        {
            "Sid": "Read and write access for typo3 system",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::user/project"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::project/*"
        },
        {
            "Sid": "Public read access",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectAcl"
            ],
            "Resource": "arn:aws:s3:::project/*"
        }
    ]
}

И я также добавил конфигурацию CORS, поскольку корзина служит хранилищем ресурсов для системы typo3.домен был изменен по соображениям безопасности.

<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>http://*.domain.com</AllowedOrigin>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

Как я уже говорил, создание папок вручную в бэкенде typo3 или в консоли управления S3 работает нормально.Загрузка в консоль управления S3 или синхронизация с aws-cli невозможна.

(извините, не могу опубликовать изображения, так как мне не хватает «репутации»)

https://imgur.com/lDlg4bP.png

https://i.imgur.com/UexKWLo.png

И при выборе папки, содержащей другие поврежденные папки, в модуле списка файлов TYPO3 появляется оранжевая ошибка:

Error executing "GetObjectAcl" on "https://project.s3.eu-central-1.amazonaws.com/test_folder/uploaded_with_cli/?acl"; AWS HTTP error: Client error: 
`GET https://project.s3.eu-central-1.amazonaws.com/test_folder/uploaded_with_cli/?acl` resulted in a `404 Not Found` response: <?xml version="1.0" 
encoding="UTF-8"?> <Error><Code>NoSuchKey</Code><Message>The specified key does not exist.</Message> (truncated...) NoSuchKey (client): The specified
 key does not exist. - <?xml version="1.0" encoding="UTF-8"?> <Error><Code>NoSuchKey</Code><Message>The specified key does not exist.</Message><Key>
test_folder/uploaded_with_cli/</Key><RequestId>****randomkey****</RequestId><HostId>****randomsecretkey****</HostId></Error>

Помеченный randomkey и randomsecretkey выглядят случайными строками, похожими на id и secretkey, но каждая сломанная папка генерирует такую ​​ошибку с совершенно другим набором ключей.Я проверил, ни один из них не является настоящим идентификатором и секретным ключом для пользователя.

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Для тех, кто ищет способ исправить проблемы со списком файлов в typo3 при использовании S3, вам нужно добавить ACL во все папки.

Создать объект S3Client:

$s3 = new Aws\S3\S3Client([
        'region' => $region,
        'version' => 'latest',
        'credentials' => [
            'key' => $key,
            'secret' => $secret,
        ]
    ]);

и добавитьACL для каждой имеющейся у вас «папки»:

$s3->putObject([
            'Bucket' => $bucket,
            'Key' => $folderToCreate,
            'Body' => '',
            'ACL' => 'public-read'
        ]);

Вы можете использовать простой файл .txt, содержащий список ваших папок

find -type d -printf "%P\n" > dirs.txt

Или, если вам нравится overengineeredВы можете перечислить все существующие объекты в массиве с помощью

try {
        $results = $s3->getPaginator('ListObjects', [
            'Bucket' => $bucket
        ]);

        foreach ($results as $result) {
            foreach ($result['Contents'] as $object) {
                array_push($allObjects, $object['Key']);
            }
        }
    } catch (S3Exception $e) {
        echo $e->getMessage() . PHP_EOL;
    }

, откуда вам придется:

удалить файлы (вам нужен только список каталогов).Вы можете использовать pathinfo () для этого)

удалить дубликаты

удалить "."и / или значения ".."

вы, вероятно, также захотите установить ACL для подкаталогов, которые составляют путь к вашим файлам (для случаев, когда в подкаталогах, составляющих ваш путь, нет файлов).)

foreach ($allPaths as $longpath) {
        $explodedpath = explode('/', $longpath);

        $goodPathValue = '';

        foreach ($explodedpath as $segment) {

            if ($goodPathValue == '') {
                $goodPathValue = $segment;
            } else {

                // if it's not the first folder, we append the segment to it with a slash in between
                $goodPathValue .= "/" . $segment;
            }

            // at this point we either have first folder, or a part of the full path, which we enter in the array if it's unique
            if (!in_array($goodPathValue, $allPaths)) {
                array_push($allPaths, $goodPathValue);
            }
        }
    }

Вот так .txt или массив должны выглядеть для получения оптимальных результатов

downloads
downloads/en
downloads/en/user_upload
downloads/en/user_upload/Products
downloads/en/user_upload/Markets
0 голосов
/ 23 января 2019

S3 не имеет понятия о каталогах (папках). S3 - хранилище объектов, где каждый объект идентифицируется ключом. Ключом может быть строка типа «logs / 2014/06/04 / system.log»

Большинство графических пользовательских интерфейсов поверх S3 (AWS CLI, AWS Console, Cloudberry, Transmit и т. Д.) Интерпретируют символы «/» как разделитель каталогов и представляют список файлов «как есть», который был в каталоге структура.

Однако внутренне понятие каталога отсутствует, у S3 плоское пространство имен. Подробнее см. http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html.

Учитывая это, обычно вы не можете определить разрешение для папок, так как на S3 нет папки. Некоторые инструменты GUI создают пустой файл для представления папок, некоторые нет. Я не знаю, как Typo3 обрабатывает «папки» на S3.

...