PageRenderTime 108ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/composer-setup.php

https://gitlab.com/luchoman08/personal_collection_mv
PHP | 1206 lines | 1017 code | 74 blank | 115 comment | 92 complexity | 18be3a5a86e72168d17ad7be101d7391 MD5 | raw file
  1. <?php
  2. /*
  3. * This file is part of Composer.
  4. *
  5. * (c) Nils Adermann <naderman@naderman.de>
  6. * Jordi Boggiano <j.boggiano@seld.be>
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. process(is_array($argv) ? $argv : array());
  12. /**
  13. * processes the installer
  14. */
  15. function process($argv)
  16. {
  17. // Determine ANSI output from --ansi and --no-ansi flags
  18. setUseAnsi($argv);
  19. if (in_array('--help', $argv)) {
  20. displayHelp();
  21. exit(0);
  22. }
  23. $check = in_array('--check', $argv);
  24. $help = in_array('--help', $argv);
  25. $force = in_array('--force', $argv);
  26. $quiet = in_array('--quiet', $argv);
  27. $channel = in_array('--snapshot', $argv) ? 'snapshot' : (in_array('--preview', $argv) ? 'preview' : 'stable');
  28. $disableTls = in_array('--disable-tls', $argv);
  29. $installDir = getOptValue('--install-dir', $argv, false);
  30. $version = getOptValue('--version', $argv, false);
  31. $filename = getOptValue('--filename', $argv, 'composer.phar');
  32. $cafile = getOptValue('--cafile', $argv, false);
  33. if (!checkParams($installDir, $version, $cafile)) {
  34. exit(1);
  35. }
  36. $ok = checkPlatform($quiet, $disableTls);
  37. if (true === $disableTls) {
  38. out("You have instructed the Installer not to enforce SSL/TLS security on remote HTTPS requests.", 'info');
  39. out("This will leave all downloads during installation vulnerable to Man-In-The-Middle (MITM) attacks.", 'info');
  40. }
  41. if ($check) {
  42. exit($ok ? 0 : 1);
  43. }
  44. if ($ok || $force) {
  45. installComposer($version, $installDir, $filename, $quiet, $disableTls, $cafile, $channel);
  46. exit(0);
  47. }
  48. exit(1);
  49. }
  50. /**
  51. * displays the help
  52. */
  53. function displayHelp()
  54. {
  55. echo <<<EOF
  56. Composer Installer
  57. ------------------
  58. Options
  59. --help this help
  60. --check for checking environment only
  61. --force forces the installation
  62. --ansi force ANSI color output
  63. --no-ansi disable ANSI color output
  64. --quiet do not output unimportant messages
  65. --install-dir="..." accepts a target installation directory
  66. --preview install the latest version from the preview (alpha/beta/rc) channel instead of stable
  67. --snapshot install the latest version from the snapshot (dev builds) channel instead of stable
  68. --version="..." accepts a specific version to install instead of the latest
  69. --filename="..." accepts a target filename (default: composer.phar)
  70. --disable-tls disable SSL/TLS security for file downloads
  71. --cafile="..." accepts a path to a Certificate Authority (CA) certificate file for SSL/TLS verification
  72. EOF;
  73. }
  74. /**
  75. * Sets the USE_ANSI define for colorizing output
  76. *
  77. * @param array $argv Command-line arguments
  78. */
  79. function setUseAnsi($argv)
  80. {
  81. // --no-ansi wins over --ansi
  82. if (in_array('--no-ansi', $argv)) {
  83. define('USE_ANSI', false);
  84. } elseif (in_array('--ansi', $argv)) {
  85. define('USE_ANSI', true);
  86. } else {
  87. // On Windows, default to no ANSI, except in ANSICON and ConEmu.
  88. // Everywhere else, default to ANSI if stdout is a terminal.
  89. define(
  90. 'USE_ANSI',
  91. (DIRECTORY_SEPARATOR == '\\')
  92. ? (false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI'))
  93. : (function_exists('posix_isatty') && posix_isatty(1))
  94. );
  95. }
  96. }
  97. /**
  98. * Returns the value of a command-line option
  99. *
  100. * @param string $opt The command-line option to check
  101. * @param array $argv Command-line arguments
  102. * @param mixed $default Default value to be returned
  103. *
  104. * @return mixed The command-line value or the default
  105. */
  106. function getOptValue($opt, $argv, $default)
  107. {
  108. $optLength = strlen($opt);
  109. foreach ($argv as $key => $value) {
  110. $next = $key + 1;
  111. if (0 === strpos($value, $opt)) {
  112. if ($optLength === strlen($value) && isset($argv[$next])) {
  113. return trim($argv[$next]);
  114. } else {
  115. return trim(substr($value, $optLength + 1));
  116. }
  117. }
  118. }
  119. return $default;
  120. }
  121. /**
  122. * Checks that user-supplied params are valid
  123. *
  124. * @param mixed $installDir The required istallation directory
  125. * @param mixed $version The required composer version to install
  126. * @param mixed $cafile Certificate Authority file
  127. *
  128. * @return bool True if the supplied params are okay
  129. */
  130. function checkParams($installDir, $version, $cafile)
  131. {
  132. $result = true;
  133. if (false !== $installDir && !is_dir($installDir)) {
  134. out("The defined install dir ({$installDir}) does not exist.", 'info');
  135. $result = false;
  136. }
  137. if (false !== $version && 1 !== preg_match('/^\d+\.\d+\.\d+(\-(alpha|beta)\d+)*$/', $version)) {
  138. out("The defined install version ({$version}) does not match release pattern.", 'info');
  139. $result = false;
  140. }
  141. if (false !== $cafile && (!file_exists($cafile) || !is_readable($cafile))) {
  142. out("The defined Certificate Authority (CA) cert file ({$cafile}) does not exist or is not readable.", 'info');
  143. $result = false;
  144. }
  145. return $result;
  146. }
  147. /**
  148. * check the platform for possible issues on running composer
  149. */
  150. function checkPlatform($quiet, $disableTls)
  151. {
  152. $errors = array();
  153. $warnings = array();
  154. $iniPath = php_ini_loaded_file();
  155. $displayIniMessage = false;
  156. if ($iniPath) {
  157. $iniMessage = PHP_EOL.PHP_EOL.'The php.ini used by your command-line PHP is: ' . $iniPath;
  158. } else {
  159. $iniMessage = PHP_EOL.PHP_EOL.'A php.ini file does not exist. You will have to create one.';
  160. }
  161. $iniMessage .= PHP_EOL.'If you can not modify the ini file, you can also run `php -d option=value` to modify ini values on the fly. You can use -d multiple times.';
  162. if (ini_get('detect_unicode')) {
  163. $errors['unicode'] = 'On';
  164. }
  165. if (extension_loaded('suhosin')) {
  166. $suhosin = ini_get('suhosin.executor.include.whitelist');
  167. $suhosinBlacklist = ini_get('suhosin.executor.include.blacklist');
  168. if (false === stripos($suhosin, 'phar') && (!$suhosinBlacklist || false !== stripos($suhosinBlacklist, 'phar'))) {
  169. $errors['suhosin'] = $suhosin;
  170. }
  171. }
  172. if (!function_exists('json_decode')) {
  173. $errors['json'] = true;
  174. }
  175. if (!extension_loaded('Phar')) {
  176. $errors['phar'] = true;
  177. }
  178. if (!extension_loaded('filter')) {
  179. $errors['filter'] = true;
  180. }
  181. if (!extension_loaded('hash')) {
  182. $errors['hash'] = true;
  183. }
  184. if (!extension_loaded('iconv') && !extension_loaded('mbstring')) {
  185. $errors['iconv_mbstring'] = true;
  186. }
  187. if (!ini_get('allow_url_fopen')) {
  188. $errors['allow_url_fopen'] = true;
  189. }
  190. if (extension_loaded('ionCube Loader') && ioncube_loader_iversion() < 40009) {
  191. $errors['ioncube'] = ioncube_loader_version();
  192. }
  193. if (version_compare(PHP_VERSION, '5.3.2', '<')) {
  194. $errors['php'] = PHP_VERSION;
  195. }
  196. if (version_compare(PHP_VERSION, '5.3.4', '<')) {
  197. $warnings['php'] = PHP_VERSION;
  198. }
  199. if (!extension_loaded('openssl') && true === $disableTls) {
  200. $warnings['openssl'] = true;
  201. } elseif (!extension_loaded('openssl')) {
  202. $errors['openssl'] = true;
  203. }
  204. if (extension_loaded('openssl') && OPENSSL_VERSION_NUMBER < 0x1000100f) {
  205. $warnings['openssl_version'] = true;
  206. }
  207. if (!defined('HHVM_VERSION') && !extension_loaded('apcu') && ini_get('apc.enable_cli')) {
  208. $warnings['apc_cli'] = true;
  209. }
  210. ob_start();
  211. phpinfo(INFO_GENERAL);
  212. $phpinfo = ob_get_clean();
  213. if (preg_match('{Configure Command(?: *</td><td class="v">| *=> *)(.*?)(?:</td>|$)}m', $phpinfo, $match)) {
  214. $configure = $match[1];
  215. if (false !== strpos($configure, '--enable-sigchild')) {
  216. $warnings['sigchild'] = true;
  217. }
  218. if (false !== strpos($configure, '--with-curlwrappers')) {
  219. $warnings['curlwrappers'] = true;
  220. }
  221. }
  222. if (!empty($errors)) {
  223. out("Some settings on your machine make Composer unable to work properly.", 'error');
  224. out('Make sure that you fix the issues listed below and run this script again:', 'error');
  225. foreach ($errors as $error => $current) {
  226. switch ($error) {
  227. case 'json':
  228. $text = PHP_EOL."The json extension is missing.".PHP_EOL;
  229. $text .= "Install it or recompile php without --disable-json";
  230. break;
  231. case 'phar':
  232. $text = PHP_EOL."The phar extension is missing.".PHP_EOL;
  233. $text .= "Install it or recompile php without --disable-phar";
  234. break;
  235. case 'filter':
  236. $text = PHP_EOL."The filter extension is missing.".PHP_EOL;
  237. $text .= "Install it or recompile php without --disable-filter";
  238. break;
  239. case 'hash':
  240. $text = PHP_EOL."The hash extension is missing.".PHP_EOL;
  241. $text .= "Install it or recompile php without --disable-hash";
  242. break;
  243. case 'iconv_mbstring':
  244. $text = PHP_EOL."The iconv OR mbstring extension is required and both are missing.".PHP_EOL;
  245. $text .= "Install either of them or recompile php without --disable-iconv";
  246. break;
  247. case 'unicode':
  248. $text = PHP_EOL."The detect_unicode setting must be disabled.".PHP_EOL;
  249. $text .= "Add the following to the end of your `php.ini`:".PHP_EOL;
  250. $text .= " detect_unicode = Off";
  251. $displayIniMessage = true;
  252. break;
  253. case 'suhosin':
  254. $text = PHP_EOL."The suhosin.executor.include.whitelist setting is incorrect.".PHP_EOL;
  255. $text .= "Add the following to the end of your `php.ini` or suhosin.ini (Example path [for Debian]: /etc/php5/cli/conf.d/suhosin.ini):".PHP_EOL;
  256. $text .= " suhosin.executor.include.whitelist = phar ".$current;
  257. $displayIniMessage = true;
  258. break;
  259. case 'php':
  260. $text = PHP_EOL."Your PHP ({$current}) is too old, you must upgrade to PHP 5.3.2 or higher.";
  261. break;
  262. case 'allow_url_fopen':
  263. $text = PHP_EOL."The allow_url_fopen setting is incorrect.".PHP_EOL;
  264. $text .= "Add the following to the end of your `php.ini`:".PHP_EOL;
  265. $text .= " allow_url_fopen = On";
  266. $displayIniMessage = true;
  267. break;
  268. case 'ioncube':
  269. $text = PHP_EOL."Your ionCube Loader extension ($current) is incompatible with Phar files.".PHP_EOL;
  270. $text .= "Upgrade to ionCube 4.0.9 or higher or remove this line (path may be different) from your `php.ini` to disable it:".PHP_EOL;
  271. $text .= " zend_extension = /usr/lib/php5/20090626+lfs/ioncube_loader_lin_5.3.so";
  272. $displayIniMessage = true;
  273. break;
  274. case 'openssl':
  275. $text = PHP_EOL."The openssl extension is missing, which means that secure HTTPS transfers are impossible.".PHP_EOL;
  276. $text .= "If possible you should enable it or recompile php with --with-openssl";
  277. break;
  278. }
  279. if ($displayIniMessage) {
  280. $text .= $iniMessage;
  281. }
  282. out($text, 'info');
  283. }
  284. out('');
  285. return false;
  286. }
  287. if (!empty($warnings)) {
  288. out("Some settings on your machine may cause stability issues with Composer.", 'error');
  289. out('If you encounter issues, try to change the following:', 'error');
  290. foreach ($warnings as $warning => $current) {
  291. switch ($warning) {
  292. case 'apc_cli':
  293. $text = PHP_EOL."The apc.enable_cli setting is incorrect.".PHP_EOL;
  294. $text .= "Add the following to the end of your `php.ini`:".PHP_EOL;
  295. $text .= " apc.enable_cli = Off";
  296. $displayIniMessage = true;
  297. break;
  298. case 'sigchild':
  299. $text = PHP_EOL."PHP was compiled with --enable-sigchild which can cause issues on some platforms.".PHP_EOL;
  300. $text .= "Recompile it without this flag if possible, see also:".PHP_EOL;
  301. $text .= " https://bugs.php.net/bug.php?id=22999";
  302. break;
  303. case 'curlwrappers':
  304. $text = PHP_EOL."PHP was compiled with --with-curlwrappers which will cause issues with HTTP authentication and GitHub.".PHP_EOL;
  305. $text .= "Recompile it without this flag if possible";
  306. break;
  307. case 'openssl':
  308. $text = PHP_EOL."The openssl extension is missing, which means that secure HTTPS transfers are impossible.".PHP_EOL;
  309. $text .= "If possible you should enable it or recompile php with --with-openssl";
  310. break;
  311. case 'openssl_version':
  312. // Attempt to parse version number out, fallback to whole string value.
  313. $opensslVersion = trim(strstr(OPENSSL_VERSION_TEXT, ' '));
  314. $opensslVersion = substr($opensslVersion, 0, strpos($opensslVersion, ' '));
  315. $opensslVersion = $opensslVersion ? $opensslVersion : OPENSSL_VERSION_TEXT;
  316. $text = PHP_EOL."The OpenSSL library ({$opensslVersion}) used by PHP does not support TLSv1.2 or TLSv1.1.".PHP_EOL;
  317. $text .= "If possible you should upgrade OpenSSL to version 1.0.1 or above.";
  318. break;
  319. case 'php':
  320. $text = PHP_EOL."Your PHP ({$current}) is quite old, upgrading to PHP 5.3.4 or higher is recommended.".PHP_EOL;
  321. $text .= "Composer works with 5.3.2+ for most people, but there might be edge case issues.";
  322. break;
  323. }
  324. if ($displayIniMessage) {
  325. $text .= $iniMessage;
  326. }
  327. out($text, 'info');
  328. }
  329. out('');
  330. return true;
  331. }
  332. if (!$quiet) {
  333. out("All settings correct for using Composer", 'success');
  334. }
  335. return true;
  336. }
  337. /**
  338. * installs composer to the current working directory
  339. */
  340. function installComposer($version, $installDir, $filename, $quiet, $disableTls, $cafile, $channel)
  341. {
  342. $installPath = (is_dir($installDir) ? rtrim($installDir, '/').'/' : '') . $filename;
  343. $installDir = realpath($installDir) ? realpath($installDir) : getcwd();
  344. $file = $installDir.DIRECTORY_SEPARATOR.$filename;
  345. if (is_readable($file)) {
  346. @unlink($file);
  347. }
  348. $home = getHomeDir();
  349. file_put_contents($home.'/keys.dev.pub', <<<DEVPUBKEY
  350. -----BEGIN PUBLIC KEY-----
  351. MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnBDHjZS6e0ZMoK3xTD7f
  352. FNCzlXjX/Aie2dit8QXA03pSrOTbaMnxON3hUL47Lz3g1SC6YJEMVHr0zYq4elWi
  353. i3ecFEgzLcj+pZM5X6qWu2Ozz4vWx3JYo1/a/HYdOuW9e3lwS8VtS0AVJA+U8X0A
  354. hZnBmGpltHhO8hPKHgkJtkTUxCheTcbqn4wGHl8Z2SediDcPTLwqezWKUfrYzu1f
  355. o/j3WFwFs6GtK4wdYtiXr+yspBZHO3y1udf8eFFGcb2V3EaLOrtfur6XQVizjOuk
  356. 8lw5zzse1Qp/klHqbDRsjSzJ6iL6F4aynBc6Euqt/8ccNAIz0rLjLhOraeyj4eNn
  357. 8iokwMKiXpcrQLTKH+RH1JCuOVxQ436bJwbSsp1VwiqftPQieN+tzqy+EiHJJmGf
  358. TBAbWcncicCk9q2md+AmhNbvHO4PWbbz9TzC7HJb460jyWeuMEvw3gNIpEo2jYa9
  359. pMV6cVqnSa+wOc0D7pC9a6bne0bvLcm3S+w6I5iDB3lZsb3A9UtRiSP7aGSo7D72
  360. 8tC8+cIgZcI7k9vjvOqH+d7sdOU2yPCnRY6wFh62/g8bDnUpr56nZN1G89GwM4d4
  361. r/TU7BQQIzsZgAiqOGXvVklIgAMiV0iucgf3rNBLjjeNEwNSTTG9F0CtQ+7JLwaE
  362. wSEuAuRm+pRqi8BRnQ/GKUcCAwEAAQ==
  363. -----END PUBLIC KEY-----
  364. DEVPUBKEY
  365. );
  366. file_put_contents($home.'/keys.tags.pub', <<<TAGSPUBKEY
  367. -----BEGIN PUBLIC KEY-----
  368. MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0Vi/2K6apCVj76nCnCl2
  369. MQUPdK+A9eqkYBacXo2wQBYmyVlXm2/n/ZsX6pCLYPQTHyr5jXbkQzBw8SKqPdlh
  370. vA7NpbMeNCz7wP/AobvUXM8xQuXKbMDTY2uZ4O7sM+PfGbptKPBGLe8Z8d2sUnTO
  371. bXtX6Lrj13wkRto7st/w/Yp33RHe9SlqkiiS4MsH1jBkcIkEHsRaveZzedUaxY0M
  372. mba0uPhGUInpPzEHwrYqBBEtWvP97t2vtfx8I5qv28kh0Y6t+jnjL1Urid2iuQZf
  373. noCMFIOu4vksK5HxJxxrN0GOmGmwVQjOOtxkwikNiotZGPR4KsVj8NnBrLX7oGuM
  374. nQvGciiu+KoC2r3HDBrpDeBVdOWxDzT5R4iI0KoLzFh2pKqwbY+obNPS2bj+2dgJ
  375. rV3V5Jjry42QOCBN3c88wU1PKftOLj2ECpewY6vnE478IipiEu7EAdK8Zwj2LmTr
  376. RKQUSa9k7ggBkYZWAeO/2Ag0ey3g2bg7eqk+sHEq5ynIXd5lhv6tC5PBdHlWipDK
  377. tl2IxiEnejnOmAzGVivE1YGduYBjN+mjxDVy8KGBrjnz1JPgAvgdwJ2dYw4Rsc/e
  378. TzCFWGk/HM6a4f0IzBWbJ5ot0PIi4amk07IotBXDWwqDiQTwyuGCym5EqWQ2BD95
  379. RGv89BPD+2DLnJysngsvVaUCAwEAAQ==
  380. -----END PUBLIC KEY-----
  381. TAGSPUBKEY
  382. );
  383. if (false === $disableTls && empty($cafile) && !HttpClient::getSystemCaRootBundlePath()) {
  384. $errorHandler = new ErrorHandler();
  385. set_error_handler(array($errorHandler, 'handleError'));
  386. $target = $home . '/cacert.pem';
  387. $write = file_put_contents($target, HttpClient::getPackagedCaFile(), LOCK_EX);
  388. @chmod($target, 0644);
  389. restore_error_handler();
  390. if (!$write) {
  391. throw new RuntimeException('Unable to write bundled cacert.pem to: '.$target);
  392. }
  393. $cafile = $target;
  394. }
  395. $httpClient = new HttpClient($disableTls, $cafile);
  396. $uriScheme = false === $disableTls ? 'https' : 'http';
  397. if (!$version) {
  398. $versions = json_decode($httpClient->get($uriScheme . '://getcomposer.org/versions'), true);
  399. foreach ($versions[$channel] as $candidate) {
  400. if ($candidate['min-php'] <= PHP_VERSION_ID) {
  401. $version = $candidate['version'];
  402. $downloadUrl = $candidate['path'];
  403. break;
  404. }
  405. }
  406. if (!$version) {
  407. throw new RuntimeException('There is no version of Composer available for your PHP version ('.PHP_VERSION.')');
  408. }
  409. } else {
  410. $downloadUrl = "/download/{$version}/composer.phar";
  411. }
  412. $retries = 3;
  413. while ($retries--) {
  414. if (!$quiet) {
  415. out("Downloading $version...", 'info');
  416. }
  417. $url = "{$uriScheme}://getcomposer.org{$downloadUrl}";
  418. $errorHandler = new ErrorHandler();
  419. set_error_handler(array($errorHandler, 'handleError'));
  420. // download signature file
  421. if (false === $disableTls) {
  422. $signature = $httpClient->get($url.'.sig');
  423. if (!$signature) {
  424. out('Download failed: '.$errorHandler->message, 'error');
  425. } else {
  426. $signature = json_decode($signature, true);
  427. $signature = base64_decode($signature['sha384']);
  428. }
  429. }
  430. $fh = fopen($file, 'w');
  431. if (!$fh) {
  432. out('Could not create file '.$file.': '.$errorHandler->message, 'error');
  433. }
  434. if (!fwrite($fh, $httpClient->get($url))) {
  435. out('Download failed: '.$errorHandler->message, 'error');
  436. }
  437. fclose($fh);
  438. restore_error_handler();
  439. if ($errorHandler->message) {
  440. continue;
  441. }
  442. try {
  443. // create a temp file ending in .phar since the Phar class only accepts that
  444. if ('.phar' !== substr($file, -5)) {
  445. copy($file, $file.'.tmp.phar');
  446. $pharFile = $file.'.tmp.phar';
  447. } else {
  448. $pharFile = $file;
  449. }
  450. // verify signature
  451. if (false === $disableTls) {
  452. $pubkeyid = openssl_pkey_get_public('file://'.$home.'/' . (preg_match('{^[0-9a-f]{40}$}', $version) ? 'keys.dev.pub' : 'keys.tags.pub'));
  453. $algo = defined('OPENSSL_ALGO_SHA384') ? OPENSSL_ALGO_SHA384 : 'SHA384';
  454. if (!in_array('SHA384', openssl_get_md_methods())) {
  455. out('SHA384 is not supported by your openssl extension, could not verify the phar file integrity', 'error');
  456. exit(1);
  457. }
  458. $verified = 1 === openssl_verify(file_get_contents($file), $signature, $pubkeyid, $algo);
  459. openssl_free_key($pubkeyid);
  460. if (!$verified) {
  461. out('Signature mismatch, could not verify the phar file integrity', 'error');
  462. exit(1);
  463. }
  464. }
  465. // test the phar validity
  466. if (!ini_get('phar.readonly')) {
  467. $phar = new Phar($pharFile);
  468. // free the variable to unlock the file
  469. unset($phar);
  470. }
  471. // clean up temp file if needed
  472. if ($file !== $pharFile) {
  473. unlink($pharFile);
  474. }
  475. break;
  476. } catch (Exception $e) {
  477. if (!$e instanceof UnexpectedValueException && !$e instanceof PharException) {
  478. throw $e;
  479. }
  480. // clean up temp file if needed
  481. if ($file !== $pharFile) {
  482. unlink($pharFile);
  483. }
  484. unlink($file);
  485. if ($retries) {
  486. if (!$quiet) {
  487. out('The download is corrupt, retrying...', 'error');
  488. }
  489. } else {
  490. out('The download is corrupt ('.$e->getMessage().'), aborting.', 'error');
  491. exit(1);
  492. }
  493. }
  494. }
  495. if ($errorHandler->message) {
  496. out('The download failed repeatedly, aborting.', 'error');
  497. exit(1);
  498. }
  499. chmod($file, 0755);
  500. if (!$quiet) {
  501. out(PHP_EOL."Composer successfully installed to: " . $file, 'success', false);
  502. out(PHP_EOL."Use it: php $installPath", 'info');
  503. }
  504. }
  505. /**
  506. * colorize output
  507. */
  508. function out($text, $color = null, $newLine = true)
  509. {
  510. $styles = array(
  511. 'success' => "\033[0;32m%s\033[0m",
  512. 'error' => "\033[31;31m%s\033[0m",
  513. 'info' => "\033[33;33m%s\033[0m"
  514. );
  515. $format = '%s';
  516. if (isset($styles[$color]) && USE_ANSI) {
  517. $format = $styles[$color];
  518. }
  519. if ($newLine) {
  520. $format .= PHP_EOL;
  521. }
  522. printf($format, $text);
  523. }
  524. function getHomeDir()
  525. {
  526. $home = getenv('COMPOSER_HOME');
  527. if (!$home) {
  528. if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
  529. if (!getenv('APPDATA')) {
  530. throw new RuntimeException('The APPDATA or COMPOSER_HOME environment variable must be set for composer to install correctly');
  531. }
  532. $home = strtr(getenv('APPDATA'), '\\', '/') . '/Composer';
  533. } else {
  534. if (!getenv('HOME')) {
  535. throw new RuntimeException('The HOME or COMPOSER_HOME environment variable must be set for composer to install correctly');
  536. }
  537. $home = rtrim(getenv('HOME'), '/') . '/.composer';
  538. }
  539. }
  540. if (!is_dir($home)) {
  541. @mkdir($home, 0777, true);
  542. }
  543. return $home;
  544. }
  545. function validateCaFile($contents)
  546. {
  547. // assume the CA is valid if php is vulnerable to
  548. // https://www.sektioneins.de/advisories/advisory-012013-php-openssl_x509_parse-memory-corruption-vulnerability.html
  549. if (
  550. PHP_VERSION_ID <= 50327
  551. || (PHP_VERSION_ID >= 50400 && PHP_VERSION_ID < 50422)
  552. || (PHP_VERSION_ID >= 50500 && PHP_VERSION_ID < 50506)
  553. ) {
  554. return !empty($contents);
  555. }
  556. return (bool) openssl_x509_parse($contents);
  557. }
  558. class ErrorHandler
  559. {
  560. public $message = '';
  561. public function handleError($code, $msg)
  562. {
  563. if ($this->message) {
  564. $this->message .= "\n";
  565. }
  566. $this->message .= preg_replace('{^copy\(.*?\): }', '', $msg);
  567. }
  568. }
  569. class HttpClient {
  570. private $options = array('http' => array());
  571. private $disableTls = false;
  572. public function __construct($disableTls = false, $cafile = false)
  573. {
  574. $this->disableTls = $disableTls;
  575. if ($this->disableTls === false) {
  576. if (!empty($cafile) && !is_dir($cafile)) {
  577. if (!is_readable($cafile) || !validateCaFile(file_get_contents($cafile))) {
  578. throw new RuntimeException('The configured cafile (' .$cafile. ') was not valid or could not be read.');
  579. }
  580. }
  581. $options = $this->getTlsStreamContextDefaults($cafile);
  582. $this->options = array_replace_recursive($this->options, $options);
  583. }
  584. }
  585. public function get($url)
  586. {
  587. $context = $this->getStreamContext($url);
  588. $result = file_get_contents($url, null, $context);
  589. if ($result && extension_loaded('zlib')) {
  590. $decode = false;
  591. foreach ($http_response_header as $header) {
  592. if (preg_match('{^content-encoding: *gzip *$}i', $header)) {
  593. $decode = true;
  594. continue;
  595. } elseif (preg_match('{^HTTP/}i', $header)) {
  596. $decode = false;
  597. }
  598. }
  599. if ($decode) {
  600. if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
  601. $result = zlib_decode($result);
  602. } else {
  603. // work around issue with gzuncompress & co that do not work with all gzip checksums
  604. $result = file_get_contents('compress.zlib://data:application/octet-stream;base64,'.base64_encode($result));
  605. }
  606. if (!$result) {
  607. throw new RuntimeException('Failed to decode zlib stream');
  608. }
  609. }
  610. }
  611. return $result;
  612. }
  613. protected function getStreamContext($url)
  614. {
  615. if ($this->disableTls === false) {
  616. $host = parse_url($url, PHP_URL_HOST);
  617. if (PHP_VERSION_ID < 50600) {
  618. $this->options['ssl']['CN_match'] = $host;
  619. $this->options['ssl']['SNI_server_name'] = $host;
  620. }
  621. }
  622. // Keeping the above mostly isolated from the code copied from Composer.
  623. return $this->getMergedStreamContext($url);
  624. }
  625. protected function getTlsStreamContextDefaults($cafile)
  626. {
  627. $ciphers = implode(':', array(
  628. 'ECDHE-RSA-AES128-GCM-SHA256',
  629. 'ECDHE-ECDSA-AES128-GCM-SHA256',
  630. 'ECDHE-RSA-AES256-GCM-SHA384',
  631. 'ECDHE-ECDSA-AES256-GCM-SHA384',
  632. 'DHE-RSA-AES128-GCM-SHA256',
  633. 'DHE-DSS-AES128-GCM-SHA256',
  634. 'kEDH+AESGCM',
  635. 'ECDHE-RSA-AES128-SHA256',
  636. 'ECDHE-ECDSA-AES128-SHA256',
  637. 'ECDHE-RSA-AES128-SHA',
  638. 'ECDHE-ECDSA-AES128-SHA',
  639. 'ECDHE-RSA-AES256-SHA384',
  640. 'ECDHE-ECDSA-AES256-SHA384',
  641. 'ECDHE-RSA-AES256-SHA',
  642. 'ECDHE-ECDSA-AES256-SHA',
  643. 'DHE-RSA-AES128-SHA256',
  644. 'DHE-RSA-AES128-SHA',
  645. 'DHE-DSS-AES128-SHA256',
  646. 'DHE-RSA-AES256-SHA256',
  647. 'DHE-DSS-AES256-SHA',
  648. 'DHE-RSA-AES256-SHA',
  649. 'AES128-GCM-SHA256',
  650. 'AES256-GCM-SHA384',
  651. 'ECDHE-RSA-RC4-SHA',
  652. 'ECDHE-ECDSA-RC4-SHA',
  653. 'AES128',
  654. 'AES256',
  655. 'RC4-SHA',
  656. 'HIGH',
  657. '!aNULL',
  658. '!eNULL',
  659. '!EXPORT',
  660. '!DES',
  661. '!3DES',
  662. '!MD5',
  663. '!PSK'
  664. ));
  665. /**
  666. * CN_match and SNI_server_name are only known once a URL is passed.
  667. * They will be set in the getOptionsForUrl() method which receives a URL.
  668. *
  669. * cafile or capath can be overridden by passing in those options to constructor.
  670. */
  671. $options = array(
  672. 'ssl' => array(
  673. 'ciphers' => $ciphers,
  674. 'verify_peer' => true,
  675. 'verify_depth' => 7,
  676. 'SNI_enabled' => true,
  677. )
  678. );
  679. /**
  680. * Attempt to find a local cafile or throw an exception.
  681. * The user may go download one if this occurs.
  682. */
  683. if (!$cafile) {
  684. $cafile = self::getSystemCaRootBundlePath();
  685. }
  686. if (is_dir($cafile)) {
  687. $options['ssl']['capath'] = $cafile;
  688. } elseif ($cafile) {
  689. $options['ssl']['cafile'] = $cafile;
  690. } else {
  691. throw new RuntimeException('A valid cafile could not be located automatically.');
  692. }
  693. /**
  694. * Disable TLS compression to prevent CRIME attacks where supported.
  695. */
  696. if (version_compare(PHP_VERSION, '5.4.13') >= 0) {
  697. $options['ssl']['disable_compression'] = true;
  698. }
  699. return $options;
  700. }
  701. /**
  702. * function copied from Composer\Util\StreamContextFactory::getContext
  703. *
  704. * Any changes should be applied there as well, or backported here.
  705. *
  706. * @param string $url URL the context is to be used for
  707. * @return resource Default context
  708. * @throws \RuntimeException if https proxy required and OpenSSL uninstalled
  709. */
  710. protected function getMergedStreamContext($url)
  711. {
  712. $options = $this->options;
  713. // Handle system proxy
  714. if (!empty($_SERVER['HTTP_PROXY']) || !empty($_SERVER['http_proxy'])) {
  715. // Some systems seem to rely on a lowercased version instead...
  716. $proxy = parse_url(!empty($_SERVER['http_proxy']) ? $_SERVER['http_proxy'] : $_SERVER['HTTP_PROXY']);
  717. }
  718. if (!empty($proxy)) {
  719. $proxyURL = isset($proxy['scheme']) ? $proxy['scheme'] . '://' : '';
  720. $proxyURL .= isset($proxy['host']) ? $proxy['host'] : '';
  721. if (isset($proxy['port'])) {
  722. $proxyURL .= ":" . $proxy['port'];
  723. } elseif ('http://' == substr($proxyURL, 0, 7)) {
  724. $proxyURL .= ":80";
  725. } elseif ('https://' == substr($proxyURL, 0, 8)) {
  726. $proxyURL .= ":443";
  727. }
  728. // http(s):// is not supported in proxy
  729. $proxyURL = str_replace(array('http://', 'https://'), array('tcp://', 'ssl://'), $proxyURL);
  730. if (0 === strpos($proxyURL, 'ssl:') && !extension_loaded('openssl')) {
  731. throw new RuntimeException('You must enable the openssl extension to use a proxy over https');
  732. }
  733. $options['http'] = array(
  734. 'proxy' => $proxyURL,
  735. );
  736. // enabled request_fulluri unless it is explicitly disabled
  737. switch (parse_url($url, PHP_URL_SCHEME)) {
  738. case 'http': // default request_fulluri to true
  739. $reqFullUriEnv = getenv('HTTP_PROXY_REQUEST_FULLURI');
  740. if ($reqFullUriEnv === false || $reqFullUriEnv === '' || (strtolower($reqFullUriEnv) !== 'false' && (bool) $reqFullUriEnv)) {
  741. $options['http']['request_fulluri'] = true;
  742. }
  743. break;
  744. case 'https': // default request_fulluri to true
  745. $reqFullUriEnv = getenv('HTTPS_PROXY_REQUEST_FULLURI');
  746. if ($reqFullUriEnv === false || $reqFullUriEnv === '' || (strtolower($reqFullUriEnv) !== 'false' && (bool) $reqFullUriEnv)) {
  747. $options['http']['request_fulluri'] = true;
  748. }
  749. break;
  750. }
  751. if (isset($proxy['user'])) {
  752. $auth = urldecode($proxy['user']);
  753. if (isset($proxy['pass'])) {
  754. $auth .= ':' . urldecode($proxy['pass']);
  755. }
  756. $auth = base64_encode($auth);
  757. $options['http']['header'] = "Proxy-Authorization: Basic {$auth}\r\n";
  758. }
  759. }
  760. if (isset($options['http']['header'])) {
  761. $options['http']['header'] .= "Connection: close\r\n";
  762. } else {
  763. $options['http']['header'] = "Connection: close\r\n";
  764. }
  765. if (extension_loaded('zlib')) {
  766. $options['http']['header'] .= "Accept-Encoding: gzip\r\n";
  767. }
  768. $options['http']['header'] .= "User-Agent: Composer Installer\r\n";
  769. $options['http']['protocol_version'] = 1.1;
  770. return stream_context_create($options);
  771. }
  772. /**
  773. * This method was adapted from Sslurp.
  774. * https://github.com/EvanDotPro/Sslurp
  775. *
  776. * (c) Evan Coury <me@evancoury.com>
  777. *
  778. * For the full copyright and license information, please see below:
  779. *
  780. * Copyright (c) 2013, Evan Coury
  781. * All rights reserved.
  782. *
  783. * Redistribution and use in source and binary forms, with or without modification,
  784. * are permitted provided that the following conditions are met:
  785. *
  786. * * Redistributions of source code must retain the above copyright notice,
  787. * this list of conditions and the following disclaimer.
  788. *
  789. * * Redistributions in binary form must reproduce the above copyright notice,
  790. * this list of conditions and the following disclaimer in the documentation
  791. * and/or other materials provided with the distribution.
  792. *
  793. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  794. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  795. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  796. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
  797. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  798. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  799. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  800. * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  801. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  802. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  803. */
  804. public static function getSystemCaRootBundlePath()
  805. {
  806. static $caPath = null;
  807. if ($caPath !== null) {
  808. return $caPath;
  809. }
  810. // If SSL_CERT_FILE env variable points to a valid certificate/bundle, use that.
  811. // This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
  812. $envCertFile = getenv('SSL_CERT_FILE');
  813. if ($envCertFile && is_readable($envCertFile) && validateCaFile(file_get_contents($envCertFile))) {
  814. return $caPath = $envCertFile;
  815. }
  816. // If SSL_CERT_DIR env variable points to a valid certificate/bundle, use that.
  817. // This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
  818. $envCertDir = getenv('SSL_CERT_DIR');
  819. if ($envCertDir && is_dir($envCertDir) && is_readable($envCertDir)) {
  820. return $caPath = $envCertDir;
  821. }
  822. $configured = ini_get('openssl.cafile');
  823. if ($configured && strlen($configured) > 0 && is_readable($configured) && validateCaFile(file_get_contents($configured))) {
  824. return $caPath = $configured;
  825. }
  826. $configured = ini_get('openssl.capath');
  827. if ($configured && is_dir($configured) && is_readable($configured)) {
  828. return $caPath = $configured;
  829. }
  830. $caBundlePaths = array(
  831. '/etc/pki/tls/certs/ca-bundle.crt', // Fedora, RHEL, CentOS (ca-certificates package)
  832. '/etc/ssl/certs/ca-certificates.crt', // Debian, Ubuntu, Gentoo, Arch Linux (ca-certificates package)
  833. '/etc/ssl/ca-bundle.pem', // SUSE, openSUSE (ca-certificates package)
  834. '/usr/local/share/certs/ca-root-nss.crt', // FreeBSD (ca_root_nss_package)
  835. '/usr/ssl/certs/ca-bundle.crt', // Cygwin
  836. '/opt/local/share/curl/curl-ca-bundle.crt', // OS X macports, curl-ca-bundle package
  837. '/usr/local/share/curl/curl-ca-bundle.crt', // Default cURL CA bunde path (without --with-ca-bundle option)
  838. '/usr/share/ssl/certs/ca-bundle.crt', // Really old RedHat?
  839. '/etc/ssl/cert.pem', // OpenBSD
  840. '/usr/local/etc/ssl/cert.pem', // FreeBSD 10.x
  841. );
  842. foreach ($caBundlePaths as $caBundle) {
  843. if (@is_readable($caBundle) && validateCaFile(file_get_contents($caBundle))) {
  844. return $caPath = $caBundle;
  845. }
  846. }
  847. foreach ($caBundlePaths as $caBundle) {
  848. $caBundle = dirname($caBundle);
  849. if (is_dir($caBundle) && glob($caBundle.'/*')) {
  850. return $caPath = $caBundle;
  851. }
  852. }
  853. return $caPath = false;
  854. }
  855. public static function getPackagedCaFile()
  856. {
  857. return <<<CACERT
  858. ##
  859. ## Bundle of CA Root Certificates
  860. ##
  861. ## Certificate data from Mozilla as of: Wed Oct 28 22:42:42 2015
  862. ##
  863. ## This is a bundle of X.509 certificates of public Certificate Authorities
  864. ## (CA). These were automatically extracted from Mozilla's root certificates
  865. ## file (certdata.txt). This file can be found at
  866. ## https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt
  867. ##
  868. ## It contains the certificates in PEM format and therefore
  869. ## can be directly used with curl / libcurl / php_curl, or with
  870. ## an Apache+mod_ssl webserver for SSL client authentication.
  871. ## Just configure this file as the SSLCACertificateFile.
  872. ##
  873. ## Conversion done with mk-ca-bundle.pl version 1.25.
  874. ## SHA1: 6d7d2f0a4fae587e7431be191a081ac1257d300a
  875. ##
  876. Equifax Secure CA
  877. =================
  878. -----BEGIN CERTIFICATE-----
  879. MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
  880. ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
  881. MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
  882. B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
  883. nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
  884. fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
  885. 8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
  886. A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
  887. CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
  888. A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
  889. spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
  890. Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
  891. zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
  892. BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
  893. 70+sB3c4
  894. -----END CERTIFICATE-----
  895. GlobalSign Root CA
  896. ==================
  897. -----BEGIN CERTIFICATE-----
  898. MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
  899. GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
  900. b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
  901. BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
  902. VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
  903. DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
  904. THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
  905. Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
  906. c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
  907. gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
  908. HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
  909. AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
  910. Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
  911. j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
  912. hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
  913. X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
  914. -----END CERTIFICATE-----
  915. GlobalSign Root CA - R2
  916. =======================
  917. -----BEGIN CERTIFICATE-----
  918. MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
  919. YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
  920. bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
  921. aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
  922. bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
  923. ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
  924. s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
  925. S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
  926. TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
  927. ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
  928. FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
  929. YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
  930. BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
  931. 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
  932. 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
  933. 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
  934. TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
  935. -----END CERTIFICATE-----
  936. Verisign Class 3 Public Primary Certification Authority - G3
  937. ============================================================
  938. -----BEGIN CERTIFICATE-----
  939. MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
  940. UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
  941. cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
  942. IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
  943. dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
  944. CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
  945. dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
  946. cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
  947. Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
  948. ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
  949. EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
  950. cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
  951. EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
  952. 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
  953. ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
  954. j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
  955. /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
  956. xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
  957. t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
  958. -----END CERTIFICATE-----
  959. Verisign Class 4 Public Primary Certification Authority - G3
  960. ============================================================
  961. -----BEGIN CERTIFICATE-----
  962. MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
  963. UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
  964. cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
  965. IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
  966. dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
  967. CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
  968. dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
  969. cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
  970. Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
  971. ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
  972. tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
  973. 8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
  974. Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
  975. Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
  976. j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
  977. mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
  978. fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
  979. RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
  980. UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
  981. -----END CERTIFICATE-----
  982. Entrust.net Premium 2048 Secure Server CA
  983. =========================================
  984. -----BEGIN CERTIFICATE-----
  985. MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
  986. ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
  987. bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
  988. BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
  989. NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
  990. d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
  991. MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
  992. ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
  993. MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
  994. Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
  995. hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
  996. nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
  997. VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
  998. BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
  999. KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
  1000. T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
  1001. zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
  1002. J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
  1003. nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
  1004. -----END CERTIFICATE-----
  1005. Baltimore CyberTrust Root
  1006. =========================
  1007. -----BEGIN CERTIFICATE-----
  1008. MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
  1009. ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
  1010. ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
  1011. SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
  1012. dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
  1013. uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
  1014. UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
  1015. G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
  1016. XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
  1017. l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
  1018. VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
  1019. BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
  1020. cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
  1021. hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
  1022. Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
  1023. RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
  1024. -----END CERTIFICATE-----
  1025. AddTrust Low-Value Services Root
  1026. ================================
  1027. -----BEGIN CERTIFICATE-----
  1028. MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
  1029. QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
  1030. cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
  1031. CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
  1032. ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
  1033. AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
  1034. 54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
  1035. oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
  1036. Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
  1037. GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
  1038. HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
  1039. AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
  1040. RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
  1041. HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
  1042. ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
  1043. iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
  1044. eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
  1045. mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
  1046. ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
  1047. -----END CERTIFICATE-----
  1048. AddTrust External Root
  1049. ======================
  1050. -----BEGIN CERTIFICATE-----
  1051. MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
  1052. QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
  1053. VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
  1054. NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
  1055. cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
  1056. Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
  1057. +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
  1058. Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
  1059. aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
  1060. 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
  1061. 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
  1062. BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0J