PluginProbe ʕ •ᴥ•ʔ
OttoKit: All-in-One Automation Platform / 1.0.20
OttoKit: All-in-One Automation Platform v1.0.20
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 EventHelperController.php 3 years ago GlobalSearchController.php 2 years ago IntegrationsController.php 3 years ago OptionController.php 3 years ago RestController.php 3 years ago RoutesController.php 3 years ago SettingsController.php 3 years ago
RestController.php
345 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 $response = wp_remote_post(
259 WEBHOOK_SERVER_URL . '/wordpress/webhook',
260 [
261 'sslverify' => false,
262 'headers' => [
263 'Authorization' => 'Bearer ' . $this->secret_key,
264 'Referer' => str_replace( '/wp-json/', '', get_rest_url() ),
265 ],
266 'body' => json_decode( wp_json_encode( $trigger_data ), 1 ),
267 ]
268 );
269 if ( wp_remote_retrieve_response_code( $response ) === 200 ) {
270 return true;
271 }
272
273 return false;
274 }
275
276 /**
277 * Update the connection from SAAS.
278 *
279 * @param WP_REST_Request $request Request data.
280 *
281 * @return void
282 */
283 public function connection_update( $request ) {
284 $secret = $request->get_param( 'secret_key' );
285 if ( $secret ) {
286 OptionController::set_option( 'secret_key', $request->get_param( 'secret_key' ) );
287 }
288 }
289
290 /**
291 * Disconnect connection
292 *
293 * @param WP_REST_Request $request Request data.
294 * @return WP_REST_Response
295 */
296 public function connection_disconnect( $request ) {
297 OptionController::set_option( 'secret_key', null );
298
299 return self::success_message();
300 }
301
302 /**
303 * Test Trigger
304 * When test trigger is initiated on Sass then execute this endpoint to create a transient for identifying trigger event.
305 *
306 * @param WP_REST_Request $request Request data.
307 * @return WP_REST_Response
308 */
309 public function test_triggers( $request ) {
310 $test_triggers = (array) OptionController::get_option( 'test_triggers', [] );
311 $event = [
312 'trigger' => $request->get_param( 'trigger' ),
313 'integration' => $request->get_param( 'integration' ),
314 ];
315
316 // if request is to delete the transient, delete it and return.
317 if ( $request->get_param( 'clear_transient_data' ) === 'yes' ) {
318 $test_triggers = array_filter(
319 $test_triggers,
320 function ( $v ) use ( $event ) {
321 return $v !== $event;
322 }
323 );
324 OptionController::set_option( 'test_triggers', $test_triggers );
325
326 return;
327 }
328
329 $test_triggers[] = $event;
330 $test_triggers = array_unique( $test_triggers, SORT_REGULAR );
331 $tmp_test_triggers = [];
332
333 foreach ( $test_triggers as $test_trigger ) {
334 if ( ! empty( $test_trigger['trigger'] ) ) {
335 $tmp_test_triggers[] = $test_trigger;
336 }
337 }
338
339 OptionController::set_option( 'test_triggers', $tmp_test_triggers );
340 }
341
342 }
343
344 RestController::get_instance();
345