PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.2.3
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.2.3
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
formidable / classes / models / FrmSettings.php

FrmSettings.php in Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More 6.2.3, at classes/models/FrmSettings.php

398 lines 10.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) {
3 die( 'You are not allowed to call this page directly.' );
4 }
5
6 #[\AllowDynamicProperties]
7 class FrmSettings {
8 public $option_name = 'frm_options';
9 public $menu;
10 public $mu_menu;
11 public $use_html;
12 public $jquery_css;
13 public $accordion_js;
14 public $fade_form;
15 public $old_css;
16 public $admin_bar;
17
18 public $success_msg;
19 public $blank_msg;
20 public $unique_msg;
21 public $invalid_msg;
22 public $failed_msg;
23 public $submit_value;
24 public $login_msg;
25 public $admin_permission;
26
27 public $email_to;
28 public $load_style;
29 public $custom_style;
30
31 public $active_captcha;
32 public $hcaptcha_pubkey;
33 public $hcaptcha_privkey;
34 public $pubkey;
35 public $privkey;
36 public $re_lang;
37 public $re_type;
38 public $re_msg;
39 public $re_multi;
40
41 public $no_ips;
42 public $custom_header_ip;
43 public $current_form = 0;
44 public $tracking;
45
46 /**
47 * @since 6.0
48 *
49 * @var string|false|null
50 */
51 public $custom_css;
52
53 public function __construct( $args = array() ) {
54 if ( ! defined( 'ABSPATH' ) ) {
55 die( 'You are not allowed to call this page directly.' );
56 }
57
58 $settings = get_transient( $this->option_name );
59
60 if ( ! is_object( $settings ) ) {
61 $settings = $this->translate_settings( $settings );
62 }
63
64 foreach ( $settings as $setting_name => $setting ) {
65 $this->{$setting_name} = $setting;
66 unset( $setting_name, $setting );
67 }
68
69 $this->set_default_options();
70
71 $this->maybe_filter_for_form( $args );
72 }
73
74 private function translate_settings( $settings ) {
75 if ( $settings ) { //workaround for W3 total cache conflict
76 return unserialize( serialize( $settings ) );
77 }
78
79 $settings = get_option( $this->option_name );
80 if ( is_object( $settings ) ) {
81 set_transient( $this->option_name, $settings );
82
83 return $settings;
84 }
85
86 // If unserializing didn't work
87 if ( $settings ) { //workaround for W3 total cache conflict
88 $settings = unserialize( serialize( $settings ) );
89 } else {
90 $settings = $this;
91 }
92
93 update_option( $this->option_name, $settings );
94 set_transient( $this->option_name, $settings );
95
96 return $settings;
97 }
98
99 /**
100 * @return array
101 */
102 public function default_options() {
103 return array(
104 'menu' => apply_filters( 'frm_default_menu', 'Formidable' ),
105 'mu_menu' => 0,
106 'use_html' => true,
107 'jquery_css' => false,
108 'accordion_js' => false,
109 'fade_form' => false,
110 'old_css' => false,
111 'admin_bar' => false,
112
113 're_multi' => 1,
114
115 'success_msg' => __( 'Your responses were successfully submitted. Thank you!', 'formidable' ),
116 'blank_msg' => __( 'This field cannot be blank.', 'formidable' ),
117 'unique_msg' => __( 'This value must be unique.', 'formidable' ),
118 'invalid_msg' => __( 'There was a problem with your submission. Errors are marked below.', 'formidable' ),
119 'failed_msg' => __( 'We\'re sorry. It looks like you\'ve already submitted that.', 'formidable' ),
120 'submit_value' => __( 'Submit', 'formidable' ),
121 'login_msg' => __( 'You do not have permission to view this form.', 'formidable' ),
122 'admin_permission' => __( 'You do not have permission to do that', 'formidable' ),
123
124 'email_to' => '[admin_email]',
125 'no_ips' => 0,
126 'custom_header_ip' => false, // Use false by default. We show a warning when this is unset. Once global settings have been saved, this gets saved
127 'tracking' => FrmAppHelper::pro_is_installed(),
128
129 // Normally custom CSS is a string. A false value is used when nothing has been set.
130 // When it is false, we try to use the old custom_key value from the default style's post_content array.
131 'custom_css' => false,
132 );
133 }
134
135 /**
136 * @return void
137 */
138 private function set_default_options() {
139 $this->fill_captcha_settings();
140
141 if ( ! isset( $this->load_style ) ) {
142 if ( ! isset( $this->custom_style ) ) {
143 $this->custom_style = true;
144 }
145
146 $this->load_style = 'all';
147 }
148
149 $this->fill_with_defaults();
150
151 if ( is_multisite() && is_admin() ) {
152 $mu_menu = get_site_option( 'frm_admin_menu_name' );
153 if ( $mu_menu && ! empty( $mu_menu ) ) {
154 $this->menu = $mu_menu;
155 $this->mu_menu = 1;
156 }
157 }
158
159 $frm_roles = FrmAppHelper::frm_capabilities( 'pro' );
160 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
161 if ( ! isset( $this->$frm_role ) ) {
162 $this->$frm_role = 'administrator';
163 }
164 }
165 }
166
167 /**
168 * @param array $params
169 * @return void
170 */
171 public function fill_with_defaults( $params = array() ) {
172 $settings = $this->default_options();
173 $filter_html = ! FrmAppHelper::allow_unfiltered_html();
174
175 if ( $filter_html ) {
176 $filter_keys = array( 'failed_msg', 'blank_msg', 'invalid_msg', 'admin_permission', 'unique_msg', 'success_msg', 'submit_value', 'login_msg', 'menu' );
177 if ( ! empty( $params['additional_filter_keys'] ) ) {
178 $filter_keys = array_merge( $filter_keys, $params['additional_filter_keys'] );
179 }
180 } else {
181 $filter_keys = array();
182 }
183
184 foreach ( $settings as $setting => $default ) {
185 if ( isset( $params[ 'frm_' . $setting ] ) ) {
186 $this->{$setting} = $params[ 'frm_' . $setting ];
187 } elseif ( ! isset( $this->{$setting} ) ) {
188 $this->{$setting} = $default;
189 }
190
191 if ( $setting === 'menu' && empty( $this->{$setting} ) ) {
192 $this->{$setting} = $default;
193 }
194
195 $this->{$setting} = $this->maybe_sanitize_global_setting( $this->{$setting}, $setting, $filter_keys );
196 unset( $setting, $default );
197 }
198 }
199
200 /**
201 * Handle sanitizing for a target global setting key.
202 *
203 * @since 6.0
204 *
205 * @param mixed $value The unsanitized global setting value.
206 * @param string $key The key of the global setting being saved.
207 * @param array $filter_keys These keys that are filtered with kses.
208 * @return mixed
209 */
210 private function maybe_sanitize_global_setting( $value, $key, $filter_keys ) {
211 if ( 'custom_css' === $key ) {
212 if ( false === $value ) {
213 // Avoid changing the false default value to an empty string.
214 return $value;
215 }
216 return sanitize_textarea_field( $value );
217 }
218
219 if ( in_array( $key, $filter_keys, true ) ) {
220 return FrmAppHelper::kses( $value, 'all' );
221 }
222
223 return $value;
224 }
225
226 /**
227 * @return void
228 */
229 private function fill_captcha_settings() {
230 if ( ! isset( $this->active_captcha ) ) {
231 $this->active_captcha = 'recaptcha';
232 }
233
234 $privkey = '';
235 $re_lang = '';
236
237 if ( ! isset( $this->hcaptcha_privkey ) ) {
238 $this->hcaptcha_privkey = '';
239 }
240
241 if ( ! isset( $this->pubkey ) ) {
242 // get the options from the database
243 $recaptcha_opt = is_multisite() ? get_site_option( 'recaptcha' ) : get_option( 'recaptcha' );
244 $this->pubkey = isset( $recaptcha_opt['pubkey'] ) ? $recaptcha_opt['pubkey'] : '';
245 $privkey = isset( $recaptcha_opt['privkey'] ) ? $recaptcha_opt['privkey'] : $privkey;
246 $re_lang = isset( $recaptcha_opt['re_lang'] ) ? $recaptcha_opt['re_lang'] : $re_lang;
247 }
248
249 if ( ! isset( $this->re_msg ) || empty( $this->re_msg ) ) {
250 $this->re_msg = __( 'The CAPTCHA was not entered correctly', 'formidable' );
251 }
252
253 if ( ! isset( $this->privkey ) ) {
254 $this->privkey = $privkey;
255 }
256
257 if ( ! isset( $this->re_lang ) ) {
258 $this->re_lang = $re_lang;
259 }
260
261 if ( ! isset( $this->re_type ) ) {
262 $this->re_type = '';
263 }
264
265 if ( ! isset( $this->re_threshold ) ) {
266 $this->re_threshold = .5;
267 }
268 }
269
270 /**
271 * Get values that may be shown on the front-end without an override in the form settings.
272 *
273 * @since 3.06.01
274 *
275 * @return string[]
276 */
277 public function translatable_strings() {
278 return array(
279 'invalid_msg',
280 'admin_permission',
281 'failed_msg',
282 'login_msg',
283 );
284 }
285
286 /**
287 * Allow strings to be filtered when a specific form may be displaying them.
288 *
289 * @since 3.06.01
290 *
291 * @return void
292 */
293 public function maybe_filter_for_form( $args ) {
294 if ( isset( $args['current_form'] ) && is_numeric( $args['current_form'] ) ) {
295 $this->current_form = $args['current_form'];
296 foreach ( $this->translatable_strings() as $string ) {
297 $this->{$string} = apply_filters( 'frm_global_setting', $this->{$string}, $string, $this );
298 $this->{$string} = apply_filters( 'frm_global_' . $string, $this->{$string}, $this );
299 }
300 }
301 }
302
303 /**
304 * @param array $params
305 * @param array $errors
306 */
307 public function validate( $params, $errors ) {
308 return apply_filters( 'frm_validate_settings', $errors, $params );
309 }
310
311 /**
312 * @param array $params
313 *
314 * @return void
315 */
316 public function update( $params ) {
317 $this->fill_with_defaults( $params );
318 $this->update_settings( $params );
319
320 if ( $this->mu_menu ) {
321 update_site_option( 'frm_admin_menu_name', $this->menu );
322 } elseif ( current_user_can( 'administrator' ) ) {
323 update_site_option( 'frm_admin_menu_name', false );
324 }
325
326 $this->update_roles( $params );
327
328 do_action( 'frm_update_settings', $params );
329
330 if ( function_exists( 'get_filesystem_method' ) ) {
331 // Save styling settings in case fallback setting changes.
332 $frm_style = new FrmStyle();
333 $frm_style->update( 'default' );
334 }
335 }
336
337 /**
338 * @return void
339 */
340 private function update_settings( $params ) {
341 $this->active_captcha = $params['frm_active_captcha'];
342 $this->hcaptcha_pubkey = trim( $params['frm_hcaptcha_pubkey'] );
343 $this->hcaptcha_privkey = $params['frm_hcaptcha_privkey'];
344 $this->pubkey = trim( $params['frm_pubkey'] );
345 $this->privkey = $params['frm_privkey'];
346 $this->re_type = $params['frm_re_type'];
347 $this->re_lang = $params['frm_re_lang'];
348 $this->re_threshold = floatval( $params['frm_re_threshold'] );
349 $this->load_style = $params['frm_load_style'];
350 $this->custom_css = $params['frm_custom_css'];
351
352 $checkboxes = array( 'mu_menu', 're_multi', 'use_html', 'jquery_css', 'accordion_js', 'fade_form', 'no_ips', 'custom_header_ip', 'tracking', 'admin_bar' );
353 foreach ( $checkboxes as $set ) {
354 $this->$set = isset( $params[ 'frm_' . $set ] ) ? absint( $params[ 'frm_' . $set ] ) : 0;
355 }
356 }
357
358 /**
359 * @return void
360 */
361 private function update_roles( $params ) {
362 global $wp_roles;
363
364 $frm_roles = FrmAppHelper::frm_capabilities();
365 $roles = get_editable_roles();
366 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
367 $this->$frm_role = (array) ( isset( $params[ $frm_role ] ) ? $params[ $frm_role ] : 'administrator' );
368
369 // Make sure administrators always have permissions
370 if ( ! in_array( 'administrator', $this->$frm_role ) ) {
371 array_push( $this->$frm_role, 'administrator' );
372 }
373
374 foreach ( $roles as $role => $details ) {
375 if ( in_array( $role, $this->$frm_role ) ) {
376 $wp_roles->add_cap( $role, $frm_role );
377 } else {
378 $wp_roles->remove_cap( $role, $frm_role );
379 }
380 }
381 }
382 }
383
384 /**
385 * @return void
386 */
387 public function store() {
388 // Save the posted value in the database
389
390 update_option( 'frm_options', $this );
391
392 delete_transient( 'frm_options' );
393 set_transient( 'frm_options', $this );
394
395 do_action( 'frm_store_settings' );
396 }
397 }
398