Current Path : /var/www/ooareogundevinitiative/wp-content/plugins/brizy/admin/cloud/ |
Current File : /var/www/ooareogundevinitiative/wp-content/plugins/brizy/admin/cloud/client.php |
<?php class Brizy_Admin_Cloud_Client extends WP_Http { use Brizy_Editor_Asset_AttachmentAware; const TRANSIENT_KEY = 'brizy_cloud_editor_versions'; /** * @var Brizy_Editor_Project */ private $brizyProject; /** * @var WP_Http */ private $http; /** * @var integer */ private $library; /** * Brizy_Admin_Cloud_Client constructor. * * @param Brizy_Editor_Project $project * @param WP_Http $http */ public function __construct( $project, $http ) { $this->brizyProject = $project; $this->http = $http; add_action( 'brizy-updated', [ 'Brizy_Admin_Cloud_Client', 'clearVersionCache' ] ); do_action( 'brizy-activated', [ 'Brizy_Admin_Cloud_Client', 'clearVersionCache' ] ); } public static function clearVersionCache() { delete_transient( self::TRANSIENT_KEY ); } /** * @return Brizy_Editor_Project */ public function getBrizyProject() { return $this->brizyProject; } /** * @param Brizy_Editor_Project $brizyProject * * @return Brizy_Admin_Cloud_Client */ public function setBrizyProject( $brizyProject ) { $this->brizyProject = $brizyProject; return $this; } /** * @return WP_Http */ public function getHttp() { return $this->http; } /** * @param WP_Http $http * * @return Brizy_Admin_Cloud_Client */ public function setHttp( $http ) { $this->http = $http; return $this; } /** * @param $uid * * @return string */ public function getScreenshotUrl( $uid ) { $url = Brizy_Config::getEditorBaseUrls() . Brizy_Config::CLOUD_SCREENSHOT; return sprintf( $url, $uid ); } /** * @param $screenUid * @param $filePath * * @return bool */ public function createScreenshot( $screenUid, $filePath ) { $data = array( 'uid' => $screenUid, 'attachment' => base64_encode( file_get_contents( $filePath ) ) ); $response = $this->http->post( Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_SCREENSHOTS, array( 'headers' => $this->getHeaders(), 'body' => $data ) ); $code = wp_remote_retrieve_response_code( $response ); if ( $code >= 200 && $code <= 300 ) { return true; } return false; } private function getHeaders( $aditional = null ) { $values = $this->getCloudEditorVersions(); return array_merge( array( //'X-AUTH-APP-TOKEN' => Brizy_Config::CLOUD_APP_KEY, 'X-AUTH-USER-TOKEN' => $this->brizyProject->getMetaValue( 'brizy-cloud-token' ), 'X-EDITOR-VERSION' => $values['editor'], 'X-SYNC-VERSION' => BRIZY_SYNC_VERSION ), is_array( $aditional ) ? $aditional : array() ); } private function getHeadersWithoutAuthorization( $aditional = null ) { return array_merge( array( //'X-AUTH-APP-TOKEN' => Brizy_Config::CLOUD_APP_KEY, 'X-SYNC-VERSION' => BRIZY_SYNC_VERSION ), is_array( $aditional ) ? $aditional : array() ); } public function getLibraries() { $response = $this->http->get( Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_LIBRARY, array( 'headers' => $this->getHeaders() ) ); $code = wp_remote_retrieve_response_code( $response ); if ( $code == 200 ) { $body = wp_remote_retrieve_body( $response ); $libraries = json_decode( $body ); if ( count( $libraries ) == 0 ) { throw new Exception( 'No libraries provided' ); } return $libraries; } return null; } /** * @param $email * @param $password * * @return array|bool|WP_Error */ public function signIn( $email, $password ) { $response = $this->http->post( Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_SIGNIN, array( 'headers' => $this->getHeadersWithoutAuthorization( array( 'Content-type' => 'application/x-www-form-urlencoded' ) ), 'body' => array( 'email' => $email, 'password' => $password ), 'timeout' => 30 ) ); $code = wp_remote_retrieve_response_code( $response ); if ( $code == 200 ) { $jsonResponse = json_decode( $response['body'] ); // update cloud editor versions $this->getCloudEditorVersions( true ); return $jsonResponse->token; } return false; } /** * @param string $firstName * @param string $lastName * @param string $email * @param string $password * @param string $confirmPassword * * @return bool */ public function signUp( $firstName, $lastName, $email, $password, $confirmPassword ) { $response = $this->http->post( Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_SIGNUP, array( 'headers' => $this->getHeadersWithoutAuthorization( array( 'Content-type' => 'application/x-www-form-urlencoded' ) ), 'body' => array( 'first_name' => $firstName, 'last_name' => $lastName, 'email' => $email, 'new_password' => $password, 'confirm_password' => $confirmPassword, ) ) ); $code = wp_remote_retrieve_response_code( $response ); if ( $code == 200 ) { $jsonResponse = json_decode( $response['body'] ); return $jsonResponse->token; } return false; } /** * @param $email * * @return bool */ public function resetPassword( $email ) { $response = $this->http->post( Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_RESET_PASSWORD, array( 'headers' => $this->getHeaders( array( 'Content-type' => 'application/x-www-form-urlencoded' ) ), 'body' => array( 'email' => $email, ) ) ); $code = wp_remote_retrieve_response_code( $response ); return $code >= 200 && $code < 300; } public function getCloudEditorVersions( $ignoreCache = false ) { $value = get_transient( 'brizy_cloud_editor_versions' ); if ( $value && ! $ignoreCache ) { return $value; } $url = Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_EDITOR_VERSIONS; $response = $this->http->get( $url ); $code = wp_remote_retrieve_response_code( $response ); if ( $code == 200 ) { $value = (array) json_decode( $response['body'] ); set_transient( 'brizy_cloud_editor_versions', $value, 3600 ); } else { throw new Exception( wp_remote_retrieve_response_message( $response ) ); } return $value; } public function getContainers() { return $this->getCloudEntity( Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_CONTAINERS, [] ); } public function getProjects( $filters ) { return $this->getCloudEntity( Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_PROJECTS, $filters ); } public function getProject( $id ) { $url = sprintf( Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_PROJECTS . "/%d", (int) $id ); $response = $this->http->get( $url, array( 'headers' => $this->getHeaders() ) ); $code = wp_remote_retrieve_response_code( $response ); if ( $code == 200 ) { return json_decode( $response['body'] ); } return null; } public function createProject( $container, $name ) { $response = $this->http->post( Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_PROJECTS, array( 'headers' => $this->getHeaders(), 'body' => array( 'name' => $name, 'container' => $container, 'globals' => null, 'site_id' => null ) ) ); $code = wp_remote_retrieve_response_code( $response ); if ( $code == 200 ) { return json_decode( $response['body'] ); } return false; } public function getBlocks( $filters = array() ) { return $this->getCloudEntityByContainer( Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_SAVEDBLOCKS, $filters ); } /** * @param $id * * @return array|mixed|object|null */ public function getBlockByUid( $uid ) { $blocks = $this->getBlocks( [ 'uid' => $uid ] ); return array_pop( $blocks ); } /** * @param $id * * @return array|mixed|object|null */ public function getBlock( $id ) { $blocks = $this->getCloudEntityByContainer( Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_SAVEDBLOCKS . "/{$id}", [] ); return array_pop( $blocks ); } /** * @param Brizy_Editor_Block $block * * @return bool * @throws Exception */ public function createOrUpdateBlock( $block ) { $cloudBlockData = array( 'container' => $this->brizyProject->getCloudContainer(), 'meta' => $block->getMeta(), 'media' => $block->getMedia(), 'data' => $block->get_editor_data(), 'uid' => $block->getUid(), 'dataVersion' => 1 ); $url = Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_SAVEDBLOCKS; $cloudUid = $block->getCloudId( $this->brizyProject->getCloudAccountId() ); $cloudBlock = null; if ( ! $cloudUid && ( $cloudBlock = $this->getBlockByUid( $block->getUid() ) ) ) { $cloudUid = $cloudBlock->uid; } if ( ! $cloudUid ) { $response = $this->http->post( $url, array( 'headers' => $this->getHeaders(), 'body' => $cloudBlockData ) ); } else { $cloudBlockData['dataVersion'] = $cloudBlock->dataVersion + 1; $response = $this->http->request( $url . "/" . $cloudBlock->id, array( 'method' => 'PUT', 'headers' => $this->getHeaders(), 'body' => $cloudBlockData ) ); } $code = wp_remote_retrieve_response_code( $response ); if ( $code >= 400 ) { // update cloud editor versions $this->getCloudEditorVersions( true ); Brizy_Logger::instance()->critical( 'Cloud api exception', [ $response ] ); throw new Exception( wp_remote_retrieve_response_message( $response ) ); } return json_decode( wp_remote_retrieve_body( $response ) ); } /** * @param $blockId * * @return bool * @throws Exception */ public function deleteBlock( $blockId ) { $query = http_build_query( [ 'container' => $this->brizyProject->getCloudContainer() ] ); $url = Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_SAVEDBLOCKS . "/" . $blockId . "?" . $query; $response = $this->http->request( $url, array( 'method' => 'DELETE', 'headers' => $this->getHeaders() ) ); $code = wp_remote_retrieve_response_code( $response ); if ( $code >= 400 ) { throw new Exception( 'Invalid code return by cloud api' ); } return $code == 200; } /** * @param $filters * * @return array|mixed|object|null */ public function getPopups( $filters = array() ) { return $this->getCloudEntity( Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_POPUPS, $filters ); } /** * @param $uid * * @return mixed */ public function getPopupByUid( $uid ) { $popups = $this->getPopups( [ 'uid' => $uid ] ); return array_pop( $popups ); } /** * @param Brizy_Editor_Popup $popup * * @return bool * @throws Exception */ public function createOrUpdatePopup( $popup ) { $cloudBlockData = array( 'container' => $this->brizyProject->getCloudContainer(), 'meta' => $popup->getMeta(), 'data' => $popup->get_editor_data(), 'is_autosave' => 0, 'uid' => $popup->getUid(), 'dataVersion' => 1 ); $url = Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_POPUPS; $cloudUid = $popup->getCloudId( $this->brizyProject->getCloudAccountId() ); if ( $cloudUid ) { $response = $this->http->request( $url, array( 'method' => 'PUT', 'headers' => $this->getHeaders(), 'body' => $cloudBlockData ) ); } else { $response = $this->http->post( $url . "/" . $cloudUid, array( 'headers' => $this->getHeaders(), 'body' => $cloudBlockData ) ); } $code = wp_remote_retrieve_response_code( $response ); if ( $code >= 400 ) { $this->getCloudEditorVersions( true ); Brizy_Logger::instance()->critical( 'Cloud api exception', [ $response ] ); throw new Exception( 'Invalid code return by cloud api' ); } return json_decode( wp_remote_retrieve_body( $response ) ); } /** * @param $popupId * * @return bool * @throws Exception */ public function deletePopup( $popupId ) { $query = http_build_query( [ 'container' => $this->brizyProject->getCloudContainer() ] ); $url = Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_POPUPS . "/" . $popupId . "?" . $query; $response = $this->http->request( $url, array( 'method' => 'DELETE', 'headers' => $this->getHeaders() ) ); $code = wp_remote_retrieve_response_code( $response ); if ( $code >= 400 ) { throw new Exception( 'Invalid code return by cloud api' ); } return $code == 200; } /** * @param $filters * * @return array|mixed|object|null */ public function getLayouts( $filters = array() ) { return $this->getCloudEntity( Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_LAYOUTS, $filters ); } /** * @param $uid * * @return mixed */ public function getLayoutByUid( $uid ) { $layouts = $this->getLayouts( [ 'uid' => $uid ] ); return array_pop( $layouts ); } /** * @param $id * * @return array|mixed|object|null */ public function getLayout( $id ) { return $this->getCloudEntityByContainer( Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_LAYOUTS . "/" . $id, [] ); } /** * @param Brizy_Editor_Layout $layout * * @return bool * @throws Exception */ public function createOrUpdateLayout( $layout ) { $cloudBlockData = array( 'container' => $this->brizyProject->getCloudContainer(), 'meta' => $layout->getMeta(), 'media' => $layout->getMedia(), 'data' => $layout->get_editor_data(), 'uid' => $layout->getUid(), 'dataVersion' => 1 ); $url = Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_LAYOUTS; $cloudUid = $layout->getCloudId( $this->brizyProject->getCloudAccountId() ); $cloudLayout = null; if ( ! $cloudUid && ( $cloudLayout = $this->getLayoutByUid( $layout->getUid() ) ) ) { $cloudUid = $cloudLayout->uid; } if ( ! $cloudUid ) { $response = $this->http->post( $url, array( 'headers' => $this->getHeaders(), 'body' => $cloudBlockData ) ); } else { $cloudBlockData['dataVersion'] = $cloudLayout->dataVersion + 1; $response = $this->http->request( $url . "/" . $cloudLayout->id, array( 'method' => 'PUT', 'headers' => $this->getHeaders(), 'body' => $cloudBlockData, ) ); } $code = wp_remote_retrieve_response_code( $response ); if ( $code >= 400 ) { $this->getCloudEditorVersions( true ); Brizy_Logger::instance()->critical( 'Cloud api exception', [ $response ] ); throw new Exception( 'Invalid code return by cloud api' ); } return json_decode( wp_remote_retrieve_body( $response ) ); } /** * @param $layoutId * * @return bool * @throws Exception */ public function deleteLayout( $layoutId ) { $query = http_build_query( [ 'container' => $this->brizyProject->getCloudContainer() ] ); $url = Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_LAYOUTS . "/" . $layoutId . "?" . $query; $response = $this->http->request( $url, array( 'method' => 'DELETE', 'headers' => $this->getHeaders() ) ); $code = wp_remote_retrieve_response_code( $response ); if ( $code >= 400 ) { throw new Exception( 'Invalid code return by cloud api' ); } return $code == 200; } /** * @param $uid * * @return bool * @throws Exception */ public function isMediaUploaded( $uid ) { $cloud_entity_by_container = $this->getCloudEntity( Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_MEDIA, [ 'name' => $uid ] ); return is_array( $cloud_entity_by_container ) && count( $cloud_entity_by_container ) > 0; } /** * @param $file * * @return bool * @throws Exception */ public function uploadMedia( $uid, $file ) { $response = $this->http->post( Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_MEDIA, array( 'headers' => $this->getHeaders(), 'body' => array( 'attachment' => base64_encode( file_get_contents( $file ) ), 'name' => $uid, 'filename' => basename( $file ) ) ) ); $code = wp_remote_retrieve_response_code( $response ); if ( $code >= 400 ) { throw new Exception( 'Invalid code return by cloud api' ); } return true; } /** * @param $font * * Ex: * [ * 'id' => 'askdalskdlaksd', * 'family' => 'proxima-nova', * 'type' => 'uploaded', * 'weights' => [ * '400' => [ * 'ttf' => codecept_data_dir( 'fonts/pn-regular-webfont.ttf' ), * 'eot' => codecept_data_dir( 'fonts/pn-regular-webfont.eot' ), * 'woff' => codecept_data_dir( 'fonts/pn-regular-webfont.woff' ), * 'woff2' => codecept_data_dir( 'fonts/pn-regular-webfont.woff2' ), * ], * '500' => [ * 'eot' => codecept_data_dir( 'fonts/pn-medium-webfont.eot' ), * 'woff' => codecept_data_dir( 'fonts/pn-medium-webfont.woff' ), * 'woff2' => codecept_data_dir( 'fonts/pn-medium-webfont.woff2' ), * ], * '700' => [ * 'eot' => codecept_data_dir( 'fonts/pn-bold-webfont.eot' ), * 'woff' => codecept_data_dir( 'fonts/pn-bold-webfont.woff' ), * 'woff2' => codecept_data_dir( 'fonts/pn-bold-webfont.woff2' ), * ], * ] * ]; * * @return bool * @throws Exception */ public function createFont( $font ) { $params = array( 'container' => $this->brizyProject->getCloudContainer(), 'uid' => $font['id'], 'family' => $font['family'], ); // prepare font data foreach ( $font['weights'] as $weigth => $files ) { foreach ( $files as $type => $file ) { $params["files[$weigth][$type]"] = new CURLFile( $file ); } } unset( $font['weights'] ); $file_upload_request = function ( $handle_or_parameters, $request = '', $url = '' ) use ( $params ) { $this->updateWPHTTPRequest( $handle_or_parameters, $params ); }; // handle cURL requests add_action( 'http_api_curl', $file_upload_request, 10 ); // handle fsockopen add_action( 'requests-fsockopen.before_send', $file_upload_request, 10, 3 ); $response = $this->http->post( Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_FONTS, array( 'headers' => $this->getHeaders( [ 'Content-Type' => 'multipart/form-data' ] ), 'body' => $params, 'timeout' => 40 ) ); remove_action( 'http_api_curl', $file_upload_request ); remove_action( 'requests-fsockopen.before_send', $file_upload_request ); $code = wp_remote_retrieve_response_code( $response ); if ( $code >= 400 ) { throw new Exception( 'Invalid code return by cloud api' ); } return json_decode( wp_remote_retrieve_body( $response ) ); } public function getFont( $uid ) { $response = $this->getCloudEntity( Brizy_Config::CLOUD_ENDPOINT . Brizy_Config::CLOUD_FONTS . "/{$uid}" ); if ( is_array( $response ) ) { return $response; } return null; } /** * @param $endpoint * @param $filters * * @return array|mixed|object|null */ private function getCloudEntity( $endpoint, $filters = array() ) { $http_build_query = http_build_query( $filters ); if ( $http_build_query ) { $http_build_query = '?' . $http_build_query; } $url = $endpoint . $http_build_query; $response = $this->http->get( $url, array( 'headers' => $this->getHeaders() ) ); $code = wp_remote_retrieve_response_code( $response ); if ( $code == 200 ) { return (array) json_decode( $response['body'] ); } return null; } /** * @param $endpoint * @param $filters * * @return array|mixed|object|null */ private function getCloudEntityByContainer( $endpoint, $filters = array() ) { $filters = array_merge( $filters, [ 'container' => $this->brizyProject->getCloudContainer() ] ); return $this->getCloudEntity( $endpoint, $filters ); } private function updateWPHTTPRequest( &$handle_or_parameters, $form_body_arguments ) { if ( function_exists( 'curl_init' ) && function_exists( 'curl_exec' ) ) { curl_setopt( $handle_or_parameters, CURLOPT_POSTFIELDS, $form_body_arguments ); } elseif ( function_exists( 'fsockopen' ) ) { $form_fields = []; $form_files = []; foreach ( $form_body_arguments as $name => $value ) { if ( file_exists( $value ) ) { // Not great for large files since it dumps into memory but works well for small files $form_files[ $name ] = file_get_contents( $value ); } else { $form_fields[ $name ] = $value; } } function build_data_files( $boundary, $fields, $files ) { $data = ''; $eol = "\r\n"; $delimiter = '-------------' . $boundary; foreach ( $fields as $name => $content ) { $data .= "--" . $delimiter . $eol . 'Content-Disposition: form-data; name="' . $name . "\"" . $eol . $eol . $content . $eol; } foreach ( $files as $name => $content ) { $data .= "--" . $delimiter . $eol . 'Content-Disposition: form-data; name="' . $name . '"; filename="' . $name . '"' . $eol //. 'Content-Type: image/png'.$eol . 'Content-Transfer-Encoding: binary' . $eol; $data .= $eol; $data .= $content . $eol; } $data .= "--" . $delimiter . "--" . $eol; return $data; } $boundary = uniqid( "", true ); $handle_or_parameters = build_data_files( $boundary, $form_fields, $form_files ); } } }