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