menu_wordfence_central.php
9.66 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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
<?php
if (!defined('WORDFENCE_VERSION')) {
exit;
}
/**
* @var string $subpage
*/
$stepContent = array(
1 => __('Testing initial communication with Wordfence Central.', 'wordfence'),
2 => __('Passing public key to Wordfence Central.', 'wordfence'),
3 => __('Testing public key authentication with Wordfence Central.', 'wordfence'),
4 => __('Testing that Wordfence Central is able to communicate with this site.', 'wordfence'),
5 => __('Retrieving access token using authorization grant.', 'wordfence'),
6 => __('Redirecting back to Wordfence Central.', 'wordfence'),
);
$connected = wfCentral::isConnected();
$partialConnection = wfCentral::isPartialConnection();
?>
<?php
if (!wfOnboardingController::shouldShowAttempt3() && wfConfig::get('touppPromptNeeded')) {
echo wfView::create('gdpr/disabled-overlay')->render();
echo wfView::create('gdpr/banner')->render();
}
if (function_exists('network_admin_url') && is_multisite()) {
$wordfenceURL = network_admin_url('admin.php?page=Wordfence');
}
else {
$wordfenceURL = admin_url('admin.php?page=Wordfence');
}
?>
<div class="wrap wordfence">
<div class="wf-container-fluid">
<div class="wf-row">
<div class="wf-col-xs-12">
<div class="wp-header-end"></div>
<?php
echo wfView::create('common/section-title', array(
'title' => __('Wordfence Central', 'wordfence'),
'showIcon' => true,
))->render();
?>
</div>
<?php if ($connected): ?>
<div class="wf-col-xs-12 wf-central-connected">
<div class="wf-flex-row wf-flex-grow-all">
<div class="wf-flex-row-1 wf-block wf-active">
<div class="wf-central-dashboard">
<img class="wf-central-dashboard-logo" src="<?php echo wfUtils::getBaseURL() ?>images/wf-central-logo.svg" alt="Wordfence Central">
<div class="wf-central-dashboard-copy">
<p><strong><?php esc_html_e('Wordfence Central', 'wordfence') ?></strong></p>
<p><?php esc_html_e('Wordfence Central allows you to manage Wordfence on multiple sites from one location. It makes security monitoring and configuring Wordfence easier.', 'wordfence') ?></p>
<p class="wf-right-lg"><a href="https://www.wordfence.com/central" target="_blank" rel="noopener noreferrer"><strong><?php esc_html_e('Visit Wordfence Central', 'wordfence') ?></strong><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a></p>
</div>
</div>
</div>
<div class="wf-flex-row-1 wf-block wf-active">
<p><strong><?php esc_html_e('Wordfence Central Status', 'wordfence') ?></strong></p>
<p><?php echo esc_html(sprintf(
/* translators: 1. Email address. 2. Localized date. */
__('Activated - connected by %1$s on %2$s', 'wordfence'), wfConfig::get('wordfenceCentralConnectEmail'), date_i18n('F j, Y', (int) wfConfig::get('wordfenceCentralConnectTime')))) ?></p>
<p class="wf-right-lg"><a href="<?php echo esc_url($wordfenceURL); ?>"><strong><?php esc_html_e('Disconnect This Site', 'wordfence') ?></strong></a></p>
</div>
</div>
</div>
<?php elseif (isset($_GET['grant'])): ?>
<div class="wf-col-xs-12">
<div class="wf-block wf-active">
<div class="wf-block-header">
<div class="wf-block-header-content">
<strong><?php esc_html_e('Wordfence Central Installation Process', 'wordfence') ?></strong>
</div>
</div>
<div class="wf-block-content">
<ul class="wf-block-list" id="wf-central-progress">
<?php for ($i = 1; $i <= 6; $i++): ?>
<li id="wf-central-progress-step<?php echo $i ?>" class="pending">
<div class="wf-central-progress-icon">
<div class="wf-step-pending"></div>
<div class="wf-step-running">
<?php
echo wfView::create('common/indeterminate-progress', array(
'size' => 50,
))->render();
?>
</div>
<div class="wf-step-complete-success"></div>
<div class="wf-step-complete-warning"></div>
</div>
<div class="wf-central-progress-content">
<p><?php echo esc_html($stepContent[$i]) ?></p>
</div>
</li>
<?php endfor ?>
</ul>
</div>
</div>
</div>
<?php elseif ($partialConnection): ?>
<div class="wf-center-lg">
<p><?php esc_html_e('It looks like you\'ve tried to connect this site to Wordfence Central, but the installation did not finish.', 'wordfence') ?></p>
<p>
<a href="<?php echo WORDFENCE_CENTRAL_URL_SEC ?>/sites/connection-issues?complete-setup=<?php echo esc_attr(wfConfig::get('wordfenceCentralSiteID')) ?>"
class="wf-btn wf-btn-primary"
><?php esc_html_e('Resume Installation', 'wordfence') ?></a>
<a href="<?php echo esc_url($wordfenceURL); ?>" class="wf-btn wf-btn-warning"><?php esc_html_e('Disconnect Site', 'wordfence') ?></a>
</p>
</div>
<?php else: ?>
<div class="wf-center-lg">
<p><?php esc_html_e('Wordfence Central allows you to manage Wordfence on multiple sites from one location. It makes security monitoring and configuring Wordfence easier.', 'wordfence') ?></p>
<p><?php esc_html_e('To connect your site your site to Wordfence Central, use the link below:', 'wordfence') ?></p>
<p class="wf-center">
<a href="<?php echo WORDFENCE_CENTRAL_URL_SEC ?>?newsite=<?php echo esc_attr(home_url()) ?>" class="wf-btn wf-btn-primary"><?php esc_html_e('Connect Site', 'wordfence') ?></a>
</p>
</div>
<?php endif ?>
</div>
</div>
</div>
<script>
(function($) {
var authGrant = '<?php echo esc_js(isset($_GET['grant']) ? $_GET['grant'] : '') ?>';
var currentStep = <?php echo json_encode(wfConfig::getInt('wordfenceCentralCurrentStep', 1)) ?>;
var connected = <?php echo json_encode($connected) ?>;
function wfConnectError(error) {
WFAD.colorboxError(error);
}
function wfCentralStepAjax(step, action, data, cb, cbErr, noLoading) {
var el = $('#wf-central-progress-' + step);
el.removeClass('pending')
.addClass('running');
WFAD.ajax(action, data, function(response) {
if (response && response.success) {
el.removeClass('running')
.addClass('complete-success');
cb && cb(response);
} else if (response && response.err) {
el.removeClass('running')
.addClass('complete-warning');
}
}, function(response) {
el.removeClass('running')
.addClass('complete-warning');
cbErr && cbErr(response);
}, noLoading);
}
var WFCentralInstaller = {};
window.WFCentralInstaller = WFCentralInstaller;
// Step 1: Makes GET request to `/central/api/site/access-token` endpoint authenticated with the auth grant supplied by the user.
// - Receives site GUID, public key, short lived JWT.
WFCentralInstaller.step1 = function() {
wfCentralStepAjax('step1', 'wordfence_wfcentral_step1', {
'auth-grant': authGrant
}, function(response) {
$(window).trigger('step2', response);
}, wfConnectError);
};
// Step 2: Makes PATCH request to `/central/api/wf/site/<guid>` endpoint passing in the new public key.
// Uses JWT from auth grant endpoint as auth.
WFCentralInstaller.step2 = function() {
wfCentralStepAjax('step2', 'wordfence_wfcentral_step2', {}, function(response) {
$(window).trigger('step3', response);
}, wfConnectError);
};
$(window).on('step2', WFCentralInstaller.step2);
// Step 3: Makes GET request to `/central/api/wf/site/<guid>` endpoint signed using Wordfence plugin private key.
// - Expects 200 response with site data.
WFCentralInstaller.step3 = function() {
wfCentralStepAjax('step3', 'wordfence_wfcentral_step3', {}, function(response) {
var callback = function() {
$(window).trigger('step4')
};
var interval = setInterval(callback, 4000);
$(window).on('step3-clearInterval', function() {
clearInterval(interval);
});
callback();
}, wfConnectError);
};
$(window).on('step3', WFCentralInstaller.step3);
// Step 4: Poll for PUT request at `/wp-json/wp/v2/wordfence-auth-grant/` endpoint signed using Wordfence Central private key with short lived JWT.
// - Expects verifiable signature of incoming request from Wordfence Central.
// - Stores auth grant JWT.
WFCentralInstaller.step4 = function() {
wfCentralStepAjax('step4', 'wordfence_wfcentral_step4', {}, function(response) {
if (response && response.success) {
$(window).trigger('step3-clearInterval');
$(window).trigger('step5');
}
}, wfConnectError);
};
$(window).on('step4', WFCentralInstaller.step4);
// Step 5: Makes GET request to `/central/api/site/<guid>/access-token` endpoint signed using Wordfence plugin private key with auth grant JWT.
// - Expects 200 response with access token.
WFCentralInstaller.step5 = function() {
wfCentralStepAjax('step5', 'wordfence_wfcentral_step5', {
'auth-grant': authGrant
}, function(response) {
$(window).trigger('step6', response);
}, wfConnectError);
};
$(window).on('step5', WFCentralInstaller.step5);
// Step 6: Installation complete. Redirect user back to Wordfence Central with access token.
WFCentralInstaller.step6 = function(response) {
wfCentralStepAjax('step6', 'wordfence_wfcentral_step6', {}, function(response) {
document.location.href = response['redirect-url'];
}, wfConnectError);
};
$(window).on('step6', WFCentralInstaller.step6);
var self = this;
$(function() {
// if (!authGrant) {
// wfConnectError('Auth grant not found.');
// return;
// }
if (!connected && authGrant) {
for (var i = 0; i < currentStep; i++) {
var el = $('#wf-central-progress-step' + i);
el.removeClass('pending')
.addClass('complete-success');
}
WFCentralInstaller['step' + currentStep]();
}
});
})(jQuery);
</script>