PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.10
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.10
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 +358 -424 6.296.10 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 }
@@ -515,8 +313,21 @@
515 313 }
516 314
517 315 /**
518 316 * @since 4.08
317 + *
318 + * @return bool|int false or the number of days until expiration.
319 + */
320 + public static function is_license_expiring() {
321 + if ( is_callable( 'FrmProAddonsController::is_license_expiring' ) ) {
322 + return FrmProAddonsController::is_license_expiring();
323 + }
324 +
325 + return false;
326 + }
327 +
328 + /**
329 + * @since 4.08
519 330 * @since 6.7 This is public.
520 331 *
521 332 * @return array|false
522 333 */
@@ -521,13 +332,11 @@
521 332 * @return array|false
522 333 */
523 334 public static function get_primary_license_info() {
524 335 $installed_addons = apply_filters( 'frm_installed_addons', array() );
525 -
526 - if ( ! $installed_addons || ! isset( $installed_addons['formidable_pro'] ) ) {
336 + if ( empty( $installed_addons ) || ! isset( $installed_addons['formidable_pro'] ) ) {
527 337 return false;
528 338 }
529 -
530 339 $installed_addons = array(
531 340 'formidable_pro' => $installed_addons['formidable_pro'],
532 341 );
533 342
@@ -535,12 +344,8 @@
535 344 }
536 345
537 346 /**
538 347 * @since 3.04.03
539 - *
540 - * @param mixed $transient
541 - *
542 - * @return object
543 348 */
544 349 public static function check_update( $transient ) {
545 350 if ( ! FrmAppHelper::pro_is_installed() ) {
546 351 // Don't make any changes if only Lite is installed.
@@ -551,10 +356,9 @@
551 356 $transient = new stdClass();
552 357 }
553 358
554 359 $installed_addons = apply_filters( 'frm_installed_addons', array() );
555 -
556 - if ( ! $installed_addons ) {
360 + if ( empty( $installed_addons ) ) {
557 361 return $transient;
558 362 }
559 363
560 364 $version_info = self::fill_update_addon_info( $installed_addons );
@@ -568,20 +372,19 @@
568 372 continue;
569 373 }
570 374
571 375 $folder = $plugin->plugin;
572 -
573 - if ( ! $folder ) {
376 + if ( empty( $folder ) ) {
574 377 continue;
575 378 }
576 379
577 380 if ( ! self::is_installed( $folder ) ) {
578 - // Don't show an update if the plugin isn't installed
381 + // don't show an update if the plugin isn't installed
579 382 continue;
580 383 }
581 384
582 - $wp_plugin = $wp_plugins[ $folder ] ?? array();
583 - $wp_version = $wp_plugin['Version'] ?? '1.0';
385 + $wp_plugin = isset( $wp_plugins[ $folder ] ) ? $wp_plugins[ $folder ] : array();
386 + $wp_version = isset( $wp_plugin['Version'] ) ? $wp_plugin['Version'] : '1.0';
584 387 $plugin->slug = explode( '/', $folder )[0];
585 388
586 389 if ( version_compare( $wp_version, $plugin->new_version, '<' ) ) {
587 390 $transient->response[ $folder ] = $plugin;
@@ -589,8 +392,9 @@
589 392 $transient->no_update[ $folder ] = $plugin;
590 393 }
591 394
592 395 $transient->checked[ $folder ] = $wp_version;
396 +
593 397 }//end foreach
594 398
595 399 return $transient;
596 400 }
@@ -600,9 +404,8 @@
600 404 * Because this gets called on "pre_set_site_transient_update_plugins" an old version of FrmAppHelper may be loaded on plugin update.
601 405 * 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 406 *
603 407 * @since 5.5.2
604 - *
605 408 * @return array
606 409 */
607 410 protected static function get_plugins() {
608 411 if ( ! function_exists( 'get_plugins' ) ) {
@@ -637,49 +440,43 @@
637 440 $version_info = array();
638 441
639 442 foreach ( $installed_addons as $addon ) {
640 443 if ( $addon->store_url !== 'https://formidableforms.com' ) {
641 - // Check if this is a third-party addon
444 + // check if this is a third-party addon
642 445 continue;
643 446 }
644 447
645 448 $new_license = $addon->license;
646 -
647 - if ( ! $new_license || in_array( $new_license, $checked_licenses, true ) ) {
449 + if ( empty( $new_license ) || in_array( $new_license, $checked_licenses ) ) {
648 450 continue;
649 451 }
650 452
651 453 $checked_licenses[] = $new_license;
652 - $api = new FrmFormApi( $new_license );
653 454
654 - if ( ! $version_info ) {
455 + $api = new FrmFormApi( $new_license );
456 + if ( empty( $version_info ) ) {
655 457 $version_info = $api->get_api_info();
656 458 continue;
657 459 }
658 460
659 461 $plugin = $api->get_addon_for_license( $addon, $version_info );
660 -
661 - if ( ! $plugin ) {
462 + if ( empty( $plugin ) ) {
662 463 continue;
663 464 }
664 465
665 - $download_id = $plugin['id'] ?? 0;
466 + $download_id = isset( $plugin['id'] ) ? $plugin['id'] : 0;
467 + if ( ! empty( $download_id ) && ! isset( $version_info[ $download_id ]['package'] ) ) {
468 + // if this addon is using its own license, get the update url
469 + $addon_info = $api->get_api_info();
666 470
667 - if ( ! $download_id || isset( $version_info[ $download_id ]['package'] ) ) {
668 - continue;
471 + $version_info[ $download_id ] = $addon_info[ $download_id ];
472 + if ( isset( $addon_info['error'] ) ) {
473 + $version_info[ $download_id ]['error'] = array(
474 + 'message' => $addon_info['error']['message'],
475 + 'code' => $addon_info['error']['code'],
476 + );
477 + }
669 478 }
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 479 }//end foreach
683 480
684 481 return $version_info;
685 482 }
@@ -687,11 +484,9 @@
687 484 /**
688 485 * Get the action link for an addon that isn't active.
689 486 *
690 487 * @since 3.06.03
691 - *
692 488 * @param string $plugin The plugin slug.
693 - *
694 489 * @return array
695 490 */
696 491 public static function install_link( $plugin ) {
697 492 $link = array();
@@ -713,9 +508,9 @@
713 508 'categories' => $addon['categories'],
714 509 );
715 510 }
716 511
717 - if ( $link ) {
512 + if ( ! empty( $link ) ) {
718 513 $link['status'] = $addon['status']['type'];
719 514 }
720 515 } elseif ( current_user_can( 'activate_plugins' ) && self::is_installed( 'formidable-' . $plugin . '/formidable-' . $plugin . '.php' ) ) {
721 516 $link = array(
@@ -727,81 +522,34 @@
727 522 return $link;
728 523 }
729 524
730 525 /**
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 526 * @since 4.09
771 - *
772 527 * @param string $plugin The plugin slug.
773 - *
774 528 * @return array|false
775 529 */
776 530 public static function get_addon( $plugin ) {
777 531 $addons = self::get_api_addons();
778 532 self::prepare_addons( $addons );
779 -
780 533 foreach ( $addons as $addon ) {
781 534 $slug = explode( '/', $addon['plugin'] );
782 -
783 535 if ( $slug[0] === 'formidable-' . $plugin ) {
784 536 return $addon;
785 537 }
786 538 }
787 -
788 539 return false;
789 540 }
790 541
791 542 /**
792 543 * @since 4.09
793 - *
794 544 * @return string
795 545 */
796 546 protected static function get_license_type() {
797 547 $license_type = '';
798 548 $addons = self::get_api_addons();
799 -
800 549 if ( isset( $addons['error'] ) && isset( $addons['error']['type'] ) ) {
801 - return $addons['error']['type'];
550 + $license_type = $addons['error']['type'];
802 551 }
803 -
804 552 return $license_type;
805 553 }
806 554
807 555 /**
@@ -814,12 +562,11 @@
814 562 */
815 563 public static function get_addon_for_license( $addons, $license ) {
816 564 $download_id = $license->download_id;
817 565 $plugin = array();
818 -
819 - if ( ! $download_id && $addons ) {
566 + if ( empty( $download_id ) && ! empty( $addons ) ) {
820 567 foreach ( $addons as $addon ) {
821 - if ( 0 === strcasecmp( $license->plugin_name, $addon['title'] ) ) {
568 + if ( strtolower( $license->plugin_name ) === strtolower( $addon['title'] ) ) {
822 569 return $addon;
823 570 }
824 571 }
825 572 } elseif ( isset( $addons[ $download_id ] ) ) {
@@ -829,33 +576,29 @@
829 576 return $plugin;
830 577 }
831 578
832 579 /**
833 - * @param array $addons
834 - *
835 580 * @return void
836 581 */
837 582 protected static function prepare_addons( &$addons ) {
838 - // Reset categories to prevent count accumulation across multiple calls.
839 - self::$categories = array();
840 -
841 583 $activate_url = '';
842 -
843 584 if ( current_user_can( 'activate_plugins' ) ) {
844 585 $activate_url = add_query_arg( array( 'action' => 'activate' ), admin_url( 'plugins.php' ) );
845 586 }
846 587
847 588 $loop_addons = $addons;
848 -
849 589 foreach ( $loop_addons as $id => $addon ) {
850 590 if ( is_numeric( $id ) ) {
851 591 $slug = str_replace( array( '-wordpress-plugin', '-wordpress' ), '', $addon['slug'] );
852 592 $file_name = $addon['plugin'];
853 593 } else {
854 - $slug = $id;
855 - $base_file = $addon['file'] ?? 'formidable-' . $slug;
594 + $slug = $id;
595 + if ( isset( $addon['file'] ) ) {
596 + $base_file = $addon['file'];
597 + } else {
598 + $base_file = 'formidable-' . $slug;
599 + }
856 600 $file_name = $base_file . '/' . $base_file . '.php';
857 -
858 601 if ( ! isset( $addon['plugin'] ) ) {
859 602 $addon['plugin'] = $file_name;
860 603 }
861 604 }
@@ -860,17 +603,10 @@
860 603 }
861 604 }
862 605
863 606 $addon['installed'] = self::is_installed( $file_name );
864 -
865 - if ( 'highrise' === $slug && ! $addon['installed'] ) {
866 - unset( $addons[ $id ] );
867 - continue;
868 - }
869 -
870 607 if ( $addon['installed'] && 'formidable-views/formidable-views.php' === $file_name ) {
871 608 $active_views_version = self::get_active_views_version();
872 -
873 609 if ( false !== $active_views_version && $slug !== $active_views_version ) {
874 610 $addon['installed'] = false;
875 611 }
876 612 }
@@ -876,9 +612,9 @@
876 612 }
877 613
878 614 $addon['activate_url'] = '';
879 615
880 - if ( $addon['installed'] && $activate_url && ! self::is_plugin_active( $file_name, $slug ) ) {
616 + if ( $addon['installed'] && ! empty( $activate_url ) && ! self::is_plugin_active( $file_name, $slug ) ) {
881 617 $addon['activate_url'] = add_query_arg(
882 618 array(
883 619 '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $file_name ),
884 620 'plugin' => $file_name,
@@ -894,21 +630,16 @@
894 630
895 631 if ( ! isset( $addon['link'] ) ) {
896 632 $addon['link'] = 'downloads/' . $slug . '/';
897 633 }
634 + self::prepare_addon_link( $addon['link'] );
898 635
899 - self::prepare_addon_link( $addon['link'] );
900 636 self::set_addon_status( $addon );
901 - self::set_categories( $addon );
902 -
903 637 $addons[ $id ] = $addon;
904 638 }//end foreach
905 639 }
906 640
907 641 /**
908 - * @param string $file_name
909 - * @param string $slug
910 - *
911 642 * @return bool
912 643 */
913 644 private static function is_plugin_active( $file_name, $slug ) {
914 645 if ( 'formidable-views/formidable-views.php' === $file_name ) {
@@ -923,9 +654,8 @@
923 654 private static function get_active_views_version() {
924 655 if ( ! is_callable( 'FrmViewsAppHelper::plugin_version' ) ) {
925 656 return false;
926 657 }
927 -
928 658 $plugin_version = FrmViewsAppHelper::plugin_version();
929 659 return version_compare( $plugin_version, '5.0', '>=' ) ? 'visual-views' : 'views';
930 660 }
931 661
@@ -931,25 +661,22 @@
931 661
932 662 /**
933 663 * @since 3.04.02
934 664 *
935 - * @param string $link
936 - *
937 665 * @return void
938 666 */
939 667 protected static function prepare_addon_link( &$link ) {
940 668 $site_url = 'https://formidableforms.com/';
941 -
942 - if ( ! str_starts_with( $link, 'http' ) ) {
669 + if ( strpos( $link, 'http' ) !== 0 ) {
943 670 $link = $site_url . $link;
944 671 }
945 -
946 - $link = FrmAppHelper::make_affiliate_url( $link );
947 -
948 - $utm = array(
949 - 'campaign' => 'addons',
672 + $link = FrmAppHelper::make_affiliate_url( $link );
673 + $query_args = array(
674 + 'utm_source' => 'WordPress',
675 + 'utm_medium' => 'addons',
676 + 'utm_campaign' => 'liteplugin',
950 677 );
951 - $link = FrmAppHelper::maybe_add_missing_utm( $link, $utm );
678 + $link = add_query_arg( $query_args, $link );
952 679 }
953 680
954 681 /**
955 682 * Add the status to the addon array. Status options are:
@@ -956,10 +683,8 @@
956 683 * installed, active, not installed
957 684 *
958 685 * @since 3.04.02
959 686 *
960 - * @param array $addon
961 - *
962 687 * @return void
963 688 */
964 689 protected static function set_addon_status( &$addon ) {
965 690 if ( ! empty( $addon['activate_url'] ) ) {
@@ -980,8 +705,218 @@
980 705 }
981 706 }
982 707
983 708 /**
709 + * @return void
710 + */
711 + public static function upgrade_to_pro() {
712 + FrmAppHelper::include_svg();
713 +
714 + $link_parts = array(
715 + 'medium' => 'upgrade',
716 + 'content' => 'button',
717 + );
718 +
719 + $features = array(
720 + 'Display Entries' => array(
721 + array(
722 + 'label' => 'Display form data with virtually limitless views',
723 + 'link' => array(
724 + 'content' => 'views',
725 + 'param' => 'views-display-form-data',
726 + ),
727 + 'lite' => false,
728 + ),
729 + array(
730 + 'label' => 'Generate graphs and stats based on your submitted data',
731 + 'link' => array(
732 + 'content' => 'graphs',
733 + 'param' => 'statistics-graphs-wordpress-forms',
734 + ),
735 + 'lite' => false,
736 + ),
737 + ),
738 + 'Entry Management' => array(
739 + array(
740 + 'label' => 'Import entries from a CSV',
741 + 'link' => array(
742 + 'content' => 'import-entries',
743 + 'param' => 'importing-exporting-wordpress-forms',
744 + ),
745 + 'lite' => false,
746 + ),
747 + array(
748 + 'label' => 'Logged-in users can save drafts and return later',
749 + 'link' => array(
750 + 'content' => 'save-drafts',
751 + 'param' => 'save-drafts-wordpress-form',
752 + ),
753 + 'lite' => false,
754 + ),
755 + array(
756 + 'label' => 'Flexibly and powerfully view, edit, and delete entries from anywhere on your site',
757 + 'link' => array(
758 + 'content' => 'front-edit',
759 + 'param' => 'wordpress-front-end-editing',
760 + ),
761 + 'lite' => false,
762 + ),
763 + array(
764 + 'label' => 'View form submissions from the back-end',
765 + 'lite' => true,
766 + ),
767 + array(
768 + 'label' => 'Export your entries to a CSV',
769 + 'lite' => true,
770 + ),
771 + ),
772 + 'Form Building' => array(
773 + array(
774 + 'label' => 'Save a calculated value into a field',
775 + 'link' => array(
776 + 'content' => 'calculations',
777 + 'param' => 'field-calculations-wordpress-form',
778 + ),
779 + 'lite' => false,
780 + ),
781 + array(
782 + 'label' => 'Allow multiple file uploads',
783 + 'link' => array(
784 + 'content' => 'file-uploads',
785 + 'param' => 'wordpress-multi-file-upload-fields',
786 + ),
787 + 'lite' => false,
788 + ),
789 + array(
790 + 'label' => 'Repeat sections of fields',
791 + 'link' => array(
792 + 'content' => 'repeaters',
793 + 'param' => 'repeatable-sections-forms',
794 + ),
795 + 'lite' => false,
796 + ),
797 + array(
798 + 'label' => 'Hide and show fields conditionally based on other fields or the user\'s role',
799 + 'link' => array(
800 + 'content' => 'conditional-logic',
801 + 'param' => 'conditional-logic-wordpress-forms',
802 + ),
803 + 'lite' => false,
804 + ),
805 + array(
806 + 'label' => 'Confirmation fields',
807 + 'link' => array(
808 + 'content' => 'confirmation-fields',
809 + 'param' => 'confirmation-fields-wordpress-forms',
810 + ),
811 + 'lite' => false,
812 + ),
813 + array(
814 + 'label' => 'Multi-paged forms',
815 + 'link' => array(
816 + 'content' => 'page-breaks',
817 + 'param' => 'wordpress-multi-page-forms',
818 + ),
819 + 'lite' => false,
820 + ),
821 + array(
822 + '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.',
823 + 'lite' => false,
824 + ),
825 + array(
826 + 'label' => 'Include text, email, url, paragraph text, radio, checkbox, dropdown fields, hidden fields, user ID fields, and HTML blocks in your form.',
827 + 'lite' => true,
828 + ),
829 + array(
830 + 'label' => 'Drag & Drop Form building',
831 + 'link' => array(
832 + 'content' => 'drag-drop',
833 + 'param' => 'drag-drop-forms',
834 + ),
835 + 'lite' => true,
836 + ),
837 + array(
838 + 'label' => 'Create forms from Templates',
839 + 'link' => array(
840 + 'content' => 'form-templates',
841 + 'param' => 'wordpress-form-templates',
842 + ),
843 + 'lite' => true,
844 + ),
845 + array(
846 + 'label' => 'Import and export forms with XML',
847 + 'link' => array(
848 + 'content' => 'import',
849 + 'param' => 'importing-exporting-wordpress-forms',
850 + ),
851 + 'lite' => true,
852 + ),
853 + array(
854 + 'label' => 'Use input placeholder text in your fields that clear when typing starts.',
855 + 'lite' => true,
856 + ),
857 + ),
858 + 'Form Actions' => array(
859 + array(
860 + 'label' => 'Conditionally send your email notifications based on values in your form',
861 + 'link' => array(
862 + 'content' => 'conditional-emails',
863 + ),
864 + 'lite' => false,
865 + ),
866 + array(
867 + 'label' => 'Create and edit WordPress posts or custom posts from the front-end',
868 + 'link' => array(
869 + 'content' => 'create-posts',
870 + 'param' => 'create-posts-pages-wordpress-forms',
871 + ),
872 + 'lite' => false,
873 + ),
874 + array(
875 + 'label' => 'Send multiple emails and autoresponders',
876 + 'link' => array(
877 + 'content' => 'multiple-emails',
878 + 'param' => 'virtually-unlimited-emails',
879 + ),
880 + 'lite' => true,
881 + ),
882 + ),
883 + 'Form Appearance' => array(
884 + array(
885 + 'label' => 'Create Multiple styles for different forms',
886 + 'link' => array(
887 + 'content' => 'multiple-styles',
888 + 'param' => 'wordpress-visual-form-styler',
889 + ),
890 + 'lite' => false,
891 + ),
892 + array(
893 + 'label' => 'Customizable layout with CSS classes',
894 + 'link' => array(
895 + 'content' => 'form-layout',
896 + 'param' => 'wordpress-mobile-friendly-forms',
897 + ),
898 + 'lite' => true,
899 + ),
900 + array(
901 + 'label' => 'Customize the HTML for your forms',
902 + 'link' => array(
903 + 'content' => 'custom-html',
904 + 'param' => 'customizable-html-wordpress-form',
905 + ),
906 + 'lite' => true,
907 + ),
908 + array(
909 + 'label' => 'Style your form with the Visual Form Styler',
910 + 'lite' => true,
911 + ),
912 + ),
913 + );
914 +
915 + include FrmAppHelper::plugin_path() . '/classes/views/addons/upgrade_to_pro.php';
916 + }
917 +
918 + /**
984 919 * @since 5.5.2
985 920 *
986 921 * @param string $plugin
987 922 * @param string $redirect
@@ -986,9 +921,8 @@
986 921 * @param string $plugin
987 922 * @param string $redirect
988 923 * @param bool $network_wide
989 924 * @param bool $silent
990 - *
991 925 * @return WP_Error|null Null on success, WP_Error on invalid file.
992 926 */
993 927 protected static function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silent = false ) {
994 928 if ( ! function_exists( 'activate_plugin' ) ) {
@@ -1003,9 +937,8 @@
1003 937 * @since 6.8
1004 938 *
1005 939 * @param string $plugin
1006 940 * @param bool $silent
1007 - *
1008 941 * @return void
1009 942 */
1010 943 protected static function deactivate_plugin( $plugin, $silent = false ) {
1011 944 if ( ! function_exists( 'deactivate_plugins' ) ) {
@@ -1019,9 +952,8 @@
1019 952 *
1020 953 * @since 6.8
1021 954 *
1022 955 * @param string $plugin
1023 - *
1024 956 * @return true|WP_Error True on success, WP_Error on invalid file.
1025 957 */
1026 958 protected static function uninstall_plugin( $plugin ) {
1027 959 if ( ! current_user_can( 'delete_plugins' ) ) {
@@ -1034,9 +966,13 @@
1034 966
1035 967 self::deactivate_plugin( $plugin, true );
1036 968 $result = delete_plugins( array( $plugin ) );
1037 969
1038 - return is_wp_error( $result ) ? $result : true;
970 + if ( is_wp_error( $result ) ) {
971 + return $result;
972 + }
973 +
974 + return true;
1039 975 }
1040 976
1041 977 /**
1042 978 * @since 5.0.10
@@ -1043,9 +979,9 @@
1043 979 *
1044 980 * @return string
1045 981 */
1046 982 protected static function get_current_plugin() {
1047 - if ( ! self::$plugin ) {
983 + if ( empty( self::$plugin ) ) {
1048 984 self::$plugin = FrmAppHelper::get_param( 'plugin', '', 'post', 'esc_url_raw' );
1049 985 }
1050 986 return self::$plugin;
1051 987 }
@@ -1052,9 +988,9 @@
1052 988
1053 989 /**
1054 990 * @since 4.08
1055 991 *
1056 - * @return mixed[]|null
992 + * @return array|void
1057 993 */
1058 994 protected static function download_and_activate() {
1059 995 if ( is_admin() ) {
1060 996 FrmAppHelper::set_current_screen_and_hook_suffix();
@@ -1062,14 +998,12 @@
1062 998
1063 999 self::maybe_show_cred_form();
1064 1000
1065 1001 $installed = self::install_addon();
1066 -
1067 1002 if ( is_array( $installed ) && isset( $installed['message'] ) ) {
1068 1003 return $installed;
1069 1004 }
1070 1005 self::handle_addon_action( $installed, 'activate' );
1071 - return null;
1072 1006 }
1073 1007
1074 1008 /**
1075 1009 * @since 3.04.02
@@ -1080,9 +1014,9 @@
1080 1014 if ( ! function_exists( 'request_filesystem_credentials' ) ) {
1081 1015 include_once ABSPATH . 'wp-admin/includes/file.php';
1082 1016 }
1083 1017
1084 - // Start output buffering to catch the filesystem form if credentials are needed.
1018 + // Start output bufferring to catch the filesystem form if credentials are needed.
1085 1019 ob_start();
1086 1020
1087 1021 $show_form = false;
1088 1022 $method = '';
@@ -1099,8 +1033,9 @@
1099 1033
1100 1034 if ( $show_form ) {
1101 1035 $form = ob_get_clean();
1102 1036 $message = __( 'Sorry, your site requires FTP authentication. Please download plugins from FormidableForms.com and install them manually.', 'formidable' );
1037 + $data = $form;
1103 1038 $response = array(
1104 1039 'success' => false,
1105 1040 'message' => $message,
1106 1041 'form' => $form,
@@ -1128,10 +1063,8 @@
1128 1063 * We do not need any extra credentials if we have gotten this far,
1129 1064 * so let's install the plugin.
1130 1065 *
1131 1066 * @since 3.04.02
1132 - *
1133 - * @return array|string
1134 1067 */
1135 1068 protected static function install_addon() {
1136 1069 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
1137 1070
@@ -1145,15 +1078,14 @@
1145 1078 }
1146 1079
1147 1080 // Create the plugin upgrader with our custom skin.
1148 1081 $installer = new Plugin_Upgrader( new FrmInstallerSkin() );
1149 - $installer->install( $download_url, array( 'overwrite_package' => true ) );
1082 + $installer->install( $download_url );
1150 1083
1151 1084 // Flush the cache and return the newly installed plugin basename.
1152 1085 wp_cache_flush();
1153 1086
1154 1087 $plugin = $installer->plugin_info();
1155 -
1156 1088 if ( ! $plugin ) {
1157 1089 return array(
1158 1090 'message' => 'Plugin was not installed. ' . $installer->result,
1159 1091 'success' => false,
@@ -1158,9 +1090,8 @@
1158 1090 'message' => 'Plugin was not installed. ' . $installer->result,
1159 1091 'success' => false,
1160 1092 );
1161 1093 }
1162 -
1163 1094 return $plugin;
1164 1095 }
1165 1096
1166 1097 /**
@@ -1224,9 +1155,8 @@
1224 1155 * @since 6.8
1225 1156 *
1226 1157 * @param callable $action_callback The specific add-on action to be executed.
1227 1158 * @param callable|null $response_callback Optional. The response handling callback. Default null.
1228 - *
1229 1159 * @return void
1230 1160 */
1231 1161 private static function process_addon_action( $action_callback, $response_callback = null ) {
1232 1162 self::install_addon_permissions();
@@ -1249,14 +1179,13 @@
1249 1179 * @since 6.8
1250 1180 *
1251 1181 * @param string $installed The plugin folder name with file name.
1252 1182 * @param string $action The action type ('activate', 'deactivate', 'uninstall').
1253 - *
1254 - * @return mixed[]|null
1183 + * @return array|void
1255 1184 */
1256 1185 protected static function handle_addon_action( $installed, $action ) {
1257 1186 if ( ! $installed || ! $action ) {
1258 - return null;
1187 + return;
1259 1188 }
1260 1189
1261 1190 $result = null;
1262 1191 switch ( $action ) {
@@ -1276,9 +1205,8 @@
1276 1205 if ( $result->get_error_code() !== 'no_plugin_header' ) {
1277 1206 if ( wp_doing_ajax() ) {
1278 1207 wp_send_json_error( array( 'error' => $result->get_error_message() ) );
1279 1208 }
1280 -
1281 1209 return array(
1282 1210 'message' => $result->get_error_message(),
1283 1211 'success' => false,
1284 1212 );
@@ -1292,14 +1220,17 @@
1292 1220 * @return array
1293 1221 */
1294 1222 private static function get_addon_activation_response() {
1295 1223 $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 1224
1298 - return array(
1225 + $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' );
1226 +
1227 + $response = array(
1299 1228 'message' => $message,
1300 1229 'saveAndReload' => $activating_page,
1301 1230 );
1231 +
1232 + return $response;
1302 1233 }
1303 1234
1304 1235 /**
1305 1236 * Return a string that reflects the page from which the addon is being activated on,
@@ -1308,14 +1239,17 @@
1308 1239 * @return string
1309 1240 */
1310 1241 private static function get_activating_page() {
1311 1242 $referer = FrmAppHelper::get_server_value( 'HTTP_REFERER' );
1243 + if ( false !== strpos( $referer, 'frm_action=settings' ) ) {
1244 + return 'settings';
1245 + }
1312 1246
1313 - if ( str_contains( $referer, 'frm_action=settings' ) ) {
1314 - return 'settings';
1247 + if ( false !== strpos( $referer, 'frm_action=edit' ) ) {
1248 + return 'form_builder';
1315 1249 }
1316 1250
1317 - return str_contains( $referer, 'frm_action=edit' ) ? 'form_builder' : '';
1251 + return '';
1318 1252 }
1319 1253
1320 1254 /**
1321 1255 * Run security checks before installing
@@ -1326,14 +1260,12 @@
1326 1260 */
1327 1261 protected static function install_addon_permissions() {
1328 1262 check_ajax_referer( 'frm_ajax', 'nonce' );
1329 1263
1330 - if ( current_user_can( 'activate_plugins' ) && self::get_current_plugin() ) {
1331 - return;
1264 + if ( ! current_user_can( 'activate_plugins' ) || ! self::get_current_plugin() ) {
1265 + echo json_encode( true );
1266 + wp_die();
1332 1267 }
1333 -
1334 - echo json_encode( true );
1335 - wp_die();
1336 1268 }
1337 1269
1338 1270 /**
1339 1271 * @since 4.08
@@ -1341,14 +1273,12 @@
1341 1273 * @return string
1342 1274 */
1343 1275 public static function connect_link() {
1344 1276 $auth = get_option( 'frm_connect_token' );
1345 -
1346 - if ( ! $auth ) {
1277 + if ( empty( $auth ) ) {
1347 1278 $auth = hash( 'sha512', wp_rand() );
1348 - update_option( 'frm_connect_token', $auth, false );
1279 + update_option( 'frm_connect_token', $auth, 'no' );
1349 1280 }
1350 -
1351 1281 $page = FrmAppHelper::simple_get( 'page', 'sanitize_title', 'formidable-settings' );
1352 1282 $link = 'https://formidableforms.com/api-connect/';
1353 1283 $args = array(
1354 1284 'v' => 2,
@@ -1376,10 +1306,9 @@
1376 1306 $post_url = FrmAppHelper::get_param( 'file_url', '', 'request', 'sanitize_text_field' );
1377 1307
1378 1308 // The download link is not required if already installed.
1379 1309 $is_installed = FrmAppHelper::pro_is_included();
1380 - $file_missing = ! $is_installed && ! $post_url;
1381 -
1310 + $file_missing = ! $is_installed && empty( $post_url );
1382 1311 if ( ! $post_auth || $file_missing ) {
1383 1312 return false;
1384 1313 }
1385 1314
@@ -1384,9 +1313,13 @@
1384 1313 }
1385 1314
1386 1315 // Verify auth.
1387 1316 $auth = get_option( 'frm_connect_token' );
1388 - return $auth && hash_equals( $auth, $post_auth );
1317 + if ( empty( $auth ) || ! hash_equals( $auth, $post_auth ) ) {
1318 + return false;
1319 + }
1320 +
1321 + return true;
1389 1322 }
1390 1323
1391 1324 /**
1392 1325 * Install and/or activate the add-on file.
@@ -1397,17 +1330,17 @@
1397 1330 */
1398 1331 public static function install_addon_api() {
1399 1332 self::$plugin = FrmAppHelper::get_param( 'file_url', '', 'request', 'esc_url_raw' );
1400 1333
1334 + $error = esc_html__( 'Could not install an upgrade. Please download from formidableforms.com and install manually.', 'formidable' );
1335 +
1401 1336 // Delete so cannot replay.
1402 1337 delete_option( 'frm_connect_token' );
1403 1338
1404 1339 // It's already installed and active.
1405 1340 $active = self::activate_plugin( 'formidable-pro/formidable-pro.php', false, false, true );
1406 -
1407 1341 if ( is_wp_error( $active ) ) {
1408 1342 $response = self::maybe_download_and_activate();
1409 -
1410 1343 if ( is_array( $response ) ) {
1411 1344 // The download failed.
1412 1345 return $response;
1413 1346 }
@@ -1413,12 +1346,11 @@
1413 1346 }
1414 1347 }
1415 1348
1416 1349 // If empty license, save it now.
1417 - if ( ! self::get_pro_license() && function_exists( 'load_formidable_pro' ) ) {
1350 + if ( empty( self::get_pro_license() ) && function_exists( 'load_formidable_pro' ) ) {
1418 1351 load_formidable_pro();
1419 1352 $license = stripslashes( FrmAppHelper::get_param( 'key', '', 'request', 'sanitize_text_field' ) );
1420 -
1421 1353 if ( ! $license ) {
1422 1354 return array(
1423 1355 'success' => false,
1424 1356 'error' => 'That site does not have a valid license key.',
@@ -1425,9 +1357,8 @@
1425 1357 );
1426 1358 }
1427 1359
1428 1360 $response = FrmAddon::activate_license_for_plugin( $license, 'formidable_pro' );
1429 -
1430 1361 if ( ! $response['success'] ) {
1431 1362 // Could not activate license.
1432 1363 return $response;
1433 1364 }
@@ -1452,9 +1383,8 @@
1452 1383 }
1453 1384
1454 1385 // Download plugin now.
1455 1386 $response = self::download_and_activate();
1456 -
1457 1387 if ( is_array( $response ) && isset( $response['success'] ) ) {
1458 1388 // The download failed.
1459 1389 return $response;
1460 1390 }
@@ -1468,9 +1398,8 @@
1468 1398 * @since 4.09
1469 1399 *
1470 1400 * @param string $plugin
1471 1401 * @param array|string $upgrade_link_args
1472 - *
1473 1402 * @return void
1474 1403 */
1475 1404 public static function conditional_action_button( $plugin, $upgrade_link_args ) {
1476 1405 if ( is_callable( 'FrmProAddonsController::conditional_action_button' ) ) {
@@ -1505,9 +1434,8 @@
1505 1434 * @type false|string $license_type
1506 1435 * @type string $plan_required
1507 1436 * @type string $upgrade_link
1508 1437 * }
1509 - *
1510 1438 * @return void
1511 1439 */
1512 1440 public static function show_conditional_action_button( $atts ) {
1513 1441 if ( is_callable( 'FrmProAddonsController::show_conditional_action_button' ) ) {
@@ -1525,12 +1453,11 @@
1525 1453 * @param array|string $upgrade_link
1526 1454 *
1527 1455 * @return void
1528 1456 */
1529 - public static function addon_upgrade_link( $addon, $upgrade_link ) {
1457 + protected static function addon_upgrade_link( $addon, $upgrade_link ) {
1530 1458 $atts = is_array( $upgrade_link ) ? $upgrade_link : array();
1531 1459 $upgrade_link = is_array( $upgrade_link ) ? $upgrade_link['link'] : $upgrade_link;
1532 - $text = ! empty( $atts['text'] ) ? $atts['text'] : __( 'Upgrade Now', 'formidable' );
1533 1460
1534 1461 if ( $addon ) {
1535 1462 $upgrade_link .= '&utm_content=' . $addon['slug'];
1536 1463 }
@@ -1540,19 +1467,16 @@
1540 1467 $upgrade_link = FrmAppHelper::admin_upgrade_link( 'addons', $addon['link'] );
1541 1468 }
1542 1469
1543 1470 $class = ! empty( $atts['class'] ) ? $atts['class'] : '';
1544 -
1545 - if ( ! str_contains( $class, 'frm-button' ) ) {
1471 + if ( strpos( $class, 'frm-button' ) === false ) {
1546 1472 $class .= ' frm-button-secondary frm-button-sm';
1547 1473 }
1548 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1549 1474 ?>
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 ); ?>
1475 + <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' ); ?>">
1476 + <?php esc_html_e( 'Upgrade Now', 'formidable' ); ?>
1552 1477 </a>
1553 1478 <?php
1554 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1555 1479 }
1556 1480
1557 1481 /**
1558 1482 * @since 3.04.02
@@ -1562,9 +1486,8 @@
1562 1486 public static function ajax_install_addon() {
1563 1487 self::install_addon_permissions();
1564 1488
1565 1489 $result = self::download_and_activate();
1566 -
1567 1490 if ( isset( $result['success'] ) && ! $result['success'] ) {
1568 1491 echo json_encode( $result );
1569 1492 wp_die();
1570 1493 }
@@ -1597,8 +1520,9 @@
1597 1520 $allowed_url_list = apply_filters( 'frm_allowed_external_urls', $allowed_url_list );
1598 1521
1599 1522 if ( ! is_array( $allowed_url_list ) ) {
1600 1523 _doing_it_wrong( __METHOD__, 'Only an array of URLs could be used within this filter.', '6.3.1' );
1524 +
1601 1525 return array();
1602 1526 }
1603 1527
1604 1528 return $allowed_url_list;
@@ -1608,10 +1532,8 @@
1608 1532 * Gets required plan for an addon.
1609 1533 *
1610 1534 * @since 6.4.2
1611 1535 *
1612 - * @param int|string $addon_id
1613 - *
1614 1536 * @return string Empty string if no plan is required for active license.
1615 1537 */
1616 1538 public static function get_addon_required_plan( $addon_id ) {
1617 1539 $api = new FrmFormApi();
@@ -1622,10 +1544,22 @@
1622 1544 $requires = FrmFormsHelper::get_plan_required( $dates );
1623 1545 }
1624 1546
1625 1547 if ( ! isset( $requires ) || ! is_string( $requires ) ) {
1626 - return '';
1548 + $requires = '';
1627 1549 }
1628 1550
1629 1551 return $requires;
1552 + }
1553 +
1554 + /**
1555 + * @since 4.02.05
1556 + * @deprecated 6.8.3
1557 + *
1558 + * @codeCoverageIgnore
1559 + *
1560 + * @return void
1561 + */
1562 + public static function connect_pro() {
1563 + _deprecated_function( __METHOD__, '6.8.3' );
1630 1564 }
1631 1565 }