dvadf
File manager - Edit - /home/centroca/public_html/Lite.zip
Back
PK �D0]a�c� � SetupWizard/RestApi.phpnu �[��� <?php namespace WPForms\Lite\SetupWizard; use WP_Error; use WPForms\SetupWizard\RestApi as BaseRestApi; /** * Setup Wizard REST API (Lite). * * Completes license activation by upgrading the site from Lite to Pro: it * resolves the license-keyed Pro package, downloads it, and swaps the active * plugin. Mirrors the proven install flow in * {@see \WPForms\Lite\Admin\Connect::process()}. * * @since 2.0.0 */ class RestApi extends BaseRestApi { /** * WPForms Pro plugin basename: the swap target. * * @since 2.0.0 * * @var string */ private const PRO_PLUGIN = 'wpforms/wpforms.php'; /** * Validate a key against the license API, then upgrade Lite to Pro. * * The validated key is persisted before the install runs, so a valid key is * never lost if the Pro install fails. * * @since 2.0.0 * * @param string $key License key. * * @return array|WP_Error */ protected function activate_license( string $key ) { if ( ! wpforms_can_install( 'plugin' ) ) { return new WP_Error( 'wpforms_setup_wizard_license_forbidden', esc_html__( 'You are not allowed to install plugins on this site.', 'wpforms-lite' ), [ 'status' => 403 ] ); } $response = parent::activate_license( $key ); if ( is_wp_error( $response ) || empty( $response['success'] ) ) { return $response; } // Handoff the Pro bootstrap consumption to activate the license after the swap. update_option( 'wpforms_connect', $key ); $package_url = $this->get_pro_package_url( $key ); if ( $package_url === '' ) { return new WP_Error( 'wpforms_setup_wizard_license_package', esc_html__( 'Could not retrieve the WPForms Pro download. Please try again later.', 'wpforms-lite' ), [ 'status' => 502 ] ); } $installed = $this->install_pro( $package_url ); if ( is_wp_error( $installed ) ) { return $installed; } $response['message'] = esc_html__( 'WPForms Pro installed and activated.', 'wpforms-lite' ); return $response; } /** * Resolve the license-keyed WPForms Pro download URL. * * Tries the current `get-plugin-updates` action (slug-keyed `package`), * falling back to the legacy `get-plugin-info` action (`download_link`). * * @since 2.0.0 * * @param string $key License key. * * @return string Download URL, or an empty string when unavailable. */ private function get_pro_package_url( string $key ): string { $updates = $this->license_api_request( 'get-plugin-updates', $key, [ 'tgm-updater-plugins' => 'wpforms' ] ); $package = $this->extract_package_url( $updates ); if ( $package !== '' ) { return $package; } $info = $this->license_api_request( 'get-plugin-info', $key, [ 'tgm-updater-plugin' => 'wpforms' ] ); if ( $info !== null && ! empty( $info['download_link'] ) ) { return (string) $info['download_link']; } return ''; } /** * Pull a `package` URL out of a plugin-updates response. * * Handles both the flat shape (`{ package: … }`) and the slug-keyed shape * (`{ "wpforms-pro": { package: … } }`). * * @since 2.0.0 * * @param array|null $updates Decoded plugin-updates response. * * @return string Package URL, or an empty string when absent. */ private function extract_package_url( ?array $updates ): string { if ( $updates === null ) { return ''; } if ( ! empty( $updates['package'] ) ) { return (string) $updates['package']; } foreach ( [ 'wpforms-pro', 'wpforms' ] as $slug ) { if ( is_array( $updates[ $slug ] ?? null ) && ! empty( $updates[ $slug ]['package'] ) ) { return (string) $updates[ $slug ]['package']; } } return ''; } /** * Install WPForms Pro and swap it in for Lite. * * Filesystem prep and the silent install itself are delegated to the shared * `Helpers\Plugin` service so both call sites stay in lockstep; this method * only owns the Pro-specific error message and the Lite-to-Pro swap. * * @since 2.0.0 * * @param string $package_url WPForms Pro download URL. * * @return true|WP_Error */ private function install_pro( string $package_url ) { $generic_error = esc_html__( 'There was an error while installing WPForms Pro. Please download it from wpforms.com and install it manually.', 'wpforms-lite' ); // Download and install only when Pro is not already on disk. if ( ! $this->is_pro_installed() ) { $plugin = wpforms()->obj( 'plugin' ); if ( $plugin === null ) { return new WP_Error( 'wpforms_setup_wizard_license_installer', $generic_error, [ 'status' => 500 ] ); } $installed = $plugin->install_from_url( self::PRO_PLUGIN, $package_url ); if ( is_wp_error( $installed ) ) { return new WP_Error( 'wpforms_setup_wizard_license_install_failed', $generic_error, [ 'status' => 500 ] ); } } return $this->swap_to_pro( $generic_error ); } /** * Swap the active plugin from Lite to Pro. * * Deactivates Lite (option-only; Lite's loaded code serves the rest of this * request) and activates Pro silently. Silent activation is mandatory: WP's * `plugin_sandbox_scrape()` includes the Pro main file, and the * `function_exists( 'wpforms' )` guard in `wpforms.php` makes it bail without * redeclaring. Pro bootstraps on the next request. * * @since 2.0.0 * * @param string $generic_error Fallback user-facing error message. * * @return true|WP_Error */ private function swap_to_pro( string $generic_error ) { if ( ! function_exists( 'activate_plugin' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $lite_plugin = plugin_basename( WPFORMS_PLUGIN_FILE ); deactivate_plugins( $lite_plugin ); /** This action is documented in wpforms.php. */ do_action( 'wpforms_plugin_deactivated', $lite_plugin ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName, WPForms.Comments.PHPDocHooks.RequiredHookDocumentation $activated = activate_plugin( self::PRO_PLUGIN, '', false, true ); if ( is_wp_error( $activated ) ) { // Roll back so the site is never left with neither version active. activate_plugin( $lite_plugin, '', false, true ); return new WP_Error( 'wpforms_setup_wizard_license_activation_failed', $generic_error, [ 'status' => 500 ] ); } // Trigger the Pro installation routine (and license handoff) on next load. add_option( 'wpforms_install', 1 ); return true; } /** * Whether WPForms Pro is already present under the plugins directory. * * @since 2.0.0 * * @return bool */ private function is_pro_installed(): bool { return file_exists( trailingslashit( WP_PLUGIN_DIR ) . self::PRO_PLUGIN ); } } PK �D0]�w>�w w Emails/Summaries.phpnu �[��� <?php namespace WPForms\Lite\Emails; use WPForms\Lite\Reports\EntriesCount; use WPForms\Emails\Summaries as BaseSummaries; /** * Email Summaries. * * @since 1.8.8 */ class Summaries extends BaseSummaries { /** * Whether counting entries is allowed for Lite users. * * @since 1.8.8 * * @var bool */ private $allow_entries_count_lite; /** * Constructor for the class. * Initializes the object and registers the Lite weekly entries count cron schedule. * * @since 1.8.8 */ public function __construct() { // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName // Disabling this filter will prevent entries submission count from being updated. /** This filter is documented in /lite/wpforms-lite.php */ $this->allow_entries_count_lite = apply_filters( 'wpforms_dash_widget_allow_entries_count_lite', true ); // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName parent::__construct(); // Register the Lite weekly entries count cron schedule. $this->register_entries_count_schedule(); } /** * Hooks. * * @since 1.8.8 */ public function hooks() { parent::hooks(); // The following schedule is essential for the Lite version. // Regardless of the "Weekly Summaries" feature being disabled or enabled, // it ensures that entries numbers are consistently updated. if ( ! $this->allow_entries_count_lite ) { return; } add_action( 'wpforms_weekly_entries_count_cron', [ $this, 'entries_count_cron' ] ); } /** * Adjusts the Lite weekly entries count cron schedule. * * This function modifies the Lite weekly entries count cron schedule by reducing the interval by 5 seconds. * * @since 1.8.8 * @deprecated 1.9.1 * * @param array $schedules WP cron schedules. * * @return array */ public function weekly_entries_count( $schedules ) { _deprecated_function( __METHOD__, '1.9.1 of the WPForms plugin' ); $schedules['wpforms_weekly_entries_count'] = [ 'interval' => $this->get_next_launch_time() - time(), 'display' => esc_html__( 'Calculate WPForms Lite Weekly Entries Count', 'wpforms-lite' ), ]; return $schedules; } /** * Run the cron job to update entries count for Lite users. * * This function retrieves the current entries count for Lite users, calculates the count for the * previous week, and updates the necessary post meta data for trend calculations. * * @since 1.8.8 */ public function entries_count_cron() { // Get entries count for Lite users. $entries = ( new EntriesCount() )->get_by_form(); // Exit if there are no form entries to update. if ( empty( $entries ) ) { return; } foreach ( $entries as $form_id => &$form ) { // Set total entries count to the current count. $form['total'] = $form['count']; // Retrieve the previous week's count data from post meta. $previous_week_count = get_post_meta( $form_id, 'wpforms_entries_count_previous_week', true ); // Continue to the next form if the count data is not valid. if ( ! is_array( $previous_week_count ) || count( $previous_week_count ) !== 3 ) { $prev_count_previous_week = $form['total']; // Set the previous week's count zero "0" if the form was published less than or equal to 7 days ago. if ( $this->is_form_created_in_7days( $form_id ) ) { $prev_count_previous_week = 0; } update_post_meta( $form_id, 'wpforms_entries_count_previous_week', [ $form['total'], $form['total'], $prev_count_previous_week ] ); continue; } list( $total_previous_week, $count_previous_week ) = $previous_week_count; // Calculate count, count_previous_week, and trends. $form['count'] = $form['total'] - $total_previous_week; if ( count( array_unique( $previous_week_count ) ) === 1 ) { // If the previous week's count is the same as the current count, skip trends calculation. update_post_meta( $form_id, 'wpforms_entries_count_previous_week_skip_trends', true ); } else { // If the previous week's count is different from the current count, calculate trends. delete_post_meta( $form_id, 'wpforms_entries_count_previous_week_skip_trends' ); } // Update post meta data for trend calculations. update_post_meta( $form_id, 'wpforms_entries_count_previous_week', [ $form['total'], $form['count'], $count_previous_week ] ); } } /** * Get form entries. * * @since 1.8.8 * * @return array */ protected function get_entries(): array { return ( new EntriesCount() )->get_form_trends(); } /** * Register entries count schedule. * * @since 1.8.8 */ private function register_entries_count_schedule() { if ( ! $this->allow_entries_count_lite && wp_next_scheduled( 'wpforms_weekly_entries_count_cron' ) ) { wp_clear_scheduled_hook( 'wpforms_weekly_entries_count_cron' ); return; } if ( $this->allow_entries_count_lite && ! wp_next_scheduled( 'wpforms_weekly_entries_count_cron' ) ) { // Since v1.9.1 we use a single event and manually reoccur it // because a recurring event cannot guarantee // its firing at the same time during WP_CLI execution. wp_schedule_single_event( $this->get_next_launch_time(), 'wpforms_weekly_entries_count_cron' ); } } /** * Get next Monday midnight with WordPress offset. * * @since 1.9.1 * * @return int */ protected function get_next_launch_time(): int { $datetime = date_create( 'next monday', wp_timezone() ); if ( ! $datetime ) { return time() + WEEK_IN_SECONDS; } return absint( $datetime->getTimestamp() ); } /** * Check if the given form_id was published less than or equal to 7 days ago. * * @since 1.8.8 * * @param int $form_id The ID of the form (post). * * @return bool */ private function is_form_created_in_7days( int $form_id ): bool { // Get the form (post) publish date. $date_created = get_post_field( 'post_date', $form_id, 'raw' ); // If the form date is not available, return false. if ( empty( $date_created ) ) { return false; } // Calculate the time difference between the post date and the current date. $time_difference = time() - strtotime( $date_created ); // Compare the time difference with 7 days in seconds. return $time_difference <= 7 * DAY_IN_SECONDS; } } PK �D0]��Fm� � ) Admin/Education/Builder/Notifications.phpnu �[��� <?php namespace WPForms\Lite\Admin\Education\Builder; use WPForms\Admin\Education\EducationInterface; use WPForms_Builder_Panel_Settings; /** * Notifications Education feature. * * @since 1.7.7 */ class Notifications implements EducationInterface { /** * Init. * * @since 1.7.7 */ public function init() { if ( ! $this->allow_load() ) { return; } $this->hooks(); } /** * Indicate if current Education feature is allowed to load. * * @since 1.7.7 * * @return bool */ public function allow_load() { return wpforms_is_admin_page( 'builder' ); } /** * Load hooks. * * @since 1.7.7 */ private function hooks() { add_action( 'wpforms_lite_form_settings_notifications_block_content_after', [ $this, 'advanced_section' ], 10, 2 ); } /** * Output Notification Advanced section. * * @since 1.7.7 * * @param WPForms_Builder_Panel_Settings $settings Builder panel settings. * @param int $id Notification id. */ public function advanced_section( $settings, $id ) { /** * Filter the "Advanced" content. * * @since 1.8.5 * * @param string $content The content. * @param WPForms_Builder_Panel_Settings $settings Builder panel settings. * @param int $id Notification id. */ $content = apply_filters( 'wpforms_lite_admin_education_builder_notifications_advanced_settings_content', '', $settings, $id ); $content .= wpforms_panel_field( 'toggle', 'notifications', 'file_upload_attachment_enable', $settings->form_data, esc_html__( 'Enable File Upload Attachments', 'wpforms-lite' ), [ 'input_class' => 'notifications_enable_file_upload_attachment_toggle education-modal', 'parent' => 'settings', 'subsection' => $id, 'pro_badge' => true, 'data' => [ 'action' => 'upgrade', 'name' => esc_html__( 'File Upload Attachments', 'wpforms-lite' ), 'utm-content' => 'File Upload Attachments', 'licence' => 'pro', ], 'attrs' => [ 'disabled' => 'disabled', ], 'value' => false, ], false ); $content .= wpforms_panel_field( 'toggle', 'notifications', 'entry_csv_attachment_enable', $settings->form_data, esc_html__( 'Enable Entry CSV Attachment', 'wpforms-lite' ), [ 'input_class' => 'notifications_enable_entry_csv_attachment_toggle education-modal', 'parent' => 'settings', 'subsection' => $id, 'pro_badge' => true, 'data' => [ 'action' => 'upgrade', 'name' => esc_html__( 'Entry CSV Attachment', 'wpforms-lite' ), 'utm-content' => 'Entry CSV Attachment', 'licence' => 'pro', ], 'attrs' => [ 'disabled' => 'disabled', ], 'value' => false, ], false ); // Wrap advanced settings to the unfoldable group. wpforms_panel_fields_group( $content, [ 'borders' => [ 'top' ], 'class' => 'wpforms-builder-notifications-advanced opened', 'default' => 'opened', 'group' => 'settings_notifications_advanced', 'title' => esc_html__( 'Advanced', 'wpforms-lite' ), 'unfoldable' => true, ] ); } } PK �D0];�)� � ) Admin/Education/Builder/Confirmations.phpnu �[��� <?php namespace WPForms\Lite\Admin\Education\Builder; use WPForms_Builder_Panel_Settings; use WPForms\Admin\Education\EducationInterface; /** * Confirmations Education feature. * * @since 1.6.9 */ class Confirmations implements EducationInterface { /** * Indicate if current Education feature is allowed to load. * * @since 1.6.9 * * @return bool */ public function allow_load() { return wpforms_is_admin_page( 'builder' ); } /** * Init. * * @since 1.6.9 */ public function init() { if ( ! $this->allow_load() ) { return; } $this->hooks(); } /** * Load hooks. * * @since 1.6.9 */ private function hooks() { add_action( 'wpforms_lite_form_settings_confirmations_single_after', [ $this, 'entry_preview_settings' ], 10, 2 ); } /** * Add education settings located in confirmation inside the message block. * * @since 1.6.9 * * @param WPForms_Builder_Panel_Settings $settings Builder panel settings. * @param int $field_id Field ID. */ public function entry_preview_settings( $settings, $field_id ) { wpforms_panel_field( 'toggle', 'confirmations', 'message_entry_preview', $settings->form_data, esc_html__( 'Show entry preview after confirmation', 'wpforms-lite' ), [ 'input_id' => 'wpforms-panel-field-confirmations-message_entry_preview-' . wpforms_validate_field_id( $field_id ), 'input_class' => 'wpforms-panel-field-confirmations-message_entry_preview education-modal', 'parent' => 'settings', 'subsection' => wpforms_validate_field_id( $field_id ), 'pro_badge' => true, 'data' => [ 'action' => 'upgrade', 'name' => esc_html__( 'Show Entry Preview', 'wpforms-lite' ), 'utm-content' => 'Show Entry Preview', 'licence' => 'pro', ], 'attrs' => [ 'disabled' => 'disabled', ], 'value' => false, ] ); } } PK �D0]L&N,t t &