Passed
Push — master ( f05c43...e0ac9d )
by Paul
04:29
created

Router::checkAjaxRequest()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 4.679

Importance

Changes 0
Metric Value
cc 3
nc 4
nop 1
dl 0
loc 9
ccs 3
cts 7
cp 0.4286
crap 4.679
rs 9.9666
c 0
b 0
f 0
1
<?php
2
3
namespace GeminiLabs\SiteReviews;
4
5
use GeminiLabs\SiteReviews\Application;
6
use GeminiLabs\SiteReviews\Controllers\AdminController;
7
use GeminiLabs\SiteReviews\Controllers\AjaxController;
8
use GeminiLabs\SiteReviews\Controllers\PublicController;
9
use GeminiLabs\SiteReviews\Helper;
10
11
class Router
12
{
13
	/**
14
	 * @return void
15
	 */
16 1
	public function routeAdminPostRequest()
17
	{
18 1
		$request = $this->getRequest();
19 1
		if( !$this->isValidPostRequest( $request ))return;
20
		check_admin_referer( $request['action'] );
21
		$this->routeRequest( 'admin', $request['action'], $request );
22
	}
23
24
	/**
25
	 * All ajax requests in the plugin are triggered by a single action hook (i.e. "glsr_action")
26
	 * Each route is determined by the request["action"]
27
	 * @return void
28
	 */
29 1
	public function routeAjaxRequest()
30
	{
31 1
		$request = $this->getRequest();
32 1
		$this->checkAjaxRequest( $request );
33 1
		$this->checkAjaxNonce( $request );
34 1
		$this->routeRequest( 'ajax', $request['action'], $request );
35
		wp_die();
36
	}
37
38
	/**
39
	 * @return void
40
	 */
41
	public function routePublicPostRequest()
42
	{
43
		if( is_admin() )return;
44
		$request = $this->getRequest();
45
		if( !$this->isValidPostRequest( $request ))return;
46
		if( !$this->isValidPublicNonce( $request ))return;
47
		$this->routeRequest( 'public', $request['action'], $request );
48
	}
49
50
	/**
51
	 * @return void
52
	 */
53 1
	protected function checkAjaxNonce( array $request )
54
	{
55 1
		if( !is_user_logged_in() )return;
56
		if( !isset( $request['nonce'] )) {
57
			glsr_log()->error( 'The AJAX request must include a nonce' )->info( $request );
58
			wp_die();
59
		}
60
		if( !wp_verify_nonce( $request['nonce'], $request['action'] )) {
61
			glsr_log()->error( 'Nonce check failed for ajax request' )->info( $request );
62
			wp_die( -1, 403 );
63
		}
64
	}
65
66
	/**
67
	 * @return void
68
	 */
69 1
	protected function checkAjaxRequest( array $request )
70
	{
71 1
		if( !isset( $request['action'] )) {
72
			glsr_log()->error( 'The AJAX request must include an action' )->info( $request );
73
			wp_die();
74
		}
75 1
		if( empty( $request['ajax_request'] )) {
76
			glsr_log()->error( 'The AJAX request look invalid' )->info( $request );
77
			wp_die();
78
		}
79 1
	}
80
81
	/**
82
	 * @return array
83
	 */
84 1
	protected function getRequest()
85
	{
86 1
		$request = glsr( Helper::class )->filterInput( 'action' ) == Application::PREFIX.'action'
87 1
			? glsr( Helper::class )->filterInputArray( 'request' )
88 1
			: glsr( Helper::class )->filterInputArray( Application::ID );
89 1
		return $this->normalizeRequest( $request );
90
	}
91
92
	/**
93
	 * @return bool
94
	 */
95 1
	protected function isValidPostRequest( array $request = [] )
96
	{
97 1
		return !empty( $request['action'] ) && empty( $request['ajax_request'] );
98
	}
99
100
	/**
101
	 * @return bool
102
	 */
103
	protected function isValidPublicNonce( array $request )
104
	{
105
		if( is_user_logged_in() && !wp_verify_nonce( $request['nonce'], $request['action'] )) {
106
			glsr_log()->error( 'Nonce check failed for public request' )->info( $request );
107
			return false;
108
		}
109
		return true;
110
	}
111
112
	/**
113
	 * @return array
114
	 */
115 1
	protected function normalizeRequest( array $request )
116
	{
117 1
		if( glsr( Helper::class )->filterInput( 'action' ) == Application::PREFIX.'action' ) {
118 1
			$request['ajax_request'] = true;
119
		}
120 1
		if( glsr( Helper::class )->filterInput( 'action', $request ) == 'submit-review' ) {
121 1
			$request['recaptcha-token'] = glsr( Helper::class )->filterInput( 'g-recaptcha-response' );
122
		}
123 1
		return $request;
124
	}
125
126
	/**
127
	 * @param string $type
128
	 * @param string $action
129
	 * @return void
130
	 */
131 1
	protected function routeRequest( $type, $action, array $request = [] )
132
	{
133 1
		$actionHook = 'site-reviews/route/'.$type.'/request';
134 1
		$controller = glsr( glsr( Helper::class )->buildClassName( $type.'-controller', 'Controllers' ));
135 1
		$method = glsr( Helper::class )->buildMethodName( $action, 'router' );
136 1
		$request = apply_filters( 'site-reviews/route/request', $request, $action, $type );
137 1
		do_action( $actionHook, $action, $request );
138 1
		if( is_callable( [$controller, $method] )) {
139 1
			call_user_func( [$controller, $method], $request );
140
			return;
141
		}
142
		if( did_action( $actionHook ) === 0 ) {
143
			glsr_log( 'Unknown '.$type.' router request: '.$action );
144
		}
145
	}
146
}
147