Защищенный паролем PHP ZipArchive не открывается в OS X или не запрашивает пароль у пользователя - PullRequest
0 голосов
/ 22 февраля 2019

В php 7.2.0 я создаю zip-файл, который защищен паролем и зашифрован для каждого файла, как предложено в php-документах.

Эта функция работает хорошо и после того, как zip-файл загружается на клиент в windows, пользовательбудет предложено ввести пароль и содержимое будет разархивировано.

На компьютере с OS X после двойного щелчка по файлу появится сообщение об ошибке, при открытии в терминале появляется более четкая ошибка:

unsupported compression method 99

Даже не запрашивая пароль, это не связано с постоянно растущей проблемой почтового индекса, которую я видел здесь.Кажется, что этот zip-файл чем-то отличается от защищенного паролем zip-файла, созданного на другом компьютере Mac.

Это как-то связано с методом шифрования EM_AES_256, который был введен WinZip, но не используется другими.

class PatientReferralZipController extends Controller{

protected $zip;
protected $zipName = 'verwijsbrief';

public function generateZip($text, $doc, $password, $patient){
    $zipPath = config('constants.patient_files_upload_dir')."/".$patient->id;
    $this->createZip($password, $zipPath);
    $this->addTextToZip($text);
    $this->addDocumentToZip($doc);
    $this->zip->close();
    return $this->zip;
}

public function createZip($password, $zipPath){
    if (!file_exists($zipPath)) {
        mkdir($zipPath, 0777, true);
    }
    if($this->zip->open($zipPath."/".$this->zipName.".zip", ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE){
        $this->zip->setPassword($password);
    }
}

public function addTextToZip($text){
    $this->zip->addFromString('verwijsbriefTextvak.txt',$text);
    $this->zip->setEncryptionName('verwijsbriefTextvak.txt', ZipArchive::EM_AES_256);
}

public function addDocumentToZip($doc){
    $ext = $doc->getClientOriginalExtension();
    $filename = $this->zipName.".".$ext;
    $this->zip->addFile($doc->path(),$filename);
    $this->zip->setEncryptionName($filename, ZipArchive::EM_AES_256);
}

public function __construct($text, $doc, $password, $patient){
    $this->zip = new ZipArchive();
    $this->generateZip($text, $doc, $password, $patient);
}}

Как я и думал, это как-то связано с WinZip , который использует проприетарное шифрование.«WinZip представил собственное шифрование AES-256» - Википедия

Связанный пост о проблемах распаковки: superuser

...