PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 3.06.06
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v3.06.06
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 +406 -1028 6.253.06.06 View file →
@@ -1,283 +1,51 @@
1 1 <?php
2 -if ( ! defined( 'ABSPATH' ) ) {
3 - die( 'You are not allowed to call this page directly.' );
4 -}
5 2
6 3 class FrmAddonsController {
7 4
8 - /**
9 - * @var string
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 - protected static $plugin;
27 -
28 - /**
29 - * @since 6.15
30 - */
31 - public static function load_admin_hooks() {
32 - add_action( 'admin_menu', self::class . '::menu', 100 );
33 - add_filter( 'pre_set_site_transient_update_plugins', self::class . '::check_update' );
34 -
35 - if ( FrmAppHelper::is_admin_page( 'formidable-addons' ) ) {
36 - self::$request_addon_url = 'https://connect.formidableforms.com/add-on-request/';
37 -
38 - add_action( 'admin_enqueue_scripts', self::class . '::enqueue_assets', 15 );
39 - add_filter( 'frm_show_footer_links', '__return_false' );
40 - }
41 - }
42 -
43 - /**
44 - * Enqueues the Add-Ons page scripts and styles.
45 - *
46 - * @since 6.15
47 - *
48 - * @return void
49 - */
50 - public static function enqueue_assets() {
51 - $plugin_url = FrmAppHelper::plugin_url();
52 - $version = FrmAppHelper::plugin_version();
53 - $js_dependencies = array(
54 - 'wp-i18n',
55 - // This prevents a console error "wp.hooks is undefined" in WP versions older than 5.7.
56 - 'wp-hooks',
57 - 'formidable_dom',
58 - );
59 -
60 - // Enqueue styles that needed.
61 - wp_enqueue_style( 'formidable-admin' );
62 - wp_enqueue_style( 'formidable-grids' );
63 -
64 - // Register and enqueue Add-Ons page style.
65 - wp_register_style( self::SCRIPT_HANDLE, $plugin_url . '/css/admin/addons-page.css', array(), $version );
66 - wp_enqueue_style( self::SCRIPT_HANDLE );
67 -
68 - // Register and enqueue Add-Ons page script.
69 - wp_register_script( self::SCRIPT_HANDLE, $plugin_url . '/js/addons-page.js', $js_dependencies, $version, true );
70 - wp_localize_script( self::SCRIPT_HANDLE, 'frmAddonsVars', self::get_js_variables() );
71 - wp_enqueue_script( self::SCRIPT_HANDLE );
72 - wp_set_script_translations( self::SCRIPT_HANDLE, 'formidable' );
73 -
74 - FrmAppHelper::dequeue_extra_global_scripts();
75 - }
76 -
77 - /**
78 - * Get the Add-Ons page JS variables as an array.
79 - *
80 - * @since 6.15
81 - *
82 - * @return array
83 - */
84 - private static function get_js_variables() {
85 - return array(
86 - 'proIsIncluded' => FrmAppHelper::pro_is_included(),
87 - 'addonRequestURL' => self::$request_addon_url,
88 - );
89 - }
90 -
91 - /**
92 - * @return void
93 - */
94 5 public static function menu() {
95 6 if ( ! current_user_can( 'activate_plugins' ) ) {
96 7 return;
97 8 }
98 9
99 - $label = __( 'Add-Ons', 'formidable' );
100 - $label = '<span style="color:#3FCA89">' . esc_html( $label ) . '</span>';
10 + add_submenu_page( 'formidable', 'Formidable | ' . __( 'Add-Ons', 'formidable' ), __( 'Add-Ons', 'formidable' ), 'frm_view_forms', 'formidable-addons', 'FrmAddonsController::list_addons' );
101 11
102 - add_submenu_page( 'formidable', 'Formidable | ' . __( 'Add-Ons', 'formidable' ), $label, 'frm_view_forms', 'formidable-addons', 'FrmAddonsController::list_addons' );
103 -
104 - // remove default created subpage, make the page with highest priority as default.
105 - remove_submenu_page( 'formidable', 'formidable' );
106 -
107 12 if ( ! FrmAppHelper::pro_is_installed() ) {
108 - $cta_text = FrmSalesApi::get_best_sale_value( 'menu_cta_text' );
109 - if ( ! $cta_text ) {
110 - $cta_text = __( 'Upgrade', 'formidable' );
111 - }
112 -
113 - add_submenu_page(
114 - 'formidable',
115 - 'Formidable | ' . __( 'Upgrade', 'formidable' ),
116 - '<span class="frm-upgrade-submenu">' . esc_html( $cta_text ) . '</span>',
117 - 'frm_view_forms',
118 - 'formidable-pro-upgrade',
119 - function () {
120 - // This function doesn't need to do anything.
121 - // The redirect is handled earlier to avoid issues with the headers being sent.
122 - }
123 - );
124 - } elseif ( 'formidable-pro-upgrade' === FrmAppHelper::get_param( 'page' ) ) {
125 - wp_safe_redirect( admin_url( 'admin.php?page=formidable' ) );
126 - exit;
127 - }//end if
13 + add_submenu_page( 'formidable', 'Formidable | ' . __( 'Upgrade to Pro', 'formidable' ), __( 'Upgrade to Pro', 'formidable' ), 'frm_view_forms', 'formidable-pro-upgrade', 'FrmAddonsController::upgrade_to_pro' );
14 + }
128 15 }
129 16
130 - /**
131 - * @return void
132 - */
133 17 public static function list_addons() {
134 - FrmAppHelper::include_svg();
18 + $installed_addons = apply_filters( 'frm_installed_addons', array() );
135 19
136 - $view_path = FrmAppHelper::plugin_path() . '/classes/views/addons/';
137 - $installed_addons = apply_filters( 'frm_installed_addons', array() );
138 - $addons = self::get_api_addons();
139 - $errors = array();
140 - $license_type = '';
141 - $request_addon_url = self::$request_addon_url;
142 -
20 + $addons = self::get_api_addons();
21 + $errors = array();
143 22 if ( isset( $addons['error'] ) ) {
144 - $api = new FrmFormApi();
145 - $errors = $api->get_error_from_response( $addons );
146 - $license_type = $addons['error']['type'] ?? '';
23 + $api = new FrmFormApi();
24 + $errors = $api->get_error_from_response( $addons );
147 25 unset( $addons['error'] );
148 26 }
149 -
150 - $pro = array(
151 - 'pro' => array(
152 - 'title' => 'Formidable Forms Pro',
153 - 'slug' => 'formidable-pro',
154 - 'released' => '2011-02-05',
155 - 'docs' => 'knowledgebase/',
156 - 'categories' => array( 'basic', 'plus', 'business', 'elite' ),
157 - 'excerpt' => 'Create calculators, surveys, smart forms, and data-driven applications. Build directories, real estate listings, job boards, and much more.',
158 - ),
159 - );
160 - $addons = $pro + $addons;
161 27 self::prepare_addons( $addons );
162 28
163 29 $pricing = FrmAppHelper::admin_upgrade_link( 'addons' );
164 30
165 - self::organize_and_get_categories();
166 - $categories = self::$categories;
167 -
168 - include $view_path . 'index.php';
31 + include( FrmAppHelper::plugin_path() . '/classes/views/addons/list.php' );
169 32 }
170 33
171 - /**
172 - * Organize and set categories.
173 - *
174 - * @since 6.15
175 - *
176 - * @return void
177 - */
178 - protected static function organize_and_get_categories() {
179 - unset( self::$categories['strategy11'] );
180 - ksort( self::$categories );
181 -
182 - $bottom_categories = array();
183 - $plans = FrmFormsHelper::get_license_types(
184 - array(
185 - 'include_all' => false,
186 - 'case_lower' => true,
187 - )
188 - );
189 -
190 - // Extract the elements to move
191 - foreach ( $plans as $plan ) {
192 - if ( isset( self::$categories[ $plan ] ) ) {
193 - $bottom_categories[ $plan ] = self::$categories[ $plan ];
194 - unset( self::$categories[ $plan ] );
195 - }
196 - }
197 -
198 - $special_categories = array();
199 - if ( 'elite' !== self::license_type() ) {
200 - $special_categories['available-addons'] = array(
201 - 'name' => __( 'Available', 'formidable' ),
202 - // To be assigned via JavaScript.
203 - 'count' => 0,
204 - );
205 - }
206 -
207 - $special_categories['active-addons'] = array(
208 - 'name' => __( 'Active', 'formidable' ),
209 - // To be assigned via JavaScript.
210 - 'count' => 0,
211 - );
212 -
213 - $special_categories['all-items'] = array(
214 - 'name' => __( 'All Add-Ons', 'formidable' ),
215 - // To be assigned via JavaScript.
216 - 'count' => 0,
217 - );
218 -
219 - self::$categories = array_merge(
220 - $special_categories,
221 - self::$categories,
222 - $bottom_categories
223 - );
224 - }
225 -
226 - /**
227 - * Organize and set categories.
228 - *
229 - * @since 6.15
230 - *
231 - * @param array $addon The addon array that will be modified by reference.
232 - * @return void
233 - */
234 - protected static function set_categories( &$addon ) {
235 - if ( ! isset( $addon['categories'] ) ) {
236 - return;
237 - }
238 -
239 - $addon['category-slugs'] = array();
240 -
241 - foreach ( $addon['categories'] as $category ) {
242 - $category = FrmFormsHelper::convert_legacy_package_names( $category );
243 - $category_slug = sanitize_title( $category );
244 -
245 - // Add the slug to the new array.
246 - $addon['category-slugs'][] = $category_slug;
247 -
248 - if ( ! isset( self::$categories[ $category_slug ] ) ) {
249 - self::$categories[ $category_slug ] = array(
250 - 'name' => $category,
251 - 'count' => 0,
252 - );
253 - }
254 -
255 - ++self::$categories[ $category_slug ]['count'];
256 - }
257 - }
258 -
259 - /**
260 - * @return void
261 - */
262 34 public static function license_settings() {
263 35 $plugins = apply_filters( 'frm_installed_addons', array() );
264 36 if ( empty( $plugins ) ) {
265 37 esc_html_e( 'There are no plugins on your site that require a license', 'formidable' );
266 -
267 38 return;
268 39 }
269 40
270 41 ksort( $plugins );
271 42
272 - include FrmAppHelper::plugin_path() . '/classes/views/addons/settings.php';
43 + include( FrmAppHelper::plugin_path() . '/classes/views/addons/settings.php' );
273 44 }
274 45
275 - /**
276 - * @return array
277 - */
278 - protected static function get_api_addons() {
279 - $api = new FrmFormApi();
46 + private static function get_api_addons() {
47 + $api = new FrmFormApi();
280 48 $addons = $api->get_api_info();
281 49
282 50 if ( empty( $addons ) ) {
283 51 $addons = self::fallback_plugin_list();
@@ -292,116 +60,84 @@
292 60 return $addons;
293 61 }
294 62
295 63 /**
296 - * Retrieves the count of available addons.
297 - *
298 - * @since 6.9
299 - *
300 - * @return int Count of addons.
301 - */
302 - public static function get_addons_count() {
303 - $addons = self::get_api_addons();
304 -
305 - return count( $addons );
306 - }
307 -
308 - /**
309 64 * If the API is unable to connect, show something on the addons page
310 65 *
311 66 * @since 3.04.03
312 67 * @return array
313 68 */
314 - protected static function fallback_plugin_list() {
315 - $list = array(
69 + private static function fallback_plugin_list() {
70 + return array(
316 71 'formidable-pro' => array(
317 - 'title' => 'Formidable Forms Pro',
72 + 'title' => 'Formidable Pro',
318 73 'link' => 'pricing/',
319 74 'docs' => '',
320 75 'excerpt' => 'Enhance your basic Formidable forms with a plethora of Pro field types and features. Create advanced forms and data-driven applications in minutes.',
321 76 ),
322 - 'mailchimp' => array(
323 - 'title' => 'Mailchimp Forms',
324 - '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.',
77 + 'mailchimp' => array(
78 + 'title' => 'MailChimp Forms',
79 + '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.',
325 80 ),
326 - 'registration' => array(
81 + 'registration' => array(
327 82 'title' => 'User Registration Forms',
328 83 'link' => 'downloads/user-registration/',
329 84 '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.',
330 85 ),
331 - 'paypal' => array(
86 + 'paypal' => array(
332 87 'title' => 'PayPal Standard Forms',
333 88 'link' => 'downloads/paypal-standard/',
334 89 '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.',
335 90 ),
336 - 'stripe' => array(
91 + 'stripe' => array(
337 92 'title' => 'Stripe Forms',
338 93 'docs' => 'knowledgebase/stripe/',
339 94 'excerpt' => 'Any Formidable forms on your site can accept credit card payments without users ever leaving your site.',
340 95 ),
341 - 'authorize-net' => array(
96 + 'authorize-net' => array(
342 97 'title' => 'Authorize.net AIM Forms',
343 98 'link' => 'downloads/authorize-net-aim/',
344 99 'docs' => 'knowledgebase/authorize-net-aim/',
345 100 'excerpt' => 'Accept one-time payments directly on your site, using Authorize.net AIM.',
346 101 ),
347 - 'woocommerce' => array(
102 + 'woocommerce' => array(
348 103 'title' => 'WooCommerce Forms',
349 104 'excerpt' => 'Use a Formidable form on your WooCommerce product pages.',
350 105 ),
351 - 'autoresponder' => array(
106 + 'autoresponder' => array(
352 107 'title' => 'Form Action Automation',
353 108 'docs' => 'knowledgebase/schedule-autoresponder/',
354 109 'excerpt' => 'Schedule email notifications, SMS messages, and API actions.',
355 110 ),
356 - 'modal' => array(
111 + 'modal' => array(
357 112 'title' => 'Bootstrap Modal Forms',
358 113 'link' => 'downloads/bootstrap-modal/',
359 114 'docs' => 'knowledgebase/bootstrap-modal/',
360 115 'excerpt' => 'Open a view or form in a Bootstrap popup.',
361 116 ),
362 - 'bootstrap' => array(
117 + 'bootstrap' => array(
363 118 'title' => 'Bootstrap Style Forms',
364 119 'excerpt' => 'Instantly add Bootstrap styling to all your Formidable forms.',
365 120 ),
366 - 'zapier' => array(
121 + 'zapier' => array(
367 122 'title' => 'Zapier Forms',
368 123 '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.',
369 124 ),
370 - 'signature' => array(
125 + 'signature' => array(
371 126 'title' => 'Digital Signature Forms',
372 127 'excerpt' => 'Add a signature field to your form. The user may write their signature with a trackpad/mouse or just type it.',
373 128 ),
374 - 'api' => array(
129 + 'api' => array(
375 130 'title' => 'Formidable Forms API',
376 131 'link' => 'downloads/formidable-api/',
377 132 'excerpt' => 'Send entry results to any other site that has a Rest API. This includes the option of sending entries from one Formidable site to another.',
378 133 ),
379 - 'twilio' => array(
134 + 'twilio' => array(
380 135 'title' => 'Twilio SMS Forms',
381 136 'docs' => 'knowledgebase/twilio-add-on/',
382 137 'excerpt' => 'Allow users to text their votes for polls created by Formidable Forms, or send SMS notifications when entries are submitted or updated.',
383 138 ),
384 - 'views' => array(
385 - 'title' => 'Formidable Views',
386 - 'excerpt' => 'Add the power of views to your Formidable Forms to display your form submissions in listings, tables, calendars, and more.',
387 - ),
388 - 'quiz_maker' => array(
389 - 'title' => 'Quiz Maker',
390 - 'link' => 'downloads/quiz-maker/',
391 - 'excerpt' => 'Make quizzes, automatically score them and show user scores.',
392 - ),
393 139 );
394 -
395 - $defaults = array(
396 - 'released' => '',
397 - );
398 -
399 - foreach ( $list as $k => $info ) {
400 - $info['slug'] = $k;
401 - $list[ $k ] = array_merge( $defaults, $info );
402 - }
403 - return $list;
404 140 }
405 141
406 142 /**
407 143 * If Pro is missing but has been authenticated, include a download URL
@@ -409,22 +145,10 @@
409 145 * @since 3.04.03
410 146 * @return string
411 147 */
412 148 public static function get_pro_download_url() {
413 - $license = self::get_pro_license();
414 - $api = new FrmFormApi( $license );
415 - $downloads = $api->get_api_info();
416 - $pro = self::get_pro_from_addons( $downloads );
417 -
418 - return $pro['url'] ?? '';
419 - }
420 -
421 - /**
422 - * @since 4.08
423 - */
424 - public static function get_pro_license() {
425 - $pro_cred_store = 'frmpro-credentials';
426 - $pro_wpmu_store = 'frmpro-wpmu-sitewide';
149 + $pro_cred_store = 'frmpro-credentials';
150 + $pro_wpmu_store = 'frmpro-wpmu-sitewide';
427 151 if ( is_multisite() && get_site_option( $pro_wpmu_store ) ) {
428 152 $creds = get_site_option( $pro_cred_store );
429 153 } else {
430 154 $creds = get_option( $pro_cred_store );
@@ -442,84 +166,20 @@
442 166 if ( strpos( $license, '-' ) ) {
443 167 // this is a fix for licenses saved in the past
444 168 $license = strtoupper( $license );
445 169 }
446 - return $license;
447 - }
448 170
449 - /**
450 - * @since 4.08
451 - *
452 - * @param array $addons
453 - * @return array
454 - */
455 - protected static function get_pro_from_addons( $addons ) {
456 - return $addons['93790'] ?? array();
457 - }
171 + $api = new FrmFormApi( $license );
172 + $downloads = $api->get_api_info();
173 + $pro = isset( $downloads['93790'] ) ? $downloads['93790'] : array();
458 174
459 - /**
460 - * @since 4.06
461 - */
462 - public static function license_type() {
463 - if ( is_callable( 'FrmProAddonsController::license_type' ) ) {
464 - return FrmProAddonsController::license_type();
465 - }
466 -
467 - return 'free';
175 + return isset( $pro['url'] ) ? $pro['url'] : '';
468 176 }
469 177
470 178 /**
471 - * @since 4.0.01
472 - *
473 - * @return bool
474 - */
475 - public static function is_license_expired() {
476 - $version_info = self::get_primary_license_info();
477 - if ( ! isset( $version_info['error'] ) ) {
478 - return false;
479 - }
480 -
481 - $expires = $version_info['error']['expires'] ?? 0;
482 - if ( empty( $expires ) || $expires > time() ) {
483 - return false;
484 - }
485 -
486 - $rate_limited = ! empty( $version_info['response_code'] ) && 429 === (int) $version_info['response_code'];
487 - if ( $rate_limited ) {
488 - // Do not return false positives for rate limited responses.
489 - return false;
490 - }
491 -
492 - return $version_info['error'];
493 - }
494 -
495 - /**
496 - * @since 4.08
497 - * @since 6.7 This is public.
498 - *
499 - * @return array|false
500 - */
501 - public static function get_primary_license_info() {
502 - $installed_addons = apply_filters( 'frm_installed_addons', array() );
503 - if ( empty( $installed_addons ) || ! isset( $installed_addons['formidable_pro'] ) ) {
504 - return false;
505 - }
506 - $installed_addons = array(
507 - 'formidable_pro' => $installed_addons['formidable_pro'],
508 - );
509 -
510 - return self::fill_update_addon_info( $installed_addons );
511 - }
512 -
513 - /**
514 179 * @since 3.04.03
515 180 */
516 181 public static function check_update( $transient ) {
517 - if ( ! FrmAppHelper::pro_is_installed() ) {
518 - // Don't make any changes if only Lite is installed.
519 - return $transient;
520 - }
521 -
522 182 if ( ! is_object( $transient ) ) {
523 183 $transient = new stdClass();
524 184 }
525 185
@@ -527,13 +187,15 @@
527 187 if ( empty( $installed_addons ) ) {
528 188 return $transient;
529 189 }
530 190
531 - $version_info = self::fill_update_addon_info( $installed_addons );
191 + $version_info = self::fill_update_addon_info( $installed_addons );
192 +
532 193 $transient->last_checked = time();
533 - $wp_plugins = self::get_plugins();
534 194
535 - foreach ( $version_info as $plugin ) {
195 + $wp_plugins = get_plugins();
196 +
197 + foreach ( $version_info as $id => $plugin ) {
536 198 $plugin = (object) $plugin;
537 199
538 200 if ( ! isset( $plugin->new_version ) || ! isset( $plugin->package ) ) {
539 201 continue;
@@ -548,51 +210,37 @@
548 210 // don't show an update if the plugin isn't installed
549 211 continue;
550 212 }
551 213
552 - $wp_plugin = $wp_plugins[ $folder ] ?? array();
553 - $wp_version = $wp_plugin['Version'] ?? '1.0';
554 - $plugin->slug = explode( '/', $folder )[0];
214 + $wp_plugin = isset( $wp_plugins[ $folder ] ) ? $wp_plugins[ $folder ] : array();
215 + $wp_version = isset( $wp_plugin['Version'] ) ? $wp_plugin['Version'] : '1.0';
555 216
556 217 if ( version_compare( $wp_version, $plugin->new_version, '<' ) ) {
218 + $slug = explode( '/', $folder );
219 + $plugin->slug = $slug[0];
557 220 $transient->response[ $folder ] = $plugin;
558 - } else {
559 - $transient->no_update[ $folder ] = $plugin;
560 221 }
561 222
562 223 $transient->checked[ $folder ] = $wp_version;
563 224
564 - }//end foreach
225 + }
565 226
566 227 return $transient;
567 228 }
568 229
569 230 /**
570 - * Copy of FrmAppHelper::get_plugins.
571 - * Because this gets called on "pre_set_site_transient_update_plugins" an old version of FrmAppHelper may be loaded on plugin update.
572 - * This means that trying to access FrmAppHelper::get_plugins when upgrading from a Lite version before v5.5 results in a one-off error.
231 + * Check if a plugin is installed before showing an update for it
573 232 *
574 - * @since 5.5.2
575 - * @return array
233 + * @since 3.05
234 + * @param string $plugin - the folder/filename.php for a plugin
235 + * @return bool - True if installed
576 236 */
577 - protected static function get_plugins() {
237 + private static function is_installed( $plugin ) {
578 238 if ( ! function_exists( 'get_plugins' ) ) {
579 239 require_once ABSPATH . 'wp-admin/includes/plugin.php';
580 240 }
581 - return get_plugins();
582 - }
583 241
584 - /**
585 - * Check if a plugin is installed before showing an update for it
586 - *
587 - * @since 3.05
588 - *
589 - * @param string $plugin The folder/filename.php for a plugin.
590 - *
591 - * @return bool - True if installed
592 - */
593 - protected static function is_installed( $plugin ) {
594 - $all_plugins = self::get_plugins();
242 + $all_plugins = get_plugins();
595 243 return isset( $all_plugins[ $plugin ] );
596 244 }
597 245
598 246 /**
@@ -601,9 +249,9 @@
601 249 * @param array $installed_addons
602 250 *
603 251 * @return array
604 252 */
605 - protected static function fill_update_addon_info( $installed_addons ) {
253 + private static function fill_update_addon_info( $installed_addons ) {
606 254 $checked_licenses = array();
607 255 $version_info = array();
608 256
609 257 foreach ( $installed_addons as $addon ) {
@@ -629,9 +277,9 @@
629 277 if ( empty( $plugin ) ) {
630 278 continue;
631 279 }
632 280
633 - $download_id = $plugin['id'] ?? 0;
281 + $download_id = isset( $plugin['id'] ) ? $plugin['id'] : 0;
634 282 if ( ! empty( $download_id ) && ! isset( $version_info[ $download_id ]['package'] ) ) {
635 283 // if this addon is using its own license, get the update url
636 284 $addon_info = $api->get_api_info();
637 285
@@ -642,9 +290,9 @@
642 290 'code' => $addon_info['error']['code'],
643 291 );
644 292 }
645 293 }
646 - }//end foreach
294 + }
647 295
648 296 return $version_info;
649 297 }
650 298
@@ -651,89 +299,50 @@
651 299 /**
652 300 * Get the action link for an addon that isn't active.
653 301 *
654 302 * @since 3.06.03
655 - * @param string $plugin The plugin slug.
303 + * @param string $addon The plugin slug
656 304 * @return array
657 305 */
658 306 public static function install_link( $plugin ) {
659 - $link = array();
660 - $addon = self::get_addon( $plugin );
307 + $link = array();
308 + $addons = self::get_api_addons();
309 + self::prepare_addons( $addons );
661 310
662 - if ( $addon ) {
311 + foreach ( $addons as $addon ) {
312 + $slug = explode( '/', $addon['plugin'] );
313 + if ( $slug[0] !== 'formidable-' . $plugin ) {
314 + continue;
315 + }
316 +
663 317 if ( $addon['status']['type'] === 'installed' && ! empty( $addon['activate_url'] ) ) {
664 318 $link = array(
665 319 'url' => $addon['plugin'],
666 320 'class' => 'frm-activate-addon',
667 321 );
668 - } elseif ( ! empty( $addon['url'] ) ) {
322 + } elseif ( isset( $addon['url'] ) && ! empty( $addon['url'] ) ) {
669 323 $link = array(
670 324 'url' => $addon['url'],
671 325 'class' => 'frm-install-addon',
672 326 );
673 - } elseif ( ! empty( $addon['categories'] ) ) {
674 - $link = array(
675 - 'categories' => $addon['categories'],
676 - );
677 327 }
678 328
679 - if ( ! empty( $link ) ) {
680 - $link['status'] = $addon['status']['type'];
681 - }
682 - } elseif ( current_user_can( 'activate_plugins' ) && self::is_installed( 'formidable-' . $plugin . '/formidable-' . $plugin . '.php' ) ) {
683 - $link = array(
684 - 'url' => 'formidable-' . $plugin . '/formidable-' . $plugin . '.php',
685 - 'class' => 'frm-activate-addon',
686 - );
687 - }//end if
688 -
689 - return $link;
690 - }
691 -
692 - /**
693 - * @since 4.09
694 - * @param string $plugin The plugin slug.
695 - * @return array|false
696 - */
697 - public static function get_addon( $plugin ) {
698 - $addons = self::get_api_addons();
699 - self::prepare_addons( $addons );
700 - foreach ( $addons as $addon ) {
701 - $slug = explode( '/', $addon['plugin'] );
702 - if ( $slug[0] === 'formidable-' . $plugin ) {
703 - return $addon;
704 - }
329 + return $link;
705 330 }
706 - return false;
707 331 }
708 332
709 333 /**
710 - * @since 4.09
711 - * @return string
712 - */
713 - protected static function get_license_type() {
714 - $license_type = '';
715 - $addons = self::get_api_addons();
716 - if ( isset( $addons['error'] ) && isset( $addons['error']['type'] ) ) {
717 - $license_type = $addons['error']['type'];
718 - }
719 - return $license_type;
720 - }
721 -
722 - /**
723 334 * @since 3.04.03
724 - *
725 - * @param array $addons
726 - * @param object $license The FrmAddon object.
727 - *
335 + * @param array $addons
336 + * @param object $license The FrmAddon object
728 337 * @return array
729 338 */
730 339 public static function get_addon_for_license( $addons, $license ) {
731 340 $download_id = $license->download_id;
732 - $plugin = array();
341 + $plugin = array();
733 342 if ( empty( $download_id ) && ! empty( $addons ) ) {
734 343 foreach ( $addons as $addon ) {
735 - if ( strtolower( $license->plugin_name ) === strtolower( $addon['title'] ) ) {
344 + if ( strtolower( $license->plugin_name ) == strtolower( $addon['title'] ) ) {
736 345 return $addon;
737 346 }
738 347 }
739 348 } elseif ( isset( $addons[ $download_id ] ) ) {
@@ -742,12 +351,9 @@
742 351
743 352 return $plugin;
744 353 }
745 354
746 - /**
747 - * @return void
748 - */
749 - protected static function prepare_addons( &$addons ) {
355 + private static function prepare_addons( &$addons ) {
750 356 $activate_url = '';
751 357 if ( current_user_can( 'activate_plugins' ) ) {
752 358 $activate_url = add_query_arg( array( 'action' => 'activate' ), admin_url( 'plugins.php' ) );
753 359 }
@@ -754,9 +360,9 @@
754 360
755 361 $loop_addons = $addons;
756 362 foreach ( $loop_addons as $id => $addon ) {
757 363 if ( is_numeric( $id ) ) {
758 - $slug = str_replace( array( '-wordpress-plugin', '-wordpress' ), '', $addon['slug'] );
364 + $slug = str_replace( array( '-wordpress-plugin', '-wordpress' ), '', $addon['slug'] );
759 365 $file_name = $addon['plugin'];
760 366 } else {
761 367 $slug = $id;
762 368 if ( isset( $addon['file'] ) ) {
@@ -764,28 +370,18 @@
764 370 } else {
765 371 $base_file = 'formidable-' . $slug;
766 372 }
767 373 $file_name = $base_file . '/' . $base_file . '.php';
768 - if ( ! isset( $addon['plugin'] ) ) {
769 - $addon['plugin'] = $file_name;
770 - }
771 374 }
772 375
773 - $addon['installed'] = self::is_installed( $file_name );
774 - if ( $addon['installed'] && 'formidable-views/formidable-views.php' === $file_name ) {
775 - $active_views_version = self::get_active_views_version();
776 - if ( false !== $active_views_version && $slug !== $active_views_version ) {
777 - $addon['installed'] = false;
778 - }
779 - }
780 -
376 + $addon['installed'] = self::is_installed( $file_name );
781 377 $addon['activate_url'] = '';
782 378
783 - if ( $addon['installed'] && ! empty( $activate_url ) && ! self::is_plugin_active( $file_name, $slug ) ) {
379 + if ( $addon['installed'] && ! empty( $activate_url ) && ! is_plugin_active( $file_name ) ) {
784 380 $addon['activate_url'] = add_query_arg(
785 381 array(
786 - '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $file_name ),
787 - 'plugin' => $file_name,
382 + '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $file_name ),
383 + 'plugin' => $file_name,
788 384 ),
789 385 $activate_url
790 386 );
791 387 }
@@ -797,55 +393,30 @@
797 393
798 394 if ( ! isset( $addon['link'] ) ) {
799 395 $addon['link'] = 'downloads/' . $slug . '/';
800 396 }
397 + self::prepare_addon_link( $addon['link'] );
801 398
802 - self::prepare_addon_link( $addon['link'] );
803 399 self::set_addon_status( $addon );
804 - self::set_categories( $addon );
805 -
806 400 $addons[ $id ] = $addon;
807 - }//end foreach
808 - }
809 -
810 - /**
811 - * @return bool
812 - */
813 - private static function is_plugin_active( $file_name, $slug ) {
814 - if ( 'formidable-views/formidable-views.php' === $file_name ) {
815 - return self::get_active_views_version() === $slug;
816 401 }
817 - return is_plugin_active( $file_name );
818 402 }
819 403
820 404 /**
821 - * @return false|string either 'visual-views' or 'views', false if one is not found.
822 - */
823 - private static function get_active_views_version() {
824 - if ( ! is_callable( 'FrmViewsAppHelper::plugin_version' ) ) {
825 - return false;
826 - }
827 - $plugin_version = FrmViewsAppHelper::plugin_version();
828 - return version_compare( $plugin_version, '5.0', '>=' ) ? 'visual-views' : 'views';
829 - }
830 -
831 - /**
832 405 * @since 3.04.02
833 - *
834 - * @return void
835 406 */
836 - protected static function prepare_addon_link( &$link ) {
407 + private static function prepare_addon_link( &$link ) {
837 408 $site_url = 'https://formidableforms.com/';
838 409 if ( strpos( $link, 'http' ) !== 0 ) {
839 410 $link = $site_url . $link;
840 411 }
841 - $link = FrmAppHelper::make_affiliate_url( $link );
412 + $link = FrmAppHelper::make_affiliate_url( $link );
842 413 $query_args = array(
843 414 'utm_source' => 'WordPress',
844 415 'utm_medium' => 'addons',
845 416 'utm_campaign' => 'liteplugin',
846 417 );
847 - $link = add_query_arg( $query_args, $link );
418 + $link = add_query_arg( $query_args, $link );
848 419 }
849 420
850 421 /**
851 422 * Add the status to the addon array. Status options are:
@@ -851,12 +422,10 @@
851 422 * Add the status to the addon array. Status options are:
852 423 * installed, active, not installed
853 424 *
854 425 * @since 3.04.02
855 - *
856 - * @return void
857 426 */
858 - protected static function set_addon_status( &$addon ) {
427 + private static function set_addon_status( &$addon ) {
859 428 if ( ! empty( $addon['activate_url'] ) ) {
860 429 $addon['status'] = array(
861 430 'type' => 'installed',
862 431 'label' => __( 'Installed', 'formidable' ),
@@ -873,116 +442,278 @@
873 442 );
874 443 }
875 444 }
876 445
877 - /**
878 - * @since 5.5.2
879 - *
880 - * @param string $plugin
881 - * @param string $redirect
882 - * @param bool $network_wide
883 - * @param bool $silent
884 - * @return WP_Error|null Null on success, WP_Error on invalid file.
885 - */
886 - protected static function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silent = false ) {
887 - if ( ! function_exists( 'activate_plugin' ) ) {
888 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
889 - }
890 - return activate_plugin( $plugin, $redirect, $network_wide, $silent );
891 - }
446 + public static function upgrade_to_pro() {
447 + $pro_pricing = self::prepare_pro_info();
892 448
893 - /**
894 - * Deactivate a specified plugin.
895 - *
896 - * @since 6.8
897 - *
898 - * @param string $plugin
899 - * @param bool $silent
900 - * @return void
901 - */
902 - protected static function deactivate_plugin( $plugin, $silent = false ) {
903 - if ( ! function_exists( 'deactivate_plugins' ) ) {
904 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
905 - }
906 - deactivate_plugins( $plugin, $silent );
907 - }
449 + $link_parts = array(
450 + 'medium' => 'upgrade',
451 + 'content' => 'button',
452 + );
908 453
909 - /**
910 - * Uninstall a specified plugin.
911 - *
912 - * @since 6.8
913 - *
914 - * @param string $plugin
915 - * @return true|WP_Error True on success, WP_Error on invalid file.
916 - */
917 - protected static function uninstall_plugin( $plugin ) {
918 - if ( ! current_user_can( 'delete_plugins' ) ) {
919 - return new WP_Error( 'uninstall_failed', __( 'Current user cannot delete plugins.', 'formidable' ) );
920 - }
454 + $features = array(
455 + 'Display Entries' => array(
456 + array(
457 + 'label' => 'Display form data with virtually limitless views',
458 + 'link' => array(
459 + 'content' => 'views',
460 + 'anchor' => 'feature-display-form-data-views',
461 + ),
462 + 'lite' => false,
463 + ),
464 + array(
465 + 'label' => 'Generate graphs and stats based on your submitted data',
466 + 'link' => array(
467 + 'content' => 'graphs',
468 + 'anchor' => 'feature-create-a-graph-wordpress-forms',
469 + ),
470 + 'lite' => false,
471 + ),
472 + ),
473 + 'Entry Management' => array(
474 + array(
475 + 'label' => 'Import entries from a CSV',
476 + 'link' => array(
477 + 'content' => 'import-entries',
478 + 'anchor' => 'feature-importing-exporting-wordpress-forms',
479 + ),
480 + 'lite' => false,
481 + ),
482 + array(
483 + 'label' => 'Logged-in users can save drafts and return later',
484 + 'link' => array(
485 + 'content' => 'save-drafts',
486 + 'anchor' => 'feature-save-and-continue-partial-submissions',
487 + ),
488 + 'lite' => false,
489 + ),
490 + array(
491 + 'label' => 'Flexibly and powerfully view, edit, and delete entries from anywhere on your site',
492 + 'link' => array(
493 + 'content' => 'front-edit',
494 + 'anchor' => 'feature-front-end-editing-wordpress',
495 + ),
496 + 'lite' => false,
497 + ),
498 + array(
499 + 'label' => 'View form submissions from the back-end',
500 + 'lite' => true,
501 + ),
502 + array(
503 + 'label' => 'Export your entries to a CSV',
504 + 'lite' => true,
505 + ),
506 + ),
507 + 'Form Building' => array(
508 + array(
509 + 'label' => 'Save a calculated value into a field',
510 + 'link' => array(
511 + 'content' => 'calculations',
512 + 'anchor' => 'feature-wordpress-calculated-fields-form',
513 + ),
514 + 'lite' => false,
515 + ),
516 + array(
517 + 'label' => 'Allow multiple file uploads',
518 + 'link' => array(
519 + 'content' => 'file-uploads',
520 + 'anchor' => 'feature-wordpress-multiple-file-upload-form',
521 + ),
522 + 'lite' => false,
523 + ),
524 + array(
525 + 'label' => 'Repeat sections of fields',
526 + 'link' => array(
527 + 'content' => 'repeaters',
528 + 'anchor' => 'feature-dynamically-add-form-fields',
529 + ),
530 + 'lite' => false,
531 + ),
532 + array(
533 + 'label' => 'Hide and show fields conditionally based on other fields or the user\'s role',
534 + 'link' => array(
535 + 'content' => 'conditional-logic',
536 + 'anchor' => 'feature-conditional-logic-wordpress-forms',
537 + ),
538 + 'lite' => false,
539 + ),
540 + array(
541 + 'label' => 'Confirmation fields',
542 + 'link' => array(
543 + 'content' => 'confirmation-fields',
544 + 'anchor' => 'feature-confirm-email-address-password-wordpress-form',
545 + ),
546 + 'lite' => false,
547 + ),
548 + array(
549 + 'label' => 'Multi-paged forms',
550 + 'link' => array(
551 + 'content' => 'page-breaks',
552 + 'anchor' => 'feature-wordpress-multi-step-form',
553 + ),
554 + 'lite' => false,
555 + ),
556 + array(
557 + '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.',
558 + 'lite' => false,
559 + ),
560 + array(
561 + 'label' => 'Include text, email, url, paragraph text, radio, checkbox, dropdown fields, hidden fields, user ID fields, and HTML blocks in your form.',
562 + 'lite' => true,
563 + ),
564 + array(
565 + 'label' => 'Drag & Drop Form building',
566 + 'link' => array(
567 + 'content' => 'drag-drop',
568 + 'anchor' => 'feature-drag-drop-form-builder',
569 + ),
570 + 'lite' => true,
571 + ),
572 + array(
573 + 'label' => 'Create forms from Templates',
574 + 'link' => array(
575 + 'content' => 'form-templates',
576 + 'anchor' => 'feature-wordpress-form-templates',
577 + ),
578 + 'lite' => true,
579 + ),
580 + array(
581 + 'label' => 'Import and export forms with XML',
582 + 'link' => array(
583 + 'content' => 'import',
584 + 'anchor' => 'feature-importing-exporting-wordpress-forms',
585 + ),
586 + 'lite' => true,
587 + ),
588 + array(
589 + 'label' => 'Use input placeholder text in your fields that clear when typing starts.',
590 + 'lite' => true,
591 + ),
592 + ),
593 + 'Form Actions' => array(
594 + array(
595 + 'label' => 'Conditionally send your email notifications based on values in your form',
596 + 'link' => array(
597 + 'content' => 'conditional-emails',
598 + 'anchor' => 'feature-conditional-logic-wordpress-forms',
599 + ),
600 + 'lite' => false,
601 + ),
602 + array(
603 + 'label' => 'Create and edit WordPress posts or custom posts from the front-end',
604 + 'link' => array(
605 + 'content' => 'create-posts',
606 + 'anchor' => 'feature-user-submitted-posts-wordpress-forms',
607 + ),
608 + 'lite' => false,
609 + ),
610 + array(
611 + 'label' => 'Send multiple emails and autoresponders',
612 + 'link' => array(
613 + 'content' => 'multiple-emails',
614 + 'anchor' => 'feature-email-autoresponders-wordpress',
615 + ),
616 + 'lite' => true,
617 + ),
618 + ),
619 + 'Form Appearance' => array(
620 + array(
621 + 'label' => 'Create Multiple styles for different forms',
622 + 'link' => array(
623 + 'content' => 'multiple-styles',
624 + 'anchor' => 'feature-wordpress-visual-form-styler',
625 + ),
626 + 'lite' => false,
627 + ),
628 + array(
629 + 'label' => 'Customizable layout with CSS classes',
630 + 'link' => array(
631 + 'content' => 'form-layout',
632 + 'anchor' => 'feature-wordpress-mobile-friendly-responsive-forms',
633 + ),
634 + 'lite' => true,
635 + ),
636 + array(
637 + 'label' => 'Customize the HTML for your forms',
638 + 'link' => array(
639 + 'content' => 'custom-html',
640 + 'anchor' => 'feature-customize-form-html-wordpress',
641 + ),
642 + 'lite' => true,
643 + ),
644 + array(
645 + 'label' => 'Style your form with the Visual Form Styler',
646 + 'lite' => true,
647 + ),
648 + ),
649 + );
921 650
922 - if ( ! function_exists( 'delete_plugins' ) ) {
923 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
924 - }
651 + include( FrmAppHelper::plugin_path() . '/classes/views/addons/upgrade_to_pro.php' );
652 + }
925 653
926 - self::deactivate_plugin( $plugin, true );
927 - $result = delete_plugins( array( $plugin ) );
928 -
929 - if ( is_wp_error( $result ) ) {
930 - return $result;
931 - }
932 -
933 - return true;
654 + private static function prepare_pro_info() {
655 + return array(
656 + 'personal' => array(
657 + 'id' => 2,
658 + 'download' => 19367654,
659 + 'price' => '49.00',
660 + 'name' => 'Personal',
661 + ),
662 + 'professional' => array(
663 + 'id' => 0,
664 + 'download' => 19367001,
665 + 'price' => '99.00',
666 + 'name' => 'Creator',
667 + ),
668 + 'smallbusiness' => array(
669 + 'id' => 0,
670 + 'download' => 19366995,
671 + 'price' => '199.00',
672 + 'name' => 'Business',
673 + ),
674 + 'enterprise' => array(
675 + 'id' => 0,
676 + 'download' => 19366992,
677 + 'price' => '399.00',
678 + 'name' => 'Elite',
679 + ),
680 + );
934 681 }
935 682
936 683 /**
937 - * @since 5.0.10
938 - *
939 - * @return string
684 + * @since 3.04.02
940 685 */
941 - protected static function get_current_plugin() {
942 - if ( empty( self::$plugin ) ) {
943 - self::$plugin = FrmAppHelper::get_param( 'plugin', '', 'post', 'esc_url_raw' );
944 - }
945 - return self::$plugin;
946 - }
686 + public static function ajax_install_addon() {
947 687
948 - /**
949 - * @since 4.08
950 - *
951 - * @return array|void
952 - */
953 - protected static function download_and_activate() {
954 - if ( is_admin() ) {
955 - FrmAppHelper::set_current_screen_and_hook_suffix();
956 - }
688 + self::install_addon_permissions();
957 689
690 + // Set the current screen to avoid undefined notices.
691 + global $hook_suffix;
692 + set_current_screen();
693 +
958 694 self::maybe_show_cred_form();
959 695
960 696 $installed = self::install_addon();
961 - if ( is_array( $installed ) && isset( $installed['message'] ) ) {
962 - return $installed;
963 - }
964 - self::handle_addon_action( $installed, 'activate' );
697 + self::maybe_activate_addon( $installed );
698 +
699 + // Send back a response.
700 + echo json_encode( __( 'Your plugin has been installed. Please reload the page to see more options.', 'formidable' ) );
701 + wp_die();
965 702 }
966 703
967 704 /**
968 705 * @since 3.04.02
969 - *
970 - * @return void
971 706 */
972 - protected static function maybe_show_cred_form() {
973 - if ( ! function_exists( 'request_filesystem_credentials' ) ) {
974 - include_once ABSPATH . 'wp-admin/includes/file.php';
975 - }
976 -
977 - // Start output buffering to catch the filesystem form if credentials are needed.
707 + private static function maybe_show_cred_form() {
708 + // Start output bufferring to catch the filesystem form if credentials are needed.
978 709 ob_start();
979 710
980 711 $show_form = false;
981 - $method = '';
982 - $url = add_query_arg( array( 'page' => 'formidable-settings' ), admin_url( 'admin.php' ) );
983 - $url = esc_url_raw( $url );
984 - $creds = request_filesystem_credentials( $url, $method, false, false, null );
712 + $method = '';
713 + $url = add_query_arg( array( 'page' => 'formidable-settings' ), admin_url( 'admin.php' ) );
714 + $url = esc_url_raw( $url );
715 + $creds = request_filesystem_credentials( $url, $method, false, false, null );
985 716
986 717 if ( false === $creds ) {
987 718 $show_form = true;
988 719 } elseif ( ! WP_Filesystem( $creds ) ) {
@@ -990,17 +721,12 @@
990 721 $show_form = true;
991 722 }
992 723
993 724 if ( $show_form ) {
994 - $form = ob_get_clean();
995 - $message = __( 'Sorry, your site requires FTP authentication. Please download plugins from FormidableForms.com and install them manually.', 'formidable' );
996 - $data = $form;
997 - $response = array(
998 - 'success' => false,
999 - 'message' => $message,
1000 - 'form' => $form,
1001 - );
1002 - wp_send_json( $response );
725 + $form = ob_get_clean();
726 + //TODO: test this: echo json_encode( array( 'form' => $form ) );
727 + echo json_encode( array( 'form' => __( 'Sorry, you\'re site requires FTP authentication. Please install plugins manaully.', 'formidable' ) ) );
728 + wp_die();
1003 729 }
1004 730
1005 731 ob_end_clean();
1006 732 }
@@ -1005,38 +731,18 @@
1005 731 ob_end_clean();
1006 732 }
1007 733
1008 734 /**
1009 - * Checks if an addon download url is allowed.
1010 - *
1011 - * @since 6.2
1012 - *
1013 - * @param string $download_url
1014 - *
1015 - * @return bool
1016 - */
1017 - public static function url_is_allowed( $download_url ) {
1018 - return FrmAppHelper::validate_url_is_in_s3_bucket( $download_url, 'zip' ) || in_array( $download_url, self::allowed_external_urls(), true );
1019 - }
1020 -
1021 - /**
1022 735 * We do not need any extra credentials if we have gotten this far,
1023 736 * so let's install the plugin.
1024 737 *
1025 738 * @since 3.04.02
1026 739 */
1027 - protected static function install_addon() {
1028 - require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
740 + private static function install_addon() {
741 + require_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );
1029 742
1030 - $download_url = self::get_current_plugin();
743 + $download_url = esc_url_raw( $_POST['plugin'] );
1031 744
1032 - if ( ! self::url_is_allowed( $download_url ) ) {
1033 - return array(
1034 - 'message' => 'Plugin URL is not valid',
1035 - 'success' => false,
1036 - );
1037 - }
1038 -
1039 745 // Create the plugin upgrader with our custom skin.
1040 746 $installer = new Plugin_Upgrader( new FrmInstallerSkin() );
1041 747 $installer->install( $download_url );
1042 748
@@ -1041,187 +747,58 @@
1041 747 $installer->install( $download_url );
1042 748
1043 749 // Flush the cache and return the newly installed plugin basename.
1044 750 wp_cache_flush();
1045 -
1046 - $plugin = $installer->plugin_info();
1047 - if ( ! $plugin ) {
1048 - return array(
1049 - 'message' => 'Plugin was not installed. ' . $installer->result,
1050 - 'success' => false,
1051 - );
1052 - }
1053 - return $plugin;
751 + return $installer->plugin_info();
1054 752 }
1055 753
1056 754 /**
1057 - * Handle the AJAX request to activate an add-on.
1058 - *
1059 - * @since 6.8
1060 - *
1061 - * @return void
755 + * @since 3.06.03
1062 756 */
1063 757 public static function ajax_activate_addon() {
1064 - self::process_addon_action(
1065 - function ( $plugin ) {
1066 - return self::handle_addon_action( $plugin, 'activate' );
1067 - },
1068 - array( 'FrmAddonsController', 'get_addon_activation_response' )
1069 - );
1070 - }
1071 758
1072 - /**
1073 - * @since 3.04.02
1074 - *
1075 - * @param string $installed The plugin folder name with file name.
1076 - */
1077 - protected static function maybe_activate_addon( $installed ) {
1078 - self::ajax_activate_addon();
1079 - }
759 + self::install_addon_permissions();
1080 760
1081 - /**
1082 - * Handle the AJAX request to deactivate an add-on.
1083 - *
1084 - * @since 6.8
1085 - *
1086 - * @return void
1087 - */
1088 - public static function ajax_deactivate_addon() {
1089 - self::process_addon_action(
1090 - function ( $plugin ) {
1091 - return self::handle_addon_action( $plugin, 'deactivate' );
1092 - }
1093 - );
1094 - }
761 + // Set the current screen to avoid undefined notices.
762 + global $hook_suffix;
763 + set_current_screen();
1095 764
1096 - /**
1097 - * Handle the AJAX request to uninstall an add-on.
1098 - *
1099 - * @since 6.8
1100 - *
1101 - * @return void
1102 - */
1103 - public static function ajax_uninstall_addon() {
1104 - self::process_addon_action(
1105 - function ( $plugin ) {
1106 - return self::handle_addon_action( $plugin, 'uninstall' );
1107 - }
1108 - );
1109 - }
1110 -
1111 - /**
1112 - * Process a specific action (activate, deactivate, uninstall) on an add-on.
1113 - *
1114 - * @since 6.8
1115 - *
1116 - * @param callable $action_callback The specific add-on action to be executed.
1117 - * @param callable|null $response_callback Optional. The response handling callback. Default null.
1118 - * @return void
1119 - */
1120 - private static function process_addon_action( $action_callback, $response_callback = null ) {
1121 - self::install_addon_permissions();
1122 - FrmAppHelper::set_current_screen_and_hook_suffix();
1123 -
1124 765 $plugin = FrmAppHelper::get_param( 'plugin', '', 'post', 'sanitize_text_field' );
1125 - call_user_func( $action_callback, $plugin );
766 + self::maybe_activate_addon( $plugin );
1126 767
1127 - if ( is_callable( $response_callback ) ) {
1128 - wp_send_json_success( call_user_func( $response_callback ) );
1129 - return;
1130 - }
1131 -
1132 - wp_send_json_success();
768 + // Send back a response.
769 + echo json_encode( __( 'Your plugin has been activated. Please reload the page to see more options.', 'formidable' ) );
770 + wp_die();
1133 771 }
1134 772
1135 773 /**
1136 - * Attempt to perform a specific action (activate, deactivate, uninstall) on an add-on.
1137 - *
1138 - * @since 6.8
1139 - *
1140 - * @param string $installed The plugin folder name with file name.
1141 - * @param string $action The action type ('activate', 'deactivate', 'uninstall').
1142 - * @return array|void
774 + * @since 3.04.02
775 + * @param string $installed The plugin folder name with file name
1143 776 */
1144 - protected static function handle_addon_action( $installed, $action ) {
1145 - if ( ! $installed || ! $action ) {
777 + private static function maybe_activate_addon( $installed ) {
778 + if ( ! $installed ) {
1146 779 return;
1147 780 }
1148 781
1149 - $result = null;
1150 - switch ( $action ) {
1151 - case 'activate':
1152 - $result = self::activate_plugin( $installed );
1153 - break;
1154 - case 'deactivate':
1155 - self::deactivate_plugin( $installed );
1156 - break;
1157 - case 'uninstall':
1158 - $result = self::uninstall_plugin( $installed );
1159 - break;
1160 - }
1161 -
1162 - if ( is_wp_error( $result ) ) {
782 + $activate = activate_plugin( $installed );
783 + if ( is_wp_error( $activate ) ) {
1163 784 // Ignore the invalid header message that shows with nested plugins.
1164 - if ( $result->get_error_code() !== 'no_plugin_header' ) {
1165 - if ( wp_doing_ajax() ) {
1166 - wp_send_json_error( array( 'error' => $result->get_error_message() ) );
1167 - }
1168 - return array(
1169 - 'message' => $result->get_error_message(),
1170 - 'success' => false,
1171 - );
785 + if ( $activate->get_error_code() !== 'no_plugin_header' ) {
786 + echo json_encode( array( 'error' => $activate->get_error_message() ) );
787 + wp_die();
1172 788 }
1173 789 }
1174 -
1175 - return $result;
1176 790 }
1177 791
1178 792 /**
1179 - * @return array
1180 - */
1181 - private static function get_addon_activation_response() {
1182 - $activating_page = self::get_activating_page();
1183 -
1184 - $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' );
1185 -
1186 - $response = array(
1187 - 'message' => $message,
1188 - 'saveAndReload' => $activating_page,
1189 - );
1190 -
1191 - return $response;
1192 - }
1193 -
1194 - /**
1195 - * Return a string that reflects the page from which the addon is being activated on,
1196 - * if it is from settings or form builder, otherwise return empty string.
1197 - *
1198 - * @return string
1199 - */
1200 - private static function get_activating_page() {
1201 - $referer = FrmAppHelper::get_server_value( 'HTTP_REFERER' );
1202 - if ( false !== strpos( $referer, 'frm_action=settings' ) ) {
1203 - return 'settings';
1204 - }
1205 -
1206 - if ( false !== strpos( $referer, 'frm_action=edit' ) ) {
1207 - return 'form_builder';
1208 - }
1209 -
1210 - return '';
1211 - }
1212 -
1213 - /**
1214 793 * Run security checks before installing
1215 794 *
1216 795 * @since 3.04.02
1217 - *
1218 - * @return void
1219 796 */
1220 - protected static function install_addon_permissions() {
797 + private static function install_addon_permissions() {
1221 798 check_ajax_referer( 'frm_ajax', 'nonce' );
1222 799
1223 - if ( ! current_user_can( 'activate_plugins' ) || ! self::get_current_plugin() ) {
800 + if ( ! current_user_can( 'activate_plugins' ) || ! isset( $_POST['plugin'] ) ) {
1224 801 echo json_encode( true );
1225 802 wp_die();
1226 803 }
1227 804 }
@@ -1226,288 +803,89 @@
1226 803 }
1227 804 }
1228 805
1229 806 /**
1230 - * @since 4.08
1231 - *
1232 - * @return string
807 + * @since 3.04.03
808 + * @deprecated 3.06
809 + * @codeCoverageIgnore
810 + * @return array
1233 811 */
1234 - public static function connect_link() {
1235 - $auth = get_option( 'frm_connect_token' );
1236 - if ( empty( $auth ) ) {
1237 - $auth = hash( 'sha512', wp_rand() );
1238 - update_option( 'frm_connect_token', $auth, 'no' );
1239 - }
1240 - $page = FrmAppHelper::simple_get( 'page', 'sanitize_title', 'formidable-settings' );
1241 - $link = 'https://formidableforms.com/api-connect/';
1242 - $args = array(
1243 - 'v' => 2,
1244 - 'siteurl' => FrmAppHelper::site_url(),
1245 - 'url' => get_rest_url(),
1246 - 'inst' => (int) FrmAppHelper::pro_is_included(),
1247 - 'return' => $page,
1248 - 'token' => $auth,
1249 - 'l' => self::get_pro_license(),
1250 - );
1251 -
1252 - return add_query_arg( $args, $link );
812 + public static function error_for_license( $license ) {
813 + return FrmDeprecated::error_for_license( $license );
1253 814 }
1254 815
1255 816 /**
1256 - * Check the auth value for install permission.
1257 - *
1258 - * @since 4.08
1259 - *
1260 - * @return bool
817 + * @since 3.04.03
818 + * @deprecated 3.06
819 + * @codeCoverageIgnore
1261 820 */
1262 - public static function can_install_addon_api() {
1263 - // Verify params present (auth & download link).
1264 - $post_auth = FrmAppHelper::get_param( 'token', '', 'request', 'sanitize_text_field' );
1265 - $post_url = FrmAppHelper::get_param( 'file_url', '', 'request', 'sanitize_text_field' );
1266 -
1267 - // The download link is not required if already installed.
1268 - $is_installed = FrmAppHelper::pro_is_included();
1269 - $file_missing = ! $is_installed && empty( $post_url );
1270 - if ( ! $post_auth || $file_missing ) {
1271 - return false;
1272 - }
1273 -
1274 - // Verify auth.
1275 - $auth = get_option( 'frm_connect_token' );
1276 - if ( empty( $auth ) || ! hash_equals( $auth, $post_auth ) ) {
1277 - return false;
1278 - }
1279 -
1280 - return true;
821 + public static function get_pro_updater() {
822 + return FrmDeprecated::get_pro_updater();
1281 823 }
1282 824
1283 825 /**
1284 - * Install and/or activate the add-on file.
826 + * @since 3.04.03
827 + * @deprecated 3.06
828 + * @codeCoverageIgnore
1285 829 *
1286 - * @since 4.08
1287 - *
1288 830 * @return array
1289 831 */
1290 - public static function install_addon_api() {
1291 - self::$plugin = FrmAppHelper::get_param( 'file_url', '', 'request', 'esc_url_raw' );
1292 -
1293 - $error = esc_html__( 'Could not install an upgrade. Please download from formidableforms.com and install manually.', 'formidable' );
1294 -
1295 - // Delete so cannot replay.
1296 - delete_option( 'frm_connect_token' );
1297 -
1298 - // It's already installed and active.
1299 - $active = self::activate_plugin( 'formidable-pro/formidable-pro.php', false, false, true );
1300 - if ( is_wp_error( $active ) ) {
1301 - $response = self::maybe_download_and_activate();
1302 - if ( is_array( $response ) ) {
1303 - // The download failed.
1304 - return $response;
1305 - }
1306 - }
1307 -
1308 - // If empty license, save it now.
1309 - if ( empty( self::get_pro_license() ) && function_exists( 'load_formidable_pro' ) ) {
1310 - load_formidable_pro();
1311 - $license = stripslashes( FrmAppHelper::get_param( 'key', '', 'request', 'sanitize_text_field' ) );
1312 - if ( ! $license ) {
1313 - return array(
1314 - 'success' => false,
1315 - 'error' => 'That site does not have a valid license key.',
1316 - );
1317 - }
1318 -
1319 - $response = FrmAddon::activate_license_for_plugin( $license, 'formidable_pro' );
1320 - if ( ! $response['success'] ) {
1321 - // Could not activate license.
1322 - return $response;
1323 - }
1324 - }
1325 -
1326 - return array(
1327 - 'success' => true,
1328 - );
832 + public static function get_addon_info( $license = '' ) {
833 + return FrmDeprecated::get_addon_info( $license );
1329 834 }
1330 835
1331 836 /**
1332 - * @since 6.8.3
837 + * @since 3.04.03
838 + * @deprecated 3.06
839 + * @codeCoverageIgnore
1333 840 *
1334 - * @return array|true
841 + * @return string
1335 842 */
1336 - private static function maybe_download_and_activate() {
1337 - if ( ! self::$plugin ) {
1338 - return array(
1339 - 'success' => false,
1340 - 'message' => __( 'The plugin download was not found.', 'formidable' ),
1341 - );
1342 - }
1343 -
1344 - // Download plugin now.
1345 - $response = self::download_and_activate();
1346 - if ( is_array( $response ) && isset( $response['success'] ) ) {
1347 - // The download failed.
1348 - return $response;
1349 - }
1350 -
1351 - return true;
843 + public static function get_cache_key( $license ) {
844 + return FrmDeprecated::get_cache_key( $license );
1352 845 }
1353 846
1354 847 /**
1355 - * Render a conditional action button for a specified plugin
1356 - *
1357 - * @since 4.09
1358 - *
1359 - * @param string $plugin
1360 - * @param array|string $upgrade_link_args
1361 - * @return void
848 + * @since 3.04.03
849 + * @deprecated 3.06
850 + * @codeCoverageIgnore
1362 851 */
1363 - public static function conditional_action_button( $plugin, $upgrade_link_args ) {
1364 - if ( is_callable( 'FrmProAddonsController::conditional_action_button' ) ) {
1365 - FrmProAddonsController::conditional_action_button( $plugin, $upgrade_link_args );
1366 - return;
1367 - }
1368 -
1369 - $addon = self::get_addon( $plugin );
1370 - $upgrade_link = FrmAppHelper::admin_upgrade_link( $upgrade_link_args );
1371 -
1372 - if ( ! is_array( $upgrade_link_args ) ) {
1373 - // A string $upgrade_link_args is used for the utm-medium value when calling
1374 - // FrmAppHelper::admin_upgrade_link above.
1375 - // For self::addon_upgrade_link, we'll pass just an empty array with the link key (set below).
1376 - $upgrade_link_args = array();
1377 - }
1378 -
1379 - $upgrade_link_args['link'] = $upgrade_link;
1380 -
1381 - self::addon_upgrade_link( $addon, $upgrade_link_args );
852 + public static function reset_cached_addons( $license = '' ) {
853 + FrmDeprecated::reset_cached_addons( $license );
1382 854 }
1383 855
1384 856 /**
1385 - * Render a conditional action button for an add on
857 + * @since 2.03.08
858 + * @deprecated 3.04.03
859 + * @codeCoverageIgnore
1386 860 *
1387 - * @since 4.09.01
861 + * @param boolean $return
862 + * @param string $package
1388 863 *
1389 - * @param array $atts {
1390 - * Button attributes.
1391 - *
1392 - * @type array $addon
1393 - * @type false|string $license_type
1394 - * @type string $plan_required
1395 - * @type string $upgrade_link
1396 - * }
1397 - * @return void
864 + * @return boolean
1398 865 */
1399 - public static function show_conditional_action_button( $atts ) {
1400 - if ( is_callable( 'FrmProAddonsController::show_conditional_action_button' ) ) {
1401 - FrmProAddonsController::show_conditional_action_button( $atts );
1402 - return;
1403 - }
1404 -
1405 - self::addon_upgrade_link( $atts['addon'], $atts['upgrade_link'] );
866 + public static function add_shorten_edd_filename_filter( $return, $package ) {
867 + return FrmDeprecated::add_shorten_edd_filename_filter( $return, $package );
1406 868 }
1407 869
1408 870 /**
1409 - * @since 4.09.01
871 + * @since 2.03.08
872 + * @deprecated 3.04.03
873 + * @codeCoverageIgnore
1410 874 *
1411 - * @param array|false $addon
1412 - * @param array|string $upgrade_link
875 + * @param string $filename
876 + * @param string $ext
1413 877 *
1414 - * @return void
878 + * @return string
1415 879 */
1416 - public static function addon_upgrade_link( $addon, $upgrade_link ) {
1417 - $atts = is_array( $upgrade_link ) ? $upgrade_link : array();
1418 - $upgrade_link = is_array( $upgrade_link ) ? $upgrade_link['link'] : $upgrade_link;
1419 - $text = ! empty( $atts['text'] ) ? $atts['text'] : __( 'Upgrade Now', 'formidable' );
1420 -
1421 - if ( $addon ) {
1422 - $upgrade_link .= '&utm_content=' . $addon['slug'];
1423 - }
1424 -
1425 - if ( $addon && isset( $addon['categories'] ) && in_array( 'Solution', $addon['categories'], true ) ) {
1426 - // Solutions will go to a separate page.
1427 - $upgrade_link = FrmAppHelper::admin_upgrade_link( 'addons', $addon['link'] );
1428 - }
1429 -
1430 - $class = ! empty( $atts['class'] ) ? $atts['class'] : '';
1431 - if ( strpos( $class, 'frm-button' ) === false ) {
1432 - $class .= ' frm-button-secondary frm-button-sm';
1433 - }
1434 - ?>
1435 - <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' ); ?>">
1436 - <?php echo esc_html( $text ); ?>
1437 - </a>
1438 - <?php
880 + public static function shorten_edd_filename( $filename, $ext ) {
881 + return FrmDeprecated::shorten_edd_filename( $filename, $ext );
1439 882 }
1440 883
1441 884 /**
1442 - * @since 3.04.02
1443 - *
1444 - * @return void
885 + * @deprecated 3.04.03
886 + * @codeCoverageIgnore
1445 887 */
1446 - public static function ajax_install_addon() {
1447 - self::install_addon_permissions();
1448 -
1449 - $result = self::download_and_activate();
1450 - if ( isset( $result['success'] ) && ! $result['success'] ) {
1451 - echo json_encode( $result );
1452 - wp_die();
1453 - }
1454 -
1455 - echo json_encode( self::get_addon_activation_response() );
1456 - wp_die();
1457 - }
1458 -
1459 - /**
1460 - * Allowed URLs used for internal source of plugins installation.
1461 - *
1462 - * @since 6.3.1
1463 - *
1464 - * @return array
1465 - */
1466 - private static function allowed_external_urls() {
1467 - $allowed_url_list = array(
1468 - 'https://downloads.wordpress.org/plugin/formidable-gravity-forms-importer.zip',
1469 - 'https://downloads.wordpress.org/plugin/formidable-import-pirate-forms.zip',
1470 - 'https://downloads.wordpress.org/plugin/wp-mail-smtp.zip',
1471 - );
1472 -
1473 - /**
1474 - * List of URLs used in plugin formidable internal installation.
1475 - *
1476 - * @since 6.3.1
1477 - *
1478 - * @param array $allowed_url_list List of URLs.
1479 - */
1480 - $allowed_url_list = apply_filters( 'frm_allowed_external_urls', $allowed_url_list );
1481 -
1482 - if ( ! is_array( $allowed_url_list ) ) {
1483 - _doing_it_wrong( __METHOD__, 'Only an array of URLs could be used within this filter.', '6.3.1' );
1484 -
1485 - return array();
1486 - }
1487 -
1488 - return $allowed_url_list;
1489 - }
1490 -
1491 - /**
1492 - * Gets required plan for an addon.
1493 - *
1494 - * @since 6.4.2
1495 - *
1496 - * @return string Empty string if no plan is required for active license.
1497 - */
1498 - public static function get_addon_required_plan( $addon_id ) {
1499 - $api = new FrmFormApi();
1500 - $addons = $api->get_api_info();
1501 -
1502 - if ( is_array( $addons ) && array_key_exists( $addon_id, $addons ) ) {
1503 - $dates = $addons[ $addon_id ];
1504 - $requires = FrmFormsHelper::get_plan_required( $dates );
1505 - }
1506 -
1507 - if ( ! isset( $requires ) || ! is_string( $requires ) ) {
1508 - $requires = '';
1509 - }
1510 -
1511 - return $requires;
888 + public static function get_licenses() {
889 + FrmDeprecated::get_licenses();
1512 890 }
1513 891 }