Viewing File: /home/rtsgrob/ww3/wp-content/plugins/integromat-connector/class/class-rest-request.php

<?php

namespace Integromat;

class Rest_Request {

	public static function dispatch() {
		preg_match( '#\/wp-json/(.*)\??.*#i', $_SERVER['REQUEST_URI'], $route_match );
		if ( ! isset( $route_match[1] ) ) {
			return;
		}
		$f          = explode( '?', $route_match[1] );
		$rest_route = '/' . $f[0];

		// Authentication isn’t performed when making internal requests.
		$request = new \WP_REST_Request( $_SERVER['REQUEST_METHOD'], $rest_route );
		$request->set_query_params( $_GET );

		if ( 'POST' === $_SERVER['REQUEST_METHOD'] ) {
			$body = json_decode( file_get_contents( 'php://input' ), true );
			$request->set_body_params( $body );

			if ( ! empty( $_FILES['file'] ) ) {
				self::upload_media();
			}
		}

		$response      = rest_do_request( $request );
		$server        = rest_get_server();
		$response_data = $server->response_to_data( $response, false );

		// Save custom meta.
		if ( 'POST' === $_SERVER['REQUEST_METHOD'] ) {
			if ( ! empty( $body['meta'] ) ) {
				$content_type = self::get_content_type( $rest_route );
				self::update_meta( $response_data['id'], $content_type, $body['meta'] );
			}
		}
		self::send_response( $response, $response_data );
	}


	/**
	 * @param /WP_REST_Response $response
	 * @param array            $response_data
	 */
	private static function send_response( $response, $response_data ) {
		$response_json = wp_json_encode( $response_data );
		if ( ! empty( $response->headers ) ) {
			foreach ( $response->headers as $key => $val ) {
				header( "$key: $val" );
			}
		}
		header( 'Content-type: application/json' );
		if ( is_object( $response_data ) && is_object( $response_data->data ) && (int) $response_data->data->status > 0 ) {
			http_response_code( $response_data->data->status );
		}
		die( $response_json );
	}


	private static function upload_media() {
		$udir              = wp_upload_dir();
		$media_file_source = $udir['path'] . '/' . sanitize_file_name( $_FILES['file']['name'] );

		if ( (int) $_FILES['file']['size'] === 0 ) {
			Rest_Response::render_error( 500, 'The uploaded file exceeds the upload_max_filesize directive in php.ini.', 'rest_upload_unknown_error' );
		}

		if ( (int) $_FILES['file']['error'] > 0 ) {
			Rest_Response::render_error( 500, 'An error has occured when uploading file to the server.', 'rest_upload_unknown_error' );
		}

		copy( realpath( $_FILES['file']['tmp_name'] ), $media_file_source );

		$title       = isset( $_REQUEST['title'] ) ? sanitize_title( $_REQUEST['title'] ) : '';
		$description = isset( $_REQUEST['description'] ) ? sanitize_text_field( $_REQUEST['description'] ) : '';
		$caption     = isset( $_REQUEST['caption'] ) ? sanitize_text_field( $_REQUEST['caption'] ) : '';
		$alt_text    = isset( $_REQUEST['alt_text'] ) ? sanitize_text_field( $_REQUEST['alt_text'] ) : '';
		$post_id     = isset( $_REQUEST['post'] ) ? (int) $_REQUEST['post'] : '';

		$upload_dir = wp_upload_dir();
		$filename   = basename( $media_file_source );
		if ( wp_mkdir_p( $upload_dir['path'] ) ) {
			$file = $upload_dir['path'] . '/' . $filename;
		} else {
			$file = $upload_dir['basedir'] . '/' . $filename;
		}

		$wp_file_type  = wp_check_filetype( $filename, null );
		$allowed_types = get_allowed_mime_types();

		if ( ! in_array( $wp_file_type['type'], $allowed_types ) ) {
			Rest_Response::render_error( 500, 'Sorry, this file type is not permitted for security reasons.', 'rest_upload_unknown_error' );
		}

		$attachment    = array(
			'post_mime_type' => $wp_file_type['type'],
			'post_title'     => ( ! empty( $title ) ? $title : sanitize_file_name( $filename ) ),
			'post_content'   => ( ! empty( $description ) ? $description : '' ),
			'post_excerpt'   => ( ! empty( $caption ) ? $caption : '' ),
			'post_status'    => 'inherit',
		);
		$attachment_id = wp_insert_attachment( $attachment, $file );
		if ( ! empty( $alt_text ) ) {
			update_post_meta( $attachment_id, '_wp_attachment_image_alt', $alt_text );
		}

		require_once ABSPATH . 'wp-admin/includes/media.php';
		require_once ABSPATH . 'wp-admin/includes/image.php';
		$attachment_data = wp_generate_attachment_metadata( $attachment_id, $file );
		wp_update_attachment_metadata( $attachment_id, $attachment_data );

		// Relate to a post.
		if ( ! empty( $post_id ) && (int) $post_id > 0 ) {
			set_post_thumbnail( $post_id, $attachment_id );
		}

		$meta = wp_get_attachment_metadata( $attachment_id );
		$post = get_post( $attachment_id );
		if ( is_array( $meta ) ) {
			$response_data = array_merge( $meta, (array) $post );
		} else {
			$response_data = (array) $post;
		}

		self::send_response( (object) array(), wp_json_encode( $response_data ) );
	}


	private static function update_meta( $content_id, $content_type, $meta_fields ) {
		foreach ( $meta_fields as $meta_key => $meta_value ) {
			switch ( $content_type ) {
				case 'media':
				case 'pages':
					return;
					break;
				case 'comments':
					$function_update = 'update_comment_meta';
					$function_delete = 'delete_comment_meta';
					break;
				case 'tags':
				case 'categories':
					$function_update = 'update_term_meta';
					$function_delete = 'delete_term_meta';
					break;
				case 'users':
					$function_update = 'update_user_meta';
					$function_delete = 'delete_user_meta';
					break;
				default:
					$function_update = 'update_post_meta';
					$function_delete = 'delete_post_meta';
					break;
			}

			switch ( $meta_value ) {
				case 'IMT.REMOVE':
					$function_delete( $content_id, $meta_key );
					break;
				default:
					$function_update( $content_id, $meta_key, $meta_value );
					break;
			}
		}
	}


	/**
	 * @param string $rest_route
	 * @return string
	 * @throws \Exception
	 */
	private static function get_content_type( $rest_route ) {
		preg_match( '#v2/(.*)(/|$)#iU', $rest_route, $r );
		if ( isset( $r[1] ) ) {
			return $r[1];
		} else {
			throw new \Exception( 'Can not extract post type from the endpoint url.' );
		}
	}

}
Back to Directory File Manager