Создание файла .CRX (расширение chrome / webapp) по требованию с использованием PHP - PullRequest
0 голосов
/ 30 января 2011

Мне нужно создать файл CRX на лету.Он предназначен для моего бэкэнда CMS, поэтому он предназначен только для аутентифицированных пользователей, которые могут установить бэкэнд CMS в качестве веб-приложения и предложить дополнительные привилегии для веб-приложения.Проблема в том, что бэкэнд используется для многих доменов, поэтому создание файла CRX для каждого из них - это настоящая работа.Поэтому я подумал, что было бы проще просто создать файл CRX по требованию, который будет сгенерирован PHP с использованием собственного домена и, возможно, пользовательского значка.

Ответы [ 4 ]

1 голос
/ 30 января 2011

На странице документации объясняется формат пакета CRX. Есть много сторонних библиотек, которые реализовали этот формат. На следующей странице вы можете узнать формат и либо загрузить скрипт Ruby / Bash (вы можете найти другие тоже в сети), и если вы хотите внедрить свой собственный упаковщик, вы можете следовать описанному там формату.

https://developer.chrome.com/extensions/crx

Если вы действительно не хотите следовать формату, вы можете позволить вашему PHP-скрипту выполнить одно из следующих действий:

  1. Использовать двоичный код Chrome chrome.exe --pack-extension=c:\myext --pack-extension-key=c:\myext.pem
  2. Используйте скрипт Ruby или Bash из PHP (вы можете вызывать системные команды)

Надеюсь, это поможет!

0 голосов
/ 19 декабря 2013

Это работает для меня: D Я просто перехожу с реального пути на ноль, без изменений на новом chrome: D

/ ** * Класс CrxGenerator * * Создание пакетов расширения Chrome CRX из * папка и личный ключ * * На основе документации формата CRX: http://developer.chrome.com/extensions/crx.html * * @author: Томаш Банасьяк * @license: MIT * @date: 2013-11-03 * /

класс CrxGenerator { const TEMP_ARCHIVE_EXT = '.zip';

private $sourceDir = null;
private $cacheDir = '';

private $privateKeyContents = null;
private $publicKeyContents = null;

private $privateKey = null;
private $publicKey = null;

/**
 * @param $file Path to PEM key
 * @throws Exception
 */
public function setPrivateKey($file) {
    if (!file_exists($file)) {
        throw new Exception('Private key file does not exist');
    }

    $this->privateKeyContents = file_get_contents($file);
    $this->privateKey = $file;
}

/**
 * @param $file Path to PUB key
 * @throws Exception
 */
public function setPublicKey($file) {
    if (!file_exists($file)) {
        throw new Exception('Private key file does not exist');
    }

    $this->publicKeyContents = file_get_contents($file);
    $this->publicKey = $file;
}

/**
 * @param $cacheDir dir specified for caching temporary archives
 * @throws Exception
 */
public function setCacheDir($cacheDir) {
    if (!is_dir($cacheDir)) {
        throw new Exception('Cache dir does not exist!');
    }

    $this->cacheDir = $cacheDir;
}

/**
 * @param $sourceDir Extension source directory
 */
public function setSourceDir($sourceDir) {
    $this->sourceDir = $sourceDir;
}

/**
 * @param $outputFile path to output file
 * @throws Exception
 */
public function generateCrx($outputFile) {
    $basename = basename($outputFile);
    // First step - create ZIP archive
    $zipArchive = $this->cacheDir . DIRECTORY_SEPARATOR . $basename . self::TEMP_ARCHIVE_EXT;

    $result = $this->createZipArchive(
        $this->sourceDir,
        $zipArchive
    );

    if (!$result) {
        throw new Exception('ZIP creation failed');
    }

    $zipContents = file_get_contents($zipArchive);

    // Second step - create file signature
    $privateKey = openssl_pkey_get_private($this->privateKeyContents);
    openssl_sign($zipContents, $signature, $privateKey, 'sha1');
    openssl_free_key($privateKey);

    // Create output file

    $crx = fopen($outputFile, 'wb');
    fwrite($crx, 'Cr24');
    fwrite($crx, pack('V', 2));
    fwrite($crx, pack('V', strlen($this->publicKeyContents)));
    fwrite($crx, pack('V', strlen($signature)));
    fwrite($crx, $this->publicKeyContents);
    fwrite($crx, $signature);
    fwrite($crx, $zipContents);
    fclose($crx);

    // Clear cache
    unset($zipArchive);
}

/**
 * @param $source - source dir
 * @param $outputFile - output file
 * @return bool - success?
 */
private function createZipArchive($source, $outputFile) {
    if (!extension_loaded('zip') || !file_exists($source)) {
        return false;
    }

    $zip = new ZipArchive();
    if (!$zip->open($outputFile, ZIPARCHIVE::CREATE)) {
        return false;
    }

     $source = str_replace('\\', '/', realpath($source));

    if (is_dir($source) === true) {
        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);
        foreach ($files as $file) {
            $file = str_replace('\\', '/', $file);

            // Exclude "." and ".." folders
            if( in_array(substr($file, strrpos($file, '/') + 1), array('.', '..')) ) {
                continue;
            }

            $file = $file;

            if (is_dir($file) === true) {
                $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
            }
            else if (is_file($file) === true) {
                $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
            }
        }
    }
    else if (is_file($source) === true) {
        $zip->file_get_contents($source);
    echo  $source;
    }

    return $zip->close();
}

}

0 голосов
/ 28 ноября 2011

Кроме того, для тех, кто все еще ищет способ создания CTX в PHP, посмотрите на этот вопрос: Создание файла Google Chrome Crx с PHP

0 голосов
/ 04 февраля 2011

Похоже, я нашел именно то, что искал.Команда Chrome сделала эту опцию для создания веб-приложений без CRX , просто используя простой файл манифеста.

Гораздо проще создать собственное веб-приложение и опубликовать его на сайте для установки.И это также решает мою проблему, когда у меня много сайтов с большим количеством доменов, и мне не нужно создавать собственный файл CRX для каждого домена.Я просто создаю небольшой PHP-скрипт, который на лету создает файлы манифеста для каждого домена.

...