/** * Authenication for Amazon CloudFront * * @return boolean | WP_Error * @since 4.0.0 * @access public */ public function auth($options) { if (!isset($options['distribution_id']) || !$options['distribution_id']) { return new WP_Error('C3 Notice', "CloudFront Distribution ID is not defined."); } if (c3_is_later_than_php_55()) { $sdk = C3_Client_V3::get_instance(); } else { $sdk = C3_Client_V2::get_instance(); //@TODO: for php ~5.4, do not Authenication now. return true; } $cf_client = $sdk->create_cloudfront_client($options); if (is_wp_error($cf_client)) { return $cf_client; } try { $result = $cf_client->getDistribution(array('Id' => $options['distribution_id'])); return true; } catch (Exception $e) { if ('NoSuchDistribution' === $e->getAwsErrorCode()) { $e = new WP_Error('C3 Auth Error', "Can not find CloudFront Distribution ID: {$options['distribution_id']} is not found."); } elseif ('InvalidClientTokenId' == $e->getAwsErrorCode()) { $e = new WP_Error('C3 Auth Error', "AWS AWS Access Key or AWS Secret Key is invalid."); } else { $e = new WP_Error('C3 Auth Error', $e->getMessage()); } error_log($e->get_error_messages(), 0); return $e; } }
/** * Sends a response, but also makes sure to attach headers that * are handy for debugging. * Specifically, we assume folks will want to know what exactly was the DB query that got run, * what exactly was the Models query that got run, what capabilities came into play, what fields were omitted from * the response, others? * * @param array|\WP_Error|\Exception $response * @return \WP_REST_Response */ public function send_response($response) { if ($response instanceof \Exception) { $response = new \WP_Error($response->getCode(), $response->getMessage()); } if ($response instanceof \WP_Error) { $response = $this->_add_ee_errors_to_response($response); $rest_response = $this->_create_rest_response_from_wp_error($response); } else { $rest_response = new \WP_REST_Response($response, 200); } $headers = array(); if ($this->_debug_mode && is_array($this->_debug_info)) { foreach ($this->_debug_info as $debug_key => $debug_info) { if (is_array($debug_info)) { $debug_info = json_encode($debug_info); } $headers['X-EE4-Debug-' . ucwords($debug_key)] = $debug_info; } } $headers = array_merge($headers, $this->_get_headers_from_ee_notices()); $rest_response->set_headers($headers); return $rest_response; }
/** * Invalidation * * @param object $cf_client * @param array $query * @access private * @since 4.3.0 * @return boolean | WP_Error **/ private function _do_invalidation($cf_client, $query) { try { set_transient(self::C3_INVALIDATION_KEY, true, 5 * 60); $result = $cf_client->createInvalidation($query); return true; } catch (Aws\CloudFront\Exception\TooManyInvalidationsInProgressException $e) { error_log($e->__toString(), 0); $e = new WP_Error('C3 Invalidation Error', $e->__toString()); return $e; } catch (Aws\CloudFront\Exception\AccessDeniedException $e) { error_log($e->__toString(), 0); $e = new WP_Error('C3 Invalidation Error', $e->__toString()); return $e; } catch (Exception $e) { $e = new WP_Error('C3 Invalidation Error', $e->getMessage()); error_log($e->get_error_messages(), 0); return $e; } }
/** * Sends a response, but also makes sure to attach headers that * are handy for debugging. * Specifically, we assume folks will want to know what exactly was the DB query that got run, * what exactly was the Models query that got run, what capabilities came into play, what fields were omitted from * the response, others? * * @param array|\WP_Error|\Exception $response * @return \WP_REST_Response */ public function send_response($response) { if ($response instanceof \Exception) { $response = new \WP_Error($response->getCode(), $response->getMessage()); } if ($response instanceof \WP_Error) { //we want to send a "normal"-looking WP error response, but we also //want to add headers. It doesn't seem WP API 1.2 supports this. //I'd like to use WP_JSON_Server::error_to_response() but its protected //so here's most of it copy-and-pasted :P $error_data = $response->get_error_data(); if (is_array($error_data) && isset($error_data['status'])) { $status = $error_data['status']; } else { $status = 500; } $errors = array(); foreach ((array) $response->errors as $code => $messages) { foreach ((array) $messages as $message) { $errors[] = array('code' => $code, 'message' => $message, 'data' => $response->get_error_data($code)); } } $data = isset($errors[0]) ? $errors[0] : array(); if (count($errors) > 1) { // Remove the primary error. array_shift($errors); $data['additional_errors'] = $errors; } $rest_response = new \WP_REST_Response($data, $status); } else { $rest_response = new \WP_REST_Response($response, 200); } $headers = array(); if ($this->_debug_mode && is_array($this->_debug_info)) { foreach ($this->_debug_info as $debug_key => $debug_info) { if (is_array($debug_info)) { $debug_info = json_encode($debug_info); } $headers['X-EE4-Debug-' . ucwords($debug_key)] = $debug_info; } } $rest_response->set_headers($headers); return $rest_response; }