connectionTimeout = $connectionTimeout; } /** * Download the remote zipfile. * * @param string $remoteFile * URL of a .zip file. * @param string $localFile * Path at which to store the .zip file. * @return STATUS_OK|STATUS_WRITE_ERROR|STATUS_DL_ERROR */ public function fetch($remoteFile, $localFile) { // Download extension zip file ... if (!function_exists('curl_init')) { CRM_Core_Error::fatal('Cannot install this extension - curl is not installed!'); } list($ch, $caConfig) = $this->createCurl($remoteFile); if (preg_match('/^https:/', $remoteFile) && !$caConfig->isEnableSSL()) { CRM_Core_Error::fatal('Cannot install this extension - does not support SSL'); } $fp = @fopen($localFile, "w"); if (!$fp) { return self::STATUS_WRITE_ERROR; } curl_setopt($ch, CURLOPT_FILE, $fp); curl_exec($ch); if (curl_errno($ch)) { return self::STATUS_DL_ERROR; } else { curl_close($ch); } fclose($fp); return self::STATUS_OK; } /** * Send an HTTP GET for a remote resource. * * @param string $remoteFile * URL of remote file. * @return array * array(0 => STATUS_OK|STATUS_DL_ERROR, 1 => string) */ public function get($remoteFile) { // Download extension zip file ... if (!function_exists('curl_init')) { // CRM-13805 CRM_Core_Session::setStatus( ts('As a result, actions like retrieving the CiviCRM news feed will fail. Talk to your server administrator or hosting company to rectify this.'), ts('Curl is not installed') ); return [self::STATUS_DL_ERROR, NULL]; } list($ch, $caConfig) = $this->createCurl($remoteFile); if (preg_match('/^https:/', $remoteFile) && !$caConfig->isEnableSSL()) { // CRM_Core_Error::fatal('Cannot install this extension - does not support SSL'); return [self::STATUS_DL_ERROR, NULL]; } curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($ch); if (curl_errno($ch)) { return [self::STATUS_DL_ERROR, $data]; } else { curl_close($ch); } return [self::STATUS_OK, $data]; } /** * Send an HTTP POST for a remote resource. * * @param string $remoteFile * URL of a .zip file. * @param array $params * * @return array * array(0 => STATUS_OK|STATUS_DL_ERROR, 1 => string) */ public function post($remoteFile, $params) { // Download extension zip file ... if (!function_exists('curl_init')) { //CRM_Core_Error::fatal('Cannot install this extension - curl is not installed!'); return [self::STATUS_DL_ERROR, NULL]; } list($ch, $caConfig) = $this->createCurl($remoteFile); if (preg_match('/^https:/', $remoteFile) && !$caConfig->isEnableSSL()) { // CRM_Core_Error::fatal('Cannot install this extension - does not support SSL'); return [self::STATUS_DL_ERROR, NULL]; } curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POST, count($params)); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); $data = curl_exec($ch); if (curl_errno($ch)) { return [self::STATUS_DL_ERROR, $data]; } else { curl_close($ch); } return [self::STATUS_OK, $data]; } /** * @param string $remoteFile * @return array * (0 => resource, 1 => CA_Config_Curl) */ protected function createCurl($remoteFile) { $caConfig = CA_Config_Curl::probe([ 'verify_peer' => (bool) Civi::settings()->get('verifySSL'), ]); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $remoteFile); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_ENCODING, 'gzip'); curl_setopt($ch, CURLOPT_VERBOSE, 0); if ($this->isRedirectSupported()) { curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); } if ($this->connectionTimeout !== NULL) { curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->connectionTimeout); } if (preg_match('/^https:/', $remoteFile) && $caConfig->isEnableSSL()) { curl_setopt_array($ch, $caConfig->toCurlOptions()); } return [$ch, $caConfig]; } /** * @return bool */ public function isRedirectSupported() { return (ini_get('open_basedir') == '') && (ini_get('safe_mode') == 'Off' || ini_get('safe_mode') == '' || ini_get('safe_mode') === FALSE); } }