PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.26.1
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.26.1
6.35 6.34 6.33.1 6.33 6.32.1 6.32 6.31 6.25 6.25.1 6.26 6.26.1 6.27 6.28 6.29 6.3 6.3.1 6.3.2 6.30 6.4 6.4.1 6.4.2 6.5 6.5.1 6.5.2 6.5.3 All 141 releases
formidable / classes / models / FrmUsage.php

FrmUsage.php in Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More 6.26.1, at classes/models/FrmUsage.php

509 lines 11.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) {
3 die( 'You are not allowed to call this page directly.' );
4 }
5
6 /**
7 * @since 3.06.04
8 */
9 class FrmUsage {
10
11 /**
12 * @since 3.06.04
13 *
14 * @return void
15 */
16 public function send_snapshot() {
17 if ( ! $this->tracking_allowed() ) {
18 return;
19 }
20
21 $ep = 'aHR0cHM6Ly91c2FnZTIuZm9ybWlkYWJsZWZvcm1zLmNvbS9zbmFwc2hvdA==';
22 // $ep = base64_encode( 'http://localhost:4567/snapshot' ); // Uncomment for testing
23 $body = json_encode( $this->snapshot() );
24
25 // Setup variable for wp_remote_request.
26 $post = array(
27 'method' => 'POST',
28 'headers' => array(
29 'Accept' => 'application/json',
30 'Content-Type' => 'application/json',
31 'Content-Length' => strlen( $body ),
32 ),
33 'body' => $body,
34 // Without this, Debug Log catches the `http_request_failed` error.
35 'timeout' => 45,
36 );
37
38 // Remove time limit to execute this function.
39 if ( function_exists( 'set_time_limit' ) ) {
40 set_time_limit( 0 );
41 }
42
43 wp_remote_request( base64_decode( $ep ), $post );
44 }
45
46 /**
47 * @since 3.06.04
48 *
49 * @param bool $regenerate
50 *
51 * @return string
52 */
53 public function uuid( $regenerate = false ) {
54 $uuid_key = 'frm-usage-uuid';
55 $uuid = get_option( $uuid_key );
56
57 if ( $regenerate || empty( $uuid ) ) {
58 // Definitely not cryptographically secure but
59 // close enough to provide an unique id
60 $uuid = md5( uniqid() . site_url() );
61 update_option( $uuid_key, $uuid, 'no' );
62 }
63
64 return $uuid;
65 }
66
67 /**
68 * @since 3.06.04
69 *
70 * @return array
71 */
72 public function snapshot() {
73 global $wpdb, $wp_version;
74
75 $theme_data = wp_get_theme();
76 $form_counts = FrmForm::get_count();
77
78 $snap = array(
79 'uuid' => $this->uuid(),
80 // Let's keep it anonymous.
81 'admin_email' => '',
82 'wp_version' => $wp_version,
83 'php_version' => phpversion(),
84 'mysql_version' => $wpdb->db_version(),
85 'os' => FrmAppHelper::get_server_os(),
86 'locale' => get_locale(),
87
88 'active_license' => FrmAppHelper::pro_is_installed(),
89 'form_count' => $form_counts->published,
90 'entry_count' => FrmEntry::getRecordCount(),
91 'timestamp' => gmdate( 'c' ),
92
93 'theme_name' => is_object( $theme_data ) ? $theme_data->Name : '', // phpcs:ignore WordPress.NamingConventions
94 'plugins' => $this->plugins(),
95 'settings' => array(
96 $this->settings(),
97 ),
98 'forms' => $this->forms(),
99 'fields' => $this->fields(),
100 'actions' => $this->actions(),
101
102 'onboarding-wizard' => $this->onboarding_wizard(),
103 'welcome-tour' => FrmWelcomeTourController::get_usage_data(),
104 'flows' => FrmUsageController::get_flows_data(),
105 'payments' => $this->payments(),
106 'subscriptions' => $this->payments( 'frm_subscriptions' ),
107 );
108
109 if ( method_exists( 'FrmProAddonsController', 'get_readable_license_type' ) ) {
110 $snap['active_license'] = FrmProAddonsController::get_readable_license_type();
111 }
112
113 return apply_filters( 'frm_usage_snapshot', $snap );
114 }
115
116 /**
117 * Gets onboarding wizard data.
118 *
119 * @since 6.16.1
120 *
121 * @return array
122 */
123 private function onboarding_wizard() {
124 $data = FrmOnboardingWizardController::get_usage_data();
125 $skipped_keys = array(
126 'default_email',
127 'is_subscribed',
128 'allows_tracking',
129 'summary_emails',
130 'installed_addons',
131 );
132
133 foreach ( $skipped_keys as $skipped_key ) {
134 unset( $data[ $skipped_key ] );
135 }
136
137 return $data;
138 }
139
140 /**
141 * Gets payments data.
142 *
143 * @since 6.16.1
144 *
145 * @param string $table Database table name.
146 *
147 * @return array
148 */
149 private function payments( $table = 'frm_payments' ) {
150 $allowed_tables = array( 'frm_payments', 'frm_subscriptions' );
151
152 if ( ! in_array( $table, $allowed_tables, true ) ) {
153 return array();
154 }
155
156 if ( ! FrmTransLiteAppHelper::payments_table_exists() ) {
157 return array();
158 }
159
160 global $wpdb;
161 $rows = $wpdb->get_results(
162 $wpdb->prepare(
163 'SELECT amount, status, paysys, created_at FROM %1$s',
164 $wpdb->prefix . $table
165 )
166 );
167
168 $payments = array();
169
170 foreach ( $rows as $row ) {
171 $payments[] = array(
172 'amount' => (float) $row->amount,
173 'status' => $row->status,
174 'gateway' => $row->paysys,
175 'created_at' => $row->created_at,
176 );
177 }
178
179 return $payments;
180 }
181
182 /**
183 * @since 3.06.04
184 *
185 * @return array
186 */
187 private function plugins() {
188 $plugin_list = FrmAppHelper::get_plugins();
189
190 $plugins = array();
191
192 foreach ( $plugin_list as $slug => $info ) {
193 $plugins[] = array(
194 'name' => $info['Name'],
195 'slug' => $slug,
196 'version' => $info['Version'],
197 'active' => is_plugin_active( $slug ),
198 );
199 }
200
201 return $plugins;
202 }
203
204 /**
205 * Add global settings to tracking data.
206 *
207 * @since 3.06.04
208 *
209 * @return array
210 */
211 private function settings() {
212 $settings_list = FrmAppHelper::get_settings();
213 $settings = array(
214 'messages' => $this->messages( $settings_list ),
215 'permissions' => $this->permissions( $settings_list ),
216 );
217 $pass_settings = array(
218 'load_style',
219 'fade_form',
220 're_type',
221 're_lang',
222 're_multi',
223 'menu',
224 'mu_menu',
225 'no_ips',
226 'custom_header_ip',
227 'enable_gdpr',
228 'no_gdpr_cookies',
229 'btsp_css',
230 'btsp_version',
231 'admin_bar',
232 'summary_emails',
233 'active_captcha',
234 'honeypot',
235 'wp_spam_check',
236 'denylist_check',
237 'email_style',
238 );
239
240 foreach ( $pass_settings as $setting ) {
241 if ( isset( $settings_list->$setting ) ) {
242 $settings[ $setting ] = $this->maybe_json( $settings_list->$setting );
243 }
244 }
245
246 $settings = apply_filters( 'frm_usage_settings', $settings );
247
248 $settings['messages'] = $this->maybe_json( $settings['messages'] );
249 $settings['permissions'] = $this->maybe_json( $settings['permissions'] );
250
251 return $settings;
252 }
253
254 /**
255 * Include the permissions settings for each capability.
256 *
257 * @since 3.06.04
258 *
259 * @param FrmSettings $settings_list
260 *
261 * @return array
262 */
263 private function messages( $settings_list ) {
264 $messages = array(
265 'success_msg',
266 'blank_msg',
267 'unique_msg',
268 'invalid_msg',
269 'failed_msg',
270 'submit_value',
271 'login_msg',
272 'admin_permission',
273 );
274
275 $default = $settings_list->default_options();
276
277 $message_settings = array();
278
279 foreach ( $messages as $message ) {
280 $message_settings[ 'changed-' . $message ] = $settings_list->$message === $default[ $message ] ? 0 : 1;
281 }
282
283 return $message_settings;
284 }
285
286 /**
287 * Include the permissions settings for each capability.
288 *
289 * @since 3.06.04
290 *
291 * @param FrmSettings $settings_list
292 *
293 * @return array
294 */
295 private function permissions( $settings_list ) {
296 $permissions = array();
297 $frm_roles = FrmAppHelper::frm_capabilities();
298
299 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
300 if ( isset( $settings_list->$frm_role ) ) {
301 $permissions[ $frm_role ] = $settings_list->$frm_role;
302 }
303 }
304
305 return $permissions;
306 }
307
308 /**
309 * @since 3.06.04
310 *
311 * @return array
312 */
313 private function forms() {
314 $s_query = array(
315 array(
316 'or' => 1,
317 'parent_form_id' => null,
318 'parent_form_id <' => 1,
319 ),
320 );
321
322 $saved_forms = FrmForm::getAll( $s_query );
323 $forms = array();
324 $settings = array(
325 'form_class',
326 'akismet',
327 'antispam',
328 'stopforumspam',
329 'custom_style',
330 'success_action',
331 'show_form',
332 'no_save',
333 'ajax_load',
334 'ajax_submit',
335 'js_validate',
336 'logged_in_role',
337 'single_entry',
338 'single_entry_type',
339 'editable_role',
340 'open_editable_role',
341 'edit_action',
342 'edit_value',
343 'edit_msg',
344 'save_draft',
345 'draft_msg',
346 'submit_align',
347 'protect_files',
348 'protect_files_role',
349 'max_entries',
350 'open_status',
351 'closed_msg',
352 'open_date',
353 'close_date',
354 'copy',
355 'prev_value',
356 'submit_conditions',
357 );
358
359 $style = new FrmStyle();
360
361 foreach ( $saved_forms as $form ) {
362 $new_form = array(
363 'form_id' => $form->id,
364 'description' => $form->description,
365 'logged_in' => $form->logged_in,
366 'editable' => $form->editable,
367 'is_template' => $form->is_template,
368 'entry_count' => FrmEntry::getRecordCount( $form->id ),
369 'field_count' => $this->form_field_count( $form->id ),
370 'form_action_count' => $this->form_action_count( $form->id ),
371 );
372
373 foreach ( $settings as $setting ) {
374 if ( isset( $form->options[ $setting ] ) ) {
375 if ( 'custom_style' === $setting ) {
376 $style->id = $form->options[ $setting ];
377
378 if ( ! $style->id ) {
379 $style_name = 0;
380 } elseif ( 1 === intval( $style->id ) ) {
381 $style_name = 'formidable-style';
382 } else {
383 $style_post = $style->get_one();
384 $style_name = $style_post ? $style_post->post_name : 'formidable-style';
385 }
386
387 $new_form[ $setting ] = $style_name;
388 } else {
389 $new_form[ $setting ] = $this->maybe_json( $form->options[ $setting ] );
390 }
391 }
392 }
393
394 $forms[] = apply_filters( 'frm_usage_form', $new_form, compact( 'form' ) );
395 }//end foreach
396
397 // If the array uses numeric keys, reset them.
398 return $forms;
399 }
400
401 /**
402 * @since 3.06.04
403 *
404 * @param int|string $form_id Form ID.
405 *
406 * @return int
407 */
408 private function form_field_count( $form_id ) {
409 global $wpdb;
410
411 $join = $wpdb->prefix . 'frm_fields fi JOIN ' . $wpdb->prefix . 'frm_forms fo ON (fi.form_id=fo.id)';
412
413 $field_query = array(
414 'or' => 1,
415 'fi.form_id' => $form_id,
416 'parent_form_id' => $form_id,
417 );
418
419 return FrmDb::get_count( $join, $field_query );
420 }
421
422 /**
423 * @since 3.06.04
424 *
425 * @param int|string $form_id Form ID.
426 *
427 * @return int
428 */
429 private function form_action_count( $form_id ) {
430 $args = array(
431 'post_type' => FrmFormActionsController::$action_post_type,
432 'menu_order' => $form_id,
433 'fields' => 'ids',
434 );
435
436 $actions = FrmDb::check_cache( json_encode( $args ), 'frm_actions', $args, 'get_posts' );
437 return count( $actions );
438 }
439
440 /**
441 * Get the last 100 fields created.
442 *
443 * @since 3.06.04
444 *
445 * @return array
446 */
447 private function fields() {
448 $args = array(
449 'limit' => 50,
450 'order_by' => 'id DESC',
451 );
452
453 $fields = FrmDb::get_results( 'frm_fields', array(), 'id, form_id, name, type, field_options', $args );
454
455 foreach ( $fields as $k => $field ) {
456 FrmAppHelper::unserialize_or_decode( $field->field_options );
457 $fields[ $k ]->field_options = json_encode( $field->field_options );
458 }
459 return $fields;
460 }
461
462 /**
463 * @since 3.06.04
464 *
465 * @return array
466 */
467 private function actions() {
468 $args = array(
469 'post_type' => FrmFormActionsController::$action_post_type,
470 'numberposts' => 100,
471 );
472
473 $actions = array();
474
475 $saved_actions = FrmDb::check_cache( json_encode( $args ), 'frm_actions', $args, 'get_posts' );
476
477 foreach ( $saved_actions as $action ) {
478 $actions[] = array(
479 'form_id' => $action->menu_order,
480 'type' => $action->post_excerpt,
481 'status' => $action->post_status,
482 'settings' => $action->post_content,
483 );
484 }
485
486 return $actions;
487 }
488
489 /**
490 * @since 3.06.04
491 *
492 * @return bool
493 */
494 private function tracking_allowed() {
495 return FrmUsageController::tracking_allowed();
496 }
497
498 /**
499 * @since 3.06.04
500 *
501 * @param mixed $value Value.
502 *
503 * @return string
504 */
505 private function maybe_json( $value ) {
506 return is_array( $value ) ? json_encode( $value ) : $value;
507 }
508 }
509