PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.2-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.2-a.1
16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / jetpack_vendor / automattic / jetpack-forms / src / class-jetpack-forms.php
jetpack / jetpack_vendor / automattic / jetpack-forms / src Last commit date
abilities 2 months ago blocks 5 days ago contact-form 5 days ago dashboard 5 days ago form-editor 3 months ago modules 5 days ago service 5 days ago store 3 months ago util 3 months ago class-jetpack-forms.php 5 days ago
class-jetpack-forms.php
295 lines
1 <?php
2 /**
3 * Package description here
4 *
5 * @package automattic/jetpack-forms
6 */
7
8 namespace Automattic\Jetpack\Forms;
9
10 use Automattic\Jetpack\Feature_Flags\Feature_Flags;
11 use Automattic\Jetpack\Forms\ContactForm\Feedback_Source;
12 use Automattic\Jetpack\Forms\ContactForm\Util;
13 use Automattic\Jetpack\Forms\Dashboard\Dashboard;
14 /**
15 * Understands the Jetpack Forms package.
16 */
17 class Jetpack_Forms {
18
19 const PACKAGE_VERSION = '7.25.0';
20
21 /**
22 * Name of the feature flag gating field conditional logic.
23 */
24 const CONDITIONAL_LOGIC_FLAG = 'forms-conditional-logic';
25
26 /**
27 * Register the package's feature flags.
28 *
29 * Registration is unconditional and happens as the package loads, so the full set stays
30 * discoverable through `Feature_Flags::all()` and nothing can call `is_enabled()` on an
31 * unregistered flag.
32 *
33 * @return void
34 */
35 public static function register_feature_flags() {
36 Feature_Flags::register(
37 self::CONDITIONAL_LOGIC_FLAG,
38 array(
39 'default' => false,
40 'description' => 'Show or hide a form field based on the answer to another field.',
41 'owner' => 'jetpack-forms',
42 )
43 );
44 }
45
46 /**
47 * Load the contact form module.
48 */
49 public static function load_contact_form() {
50 self::register_feature_flags();
51
52 Util::init();
53
54 if ( self::is_feedback_dashboard_enabled() ) {
55 $dashboard = new Dashboard();
56 $dashboard->init();
57 }
58
59 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.' ) ) {
60 add_action( 'current_screen', '\Automattic\Jetpack\Forms\ContactForm\Editor_View::add_hooks' );
61 }
62
63 add_action( 'init', '\Automattic\Jetpack\Forms\ContactForm\Util::register_pattern' );
64
65 // Add hook to delete file attachments when a feedback post is deleted
66 add_action( 'before_delete_post', array( '\Automattic\Jetpack\Forms\ContactForm\Contact_Form', 'delete_feedback_files' ) );
67
68 // Invalidate the source post IDs cache when a feedback post is permanently deleted.
69 add_action( 'deleted_post', array( '\Automattic\Jetpack\Forms\ContactForm\Feedback', 'invalidate_source_ids_cache_on_delete' ), 10, 2 );
70
71 // Enforces the availability of block support controls in the UI for classic themes.
72 add_filter( 'wp_theme_json_data_default', array( '\Automattic\Jetpack\Forms\ContactForm\Contact_Form', 'add_theme_json_data_for_classic_themes' ) );
73
74 // Initialize abilities registration for WordPress Abilities API (WP 6.9+)
75 \Automattic\Jetpack\Forms\Abilities\Forms_Abilities::init();
76 }
77
78 /**
79 * Get the plugin URL.
80 */
81 public static function plugin_url() {
82 return plugin_dir_url( __FILE__ );
83 }
84
85 /**
86 * Get the assets URL.
87 */
88 public static function assets_url() {
89 return plugin_dir_url( __DIR__ ) . 'assets';
90 }
91
92 /**
93 * Returns true if the feedback dashboard is enabled.
94 *
95 * @return boolean
96 */
97 public static function is_feedback_dashboard_enabled() {
98 /**
99 * Enable the new Jetpack Forms dashboard.
100 *
101 * @module contact-form
102 * @since 0.3.0
103 *
104 * @param bool false Should the new Jetpack Forms dashboard be enabled? Default to false.
105 */
106 return apply_filters( 'jetpack_forms_dashboard_enable', true );
107 }
108
109 /**
110 * Returns true if the legacy menu item is retired.
111 *
112 * @return boolean
113 */
114 public static function is_legacy_menu_item_retired() {
115 return apply_filters( 'jetpack_forms_retire_legacy_menu_item', true );
116 }
117
118 /**
119 * Returns true if MailPoet integration is enabled.
120 *
121 * @return boolean
122 */
123 public static function is_mailpoet_enabled() {
124 /**
125 * Enable MailPoet integration.
126 *
127 * @param bool false Whether MailPoet integration be enabled. Default is false.
128 */
129 return apply_filters( 'jetpack_forms_mailpoet_enable', true );
130 }
131
132 /**
133 * Returns true if Hostinger Reach integration is enabled.
134 *
135 * @return boolean
136 */
137 public static function is_hostinger_reach_enabled() {
138 /**
139 * Enable Hostinger Reach integration.
140 *
141 * @param bool false Whether Hostinger Reach integration be enabled. Default is false.
142 */
143 return apply_filters( 'jetpack_forms_hostinger_reach_enable', false );
144 }
145
146 /**
147 * Returns true if the Integrations UI should be enabled.
148 *
149 * @return boolean
150 */
151 public static function is_integrations_enabled() {
152 /**
153 * Whether to enable the Integrations UI.
154 *
155 * @param bool true Whether to enable the Integrations UI. Default true.
156 */
157 return apply_filters( 'jetpack_forms_is_integrations_enabled', true );
158 }
159
160 /**
161 * Returns true if field conditional logic is enabled.
162 *
163 * One switch for the whole feature: the editor panel, the front-end show/hide, and the
164 * submission-time enforcement in validation and storage. Gating them together means a
165 * form can never hide a field from the visitor while still requiring it on submit.
166 *
167 * Turning the flag off on a form that already has conditions is safe: the conditions are
168 * simply ignored, so every field renders, validates and stores as an ordinary field.
169 *
170 * @return boolean
171 */
172 public static function is_conditional_logic_enabled() {
173 return Feature_Flags::is_enabled( self::CONDITIONAL_LOGIC_FLAG );
174 }
175
176 /**
177 * Returns true if webhooks are enabled.
178 *
179 * @return boolean
180 */
181 public static function is_webhooks_enabled() {
182 /**
183 * Whether to enable webhooks for Jetpack Forms.
184 *
185 * @param bool true Whether webhooks should be enabled. Default true.
186 */
187 return apply_filters( 'jetpack_forms_webhooks_enabled', true );
188 }
189
190 /**
191 * Whether author-configured outbound destinations from a form source should be honored.
192 *
193 * Destinations declared in the form content (webhooks, the legacy postToUrl attribute and
194 * the Salesforce integration) carry submission data to an outbound URL, so they are only
195 * honored when whoever placed the form had an administrator-level capability:
196 *
197 * - For post/page forms (`single`, numeric source id) the source post's author must have
198 * the `manage_options` capability. Editor/Author/Contributor-authored forms are dropped.
199 * - For block templates, block template parts and widgets the source id is not a numeric
200 * post, so there is no author to check. Editing any of those surfaces already requires
201 * the `edit_theme_options` capability — administrator-tier, strictly above the
202 * capabilities an Editor/Author/Contributor holds — so their destinations are trusted.
203 *
204 * The source type is established server-side (from the signed JWT, or by re-rendering the
205 * real template/template part on the legacy path) and is not forgeable by the submitter.
206 *
207 * Returns false for any other unresolved source (non-numeric id of an unknown type, or a
208 * numeric id with no admin-capable author).
209 *
210 * @param int|string $source_id The form source id: a post id for post/page forms, or a
211 * non-numeric value for widget or block-template sources.
212 * @param string $source_type The form source type: single, widget, block_template or
213 * block_template_part. Defaults to 'single'.
214 * @return boolean
215 */
216 public static function should_honor_content_destinations( $source_id, $source_type = 'single' ) {
217 // Block templates, template parts and widgets can only be authored by users with the
218 // administrator-tier `edit_theme_options` capability, so their destinations are trusted
219 // even though the source id is not a numeric post.
220 if ( in_array( $source_type, Feedback_Source::ADMIN_TIER_SOURCE_TYPES, true ) ) {
221 return true;
222 }
223
224 if ( ! is_numeric( $source_id ) ) {
225 return false;
226 }
227
228 $source_id = (int) $source_id;
229 if ( $source_id <= 0 ) {
230 return false;
231 }
232
233 $author_id = (int) get_post_field( 'post_author', $source_id );
234
235 return $author_id > 0 && user_can( $author_id, 'manage_options' );
236 }
237
238 /**
239 * Returns true if the Integrations UI should be shown in the Forms dashboard.
240 *
241 * @since 6.22.0
242 *
243 * @return boolean
244 */
245 public static function show_dashboard_integrations() {
246 /**
247 * Whether to show Integrations UI in the Forms dashboard.
248 *
249 * @since 6.22.0
250 *
251 * @param bool true Whether to show the Integrations UI in the dashboard. Default true.
252 */
253 return apply_filters( 'jetpack_forms_show_dashboard_integrations', true );
254 }
255
256 /**
257 * Returns true if the Integrations UI should be shown in the Form block editor.
258 *
259 * @since 6.22.0
260 *
261 * @return boolean
262 */
263 public static function show_block_integrations() {
264 /**
265 * Whether to show Integrations UI in the Form block editor.
266 *
267 * @since 6.22.0
268 *
269 * @param bool true Whether to show the Integrations UI in the editor. Default true.
270 */
271 return apply_filters( 'jetpack_forms_show_block_integrations', true );
272 }
273
274 /**
275 * Returns true if integration icons should be shown (editor sidebar and integrations modal).
276 *
277 * @since 6.22.0
278 *
279 * @return boolean
280 */
281 public static function show_integration_icons() {
282 /**
283 * Whether to show integration icons in the UI.
284 *
285 * If set to false, the ActiveIntegrations component (editor sidebar) will be hidden
286 * and integration icons in the integrations modal will not be rendered.
287 *
288 * @since 6.22.0
289 *
290 * @param bool true Whether to show integration icons. Default true.
291 */
292 return apply_filters( 'jetpack_forms_show_integration_icons', true );
293 }
294 }
295