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) { CRM_Core_Session::setStatus(ts('Unable to write to %1.
Is the location writable?', array(1 => $localFile)), ts('Write Error'), 'error'); return self::STATUS_WRITE_ERROR; } curl_setopt($ch, CURLOPT_FILE, $fp); curl_exec($ch); if (curl_errno($ch)) { CRM_Core_Session::setStatus(ts('Unable to download extension from %1. Error Message: %2', array(1 => $remoteFile, 2 => curl_error($ch))), ts('Download Error'), 'error'); 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 array(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 array(self::STATUS_DL_ERROR, NULL); } curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($ch); if (curl_errno($ch)) { return array(self::STATUS_DL_ERROR, $data); } else { curl_close($ch); } return array(self::STATUS_OK, $data); } /** * Send an HTTP POST for a remote resource * * @param string $remoteFile URL of a .zip file * @param $params * * @internal param string $localFile path at which to store the .zip file * @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 array(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 array(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 array(self::STATUS_DL_ERROR, $data); } else { curl_close($ch); } return array(self::STATUS_OK, $data); } /** * @param string $remoteFile * @return array (0 => resource, 1 => CA_Config_Curl) */ protected function createCurl($remoteFile) { require_once 'CA/Config/Curl.php'; $caConfig = CA_Config_Curl::probe(array( 'verify_peer' => (bool) CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'verifySSL', NULL, TRUE) )); $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 array($ch, $caConfig); } public function isRedirectSupported() { return (ini_get('open_basedir') == '') && (ini_get('safe_mode') == 'Off' || ini_get('safe_mode') === FALSE); } }