PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.12.1
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.12.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
← All changes | classes/controllers/FrmAddonsController.php +365 -426 6.306.12.1 View file →
@@ -7,95 +7,13 @@
7 7
8 8 /**
9 9 * @var string
10 10 */
11 - const SCRIPT_HANDLE = 'frm-addons-page';
12 -
13 - /**
14 - * @var array
15 - */
16 - private static $categories = array();
17 -
18 - /**
19 - * @var string
20 - */
21 - private static $request_addon_url;
22 -
23 - /**
24 - * @var string
25 - */
26 11 protected static $plugin;
27 12
28 13 /**
29 - * @since 6.15
30 - *
31 14 * @return void
32 15 */
33 - public static function load_admin_hooks() {
34 - add_action( 'admin_menu', self::class . '::menu', 100 );
35 - add_filter( 'pre_set_site_transient_update_plugins', self::class . '::check_update' );
36 -
37 - if ( ! FrmAppHelper::is_admin_page( 'formidable-addons' ) ) {
38 - return;
39 - }
40 -
41 - self::$request_addon_url = 'https://connect.formidableforms.com/add-on-request/';
42 -
43 - add_action( 'admin_enqueue_scripts', self::class . '::enqueue_assets', 15 );
44 - add_filter( 'frm_show_footer_links', '__return_false' );
45 - }
46 -
47 - /**
48 - * Enqueues the Add-Ons page scripts and styles.
49 - *
50 - * @since 6.15
51 - *
52 - * @return void
53 - */
54 - public static function enqueue_assets() {
55 - $plugin_url = FrmAppHelper::plugin_url();
56 - $version = FrmAppHelper::plugin_version();
57 - $js_dependencies = array(
58 - 'wp-i18n',
59 - // This prevents a console error "wp.hooks is undefined" in WP versions older than 5.7.
60 - 'wp-hooks',
61 - 'formidable_dom',
62 - );
63 -
64 - // Enqueue styles that needed.
65 - wp_enqueue_style( 'formidable-admin' );
66 - wp_enqueue_style( 'formidable-grids' );
67 -
68 - // Register and enqueue Add-Ons page style.
69 - wp_register_style( self::SCRIPT_HANDLE, $plugin_url . '/css/admin/addons-page.css', array(), $version );
70 - wp_enqueue_style( self::SCRIPT_HANDLE );
71 -
72 - // Register and enqueue Add-Ons page script.
73 - wp_register_script( self::SCRIPT_HANDLE, $plugin_url . '/js/addons-page.js', $js_dependencies, $version, true );
74 - wp_localize_script( self::SCRIPT_HANDLE, 'frmAddonsVars', self::get_js_variables() );
75 - wp_enqueue_script( self::SCRIPT_HANDLE );
76 - wp_set_script_translations( self::SCRIPT_HANDLE, 'formidable' );
77 -
78 - FrmAppHelper::dequeue_extra_global_scripts();
79 - }
80 -
81 - /**
82 - * Get the Add-Ons page JS variables as an array.
83 - *
84 - * @since 6.15
85 - *
86 - * @return array
87 - */
88 - private static function get_js_variables() {
89 - return array(
90 - 'proIsIncluded' => FrmAppHelper::pro_is_included(),
91 - 'addonRequestURL' => self::$request_addon_url,
92 - );
93 - }
94 -
95 - /**
96 - * @return void
97 - */
98 16 public static function menu() {
99 17 if ( ! current_user_can( 'activate_plugins' ) ) {
100 18 return;
101 19 }
@@ -100,37 +18,28 @@
100 18 return;
101 19 }
102 20
103 21 $label = __( 'Add-Ons', 'formidable' );
104 - $label = '<span style="color:#3FCA89">' . esc_html( $label ) . '</span>';
22 + $label = '<span style="color:#1da867">' . $label . '</span>';
105 23
106 24 add_submenu_page( 'formidable', 'Formidable | ' . __( 'Add-Ons', 'formidable' ), $label, 'frm_view_forms', 'formidable-addons', 'FrmAddonsController::list_addons' );
107 25
108 - // Remove default created subpage, make the page with highest priority as default.
26 + // remove default created subpage, make the page with highest priority as default.
109 27 remove_submenu_page( 'formidable', 'formidable' );
110 28
111 29 if ( ! FrmAppHelper::pro_is_installed() ) {
112 - $cta_text = FrmSalesApi::get_best_sale_value( 'menu_cta_text' );
113 -
114 - if ( ! $cta_text ) {
115 - $cta_text = __( 'Upgrade', 'formidable' );
116 - }
117 -
118 30 add_submenu_page(
119 31 'formidable',
120 32 'Formidable | ' . __( 'Upgrade', 'formidable' ),
121 - '<span class="frm-upgrade-submenu">' . esc_html( $cta_text ) . '</span>',
33 + '<span class="frm-upgrade-submenu">' . __( 'Upgrade', 'formidable' ) . '</span>',
122 34 'frm_view_forms',
123 35 'formidable-pro-upgrade',
124 - function () {
125 - // This function doesn't need to do anything.
126 - // The redirect is handled earlier to avoid issues with the headers being sent.
127 - }
36 + 'FrmAddonsController::upgrade_to_pro'
128 37 );
129 38 } elseif ( 'formidable-pro-upgrade' === FrmAppHelper::get_param( 'page' ) ) {
130 39 wp_safe_redirect( admin_url( 'admin.php?page=formidable' ) );
131 40 exit;
132 - }//end if
41 + }
133 42 }
134 43
135 44 /**
136 45 * @return void
@@ -136,31 +45,28 @@
136 45 * @return void
137 46 */
138 47 public static function list_addons() {
139 48 FrmAppHelper::include_svg();
49 + $installed_addons = apply_filters( 'frm_installed_addons', array() );
50 + $license_type = '';
140 51
141 - $view_path = FrmAppHelper::plugin_path() . '/classes/views/addons/';
142 - $installed_addons = apply_filters( 'frm_installed_addons', array() );
143 - $addons = self::get_api_addons();
144 - $errors = array();
145 - $license_type = '';
146 - $request_addon_url = self::$request_addon_url;
52 + $addons = self::get_api_addons();
53 + $errors = array();
147 54
148 55 if ( isset( $addons['error'] ) ) {
149 56 $api = new FrmFormApi();
150 57 $errors = $api->get_error_from_response( $addons );
151 - $license_type = $addons['error']['type'] ?? '';
58 + $license_type = isset( $addons['error']['type'] ) ? $addons['error']['type'] : '';
152 59 unset( $addons['error'] );
153 60 }
154 61
155 62 $pro = array(
156 63 'pro' => array(
157 - 'title' => 'Formidable Forms Pro',
158 - 'slug' => 'formidable-pro',
159 - 'released' => '2011-02-05',
160 - 'docs' => 'knowledgebase/',
161 - 'categories' => array( 'basic', 'plus', 'business', 'elite' ),
162 - 'excerpt' => 'Create calculators, surveys, smart forms, and data-driven applications. Build directories, real estate listings, job boards, and much more.',
64 + 'title' => 'Formidable Forms Pro',
65 + 'slug' => 'formidable-pro',
66 + 'released' => '2011-02-05',
67 + 'docs' => 'knowledgebase/',
68 + 'excerpt' => 'Create calculators, surveys, smart forms, and data-driven applications. Build directories, real estate listings, job boards, and much more.',
163 69 ),
164 70 );
165 71 $addons = $pro + $addons;
166 72 self::prepare_addons( $addons );
@@ -166,114 +72,19 @@
166 72 self::prepare_addons( $addons );
167 73
168 74 $pricing = FrmAppHelper::admin_upgrade_link( 'addons' );
169 75
170 - self::organize_and_get_categories();
171 - $categories = self::$categories;
172 -
173 - include $view_path . 'index.php';
76 + include FrmAppHelper::plugin_path() . '/classes/views/addons/list.php';
174 77 }
175 78
176 79 /**
177 - * Organize and set categories.
178 - *
179 - * @since 6.15
180 - *
181 80 * @return void
182 81 */
183 - protected static function organize_and_get_categories() {
184 - unset( self::$categories['strategy11'] );
185 - ksort( self::$categories );
186 -
187 - $bottom_categories = array();
188 - $plans = FrmFormsHelper::get_license_types(
189 - array(
190 - 'include_all' => false,
191 - 'case_lower' => true,
192 - )
193 - );
194 -
195 - // Extract the elements to move
196 - foreach ( $plans as $plan ) {
197 - if ( ! isset( self::$categories[ $plan ] ) ) {
198 - continue;
199 - }
200 -
201 - $bottom_categories[ $plan ] = self::$categories[ $plan ];
202 - unset( self::$categories[ $plan ] );
203 - }
204 -
205 - $special_categories = array();
206 -
207 - if ( 'elite' !== self::license_type() ) {
208 - $special_categories['available-addons'] = array(
209 - 'name' => __( 'Available', 'formidable' ),
210 - // To be assigned via JavaScript.
211 - 'count' => 0,
212 - );
213 - }
214 -
215 - $special_categories['active-addons'] = array(
216 - 'name' => __( 'Active', 'formidable' ),
217 - // To be assigned via JavaScript.
218 - 'count' => 0,
219 - );
220 -
221 - $special_categories['all-items'] = array(
222 - 'name' => __( 'All Add-Ons', 'formidable' ),
223 - // To be assigned via JavaScript.
224 - 'count' => 0,
225 - );
226 -
227 - self::$categories = array_merge(
228 - $special_categories,
229 - self::$categories,
230 - $bottom_categories
231 - );
232 - }
233 -
234 - /**
235 - * Organize and set categories.
236 - *
237 - * @since 6.15
238 - *
239 - * @param array $addon The addon array that will be modified by reference.
240 - *
241 - * @return void
242 - */
243 - protected static function set_categories( &$addon ) {
244 - if ( ! isset( $addon['categories'] ) ) {
245 - return;
246 - }
247 -
248 - $addon['category-slugs'] = array();
249 -
250 - foreach ( $addon['categories'] as $category ) {
251 - $category = FrmFormsHelper::convert_legacy_package_names( $category );
252 - $category_slug = sanitize_title( $category );
253 -
254 - // Add the slug to the new array.
255 - $addon['category-slugs'][] = $category_slug;
256 -
257 - if ( ! isset( self::$categories[ $category_slug ] ) ) {
258 - self::$categories[ $category_slug ] = array(
259 - 'name' => $category,
260 - 'count' => 0,
261 - );
262 - }
263 -
264 - ++self::$categories[ $category_slug ]['count'];
265 - }
266 - }
267 -
268 - /**
269 - * @return void
270 - */
271 82 public static function license_settings() {
272 83 $plugins = apply_filters( 'frm_installed_addons', array() );
84 + if ( empty( $plugins ) ) {
85 + esc_html_e( 'There are no plugins on your site that require a license', 'formidable' );
273 86
274 - if ( ! $plugins ) {
275 - esc_html_e( 'There are no plugins on your site that require a license', 'formidable' );
276 87 return;
277 88 }
278 89
279 90 ksort( $plugins );
@@ -287,15 +98,15 @@
287 98 protected static function get_api_addons() {
288 99 $api = new FrmFormApi();
289 100 $addons = $api->get_api_info();
290 101
291 - if ( ! $addons ) {
292 - return self::fallback_plugin_list();
293 - }
294 -
295 - foreach ( $addons as $k => $addon ) {
296 - if ( empty( $addon['excerpt'] ) && $k !== 'error' ) {
297 - unset( $addons[ $k ] );
102 + if ( empty( $addons ) ) {
103 + $addons = self::fallback_plugin_list();
104 + } else {
105 + foreach ( $addons as $k => $addon ) {
106 + if ( empty( $addon['excerpt'] ) && $k !== 'error' ) {
107 + unset( $addons[ $k ] );
108 + }
298 109 }
299 110 }
300 111
301 112 return $addons;
@@ -308,9 +119,11 @@
308 119 *
309 120 * @return int Count of addons.
310 121 */
311 122 public static function get_addons_count() {
312 - return count( self::get_api_addons() );
123 + $addons = self::get_api_addons();
124 +
125 + return count( $addons );
313 126 }
314 127
315 128 /**
316 129 * If the API is unable to connect, show something on the addons page
@@ -315,9 +128,8 @@
315 128 /**
316 129 * If the API is unable to connect, show something on the addons page
317 130 *
318 131 * @since 3.04.03
319 - *
320 132 * @return array
321 133 */
322 134 protected static function fallback_plugin_list() {
323 135 $list = array(
@@ -328,19 +140,19 @@
328 140 'excerpt' => 'Enhance your basic Formidable forms with a plethora of Pro field types and features. Create advanced forms and data-driven applications in minutes.',
329 141 ),
330 142 'mailchimp' => array(
331 143 'title' => 'Mailchimp Forms',
332 - 'excerpt' => 'Get on the path to more sales and leads in a matter of minutes. Add leads to a Mailchimp mailing list when they submit forms and update their information along with the entry.', // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
144 + 'excerpt' => 'Get on the path to more sales and leads in a matter of minutes. Add leads to a Mailchimp mailing list when they submit forms and update their information along with the entry.',
333 145 ),
334 146 'registration' => array(
335 147 'title' => 'User Registration Forms',
336 148 'link' => 'downloads/user-registration/',
337 - 'excerpt' => 'Give new users access to your site as quickly and painlessly as possible. Allow users to register, edit and be able to login to their profiles on your site from the front end in a clean, customized registration form.', // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
149 + 'excerpt' => 'Give new users access to your site as quickly and painlessly as possible. Allow users to register, edit and be able to login to their profiles on your site from the front end in a clean, customized registration form.',
338 150 ),
339 151 'paypal' => array(
340 152 'title' => 'PayPal Standard Forms',
341 153 'link' => 'downloads/paypal-standard/',
342 - 'excerpt' => 'Automate your business by collecting instant payments from your clients. Collect information, calculate a total, and send them on to PayPal. Require a payment before publishing content on your site.', // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
154 + 'excerpt' => 'Automate your business by collecting instant payments from your clients. Collect information, calculate a total, and send them on to PayPal. Require a payment before publishing content on your site.',
343 155 ),
344 156 'stripe' => array(
345 157 'title' => 'Stripe Forms',
346 158 'docs' => 'knowledgebase/stripe/',
@@ -372,9 +184,9 @@
372 184 'excerpt' => 'Instantly add Bootstrap styling to all your Formidable forms.',
373 185 ),
374 186 'zapier' => array(
375 187 'title' => 'Zapier Forms',
376 - 'excerpt' => 'Connect with hundreds of different applications through Zapier. Insert a new row in a Google docs spreadsheet, post on Twitter, or add a new Dropbox file with your form.', // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
188 + 'excerpt' => 'Connect with hundreds of different applications through Zapier. Insert a new row in a Google docs spreadsheet, post on Twitter, or add a new Dropbox file with your form.',
377 189 ),
378 190 'signature' => array(
379 191 'title' => 'Digital Signature Forms',
380 192 'excerpt' => 'Add a signature field to your form. The user may write their signature with a trackpad/mouse or just type it.',
@@ -407,9 +219,8 @@
407 219 foreach ( $list as $k => $info ) {
408 220 $info['slug'] = $k;
409 221 $list[ $k ] = array_merge( $defaults, $info );
410 222 }
411 -
412 223 return $list;
413 224 }
414 225
415 226 /**
@@ -415,28 +226,25 @@
415 226 /**
416 227 * If Pro is missing but has been authenticated, include a download URL
417 228 *
418 229 * @since 3.04.03
419 - *
420 230 * @return string
421 231 */
422 232 public static function get_pro_download_url() {
423 - $api = new FrmFormApi( self::get_pro_license() );
233 + $license = self::get_pro_license();
234 + $api = new FrmFormApi( $license );
424 235 $downloads = $api->get_api_info();
425 236 $pro = self::get_pro_from_addons( $downloads );
426 237
427 - return $pro['url'] ?? '';
238 + return isset( $pro['url'] ) ? $pro['url'] : '';
428 239 }
429 240
430 241 /**
431 242 * @since 4.08
432 - *
433 - * @return string
434 243 */
435 244 public static function get_pro_license() {
436 245 $pro_cred_store = 'frmpro-credentials';
437 246 $pro_wpmu_store = 'frmpro-wpmu-sitewide';
438 -
439 247 if ( is_multisite() && get_site_option( $pro_wpmu_store ) ) {
440 248 $creds = get_site_option( $pro_cred_store );
441 249 } else {
442 250 $creds = get_option( $pro_cred_store );
@@ -446,18 +254,16 @@
446 254 return '';
447 255 }
448 256
449 257 $license = $creds['license'];
450 -
451 - if ( ! $license ) {
258 + if ( empty( $license ) ) {
452 259 return '';
453 260 }
454 261
455 - if ( str_contains( $license, '-' ) ) {
456 - // This is a fix for licenses saved in the past
457 - return strtoupper( $license );
262 + if ( strpos( $license, '-' ) ) {
263 + // this is a fix for licenses saved in the past
264 + $license = strtoupper( $license );
458 265 }
459 -
460 266 return $license;
461 267 }
462 268
463 269 /**
@@ -463,19 +269,16 @@
463 269 /**
464 270 * @since 4.08
465 271 *
466 272 * @param array $addons
467 - *
468 273 * @return array
469 274 */
470 275 protected static function get_pro_from_addons( $addons ) {
471 - return $addons['93790'] ?? array();
276 + return isset( $addons['93790'] ) ? $addons['93790'] : array();
472 277 }
473 278
474 279 /**
475 280 * @since 4.06
476 - *
477 - * @return string
478 281 */
479 282 public static function license_type() {
480 283 if ( is_callable( 'FrmProAddonsController::license_type' ) ) {
481 284 return FrmProAddonsController::license_type();
@@ -490,21 +293,18 @@
490 293 * @return bool
491 294 */
492 295 public static function is_license_expired() {
493 296 $version_info = self::get_primary_license_info();
494 -
495 297 if ( ! isset( $version_info['error'] ) ) {
496 298 return false;
497 299 }
498 300
499 - $expires = $version_info['error']['expires'] ?? 0;
500 -
501 - if ( ! $expires || $expires > time() ) {
301 + $expires = isset( $version_info['error']['expires'] ) ? $version_info['error']['expires'] : 0;
302 + if ( empty( $expires ) || $expires > time() ) {
502 303 return false;
503 304 }
504 305
505 306 $rate_limited = ! empty( $version_info['response_code'] ) && 429 === (int) $version_info['response_code'];
506 -
507 307 if ( $rate_limited ) {
508 308 // Do not return false positives for rate limited responses.
509 309 return false;
510 310 }
@@ -519,13 +319,11 @@
519 319 * @return array|false
520 320 */
521 321 public static function get_primary_license_info() {
522 322 $installed_addons = apply_filters( 'frm_installed_addons', array() );
523 -
524 - if ( ! $installed_addons || ! isset( $installed_addons['formidable_pro'] ) ) {
323 + if ( empty( $installed_addons ) || ! isset( $installed_addons['formidable_pro'] ) ) {
525 324 return false;
526 325 }
527 -
528 326 $installed_addons = array(
529 327 'formidable_pro' => $installed_addons['formidable_pro'],
530 328 );
531 329
@@ -533,12 +331,8 @@
533 331 }
534 332
535 333 /**
536 334 * @since 3.04.03
537 - *
538 - * @param mixed $transient
539 - *
540 - * @return object
541 335 */
542 336 public static function check_update( $transient ) {
543 337 if ( ! FrmAppHelper::pro_is_installed() ) {
544 338 // Don't make any changes if only Lite is installed.
@@ -549,10 +343,9 @@
549 343 $transient = new stdClass();
550 344 }
551 345
552 346 $installed_addons = apply_filters( 'frm_installed_addons', array() );
553 -
554 - if ( ! $installed_addons ) {
347 + if ( empty( $installed_addons ) ) {
555 348 return $transient;
556 349 }
557 350
558 351 $version_info = self::fill_update_addon_info( $installed_addons );
@@ -566,20 +359,19 @@
566 359 continue;
567 360 }
568 361
569 362 $folder = $plugin->plugin;
570 -
571 - if ( ! $folder ) {
363 + if ( empty( $folder ) ) {
572 364 continue;
573 365 }
574 366
575 367 if ( ! self::is_installed( $folder ) ) {
576 - // Don't show an update if the plugin isn't installed
368 + // don't show an update if the plugin isn't installed
577 369 continue;
578 370 }
579 371
580 - $wp_plugin = $wp_plugins[ $folder ] ?? array();
581 - $wp_version = $wp_plugin['Version'] ?? '1.0';
372 + $wp_plugin = isset( $wp_plugins[ $folder ] ) ? $wp_plugins[ $folder ] : array();
373 + $wp_version = isset( $wp_plugin['Version'] ) ? $wp_plugin['Version'] : '1.0';
582 374 $plugin->slug = explode( '/', $folder )[0];
583 375
584 376 if ( version_compare( $wp_version, $plugin->new_version, '<' ) ) {
585 377 $transient->response[ $folder ] = $plugin;
@@ -587,8 +379,9 @@
587 379 $transient->no_update[ $folder ] = $plugin;
588 380 }
589 381
590 382 $transient->checked[ $folder ] = $wp_version;
383 +
591 384 }//end foreach
592 385
593 386 return $transient;
594 387 }
@@ -598,9 +391,8 @@
598 391 * Because this gets called on "pre_set_site_transient_update_plugins" an old version of FrmAppHelper may be loaded on plugin update.
599 392 * This means that trying to access FrmAppHelper::get_plugins when upgrading from a Lite version before v5.5 results in a one-off error.
600 393 *
601 394 * @since 5.5.2
602 - *
603 395 * @return array
604 396 */
605 397 protected static function get_plugins() {
606 398 if ( ! function_exists( 'get_plugins' ) ) {
@@ -635,49 +427,43 @@
635 427 $version_info = array();
636 428
637 429 foreach ( $installed_addons as $addon ) {
638 430 if ( $addon->store_url !== 'https://formidableforms.com' ) {
639 - // Check if this is a third-party addon
431 + // check if this is a third-party addon
640 432 continue;
641 433 }
642 434
643 435 $new_license = $addon->license;
644 -
645 - if ( ! $new_license || in_array( $new_license, $checked_licenses, true ) ) {
436 + if ( empty( $new_license ) || in_array( $new_license, $checked_licenses ) ) {
646 437 continue;
647 438 }
648 439
649 440 $checked_licenses[] = $new_license;
650 - $api = new FrmFormApi( $new_license );
651 441
652 - if ( ! $version_info ) {
442 + $api = new FrmFormApi( $new_license );
443 + if ( empty( $version_info ) ) {
653 444 $version_info = $api->get_api_info();
654 445 continue;
655 446 }
656 447
657 448 $plugin = $api->get_addon_for_license( $addon, $version_info );
658 -
659 - if ( ! $plugin ) {
449 + if ( empty( $plugin ) ) {
660 450 continue;
661 451 }
662 452
663 - $download_id = $plugin['id'] ?? 0;
453 + $download_id = isset( $plugin['id'] ) ? $plugin['id'] : 0;
454 + if ( ! empty( $download_id ) && ! isset( $version_info[ $download_id ]['package'] ) ) {
455 + // if this addon is using its own license, get the update url
456 + $addon_info = $api->get_api_info();
664 457
665 - if ( ! $download_id || isset( $version_info[ $download_id ]['package'] ) ) {
666 - continue;
458 + $version_info[ $download_id ] = $addon_info[ $download_id ];
459 + if ( isset( $addon_info['error'] ) ) {
460 + $version_info[ $download_id ]['error'] = array(
461 + 'message' => $addon_info['error']['message'],
462 + 'code' => $addon_info['error']['code'],
463 + );
464 + }
667 465 }
668 -
669 - // If this addon is using its own license, get the update url
670 - $addon_info = $api->get_api_info();
671 -
672 - $version_info[ $download_id ] = $addon_info[ $download_id ];
673 -
674 - if ( isset( $addon_info['error'] ) ) {
675 - $version_info[ $download_id ]['error'] = array(
676 - 'message' => $addon_info['error']['message'],
677 - 'code' => $addon_info['error']['code'],
678 - );
679 - }
680 466 }//end foreach
681 467
682 468 return $version_info;
683 469 }
@@ -685,11 +471,9 @@
685 471 /**
686 472 * Get the action link for an addon that isn't active.
687 473 *
688 474 * @since 3.06.03
689 - *
690 475 * @param string $plugin The plugin slug.
691 - *
692 476 * @return array
693 477 */
694 478 public static function install_link( $plugin ) {
695 479 $link = array();
@@ -711,9 +495,9 @@
711 495 'categories' => $addon['categories'],
712 496 );
713 497 }
714 498
715 - if ( $link ) {
499 + if ( ! empty( $link ) ) {
716 500 $link['status'] = $addon['status']['type'];
717 501 }
718 502 } elseif ( current_user_can( 'activate_plugins' ) && self::is_installed( 'formidable-' . $plugin . '/formidable-' . $plugin . '.php' ) ) {
719 503 $link = array(
@@ -725,81 +509,34 @@
725 509 return $link;
726 510 }
727 511
728 512 /**
729 - * Get the JSON-encoded install data for a plugin update.
730 - *
731 - * @since 6.29
732 - *
733 - * @param string $addon_slug The addon slug (e.g. 'pro', 'dates').
734 - *
735 - * @return string JSON-encoded install data, or empty string if no URL is available.
736 - */
737 - public static function get_update_install_data( $addon_slug ) {
738 - $upgrading = self::install_link( $addon_slug );
739 -
740 - if ( isset( $upgrading['class'] ) && 'frm-install-addon' === $upgrading['class'] ) {
741 - return (string) json_encode( $upgrading );
742 - }
743 -
744 - if ( 'pro' === $addon_slug ) {
745 - $download_url = self::get_pro_download_url();
746 - $plugin_file = 'formidable-pro/formidable-pro.php';
747 - } else {
748 - $addon_data = self::get_addon( $addon_slug );
749 - $download_url = $addon_data && ! empty( $addon_data['url'] ) ? $addon_data['url'] : '';
750 - $plugin_file = $addon_data && ! empty( $addon_data['plugin'] ) ? $addon_data['plugin'] : 'formidable-' . $addon_slug . '/formidable-' . $addon_slug . '.php';
751 - }
752 -
753 - if ( ! $download_url ) {
754 - $update_plugins = get_site_transient( 'update_plugins' );
755 - $plugin_update = $update_plugins->response[ $plugin_file ] ?? null;
756 - $download_url = $plugin_update && ! empty( $plugin_update->package ) ? $plugin_update->package : '';
757 - }
758 -
759 - return $download_url ? (string) json_encode(
760 - array(
761 - 'url' => $download_url,
762 - 'class' => 'frm-install-addon',
763 - )
764 - ) : '';
765 - }
766 -
767 - /**
768 513 * @since 4.09
769 - *
770 514 * @param string $plugin The plugin slug.
771 - *
772 515 * @return array|false
773 516 */
774 517 public static function get_addon( $plugin ) {
775 518 $addons = self::get_api_addons();
776 519 self::prepare_addons( $addons );
777 -
778 520 foreach ( $addons as $addon ) {
779 521 $slug = explode( '/', $addon['plugin'] );
780 -
781 522 if ( $slug[0] === 'formidable-' . $plugin ) {
782 523 return $addon;
783 524 }
784 525 }
785 -
786 526 return false;
787 527 }
788 528
789 529 /**
790 530 * @since 4.09
791 - *
792 531 * @return string
793 532 */
794 533 protected static function get_license_type() {
795 534 $license_type = '';
796 535 $addons = self::get_api_addons();
797 -
798 536 if ( isset( $addons['error'] ) && isset( $addons['error']['type'] ) ) {
799 - return $addons['error']['type'];
537 + $license_type = $addons['error']['type'];
800 538 }
801 -
802 539 return $license_type;
803 540 }
804 541
805 542 /**
@@ -812,12 +549,11 @@
812 549 */
813 550 public static function get_addon_for_license( $addons, $license ) {
814 551 $download_id = $license->download_id;
815 552 $plugin = array();
816 -
817 - if ( ! $download_id && $addons ) {
553 + if ( empty( $download_id ) && ! empty( $addons ) ) {
818 554 foreach ( $addons as $addon ) {
819 - if ( 0 === strcasecmp( $license->plugin_name, $addon['title'] ) ) {
555 + if ( strtolower( $license->plugin_name ) === strtolower( $addon['title'] ) ) {
820 556 return $addon;
821 557 }
822 558 }
823 559 } elseif ( isset( $addons[ $download_id ] ) ) {
@@ -827,33 +563,29 @@
827 563 return $plugin;
828 564 }
829 565
830 566 /**
831 - * @param array $addons
832 - *
833 567 * @return void
834 568 */
835 569 protected static function prepare_addons( &$addons ) {
836 - // Reset categories to prevent count accumulation across multiple calls.
837 - self::$categories = array();
838 -
839 570 $activate_url = '';
840 -
841 571 if ( current_user_can( 'activate_plugins' ) ) {
842 572 $activate_url = add_query_arg( array( 'action' => 'activate' ), admin_url( 'plugins.php' ) );
843 573 }
844 574
845 575 $loop_addons = $addons;
846 -
847 576 foreach ( $loop_addons as $id => $addon ) {
848 577 if ( is_numeric( $id ) ) {
849 578 $slug = str_replace( array( '-wordpress-plugin', '-wordpress' ), '', $addon['slug'] );
850 579 $file_name = $addon['plugin'];
851 580 } else {
852 - $slug = $id;
853 - $base_file = $addon['file'] ?? 'formidable-' . $slug;
581 + $slug = $id;
582 + if ( isset( $addon['file'] ) ) {
583 + $base_file = $addon['file'];
584 + } else {
585 + $base_file = 'formidable-' . $slug;
586 + }
854 587 $file_name = $base_file . '/' . $base_file . '.php';
855 -
856 588 if ( ! isset( $addon['plugin'] ) ) {
857 589 $addon['plugin'] = $file_name;
858 590 }
859 591 }
@@ -858,17 +590,10 @@
858 590 }
859 591 }
860 592
861 593 $addon['installed'] = self::is_installed( $file_name );
862 -
863 - if ( 'highrise' === $slug && ! $addon['installed'] ) {
864 - unset( $addons[ $id ] );
865 - continue;
866 - }
867 -
868 594 if ( $addon['installed'] && 'formidable-views/formidable-views.php' === $file_name ) {
869 595 $active_views_version = self::get_active_views_version();
870 -
871 596 if ( false !== $active_views_version && $slug !== $active_views_version ) {
872 597 $addon['installed'] = false;
873 598 }
874 599 }
@@ -874,9 +599,9 @@
874 599 }
875 600
876 601 $addon['activate_url'] = '';
877 602
878 - if ( $addon['installed'] && $activate_url && ! self::is_plugin_active( $file_name, $slug ) ) {
603 + if ( $addon['installed'] && ! empty( $activate_url ) && ! self::is_plugin_active( $file_name, $slug ) ) {
879 604 $addon['activate_url'] = add_query_arg(
880 605 array(
881 606 '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $file_name ),
882 607 'plugin' => $file_name,
@@ -892,21 +617,16 @@
892 617
893 618 if ( ! isset( $addon['link'] ) ) {
894 619 $addon['link'] = 'downloads/' . $slug . '/';
895 620 }
621 + self::prepare_addon_link( $addon['link'] );
896 622
897 - self::prepare_addon_link( $addon['link'] );
898 623 self::set_addon_status( $addon );
899 - self::set_categories( $addon );
900 -
901 624 $addons[ $id ] = $addon;
902 625 }//end foreach
903 626 }
904 627
905 628 /**
906 - * @param string $file_name
907 - * @param string $slug
908 - *
909 629 * @return bool
910 630 */
911 631 private static function is_plugin_active( $file_name, $slug ) {
912 632 if ( 'formidable-views/formidable-views.php' === $file_name ) {
@@ -921,9 +641,8 @@
921 641 private static function get_active_views_version() {
922 642 if ( ! is_callable( 'FrmViewsAppHelper::plugin_version' ) ) {
923 643 return false;
924 644 }
925 -
926 645 $plugin_version = FrmViewsAppHelper::plugin_version();
927 646 return version_compare( $plugin_version, '5.0', '>=' ) ? 'visual-views' : 'views';
928 647 }
929 648
@@ -929,25 +648,22 @@
929 648
930 649 /**
931 650 * @since 3.04.02
932 651 *
933 - * @param string $link
934 - *
935 652 * @return void
936 653 */
937 654 protected static function prepare_addon_link( &$link ) {
938 655 $site_url = 'https://formidableforms.com/';
939 -
940 - if ( ! str_starts_with( $link, 'http' ) ) {
656 + if ( strpos( $link, 'http' ) !== 0 ) {
941 657 $link = $site_url . $link;
942 658 }
943 -
944 - $link = FrmAppHelper::make_affiliate_url( $link );
945 -
946 - $utm = array(
947 - 'campaign' => 'addons',
659 + $link = FrmAppHelper::make_affiliate_url( $link );
660 + $query_args = array(
661 + 'utm_source' => 'WordPress',
662 + 'utm_medium' => 'addons',
663 + 'utm_campaign' => 'liteplugin',
948 664 );
949 - $link = FrmAppHelper::maybe_add_missing_utm( $link, $utm );
665 + $link = add_query_arg( $query_args, $link );
950 666 }
951 667
952 668 /**
953 669 * Add the status to the addon array. Status options are:
@@ -954,10 +670,8 @@
954 670 * installed, active, not installed
955 671 *
956 672 * @since 3.04.02
957 673 *
958 - * @param array $addon
959 - *
960 674 * @return void
961 675 */
962 676 protected static function set_addon_status( &$addon ) {
963 677 if ( ! empty( $addon['activate_url'] ) ) {
@@ -978,8 +692,218 @@
978 692 }
979 693 }
980 694
981 695 /**
696 + * @return void
697 + */
698 + public static function upgrade_to_pro() {
699 + FrmAppHelper::include_svg();
700 +
701 + $link_parts = array(
702 + 'medium' => 'upgrade',
703 + 'content' => 'button',
704 + );
705 +
706 + $features = array(
707 + 'Display Entries' => array(
708 + array(
709 + 'label' => 'Display form data with virtually limitless views',
710 + 'link' => array(
711 + 'content' => 'views',
712 + 'param' => 'views-display-form-data',
713 + ),
714 + 'lite' => false,
715 + ),
716 + array(
717 + 'label' => 'Generate graphs and stats based on your submitted data',
718 + 'link' => array(
719 + 'content' => 'graphs',
720 + 'param' => 'statistics-graphs-wordpress-forms',
721 + ),
722 + 'lite' => false,
723 + ),
724 + ),
725 + 'Entry Management' => array(
726 + array(
727 + 'label' => 'Import entries from a CSV',
728 + 'link' => array(
729 + 'content' => 'import-entries',
730 + 'param' => 'importing-exporting-wordpress-forms',
731 + ),
732 + 'lite' => false,
733 + ),
734 + array(
735 + 'label' => 'Logged-in users can save drafts and return later',
736 + 'link' => array(
737 + 'content' => 'save-drafts',
738 + 'param' => 'save-drafts-wordpress-form',
739 + ),
740 + 'lite' => false,
741 + ),
742 + array(
743 + 'label' => 'Flexibly and powerfully view, edit, and delete entries from anywhere on your site',
744 + 'link' => array(
745 + 'content' => 'front-edit',
746 + 'param' => 'wordpress-front-end-editing',
747 + ),
748 + 'lite' => false,
749 + ),
750 + array(
751 + 'label' => 'View form submissions from the back-end',
752 + 'lite' => true,
753 + ),
754 + array(
755 + 'label' => 'Export your entries to a CSV',
756 + 'lite' => true,
757 + ),
758 + ),
759 + 'Form Building' => array(
760 + array(
761 + 'label' => 'Save a calculated value into a field',
762 + 'link' => array(
763 + 'content' => 'calculations',
764 + 'param' => 'field-calculations-wordpress-form',
765 + ),
766 + 'lite' => false,
767 + ),
768 + array(
769 + 'label' => 'Allow multiple file uploads',
770 + 'link' => array(
771 + 'content' => 'file-uploads',
772 + 'param' => 'wordpress-multi-file-upload-fields',
773 + ),
774 + 'lite' => false,
775 + ),
776 + array(
777 + 'label' => 'Repeat sections of fields',
778 + 'link' => array(
779 + 'content' => 'repeaters',
780 + 'param' => 'repeatable-sections-forms',
781 + ),
782 + 'lite' => false,
783 + ),
784 + array(
785 + 'label' => 'Hide and show fields conditionally based on other fields or the user\'s role',
786 + 'link' => array(
787 + 'content' => 'conditional-logic',
788 + 'param' => 'conditional-logic-wordpress-forms',
789 + ),
790 + 'lite' => false,
791 + ),
792 + array(
793 + 'label' => 'Confirmation fields',
794 + 'link' => array(
795 + 'content' => 'confirmation-fields',
796 + 'param' => 'confirmation-fields-wordpress-forms',
797 + ),
798 + 'lite' => false,
799 + ),
800 + array(
801 + 'label' => 'Multi-paged forms',
802 + 'link' => array(
803 + 'content' => 'page-breaks',
804 + 'param' => 'wordpress-multi-page-forms',
805 + ),
806 + 'lite' => false,
807 + ),
808 + array(
809 + 'label' => 'Include section headings, page breaks, rich text, dates, times, scales, star ratings, sliders, toggles, dynamic fields populated from other forms, passwords, and tags in advanced forms.',
810 + 'lite' => false,
811 + ),
812 + array(
813 + 'label' => 'Include text, email, url, paragraph text, radio, checkbox, dropdown fields, hidden fields, user ID fields, and HTML blocks in your form.',
814 + 'lite' => true,
815 + ),
816 + array(
817 + 'label' => 'Drag & Drop Form building',
818 + 'link' => array(
819 + 'content' => 'drag-drop',
820 + 'param' => 'drag-drop-forms',
821 + ),
822 + 'lite' => true,
823 + ),
824 + array(
825 + 'label' => 'Create forms from Templates',
826 + 'link' => array(
827 + 'content' => 'form-templates',
828 + 'param' => 'wordpress-form-templates',
829 + ),
830 + 'lite' => true,
831 + ),
832 + array(
833 + 'label' => 'Import and export forms with XML',
834 + 'link' => array(
835 + 'content' => 'import',
836 + 'param' => 'importing-exporting-wordpress-forms',
837 + ),
838 + 'lite' => true,
839 + ),
840 + array(
841 + 'label' => 'Use input placeholder text in your fields that clear when typing starts.',
842 + 'lite' => true,
843 + ),
844 + ),
845 + 'Form Actions' => array(
846 + array(
847 + 'label' => 'Conditionally send your email notifications based on values in your form',
848 + 'link' => array(
849 + 'content' => 'conditional-emails',
850 + ),
851 + 'lite' => false,
852 + ),
853 + array(
854 + 'label' => 'Create and edit WordPress posts or custom posts from the front-end',
855 + 'link' => array(
856 + 'content' => 'create-posts',
857 + 'param' => 'create-posts-pages-wordpress-forms',
858 + ),
859 + 'lite' => false,
860 + ),
861 + array(
862 + 'label' => 'Send multiple emails and autoresponders',
863 + 'link' => array(
864 + 'content' => 'multiple-emails',
865 + 'param' => 'virtually-unlimited-emails',
866 + ),
867 + 'lite' => true,
868 + ),
869 + ),
870 + 'Form Appearance' => array(
871 + array(
872 + 'label' => 'Create Multiple styles for different forms',
873 + 'link' => array(
874 + 'content' => 'multiple-styles',
875 + 'param' => 'wordpress-visual-form-styler',
876 + ),
877 + 'lite' => false,
878 + ),
879 + array(
880 + 'label' => 'Customizable layout with CSS classes',
881 + 'link' => array(
882 + 'content' => 'form-layout',
883 + 'param' => 'wordpress-mobile-friendly-forms',
884 + ),
885 + 'lite' => true,
886 + ),
887 + array(
888 + 'label' => 'Customize the HTML for your forms',
889 + 'link' => array(
890 + 'content' => 'custom-html',
891 + 'param' => 'customizable-html-wordpress-form',
892 + ),
893 + 'lite' => true,
894 + ),
895 + array(
896 + 'label' => 'Style your form with the Visual Form Styler',
897 + 'lite' => true,
898 + ),
899 + ),
900 + );
901 +
902 + include FrmAppHelper::plugin_path() . '/classes/views/addons/upgrade_to_pro.php';
903 + }
904 +
905 + /**
982 906 * @since 5.5.2
983 907 *
984 908 * @param string $plugin
985 909 * @param string $redirect
@@ -984,9 +908,8 @@
984 908 * @param string $plugin
985 909 * @param string $redirect
986 910 * @param bool $network_wide
987 911 * @param bool $silent
988 - *
989 912 * @return WP_Error|null Null on success, WP_Error on invalid file.
990 913 */
991 914 protected static function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silent = false ) {
992 915 if ( ! function_exists( 'activate_plugin' ) ) {
@@ -1001,9 +924,8 @@
1001 924 * @since 6.8
1002 925 *
1003 926 * @param string $plugin
1004 927 * @param bool $silent
1005 - *
1006 928 * @return void
1007 929 */
1008 930 protected static function deactivate_plugin( $plugin, $silent = false ) {
1009 931 if ( ! function_exists( 'deactivate_plugins' ) ) {
@@ -1017,9 +939,8 @@
1017 939 *
1018 940 * @since 6.8
1019 941 *
1020 942 * @param string $plugin
1021 - *
1022 943 * @return true|WP_Error True on success, WP_Error on invalid file.
1023 944 */
1024 945 protected static function uninstall_plugin( $plugin ) {
1025 946 if ( ! current_user_can( 'delete_plugins' ) ) {
@@ -1032,9 +953,13 @@
1032 953
1033 954 self::deactivate_plugin( $plugin, true );
1034 955 $result = delete_plugins( array( $plugin ) );
1035 956
1036 - return is_wp_error( $result ) ? $result : true;
957 + if ( is_wp_error( $result ) ) {
958 + return $result;
959 + }
960 +
961 + return true;
1037 962 }
1038 963
1039 964 /**
1040 965 * @since 5.0.10
@@ -1041,9 +966,9 @@
1041 966 *
1042 967 * @return string
1043 968 */
1044 969 protected static function get_current_plugin() {
1045 - if ( ! self::$plugin ) {
970 + if ( empty( self::$plugin ) ) {
1046 971 self::$plugin = FrmAppHelper::get_param( 'plugin', '', 'post', 'esc_url_raw' );
1047 972 }
1048 973 return self::$plugin;
1049 974 }
@@ -1050,9 +975,9 @@
1050 975
1051 976 /**
1052 977 * @since 4.08
1053 978 *
1054 - * @return mixed[]|null
979 + * @return array|void
1055 980 */
1056 981 protected static function download_and_activate() {
1057 982 if ( is_admin() ) {
1058 983 FrmAppHelper::set_current_screen_and_hook_suffix();
@@ -1060,14 +985,12 @@
1060 985
1061 986 self::maybe_show_cred_form();
1062 987
1063 988 $installed = self::install_addon();
1064 -
1065 989 if ( is_array( $installed ) && isset( $installed['message'] ) ) {
1066 990 return $installed;
1067 991 }
1068 992 self::handle_addon_action( $installed, 'activate' );
1069 - return null;
1070 993 }
1071 994
1072 995 /**
1073 996 * @since 3.04.02
@@ -1078,9 +1001,9 @@
1078 1001 if ( ! function_exists( 'request_filesystem_credentials' ) ) {
1079 1002 include_once ABSPATH . 'wp-admin/includes/file.php';
1080 1003 }
1081 1004
1082 - // Start output buffering to catch the filesystem form if credentials are needed.
1005 + // Start output bufferring to catch the filesystem form if credentials are needed.
1083 1006 ob_start();
1084 1007
1085 1008 $show_form = false;
1086 1009 $method = '';
@@ -1097,8 +1020,9 @@
1097 1020
1098 1021 if ( $show_form ) {
1099 1022 $form = ob_get_clean();
1100 1023 $message = __( 'Sorry, your site requires FTP authentication. Please download plugins from FormidableForms.com and install them manually.', 'formidable' );
1024 + $data = $form;
1101 1025 $response = array(
1102 1026 'success' => false,
1103 1027 'message' => $message,
1104 1028 'form' => $form,
@@ -1126,10 +1050,8 @@
1126 1050 * We do not need any extra credentials if we have gotten this far,
1127 1051 * so let's install the plugin.
1128 1052 *
1129 1053 * @since 3.04.02
1130 - *
1131 - * @return array|string
1132 1054 */
1133 1055 protected static function install_addon() {
1134 1056 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
1135 1057
@@ -1143,15 +1065,14 @@
1143 1065 }
1144 1066
1145 1067 // Create the plugin upgrader with our custom skin.
1146 1068 $installer = new Plugin_Upgrader( new FrmInstallerSkin() );
1147 - $installer->install( $download_url, array( 'overwrite_package' => true ) );
1069 + $installer->install( $download_url );
1148 1070
1149 1071 // Flush the cache and return the newly installed plugin basename.
1150 1072 wp_cache_flush();
1151 1073
1152 1074 $plugin = $installer->plugin_info();
1153 -
1154 1075 if ( ! $plugin ) {
1155 1076 return array(
1156 1077 'message' => 'Plugin was not installed. ' . $installer->result,
1157 1078 'success' => false,
@@ -1156,9 +1077,8 @@
1156 1077 'message' => 'Plugin was not installed. ' . $installer->result,
1157 1078 'success' => false,
1158 1079 );
1159 1080 }
1160 -
1161 1081 return $plugin;
1162 1082 }
1163 1083
1164 1084 /**
@@ -1222,9 +1142,8 @@
1222 1142 * @since 6.8
1223 1143 *
1224 1144 * @param callable $action_callback The specific add-on action to be executed.
1225 1145 * @param callable|null $response_callback Optional. The response handling callback. Default null.
1226 - *
1227 1146 * @return void
1228 1147 */
1229 1148 private static function process_addon_action( $action_callback, $response_callback = null ) {
1230 1149 self::install_addon_permissions();
@@ -1247,14 +1166,13 @@
1247 1166 * @since 6.8
1248 1167 *
1249 1168 * @param string $installed The plugin folder name with file name.
1250 1169 * @param string $action The action type ('activate', 'deactivate', 'uninstall').
1251 - *
1252 - * @return mixed[]|null
1170 + * @return array|void
1253 1171 */
1254 1172 protected static function handle_addon_action( $installed, $action ) {
1255 1173 if ( ! $installed || ! $action ) {
1256 - return null;
1174 + return;
1257 1175 }
1258 1176
1259 1177 $result = null;
1260 1178 switch ( $action ) {
@@ -1274,9 +1192,8 @@
1274 1192 if ( $result->get_error_code() !== 'no_plugin_header' ) {
1275 1193 if ( wp_doing_ajax() ) {
1276 1194 wp_send_json_error( array( 'error' => $result->get_error_message() ) );
1277 1195 }
1278 -
1279 1196 return array(
1280 1197 'message' => $result->get_error_message(),
1281 1198 'success' => false,
1282 1199 );
@@ -1290,14 +1207,17 @@
1290 1207 * @return array
1291 1208 */
1292 1209 private static function get_addon_activation_response() {
1293 1210 $activating_page = self::get_activating_page();
1294 - $message = $activating_page ? __( 'Your plugin has been activated. Would you like to save and reload the page now?', 'formidable' ) : __( 'Your plugin has been activated.', 'formidable' ); // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
1295 1211
1296 - return array(
1212 + $message = $activating_page ? __( 'Your plugin has been activated. Would you like to save and reload the page now?', 'formidable' ) : __( 'Your plugin has been activated.', 'formidable' );
1213 +
1214 + $response = array(
1297 1215 'message' => $message,
1298 1216 'saveAndReload' => $activating_page,
1299 1217 );
1218 +
1219 + return $response;
1300 1220 }
1301 1221
1302 1222 /**
1303 1223 * Return a string that reflects the page from which the addon is being activated on,
@@ -1306,14 +1226,17 @@
1306 1226 * @return string
1307 1227 */
1308 1228 private static function get_activating_page() {
1309 1229 $referer = FrmAppHelper::get_server_value( 'HTTP_REFERER' );
1230 + if ( false !== strpos( $referer, 'frm_action=settings' ) ) {
1231 + return 'settings';
1232 + }
1310 1233
1311 - if ( str_contains( $referer, 'frm_action=settings' ) ) {
1312 - return 'settings';
1234 + if ( false !== strpos( $referer, 'frm_action=edit' ) ) {
1235 + return 'form_builder';
1313 1236 }
1314 1237
1315 - return str_contains( $referer, 'frm_action=edit' ) ? 'form_builder' : '';
1238 + return '';
1316 1239 }
1317 1240
1318 1241 /**
1319 1242 * Run security checks before installing
@@ -1324,14 +1247,12 @@
1324 1247 */
1325 1248 protected static function install_addon_permissions() {
1326 1249 check_ajax_referer( 'frm_ajax', 'nonce' );
1327 1250
1328 - if ( current_user_can( 'activate_plugins' ) && self::get_current_plugin() ) {
1329 - return;
1251 + if ( ! current_user_can( 'activate_plugins' ) || ! self::get_current_plugin() ) {
1252 + echo json_encode( true );
1253 + wp_die();
1330 1254 }
1331 -
1332 - echo json_encode( true );
1333 - wp_die();
1334 1255 }
1335 1256
1336 1257 /**
1337 1258 * @since 4.08
@@ -1339,14 +1260,12 @@
1339 1260 * @return string
1340 1261 */
1341 1262 public static function connect_link() {
1342 1263 $auth = get_option( 'frm_connect_token' );
1343 -
1344 - if ( ! $auth ) {
1264 + if ( empty( $auth ) ) {
1345 1265 $auth = hash( 'sha512', wp_rand() );
1346 - update_option( 'frm_connect_token', $auth, false );
1266 + update_option( 'frm_connect_token', $auth, 'no' );
1347 1267 }
1348 -
1349 1268 $page = FrmAppHelper::simple_get( 'page', 'sanitize_title', 'formidable-settings' );
1350 1269 $link = 'https://formidableforms.com/api-connect/';
1351 1270 $args = array(
1352 1271 'v' => 2,
@@ -1374,10 +1293,9 @@
1374 1293 $post_url = FrmAppHelper::get_param( 'file_url', '', 'request', 'sanitize_text_field' );
1375 1294
1376 1295 // The download link is not required if already installed.
1377 1296 $is_installed = FrmAppHelper::pro_is_included();
1378 - $file_missing = ! $is_installed && ! $post_url;
1379 -
1297 + $file_missing = ! $is_installed && empty( $post_url );
1380 1298 if ( ! $post_auth || $file_missing ) {
1381 1299 return false;
1382 1300 }
1383 1301
@@ -1382,9 +1300,13 @@
1382 1300 }
1383 1301
1384 1302 // Verify auth.
1385 1303 $auth = get_option( 'frm_connect_token' );
1386 - return $auth && hash_equals( $auth, $post_auth );
1304 + if ( empty( $auth ) || ! hash_equals( $auth, $post_auth ) ) {
1305 + return false;
1306 + }
1307 +
1308 + return true;
1387 1309 }
1388 1310
1389 1311 /**
1390 1312 * Install and/or activate the add-on file.
@@ -1395,17 +1317,17 @@
1395 1317 */
1396 1318 public static function install_addon_api() {
1397 1319 self::$plugin = FrmAppHelper::get_param( 'file_url', '', 'request', 'esc_url_raw' );
1398 1320
1321 + $error = esc_html__( 'Could not install an upgrade. Please download from formidableforms.com and install manually.', 'formidable' );
1322 +
1399 1323 // Delete so cannot replay.
1400 1324 delete_option( 'frm_connect_token' );
1401 1325
1402 1326 // It's already installed and active.
1403 1327 $active = self::activate_plugin( 'formidable-pro/formidable-pro.php', false, false, true );
1404 -
1405 1328 if ( is_wp_error( $active ) ) {
1406 1329 $response = self::maybe_download_and_activate();
1407 -
1408 1330 if ( is_array( $response ) ) {
1409 1331 // The download failed.
1410 1332 return $response;
1411 1333 }
@@ -1411,12 +1333,11 @@
1411 1333 }
1412 1334 }
1413 1335
1414 1336 // If empty license, save it now.
1415 - if ( ! self::get_pro_license() && function_exists( 'load_formidable_pro' ) ) {
1337 + if ( empty( self::get_pro_license() ) && function_exists( 'load_formidable_pro' ) ) {
1416 1338 load_formidable_pro();
1417 1339 $license = stripslashes( FrmAppHelper::get_param( 'key', '', 'request', 'sanitize_text_field' ) );
1418 -
1419 1340 if ( ! $license ) {
1420 1341 return array(
1421 1342 'success' => false,
1422 1343 'error' => 'That site does not have a valid license key.',
@@ -1423,9 +1344,8 @@
1423 1344 );
1424 1345 }
1425 1346
1426 1347 $response = FrmAddon::activate_license_for_plugin( $license, 'formidable_pro' );
1427 -
1428 1348 if ( ! $response['success'] ) {
1429 1349 // Could not activate license.
1430 1350 return $response;
1431 1351 }
@@ -1450,9 +1370,8 @@
1450 1370 }
1451 1371
1452 1372 // Download plugin now.
1453 1373 $response = self::download_and_activate();
1454 -
1455 1374 if ( is_array( $response ) && isset( $response['success'] ) ) {
1456 1375 // The download failed.
1457 1376 return $response;
1458 1377 }
@@ -1466,9 +1385,8 @@
1466 1385 * @since 4.09
1467 1386 *
1468 1387 * @param string $plugin
1469 1388 * @param array|string $upgrade_link_args
1470 - *
1471 1389 * @return void
1472 1390 */
1473 1391 public static function conditional_action_button( $plugin, $upgrade_link_args ) {
1474 1392 if ( is_callable( 'FrmProAddonsController::conditional_action_button' ) ) {
@@ -1503,9 +1421,8 @@
1503 1421 * @type false|string $license_type
1504 1422 * @type string $plan_required
1505 1423 * @type string $upgrade_link
1506 1424 * }
1507 - *
1508 1425 * @return void
1509 1426 */
1510 1427 public static function show_conditional_action_button( $atts ) {
1511 1428 if ( is_callable( 'FrmProAddonsController::show_conditional_action_button' ) ) {
@@ -1523,12 +1440,11 @@
1523 1440 * @param array|string $upgrade_link
1524 1441 *
1525 1442 * @return void
1526 1443 */
1527 - public static function addon_upgrade_link( $addon, $upgrade_link ) {
1444 + protected static function addon_upgrade_link( $addon, $upgrade_link ) {
1528 1445 $atts = is_array( $upgrade_link ) ? $upgrade_link : array();
1529 1446 $upgrade_link = is_array( $upgrade_link ) ? $upgrade_link['link'] : $upgrade_link;
1530 - $text = ! empty( $atts['text'] ) ? $atts['text'] : __( 'Upgrade Now', 'formidable' );
1531 1447
1532 1448 if ( $addon ) {
1533 1449 $upgrade_link .= '&utm_content=' . $addon['slug'];
1534 1450 }
@@ -1538,19 +1454,16 @@
1538 1454 $upgrade_link = FrmAppHelper::admin_upgrade_link( 'addons', $addon['link'] );
1539 1455 }
1540 1456
1541 1457 $class = ! empty( $atts['class'] ) ? $atts['class'] : '';
1542 -
1543 - if ( ! str_contains( $class, 'frm-button' ) ) {
1458 + if ( strpos( $class, 'frm-button' ) === false ) {
1544 1459 $class .= ' frm-button-secondary frm-button-sm';
1545 1460 }
1546 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1547 1461 ?>
1548 - <a class="install-now button <?php echo esc_attr( $class ); ?>" href="<?php echo esc_url( $upgrade_link ); ?>" target="_blank" rel="noopener" aria-label="<?php esc_attr_e( 'Upgrade Now', 'formidable' ); ?>"><?php // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong ?>
1549 - <?php echo esc_html( $text ); ?>
1462 + <a class="install-now button <?php echo esc_attr( $class ); ?>" href="<?php echo esc_url( $upgrade_link ); ?>" target="_blank" rel="noopener" aria-label="<?php esc_attr_e( 'Upgrade Now', 'formidable' ); ?>">
1463 + <?php esc_html_e( 'Upgrade Now', 'formidable' ); ?>
1550 1464 </a>
1551 1465 <?php
1552 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1553 1466 }
1554 1467
1555 1468 /**
1556 1469 * @since 3.04.02
@@ -1560,9 +1473,8 @@
1560 1473 public static function ajax_install_addon() {
1561 1474 self::install_addon_permissions();
1562 1475
1563 1476 $result = self::download_and_activate();
1564 -
1565 1477 if ( isset( $result['success'] ) && ! $result['success'] ) {
1566 1478 echo json_encode( $result );
1567 1479 wp_die();
1568 1480 }
@@ -1595,8 +1507,9 @@
1595 1507 $allowed_url_list = apply_filters( 'frm_allowed_external_urls', $allowed_url_list );
1596 1508
1597 1509 if ( ! is_array( $allowed_url_list ) ) {
1598 1510 _doing_it_wrong( __METHOD__, 'Only an array of URLs could be used within this filter.', '6.3.1' );
1511 +
1599 1512 return array();
1600 1513 }
1601 1514
1602 1515 return $allowed_url_list;
@@ -1606,10 +1519,8 @@
1606 1519 * Gets required plan for an addon.
1607 1520 *
1608 1521 * @since 6.4.2
1609 1522 *
1610 - * @param int|string $addon_id
1611 - *
1612 1523 * @return string Empty string if no plan is required for active license.
1613 1524 */
1614 1525 public static function get_addon_required_plan( $addon_id ) {
1615 1526 $api = new FrmFormApi();
@@ -1620,10 +1531,38 @@
1620 1531 $requires = FrmFormsHelper::get_plan_required( $dates );
1621 1532 }
1622 1533
1623 1534 if ( ! isset( $requires ) || ! is_string( $requires ) ) {
1624 - return '';
1535 + $requires = '';
1625 1536 }
1626 1537
1627 1538 return $requires;
1539 + }
1540 +
1541 + /**
1542 + * @since 4.02.05
1543 + * @deprecated 6.8.3
1544 + *
1545 + * @codeCoverageIgnore
1546 + *
1547 + * @return void
1548 + */
1549 + public static function connect_pro() {
1550 + _deprecated_function( __METHOD__, '6.8.3' );
1551 + }
1552 +
1553 + /**
1554 + * @since 4.08
1555 + * @deprecated 6.11.1
1556 + *
1557 + * @return bool|int false or the number of days until expiration.
1558 + */
1559 + public static function is_license_expiring() {
1560 + _deprecated_function( __METHOD__, '6.11.1', 'FrmProAddonsController::is_license_expiring' );
1561 +
1562 + if ( is_callable( 'FrmProAddonsController::is_license_expiring' ) ) {
1563 + return FrmProAddonsController::is_license_expiring();
1564 + }
1565 +
1566 + return false;
1628 1567 }
1629 1568 }