PluginProbe ʕ •ᴥ•ʔ
OttoKit: All-in-One Automation Platform / 1.0.49
OttoKit: All-in-One Automation Platform v1.0.49
1.1.31 1.1.30 1.1.29 1.1.28 1.1.27 1.1.9 trunk 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.20 1.0.21 1.0.22 1.0.23 1.0.24 1.0.25 1.0.26 1.0.27 1.0.28 1.0.29 1.0.30 1.0.31 1.0.32 1.0.33 1.0.34 1.0.35 1.0.36 1.0.37 1.0.38 1.0.39 1.0.40 1.0.41 1.0.42 1.0.43 1.0.44 1.0.45 1.0.46 1.0.47 1.0.48 1.0.49 1.0.50 1.0.51 1.0.52 1.0.53 1.0.54 1.0.55 1.0.56 1.0.57 1.0.58 1.0.59 1.0.60 1.0.61 1.0.62 1.0.63 1.0.64 1.0.65 1.0.66 1.0.67 1.0.68 1.0.69 1.0.7 1.0.70 1.0.71 1.0.72 1.0.73 1.0.74 1.0.75 1.0.76 1.0.77 1.0.78 1.0.79 1.0.8 1.0.80 1.0.81 1.0.82 1.0.83 1.0.84 1.0.85 1.0.86 1.0.87 1.0.88 1.0.89 1.0.9 1.0.90 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.20 1.1.21 1.1.22 1.1.23 1.1.24 1.1.25 1.1.26 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8
suretriggers / src / Controllers / RestController.php
suretriggers / src / Controllers Last commit date
AuthController.php 2 years ago AutomationController.php 3 years ago EventController.php 3 years ago GlobalSearchController.php 2 years ago IntegrationsController.php 2 years ago OptionController.php 3 years ago RestController.php 2 years ago RoutesController.php 3 years ago SettingsController.php 3 years ago
RestController.php
350 lines
1 <?php
2 /**
3 * RestController.
4 * php version 5.6
5 *
6 * @category RestController
7 * @package SureTriggers
8 * @author BSF <username@example.com>
9 * @license https://www.gnu.org/licenses/gpl-3.0.html GPLv3
10 * @link https://www.brainstormforce.com/
11 * @since 1.0.0
12 */
13
14 namespace SureTriggers\Controllers;
15
16 use Exception;
17 use SureTriggers\Integrations\WordPress\WordPress;
18 use SureTriggers\Traits\SingletonLoader;
19 use WP_REST_Request;
20 use WP_REST_Response;
21
22 /**
23 * RestController
24 *
25 * @category RestController
26 * @package SureTriggers
27 * @author BSF <username@example.com>
28 * @license https://www.gnu.org/licenses/gpl-3.0.html GPLv3
29 * @link https://www.brainstormforce.com/
30 * @since 1.0.0
31 */
32 class RestController {
33
34 /**
35 * Access token for authentication.
36 *
37 * @var string $acccess_token
38 */
39 private $secret_key;
40
41 use SingletonLoader;
42
43 /**
44 * Initialise data.
45 */
46 public function __construct() {
47 $this->secret_key = OptionController::get_option( 'secret_key' );
48 add_filter( 'determine_current_user', [ $this, 'basic_auth_handler' ], 20 );
49 }
50
51 /**
52 * Permission callback for rest api after deterination of current user.
53 *
54 * @param WP_REST_Request $request Request.
55 */
56 public function autheticate_user( $request ) {
57 $secret_key = $request->get_header( 'st_authorization' );
58 list($secret_key) = sscanf( $secret_key, 'Bearer %s' );
59
60 if ( $this->secret_key !== $secret_key ) {
61 return false;
62 }
63
64 return true;
65 }
66
67 /**
68 * Authenticate User for API calls.
69 *
70 * @param array|object $user USer.
71 *
72 * @return int|null
73 */
74 public function basic_auth_handler( $user ) {
75 // Don't authenticate twice.
76 if ( ! empty( $user ) ) {
77 return $user;
78 }
79
80 // Check that we're trying to authenticate.
81 if ( ! isset( $_SERVER['PHP_AUTH_USER'] ) || ! isset( $_SERVER['PHP_AUTH_PW'] ) ) { //phpcs:ignore
82 return $user;
83 }
84
85 $username = sanitize_text_field( wp_unslash( $_SERVER['PHP_AUTH_USER'] ) ); //phpcs:ignore
86 $password = sanitize_text_field( wp_unslash( $_SERVER['PHP_AUTH_PW'] ) ); //phpcs:ignore
87
88 /**
89 * In multi-site, wp_authenticate_spam_check filter is run on authentication. This filter calls.
90 * get_currentuserinfo which in turn calls the determine_current_user filter. This leads to infinite.
91 * recursion and a stack overflow unless the current function is removed from the determine_current_user.
92 * filter during authentication.
93 */
94 remove_filter( 'determine_current_user', [ $this, 'basic_auth_handler' ], 20 );
95
96 $user = wp_authenticate( $username, $password );
97
98 add_filter( 'determine_current_user', [ $this, 'basic_auth_handler' ], 20 );
99
100 if ( is_wp_error( $user ) ) {
101 return null;
102 }
103
104 return $user->ID;
105 }
106
107 /**
108 * Authenticate user for new connection create api.
109 *
110 * @return bool
111 */
112 public function is_current_user() {
113 if ( current_user_can( 'manage_options' ) ) {
114 return true;
115 }
116 return false;
117 }
118
119 /**
120 * Execute action events.
121 *
122 * @param WP_REST_Request $request Request data.
123 * @return WP_REST_Response
124 */
125 public function run_action( $request ) {
126 $request->get_param( 'wp_user_id' );
127
128 $user_id = $request->get_param( 'wp_user_id' );
129 $automation_id = $request->get_param( 'automation_id' );
130 $integration = $request->get_param( 'integration' );
131 $action_type = $request->get_param( 'type_event' );
132 $selected_options = $request->get_param( 'selected_options' );
133 $context = $request->get_param( 'context' );
134 $fields = $request->get_param( 'fields' );
135
136 if ( empty( $user_id ) ) {
137 $user_id = isset( $context['pluggable_data']['wp_user_id'] ) ? sanitize_text_field( $context['pluggable_data']['wp_user_id'] ) : '';
138 }
139
140 if ( empty( $integration ) || empty( $action_type ) ) {
141 return self::error_message( 'Integration or action type is missing' );
142 }
143
144 if ( isset( $selected_options['wp_user_email'] ) ) {
145 $is_valid = WordPress::validate_email( $selected_options['wp_user_email'] );
146
147 if ( ! $is_valid->valid ) {
148 if ( $is_valid->multiple ) {
149 return self::error_message( 'One or more email address is not valid.' );
150 } else {
151 return self::error_message( 'Email address is not valid.' );
152 }
153 }
154
155 if ( str_contains( $selected_options['wp_user_email'], ',' ) ) {
156 $email_list = explode( ',', $selected_options['wp_user_email'] );
157
158 foreach ( $email_list as $single_email ) {
159 if ( ! email_exists( trim( $single_email ) ) ) {
160 return self::error_message( 'User with email ' . $single_email . ' does not exists.' );
161 }
162 }
163 } else {
164 if ( ! email_exists( $selected_options['wp_user_email'] ) ) {
165 return self::error_message( 'User with email ' . $selected_options['wp_user_email'] . ' does not exists.' );
166 }
167 }
168 }
169 $registered_actions = EventController::get_instance()->actions;
170 $action_event = $registered_actions[ $integration ][ $action_type ];
171
172 $fun_params = [
173 $user_id,
174 $automation_id,
175 $fields,
176 $selected_options,
177 $context,
178 ];
179
180 try {
181 $result = call_user_func_array(
182 $action_event['function'],
183 $fun_params
184 );
185 return self::success_message( $result );
186 } catch ( Exception $e ) {
187 return self::error_message( $e->getMessage(), 400 );
188 }
189 }
190
191 /**
192 * Error message format.
193 *
194 * @param string $message Error message.
195 * @param string $status Error message.
196 *
197 * @return object
198 */
199 public static function error_message( $message, $status = 401 ) {
200 return new WP_REST_Response(
201 [
202 'success' => false,
203 'data' => [
204 'errors' => $message,
205 ],
206 ],
207 $status
208 );
209 }
210
211 /**
212 * Success message format.
213 *
214 * @param array $data response data to be sent.
215 *
216 * @return object
217 */
218 public static function success_message( $data = [] ) {
219 $result = [];
220
221 if ( ! empty( $data ) ) {
222 $result['result'] = $data;
223 }
224
225 return new WP_REST_Response(
226 [
227 'success' => true,
228 'data' => $result,
229 ],
230 200
231 );
232
233 }
234
235 /**
236 * Add/Remove/Update the triggers..
237 * When new/update/remove automation on Sass then execute this endpoint to update the automation.
238 *
239 * @param WP_REST_Request $request Request data.
240 * @return WP_REST_Response
241 */
242 public function manage_triggers( $request ) {
243 $events = $request->get_param( 'events' ) ? json_decode( stripslashes( $request->get_param( 'events' ) ), true ) : [];
244
245 OptionController::set_option( 'triggers', $events );
246 $events = array_column( $events, 'trigger' );
247 return self::success_message( [ 'events' => $events ] );
248 }
249
250 /**
251 * Send response to Sasss that trigger is executed.
252 *
253 * @param string $trigger_data Trigger data.
254 *
255 * @return bool
256 */
257 public function trigger_listener( $trigger_data ) {
258 $args = [
259 'headers' => [
260 'Authorization' => 'Bearer ' . $this->secret_key,
261 'Referer' => str_replace( '/wp-json/', '', get_rest_url() ),
262 ],
263 'body' => json_decode( wp_json_encode( $trigger_data ), 1 ),
264 'sslverify' => false,
265 ];
266
267 /**
268 *
269 * Ignore line
270 *
271 * @phpstan-ignore-next-line
272 */
273 $response = wp_remote_post( WEBHOOK_SERVER_URL . '/wordpress/webhook', $args );
274 if ( wp_remote_retrieve_response_code( $response ) === 200 ) {
275 return true;
276 }
277
278 return false;
279 }
280
281 /**
282 * Update the connection from SAAS.
283 *
284 * @param WP_REST_Request $request Request data.
285 *
286 * @return void
287 */
288 public function connection_update( $request ) {
289 $secret = $request->get_param( 'secret_key' );
290 if ( $secret ) {
291 OptionController::set_option( 'secret_key', $request->get_param( 'secret_key' ) );
292 }
293 }
294
295 /**
296 * Disconnect connection
297 *
298 * @param WP_REST_Request $request Request data.
299 * @return WP_REST_Response
300 */
301 public function connection_disconnect( $request ) {
302 OptionController::set_option( 'secret_key', null );
303
304 return self::success_message();
305 }
306
307 /**
308 * Test Trigger
309 * When test trigger is initiated on Sass then execute this endpoint to create a transient for identifying trigger event.
310 *
311 * @param WP_REST_Request $request Request data.
312 * @return WP_REST_Response
313 */
314 public function test_triggers( $request ) {
315 $test_triggers = (array) OptionController::get_option( 'test_triggers', [] );
316 $event = [
317 'trigger' => $request->get_param( 'trigger' ),
318 'integration' => $request->get_param( 'integration' ),
319 ];
320
321 // if request is to delete the transient, delete it and return.
322 if ( $request->get_param( 'clear_transient_data' ) === 'yes' ) {
323 $test_triggers = array_filter(
324 $test_triggers,
325 function ( $v ) use ( $event ) {
326 return $v !== $event;
327 }
328 );
329 OptionController::set_option( 'test_triggers', $test_triggers );
330
331 return;
332 }
333
334 $test_triggers[] = $event;
335 $test_triggers = array_unique( $test_triggers, SORT_REGULAR );
336 $tmp_test_triggers = [];
337
338 foreach ( $test_triggers as $test_trigger ) {
339 if ( ! empty( $test_trigger['trigger'] ) ) {
340 $tmp_test_triggers[] = $test_trigger;
341 }
342 }
343
344 OptionController::set_option( 'test_triggers', $tmp_test_triggers );
345 }
346
347 }
348
349 RestController::get_instance();
350