PluginProbe ʕ •ᴥ•ʔ
Wordfence Security – Firewall, Malware Scan, and Login Security / 7.3.2
Wordfence Security – Firewall, Malware Scan, and Login Security v7.3.2
8.2.2 8.2.1 8.2.0 3.7.1 3.7.2 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.8.6 3.8.7 3.8.8 3.8.9 3.9.1 4.0.1 4.0.2 4.0.3 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.0.9 5.1.1 5.1.2 5.1.4 5.1.5 5.1.6 5.1.7 5.1.8 5.1.9 5.2.1 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.1 5.3.10 5.3.11 5.3.12 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.3.8 5.3.9 6.0.1 6.0.10 6.0.11 6.0.12 6.0.14 6.0.15 6.0.16 6.0.17 6.0.18 6.0.19 6.0.2 6.0.20 6.0.21 6.0.22 6.0.23 6.0.24 6.0.25 6.0.3 6.0.4 6.0.5 6.0.6 6.0.7 6.0.8 6.0.9 6.1.1 6.1.10 6.1.11 6.1.12 6.1.14 6.1.15 6.1.16 6.1.17 6.1.2 6.1.3 6.1.4 6.1.5 6.1.6 6.1.7 6.1.8 6.1.9 6.2.0 6.2.1 6.2.10 6.2.2 6.2.3 6.2.4 6.2.5 6.2.6 6.2.7 6.2.8 6.2.9 6.3.0 6.3.1 6.3.10 6.3.11 6.3.12 6.3.14 6.3.15 6.3.16 6.3.17 6.3.18 6.3.19 6.3.2 6.3.20 6.3.21 6.3.22 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.3.8 6.3.9 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1.0 7.1.1 7.1.10 7.1.11 7.1.12 7.1.14 7.1.15 7.1.16 7.1.17 7.1.18 7.1.19 7.1.2 7.1.20 7.1.3 7.1.4 7.1.5 7.1.6 7.1.7 7.1.8 7.1.9 7.10.0 7.10.1 7.10.2 7.10.3 7.10.4 7.10.5 7.10.6 7.10.7 7.11.0 7.11.1 7.11.2 7.11.3 7.11.4 7.11.5 7.11.6 7.11.7 7.2.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3.1 7.3.2 7.3.3 7.3.4 7.3.5 7.3.6 7.4.0 7.4.1 7.4.10 7.4.11 7.4.12 7.4.14 7.4.2 7.4.3 trunk 7.4.4 1.1 7.4.5 1.2 7.4.6 1.3 7.4.7 1.3.1 7.4.8 1.3.2 7.4.9 1.3.3 7.5.0 1.4.2 7.5.1 1.4.3 7.5.10 1.4.4 7.5.11 1.4.5 7.5.2 1.4.6 7.5.3 1.4.7 7.5.4 1.4.8 7.5.5 1.5.1 7.5.6 1.5.2 7.5.7 1.5.3 7.5.8 1.5.4 7.5.9 1.5.5 7.6.0 1.5.6 7.6.1 2.0.1 7.6.2 2.0.2 7.7.0 2.0.3 7.7.1 2.0.5 7.8.0 2.0.6 7.8.1 2.0.7 7.8.2 2.1.0 7.9.0 2.1.1 7.9.1 2.1.2 7.9.2 2.1.3 7.9.3 2.1.4 8.0.0 2.1.5 8.0.1 3.0.2 8.0.2 3.0.3 8.0.3 3.0.4 8.0.4 3.0.5 8.0.5 3.0.6 8.1.0 3.0.7 8.1.1 3.0.8 8.1.2 3.0.9 8.1.3 3.1.0 8.1.4 3.1.1 v1.4.1 3.1.2 3.1.4 3.1.6 3.2.1 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.4.1 3.4.4 3.4.5 3.5.1 3.5.2 3.6.1 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.6.8 3.6.9
wordfence / lib / menu_tools_livetraffic.php
wordfence / lib Last commit date
Diff 8 years ago dashboard 7 years ago rest-api 7 years ago .htaccess 7 years ago Diff.php 14 years ago GeoLite2-Country.mmdb 7 years ago IPTraf.php 8 years ago IPTrafList.php 7 years ago WFLSPHP52Compatability.php 7 years ago compat.php 8 years ago conntest.php 7 years ago cronview.php 8 years ago dbview.php 8 years ago diffResult.php 8 years ago email_genericAlert.php 7 years ago email_newIssues.php 7 years ago email_unlockRequest.php 8 years ago email_unsubscribeRequest.php 7 years ago flags.php 7 years ago live_activity.php 8 years ago menu_dashboard.php 7 years ago menu_dashboard_options.php 7 years ago menu_firewall.php 7 years ago menu_firewall_blocking.php 7 years ago menu_firewall_blocking_options.php 8 years ago menu_firewall_waf.php 7 years ago menu_firewall_waf_options.php 7 years ago menu_options.php 7 years ago menu_scanner.php 7 years ago menu_scanner_credentials.php 8 years ago menu_scanner_options.php 8 years ago menu_support.php 7 years ago menu_tools.php 7 years ago menu_tools_diagnostic.php 7 years ago menu_tools_importExport.php 7 years ago menu_tools_livetraffic.php 7 years ago menu_tools_twoFactor.php 7 years ago menu_tools_whois.php 8 years ago menu_wordfence_central.php 7 years ago noc1.key 7 years ago sysinfo.php 8 years ago unknownFiles.php 8 years ago viewFullActivityLog.php 8 years ago wf503.php 7 years ago wfAPI.php 7 years ago wfActivityReport.php 7 years ago wfAdminNoticeQueue.php 8 years ago wfArray.php 7 years ago wfBrowscap.php 8 years ago wfBrowscapCache.php 7 years ago wfBulkCountries.php 7 years ago wfCache.php 9 years ago wfCentralAPI.php 7 years ago wfConfig.php 7 years ago wfCrawl.php 8 years ago wfCredentialsController.php 7 years ago wfCrypt.php 7 years ago wfDB.php 7 years ago wfDashboard.php 7 years ago wfDateLocalization.php 8 years ago wfDiagnostic.php 7 years ago wfDict.php 8 years ago wfDirectoryIterator.php 7 years ago wfHelperBin.php 11 years ago wfHelperString.php 11 years ago wfIPWhitelist.php 7 years ago wfImportExportController.php 7 years ago wfIssues.php 7 years ago wfJWT.php 7 years ago wfLockedOut.php 7 years ago wfLog.php 7 years ago wfMD5BloomFilter.php 8 years ago wfModuleController.php 7 years ago wfNotification.php 8 years ago wfOnboardingController.php 7 years ago wfPersistenceController.php 8 years ago wfRESTAPI.php 7 years ago wfScan.php 7 years ago wfScanEngine.php 7 years ago wfSchema.php 7 years ago wfStyle.php 7 years ago wfSupportController.php 7 years ago wfUnlockMsg.php 7 years ago wfUpdateCheck.php 8 years ago wfUtils.php 7 years ago wfVersionCheckController.php 8 years ago wfView.php 10 years ago wfViewResult.php 8 years ago wordfenceClass.php 7 years ago wordfenceConstants.php 7 years ago wordfenceHash.php 7 years ago wordfenceScanner.php 7 years ago wordfenceURLHoover.php 7 years ago
menu_tools_livetraffic.php
591 lines
1 <?php
2 if (!defined('WORDFENCE_VERSION')) { exit; }
3 $w = new wfConfig();
4 ?>
5 <script type="application/javascript">
6 (function($) {
7 $(function() {
8 document.title = "<?php esc_attr_e('Live Traffic', 'wordfence'); ?>" + " \u2039 " + WFAD.basePageName;
9
10 //Hash-based option block linking
11 if (window.location.hash) {
12 var hashes = WFAD.parseHashes();
13 var hash = hashes[hashes.length - 1];
14 var block = $('.wf-block[data-persistence-key="' + hash + '"]');
15 if (block.length) {
16 if (!block.hasClass('wf-active')) {
17 block.find('.wf-block-content').slideDown({
18 always: function() {
19 block.addClass('wf-active');
20 $('html, body').animate({
21 scrollTop: block.offset().top - 100
22 }, 1000);
23 }
24 });
25
26 WFAD.ajax('wordfence_saveDisclosureState', {name: block.data('persistenceKey'), state: true}, function() {});
27 }
28 else {
29 $('html, body').animate({
30 scrollTop: block.offset().top - 100
31 }, 1000);
32 }
33
34 history.replaceState('', document.title, window.location.pathname + window.location.search);
35 }
36 }
37 });
38 })(jQuery);
39 </script>
40 <div class="wf-section-title">
41 <h2><?php _e('Live Traffic', 'wordfence') ?></h2>
42 <span><?php printf(__('<a href="%s" target="_blank" rel="noopener noreferrer" class="wf-help-link">Learn more<span class="wf-hidden-xs"> about Live Traffic</span></a>', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_TOOLS_LIVE_TRAFFIC)); ?>
43 <i class="wf-fa wf-fa-external-link" aria-hidden="true"></i></span>
44 </div>
45
46 <?php if (wfConfig::liveTrafficEnabled() && wfConfig::get('liveActivityPauseEnabled')): ?>
47 <div id="wfLiveTrafficOverlayAnchor"></div>
48 <div id="wfLiveTrafficDisabledMessage">
49 <h2><?php _e('Live Updates Paused', 'wordfence') ?><br/>
50 <small><?php _e('Click inside window to resume', 'wordfence') ?></small>
51 </h2>
52 </div>
53 <?php endif ?>
54
55 <p><?php _e("Wordfence Live Traffic shows you what is happening on your site in real-time, including user logins, hack attempts, and requests that were blocked by the Wordfence Firewall. You can choose to log security-related traffic only or all traffic. Traffic is logged directly on the server, which means it includes visits that don't execute JavaScript. Google and other JavaScript-based analytics packages typically only show visits from browsers that are operated by a human, while Live Traffic can show visits from crawlers like Google and Bing.", 'wordfence') ?></p>
56
57 <div class="wordfenceModeElem" id="wordfenceMode_liveTraffic"></div>
58
59 <?php
60 echo wfView::create('tools/options-group-live-traffic', array(
61 'stateKey' => 'live-traffic-options',
62 'showControls' => true,
63 ))->render();
64 ?>
65
66 <?php
67 $overridden = false;
68 if (!wfConfig::liveTrafficEnabled($overridden)):
69 ?>
70 <div id="wordfenceLiveActivitySecurityOnly"><p>
71 <strong><?php _e('Traffic logging mode: Security-related traffic only', 'wordfence') ?><?php
72 if ($overridden) {
73 printf(__(' (host setting <a href="%s" class="wfhelp" target="_blank" rel="noopener noreferrer"></a>)', 'wordfence'), wfSupportController::supportURL(wfSupportController::ITEM_TOOLS_LIVE_TRAFFIC_OPTION_ENABLE));
74 } ?>.</strong> <?php _e('Login and firewall activity will appear below.', 'wordfence') ?></p>
75 </div>
76 <?php else: ?>
77 <div id="wordfenceLiveActivityAll"><p>
78 <strong><?php _e('Traffic logging mode: All traffic', 'wordfence') ?><?php
79 if ($overridden) {
80 printf(__(' (host setting <a href="%s" class="wfhelp" target="_blank" rel="noopener noreferrer"></a>)', 'wordfence'), wfSupportController::supportURL(wfSupportController::ITEM_TOOLS_LIVE_TRAFFIC_OPTION_ENABLE));
81 } ?>.</strong> <?php _e('Regular traffic and security-related traffic will appear below.', 'wordfence') ?></p>
82 </div>
83 <?php endif; ?>
84
85 <div id="wf-live-traffic" class="wf-row<?php echo wfConfig::get('liveTraf_displayExpandedRecords') ? ' wf-live-traffic-display-expanded' : '' ?>">
86 <div class="wf-col-xs-12">
87 <div class="wf-block wf-active">
88 <div class="wf-block-content">
89 <div class="wf-container-fluid">
90 <div class="wf-row">
91 <div class="<?php echo wfStyle::contentClasses(); ?>">
92 <div id="wf-live-traffic-legend">
93 <ul>
94 <li class="wfHuman"><?php _e('Human', 'wordfence') ?></li>
95 <li class="wfBot"><?php _e('Bot', 'wordfence') ?></li>
96 <li class="wfNotice"><?php _e('Warning', 'wordfence') ?></li>
97 <li class="wfBlocked"><?php _e('Blocked', 'wordfence') ?></li>
98 </ul>
99 </div>
100 <div class="wf-row wf-add-bottom-small">
101 <div class="wf-col-xs-12" id="wf-live-traffic-legend-wrapper">
102
103 <form data-bind="submit: reloadListings">
104
105 <ul class="wf-live-traffic-controls">
106 <li class="wf-live-traffic-filter">
107 <div class="wf-padding-no-left"><select id="wf-lt-preset-filters" data-bind="options: presetFiltersOptions, optionsText: presetFiltersOptionsText, value: selectedPresetFilter"></select></div>
108 &nbsp;&nbsp;
109 <input id="wf-live-traffic-filter-show-advanced" class="wf-option-checkbox" data-bind="checked: showAdvancedFilters" type="checkbox">
110 <label for="wf-live-traffic-filter-show-advanced">
111 <?php _e('Show Advanced Filters', 'wordfence') ?>
112 </label>
113 </li>
114 <li class="wf-live-traffic-show-expanded">
115 <ul class="wf-option wf-option-toggled-boolean-switch wf-option-no-spacing" data-option="liveTraf_displayExpandedRecords" data-enabled-value="1" data-disabled-value="0" data-original-value="<?php echo wfConfig::get('liveTraf_displayExpandedRecords') ? 1 : 0; ?>">
116 <li class="wf-boolean-switch<?php echo wfConfig::get('liveTraf_displayExpandedRecords') ? ' wf-active' : ''; ?>"><a href="#" class="wf-boolean-switch-handle"></a></li>
117 <li class="wf-option-title wf-padding-add-left wf-no-right wf-padding-no-right">
118 <?php echo __('Expand All Results', 'wordfence'); ?>
119 </li>
120 </ul>
121 </li>
122 </ul>
123
124 <div data-bind="visible: showAdvancedFilters" id="wf-lt-advanced-filters">
125 <div class="wf-live-traffic-filter-detail">
126 <div>
127 <div data-bind="foreach: filters">
128 <div class="wf-live-traffic-filter-item">
129 <div class="wf-live-traffic-filter-item-parameters">
130 <div>
131 <select name="param[]" class="wf-lt-advanced-filters-param" data-bind="options: filterParamOptions, optionsText: filterParamOptionsText, value: selectedFilterParamOptionValue, optionsCaption: 'Filter...'"></select>
132 </div>
133 <div data-bind="visible: selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() != 'bool'">
134 <select name="operator[]" class="wf-lt-advanced-filters-operator" data-bind="options: filterOperatorOptions, optionsText: filterOperatorOptionsText, value: selectedFilterOperatorOptionValue"></select>
135 </div>
136 <div data-bind="attr: {colSpan: (selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() == 'bool' ? 2 : 1)}" class="wf-lt-advanced-filters-value-cell">
137 <span data-bind="if: selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() == 'enum'">
138 <select data-bind="options: selectedFilterParamOptionValue().values, optionsText: selectedFilterParamOptionValue().optionsText, value: value"></select>
139 </span>
140
141 <span data-bind="if: selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() == 'text'">
142 <input data-bind="value: value" type="text">
143 </span>
144
145 <span data-bind="if: selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() == 'bool'">
146 <label>Yes <input data-bind="checked: value" type="radio" value="1"></label>
147 <label>No <input data-bind="checked: value" type="radio" value="0"></label>
148 </span>
149 </div>
150 </div>
151 <div>
152 <!--<button data-bind="click: $root.removeFilter" type="button" class="wf-btn wf-btn-default">Remove</button> -->
153 <a href="#" data-bind="click: $root.removeFilter" class="wf-live-traffic-filter-remove"><i class="wf-ion-trash-a"></i></a>
154 </div>
155 </div>
156 </div>
157 <div>
158 <div class="wf-pad-small">
159 <button type="button" class="wf-btn wf-btn-default" data-bind="click: addFilter">
160 Add Filter
161 </button>
162 </div>
163 </div>
164 </div>
165 <div class="wf-form wf-form-horizontal">
166 <div class="wf-form-group">
167 <label for="wf-live-traffic-from" class="wf-col-sm-2">From:&nbsp;</label>
168 <div class="wf-col-sm-10">
169 <input placeholder="Start date" id="wf-live-traffic-from" type="text" class="wf-datetime" data-bind="value: startDate, datetimepicker: null, datepickerOptions: { timeFormat: 'hh:mm tt z' }">
170 <button data-bind="click: startDate('')" class="wf-btn wf-btn-default wf-btn-sm" type="button">Clear</button>
171 </div>
172 </div>
173 <div class="wf-form-group">
174 <label for="wf-live-traffic-to" class="wf-col-sm-2">To:&nbsp;</label>
175 <div class="wf-col-sm-10">
176 <input placeholder="End date" id="wf-live-traffic-to" type="text" class="wf-datetime" data-bind="value: endDate, datetimepicker: null, datepickerOptions: { timeFormat: 'hh:mm tt z' }">
177 <button data-bind="click: endDate('')" class="wf-btn wf-btn-default wf-btn-sm" type="button">Clear</button>
178 </div>
179 </div>
180 <div class="wf-form-group">
181 <label for="wf-live-traffic-group-by" class="wf-col-sm-2">Group&nbsp;By:&nbsp;</label>
182 <div class="wf-col-sm-10">
183 <select id="wf-live-traffic-group-by" name="groupby" class="wf-lt-advanced-filters-groupby" data-bind="options: filterGroupByOptions, optionsText: filterGroupByOptionsText, value: groupBy, optionsCaption: 'None'"></select>
184 </div>
185 </div>
186 </div>
187 </div>
188 </div>
189 </form>
190 </div>
191 </div>
192 <div class="wf-row">
193 <div class="wf-col-xs-12">
194 <div id="wf-live-traffic-group-by" class="wf-block" data-bind="if: groupBy(), visible: groupBy()">
195 <ul class="wf-filtered-traffic wf-block-list" data-bind="foreach: listings">
196 <li class="wf-flex-row wf-padding-add-top wf-padding-add-bottom">
197 <div class="wf-flex-row-1">
198 <!-- ko if: $root.groupBy().param() == 'ip' -->
199 <div data-bind="if: loc()">
200 <span data-bind="attr: { class: 'wf-flag wf-flag-' + loc().countryCode.toLowerCase(), title: loc().countryName }"></span>
201 <a data-bind="text: (loc().city ? loc().city + ', ' : '') + loc().countryName,
202 attr: { href: 'http://maps.google.com/maps?q=' + loc().lat + ',' + loc().lon + '&z=6' }"
203 target="_blank" rel="noopener noreferrer"></a>
204 </div>
205 <div data-bind="if: !loc()">
206 An unknown location at IP
207 <span data-bind="text: IP" target="_blank" rel="noopener noreferrer"></span>
208 </div>
209
210 <div>
211 <strong>IP:</strong>
212 <span data-bind="text: IP" target="_blank" rel="noopener noreferrer"></span>
213 </div>
214 <div>
215 <span class="wfReverseLookup"><span data-bind="text: IP" style="display:none;"></span></span>
216 </div>
217 <!-- /ko -->
218 <!-- ko if: $root.groupBy().param() == 'type' -->
219 <div>
220 <strong>Type:</strong>
221 <span data-bind="if: jsRun() == '1'">Human</span>
222 <span data-bind="if: jsRun() == '0'">Bot</span>
223 </div>
224 <!-- /ko -->
225 <!-- ko if: $root.groupBy().param() == 'user_login' -->
226 <div>
227 <strong>Username:</strong>
228 <span data-bind="text: username()"></span>
229 </div>
230 <!-- /ko -->
231 <!-- ko if: $root.groupBy().param() == 'statusCode' -->
232 <div>
233 <strong>HTTP Response Code:</strong>
234 <span data-bind="text: statusCode()"></span>
235 </div>
236 <!-- /ko -->
237 <!-- ko if: $root.groupBy().param() == 'action' -->
238 <div>
239 <strong>Firewall Response:</strong>
240 <span data-bind="text: firewallAction()"></span>
241 </div>
242 <!-- /ko -->
243 <!-- ko if: $root.groupBy().param() == 'url' -->
244 <div>
245 <strong>URL:</strong>
246 <span data-bind="text: displayURL()"></span>
247 </div>
248 <!-- /ko -->
249 <div>
250 <strong>Last Hit:</strong> <span
251 data-bind="attr: { 'data-timestamp': ctime, text: 'Last hit was ' + ctime() + ' ago.' }"
252 class="wfTimeAgo wfTimeAgo-timestamp"></span>
253 </div>
254 <!-- ko if: $root.groupBy().param() == 'ip' -->
255 <div class="wf-add-top-small">
256 <span data-bind="if: blocked()">
257 <a class="wf-btn wf-btn-default wf-btn-sm" data-bind="click: unblockIP">Unblock IP</a>
258 </span>
259 <span data-bind="if: rangeBlocked()">
260 <a class="wf-btn wf-btn-default wf-btn-sm" data-bind="click: unblockNetwork">Unblock range</a>
261 </span>
262 <span data-bind="if: !blocked() && !rangeBlocked()">
263 <a class="wf-btn wf-btn-default wf-btn-sm" data-bind="click: blockIP">Block IP</a>
264 </span>
265 </div>
266 <!-- /ko -->
267 </div>
268 <div class="wf-flex-row-0 wf-padding-add-left">
269 <span class="wf-filtered-traffic-hits" data-bind="text: hitCount"></span> hits
270 </div>
271 </li>
272
273 </ul>
274 </div>
275
276 <div id="wf-live-traffic-no-group-by" data-bind="if: !groupBy()">
277 <table class="wf-striped-table">
278 <thead>
279 <tr>
280 <th>Type</th>
281 <th>Location</th>
282 <th>Page Visited</th>
283 <th>Time</th>
284 <th>IP Address</th>
285 <th>Hostname</th>
286 <th>Response</th>
287 <th>View</th>
288 </tr>
289 </thead>
290 <tbody id="wf-lt-listings" class="wf-filtered-traffic" data-bind="foreach: listings">
291 <tr data-bind="click: toggleDetails, css: { odd: ($index() % 2 == 1), even: ($index() % 2 == 0), 'wf-details-open': showDetails, highlighted: highlighted }" class="wf-summary-row">
292 <td class="wf-center">
293 <span data-bind="attr: { 'class': cssClasses }"></span>
294 </td>
295 <td>
296 <span class="wf-flex-horizontal" data-bind="if: loc()">
297 <span data-bind="attr: { class: 'wf-flag wf-flag-' + loc().countryCode.toLowerCase(), title: loc().countryName }"></span>
298 <span class="wf-padding-add-left-small" data-bind="text: (loc().city ? loc().city + ', ' : '') + loc().countryName"></span>
299 </span>
300 <span class="wf-flex-horizontal" data-bind="if: !loc()">
301 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 64.22 64.37" class="wf-flag wf-flag-unspecified"><path d="M64,28.21a30.32,30.32,0,0,0-5.8-14.73A31.6,31.6,0,0,0,37.43.56C35.7.26,33.94.18,32.2,0h-.35C30.22.18,28.58.3,27,.55A32.14,32.14,0,0,0,.2,35.61,31.4,31.4,0,0,0,10.4,55.87a31.24,31.24,0,0,0,25,8.33,30.5,30.5,0,0,0,18.94-8.79C62,47.94,65.15,38.8,64,28.21ZM57.21,44.68a23.94,23.94,0,0,1-2.3-5.08c-.66-2.45-2.27-.08-2.4,1.52s-1.2,2.8-3.33.4-2.54-1.87-3.2-1.87-1.87,1.6-1.6,9.07c.19,5.33,2.29,6.18,3.67,6.56a27.16,27.16,0,0,1-8.78,4A27.55,27.55,0,0,1,7.85,45.13C2.27,34.4,5,22.26,10.67,15.57c.15,1.21.3,2.29.43,3.37a27.63,27.63,0,0,1-.52,8.79,4.39,4.39,0,0,0,.08,1.94,1.3,1.3,0,0,0,.94.76c.27,0,.75-.41.86-.73a8.27,8.27,0,0,0,.27-1.86c0-.44,0-.89.07-1.58a10.67,10.67,0,0,1,1.06.86c.7.7,1.4,1.4,2,2.15a2.11,2.11,0,0,1,.56,1.21,3.44,3.44,0,0,0,.83,2.13,12.21,12.21,0,0,1,1.07,2.57c.14.37.17.78.33,1.13a2,2,0,0,0,1.8,1.32c1,.07,1.32.44,1.46,1.43l-.74.08c-1.17.11-1.75.65-1.71,1.83a8.43,8.43,0,0,0,2.69,6c.48.45,1,.87,1.46,1.33a3.35,3.35,0,0,1,.92,3.75,12.18,12.18,0,0,0-.69,2.09,6,6,0,0,0,.06,2.23c.18.75.1,2.37.86,2.24,1.36-.24,2.14,0,2.25-1.49a1.22,1.22,0,0,0-.08-.6c-.4-1.42,1.42-5.47,2.52-6.2a27.11,27.11,0,0,0,2.73-2,3.6,3.6,0,0,0,1.26-4,3.22,3.22,0,0,1,1.14-3.59,4.54,4.54,0,0,0,1.71-3.65c-.08-1.53-1.07-2.63-2.37-2.47a9.21,9.21,0,0,0-1.87.59,20.62,20.62,0,0,1-2.72.9c-1.31.23-2.11-.62-2.69-1.66-.47-.83-.63-.9-1.44-.38s-1.37.89-2.08,1.28S22,35.58,21.45,35a5.79,5.79,0,0,0-1.24-.88c-.31-.19-.73-.24-1-.48s-.8-.8-.75-1.15a1.69,1.69,0,0,1,.95-1.1,14.36,14.36,0,0,1,2.29-.51,7.33,7.33,0,0,0,1.22-.33c.52-.21.5-.56.1-.89a3.26,3.26,0,0,0-.69-.37l-3.52-1.39a4.74,4.74,0,0,1-.84-.43c-.74-.49-.83-1-.16-1.61,2.64-2.33,5.72-3,8.45.08.84,1,1.42,2.16,2.22,3.16a12.5,12.5,0,0,0,2.15,2.15,1.62,1.62,0,0,0,1.44.09,1.15,1.15,0,0,0,.29-1.56,8.43,8.43,0,0,0-.86-1.41,5.16,5.16,0,0,1,1.59-7.52,4.38,4.38,0,0,0,2.53-2.58c-.58.16-1,.26-1.42.39-2.3.71-.7-1,.36-1.31.65-.18-.58-.67-.58-.67s.82-.28,1.69-.65a6.85,6.85,0,0,0,1.7-.94,3.79,3.79,0,0,0,.66-1.17l-.16-.18-1.83.24c-1,.11-1.27-.09-1.37-1.14a1,1,0,0,0-1.48-.73c-.45.25-.85.61-1.29.9-1,.66-1.78.39-2.19-.75-.23-.68-.57-.81-1.19-.42-.31.18-.58.47-.89.64a11.53,11.53,0,0,1-1.62.79c-.55.19-1.21.33-1.58-.27a1.25,1.25,0,0,1,.46-1.68A14.78,14.78,0,0,1,27,10c1-.56,2.07-1,3-1.65a1.78,1.78,0,0,0,.79-2.07.88.88,0,0,0-1.37-.65c-.56.28-1.06.72-1.63,1a2.81,2.81,0,0,1-1.41.08c-.17,0-.35-.49-.35-.76s.31-.43.51-.46c1.4-.22,2.81-.41,4.22-.57a.76.76,0,0,1,.58.25,6.84,6.84,0,0,0,3.6,2.15c1.15.34,1.31.18,1.47-1,1.48-.34,3-1,4.46-.09A14.4,14.4,0,0,1,43.14,8c.18.17.07.7,0,1s-.36.87-.48,1.33a1.2,1.2,0,0,0,1.26,1.56c.29,0,.57-.07.86-.08.85,0,1.14.28,1.07,1.13-.11,1.21.09,1.35,1.31,1.15a2.07,2.07,0,0,1,1.67.64c1.14.86,2,.54,2.33-.86,0-.16,0-.32.06-.47.14-.63.49-.79.92-.35.9,1,1.74,2,2.66,3a3,3,0,0,0-.8,3.07,5.19,5.19,0,0,1-.55,3.27A24.63,24.63,0,0,0,52.2,25.5c-.45,1.57.06,2.3,1.66,2.65s1.78.64,1.84,2.14a4.85,4.85,0,0,0,2.92,4.35c.4.19.82.34,1.23.51a25.22,25.22,0,0,1-2.64,9.53Z"/></svg> <span class="wf-padding-add-left-small">Unspecified</span>
302 </span>
303 </td>
304 <td>
305 <span class="wf-lt-url wf-split-word-xs"
306 data-bind="text: displayURLShort, attr: { title: URL }"></span>
307 </td>
308 <td class="wf-nowrap" data-bind="text: timestamp"></td>
309 <td>
310 <span data-bind="attr: { title: IP }, text: $root.trimIP(IP())"></span>
311 </td>
312 <td>
313 <span class="wfReverseLookup" data-reverse-lookup-template="wf-live-traffic-hostname-template">
314 <span data-bind="text: IP" style="display:none;"></span>
315 </span>
316 </td>
317 <td data-bind="text: statusCode"></td>
318 <td class="wf-live-traffic-show-details">
319 <span class="wf-ion-eye"></span>
320 <span class="wf-ion-eye-disabled"></span>
321 </td>
322 </tr>
323 <tr data-bind="css: {
324 'wf-details-visible': showDetails,
325 'wf-details-hidden': !(showDetails()),
326 highlighted: highlighted,
327 odd: ($index() % 2 == 1), even: ($index() % 2 == 0) }" class="wf-details-row">
328 <td colspan="8" data-bind="attr: { id: ('wfActEvent_' + id()) }" class="wf-live-traffic-details">
329 <div class="wf-live-traffic-activity-detail-wrapper">
330 <div class="wf-live-traffic-activity-type">
331 <div data-bind="attr: { 'class': typeIconClass }"></div>
332 <div data-bind="text: typeText"></div>
333 </div>
334 <div class="wf-live-traffic-activity-detail">
335 <h2>Activity Detail</h2>
336 <div>
337 <span data-bind="if: action() != 'loginOK' && action() != 'loginFailValidUsername' && action() != 'loginFailInvalidUsername' && user()">
338 <span data-bind="attr: {'data-userid': user().ID}" class="wfAvatar"></span>
339 <a data-bind="attr: { href: user().editLink }, text: user().display_name"
340 target="_blank" rel="noopener noreferrer"></a>
341 </span>
342 <span data-bind="if: loc()">
343 <span data-bind="if: action() != 'loginOK' && action() != 'loginFailValidUsername' && action() != 'loginFailInvalidUsername' && user()"> in</span>
344 <span data-bind="attr: { class: 'wf-flag wf-flag-' + loc().countryCode.toLowerCase(), title: loc().countryName }"></span>
345 <a data-bind="text: (loc().city ? loc().city + ', ' : '') + loc().countryName,
346 attr: { href: 'http://maps.google.com/maps?q=' + loc().lat + ',' + loc().lon + '&z=6' }"
347 target="_blank" rel="noopener noreferrer"></a>
348 </span>
349 <span data-bind="if: !loc()">
350 <span data-bind="text: action() != 'loginOK' && action() != 'loginFailValidUsername' && action() != 'loginFailInvalidUsername' && user() ? 'at an' : 'An'"></span> unknown location at IP
351 <a data-bind="text: IP, attr: { href: WFAD.makeIPTrafLink(IP()) }"
352 target="_blank" rel="noopener noreferrer"></a>
353 </span>
354 <span data-bind="if: referer()">
355 <span data-bind="if: extReferer()">
356 arrived from <a data-bind="text: LiveTrafficViewModel.truncateText(referer(), 100), attr: { title: referer, href: referer }"
357 target="_blank" rel="noopener noreferrer"
358 class="wf-split-word-xs"></a> and
359 </span>
360 <span data-bind="if: !extReferer()">
361 left <a data-bind="text: LiveTrafficViewModel.truncateText(referer(), 100), attr: { title: referer, href: referer }"
362 target="_blank" rel="noopener noreferrer"
363 class="wf-split-word-xs"></a> and
364 </span>
365 </span>
366 <span data-bind="if: statusCode() == 404">
367 tried to access a <span style="color: #F00;">non-existent page</span>
368 </span>
369
370 <span data-bind="if: statusCode() == 200 && !action()">
371 visited
372 </span>
373 <span data-bind="if: (statusCode() == 301 || statusCode() == 302) && !action()">
374 was redirected when visiting
375 </span>
376 <span data-bind="if: (statusCode() == 301 || statusCode() == 302) && action() && firewallAction()">
377 was <span data-bind="text: firewallAction"></span> at
378 </span>
379 <span data-bind="if: ((statusCode() == 403 || statusCode() == 503) && action() != 'loginFailValidUsername' && action() != 'loginFailInvalidUsername')">
380 was <span data-bind="text: firewallAction" style="color: #F00;"></span> at
381 </span>
382
383 <span data-bind="if: action() == 'loginOK'">
384 logged in successfully as "<strong data-bind="text: username"></strong>".
385 </span>
386 <span data-bind="if: action() == 'logout'">
387 logged out successfully.
388 </span>
389 <span data-bind="if: action() == 'lostPassword'">
390 requested a password reset.
391 </span>
392 <span data-bind="if: action() == 'loginFailValidUsername'">
393 attempted a <span style="color: #F00;">failed login</span> as "<strong data-bind="text: username"></strong>".
394 </span>
395 <span data-bind="if: action() == 'loginFailInvalidUsername'">
396 attempted a <span style="color: #F00;">failed login</span> using an invalid username "<strong
397 data-bind="text: username"></strong>".
398 </span>
399 <span data-bind="if: action() == 'user:passwordReset'">
400 changed their password.
401 </span>
402 <a class="wf-lt-url wf-split-word-xs"
403 data-bind="text: displayURL, attr: { href: URL, title: URL }"
404 target="_blank" rel="noopener noreferrer"></a>
405 </div>
406 <div>
407 <span data-bind="text: timeAgo, attr: { 'data-timestamp': ctime }"
408 class="wfTimeAgo-timestamp"></span>&nbsp;&nbsp;
409 </div>
410 <div>
411 <strong>IP:</strong> <span data-bind="text: IP"></span>
412 <span class="wfReverseLookup">
413 <span data-bind="text: IP" style="display:none;"></span>
414 </span>
415 <span data-bind="if: blocked()">
416 <a class="wf-btn wf-btn-default wf-btn-sm wf-block-ip-btn"
417 data-bind="click: unblockIP">
418 Unblock IP
419 </a>
420 </span>
421 <span data-bind="if: rangeBlocked()">
422 <a class="wf-btn wf-btn-default wf-btn-sm wf-block-ip-btn"
423 data-bind="click: unblockNetwork">Unblock range
424 </a>
425 </span>
426 <span data-bind="if: !blocked() && !rangeBlocked()">
427 <a class="wf-btn wf-btn-default wf-btn-sm wf-block-ip-btn"
428 data-bind="click: blockIP">
429 Block IP
430 </a>
431 </span>
432 </div>
433 <div data-bind="visible: (jQuery.inArray(parseInt(statusCode(), 10), [403, 503, 404]) !== -1 || action() == 'loginFailValidUsername' || action() == 'loginFailInvalidUsername')">
434 <strong>Human/Bot:</strong> <span data-bind="text: (jsRun() === '1' ? 'Human' : 'Bot')"></span>
435 </div>
436 <div data-bind="if: browser() && browser().browser != 'Default Browser'">
437 <strong>Browser:</strong>
438 <span data-bind="text: browser().browser +
439 (browser().version ? ' version ' + browser().version : '') +
440 (browser().platform && browser().platform != 'unknown' ? ' running on ' + browser().platform : '')
441 "></span>
442 </div>
443 <div class="wf-split-word" data-bind="text: UA"></div>
444 <div class="wf-live-traffic-actions">
445 <span data-bind="if: blocked()">
446 <a class="wf-btn wf-btn-default wf-btn-sm"
447 data-bind="click: unblockIP">
448 Unblock IP
449 </a>
450 </span>
451 <span data-bind="if: rangeBlocked()">
452 <a class="wf-btn wf-btn-default wf-btn-sm"
453 data-bind="click: unblockNetwork">Unblock range
454 </a>
455 </span>
456 <span data-bind="if: !blocked() && !rangeBlocked()">
457 <a class="wf-btn wf-btn-default wf-btn-sm"
458 data-bind="click: blockIP">
459 Block IP
460 </a>
461 </span>
462 <a class="wf-btn wf-btn-default wf-btn-sm" data-bind="click: showWhoisOverlay"
463 target="_blank" rel="noopener noreferrer">Run Whois</a>
464 <a class="wf-btn wf-btn-default wf-btn-sm"
465 data-bind="click: showRecentTraffic" target="_blank" rel="noopener noreferrer">
466 <span class="wf-hidden-xs"><?php _e('See recent traffic', 'wordfence'); ?></span><span class="wf-visible-xs"><?php _e('Recent', 'wordfence'); ?></span>
467 </a>
468 <span data-bind="if: action() == 'blocked:waf'">
469 <a class="wf-btn wf-btn-default wf-btn-sm"
470 data-bind="click: function () { $root.whitelistWAFParamKey(actionData().path, actionData().paramKey, actionData().failedRules) }"
471 title="If this is a false positive, you can exclude this parameter from being filtered by the firewall">
472 Whitelist param from Firewall
473 </a>
474 <?php if (WFWAF_DEBUG): ?>
475 <a class="wf-btn wf-btn-default wf-btn-sm"
476 data-bind="attr: { href: '<?php echo esc_js(home_url()) ?>?_wfsf=debugWAF&nonce=' + WFAD.nonce + '&hitid=' + id() }" target="_blank" rel="noopener noreferrer">
477 Debug this Request
478 </a>
479 <?php endif ?>
480 </span>
481 </div>
482 </div>
483 </div>
484 </td>
485 </tr>
486 </tbody>
487 </table>
488 </div>
489 <div class="wf-live-traffic-none" data-bind="if: listings().length == 0">
490 No requests to report yet.
491 </div>
492 </div>
493 </div>
494 </div>
495 </div>
496 </div>
497 </div>
498 </div>
499 </div>
500 </div>
501
502 <script type="application/javascript">
503 (function($) {
504 $(function() {
505 $('.wf-option.wf-option-toggled-boolean-switch[data-option="liveTraf_displayExpandedRecords"]').on('change', function() {
506 delete WFAD.pendingChanges['liveTraf_displayExpandedRecords'];
507 var isOn = $(this).find('.wf-boolean-switch').hasClass('wf-active');
508 WFAD.setOption($(this).data('option'), (isOn ? $(this).data('enabledValue') : $(this).data('disabledValue')), function() {
509 $('#wf-live-traffic').toggleClass('wf-live-traffic-display-expanded', isOn);
510 });
511 });
512 });
513 })(jQuery);
514 </script>
515
516 <div id="wf-live-traffic-util-overlay-wrapper" style="display: none">
517 <div class="wf-live-traffic-util-overlay">
518 <div class="wf-live-traffic-util-overlay-header"></div>
519 <div class="wf-live-traffic-util-overlay-body"></div>
520 <span class="wf-live-traffic-util-overlay-close wf-ion-android-close"></span>
521 </div>
522 </div>
523
524 <div id="wfrawhtml"></div>
525
526 <script type="text/x-jquery-template" id="wf-live-traffic-hostname-template">
527 <span title="${ip}">${(ip && ip.length > 22) ? '...' + ip.substring(ip.length - 22) : ip}</span>
528 </script>
529
530 <?php if (wfOnboardingController::willShowNewTour(wfOnboardingController::TOUR_LIVE_TRAFFIC)): ?>
531 <script type="application/javascript">
532 (function($) {
533 $(function() {
534 WFAD.tour1 = function() {
535 WFAD.tour('wfNewTour1', 'wf-live-traffic', 'bottom', 'bottom', null, WFAD.tourComplete);
536 };
537 WFAD.tourComplete = function() { WFAD.tourFinish('<?php echo esc_attr(wfOnboardingController::TOUR_LIVE_TRAFFIC); ?>'); };
538
539 <?php if (wfOnboardingController::shouldShowNewTour(wfOnboardingController::TOUR_LIVE_TRAFFIC)): ?>
540 if (!WFAD.isSmallScreen) { WFAD.tour1(); }
541 <?php endif; ?>
542 });
543 })(jQuery);
544 </script>
545
546 <script type="text/x-jquery-template" id="wfNewTour1">
547 <div>
548 <h3><?php _e('Live Traffic', 'wordfence'); ?></h3>
549 <p><?php _e('Live traffic defaults to a summary view of all security-related traffic. Details are viewable by clicking anywhere within the summary record. To switch to the expanded view, click the <strong>Expand All Records</strong> switch.', 'wordfence'); ?></p>
550 <div class="wf-pointer-footer">
551 <ul class="wf-tour-pagination">
552 <li class="wf-active">&bullet;</li>
553 </ul>
554 <div id="wf-tour-continue"><a href="#" class="wf-onboarding-btn wf-onboarding-btn-primary"><?php _e('Got it', 'wordfence'); ?></a></div>
555 </div>
556 <div id="wf-tour-close"><a href="#"><i class="wf-fa wf-fa-times-circle" aria-hidden="true"></i></a></div>
557 </div>
558 </script>
559 <?php endif; ?>
560
561 <?php if (wfOnboardingController::willShowUpgradeTour(wfOnboardingController::TOUR_LIVE_TRAFFIC)): ?>
562 <script type="application/javascript">
563 (function($) {
564 $(function() {
565 WFAD.tour1 = function() {
566 WFAD.tour('wfUpgradeTour1', 'wf-live-traffic', 'bottom', 'bottom', null, WFAD.tourComplete);
567 };
568 WFAD.tourComplete = function() { WFAD.tourFinish('<?php echo esc_attr(wfOnboardingController::TOUR_LIVE_TRAFFIC); ?>'); };
569
570 <?php if (wfOnboardingController::shouldShowUpgradeTour(wfOnboardingController::TOUR_LIVE_TRAFFIC)): ?>
571 if (!WFAD.isSmallScreen) { WFAD.tour1(); }
572 <?php endif; ?>
573 });
574 })(jQuery);
575 </script>
576
577 <script type="text/x-jquery-template" id="wfUpgradeTour1">
578 <div>
579 <h3><?php _e('Live Traffic', 'wordfence'); ?></h3>
580 <p><?php _e('Live traffic now defaults to a summary view. Details are viewable by clicking anywhere within the summary record. To switch to the expanded view, click the <strong>Expand All Records</strong> switch. New installations will only log security-related traffic by default, though your previous setting has been preserved.', 'wordfence'); ?></p>
581 <div class="wf-pointer-footer">
582 <ul class="wf-tour-pagination">
583 <li class="wf-active">&bullet;</li>
584 </ul>
585 <div id="wf-tour-continue"><a href="#" class="wf-onboarding-btn wf-onboarding-btn-primary"><?php _e('Got it', 'wordfence'); ?></a></div>
586 </div>
587 <div id="wf-tour-close"><a href="#"><i class="wf-fa wf-fa-times-circle" aria-hidden="true"></i></a></div>
588 </div>
589 </script>
590 <?php endif; ?>
591