PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.22.2
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.22.2
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.22.2, at classes/models/FrmUsage.php

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