Completed
Push — update/composerlock ( 17b28e )
by Jeremy
218:32 queued 209:16
created

class.frame-nonce-preview.php (1 issue)

Severity

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
/**
4
 * Allows viewing posts on the frontend when the user is not logged in.
5
 */
6
class Jetpack_Frame_Nonce_Preview {
7
	static $instance = null;
8
9
	/**
10
	 * Returns the single instance of the Jetpack_Frame_Nonce_Preview object
11
	 *
12
	 * @since 4.3.0
13
	 *
14
	 * @return Jetpack_Frame_Nonce_Preview
15
	 **/
16
	public static function get_instance() {
17
		if ( ! is_null( self::$instance ) ) {
18
			return self::$instance;
19
		}
20
21
		return self::$instance = new Jetpack_Frame_Nonce_Preview();
22
	}
23
24
	function __construct() {
25
		if ( isset( $_GET['frame-nonce'] ) && ! is_admin() ) {
26
			add_filter( 'pre_get_posts', array( $this, 'maybe_display_post' ) );
27
		}
28
29
		// autosave previews are validated differently
30
		if ( isset( $_GET['frame-nonce'] ) && isset( $_GET['preview_id'] ) && isset( $_GET['preview_nonce'] ) ) {
31
			remove_action( 'init', '_show_post_preview' );
32
			add_action( 'init', array( $this, 'handle_autosave_nonce_validation' ) );
33
		}
34
	}
35
36
	/**
37
	 * Verify that frame nonce exists, and if so, validate the nonce by calling WP.com.
38
	 *
39
	 * @since 4.3.0
40
	 *
41
	 * @return bool
42
	 */
43
	public function is_frame_nonce_valid() {
44
		if ( empty( $_GET['frame-nonce'] ) ) {
45
			return false;
46
		}
47
48
		$xml = new Jetpack_IXR_Client();
49
		$xml->query( 'jetpack.verifyFrameNonce', sanitize_key( $_GET['frame-nonce'] ) );
50
51
		if ( $xml->isError() ) {
52
			return false;
53
		}
54
55
		return (bool) $xml->getResponse();
56
	}
57
58
	/**
59
	 * Conditionally add a hook on posts_results if this is the main query, a preview, and singular.
60
	 *
61
	 * @since 4.3.0
62
	 *
63
	 * @param WP_Query $query
64
	 *
65
	 * @return WP_Query
66
	 */
67
	public function maybe_display_post( $query ) {
68
		if (
69
			$query->is_main_query() &&
70
			$query->is_preview() &&
71
			$query->is_singular()
72
		) {
73
			add_filter( 'posts_results', array( $this, 'set_post_to_publish' ), 10, 2 );
74
		}
75
76
		return $query;
77
	}
78
79
	/**
80
	 * Conditionally set the first post to 'publish' if the frame nonce is valid and there is a post.
81
	 *
82
	 * @since 4.3.0
83
	 *
84
	 * @param array $posts
85
	 *
86
	 * @return array
87
	 */
88
	public function set_post_to_publish( $posts ) {
89
		remove_filter( 'posts_results', array( $this, 'set_post_to_publish' ), 10, 2 );
0 ignored issues
show
The call to remove_filter() has too many arguments starting with 2.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
90
91
		if ( empty( $posts ) || is_user_logged_in() || ! $this->is_frame_nonce_valid() ) {
92
			return $posts;
93
		}
94
95
		$posts[0]->post_status = 'publish';
96
97
		// Disable comments and pings for this post.
98
		add_filter( 'comments_open', '__return_false' );
99
		add_filter( 'pings_open', '__return_false' );
100
101
		return $posts;
102
	}
103
104
	/**
105
	 * Handle validation for autosave preview request
106
	 *
107
	 * @since 4.7.0
108
	 */
109
	public function handle_autosave_nonce_validation() {
110
		if ( ! $this->is_frame_nonce_valid() ) {
111
			wp_die( __( 'Sorry, you are not allowed to preview drafts.', 'jetpack' ) );
112
		}
113
		add_filter( 'the_preview', '_set_preview' );
114
	}
115
}
116
117
Jetpack_Frame_Nonce_Preview::get_instance();
118