').text(data.msg);
+
+ tabView.append(msg);
+ return
+ }
+
+ var signatures = data.signatures;
+ for (const key in signatures) {
+ if (!signatures.hasOwnProperty(key)) {
+ continue;
+
+ }
+ const signature = signatures[key];
+ var signatureElement = $(' ').text(value))
+ );
+ }
+
+
+ tabView.append(signatureElement);
+ }
+
+ },
+
+ addCertRow: function (container, cert) {
+ for (const certProp in cert) {
+ if (!cert.hasOwnProperty(certProp)) {
+ continue;
+ }
+
+ container.append(
+ $(' ').text(cert[certProp]))
+ );
+ }
+
+ return container;
+ },
+
+ add: function (val, array) {
+ if (val) {
+ array.push(val);
+ }
+ },
+ });
+
+ OCA.Dsv = OCA.Dsv || {};
+
+ OCA.Dsv.DsvTabView = DsvTabView;
+})();
diff --git a/dsv/lib/AppInfo/Application.php b/dsv/lib/AppInfo/Application.php
new file mode 100644
index 000000000..40b14a577
--- /dev/null
+++ b/dsv/lib/AppInfo/Application.php
@@ -0,0 +1,30 @@
+getContainer();
+ $server = $container->getServer();
+ $eventDispatcher = $server->getEventDispatcher();
+
+ $eventDispatcher->addListener('OCA\Files::loadAdditionalScripts', function () {
+ \OCP\Util::addStyle(self::APP_NAME, 'tabview');
+ \OCP\Util::addScript(self::APP_NAME, 'tabview');
+ \OCP\Util::addScript(self::APP_NAME, 'plugin');
+ });
+ }
+}
diff --git a/dsv/lib/Controller/DsvController.php b/dsv/lib/Controller/DsvController.php
new file mode 100644
index 000000000..803a0517c
--- /dev/null
+++ b/dsv/lib/Controller/DsvController.php
@@ -0,0 +1,46 @@
+metadataService = $metadataService;
+ }
+
+ /**
+ * @NoAdminRequired
+ *
+ * @param mixed $source
+ */
+ public function get($source)
+ {
+ try {
+ $signatures = $this->metadataService->getSignatures($source);
+
+ return new JSONResponse([
+ 'response' => 'success',
+ 'signatures' => $signatures,
+ ]);
+ } catch (\Exception $e) {
+ \OC::$server->getLogger()->logException($e, ['app' => Application::APP_NAME]);
+
+ return new JSONResponse(
+ [
+ 'response' => 'error',
+ 'msg' => 'Erro ao consultar assinatura digital, verifique os logs do sistema para mais detalhes.',
+ ]
+ );
+ }
+ }
+}
diff --git a/dsv/lib/Service/DsvService.php b/dsv/lib/Service/DsvService.php
new file mode 100644
index 000000000..a6f3c5245
--- /dev/null
+++ b/dsv/lib/Service/DsvService.php
@@ -0,0 +1,98 @@
+signaturesInfo($file);
+
+ $data = [];
+ foreach ($signaturesInfo as $sigKey => $signature) {
+ $signatureInfo = [];
+ foreach ($signature as $key => $value) {
+ list($label, $value) = $this->translate($key, $value);
+ if (!$label) {
+ continue;
+ }
+ $signatureInfo[$key] = ['label' => $label, 'value' => $value];
+ }
+ $data[$sigKey] = $signatureInfo;
+ }
+
+ return $data;
+ }
+
+ private function signaturesInfo($file)
+ {
+ return (new PdfSig($file))->getSignature();
+ }
+
+ private function translate($key, $value)
+ {
+ switch ($key) {
+ case 'Signer Certificate Common Name':
+ return ['Nome Comum do Certificado do Assinante', $value];
+ case 'Signer full Distinguished Name':
+ return ['Nome Completo do Certificado do Assinante', $value];
+ case 'Signing Time':
+ return ['Assinado em', $value];
+ case 'Signing Hash Algorithm':
+ return ['Tipo do Algoritmo', $value];
+ case 'Signature Type':
+ return ['Tipo da assinatura', $value];
+ case 'Signed Ranges':
+ return [null, null];
+ case 'Total document signed':
+ return [null, null];
+ case 'Not total document signed':
+ return [null, null];
+ case 'Signature Validation':
+ return ['Validação da Assinatura', $this->translateSignatureValidation($value)];
+ case 'Certificate Validation':
+ return [null, null];
+ default:
+ return [$key, $value];
+ }
+ }
+
+ private function translateSignatureValidation($value)
+ {
+ switch ($value) {
+ case 'Signature is Valid.':
+ return 'Assinatura válida.';
+
+ case 'Signature is Invalid.':
+ return 'Assinatura inválida.';
+
+ case 'Digest Mismatch.':
+ return 'Digest Mismatch.';
+
+ case "Document isn't signed or corrupted data.":
+ return 'Documento não está assinado ou possui dados corrompidos.';
+
+ case 'Signature has not yet been verified.':
+ return 'Assinatura ainda não foi verificada.';
+
+ case 'Unknown Validation Failure.':
+ return 'Falha desconhecida na validação.';
+ default:
+ return $value;
+ }
+ }
+}
diff --git a/dsv/lib/Service/PdfSig.php b/dsv/lib/Service/PdfSig.php
new file mode 100644
index 000000000..0cd184cbd
--- /dev/null
+++ b/dsv/lib/Service/PdfSig.php
@@ -0,0 +1,104 @@
+setRequireOutputDir(false);
+ $this->binFile = '/tmp/poppler-20.08.0/build/utils/pdfsig';
+
+ return parent::__construct($pdfFile, $options);
+ }
+
+ /**
+ * @return array|mixed
+ */
+ public function utilOptions()
+ {
+ return [];
+ }
+
+ /**
+ * @return array|mixed
+ */
+ public function utilOptionRules()
+ {
+ return [];
+ }
+
+ /**
+ * @return array|mixed
+ */
+ public function utilFlags()
+ {
+ return $this->allConsoleFlags();
+ }
+
+ /**
+ * @return array|mixed
+ */
+ public function utilFlagRules()
+ {
+ return [];
+ }
+
+ /**
+ * @return mixed|null
+ */
+ public function outputExtension()
+ {
+ return null;
+ }
+
+ public function getSignature()
+ {
+ $content = $this->shellExec();
+ $lines = explode("\n", $content);
+
+ $signatures = [];
+ foreach ($lines as $item) {
+ $isFirstLevel = preg_match('/^(Signature\s#\d)/', $item, $match);
+ if ($isFirstLevel) {
+ $signatures[$match[1]] = [];
+ continue;
+ }
+
+ $lastSignature = array_key_last($signatures);
+
+ $match = [];
+ $isSecondLevel = preg_match('/^\s+-\s(.+):\s(.*)/', $item, $match);
+ if ($isSecondLevel) {
+ $signatures[$lastSignature][$match[1]] = $match[2];
+ }
+ }
+
+ return $signatures;
+ }
+}
diff --git a/dsv/lib/composer.json b/dsv/lib/composer.json
new file mode 100644
index 000000000..5d3c9f067
--- /dev/null
+++ b/dsv/lib/composer.json
@@ -0,0 +1,5 @@
+{
+ "require": {
+ "ncjoes/poppler-php": "^1.1"
+ }
+}
diff --git a/dsv/lib/composer.lock b/dsv/lib/composer.lock
new file mode 100644
index 000000000..8f623a825
--- /dev/null
+++ b/dsv/lib/composer.lock
@@ -0,0 +1,822 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "886f29199978cedb5811d144d63495ef",
+ "packages": [
+ {
+ "name": "doctrine/inflector",
+ "version": "1.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/inflector.git",
+ "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c",
+ "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^7.0",
+ "phpstan/phpstan": "^0.11",
+ "phpstan/phpstan-phpunit": "^0.11",
+ "phpstan/phpstan-strict-rules": "^0.11",
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector",
+ "Doctrine\\Inflector\\": "lib/Doctrine/Inflector"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
+ "homepage": "https://www.doctrine-project.org/projects/inflector.html",
+ "keywords": [
+ "inflection",
+ "inflector",
+ "lowercase",
+ "manipulation",
+ "php",
+ "plural",
+ "singular",
+ "strings",
+ "uppercase",
+ "words"
+ ],
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-05-29T07:19:59+00:00"
+ },
+ {
+ "name": "illuminate/config",
+ "version": "v5.8.36",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/config.git",
+ "reference": "6dac1dee3fb51704767c69a07aead1bc75c12368"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/config/zipball/6dac1dee3fb51704767c69a07aead1bc75c12368",
+ "reference": "6dac1dee3fb51704767c69a07aead1bc75c12368",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/contracts": "5.8.*",
+ "illuminate/support": "5.8.*",
+ "php": "^7.1.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.8-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Config\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Config package.",
+ "homepage": "https://laravel.com",
+ "time": "2019-02-14T12:51:50+00:00"
+ },
+ {
+ "name": "illuminate/contracts",
+ "version": "v5.8.36",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/contracts.git",
+ "reference": "00fc6afee788fa07c311b0650ad276585f8aef96"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/contracts/zipball/00fc6afee788fa07c311b0650ad276585f8aef96",
+ "reference": "00fc6afee788fa07c311b0650ad276585f8aef96",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "psr/container": "^1.0",
+ "psr/simple-cache": "^1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.8-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Contracts\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Contracts package.",
+ "homepage": "https://laravel.com",
+ "time": "2019-07-30T13:57:21+00:00"
+ },
+ {
+ "name": "illuminate/support",
+ "version": "v5.8.36",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/support.git",
+ "reference": "df4af6a32908f1d89d74348624b57e3233eea247"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/support/zipball/df4af6a32908f1d89d74348624b57e3233eea247",
+ "reference": "df4af6a32908f1d89d74348624b57e3233eea247",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/inflector": "^1.1",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "illuminate/contracts": "5.8.*",
+ "nesbot/carbon": "^1.26.3 || ^2.0",
+ "php": "^7.1.3"
+ },
+ "conflict": {
+ "tightenco/collect": "<5.5.33"
+ },
+ "suggest": {
+ "illuminate/filesystem": "Required to use the composer class (5.8.*).",
+ "moontoast/math": "Required to use ordered UUIDs (^1.1).",
+ "ramsey/uuid": "Required to use Str::uuid() (^3.7).",
+ "symfony/process": "Required to use the composer class (^4.2).",
+ "symfony/var-dumper": "Required to use the dd function (^4.2).",
+ "vlucas/phpdotenv": "Required to use the env helper (^3.3)."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.8-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Support\\": ""
+ },
+ "files": [
+ "helpers.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Support package.",
+ "homepage": "https://laravel.com",
+ "time": "2019-12-12T14:16:47+00:00"
+ },
+ {
+ "name": "ncjoes/poppler-php",
+ "version": "v1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ncjoes/poppler-php.git",
+ "reference": "8c951b79dcb166cc4681c610b15bdb35653ff506"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ncjoes/poppler-php/zipball/8c951b79dcb166cc4681c610b15bdb35653ff506",
+ "reference": "8c951b79dcb166cc4681c610b15bdb35653ff506",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/config": "^5.3",
+ "illuminate/support": "^5.3",
+ "php": ">=5.5.9"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "5.5.*"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "NcJoes\\PopplerPhp\\": "src/PopplerPhp"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Chukwuemeka Nwobodo",
+ "email": "jc.nwobodo@gmail.com"
+ }
+ ],
+ "description": "Complete, Comprehensive and Flexible PHP wrapper for Poppler-utils",
+ "keywords": [
+ "PDF Convert",
+ "PDF to HTML",
+ "PDF to JPG",
+ "PDF to PNG",
+ "PDF to SVG",
+ "PHP-PDF",
+ "Poppler-PHP",
+ "Poppler-utils",
+ "pdf"
+ ],
+ "time": "2019-09-03T00:33:23+00:00"
+ },
+ {
+ "name": "nesbot/carbon",
+ "version": "2.38.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/briannesbitt/Carbon.git",
+ "reference": "d8f6a6a91d1eb9304527b040500f61923e97674b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/d8f6a6a91d1eb9304527b040500f61923e97674b",
+ "reference": "d8f6a6a91d1eb9304527b040500f61923e97674b",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^7.1.8 || ^8.0",
+ "symfony/polyfill-mbstring": "^1.0",
+ "symfony/translation": "^3.4 || ^4.0 || ^5.0"
+ },
+ "require-dev": {
+ "doctrine/orm": "^2.7",
+ "friendsofphp/php-cs-fixer": "^2.14 || ^3.0",
+ "kylekatarnls/multi-tester": "^2.0",
+ "phpmd/phpmd": "^2.8",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^0.12.35",
+ "phpunit/phpunit": "^7.5 || ^8.0",
+ "squizlabs/php_codesniffer": "^3.4"
+ },
+ "bin": [
+ "bin/carbon"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev",
+ "dev-3.x": "3.x-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Carbon\\Laravel\\ServiceProvider"
+ ]
+ },
+ "phpstan": {
+ "includes": [
+ "extension.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Carbon\\": "src/Carbon/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brian Nesbitt",
+ "email": "brian@nesbot.com",
+ "homepage": "http://nesbot.com"
+ },
+ {
+ "name": "kylekatarnls",
+ "homepage": "http://github.com/kylekatarnls"
+ }
+ ],
+ "description": "An API extension for DateTime that supports 281 different languages.",
+ "homepage": "http://carbon.nesbot.com",
+ "keywords": [
+ "date",
+ "datetime",
+ "time"
+ ],
+ "funding": [
+ {
+ "url": "https://opencollective.com/Carbon",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-08-04T19:12:46+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "time": "2017-02-14T16:28:37+00:00"
+ },
+ {
+ "name": "psr/simple-cache",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/simple-cache.git",
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\SimpleCache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for simple caching",
+ "keywords": [
+ "cache",
+ "caching",
+ "psr",
+ "psr-16",
+ "simple-cache"
+ ],
+ "time": "2017-10-23T01:57:42+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.18.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a",
+ "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.18-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-07-14T12:35:20+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.18.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/d87d5766cbf48d72388a9f6b85f280c8ad51f981",
+ "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.18-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-07-14T12:35:20+00:00"
+ },
+ {
+ "name": "symfony/translation",
+ "version": "v5.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation.git",
+ "reference": "4b9bf719f0fa5b05253c37fc7b335337ec7ec427"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/4b9bf719f0fa5b05253c37fc7b335337ec7ec427",
+ "reference": "4b9bf719f0fa5b05253c37fc7b335337ec7ec427",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "^1.15",
+ "symfony/translation-contracts": "^2"
+ },
+ "conflict": {
+ "symfony/config": "<4.4",
+ "symfony/dependency-injection": "<5.0",
+ "symfony/http-kernel": "<5.0",
+ "symfony/twig-bundle": "<5.0",
+ "symfony/yaml": "<4.4"
+ },
+ "provide": {
+ "symfony/translation-implementation": "2.0"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "^4.4|^5.0",
+ "symfony/console": "^4.4|^5.0",
+ "symfony/dependency-injection": "^5.0",
+ "symfony/finder": "^4.4|^5.0",
+ "symfony/http-kernel": "^5.0",
+ "symfony/intl": "^4.4|^5.0",
+ "symfony/service-contracts": "^1.1.2|^2",
+ "symfony/yaml": "^4.4|^5.0"
+ },
+ "suggest": {
+ "psr/log-implementation": "To use logging capability in translator",
+ "symfony/config": "",
+ "symfony/yaml": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Translation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Translation Component",
+ "homepage": "https://symfony.com",
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-06-30T17:42:22+00:00"
+ },
+ {
+ "name": "symfony/translation-contracts",
+ "version": "v2.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation-contracts.git",
+ "reference": "616a9773c853097607cf9dd6577d5b143ffdcd63"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/616a9773c853097607cf9dd6577d5b143ffdcd63",
+ "reference": "616a9773c853097607cf9dd6577d5b143ffdcd63",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5"
+ },
+ "suggest": {
+ "symfony/translation-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Translation\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to translation",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-07-06T13:23:11+00:00"
+ }
+ ],
+ "packages-dev": [],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": [],
+ "platform-dev": [],
+ "plugin-api-version": "1.1.0"
+}
').text(key))
+
+ for (const prop in signature) {
+ if (!signature.hasOwnProperty(prop)) {
+ continue;
+ }
+ const label = signature[prop].label
+ const value = signature[prop].value
+
+ signatureElement.append(
+ $('
').text(label))
+ .append($('
').text(certProp))
+ .append($('