PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.14.1
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.14.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 +361 -424 6.296.14.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;
@@ -309,8 +120,9 @@
309 120 * @return int Count of addons.
310 121 */
311 122 public static function get_addons_count() {
312 123 $addons = self::get_api_addons();
124 +
313 125 return count( $addons );
314 126 }
315 127
316 128 /**
@@ -316,9 +128,8 @@
316 128 /**
317 129 * If the API is unable to connect, show something on the addons page
318 130 *
319 131 * @since 3.04.03
320 - *
321 132 * @return array
322 133 */
323 134 protected static function fallback_plugin_list() {
324 135 $list = array(
@@ -329,19 +140,19 @@
329 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.',
330 141 ),
331 142 'mailchimp' => array(
332 143 'title' => 'Mailchimp Forms',
333 - '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.',
334 145 ),
335 146 'registration' => array(
336 147 'title' => 'User Registration Forms',
337 148 'link' => 'downloads/user-registration/',
338 - '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.',
339 150 ),
340 151 'paypal' => array(
341 152 'title' => 'PayPal Standard Forms',
342 153 'link' => 'downloads/paypal-standard/',
343 - '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.',
344 155 ),
345 156 'stripe' => array(
346 157 'title' => 'Stripe Forms',
347 158 'docs' => 'knowledgebase/stripe/',
@@ -373,9 +184,9 @@
373 184 'excerpt' => 'Instantly add Bootstrap styling to all your Formidable forms.',
374 185 ),
375 186 'zapier' => array(
376 187 'title' => 'Zapier Forms',
377 - '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.',
378 189 ),
379 190 'signature' => array(
380 191 'title' => 'Digital Signature Forms',
381 192 'excerpt' => 'Add a signature field to your form. The user may write their signature with a trackpad/mouse or just type it.',
@@ -408,9 +219,8 @@
408 219 foreach ( $list as $k => $info ) {
409 220 $info['slug'] = $k;
410 221 $list[ $k ] = array_merge( $defaults, $info );
411 222 }
412 -
413 223 return $list;
414 224 }
415 225
416 226 /**
@@ -416,9 +226,8 @@
416 226 /**
417 227 * If Pro is missing but has been authenticated, include a download URL
418 228 *
419 229 * @since 3.04.03
420 - *
421 230 * @return string
422 231 */
423 232 public static function get_pro_download_url() {
424 233 $license = self::get_pro_license();
@@ -425,20 +234,17 @@
425 234 $api = new FrmFormApi( $license );
426 235 $downloads = $api->get_api_info();
427 236 $pro = self::get_pro_from_addons( $downloads );
428 237
429 - return $pro['url'] ?? '';
238 + return isset( $pro['url'] ) ? $pro['url'] : '';
430 239 }
431 240
432 241 /**
433 242 * @since 4.08
434 - *
435 - * @return string
436 243 */
437 244 public static function get_pro_license() {
438 245 $pro_cred_store = 'frmpro-credentials';
439 246 $pro_wpmu_store = 'frmpro-wpmu-sitewide';
440 -
441 247 if ( is_multisite() && get_site_option( $pro_wpmu_store ) ) {
442 248 $creds = get_site_option( $pro_cred_store );
443 249 } else {
444 250 $creds = get_option( $pro_cred_store );
@@ -448,18 +254,16 @@
448 254 return '';
449 255 }
450 256
451 257 $license = $creds['license'];
452 -
453 - if ( ! $license ) {
258 + if ( empty( $license ) ) {
454 259 return '';
455 260 }
456 261
457 - if ( str_contains( $license, '-' ) ) {
458 - // This is a fix for licenses saved in the past
459 - return strtoupper( $license );
262 + if ( strpos( $license, '-' ) ) {
263 + // this is a fix for licenses saved in the past
264 + $license = strtoupper( $license );
460 265 }
461 -
462 266 return $license;
463 267 }
464 268
465 269 /**
@@ -465,19 +269,16 @@
465 269 /**
466 270 * @since 4.08
467 271 *
468 272 * @param array $addons
469 - *
470 273 * @return array
471 274 */
472 275 protected static function get_pro_from_addons( $addons ) {
473 - return $addons['93790'] ?? array();
276 + return isset( $addons['93790'] ) ? $addons['93790'] : array();
474 277 }
475 278
476 279 /**
477 280 * @since 4.06
478 - *
479 - * @return string
480 281 */
481 282 public static function license_type() {
482 283 if ( is_callable( 'FrmProAddonsController::license_type' ) ) {
483 284 return FrmProAddonsController::license_type();
@@ -492,21 +293,18 @@
492 293 * @return bool
493 294 */
494 295 public static function is_license_expired() {
495 296 $version_info = self::get_primary_license_info();
496 -
497 297 if ( ! isset( $version_info['error'] ) ) {
498 298 return false;
499 299 }
500 300
501 - $expires = $version_info['error']['expires'] ?? 0;
502 -
503 - if ( ! $expires || $expires > time() ) {
301 + $expires = isset( $version_info['error']['expires'] ) ? $version_info['error']['expires'] : 0;
302 + if ( empty( $expires ) || $expires > time() ) {
504 303 return false;
505 304 }
506 305
507 306 $rate_limited = ! empty( $version_info['response_code'] ) && 429 === (int) $version_info['response_code'];
508 -
509 307 if ( $rate_limited ) {
510 308 // Do not return false positives for rate limited responses.
511 309 return false;
512 310 }
@@ -521,13 +319,11 @@
521 319 * @return array|false
522 320 */
523 321 public static function get_primary_license_info() {
524 322 $installed_addons = apply_filters( 'frm_installed_addons', array() );
525 -
526 - if ( ! $installed_addons || ! isset( $installed_addons['formidable_pro'] ) ) {
323 + if ( empty( $installed_addons ) || ! isset( $installed_addons['formidable_pro'] ) ) {
527 324 return false;
528 325 }
529 -
530 326 $installed_addons = array(
531 327 'formidable_pro' => $installed_addons['formidable_pro'],
532 328 );
533 329
@@ -535,12 +331,8 @@
535 331 }
536 332
537 333 /**
538 334 * @since 3.04.03
539 - *
540 - * @param mixed $transient
541 - *
542 - * @return object
543 335 */
544 336 public static function check_update( $transient ) {
545 337 if ( ! FrmAppHelper::pro_is_installed() ) {
546 338 // Don't make any changes if only Lite is installed.
@@ -551,10 +343,9 @@
551 343 $transient = new stdClass();
552 344 }
553 345
554 346 $installed_addons = apply_filters( 'frm_installed_addons', array() );
555 -
556 - if ( ! $installed_addons ) {
347 + if ( empty( $installed_addons ) ) {
557 348 return $transient;
558 349 }
559 350
560 351 $version_info = self::fill_update_addon_info( $installed_addons );
@@ -568,20 +359,19 @@
568 359 continue;
569 360 }
570 361
571 362 $folder = $plugin->plugin;
572 -
573 - if ( ! $folder ) {
363 + if ( empty( $folder ) ) {
574 364 continue;
575 365 }
576 366
577 367 if ( ! self::is_installed( $folder ) ) {
578 - // Don't show an update if the plugin isn't installed
368 + // don't show an update if the plugin isn't installed
579 369 continue;
580 370 }
581 371
582 - $wp_plugin = $wp_plugins[ $folder ] ?? array();
583 - $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';
584 374 $plugin->slug = explode( '/', $folder )[0];
585 375
586 376 if ( version_compare( $wp_version, $plugin->new_version, '<' ) ) {
587 377 $transient->response[ $folder ] = $plugin;
@@ -589,8 +379,9 @@
589 379 $transient->no_update[ $folder ] = $plugin;
590 380 }
591 381
592 382 $transient->checked[ $folder ] = $wp_version;
383 +
593 384 }//end foreach
594 385
595 386 return $transient;
596 387 }
@@ -600,9 +391,8 @@
600 391 * Because this gets called on "pre_set_site_transient_update_plugins" an old version of FrmAppHelper may be loaded on plugin update.
601 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.
602 393 *
603 394 * @since 5.5.2
604 - *
605 395 * @return array
606 396 */
607 397 protected static function get_plugins() {
608 398 if ( ! function_exists( 'get_plugins' ) ) {
@@ -637,49 +427,43 @@
637 427 $version_info = array();
638 428
639 429 foreach ( $installed_addons as $addon ) {
640 430 if ( $addon->store_url !== 'https://formidableforms.com' ) {
641 - // Check if this is a third-party addon
431 + // check if this is a third-party addon
642 432 continue;
643 433 }
644 434
645 435 $new_license = $addon->license;
646 -
647 - if ( ! $new_license || in_array( $new_license, $checked_licenses, true ) ) {
436 + if ( empty( $new_license ) || in_array( $new_license, $checked_licenses ) ) {
648 437 continue;
649 438 }
650 439
651 440 $checked_licenses[] = $new_license;
652 - $api = new FrmFormApi( $new_license );
653 441
654 - if ( ! $version_info ) {
442 + $api = new FrmFormApi( $new_license );
443 + if ( empty( $version_info ) ) {
655 444 $version_info = $api->get_api_info();
656 445 continue;
657 446 }
658 447
659 448 $plugin = $api->get_addon_for_license( $addon, $version_info );
660 -
661 - if ( ! $plugin ) {
449 + if ( empty( $plugin ) ) {
662 450 continue;
663 451 }
664 452
665 - $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();
666 457
667 - if ( ! $download_id || isset( $version_info[ $download_id ]['package'] ) ) {
668 - 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 + }
669 465 }
670 -
671 - // If this addon is using its own license, get the update url
672 - $addon_info = $api->get_api_info();
673 -
674 - $version_info[ $download_id ] = $addon_info[ $download_id ];
675 -
676 - if ( isset( $addon_info['error'] ) ) {
677 - $version_info[ $download_id ]['error'] = array(
678 - 'message' => $addon_info['error']['message'],
679 - 'code' => $addon_info['error']['code'],
680 - );
681 - }
682 466 }//end foreach
683 467
684 468 return $version_info;
685 469 }
@@ -687,11 +471,9 @@
687 471 /**
688 472 * Get the action link for an addon that isn't active.
689 473 *
690 474 * @since 3.06.03
691 - *
692 475 * @param string $plugin The plugin slug.
693 - *
694 476 * @return array
695 477 */
696 478 public static function install_link( $plugin ) {
697 479 $link = array();
@@ -713,9 +495,9 @@
713 495 'categories' => $addon['categories'],
714 496 );
715 497 }
716 498
717 - if ( $link ) {
499 + if ( ! empty( $link ) ) {
718 500 $link['status'] = $addon['status']['type'];
719 501 }
720 502 } elseif ( current_user_can( 'activate_plugins' ) && self::is_installed( 'formidable-' . $plugin . '/formidable-' . $plugin . '.php' ) ) {
721 503 $link = array(
@@ -727,81 +509,34 @@
727 509 return $link;
728 510 }
729 511
730 512 /**
731 - * Get the JSON-encoded install data for a plugin update.
732 - *
733 - * @since 6.29
734 - *
735 - * @param string $addon_slug The addon slug (e.g. 'pro', 'dates').
736 - *
737 - * @return string JSON-encoded install data, or empty string if no URL is available.
738 - */
739 - public static function get_update_install_data( $addon_slug ) {
740 - $upgrading = self::install_link( $addon_slug );
741 -
742 - if ( isset( $upgrading['class'] ) && 'frm-install-addon' === $upgrading['class'] ) {
743 - return (string) json_encode( $upgrading );
744 - }
745 -
746 - if ( 'pro' === $addon_slug ) {
747 - $download_url = self::get_pro_download_url();
748 - $plugin_file = 'formidable-pro/formidable-pro.php';
749 - } else {
750 - $addon_data = self::get_addon( $addon_slug );
751 - $download_url = $addon_data && ! empty( $addon_data['url'] ) ? $addon_data['url'] : '';
752 - $plugin_file = $addon_data && ! empty( $addon_data['plugin'] ) ? $addon_data['plugin'] : 'formidable-' . $addon_slug . '/formidable-' . $addon_slug . '.php';
753 - }
754 -
755 - if ( ! $download_url ) {
756 - $update_plugins = get_site_transient( 'update_plugins' );
757 - $plugin_update = $update_plugins->response[ $plugin_file ] ?? null;
758 - $download_url = $plugin_update && ! empty( $plugin_update->package ) ? $plugin_update->package : '';
759 - }
760 -
761 - return $download_url ? (string) json_encode(
762 - array(
763 - 'url' => $download_url,
764 - 'class' => 'frm-install-addon',
765 - )
766 - ) : '';
767 - }
768 -
769 - /**
770 513 * @since 4.09
771 - *
772 514 * @param string $plugin The plugin slug.
773 - *
774 515 * @return array|false
775 516 */
776 517 public static function get_addon( $plugin ) {
777 518 $addons = self::get_api_addons();
778 519 self::prepare_addons( $addons );
779 -
780 520 foreach ( $addons as $addon ) {
781 521 $slug = explode( '/', $addon['plugin'] );
782 -
783 522 if ( $slug[0] === 'formidable-' . $plugin ) {
784 523 return $addon;
785 524 }
786 525 }
787 -
788 526 return false;
789 527 }
790 528
791 529 /**
792 530 * @since 4.09
793 - *
794 531 * @return string
795 532 */
796 533 protected static function get_license_type() {
797 534 $license_type = '';
798 535 $addons = self::get_api_addons();
799 -
800 536 if ( isset( $addons['error'] ) && isset( $addons['error']['type'] ) ) {
801 - return $addons['error']['type'];
537 + $license_type = $addons['error']['type'];
802 538 }
803 -
804 539 return $license_type;
805 540 }
806 541
807 542 /**
@@ -814,12 +549,11 @@
814 549 */
815 550 public static function get_addon_for_license( $addons, $license ) {
816 551 $download_id = $license->download_id;
817 552 $plugin = array();
818 -
819 - if ( ! $download_id && $addons ) {
553 + if ( empty( $download_id ) && ! empty( $addons ) ) {
820 554 foreach ( $addons as $addon ) {
821 - if ( 0 === strcasecmp( $license->plugin_name, $addon['title'] ) ) {
555 + if ( strtolower( $license->plugin_name ) === strtolower( $addon['title'] ) ) {
822 556 return $addon;
823 557 }
824 558 }
825 559 } elseif ( isset( $addons[ $download_id ] ) ) {
@@ -829,33 +563,29 @@
829 563 return $plugin;
830 564 }
831 565
832 566 /**
833 - * @param array $addons
834 - *
835 567 * @return void
836 568 */
837 569 protected static function prepare_addons( &$addons ) {
838 - // Reset categories to prevent count accumulation across multiple calls.
839 - self::$categories = array();
840 -
841 570 $activate_url = '';
842 -
843 571 if ( current_user_can( 'activate_plugins' ) ) {
844 572 $activate_url = add_query_arg( array( 'action' => 'activate' ), admin_url( 'plugins.php' ) );
845 573 }
846 574
847 575 $loop_addons = $addons;
848 -
849 576 foreach ( $loop_addons as $id => $addon ) {
850 577 if ( is_numeric( $id ) ) {
851 578 $slug = str_replace( array( '-wordpress-plugin', '-wordpress' ), '', $addon['slug'] );
852 579 $file_name = $addon['plugin'];
853 580 } else {
854 - $slug = $id;
855 - $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 + }
856 587 $file_name = $base_file . '/' . $base_file . '.php';
857 -
858 588 if ( ! isset( $addon['plugin'] ) ) {
859 589 $addon['plugin'] = $file_name;
860 590 }
861 591 }
@@ -860,17 +590,10 @@
860 590 }
861 591 }
862 592
863 593 $addon['installed'] = self::is_installed( $file_name );
864 -
865 - if ( 'highrise' === $slug && ! $addon['installed'] ) {
866 - unset( $addons[ $id ] );
867 - continue;
868 - }
869 -
870 594 if ( $addon['installed'] && 'formidable-views/formidable-views.php' === $file_name ) {
871 595 $active_views_version = self::get_active_views_version();
872 -
873 596 if ( false !== $active_views_version && $slug !== $active_views_version ) {
874 597 $addon['installed'] = false;
875 598 }
876 599 }
@@ -876,9 +599,9 @@
876 599 }
877 600
878 601 $addon['activate_url'] = '';
879 602
880 - 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 ) ) {
881 604 $addon['activate_url'] = add_query_arg(
882 605 array(
883 606 '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $file_name ),
884 607 'plugin' => $file_name,
@@ -894,21 +617,16 @@
894 617
895 618 if ( ! isset( $addon['link'] ) ) {
896 619 $addon['link'] = 'downloads/' . $slug . '/';
897 620 }
621 + self::prepare_addon_link( $addon['link'] );
898 622
899 - self::prepare_addon_link( $addon['link'] );
900 623 self::set_addon_status( $addon );
901 - self::set_categories( $addon );
902 -
903 624 $addons[ $id ] = $addon;
904 625 }//end foreach
905 626 }
906 627
907 628 /**
908 - * @param string $file_name
909 - * @param string $slug
910 - *
911 629 * @return bool
912 630 */
913 631 private static function is_plugin_active( $file_name, $slug ) {
914 632 if ( 'formidable-views/formidable-views.php' === $file_name ) {
@@ -923,9 +641,8 @@
923 641 private static function get_active_views_version() {
924 642 if ( ! is_callable( 'FrmViewsAppHelper::plugin_version' ) ) {
925 643 return false;
926 644 }
927 -
928 645 $plugin_version = FrmViewsAppHelper::plugin_version();
929 646 return version_compare( $plugin_version, '5.0', '>=' ) ? 'visual-views' : 'views';
930 647 }
931 648
@@ -931,25 +648,22 @@
931 648
932 649 /**
933 650 * @since 3.04.02
934 651 *
935 - * @param string $link
936 - *
937 652 * @return void
938 653 */
939 654 protected static function prepare_addon_link( &$link ) {
940 655 $site_url = 'https://formidableforms.com/';
941 -
942 - if ( ! str_starts_with( $link, 'http' ) ) {
656 + if ( strpos( $link, 'http' ) !== 0 ) {
943 657 $link = $site_url . $link;
944 658 }
945 -
946 - $link = FrmAppHelper::make_affiliate_url( $link );
947 -
948 - $utm = array(
949 - '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',
950 664 );
951 - $link = FrmAppHelper::maybe_add_missing_utm( $link, $utm );
665 + $link = add_query_arg( $query_args, $link );
952 666 }
953 667
954 668 /**
955 669 * Add the status to the addon array. Status options are:
@@ -956,10 +670,8 @@
956 670 * installed, active, not installed
957 671 *
958 672 * @since 3.04.02
959 673 *
960 - * @param array $addon
961 - *
962 674 * @return void
963 675 */
964 676 protected static function set_addon_status( &$addon ) {
965 677 if ( ! empty( $addon['activate_url'] ) ) {
@@ -980,8 +692,218 @@
980 692 }
981 693 }
982 694
983 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 + /**
984 906 * @since 5.5.2
985 907 *
986 908 * @param string $plugin
987 909 * @param string $redirect
@@ -986,9 +908,8 @@
986 908 * @param string $plugin
987 909 * @param string $redirect
988 910 * @param bool $network_wide
989 911 * @param bool $silent
990 - *
991 912 * @return WP_Error|null Null on success, WP_Error on invalid file.
992 913 */
993 914 protected static function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silent = false ) {
994 915 if ( ! function_exists( 'activate_plugin' ) ) {
@@ -1003,9 +924,8 @@
1003 924 * @since 6.8
1004 925 *
1005 926 * @param string $plugin
1006 927 * @param bool $silent
1007 - *
1008 928 * @return void
1009 929 */
1010 930 protected static function deactivate_plugin( $plugin, $silent = false ) {
1011 931 if ( ! function_exists( 'deactivate_plugins' ) ) {
@@ -1019,9 +939,8 @@
1019 939 *
1020 940 * @since 6.8
1021 941 *
1022 942 * @param string $plugin
1023 - *
1024 943 * @return true|WP_Error True on success, WP_Error on invalid file.
1025 944 */
1026 945 protected static function uninstall_plugin( $plugin ) {
1027 946 if ( ! current_user_can( 'delete_plugins' ) ) {
@@ -1034,9 +953,13 @@
1034 953
1035 954 self::deactivate_plugin( $plugin, true );
1036 955 $result = delete_plugins( array( $plugin ) );
1037 956
1038 - return is_wp_error( $result ) ? $result : true;
957 + if ( is_wp_error( $result ) ) {
958 + return $result;
959 + }
960 +
961 + return true;
1039 962 }
1040 963
1041 964 /**
1042 965 * @since 5.0.10
@@ -1043,9 +966,9 @@
1043 966 *
1044 967 * @return string
1045 968 */
1046 969 protected static function get_current_plugin() {
1047 - if ( ! self::$plugin ) {
970 + if ( empty( self::$plugin ) ) {
1048 971 self::$plugin = FrmAppHelper::get_param( 'plugin', '', 'post', 'esc_url_raw' );
1049 972 }
1050 973 return self::$plugin;
1051 974 }
@@ -1052,9 +975,9 @@
1052 975
1053 976 /**
1054 977 * @since 4.08
1055 978 *
1056 - * @return mixed[]|null
979 + * @return array|void
1057 980 */
1058 981 protected static function download_and_activate() {
1059 982 if ( is_admin() ) {
1060 983 FrmAppHelper::set_current_screen_and_hook_suffix();
@@ -1062,14 +985,12 @@
1062 985
1063 986 self::maybe_show_cred_form();
1064 987
1065 988 $installed = self::install_addon();
1066 -
1067 989 if ( is_array( $installed ) && isset( $installed['message'] ) ) {
1068 990 return $installed;
1069 991 }
1070 992 self::handle_addon_action( $installed, 'activate' );
1071 - return null;
1072 993 }
1073 994
1074 995 /**
1075 996 * @since 3.04.02
@@ -1080,9 +1001,9 @@
1080 1001 if ( ! function_exists( 'request_filesystem_credentials' ) ) {
1081 1002 include_once ABSPATH . 'wp-admin/includes/file.php';
1082 1003 }
1083 1004
1084 - // 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.
1085 1006 ob_start();
1086 1007
1087 1008 $show_form = false;
1088 1009 $method = '';
@@ -1099,8 +1020,9 @@
1099 1020
1100 1021 if ( $show_form ) {
1101 1022 $form = ob_get_clean();
1102 1023 $message = __( 'Sorry, your site requires FTP authentication. Please download plugins from FormidableForms.com and install them manually.', 'formidable' );
1024 + $data = $form;
1103 1025 $response = array(
1104 1026 'success' => false,
1105 1027 'message' => $message,
1106 1028 'form' => $form,
@@ -1128,10 +1050,8 @@
1128 1050 * We do not need any extra credentials if we have gotten this far,
1129 1051 * so let's install the plugin.
1130 1052 *
1131 1053 * @since 3.04.02
1132 - *
1133 - * @return array|string
1134 1054 */
1135 1055 protected static function install_addon() {
1136 1056 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
1137 1057
@@ -1145,15 +1065,14 @@
1145 1065 }
1146 1066
1147 1067 // Create the plugin upgrader with our custom skin.
1148 1068 $installer = new Plugin_Upgrader( new FrmInstallerSkin() );
1149 - $installer->install( $download_url, array( 'overwrite_package' => true ) );
1069 + $installer->install( $download_url );
1150 1070
1151 1071 // Flush the cache and return the newly installed plugin basename.
1152 1072 wp_cache_flush();
1153 1073
1154 1074 $plugin = $installer->plugin_info();
1155 -
1156 1075 if ( ! $plugin ) {
1157 1076 return array(
1158 1077 'message' => 'Plugin was not installed. ' . $installer->result,
1159 1078 'success' => false,
@@ -1158,9 +1077,8 @@
1158 1077 'message' => 'Plugin was not installed. ' . $installer->result,
1159 1078 'success' => false,
1160 1079 );
1161 1080 }
1162 -
1163 1081 return $plugin;
1164 1082 }
1165 1083
1166 1084 /**
@@ -1224,9 +1142,8 @@
1224 1142 * @since 6.8
1225 1143 *
1226 1144 * @param callable $action_callback The specific add-on action to be executed.
1227 1145 * @param callable|null $response_callback Optional. The response handling callback. Default null.
1228 - *
1229 1146 * @return void
1230 1147 */
1231 1148 private static function process_addon_action( $action_callback, $response_callback = null ) {
1232 1149 self::install_addon_permissions();
@@ -1249,14 +1166,13 @@
1249 1166 * @since 6.8
1250 1167 *
1251 1168 * @param string $installed The plugin folder name with file name.
1252 1169 * @param string $action The action type ('activate', 'deactivate', 'uninstall').
1253 - *
1254 - * @return mixed[]|null
1170 + * @return array|void
1255 1171 */
1256 1172 protected static function handle_addon_action( $installed, $action ) {
1257 1173 if ( ! $installed || ! $action ) {
1258 - return null;
1174 + return;
1259 1175 }
1260 1176
1261 1177 $result = null;
1262 1178 switch ( $action ) {
@@ -1276,9 +1192,8 @@
1276 1192 if ( $result->get_error_code() !== 'no_plugin_header' ) {
1277 1193 if ( wp_doing_ajax() ) {
1278 1194 wp_send_json_error( array( 'error' => $result->get_error_message() ) );
1279 1195 }
1280 -
1281 1196 return array(
1282 1197 'message' => $result->get_error_message(),
1283 1198 'success' => false,
1284 1199 );
@@ -1292,14 +1207,17 @@
1292 1207 * @return array
1293 1208 */
1294 1209 private static function get_addon_activation_response() {
1295 1210 $activating_page = self::get_activating_page();
1296 - $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
1297 1211
1298 - 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(
1299 1215 'message' => $message,
1300 1216 'saveAndReload' => $activating_page,
1301 1217 );
1218 +
1219 + return $response;
1302 1220 }
1303 1221
1304 1222 /**
1305 1223 * Return a string that reflects the page from which the addon is being activated on,
@@ -1308,14 +1226,17 @@
1308 1226 * @return string
1309 1227 */
1310 1228 private static function get_activating_page() {
1311 1229 $referer = FrmAppHelper::get_server_value( 'HTTP_REFERER' );
1230 + if ( false !== strpos( $referer, 'frm_action=settings' ) ) {
1231 + return 'settings';
1232 + }
1312 1233
1313 - if ( str_contains( $referer, 'frm_action=settings' ) ) {
1314 - return 'settings';
1234 + if ( false !== strpos( $referer, 'frm_action=edit' ) ) {
1235 + return 'form_builder';
1315 1236 }
1316 1237
1317 - return str_contains( $referer, 'frm_action=edit' ) ? 'form_builder' : '';
1238 + return '';
1318 1239 }
1319 1240
1320 1241 /**
1321 1242 * Run security checks before installing
@@ -1326,14 +1247,12 @@
1326 1247 */
1327 1248 protected static function install_addon_permissions() {
1328 1249 check_ajax_referer( 'frm_ajax', 'nonce' );
1329 1250
1330 - if ( current_user_can( 'activate_plugins' ) && self::get_current_plugin() ) {
1331 - return;
1251 + if ( ! current_user_can( 'activate_plugins' ) || ! self::get_current_plugin() ) {
1252 + echo json_encode( true );
1253 + wp_die();
1332 1254 }
1333 -
1334 - echo json_encode( true );
1335 - wp_die();
1336 1255 }
1337 1256
1338 1257 /**
1339 1258 * @since 4.08
@@ -1341,14 +1260,12 @@
1341 1260 * @return string
1342 1261 */
1343 1262 public static function connect_link() {
1344 1263 $auth = get_option( 'frm_connect_token' );
1345 -
1346 - if ( ! $auth ) {
1264 + if ( empty( $auth ) ) {
1347 1265 $auth = hash( 'sha512', wp_rand() );
1348 - update_option( 'frm_connect_token', $auth, false );
1266 + update_option( 'frm_connect_token', $auth, 'no' );
1349 1267 }
1350 -
1351 1268 $page = FrmAppHelper::simple_get( 'page', 'sanitize_title', 'formidable-settings' );
1352 1269 $link = 'https://formidableforms.com/api-connect/';
1353 1270 $args = array(
1354 1271 'v' => 2,
@@ -1376,10 +1293,9 @@
1376 1293 $post_url = FrmAppHelper::get_param( 'file_url', '', 'request', 'sanitize_text_field' );
1377 1294
1378 1295 // The download link is not required if already installed.
1379 1296 $is_installed = FrmAppHelper::pro_is_included();
1380 - $file_missing = ! $is_installed && ! $post_url;
1381 -
1297 + $file_missing = ! $is_installed && empty( $post_url );
1382 1298 if ( ! $post_auth || $file_missing ) {
1383 1299 return false;
1384 1300 }
1385 1301
@@ -1384,9 +1300,13 @@
1384 1300 }
1385 1301
1386 1302 // Verify auth.
1387 1303 $auth = get_option( 'frm_connect_token' );
1388 - return $auth && hash_equals( $auth, $post_auth );
1304 + if ( empty( $auth ) || ! hash_equals( $auth, $post_auth ) ) {
1305 + return false;
1306 + }
1307 +
1308 + return true;
1389 1309 }
1390 1310
1391 1311 /**
1392 1312 * Install and/or activate the add-on file.
@@ -1397,17 +1317,17 @@
1397 1317 */
1398 1318 public static function install_addon_api() {
1399 1319 self::$plugin = FrmAppHelper::get_param( 'file_url', '', 'request', 'esc_url_raw' );
1400 1320
1321 + $error = esc_html__( 'Could not install an upgrade. Please download from formidableforms.com and install manually.', 'formidable' );
1322 +
1401 1323 // Delete so cannot replay.
1402 1324 delete_option( 'frm_connect_token' );
1403 1325
1404 1326 // It's already installed and active.
1405 1327 $active = self::activate_plugin( 'formidable-pro/formidable-pro.php', false, false, true );
1406 -
1407 1328 if ( is_wp_error( $active ) ) {
1408 1329 $response = self::maybe_download_and_activate();
1409 -
1410 1330 if ( is_array( $response ) ) {
1411 1331 // The download failed.
1412 1332 return $response;
1413 1333 }
@@ -1413,12 +1333,11 @@
1413 1333 }
1414 1334 }
1415 1335
1416 1336 // If empty license, save it now.
1417 - if ( ! self::get_pro_license() && function_exists( 'load_formidable_pro' ) ) {
1337 + if ( empty( self::get_pro_license() ) && function_exists( 'load_formidable_pro' ) ) {
1418 1338 load_formidable_pro();
1419 1339 $license = stripslashes( FrmAppHelper::get_param( 'key', '', 'request', 'sanitize_text_field' ) );
1420 -
1421 1340 if ( ! $license ) {
1422 1341 return array(
1423 1342 'success' => false,
1424 1343 'error' => 'That site does not have a valid license key.',
@@ -1425,9 +1344,8 @@
1425 1344 );
1426 1345 }
1427 1346
1428 1347 $response = FrmAddon::activate_license_for_plugin( $license, 'formidable_pro' );
1429 -
1430 1348 if ( ! $response['success'] ) {
1431 1349 // Could not activate license.
1432 1350 return $response;
1433 1351 }
@@ -1452,9 +1370,8 @@
1452 1370 }
1453 1371
1454 1372 // Download plugin now.
1455 1373 $response = self::download_and_activate();
1456 -
1457 1374 if ( is_array( $response ) && isset( $response['success'] ) ) {
1458 1375 // The download failed.
1459 1376 return $response;
1460 1377 }
@@ -1468,9 +1385,8 @@
1468 1385 * @since 4.09
1469 1386 *
1470 1387 * @param string $plugin
1471 1388 * @param array|string $upgrade_link_args
1472 - *
1473 1389 * @return void
1474 1390 */
1475 1391 public static function conditional_action_button( $plugin, $upgrade_link_args ) {
1476 1392 if ( is_callable( 'FrmProAddonsController::conditional_action_button' ) ) {
@@ -1505,9 +1421,8 @@
1505 1421 * @type false|string $license_type
1506 1422 * @type string $plan_required
1507 1423 * @type string $upgrade_link
1508 1424 * }
1509 - *
1510 1425 * @return void
1511 1426 */
1512 1427 public static function show_conditional_action_button( $atts ) {
1513 1428 if ( is_callable( 'FrmProAddonsController::show_conditional_action_button' ) ) {
@@ -1525,12 +1440,11 @@
1525 1440 * @param array|string $upgrade_link
1526 1441 *
1527 1442 * @return void
1528 1443 */
1529 - public static function addon_upgrade_link( $addon, $upgrade_link ) {
1444 + protected static function addon_upgrade_link( $addon, $upgrade_link ) {
1530 1445 $atts = is_array( $upgrade_link ) ? $upgrade_link : array();
1531 1446 $upgrade_link = is_array( $upgrade_link ) ? $upgrade_link['link'] : $upgrade_link;
1532 - $text = ! empty( $atts['text'] ) ? $atts['text'] : __( 'Upgrade Now', 'formidable' );
1533 1447
1534 1448 if ( $addon ) {
1535 1449 $upgrade_link .= '&utm_content=' . $addon['slug'];
1536 1450 }
@@ -1540,19 +1454,16 @@
1540 1454 $upgrade_link = FrmAppHelper::admin_upgrade_link( 'addons', $addon['link'] );
1541 1455 }
1542 1456
1543 1457 $class = ! empty( $atts['class'] ) ? $atts['class'] : '';
1544 -
1545 - if ( ! str_contains( $class, 'frm-button' ) ) {
1458 + if ( strpos( $class, 'frm-button' ) === false ) {
1546 1459 $class .= ' frm-button-secondary frm-button-sm';
1547 1460 }
1548 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1549 1461 ?>
1550 - <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 ?>
1551 - <?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' ); ?>
1552 1464 </a>
1553 1465 <?php
1554 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1555 1466 }
1556 1467
1557 1468 /**
1558 1469 * @since 3.04.02
@@ -1562,9 +1473,8 @@
1562 1473 public static function ajax_install_addon() {
1563 1474 self::install_addon_permissions();
1564 1475
1565 1476 $result = self::download_and_activate();
1566 -
1567 1477 if ( isset( $result['success'] ) && ! $result['success'] ) {
1568 1478 echo json_encode( $result );
1569 1479 wp_die();
1570 1480 }
@@ -1597,8 +1507,9 @@
1597 1507 $allowed_url_list = apply_filters( 'frm_allowed_external_urls', $allowed_url_list );
1598 1508
1599 1509 if ( ! is_array( $allowed_url_list ) ) {
1600 1510 _doing_it_wrong( __METHOD__, 'Only an array of URLs could be used within this filter.', '6.3.1' );
1511 +
1601 1512 return array();
1602 1513 }
1603 1514
1604 1515 return $allowed_url_list;
@@ -1608,10 +1519,8 @@
1608 1519 * Gets required plan for an addon.
1609 1520 *
1610 1521 * @since 6.4.2
1611 1522 *
1612 - * @param int|string $addon_id
1613 - *
1614 1523 * @return string Empty string if no plan is required for active license.
1615 1524 */
1616 1525 public static function get_addon_required_plan( $addon_id ) {
1617 1526 $api = new FrmFormApi();
@@ -1622,10 +1531,38 @@
1622 1531 $requires = FrmFormsHelper::get_plan_required( $dates );
1623 1532 }
1624 1533
1625 1534 if ( ! isset( $requires ) || ! is_string( $requires ) ) {
1626 - return '';
1535 + $requires = '';
1627 1536 }
1628 1537
1629 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;
1630 1567 }
1631 1568 }