Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
29.03% covered (danger)
29.03%
9 / 31
69.23% covered (warning)
69.23%
9 / 13
CRAP
0.00% covered (danger)
0.00%
0 / 1
Jetpack_Forms
29.03% covered (danger)
29.03%
9 / 31
69.23% covered (warning)
69.23%
9 / 13
162.97
0.00% covered (danger)
0.00%
0 / 1
 load_contact_form
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
20
 plugin_url
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 assets_url
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 is_feedback_dashboard_enabled
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 is_legacy_menu_item_retired
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 is_mailpoet_enabled
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 is_hostinger_reach_enabled
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 is_integrations_enabled
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 is_webhooks_enabled
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 should_honor_content_destinations
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
30
 show_dashboard_integrations
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 show_block_integrations
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 show_integration_icons
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2/**
3 * Package description here
4 *
5 * @package automattic/jetpack-forms
6 */
7
8namespace Automattic\Jetpack\Forms;
9
10use Automattic\Jetpack\Forms\ContactForm\Feedback_Source;
11use Automattic\Jetpack\Forms\ContactForm\Util;
12use Automattic\Jetpack\Forms\Dashboard\Dashboard;
13/**
14 * Understands the Jetpack Forms package.
15 */
16class Jetpack_Forms {
17
18    const PACKAGE_VERSION = '7.23.2';
19
20    /**
21     * Load the contact form module.
22     */
23    public static function load_contact_form() {
24        Util::init();
25
26        if ( self::is_feedback_dashboard_enabled() ) {
27            $dashboard = new Dashboard();
28            $dashboard->init();
29        }
30
31        if ( is_admin() && apply_filters_deprecated( 'tmp_grunion_allow_editor_view', array( true ), '0.30.5', '', 'This functionality will be removed in an upcoming version.' ) ) {
32            add_action( 'current_screen', '\Automattic\Jetpack\Forms\ContactForm\Editor_View::add_hooks' );
33        }
34
35        add_action( 'init', '\Automattic\Jetpack\Forms\ContactForm\Util::register_pattern' );
36
37        // Add hook to delete file attachments when a feedback post is deleted
38        add_action( 'before_delete_post', array( '\Automattic\Jetpack\Forms\ContactForm\Contact_Form', 'delete_feedback_files' ) );
39
40        // Invalidate the source post IDs cache when a feedback post is permanently deleted.
41        add_action( 'deleted_post', array( '\Automattic\Jetpack\Forms\ContactForm\Feedback', 'invalidate_source_ids_cache_on_delete' ), 10, 2 );
42
43        // Enforces the availability of block support controls in the UI for classic themes.
44        add_filter( 'wp_theme_json_data_default', array( '\Automattic\Jetpack\Forms\ContactForm\Contact_Form', 'add_theme_json_data_for_classic_themes' ) );
45
46        // Initialize abilities registration for WordPress Abilities API (WP 6.9+)
47        \Automattic\Jetpack\Forms\Abilities\Forms_Abilities::init();
48    }
49
50    /**
51     * Get the plugin URL.
52     */
53    public static function plugin_url() {
54        return plugin_dir_url( __FILE__ );
55    }
56
57    /**
58     * Get the assets URL.
59     */
60    public static function assets_url() {
61        return plugin_dir_url( __DIR__ ) . 'assets';
62    }
63
64    /**
65     * Returns true if the feedback dashboard is enabled.
66     *
67     * @return boolean
68     */
69    public static function is_feedback_dashboard_enabled() {
70        /**
71         * Enable the new Jetpack Forms dashboard.
72         *
73         * @module contact-form
74         * @since 0.3.0
75         *
76         * @param bool false Should the new Jetpack Forms dashboard be enabled? Default to false.
77         */
78        return apply_filters( 'jetpack_forms_dashboard_enable', true );
79    }
80
81    /**
82     * Returns true if the legacy menu item is retired.
83     *
84     * @return boolean
85     */
86    public static function is_legacy_menu_item_retired() {
87        return apply_filters( 'jetpack_forms_retire_legacy_menu_item', true );
88    }
89
90    /**
91     * Returns true if MailPoet integration is enabled.
92     *
93     * @return boolean
94     */
95    public static function is_mailpoet_enabled() {
96        /**
97         * Enable MailPoet integration.
98         *
99         * @param bool false Whether MailPoet integration be enabled. Default is false.
100         */
101        return apply_filters( 'jetpack_forms_mailpoet_enable', true );
102    }
103
104    /**
105     * Returns true if Hostinger Reach integration is enabled.
106     *
107     * @return boolean
108     */
109    public static function is_hostinger_reach_enabled() {
110        /**
111         * Enable Hostinger Reach integration.
112         *
113         * @param bool false Whether Hostinger Reach integration be enabled. Default is false.
114         */
115        return apply_filters( 'jetpack_forms_hostinger_reach_enable', false );
116    }
117
118    /**
119     * Returns true if the Integrations UI should be enabled.
120     *
121     * @return boolean
122     */
123    public static function is_integrations_enabled() {
124        /**
125         * Whether to enable the Integrations UI.
126         *
127         * @param bool true Whether to enable the Integrations UI. Default true.
128         */
129        return apply_filters( 'jetpack_forms_is_integrations_enabled', true );
130    }
131
132    /**
133     * Returns true if webhooks are enabled.
134     *
135     * @return boolean
136     */
137    public static function is_webhooks_enabled() {
138        /**
139         * Whether to enable webhooks for Jetpack Forms.
140         *
141         * @param bool true Whether webhooks should be enabled. Default true.
142         */
143        return apply_filters( 'jetpack_forms_webhooks_enabled', true );
144    }
145
146    /**
147     * Whether author-configured outbound destinations from a form source should be honored.
148     *
149     * Destinations declared in the form content (webhooks, the legacy postToUrl attribute and
150     * the Salesforce integration) carry submission data to an outbound URL, so they are only
151     * honored when whoever placed the form had an administrator-level capability:
152     *
153     * - For post/page forms (`single`, numeric source id) the source post's author must have
154     *   the `manage_options` capability. Editor/Author/Contributor-authored forms are dropped.
155     * - For block templates, block template parts and widgets the source id is not a numeric
156     *   post, so there is no author to check. Editing any of those surfaces already requires
157     *   the `edit_theme_options` capability — administrator-tier, strictly above the
158     *   capabilities an Editor/Author/Contributor holds — so their destinations are trusted.
159     *
160     * The source type is established server-side (from the signed JWT, or by re-rendering the
161     * real template/template part on the legacy path) and is not forgeable by the submitter.
162     *
163     * Returns false for any other unresolved source (non-numeric id of an unknown type, or a
164     * numeric id with no admin-capable author).
165     *
166     * @param int|string $source_id   The form source id: a post id for post/page forms, or a
167     *                                non-numeric value for widget or block-template sources.
168     * @param string     $source_type The form source type: single, widget, block_template or
169     *                                block_template_part. Defaults to 'single'.
170     * @return boolean
171     */
172    public static function should_honor_content_destinations( $source_id, $source_type = 'single' ) {
173        // Block templates, template parts and widgets can only be authored by users with the
174        // administrator-tier `edit_theme_options` capability, so their destinations are trusted
175        // even though the source id is not a numeric post.
176        if ( in_array( $source_type, Feedback_Source::ADMIN_TIER_SOURCE_TYPES, true ) ) {
177            return true;
178        }
179
180        if ( ! is_numeric( $source_id ) ) {
181            return false;
182        }
183
184        $source_id = (int) $source_id;
185        if ( $source_id <= 0 ) {
186            return false;
187        }
188
189        $author_id = (int) get_post_field( 'post_author', $source_id );
190
191        return $author_id > 0 && user_can( $author_id, 'manage_options' );
192    }
193
194    /**
195     * Returns true if the Integrations UI should be shown in the Forms dashboard.
196     *
197     * @since 6.22.0
198     *
199     * @return boolean
200     */
201    public static function show_dashboard_integrations() {
202        /**
203         * Whether to show Integrations UI in the Forms dashboard.
204         *
205         * @since 6.22.0
206         *
207         * @param bool true Whether to show the Integrations UI in the dashboard. Default true.
208         */
209        return apply_filters( 'jetpack_forms_show_dashboard_integrations', true );
210    }
211
212    /**
213     * Returns true if the Integrations UI should be shown in the Form block editor.
214     *
215     * @since 6.22.0
216     *
217     * @return boolean
218     */
219    public static function show_block_integrations() {
220        /**
221         * Whether to show Integrations UI in the Form block editor.
222         *
223         * @since 6.22.0
224         *
225         * @param bool true Whether to show the Integrations UI in the editor. Default true.
226         */
227        return apply_filters( 'jetpack_forms_show_block_integrations', true );
228    }
229
230    /**
231     * Returns true if integration icons should be shown (editor sidebar and integrations modal).
232     *
233     * @since 6.22.0
234     *
235     * @return boolean
236     */
237    public static function show_integration_icons() {
238        /**
239         * Whether to show integration icons in the UI.
240         *
241         * If set to false, the ActiveIntegrations component (editor sidebar) will be hidden
242         * and integration icons in the integrations modal will not be rendered.
243         *
244         * @since 6.22.0
245         *
246         * @param bool true Whether to show integration icons. Default true.
247         */
248        return apply_filters( 'jetpack_forms_show_integration_icons', true );
249    }
250}