Extension_CloudFlare_SettingsForUi.php
3.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<?php
namespace W3TC;
class Extension_CloudFlare_SettingsForUi {
static public function api() {
$c = Dispatcher::config();
$api = new Extension_CloudFlare_Api( array(
'email' => $c->get_string( array( 'cloudflare', 'email' ) ),
'key' => $c->get_string( array( 'cloudflare', 'key' ) ),
'zone_id' => $c->get_string( array( 'cloudflare', 'zone_id' ) ),
'timelimit_api_request' => $c->get_integer(
array( 'cloudflare', 'timelimit.api_request' ) )
)
);
return $api;
}
static public function settings_get( $api ) {
$settings = $api->zone_settings();
// adjust settings that are out of regular presentation
if ( isset( $settings['security_header'] ) ) {
$v = $settings['security_header']['value'];
$settings['security_header']['editable'] = false;
$settings['security_header']['value'] = 'off';
if ( isset( $v['strict_transport_security']['enabled'] ) ) {
$settings['security_header']['value'] =
$v['strict_transport_security']['enabled'] ?
'on' : 'off';
}
}
if ( isset( $settings['mobile_redirect'] ) ) {
$v = $settings['mobile_redirect']['value'];
$settings['mobile_redirect']['editable'] = false;
$settings['mobile_redirect']['value'] = 'off';
if ( isset( $v['status'] ) ) {
$settings['mobile_redirect']['value'] =
$v['status'] ? 'on' : 'off';
}
}
if ( isset( $settings['minify'] ) ) {
$v = $settings['minify']['value'];
$editable = $settings['minify']['editable'];
$settings['minify_js'] = array(
'editable' => $editable,
'value' => $v['js']
);
$settings['minify_css'] = array(
'editable' => $editable,
'value' => $v['css']
);
$settings['minify_html'] = array(
'editable' => $editable,
'value' => $v['html']
);
}
return $settings;
}
/**
* Updates settings passed by $_REQUEST
*/
static public function settings_set( $api ) {
$errors = array();
$settings = self::settings_get( $api );
$to_update = array();
$prefix = 'cloudflare_api_';
foreach ( $_REQUEST as $key => $value ) {
if ( substr( $key, 0, strlen( $prefix ) ) != $prefix )
continue;
if ( $value == '' )
continue;
$settings_key = substr( $key, strlen( $prefix ) );
if ( !isset( $settings[$settings_key] ) ) {
$errors[] = 'Option ' . $settings_key . ' is not available';
continue;
}
$current_value = $settings[$settings_key]['value'];
// convert checkbox value to on/off
// excetion: rocket loader is not checkbox so contains real value
if ( $settings_key != 'rocket_loader' ) {
if ( $current_value == 'on' || $current_value == 'off' ) {
// it's boolean, so control is checkbox - convert it
$value = ( $value == '0' ? 'off' : 'on' );
}
}
if ( $current_value == $value )
continue; // no update required
if ( !$settings[$settings_key]['editable'] ) {
$errors[] = 'Option ' . $settings_key . ' is read-only';
continue;
}
$to_update[$settings_key] = $value;
}
// mutate settings back to the format of API
if ( isset( $to_update['minify_js'] ) ||
isset( $to_update['minify_css'] ) ||
isset( $to_update['minify_html'] ) ) {
$v = $settings['minify']['value'];
if ( isset( $to_update['minify_js'] ) ) {
$v['js'] = $to_update['minify_js'];
unset( $to_update['minify_js'] );
}
if ( isset( $to_update['minify_css'] ) ) {
$v['css'] = $to_update['minify_css'];
unset( $to_update['minify_css'] );
}
if ( isset( $to_update['minify_html'] ) ) {
$v['html'] = $to_update['minify_html'];
unset( $to_update['minify_html'] );
}
$to_update['minify'] = $v;
}
// do the settings update via API
foreach ( $to_update as $key => $value ) {
try {
$api->zone_setting_set( $key, $value );
} catch ( \Exception $ex ) {
$errors[] = 'Failed to update option ' . $key . ': ' .
$ex->getMessage();
}
}
return $errors;
}
}