protected function _aclRules($module, $controller, $action, $stack, $get = array()) { $applicationAcl = Saf_Acl::getInstance(); $url = ('default' != $module ? "{$module}/" : '') . ('index' != $controller || 'index' != $action || count($stack) ? "{$controller}/" : '') . (('index' != $action || count($stack)) && '' != $action ? "{$action}/" : '') . (count($stack) ? implode('/', $stack) . '/' : ''); $getStack = array(); foreach ($get as $getKey => $getValue) { if (!in_array($getKey, self::$_redactedKeys)) { $getStack[] = urldecode($getKey) . '=' . urlencode($getValue); } } $get = $getStack ? '?' . implode('&', $getStack) : ''; //Saf_Debug::outdata((array($url,$module,$controller,$action,$stack)); $forward = Saf_UrlRewrite::encodeForward($url . $get); $redirectUrl = 'login/' . ($forward ? "?{$forward}" : ''); $whoCan = $applicationAcl->who($module, $controller, $action, $stack); switch ($whoCan) { case Saf_Acl::ACL_WHO_ANYUSER: case Saf_Acl::ACL_WHO_USER: if (!Saf_Auth::isLoggedIn()) { throw new Saf_Exception_Redirect($redirectUrl); } break; case Saf_Acl::ACL_WHO_SOMEUSER: if (!Saf_Auth::isLoggedIn()) { throw new Saf_Exception_Redirect($redirectUrl); } else { throw new Saf_Exception_NotAllowed('Insufficient permissions for operation.'); } break; case Saf_Acl::ACL_WHO_ANYONE: break; case Saf_Acl::ACL_WHO_OTHERUSER: if (!$username) { throw new Saf_Exception_NotAllowed('Insufficient permissions for operation.'); } //#TODO #1.3.0 verify this works preoprly break; case Saf_Acl::ACL_WHO_NOONE: throw new Saf_Exception_NotAllowed('Operation Not Allowed.'); default: throw new Saf_Exception_NotImplemented('Operation Not Supported.'); } }
public function go($get = array(), $post = array(), $postContentType = '') { if ('' == trim($this->_url)) { throw new Exception('Must specify a url before using the Http Client.'); } $persist = $this->_connection; if (!$persist) { $this->pickup(); } if (is_array($get)) { $query = $this->buildQuery($get); } else { if (!is_null($get) && '' != trim($get)) { $cleanQuery = ltrim($get, '?'); $query = '?' . Saf_UrlRewrite::makeUrlSafe($cleanQuery); } else { $query = ''; } } $headers = array_merge($this->_headers, $this->_tempHeaders); $this->clearTempHeaders(); $fullUrl = $this->_url . $this->_actionUrl . $query; $options = array(); $options[CURLOPT_URL] = $fullUrl; $debugPost = ''; if (is_array($post) && count($post) > 0) { $debugPost = json_encode($debugPost, JSON_FORCE_OBJECT); $options[CURLOPT_POSTFIELDS] = $post; //#TODO #2.0.0 the path reported by this client for any sent files will be fully qualified. if the server is too stupid to handle this, a work around will be needed, possibly chdir... } else { if (!is_array($post) && '' != trim($post)) { $debugPost = $post; $options[CURLOPT_POST] = TRUE; if ($postContentType === self::UNENCODED_POST_DATA) { $post = urlencode($post); } $options[CURLOPT_POSTFIELDS] = $post; if ('' != $postContentType && $postContentType !== self::UNENCODED_POST_DATA) { $headers[] = 'Content-type: ' . $postContentType; } } else { #TODO #2.0.0 make sure switching back to GET mode when persisting works properly if (array_key_exists(CURLOPT_POST, $options)) { $options[CURLOPT_POST] = FALSE; //or unset? } } } if ($this->_authenticate) { $username = $this->_user; $password = $this->_password; $options[CURLOPT_USERPWD] = "{$username}:{$password}"; } $options[CURLOPT_HTTPHEADER] = $headers; if ($this->_antiqueServerMode) { $options[CURLOPT_HTTPHEADER] = array('Expect:'); } curl_setopt_array($this->_connection, $options); try { $result = curl_exec($this->_connection); $resultHead = ''; $resultRest = $result; $resultHeadEnd = strpos($resultRest, "\r\n\r\n"); // $count = 0; // $head = str_replace("\r\n", "\\r\\n<br/>", $resultHead); // $body = str_replace("\r\n", "\\r\\n<br/>", $resultRest); while ($resultHeadEnd !== FALSE) { // $count++; $resultHead .= substr($resultRest, 0, $resultHeadEnd + 4); $resultRest = substr($resultRest, $resultHeadEnd + 4); $resultHeadEnd = strpos($resultRest, "\r\n\r\n"); // if ( // strpos($resultRest, 'HTTP') === 0 // || strpos($resultRest, '\r\n\r\n') !== FALSE // ) { // } else { // $resultHeadEnd = FALSE; // } // $resultHeadEnd = // ( // strpos($resultRest,'HTTP') !== 0 // // && strpos($resultRest,'Content-Length:') !== 0 // ) ? FALSE // : strpos($resultRest,"\r\n\r\n"); // if (strpos($resultRest,'\r\n') === 0) { // $resultHead .= ( // substr($result, 0, 2) // ); // $resultRest = substr($result, 2); // $resultHeadEnd +=2; // } $head = str_replace("\r\n", "\\r\\n<br/>", $resultHead); $body = str_replace("\r\n", "\\r\\n<br/>", $resultRest); //Saf_Debug::outData(array($resultHeadEnd,$head,$body)); } // if ($count > 2) { // die('server sent too many continues'); //#TODO #1.1.0 // } if ($this->_debugEnabled) { Saf_Debug::outData(array($fullUrl, htmlentities($debugPost), htmlentities($head), htmlentities($body))); } $resultBody = $resultRest; $this->_lastError = curl_error($this->_connection); $resultInfo = curl_getinfo($this->_connection); $this->_lastResult = array('response' => $result, 'status' => $resultInfo, 'error' => $this->_lastError); $this->_lastStatus = $resultInfo['http_code']; } catch (Exception $e) { $this->_lastError = $e->getMessage(); $this->_lastStatus = 'EXCEPTION'; $return = array('url' => $fullUrl, 'status' => 500, 'error' => $this->_lastError, 'raw' => '', 'length' => 0, 'type' => ''); if (Saf_Debug::isEnabled()) { $return['stack'] = $e->getTrace(); } $this->_lastStatus = $return['status']; return $return; } if (!$persist) { $this->putdown(); } $status = (int) $resultInfo['http_code']; $return = array('url' => $fullUrl, 'status' => $status, 'status_label' => array_key_exists($status, self::$_httpCodes) ? self::$_httpCodes[$status] : 'UNKNOWN', 'length' => $resultInfo['download_content_length'], 'type' => $resultInfo['content_type'], 'redirectCount' => $resultInfo['redirect_count'], 'sentHeaders' => array_key_exists('request_header', $resultInfo) ? $resultInfo['request_header'] : '', 'receivedHeaders' => $resultHead, 'raw' => $resultBody); if ($resultInfo['size_upload'] < $resultInfo['upload_content_length']) { $return['up'] = floor($resultInfo['size_upload'] / $resultInfo['upload_content_length'] * 100); } if ($resultInfo['size_download'] < $resultInfo['download_content_length']) { $return['down'] = floor($resultInfo['size_download'] / $resultInfo['download_content_length'] * 100); } if ($fullUrl != $resultInfo['url']) { $return['effectiveUrl'] = $resultInfo['url']; } if (array_key_exists('ssl_verify_result', $resultInfo) && 0 != $resultInfo['ssl_verify_result']) { $return['ssl_error_code'] = $resultInfo['ssl_verify_result'] . (array_key_exists($resultInfo['ssl_verify_result'], self::$_sslCodes) ? ' ' . self::$_sslCodes[$resultInfo['ssl_verify_result']] : ' unknown SSL connection error'); } if ($status < 200 || $status >= 300) { $return['failedConnectionInfo'] = curl_getinfo($this->_connection); if ($post && Saf_Debug::isEnabled()) { if (is_array($post) && count($post) > 0) { ob_start(); print_r($post); $rawRequest = ob_get_contents(); ob_end_clean(); $return['request'] = $rawRequest; } else { $return['request'] = $post; } } } return $return; }