WP Security Audit Log - Version 2.6.8

Version Description

(2017-09-19) =

  • Improvement

    • Improved the sensor for custom post types so posts with NULL value or other temp custom posts are not reported. This was reported in several support tickets; here, here and here.
  • Bug Fix

    • Add a new check to ensure the object is of WP_Post class Support Ticket
Download this release

Release Info

Developer WPWhiteSecurity
Plugin Icon 128x128 WP Security Audit Log
Version 2.6.8
Comparing to
See all releases

Code changes from version 2.6.7 to 2.6.8

classes/AlertManager.php CHANGED
@@ -7,432 +7,469 @@
7
  */
8
  final class WSAL_AlertManager
9
  {
10
- /**
11
- * @var WSAL_Alert[]
12
- */
13
- protected $_alerts = array();
14
-
15
- /**
16
- * @var WSAL_AbstractLogger[]
17
- */
18
- protected $_loggers = array();
19
-
20
- /**
21
- * @var WpSecurityAuditLog
22
- */
23
- protected $plugin;
24
-
25
- /**
26
- * Contains a list of alerts to trigger.
27
- * @var array
28
- */
29
- protected $_pipeline = array();
30
-
31
- /**
32
- * Contains an array of alerts that have been triggered for this request.
33
- * @var int[]
34
- */
35
- protected $_triggered_types = array();
36
-
37
- /**
38
- * Create new AlertManager instance.
39
- * @param WpSecurityAuditLog $plugin
40
- */
41
- public function __construct(WpSecurityAuditLog $plugin)
42
- {
43
- $this->plugin = $plugin;
44
- foreach (glob(dirname(__FILE__) . '/Loggers/*.php') as $file) {
45
- $this->AddFromFile($file);
46
- }
47
-
48
- add_action('shutdown', array($this, '_CommitPipeline'));
49
- }
50
-
51
- /**
52
- * Add new logger from file inside autoloader path.
53
- * @param string $file Path to file.
54
- */
55
- public function AddFromFile($file)
56
- {
57
- $this->AddFromClass($this->plugin->GetClassFileClassName($file));
58
- }
59
-
60
- /**
61
- * Add new logger given class name.
62
- * @param string $class Class name.
63
- */
64
- public function AddFromClass($class)
65
- {
66
- $this->AddInstance(new $class($this->plugin));
67
- }
68
-
69
- /**
70
- * Add newly created logger to list.
71
- * @param WSAL_AbstractLogger $logger The new logger.
72
- */
73
- public function AddInstance(WSAL_AbstractLogger $logger)
74
- {
75
- $this->_loggers[] = $logger;
76
- }
77
-
78
- /**
79
- * Remove logger by class name.
80
- * @param string $class The class name.
81
- */
82
- public function RemoveByClass($class)
83
- {
84
- foreach ($this->_loggers as $i => $inst) {
85
- if (get_class($inst) == $class) {
86
- unset($this->_loggers[$i]);
87
- }
88
- }
89
- }
90
-
91
- /**
92
- * Trigger an alert.
93
- * @param integer $type Alert type.
94
- * @param array $data Alert data.
95
- */
96
- public function Trigger($type, $data = array(), $delayed = false)
97
- {
98
- $username = wp_get_current_user()->user_login;
99
- if (empty($username) && !empty($data["Username"])) {
100
- $username = $data['Username'];
101
- }
102
- $roles = $this->plugin->settings->GetCurrentUserRoles();
103
- if (empty($roles) && !empty($data["CurrentUserRoles"])) {
104
- $roles = $data['CurrentUserRoles'];
105
- }
106
- if ($this->IsDisabledIP()) {
107
- return;
108
- }
109
- if ($this->CheckEnableUserRoles($username, $roles)) {
110
- if ($delayed) {
111
- $this->TriggerIf($type, $data, null);
112
- } else {
113
- $this->_CommitItem($type, $data, null);
114
- }
115
- }
116
- }
117
-
118
- /**
119
- * Check enable user and roles.
120
- * @param string user
121
- * @param array roles
122
- * @return boolean True if enable false otherwise.
123
- */
124
- public function CheckEnableUserRoles($user, $roles)
125
- {
126
- $is_enable = true;
127
- if ($user != "" && $this->IsDisabledUser($user)) {
128
- $is_enable = false;
129
- }
130
- if ($roles != "" && $this->IsDisabledRole($roles)) {
131
- $is_enable = false;
132
- }
133
- return $is_enable;
134
- }
135
-
136
- /**
137
- * Trigger only if a condition is met at the end of request.
138
- * @param integer $type Alert type ID.
139
- * @param array $data Alert data.
140
- * @param callable $cond A future condition callback (receives an object of type WSAL_AlertManager as parameter).
141
- */
142
- public function TriggerIf($type, $data, $cond = null)
143
- {
144
- $username = wp_get_current_user()->user_login;
145
- $roles = $this->plugin->settings->GetCurrentUserRoles();
146
-
147
- if ($this->CheckEnableUserRoles($username, $roles)) {
148
- $this->_pipeline[] = array(
149
- 'type' => $type,
150
- 'data' => $data,
151
- 'cond' => $cond,
152
- );
153
- }
154
- }
155
-
156
- /**
157
- * @internal Commit an alert now.
158
- */
159
- protected function _CommitItem($type, $data, $cond, $_retry = true)
160
- {
161
- if (!$cond || !!call_user_func($cond, $this)) {
162
- if ($this->IsEnabled($type)) {
163
- if (isset($this->_alerts[$type])) {
164
- // ok, convert alert to a log entry
165
- $this->_triggered_types[] = $type;
166
- $this->Log($type, $data);
167
- } elseif ($_retry) {
168
- // this is the last attempt at loading alerts from default file
169
- $this->plugin->LoadDefaults();
170
- return $this->_CommitItem($type, $data, $cond, false);
171
- } else {
172
- // in general this shouldn't happen, but it could, so we handle it here :)
173
- throw new Exception('Alert with code "' . $type . '" has not be registered.');
174
- }
175
- }
176
- }
177
- }
178
-
179
- /**
180
- * @internal Runs over triggered alerts in pipeline and passes them to loggers.
181
- */
182
- public function _CommitPipeline()
183
- {
184
- foreach ($this->_pipeline as $item) {
185
- $this->_CommitItem($item['type'], $item['data'], $item['cond']);
186
- }
187
- }
188
-
189
- /**
190
- * @param integer $type Alert type ID.
191
- * @return boolean True if at the end of request an alert of this type will be triggered.
192
- */
193
- public function WillTrigger($type)
194
- {
195
- foreach ($this->_pipeline as $item) {
196
- if ($item['type'] == $type) {
197
- return true;
198
- }
199
- }
200
- return false;
201
- }
202
-
203
- /**
204
- * @param int $type Alert type ID.
205
- * @return boolean True if an alert has been or will be triggered in this request, false otherwise.
206
- */
207
- public function WillOrHasTriggered($type)
208
- {
209
- return in_array($type, $this->_triggered_types)
210
- || $this->WillTrigger($type);
211
- }
212
-
213
- /**
214
- * Register an alert type.
215
- * @param array $info Array of [type, code, category, description, message] respectively.
216
- */
217
- public function Register($info)
218
- {
219
- if (func_num_args() == 1) {
220
- // handle single item
221
- list($type, $code, $catg, $subcatg, $desc, $mesg) = $info;
222
- if (isset($this->_alerts[$type])) {
223
- throw new Exception("Alert $type already registered with Alert Manager.");
224
- }
225
- $this->_alerts[$type] = new WSAL_Alert($type, $code, $catg, $subcatg, $desc, $mesg);
226
- } else {
227
- // handle multiple items
228
- foreach (func_get_args() as $arg) {
229
- $this->Register($arg);
230
- }
231
- }
232
- }
233
-
234
- /**
235
- * Register a whole group of items.
236
- * @param array $groups An array with group name as the index and an array of group items as the value.
237
- * Item values is an array of [type, code, description, message] respectively.
238
- */
239
- public function RegisterGroup($groups)
240
- {
241
- foreach ($groups as $name => $group) {
242
- foreach ($group as $subname => $subgroup) {
243
- foreach ($subgroup as $item) {
244
- list($type, $code, $desc, $mesg) = $item;
245
- $this->Register(array($type, $code, $name, $subname, $desc, $mesg));
246
- }
247
- }
248
- }
249
- }
250
-
251
- /**
252
- * Returns whether alert of type $type is enabled or not.
253
- * @param integer $type Alert type.
254
- * @return boolean True if enabled, false otherwise.
255
- */
256
- public function IsEnabled($type)
257
- {
258
- return !in_array($type, $this->GetDisabledAlerts());
259
- }
260
-
261
- /**
262
- * Disables a set of alerts by type.
263
- * @param int[] $types Alert type codes to be disabled.
264
- */
265
- public function SetDisabledAlerts($types)
266
- {
267
- $this->plugin->settings->SetDisabledAlerts($types);
268
- }
269
-
270
- /**
271
- * @return int[] Returns an array of disabled alerts' type code.
272
- */
273
- public function GetDisabledAlerts()
274
- {
275
- return $this->plugin->settings->GetDisabledAlerts();
276
- }
277
-
278
- /**
279
- * @return WSAL_AbstractLogger[] Returns an array of loaded loggers.
280
- */
281
- public function GetLoggers()
282
- {
283
- return $this->_loggers;
284
- }
285
-
286
- /**
287
- * Converts an Alert into a Log entry (by invoking loggers).
288
- * You should not call this method directly.
289
- * @param integer $type Alert type.
290
- * @param array $data Misc alert data.
291
- */
292
- protected function Log($type, $data = array())
293
- {
294
- if (!isset($data['ClientIP'])) {
295
- $clientIP = $this->plugin->settings->GetMainClientIP();
296
- if (!empty($clientIP)) {
297
- $data['ClientIP'] = $clientIP;
298
- }
299
- }
300
- if (!isset($data['OtherIPs']) && $this->plugin->settings->IsMainIPFromProxy()) {
301
- $otherIPs = $this->plugin->settings->GetClientIPs();
302
- if (!empty($otherIPs)) {
303
- $data['OtherIPs'] = $otherIPs;
304
- }
305
- }
306
- if (!isset($data['UserAgent'])) {
307
- if (isset($_SERVER['HTTP_USER_AGENT'])) {
308
- $data['UserAgent'] = $_SERVER['HTTP_USER_AGENT'];
309
- }
310
- }
311
- if (!isset($data['Username']) && !isset($data['CurrentUserID'])) {
312
- if (function_exists('get_current_user_id')) {
313
- $data['CurrentUserID'] = get_current_user_id();
314
- }
315
- }
316
- if (!isset($data['CurrentUserRoles']) && function_exists('is_user_logged_in') && is_user_logged_in()) {
317
- $currentUserRoles = $this->plugin->settings->GetCurrentUserRoles();
318
- if (!empty($currentUserRoles)) {
319
- $data['CurrentUserRoles'] = $currentUserRoles;
320
- }
321
- }
322
- // Check if the user management plugin is loaded and adds the SessionID
323
- if ( class_exists( 'WSAL_User_Management_Plugin' ) ) {
324
- if ( function_exists( 'get_current_user_id' ) ) {
325
- $session_tokens = get_user_meta( get_current_user_id(), 'session_tokens', true );
326
- if ( ! empty( $session_tokens ) ) {
327
- end( $session_tokens );
328
- $data['SessionID'] = key( $session_tokens );
329
- }
330
- }
331
- }
332
- //if(isset($_SERVER['REMOTE_HOST']) && $_SERVER['REMOTE_HOST'] != $data['ClientIP'])
333
- // $data['ClientHost'] = $_SERVER['REMOTE_HOST'];
334
- //$data['OtherIPs'] = $_SERVER['REMOTE_HOST'];
335
-
336
- foreach ($this->_loggers as $logger) {
337
- $logger->Log($type, $data);
338
- }
339
- }
340
-
341
- /**
342
- * Return alert given alert type.
343
- * @param integer $type Alert type.
344
- * @param mixed $default Returned if alert is not found.
345
- * @return WSAL_Alert
346
- */
347
- public function GetAlert($type, $default = null)
348
- {
349
- foreach ($this->_alerts as $alert) {
350
- if ($alert->type == $type) {
351
- return $alert;
352
- }
353
- }
354
- return $default;
355
- }
356
-
357
- /**
358
- * Returns all supported alerts.
359
- * @return WSAL_Alert[]
360
- */
361
- public function GetAlerts()
362
- {
363
- return $this->_alerts;
364
- }
365
-
366
- /**
367
- * Returns all supported alerts.
368
- * @return array
369
- */
370
- public function GetCategorizedAlerts()
371
- {
372
- $result = array();
373
- foreach ($this->_alerts as $alert) {
374
- if (!isset($result[$alert->catg])) {
375
- $result[$alert->catg] = array();
376
- }
377
- if (!isset($result[$alert->catg][$alert->subcatg])) {
378
- $result[$alert->catg][$alert->subcatg] = array();
379
- }
380
- $result[$alert->catg][$alert->subcatg][] = $alert;
381
- }
382
- ksort($result);
383
- return $result;
384
- }
385
-
386
- /**
387
- * Returns whether user is enabled or not.
388
- * @param string user.
389
- * @return boolean True if disabled, false otherwise.
390
- */
391
- public function IsDisabledUser($user)
392
- {
393
- return (in_array($user, $this->GetDisabledUsers())) ? true : false;
394
- }
395
-
396
- /**
397
- * @return Returns an array of disabled users.
398
- */
399
- public function GetDisabledUsers()
400
- {
401
- return $this->plugin->settings->GetExcludedMonitoringUsers();
402
- }
403
-
404
- /**
405
- * Returns whether user is enabled or not.
406
- * @param array roles.
407
- * @return boolean True if disabled, false otherwise.
408
- */
409
- public function IsDisabledRole($roles)
410
- {
411
- $is_disabled = false;
412
- foreach ($roles as $role) {
413
- if (in_array($role, $this->GetDisabledRoles())) {
414
- $is_disabled = true;
415
- }
416
- }
417
- return $is_disabled;
418
- }
419
-
420
- /**
421
- * @return Returns an array of disabled users.
422
- */
423
- public function GetDisabledRoles()
424
- {
425
- return $this->plugin->settings->GetExcludedMonitoringRoles();
426
- }
427
-
428
- private function IsDisabledIP()
429
- {
430
- $is_disabled = false;
431
- $ip = $this->plugin->settings->GetMainClientIP();
432
- $excluded_ips = $this->plugin->settings->GetExcludedMonitoringIP();
433
- if (in_array($ip, $excluded_ips)) {
434
- $is_disabled = true;
435
- }
436
- return $is_disabled;
437
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
438
  }
7
  */
8
  final class WSAL_AlertManager
9
  {
10
+ /**
11
+ * @var WSAL_Alert[]
12
+ */
13
+ protected $_alerts = array();
14
+
15
+ /**
16
+ * @var WSAL_AbstractLogger[]
17
+ */
18
+ protected $_loggers = array();
19
+
20
+ /**
21
+ * @var WpSecurityAuditLog
22
+ */
23
+ protected $plugin;
24
+
25
+ /**
26
+ * Contains a list of alerts to trigger.
27
+ * @var array
28
+ */
29
+ protected $_pipeline = array();
30
+
31
+ /**
32
+ * Contains an array of alerts that have been triggered for this request.
33
+ * @var int[]
34
+ */
35
+ protected $_triggered_types = array();
36
+
37
+ /**
38
+ * Create new AlertManager instance.
39
+ * @param WpSecurityAuditLog $plugin
40
+ */
41
+ public function __construct(WpSecurityAuditLog $plugin)
42
+ {
43
+ $this->plugin = $plugin;
44
+ foreach (glob(dirname(__FILE__) . '/Loggers/*.php') as $file) {
45
+ $this->AddFromFile($file);
46
+ }
47
+
48
+ add_action('shutdown', array($this, '_CommitPipeline'));
49
+ }
50
+
51
+ /**
52
+ * Add new logger from file inside autoloader path.
53
+ * @param string $file Path to file.
54
+ */
55
+ public function AddFromFile($file)
56
+ {
57
+ $this->AddFromClass($this->plugin->GetClassFileClassName($file));
58
+ }
59
+
60
+ /**
61
+ * Add new logger given class name.
62
+ * @param string $class Class name.
63
+ */
64
+ public function AddFromClass($class)
65
+ {
66
+ $this->AddInstance(new $class($this->plugin));
67
+ }
68
+
69
+ /**
70
+ * Add newly created logger to list.
71
+ * @param WSAL_AbstractLogger $logger The new logger.
72
+ */
73
+ public function AddInstance(WSAL_AbstractLogger $logger)
74
+ {
75
+ $this->_loggers[] = $logger;
76
+ }
77
+
78
+ /**
79
+ * Remove logger by class name.
80
+ * @param string $class The class name.
81
+ */
82
+ public function RemoveByClass($class)
83
+ {
84
+ foreach ($this->_loggers as $i => $inst) {
85
+ if (get_class($inst) == $class) {
86
+ unset($this->_loggers[$i]);
87
+ }
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Trigger an alert.
93
+ *
94
+ * @param integer $type Alert type.
95
+ * @param array $data Alert data.
96
+ * @param bool $delayed - False if delayed, true if not.
97
+ */
98
+ public function Trigger( $type, $data = array(), $delayed = false ) {
99
+
100
+ // Get username.
101
+ $username = wp_get_current_user()->user_login;
102
+ if ( empty( $username ) && ! empty( $data['Username'] ) ) {
103
+ $username = $data['Username'];
104
+ }
105
+
106
+ // Get current user roles.
107
+ $roles = $this->plugin->settings->GetCurrentUserRoles();
108
+ if ( empty( $roles ) && ! empty( $data['CurrentUserRoles'] ) ) {
109
+ $roles = $data['CurrentUserRoles'];
110
+ }
111
+
112
+ // Check if IP is disabled.
113
+ if ( $this->IsDisabledIP() ) {
114
+ return;
115
+ }
116
+
117
+ // Check if PostType index is set in data array.
118
+ if ( isset( $data['PostType'] ) && ! empty( $data['PostType'] ) ) {
119
+ // If the post type is disabled then return.
120
+ if ( $this->is_disabled_post_type( $data['PostType'] ) ) {
121
+ return;
122
+ }
123
+ }
124
+
125
+ // If user or user role is enable then go ahead.
126
+ if ( $this->CheckEnableUserRoles( $username, $roles ) ) {
127
+ if ( $delayed ) {
128
+ $this->TriggerIf( $type, $data, null );
129
+ } else {
130
+ $this->_CommitItem( $type, $data, null );
131
+ }
132
+ }
133
+ }
134
+
135
+ /**
136
+ * Check enable user and roles.
137
+ * @param string user
138
+ * @param array roles
139
+ * @return boolean True if enable false otherwise.
140
+ */
141
+ public function CheckEnableUserRoles($user, $roles)
142
+ {
143
+ $is_enable = true;
144
+ if ($user != "" && $this->IsDisabledUser($user)) {
145
+ $is_enable = false;
146
+ }
147
+ if ($roles != "" && $this->IsDisabledRole($roles)) {
148
+ $is_enable = false;
149
+ }
150
+ return $is_enable;
151
+ }
152
+
153
+ /**
154
+ * Trigger only if a condition is met at the end of request.
155
+ *
156
+ * @param integer $type Alert type ID.
157
+ * @param array $data Alert data.
158
+ * @param callable $cond A future condition callback (receives an object of type WSAL_AlertManager as parameter).
159
+ */
160
+ public function TriggerIf( $type, $data, $cond = null ) {
161
+ $username = wp_get_current_user()->user_login;
162
+ $roles = $this->plugin->settings->GetCurrentUserRoles();
163
+
164
+ if ( $this->CheckEnableUserRoles( $username, $roles ) ) {
165
+ $this->_pipeline[] = array(
166
+ 'type' => $type,
167
+ 'data' => $data,
168
+ 'cond' => $cond,
169
+ );
170
+ }
171
+ }
172
+
173
+ /**
174
+ * @internal Commit an alert now.
175
+ */
176
+ protected function _CommitItem($type, $data, $cond, $_retry = true)
177
+ {
178
+ if (!$cond || !!call_user_func($cond, $this)) {
179
+ if ($this->IsEnabled($type)) {
180
+ if (isset($this->_alerts[$type])) {
181
+ // ok, convert alert to a log entry
182
+ $this->_triggered_types[] = $type;
183
+ $this->Log($type, $data);
184
+ } elseif ($_retry) {
185
+ // this is the last attempt at loading alerts from default file
186
+ $this->plugin->LoadDefaults();
187
+ return $this->_CommitItem($type, $data, $cond, false);
188
+ } else {
189
+ // in general this shouldn't happen, but it could, so we handle it here :)
190
+ throw new Exception('Alert with code "' . $type . '" has not be registered.');
191
+ }
192
+ }
193
+ }
194
+ }
195
+
196
+ /**
197
+ * @internal Runs over triggered alerts in pipeline and passes them to loggers.
198
+ */
199
+ public function _CommitPipeline()
200
+ {
201
+ foreach ($this->_pipeline as $item) {
202
+ $this->_CommitItem($item['type'], $item['data'], $item['cond']);
203
+ }
204
+ }
205
+
206
+ /**
207
+ * @param integer $type Alert type ID.
208
+ * @return boolean True if at the end of request an alert of this type will be triggered.
209
+ */
210
+ public function WillTrigger($type)
211
+ {
212
+ foreach ($this->_pipeline as $item) {
213
+ if ($item['type'] == $type) {
214
+ return true;
215
+ }
216
+ }
217
+ return false;
218
+ }
219
+
220
+ /**
221
+ * @param int $type Alert type ID.
222
+ * @return boolean True if an alert has been or will be triggered in this request, false otherwise.
223
+ */
224
+ public function WillOrHasTriggered($type)
225
+ {
226
+ return in_array($type, $this->_triggered_types)
227
+ || $this->WillTrigger($type);
228
+ }
229
+
230
+ /**
231
+ * Register an alert type.
232
+ * @param array $info Array of [type, code, category, description, message] respectively.
233
+ */
234
+ public function Register($info)
235
+ {
236
+ if (func_num_args() == 1) {
237
+ // handle single item
238
+ list($type, $code, $catg, $subcatg, $desc, $mesg) = $info;
239
+ if (isset($this->_alerts[$type])) {
240
+ throw new Exception("Alert $type already registered with Alert Manager.");
241
+ }
242
+ $this->_alerts[$type] = new WSAL_Alert($type, $code, $catg, $subcatg, $desc, $mesg);
243
+ } else {
244
+ // handle multiple items
245
+ foreach (func_get_args() as $arg) {
246
+ $this->Register($arg);
247
+ }
248
+ }
249
+ }
250
+
251
+ /**
252
+ * Register a whole group of items.
253
+ * @param array $groups An array with group name as the index and an array of group items as the value.
254
+ * Item values is an array of [type, code, description, message] respectively.
255
+ */
256
+ public function RegisterGroup($groups)
257
+ {
258
+ foreach ($groups as $name => $group) {
259
+ foreach ($group as $subname => $subgroup) {
260
+ foreach ($subgroup as $item) {
261
+ list($type, $code, $desc, $mesg) = $item;
262
+ $this->Register(array($type, $code, $name, $subname, $desc, $mesg));
263
+ }
264
+ }
265
+ }
266
+ }
267
+
268
+ /**
269
+ * Returns whether alert of type $type is enabled or not.
270
+ * @param integer $type Alert type.
271
+ * @return boolean True if enabled, false otherwise.
272
+ */
273
+ public function IsEnabled($type)
274
+ {
275
+ return !in_array($type, $this->GetDisabledAlerts());
276
+ }
277
+
278
+ /**
279
+ * Disables a set of alerts by type.
280
+ * @param int[] $types Alert type codes to be disabled.
281
+ */
282
+ public function SetDisabledAlerts($types)
283
+ {
284
+ $this->plugin->settings->SetDisabledAlerts($types);
285
+ }
286
+
287
+ /**
288
+ * @return int[] Returns an array of disabled alerts' type code.
289
+ */
290
+ public function GetDisabledAlerts()
291
+ {
292
+ return $this->plugin->settings->GetDisabledAlerts();
293
+ }
294
+
295
+ /**
296
+ * @return WSAL_AbstractLogger[] Returns an array of loaded loggers.
297
+ */
298
+ public function GetLoggers()
299
+ {
300
+ return $this->_loggers;
301
+ }
302
+
303
+ /**
304
+ * Converts an Alert into a Log entry (by invoking loggers).
305
+ * You should not call this method directly.
306
+ * @param integer $type Alert type.
307
+ * @param array $data Misc alert data.
308
+ */
309
+ protected function Log($type, $data = array())
310
+ {
311
+ if (!isset($data['ClientIP'])) {
312
+ $clientIP = $this->plugin->settings->GetMainClientIP();
313
+ if (!empty($clientIP)) {
314
+ $data['ClientIP'] = $clientIP;
315
+ }
316
+ }
317
+ if (!isset($data['OtherIPs']) && $this->plugin->settings->IsMainIPFromProxy()) {
318
+ $otherIPs = $this->plugin->settings->GetClientIPs();
319
+ if (!empty($otherIPs)) {
320
+ $data['OtherIPs'] = $otherIPs;
321
+ }
322
+ }
323
+ if (!isset($data['UserAgent'])) {
324
+ if (isset($_SERVER['HTTP_USER_AGENT'])) {
325
+ $data['UserAgent'] = $_SERVER['HTTP_USER_AGENT'];
326
+ }
327
+ }
328
+ if (!isset($data['Username']) && !isset($data['CurrentUserID'])) {
329
+ if (function_exists('get_current_user_id')) {
330
+ $data['CurrentUserID'] = get_current_user_id();
331
+ }
332
+ }
333
+ if (!isset($data['CurrentUserRoles']) && function_exists('is_user_logged_in') && is_user_logged_in()) {
334
+ $currentUserRoles = $this->plugin->settings->GetCurrentUserRoles();
335
+ if (!empty($currentUserRoles)) {
336
+ $data['CurrentUserRoles'] = $currentUserRoles;
337
+ }
338
+ }
339
+ // Check if the user management plugin is loaded and adds the SessionID
340
+ if ( class_exists( 'WSAL_User_Management_Plugin' ) ) {
341
+ if ( function_exists( 'get_current_user_id' ) ) {
342
+ $session_tokens = get_user_meta( get_current_user_id(), 'session_tokens', true );
343
+ if ( ! empty( $session_tokens ) ) {
344
+ end( $session_tokens );
345
+ $data['SessionID'] = key( $session_tokens );
346
+ }
347
+ }
348
+ }
349
+ //if(isset($_SERVER['REMOTE_HOST']) && $_SERVER['REMOTE_HOST'] != $data['ClientIP'])
350
+ // $data['ClientHost'] = $_SERVER['REMOTE_HOST'];
351
+ //$data['OtherIPs'] = $_SERVER['REMOTE_HOST'];
352
+
353
+ foreach ($this->_loggers as $logger) {
354
+ $logger->Log($type, $data);
355
+ }
356
+ }
357
+
358
+ /**
359
+ * Return alert given alert type.
360
+ * @param integer $type Alert type.
361
+ * @param mixed $default Returned if alert is not found.
362
+ * @return WSAL_Alert
363
+ */
364
+ public function GetAlert($type, $default = null)
365
+ {
366
+ foreach ($this->_alerts as $alert) {
367
+ if ($alert->type == $type) {
368
+ return $alert;
369
+ }
370
+ }
371
+ return $default;
372
+ }
373
+
374
+ /**
375
+ * Returns all supported alerts.
376
+ * @return WSAL_Alert[]
377
+ */
378
+ public function GetAlerts()
379
+ {
380
+ return $this->_alerts;
381
+ }
382
+
383
+ /**
384
+ * Returns all supported alerts.
385
+ * @return array
386
+ */
387
+ public function GetCategorizedAlerts()
388
+ {
389
+ $result = array();
390
+ foreach ($this->_alerts as $alert) {
391
+ if (!isset($result[$alert->catg])) {
392
+ $result[$alert->catg] = array();
393
+ }
394
+ if (!isset($result[$alert->catg][$alert->subcatg])) {
395
+ $result[$alert->catg][$alert->subcatg] = array();
396
+ }
397
+ $result[$alert->catg][$alert->subcatg][] = $alert;
398
+ }
399
+ ksort($result);
400
+ return $result;
401
+ }
402
+
403
+ /**
404
+ * Returns whether user is enabled or not.
405
+ *
406
+ * @param string $user - Username.
407
+ * @return boolean True if disabled, false otherwise.
408
+ */
409
+ public function IsDisabledUser( $user ) {
410
+ return ( in_array( $user, $this->GetDisabledUsers() ) ) ? true : false;
411
+ }
412
+
413
+ /**
414
+ * @return Returns an array of disabled users.
415
+ */
416
+ public function GetDisabledUsers() {
417
+ return $this->plugin->settings->GetExcludedMonitoringUsers();
418
+ }
419
+
420
+ /**
421
+ * Returns whether user is enabled or not.
422
+ *
423
+ * @param array $roles - User roles.
424
+ * @return boolean True if disabled, false otherwise.
425
+ */
426
+ public function IsDisabledRole( $roles ) {
427
+ $is_disabled = false;
428
+ foreach ( $roles as $role ) {
429
+ if ( in_array( $role, $this->GetDisabledRoles() ) ) {
430
+ $is_disabled = true;
431
+ }
432
+ }
433
+ return $is_disabled;
434
+ }
435
+
436
+ /**
437
+ * Returns an array of disabled users.
438
+ *
439
+ * @return array
440
+ */
441
+ public function GetDisabledRoles() {
442
+ return $this->plugin->settings->GetExcludedMonitoringRoles();
443
+ }
444
+
445
+ /**
446
+ * Method: Check whether post type is disabled or not.
447
+ *
448
+ * @param string $post_type - Post type.
449
+ * @return bool - True if disabled, False if otherwise.
450
+ * @since 2.6.7
451
+ */
452
+ public function is_disabled_post_type( $post_type ) {
453
+ return ( in_array( $post_type, $this->get_disabled_post_types() ) ) ? true : false;
454
+ }
455
+
456
+ /**
457
+ * Method: Return array of disabled post types.
458
+ *
459
+ * @return array
460
+ * @since 2.6.7
461
+ */
462
+ public function get_disabled_post_types() {
463
+ return $this->plugin->settings->get_excluded_post_types();
464
+ }
465
+
466
+ private function IsDisabledIP() {
467
+ $is_disabled = false;
468
+ $ip = $this->plugin->settings->GetMainClientIP();
469
+ $excluded_ips = $this->plugin->settings->GetExcludedMonitoringIP();
470
+ if ( in_array( $ip, $excluded_ips ) ) {
471
+ $is_disabled = true;
472
+ }
473
+ return $is_disabled;
474
+ }
475
  }
classes/Sensors/Content.php CHANGED
@@ -77,1059 +77,1058 @@
77
  * 2088 User changed title of a custom post type
78
  * 2104 User opened a custom post type in the editor
79
  * 2105 User viewed a custom post type
80
- */
81
- class WSAL_Sensors_Content extends WSAL_AbstractSensor
82
- {
83
- /**
84
- * @var stdClass old post
85
- */
86
- protected $_OldPost = null;
87
 
88
- /**
89
- * @var string old permalink
90
- */
91
- protected $_OldLink = null;
92
 
93
- /**
94
- * @var array old categories
95
- */
96
- protected $_OldCats = null;
97
 
98
- /**
99
- * @var string old path to file
100
- */
101
- protected $_OldTmpl = null;
102
 
103
- /**
104
- * @var boolean old post is marked as sticky
105
- */
106
- protected $_OldStky = null;
107
 
108
- /**
109
- * Listening to events using WP hooks.
110
- */
111
- public function HookEvents()
112
- {
113
- if (current_user_can("edit_posts")) {
114
- add_action('admin_init', array($this, 'EventWordpressInit'));
115
- }
116
- add_action('transition_post_status', array($this, 'EventPostChanged'), 10, 3);
117
- add_action('delete_post', array($this, 'EventPostDeleted'), 10, 1);
118
- add_action('wp_trash_post', array($this, 'EventPostTrashed'), 10, 1);
119
- add_action('untrash_post', array($this, 'EventPostUntrashed'));
120
- add_action('edit_category', array($this, 'EventChangedCategoryParent'));
121
- add_action('save_post', array($this, 'SetRevisionLink'), 10, 3);
122
- add_action('publish_future_post', array($this, 'EventPublishFuture'), 10, 1);
123
- // to do change with 'create_term' instead 'create_category' for trigger Tags
124
- add_action('create_category', array($this, 'EventCategoryCreation'), 10, 1);
125
 
126
- add_action( 'wp_head', array( $this, 'ViewingPost' ), 10 );
127
- add_filter('post_edit_form_tag', array($this, 'EditingPost'), 10, 1);
128
- }
129
 
130
- /**
131
- * Gets the alert code based on the type of post.
132
- * @param stdClass $post the post
133
- * @param integer $typePost alert code type post
134
- * @param integer $typePage alert code type page
135
- * @param integer $typeCustom alert code type custom
136
- * @return integer alert code
137
- */
138
- protected function GetEventTypeForPostType($post, $typePost, $typePage, $typeCustom)
139
- {
140
- switch ($post->post_type) {
141
- case 'page':
142
- return $typePage;
143
- case 'post':
144
- return $typePost;
145
- default:
146
- return $typeCustom;
147
- }
148
- }
149
 
150
- /**
151
- * Triggered when a user accesses the admin area.
152
- */
153
- public function EventWordpressInit()
154
- {
155
- // load old data, if applicable
156
- $this->RetrieveOldData();
157
- // check for category changes
158
- $this->CheckCategoryDeletion();
159
- }
160
 
161
- /**
162
- * Retrieve Old data.
163
- * @global mixed $_POST post data
164
- */
165
- protected function RetrieveOldData()
166
- {
167
- if (isset($_POST) && isset($_POST['post_ID'])
168
- && !(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
169
- && !(isset($_POST['action']) && $_POST['action'] == 'autosave')
170
- ) {
171
- $postID = intval($_POST['post_ID']);
172
- $this->_OldPost = get_post($postID);
173
- $this->_OldLink = get_permalink($postID);
174
- $this->_OldTmpl = $this->GetPostTemplate($this->_OldPost);
175
- $this->_OldCats = $this->GetPostCategories($this->_OldPost);
176
- $this->_OldStky = in_array($postID, get_option('sticky_posts'));
177
- }
178
- }
179
 
180
- /**
181
- * Get the template path.
182
- * @param stdClass $post the post
183
- * @return string full path to file
184
- */
185
- protected function GetPostTemplate($post)
186
- {
187
- $id = $post->ID;
188
- $template = get_page_template_slug($id);
189
- $pagename = $post->post_name;
190
 
191
- $templates = array();
192
- if ($template && 0 === validate_file($template)) {
193
- $templates[] = $template;
194
- }
195
- if ($pagename) {
196
- $templates[] = "page-$pagename.php";
197
- }
198
- if ($id) {
199
- $templates[] = "page-$id.php";
200
- }
201
- $templates[] = 'page.php';
202
 
203
- return get_query_template('page', $templates);
204
- }
205
 
206
- /**
207
- * Get post categories (array of category names).
208
- * @param stdClass $post the post
209
- * @return array list of categories
210
- */
211
- protected function GetPostCategories($post)
212
- {
213
- return wp_get_post_categories($post->ID, array('fields' => 'names'));
214
- }
215
 
216
- /**
217
- * Check all the post changes.
218
- * @param string $newStatus new status
219
- * @param string $oldStatus old status
220
- * @param stdClass $post the post
221
- */
222
- public function EventPostChanged($newStatus, $oldStatus, $post)
223
- {
224
- // ignorable states
225
- if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
226
- return;
227
- }
228
- if (empty($post->post_type)) {
229
- return;
230
- }
231
- if ($post->post_type == 'revision') {
232
- return;
233
- }
234
 
235
- $original = isset($_POST['original_post_status']) ? $_POST['original_post_status'] : '';
236
 
237
- WSAL_Sensors_Request::SetVars(array(
238
- '$newStatus' => $newStatus,
239
- '$oldStatus' => $oldStatus,
240
- '$original' => $original,
241
- ));
242
- // run checks
243
- if ($this->_OldPost) {
244
- if ($this->CheckOtherSensors($this->_OldPost)) {
245
- return;
246
- }
247
- if ($oldStatus == 'auto-draft' || $original == 'auto-draft') {
248
- // Handle create post events
249
- $this->CheckPostCreation($this->_OldPost, $post);
250
- } else {
251
- // Handle update post events
252
- $changes = 0
253
- + $this->CheckAuthorChange($this->_OldPost, $post)
254
- + $this->CheckStatusChange($this->_OldPost, $post)
255
- + $this->CheckParentChange($this->_OldPost, $post)
256
- + $this->CheckStickyChange($this->_OldStky, isset($_REQUEST['sticky']), $post)
257
- + $this->CheckVisibilityChange($this->_OldPost, $post, $oldStatus, $newStatus)
258
- + $this->CheckTemplateChange($this->_OldTmpl, $this->GetPostTemplate($post), $post)
259
- + $this->CheckCategoriesChange($this->_OldCats, $this->GetPostCategories($post), $post)
260
- ;
261
 
262
- if (!$changes) {
263
- $changes = $this->CheckDateChange($this->_OldPost, $post);
264
- if (!$changes) {
265
- $changes = $this->CheckPermalinkChange($this->_OldLink, get_permalink($post->ID), $post);
266
- // Comments/Trackbacks and Pingbacks
267
- if (!$changes) {
268
- $changes = $this->CheckCommentsPings($this->_OldPost, $post);
269
- if (!$changes) {
270
- $changes = $this->CheckModificationChange($post->ID, $this->_OldPost, $post);
271
- }
272
- }
273
- }
274
- }
275
- }
276
- }
277
- }
278
 
279
- /**
280
- * Check post creation.
281
- * @global array $_POST
282
- * @param stdClass $oldPost old post
283
- * @param stdClass $newPost new post
284
- */
285
- protected function CheckPostCreation($oldPost, $newPost)
286
- {
287
- $WPActions = array('editpost', 'heartbeat');
288
- if (isset($_POST['action']) && in_array($_POST['action'], $WPActions)) {
289
- if (!in_array($newPost->post_type, array('attachment', 'revision', 'nav_menu_item'))) {
290
- $event = 0;
291
- $is_scheduled = false;
292
- switch ($newPost->post_status) {
293
- case 'publish':
294
- $event = $this->GetEventTypeForPostType($newPost, 2001, 2005, 2030);
295
- break;
296
- case 'draft':
297
- $event = $this->GetEventTypeForPostType($newPost, 2000, 2004, 2029);
298
- break;
299
- case 'future':
300
- $event = $this->GetEventTypeForPostType($newPost, 2074, 2075, 2076);
301
- $is_scheduled = true;
302
- break;
303
- case 'pending':
304
- $event = 2073;
305
- break;
306
- }
307
- if ($event) {
308
- $editorLink = $this->GetEditorLink($newPost);
309
- if ($is_scheduled) {
310
- $this->plugin->alerts->Trigger($event, array(
311
- 'PostType' => $newPost->post_type,
312
- 'PostTitle' => $newPost->post_title,
313
- 'PublishingDate' => $newPost->post_date,
314
- $editorLink['name'] => $editorLink['value']
315
- ));
316
- } else {
317
- $this->plugin->alerts->Trigger($event, array(
318
- 'PostID' => $newPost->ID,
319
- 'PostType' => $newPost->post_type,
320
- 'PostTitle' => $newPost->post_title,
321
- 'PostUrl' => get_permalink($newPost->ID),
322
- $editorLink['name'] => $editorLink['value']
323
- ));
324
- }
325
- }
326
- }
327
- }
328
- }
329
 
330
- /**
331
- * Post future publishing.
332
- * @param integer $post_id post ID
333
- */
334
- public function EventPublishFuture($post_id)
335
- {
336
- $post = get_post($post_id);
337
- $event = $this->GetEventTypeForPostType($post, 2001, 2005, 2030);
338
 
339
- if ($event) {
340
- $editorLink = $this->GetEditorLink($newPost);
341
- $this->plugin->alerts->Trigger($event, array(
342
- 'PostID' => $post->ID,
343
- 'PostType' => $post->post_type,
344
- 'PostTitle' => $post->post_title,
345
- 'PostUrl' => get_permalink($post->ID),
346
- $editorLink['name'] => $editorLink['value']
347
- ));
348
- }
349
- }
350
 
351
- /**
352
- * Post permanently deleted.
353
- * @param integer $post_id post ID
354
- */
355
- public function EventPostDeleted($post_id)
356
- {
357
- $post = get_post($post_id);
358
- if ($this->CheckOtherSensors($post)) {
359
- return;
360
- }
361
- $WPActions = array('delete');
362
- if (isset($_REQUEST['action']) && in_array($_REQUEST['action'], $WPActions)) {
363
- if (!in_array($post->post_type, array('attachment', 'revision', 'nav_menu_item'))) { // ignore attachments, revisions and menu items
364
- $event = $this->GetEventTypeForPostType($post, 2008, 2009, 2033);
365
- // check WordPress backend operations
366
- if ($this->CheckAutoDraft($event, $post->post_title)) {
367
- return;
368
- }
369
- $editorLink = $this->GetEditorLink($post);
370
- $this->plugin->alerts->Trigger($event, array(
371
- 'PostID' => $post->ID,
372
- 'PostType' => $post->post_type,
373
- 'PostTitle' => $post->post_title,
374
- ));
375
- }
376
- }
377
- }
378
 
379
- /**
380
- * Post moved to the trash.
381
- * @param integer $post_id post ID
382
- */
383
- public function EventPostTrashed($post_id)
384
- {
385
- $post = get_post($post_id);
386
- if ($this->CheckOtherSensors($post)) {
387
- return;
388
- }
389
- $event = $this->GetEventTypeForPostType($post, 2012, 2013, 2034);
390
- $editorLink = $this->GetEditorLink($post);
391
- $this->plugin->alerts->Trigger($event, array(
392
- 'PostID' => $post->ID,
393
- 'PostType' => $post->post_type,
394
- 'PostTitle' => $post->post_title,
395
- 'PostUrl' => get_permalink($post->ID),
396
- $editorLink['name'] => $editorLink['value']
397
- ));
398
- }
399
 
400
- /**
401
- * Post restored from trash.
402
- * @param integer $post_id post ID
403
- */
404
- public function EventPostUntrashed($post_id)
405
- {
406
- $post = get_post($post_id);
407
- if ($this->CheckOtherSensors($post)) {
408
- return;
409
- }
410
- $event = $this->GetEventTypeForPostType($post, 2014, 2015, 2035);
411
- $editorLink = $this->GetEditorLink($post);
412
- $this->plugin->alerts->Trigger($event, array(
413
- 'PostID' => $post->ID,
414
- 'PostType' => $post->post_type,
415
- 'PostTitle' => $post->post_title,
416
- $editorLink['name'] => $editorLink['value']
417
- ));
418
- }
419
 
420
- /**
421
- * Post date changed.
422
- * @param stdClass $oldPost old post
423
- * @param stdClass $newPost new post
424
- */
425
- protected function CheckDateChange($oldpost, $newpost)
426
- {
427
- $from = strtotime($oldpost->post_date);
428
- $to = strtotime($newpost->post_date);
429
- if ($oldpost->post_status == 'draft') {
430
- return 0;
431
- }
432
- $pending = $this->CheckReviewPendingChange($oldpost, $newpost);
433
- if ($pending) {
434
- return 0;
435
- }
436
- if ($from != $to) {
437
- $event = $this->GetEventTypeForPostType($oldpost, 2027, 2028, 2041);
438
- $editorLink = $this->GetEditorLink($oldpost);
439
- $this->plugin->alerts->Trigger($event, array(
440
- 'PostID' => $oldpost->ID,
441
- 'PostType' => $oldpost->post_type,
442
- 'PostTitle' => $oldpost->post_title,
443
- 'OldDate' => $oldpost->post_date,
444
- 'NewDate' => $newpost->post_date,
445
- $editorLink['name'] => $editorLink['value']
446
- ));
447
- return 1;
448
- }
449
- return 0;
450
- }
451
 
452
- /**
453
- * Revision used.
454
- * @param stdClass $oldPost old post
455
- * @param stdClass $newPost new post
456
- */
457
- protected function CheckReviewPendingChange($oldpost, $newpost)
458
- {
459
- if ($oldpost->post_status == 'pending') {
460
- $editorLink = $this->GetEditorLink($oldpost);
461
- $this->plugin->alerts->Trigger(2072, array(
462
- 'PostID' => $oldpost->ID,
463
- 'PostType' => $oldpost->post_type,
464
- 'PostTitle' => $oldpost->post_title,
465
- $editorLink['name'] => $editorLink['value']
466
- ));
467
- return 1;
468
- }
469
- return 0;
470
- }
471
 
472
- /**
473
- * Categories changed.
474
- * @param array $oldCats old categories
475
- * @param array $newCats new categories
476
- * @param stdClass $post the post
477
- */
478
- protected function CheckCategoriesChange($oldCats, $newCats, $post)
479
- {
480
- $oldCats = implode(', ', $oldCats);
481
- $newCats = implode(', ', $newCats);
482
- if ($oldCats != $newCats) {
483
- $event = $this->GetEventTypeForPostType($post, 2016, 0, 2036);
484
- if ($event) {
485
- $editorLink = $this->GetEditorLink($post);
486
- $this->plugin->alerts->Trigger($event, array(
487
- 'PostID' => $post->ID,
488
- 'PostType' => $post->post_type,
489
- 'PostTitle' => $post->post_title,
490
- 'OldCategories' => $oldCats ? $oldCats : 'no categories',
491
- 'NewCategories' => $newCats ? $newCats : 'no categories',
492
- $editorLink['name'] => $editorLink['value']
493
- ));
494
- return 1;
495
- }
496
- }
497
- }
498
 
499
- /**
500
- * Author changed.
501
- * @param stdClass $oldPost old post
502
- * @param stdClass $newPost new post
503
- */
504
- protected function CheckAuthorChange($oldpost, $newpost)
505
- {
506
- if ($oldpost->post_author != $newpost->post_author) {
507
- $event = $this->GetEventTypeForPostType($oldpost, 2019, 2020, 2038);
508
- $editorLink = $this->GetEditorLink($oldpost);
509
- $oldAuthor = get_userdata($oldpost->post_author);
510
- $oldAuthor = (is_object($oldAuthor)) ? $oldAuthor->user_login : 'N/A';
511
- $newAuthor = get_userdata($newpost->post_author);
512
- $newAuthor = (is_object($newAuthor)) ? $newAuthor->user_login : 'N/A';
513
- $this->plugin->alerts->Trigger($event, array(
514
- 'PostID' => $oldpost->ID,
515
- 'PostType' => $oldpost->post_type,
516
- 'PostTitle' => $oldpost->post_title,
517
- 'OldAuthor' => $oldAuthor,
518
- 'NewAuthor' => $newAuthor,
519
- $editorLink['name'] => $editorLink['value']
520
- ));
521
- return 1;
522
- }
523
- }
524
 
525
- /**
526
- * Status changed.
527
- * @param stdClass $oldPost old post
528
- * @param stdClass $newPost new post
529
- */
530
- protected function CheckStatusChange($oldpost, $newpost)
531
- {
532
- if ($oldpost->post_status != $newpost->post_status) {
533
- if (isset($_REQUEST['publish'])) {
534
- // special case (publishing a post)
535
- $event = $this->GetEventTypeForPostType($oldpost, 2001, 2005, 2030);
536
- $editorLink = $this->GetEditorLink($newpost);
537
- $this->plugin->alerts->Trigger($event, array(
538
- 'PostID' => $newpost->ID,
539
- 'PostType' => $newpost->post_type,
540
- 'PostTitle' => $newpost->post_title,
541
- 'PostUrl' => get_permalink($newpost->ID),
542
- $editorLink['name'] => $editorLink['value']
543
- ));
544
- } else {
545
- $event = $this->GetEventTypeForPostType($oldpost, 2021, 2022, 2039);
546
- $editorLink = $this->GetEditorLink($oldpost);
547
- $this->plugin->alerts->Trigger($event, array(
548
- 'PostID' => $oldpost->ID,
549
- 'PostType' => $oldpost->post_type,
550
- 'PostTitle' => $oldpost->post_title,
551
- 'OldStatus' => $oldpost->post_status,
552
- 'NewStatus' => $newpost->post_status,
553
- $editorLink['name'] => $editorLink['value']
554
- ));
555
- }
556
- return 1;
557
- }
558
- }
559
 
560
- /**
561
- * Post parent changed.
562
- * @param stdClass $oldPost old post
563
- * @param stdClass $newPost new post
564
- */
565
- protected function CheckParentChange($oldpost, $newpost)
566
- {
567
- if ($oldpost->post_parent != $newpost->post_parent) {
568
- $event = $this->GetEventTypeForPostType($oldpost, 0, 2047, 0);
569
- if ($event) {
570
- $editorLink = $this->GetEditorLink($oldpost);
571
- $this->plugin->alerts->Trigger($event, array(
572
- 'PostID' => $oldpost->ID,
573
- 'PostType' => $oldpost->post_type,
574
- 'PostTitle' => $oldpost->post_title,
575
- 'OldParent' => $oldpost->post_parent,
576
- 'NewParent' => $newpost->post_parent,
577
- 'OldParentName' => $oldpost->post_parent ? get_the_title($oldpost->post_parent) : 'no parent',
578
- 'NewParentName' => $newpost->post_parent ? get_the_title($newpost->post_parent) : 'no parent',
579
- $editorLink['name'] => $editorLink['value']
580
- ));
581
- return 1;
582
- }
583
- }
584
- }
585
 
586
- /**
587
- * Permalink changed.
588
- * @param string $oldLink old permalink
589
- * @param string $newLink new permalink
590
- * @param stdClass $post the post
591
- */
592
- protected function CheckPermalinkChange($oldLink, $newLink, $post)
593
- {
594
- if ($oldLink != $newLink) {
595
- $event = $this->GetEventTypeForPostType($post, 2017, 2018, 2037);
596
- $editorLink = $this->GetEditorLink($post);
597
- $this->plugin->alerts->Trigger($event, array(
598
- 'PostID' => $post->ID,
599
- 'PostType' => $post->post_type,
600
- 'PostTitle' => $post->post_title,
601
- 'OldUrl' => $oldLink,
602
- 'NewUrl' => $newLink,
603
- $editorLink['name'] => $editorLink['value']
604
- ));
605
- return 1;
606
- }
607
- return 0;
608
- }
609
 
610
- /**
611
- * Post visibility changed.
612
- * @param stdClass $oldPost old post
613
- * @param stdClass $newPost new post
614
- * @param string $oldStatus old status
615
- * @param string $newStatus new status
616
- */
617
- protected function CheckVisibilityChange($oldpost, $newpost, $oldStatus, $newStatus)
618
- {
619
- if ($oldStatus == 'draft' || $newStatus == 'draft') {
620
- return;
621
- }
622
 
623
- $oldVisibility = '';
624
- $newVisibility = '';
625
 
626
- if ($oldpost->post_password) {
627
- $oldVisibility = __('Password Protected', 'wp-security-audit-log');
628
- } elseif ($oldStatus == 'publish') {
629
- $oldVisibility = __('Public', 'wp-security-audit-log');
630
- } elseif ($oldStatus == 'private') {
631
- $oldVisibility = __('Private', 'wp-security-audit-log');
632
- }
633
 
634
- if ($newpost->post_password) {
635
- $newVisibility = __('Password Protected', 'wp-security-audit-log');
636
- } elseif ($newStatus == 'publish') {
637
- $newVisibility = __('Public', 'wp-security-audit-log');
638
- } elseif ($newStatus == 'private') {
639
- $newVisibility = __('Private', 'wp-security-audit-log');
640
- }
641
 
642
- if ($oldVisibility && $newVisibility && ($oldVisibility != $newVisibility)) {
643
- $event = $this->GetEventTypeForPostType($oldpost, 2025, 2026, 2040);
644
- $editorLink = $this->GetEditorLink($oldpost);
645
- $this->plugin->alerts->Trigger($event, array(
646
- 'PostID' => $oldpost->ID,
647
- 'PostType' => $oldpost->post_type,
648
- 'PostTitle' => $oldpost->post_title,
649
- 'OldVisibility' => $oldVisibility,
650
- 'NewVisibility' => $newVisibility,
651
- $editorLink['name'] => $editorLink['value']
652
- ));
653
- return 1;
654
- }
655
- }
656
 
657
- /**
658
- * Post template changed.
659
- * @param string $oldTmpl old template path
660
- * @param string $newTmpl new template path
661
- * @param stdClass $post the post
662
- */
663
- protected function CheckTemplateChange($oldTmpl, $newTmpl, $post)
664
- {
665
- if ($oldTmpl != $newTmpl) {
666
- $event = $this->GetEventTypeForPostType($post, 0, 2048, 0);
667
- if ($event) {
668
- $editorLink = $this->GetEditorLink($post);
669
- $this->plugin->alerts->Trigger($event, array(
670
- 'PostID' => $post->ID,
671
- 'PostType' => $post->post_type,
672
- 'PostTitle' => $post->post_title,
673
- 'OldTemplate' => ucwords(str_replace(array('-' , '_'), ' ', basename($oldTmpl, '.php'))),
674
- 'NewTemplate' => ucwords(str_replace(array('-' , '_'), ' ', basename($newTmpl, '.php'))),
675
- 'OldTemplatePath' => $oldTmpl,
676
- 'NewTemplatePath' => $newTmpl,
677
- $editorLink['name'] => $editorLink['value']
678
- ));
679
- return 1;
680
- }
681
- }
682
- }
683
 
684
- /**
685
- * Post sets as sticky changes.
686
- * @param string $oldTmpl old template path
687
- * @param string $newTmpl new template path
688
- * @param stdClass $post the post
689
- */
690
- protected function CheckStickyChange($oldStky, $newStky, $post)
691
- {
692
- if ($oldStky != $newStky) {
693
- $event = $newStky ? 2049 : 2050;
694
- $editorLink = $this->GetEditorLink($post);
695
- $this->plugin->alerts->Trigger($event, array(
696
- 'PostID' => $post->ID,
697
- 'PostType' => $post->post_type,
698
- 'PostTitle' => $post->post_title,
699
- 'PostUrl' => get_permalink($post->ID),
700
- $editorLink['name'] => $editorLink['value']
701
- ));
702
- return 1;
703
- }
704
- }
705
 
706
- /**
707
- * Post modified content.
708
- * @param integer $post_ID post ID
709
- * @param stdClass $oldPost old post
710
- * @param stdClass $newPost new post
711
- */
712
- public function CheckModificationChange($post_ID, $oldpost, $newpost)
713
- {
714
- if ($this->CheckOtherSensors($oldpost)) {
715
- return;
716
- }
717
- $changes = $this->CheckTitleChange($oldpost, $newpost);
718
- if (!$changes) {
719
- $contentChanged = $oldpost->post_content != $newpost->post_content; // TODO what about excerpts?
720
 
721
- if ($oldpost->post_modified != $newpost->post_modified) {
722
- $event = 0;
723
- // @see http://codex.wordpress.org/Class_Reference/WP_Query#Status_Parameters
724
- switch ($oldpost->post_status) { // TODO or should this be $newpost?
725
- case 'draft':
726
- if ($contentChanged) {
727
- $event = $this->GetEventTypeForPostType($newpost, 2068, 2069, 2070);
728
- } else {
729
- $event = $this->GetEventTypeForPostType($newpost, 2003, 2007, 2032);
730
- }
731
- break;
732
- case 'publish':
733
- if ($contentChanged) {
734
- $event = $this->GetEventTypeForPostType($newpost, 2065, 2066, 2067);
735
- } else {
736
- $event = $this->GetEventTypeForPostType($newpost, 2002, 2006, 2031);
737
- }
738
- break;
739
- }
740
- if ($event) {
741
- $editorLink = $this->GetEditorLink($oldpost);
742
- $this->plugin->alerts->Trigger($event, array(
743
- 'PostID' => $post_ID,
744
- 'PostType' => $oldpost->post_type,
745
- 'PostTitle' => $oldpost->post_title,
746
- 'PostUrl' => get_permalink($post_ID),
747
- $editorLink['name'] => $editorLink['value']
748
- ));
749
- return 1;
750
- }
751
- }
752
- }
753
- }
754
 
755
- /**
756
- * New category created.
757
- * @param integer $category_id category ID
758
- */
759
- public function EventCategoryCreation($category_id)
760
- {
761
- $category = get_category($category_id);
762
- $category_link = $this->getCategoryLink($category_id);
763
- $this->plugin->alerts->Trigger(2023, array(
764
- 'CategoryName' => $category->name,
765
- 'Slug' => $category->slug,
766
- 'CategoryLink' => $category_link
767
- ));
768
- }
769
 
770
- /**
771
- * Category deleted.
772
- * @global array $_POST post data
773
- */
774
- protected function CheckCategoryDeletion()
775
- {
776
- if (empty($_POST)) {
777
- return;
778
- }
779
- $action = !empty($_POST['action']) ? $_POST['action']
780
- : (!empty($_POST['action2']) ? $_POST['action2'] : '');
781
- if (!$action) {
782
- return;
783
- }
784
 
785
- $categoryIds = array();
786
 
787
- if (isset($_POST['taxonomy'])) {
788
- if ($action == 'delete' && $_POST['taxonomy'] == 'category' && !empty($_POST['delete_tags'])) {
789
- // bulk delete
790
- $categoryIds[] = $_POST['delete_tags'];
791
- } elseif ($action == 'delete-tag' && $_POST['taxonomy'] == 'category' && !empty($_POST['tag_ID'])) {
792
- // single delete
793
- $categoryIds[] = $_POST['tag_ID'];
794
- }
795
- }
796
 
797
- foreach ($categoryIds as $categoryID) {
798
- $category = get_category($categoryID);
799
- $this->plugin->alerts->Trigger(2024, array(
800
- 'CategoryID' => $categoryID,
801
- 'CategoryName' => $category->cat_name,
802
- 'Slug' => $category->slug
803
- ));
804
- }
805
- }
806
 
807
- /**
808
- * Changed the parent of the category.
809
- * @global array $_POST post data
810
- */
811
- public function EventChangedCategoryParent()
812
- {
813
- if (empty($_POST)) {
814
- return;
815
- }
816
- if (!current_user_can("manage_categories")) {
817
- return;
818
- }
819
- if (isset($_POST['name']) && isset($_POST['tag_ID'])) {
820
- $category = get_category($_POST['tag_ID']);
821
- $category_link = $this->getCategoryLink($_POST['tag_ID']);
822
- if ($category->parent != 0) {
823
- $oldParent = get_category($category->parent);
824
- $oldParentName = (empty($oldParent))? 'no parent' : $oldParent->name;
825
- } else {
826
- $oldParentName = 'no parent';
827
- }
828
- if (isset($_POST['parent'])) {
829
- $newParent = get_category($_POST['parent']);
830
- $newParentName = (empty($newParent))? 'no parent' : $newParent->name;
831
- }
832
- $this->plugin->alerts->Trigger(2052, array(
833
- 'CategoryName' => $category->name,
834
- 'OldParent' => $oldParentName,
835
- 'NewParent' => $newParentName,
836
- 'CategoryLink' => $category_link
837
- ));
838
- }
839
- }
840
 
841
- /**
842
- * Check auto draft and the setting: Hide Plugin in Plugins Page
843
- * @param integer $code alert code
844
- * @param string $title title
845
- * @return boolean
846
- */
847
- private function CheckAutoDraft($code, $title)
848
- {
849
- if ($code == 2008 && $title == "auto-draft") {
850
- // to do check setting else return false
851
- if ($this->plugin->settings->IsWPBackend() == 1) {
852
- return true;
853
- } else {
854
- return false;
855
- }
856
- } else {
857
- return false;
858
- }
859
- }
860
 
861
- /**
862
- * Builds revision link.
863
- * @param integer $revision_id revision ID
864
- * @return string|null link
865
- */
866
- private function getRevisionLink($revision_id)
867
- {
868
- if (!empty($revision_id)) {
869
- return admin_url('revision.php?revision='.$revision_id);
870
- } else {
871
- return null;
872
- }
873
- }
874
 
875
- /**
876
- * Builds category link.
877
- * @param integer $category_id category ID
878
- * @return string|null link
879
- */
880
- private function getCategoryLink($category_id)
881
- {
882
- if (!empty($category_id)) {
883
- return admin_url('term.php?taxnomy=category&tag_ID='.$category_id);
884
- } else {
885
- return null;
886
- }
887
- }
888
 
889
- /**
890
- * Ignore post from BBPress, WooCommerce Plugin
891
- * Triggered on the Sensors
892
- *
893
- * @param stdClass $post the post.
894
- */
895
- private function CheckOtherSensors( $post ) {
896
- if ( empty( $post ) ) {
897
- return false;
898
- }
899
- switch ( $post->post_type ) {
900
- case 'forum':
901
- case 'topic':
902
- case 'reply':
903
- case 'product':
904
- return true;
905
- default:
906
- return false;
907
- }
908
- }
909
 
910
- /**
911
- * Triggered after save post for add revision link.
912
- * @param integer $post_id post ID
913
- * @param stdClass $post post
914
- */
915
- public function SetRevisionLink($post_id, $post, $update)
916
- {
917
- $revisions = wp_get_post_revisions($post_id);
918
- if (!empty($revisions)) {
919
- $revision = array_shift($revisions);
920
 
921
- $objOcc = new WSAL_Models_Occurrence();
922
- $occ = $objOcc->GetByPostID($post_id);
923
- $occ = count($occ) ? $occ[0] : null;
924
- if (!empty($occ)) {
925
- $revisionLink = $this->getRevisionLink($revision->ID);
926
- if (!empty($revisionLink)) {
927
- $occ->SetMetaValue('RevisionLink', $revisionLink);
928
- }
929
- }
930
- }
931
- }
932
 
933
- /**
934
- * Alerts for Viewing of Posts, Pages and Custom Posts.
935
- */
936
- public function ViewingPost() {
937
- // Retrieve the current post object.
938
- $post = get_queried_object();
939
- if ( is_user_logged_in() ) {
940
- if ( ! is_admin() ) {
941
- if ( $this->CheckOtherSensors( $post ) ) {
942
- return $post->post_title;
943
- }
944
 
945
- $currentPath = $_SERVER['REQUEST_URI'];
946
- if ( ! empty( $_SERVER['HTTP_REFERER'] )
947
- && strpos( $_SERVER['HTTP_REFERER'], $currentPath ) !== false ) {
948
- // Ignore this if we were on the same page so we avoid double audit entries.
949
- return;
950
- }
951
- if ( ! empty( $post->post_title ) ) {
952
- $event = $this->GetEventTypeForPostType( $post, 2101, 2103, 2105 );
953
- $this->plugin->alerts->Trigger( $event, array(
954
- 'PostType' => $post->post_type,
955
- 'PostTitle' => $post->post_title,
956
- 'PostUrl' => get_permalink( $post->ID ),
957
- ) );
958
- }
959
- }
960
- }
961
- }
962
 
963
- /**
964
- * Alerts for Editing of Posts, Pages and Custom Posts.
965
- * @param stdClass $post post
966
- */
967
- public function EditingPost($post)
968
- {
969
- if (is_user_logged_in()) {
970
- if (is_admin()) {
971
- if ($this->CheckOtherSensors($post)) {
972
- return $post;
973
- }
974
- $currentPath = $_SERVER["SCRIPT_NAME"] . "?post=" . $post->ID;
975
- if (!empty($_SERVER["HTTP_REFERER"])
976
- && strpos($_SERVER["HTTP_REFERER"], $currentPath) !== false) {
977
- //Ignore this if we were on the same page so we avoid double audit entries
978
- return $post;
979
- }
980
- if (!empty($post->post_title)) {
981
- $event = $this->GetEventTypeForPostType($post, 2100, 2102, 2104);
982
- if (!$this->WasTriggered($event)) {
983
- $editorLink = $this->GetEditorLink($post);
984
- $this->plugin->alerts->Trigger($event, array(
985
- 'PostType' => $post->post_type,
986
- 'PostTitle' => $post->post_title,
987
- $editorLink['name'] => $editorLink['value']
988
- ));
989
- }
990
- }
991
- }
992
- }
993
- return $post;
994
- }
995
 
996
- /**
997
- * Check if the alert was triggered.
998
- * @param integer $alert_id alert code
999
- * @return boolean
1000
- */
1001
- private function WasTriggered($alert_id)
1002
- {
1003
- $query = new WSAL_Models_OccurrenceQuery();
1004
- $query->addOrderBy("created_on", true);
1005
- $query->setLimit(1);
1006
- $lastOccurence = $query->getAdapter()->Execute($query);
1007
- if (!empty($lastOccurence)) {
1008
- if ($lastOccurence[0]->alert_id == $alert_id) {
1009
- return true;
1010
- }
1011
- }
1012
- return false;
1013
- }
1014
 
1015
- /**
1016
- * Changed title of a post.
1017
- * @param stdClass $oldPost old post
1018
- * @param stdClass $newPost new post
1019
- */
1020
- private function CheckTitleChange($oldpost, $newpost)
1021
- {
1022
- if ($oldpost->post_title != $newpost->post_title) {
1023
- $event = $this->GetEventTypeForPostType($newpost, 2086, 2087, 2088);
1024
- $editorLink = $this->GetEditorLink($oldpost);
1025
- $this->plugin->alerts->Trigger($event, array(
1026
- 'OldTitle' => $oldpost->post_title,
1027
- 'NewTitle' => $newpost->post_title,
1028
- $editorLink['name'] => $editorLink['value']
1029
- ));
1030
- return 1;
1031
- }
1032
- return 0;
1033
- }
1034
 
1035
- /**
1036
- * Comments/Trackbacks and Pingbacks check.
1037
- * @param stdClass $oldPost old post
1038
- * @param stdClass $newPost new post
1039
- */
1040
- private function CheckCommentsPings($oldpost, $newpost)
1041
- {
1042
- $result = 0;
1043
- // Comments
1044
- if ($oldpost->comment_status != $newpost->comment_status) {
1045
- $type = 'Comments';
1046
 
1047
- if ($newpost->comment_status == 'open') {
1048
- $event = $this->GetCommentsPingsEvent($newpost, 'enable');
1049
- } else {
1050
- $event = $this->GetCommentsPingsEvent($newpost, 'disable');
1051
- }
1052
 
1053
- $this->plugin->alerts->Trigger($event, array(
1054
- 'Type' => $type,
1055
- 'PostTitle' => $newpost->post_title,
1056
- 'PostUrl' => get_permalink($newpost->ID)
1057
- ));
1058
- $result = 1;
1059
- }
1060
- // Trackbacks and Pingbacks
1061
- if ($oldpost->ping_status != $newpost->ping_status) {
1062
- $type = 'Trackbacks and Pingbacks';
1063
 
1064
- if ($newpost->ping_status == 'open') {
1065
- $event = $this->GetCommentsPingsEvent($newpost, 'enable');
1066
- } else {
1067
- $event = $this->GetCommentsPingsEvent($newpost, 'disable');
1068
- }
1069
 
1070
- $this->plugin->alerts->Trigger($event, array(
1071
- 'Type' => $type,
1072
- 'PostTitle' => $newpost->post_title,
1073
- 'PostUrl' => get_permalink($newpost->ID)
1074
- ));
1075
- $result = 1;
1076
- }
1077
- return $result;
1078
- }
1079
 
1080
- /**
1081
- * Comments/Trackbacks and Pingbacks event code.
1082
- * @param stdClass $post the post
1083
- * @param string $status the status
1084
- */
1085
- private function GetCommentsPingsEvent($post, $status)
1086
- {
1087
- if ($post->post_type == 'post') {
1088
- if ($post->post_status == 'publish') {
1089
- if ($status == 'disable') {
1090
- $event = 2111;
1091
- } else {
1092
- $event = 2112;
1093
- }
1094
- } else {
1095
- if ($status == 'disable') {
1096
- $event = 2113;
1097
- } else {
1098
- $event = 2114;
1099
- }
1100
- }
1101
- } else {
1102
- if ($post->post_status == 'publish') {
1103
- if ($status == 'disable') {
1104
- $event = 2115;
1105
- } else {
1106
- $event = 2116;
1107
- }
1108
- } else {
1109
- if ($status == 'disable') {
1110
- $event = 2117;
1111
- } else {
1112
- $event = 2118;
1113
- }
1114
- }
1115
- }
1116
- return $event;
1117
- }
1118
 
1119
- /**
1120
- * Get editor link.
1121
- * @param stdClass $post the post
1122
- * @return array $aLink name and value link
1123
- */
1124
- private function GetEditorLink($post)
1125
- {
1126
- $name = 'EditorLink';
1127
- $name .= ($post->post_type == 'page') ? 'Page' : 'Post' ;
1128
- $value = get_edit_post_link($post->ID);
1129
- $aLink = array(
1130
- 'name' => $name,
1131
- 'value' => $value,
1132
- );
1133
- return $aLink;
1134
- }
1135
  }
77
  * 2088 User changed title of a custom post type
78
  * 2104 User opened a custom post type in the editor
79
  * 2105 User viewed a custom post type
80
+ */
81
+ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
82
+ /**
83
+ * @var stdClass old post
84
+ */
85
+ protected $_OldPost = null;
 
86
 
87
+ /**
88
+ * @var string old permalink
89
+ */
90
+ protected $_OldLink = null;
91
 
92
+ /**
93
+ * @var array old categories
94
+ */
95
+ protected $_OldCats = null;
96
 
97
+ /**
98
+ * @var string old path to file
99
+ */
100
+ protected $_OldTmpl = null;
101
 
102
+ /**
103
+ * @var boolean old post is marked as sticky
104
+ */
105
+ protected $_OldStky = null;
106
 
107
+ /**
108
+ * Listening to events using WP hooks.
109
+ */
110
+ public function HookEvents()
111
+ {
112
+ if (current_user_can("edit_posts")) {
113
+ add_action('admin_init', array($this, 'EventWordpressInit'));
114
+ }
115
+ add_action('transition_post_status', array($this, 'EventPostChanged'), 10, 3);
116
+ add_action('delete_post', array($this, 'EventPostDeleted'), 10, 1);
117
+ add_action('wp_trash_post', array($this, 'EventPostTrashed'), 10, 1);
118
+ add_action('untrash_post', array($this, 'EventPostUntrashed'));
119
+ add_action('edit_category', array($this, 'EventChangedCategoryParent'));
120
+ add_action('save_post', array($this, 'SetRevisionLink'), 10, 3);
121
+ add_action('publish_future_post', array($this, 'EventPublishFuture'), 10, 1);
122
+ // to do change with 'create_term' instead 'create_category' for trigger Tags
123
+ add_action('create_category', array($this, 'EventCategoryCreation'), 10, 1);
124
 
125
+ add_action( 'wp_head', array( $this, 'ViewingPost' ), 10 );
126
+ add_filter('post_edit_form_tag', array($this, 'EditingPost'), 10, 1);
127
+ }
128
 
129
+ /**
130
+ * Gets the alert code based on the type of post.
131
+ * @param stdClass $post the post
132
+ * @param integer $typePost alert code type post
133
+ * @param integer $typePage alert code type page
134
+ * @param integer $typeCustom alert code type custom
135
+ * @return integer alert code
136
+ */
137
+ protected function GetEventTypeForPostType($post, $typePost, $typePage, $typeCustom)
138
+ {
139
+ switch ($post->post_type) {
140
+ case 'page':
141
+ return $typePage;
142
+ case 'post':
143
+ return $typePost;
144
+ default:
145
+ return $typeCustom;
146
+ }
147
+ }
148
 
149
+ /**
150
+ * Triggered when a user accesses the admin area.
151
+ */
152
+ public function EventWordpressInit()
153
+ {
154
+ // load old data, if applicable
155
+ $this->RetrieveOldData();
156
+ // check for category changes
157
+ $this->CheckCategoryDeletion();
158
+ }
159
 
160
+ /**
161
+ * Retrieve Old data.
162
+ * @global mixed $_POST post data
163
+ */
164
+ protected function RetrieveOldData()
165
+ {
166
+ if (isset($_POST) && isset($_POST['post_ID'])
167
+ && !(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
168
+ && !(isset($_POST['action']) && $_POST['action'] == 'autosave')
169
+ ) {
170
+ $postID = intval($_POST['post_ID']);
171
+ $this->_OldPost = get_post($postID);
172
+ $this->_OldLink = get_permalink($postID);
173
+ $this->_OldTmpl = $this->GetPostTemplate($this->_OldPost);
174
+ $this->_OldCats = $this->GetPostCategories($this->_OldPost);
175
+ $this->_OldStky = in_array($postID, get_option('sticky_posts'));
176
+ }
177
+ }
178
 
179
+ /**
180
+ * Get the template path.
181
+ * @param stdClass $post the post
182
+ * @return string full path to file
183
+ */
184
+ protected function GetPostTemplate($post)
185
+ {
186
+ $id = $post->ID;
187
+ $template = get_page_template_slug($id);
188
+ $pagename = $post->post_name;
189
 
190
+ $templates = array();
191
+ if ($template && 0 === validate_file($template)) {
192
+ $templates[] = $template;
193
+ }
194
+ if ($pagename) {
195
+ $templates[] = "page-$pagename.php";
196
+ }
197
+ if ($id) {
198
+ $templates[] = "page-$id.php";
199
+ }
200
+ $templates[] = 'page.php';
201
 
202
+ return get_query_template('page', $templates);
203
+ }
204
 
205
+ /**
206
+ * Get post categories (array of category names).
207
+ * @param stdClass $post the post
208
+ * @return array list of categories
209
+ */
210
+ protected function GetPostCategories($post)
211
+ {
212
+ return wp_get_post_categories($post->ID, array('fields' => 'names'));
213
+ }
214
 
215
+ /**
216
+ * Check all the post changes.
217
+ * @param string $newStatus new status
218
+ * @param string $oldStatus old status
219
+ * @param stdClass $post the post
220
+ */
221
+ public function EventPostChanged($newStatus, $oldStatus, $post)
222
+ {
223
+ // ignorable states
224
+ if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
225
+ return;
226
+ }
227
+ if (empty($post->post_type)) {
228
+ return;
229
+ }
230
+ if ($post->post_type == 'revision') {
231
+ return;
232
+ }
233
 
234
+ $original = isset($_POST['original_post_status']) ? $_POST['original_post_status'] : '';
235
 
236
+ WSAL_Sensors_Request::SetVars(array(
237
+ '$newStatus' => $newStatus,
238
+ '$oldStatus' => $oldStatus,
239
+ '$original' => $original,
240
+ ));
241
+ // run checks
242
+ if ($this->_OldPost) {
243
+ if ($this->CheckOtherSensors($this->_OldPost)) {
244
+ return;
245
+ }
246
+ if ($oldStatus == 'auto-draft' || $original == 'auto-draft') {
247
+ // Handle create post events
248
+ $this->CheckPostCreation($this->_OldPost, $post);
249
+ } else {
250
+ // Handle update post events
251
+ $changes = 0
252
+ + $this->CheckAuthorChange($this->_OldPost, $post)
253
+ + $this->CheckStatusChange($this->_OldPost, $post)
254
+ + $this->CheckParentChange($this->_OldPost, $post)
255
+ + $this->CheckStickyChange($this->_OldStky, isset($_REQUEST['sticky']), $post)
256
+ + $this->CheckVisibilityChange($this->_OldPost, $post, $oldStatus, $newStatus)
257
+ + $this->CheckTemplateChange($this->_OldTmpl, $this->GetPostTemplate($post), $post)
258
+ + $this->CheckCategoriesChange($this->_OldCats, $this->GetPostCategories($post), $post)
259
+ ;
260
 
261
+ if (!$changes) {
262
+ $changes = $this->CheckDateChange($this->_OldPost, $post);
263
+ if (!$changes) {
264
+ $changes = $this->CheckPermalinkChange($this->_OldLink, get_permalink($post->ID), $post);
265
+ // Comments/Trackbacks and Pingbacks
266
+ if (!$changes) {
267
+ $changes = $this->CheckCommentsPings($this->_OldPost, $post);
268
+ if (!$changes) {
269
+ $changes = $this->CheckModificationChange($post->ID, $this->_OldPost, $post);
270
+ }
271
+ }
272
+ }
273
+ }
274
+ }
275
+ }
276
+ }
277
 
278
+ /**
279
+ * Check post creation.
280
+ * @global array $_POST
281
+ * @param stdClass $oldPost old post
282
+ * @param stdClass $newPost new post
283
+ */
284
+ protected function CheckPostCreation($oldPost, $newPost)
285
+ {
286
+ $WPActions = array('editpost', 'heartbeat');
287
+ if (isset($_POST['action']) && in_array($_POST['action'], $WPActions)) {
288
+ if (!in_array($newPost->post_type, array('attachment', 'revision', 'nav_menu_item'))) {
289
+ $event = 0;
290
+ $is_scheduled = false;
291
+ switch ($newPost->post_status) {
292
+ case 'publish':
293
+ $event = $this->GetEventTypeForPostType($newPost, 2001, 2005, 2030);
294
+ break;
295
+ case 'draft':
296
+ $event = $this->GetEventTypeForPostType($newPost, 2000, 2004, 2029);
297
+ break;
298
+ case 'future':
299
+ $event = $this->GetEventTypeForPostType($newPost, 2074, 2075, 2076);
300
+ $is_scheduled = true;
301
+ break;
302
+ case 'pending':
303
+ $event = 2073;
304
+ break;
305
+ }
306
+ if ($event) {
307
+ $editorLink = $this->GetEditorLink($newPost);
308
+ if ($is_scheduled) {
309
+ $this->plugin->alerts->Trigger($event, array(
310
+ 'PostType' => $newPost->post_type,
311
+ 'PostTitle' => $newPost->post_title,
312
+ 'PublishingDate' => $newPost->post_date,
313
+ $editorLink['name'] => $editorLink['value']
314
+ ));
315
+ } else {
316
+ $this->plugin->alerts->Trigger($event, array(
317
+ 'PostID' => $newPost->ID,
318
+ 'PostType' => $newPost->post_type,
319
+ 'PostTitle' => $newPost->post_title,
320
+ 'PostUrl' => get_permalink($newPost->ID),
321
+ $editorLink['name'] => $editorLink['value']
322
+ ));
323
+ }
324
+ }
325
+ }
326
+ }
327
+ }
328
 
329
+ /**
330
+ * Post future publishing.
331
+ * @param integer $post_id post ID
332
+ */
333
+ public function EventPublishFuture($post_id)
334
+ {
335
+ $post = get_post($post_id);
336
+ $event = $this->GetEventTypeForPostType($post, 2001, 2005, 2030);
337
 
338
+ if ($event) {
339
+ $editorLink = $this->GetEditorLink($newPost);
340
+ $this->plugin->alerts->Trigger($event, array(
341
+ 'PostID' => $post->ID,
342
+ 'PostType' => $post->post_type,
343
+ 'PostTitle' => $post->post_title,
344
+ 'PostUrl' => get_permalink($post->ID),
345
+ $editorLink['name'] => $editorLink['value']
346
+ ));
347
+ }
348
+ }
349
 
350
+ /**
351
+ * Post permanently deleted.
352
+ * @param integer $post_id post ID
353
+ */
354
+ public function EventPostDeleted($post_id)
355
+ {
356
+ $post = get_post($post_id);
357
+ if ($this->CheckOtherSensors($post)) {
358
+ return;
359
+ }
360
+ $WPActions = array('delete');
361
+ if (isset($_REQUEST['action']) && in_array($_REQUEST['action'], $WPActions)) {
362
+ if (!in_array($post->post_type, array('attachment', 'revision', 'nav_menu_item'))) { // ignore attachments, revisions and menu items
363
+ $event = $this->GetEventTypeForPostType($post, 2008, 2009, 2033);
364
+ // check WordPress backend operations
365
+ if ($this->CheckAutoDraft($event, $post->post_title)) {
366
+ return;
367
+ }
368
+ $editorLink = $this->GetEditorLink($post);
369
+ $this->plugin->alerts->Trigger($event, array(
370
+ 'PostID' => $post->ID,
371
+ 'PostType' => $post->post_type,
372
+ 'PostTitle' => $post->post_title,
373
+ ));
374
+ }
375
+ }
376
+ }
377
 
378
+ /**
379
+ * Post moved to the trash.
380
+ * @param integer $post_id post ID
381
+ */
382
+ public function EventPostTrashed($post_id)
383
+ {
384
+ $post = get_post($post_id);
385
+ if ($this->CheckOtherSensors($post)) {
386
+ return;
387
+ }
388
+ $event = $this->GetEventTypeForPostType($post, 2012, 2013, 2034);
389
+ $editorLink = $this->GetEditorLink($post);
390
+ $this->plugin->alerts->Trigger($event, array(
391
+ 'PostID' => $post->ID,
392
+ 'PostType' => $post->post_type,
393
+ 'PostTitle' => $post->post_title,
394
+ 'PostUrl' => get_permalink($post->ID),
395
+ $editorLink['name'] => $editorLink['value']
396
+ ));
397
+ }
398
 
399
+ /**
400
+ * Post restored from trash.
401
+ * @param integer $post_id post ID
402
+ */
403
+ public function EventPostUntrashed($post_id)
404
+ {
405
+ $post = get_post($post_id);
406
+ if ($this->CheckOtherSensors($post)) {
407
+ return;
408
+ }
409
+ $event = $this->GetEventTypeForPostType($post, 2014, 2015, 2035);
410
+ $editorLink = $this->GetEditorLink($post);
411
+ $this->plugin->alerts->Trigger($event, array(
412
+ 'PostID' => $post->ID,
413
+ 'PostType' => $post->post_type,
414
+ 'PostTitle' => $post->post_title,
415
+ $editorLink['name'] => $editorLink['value']
416
+ ));
417
+ }
418
 
419
+ /**
420
+ * Post date changed.
421
+ * @param stdClass $oldPost old post
422
+ * @param stdClass $newPost new post
423
+ */
424
+ protected function CheckDateChange($oldpost, $newpost)
425
+ {
426
+ $from = strtotime($oldpost->post_date);
427
+ $to = strtotime($newpost->post_date);
428
+ if ($oldpost->post_status == 'draft') {
429
+ return 0;
430
+ }
431
+ $pending = $this->CheckReviewPendingChange($oldpost, $newpost);
432
+ if ($pending) {
433
+ return 0;
434
+ }
435
+ if ($from != $to) {
436
+ $event = $this->GetEventTypeForPostType($oldpost, 2027, 2028, 2041);
437
+ $editorLink = $this->GetEditorLink($oldpost);
438
+ $this->plugin->alerts->Trigger($event, array(
439
+ 'PostID' => $oldpost->ID,
440
+ 'PostType' => $oldpost->post_type,
441
+ 'PostTitle' => $oldpost->post_title,
442
+ 'OldDate' => $oldpost->post_date,
443
+ 'NewDate' => $newpost->post_date,
444
+ $editorLink['name'] => $editorLink['value']
445
+ ));
446
+ return 1;
447
+ }
448
+ return 0;
449
+ }
450
 
451
+ /**
452
+ * Revision used.
453
+ * @param stdClass $oldPost old post
454
+ * @param stdClass $newPost new post
455
+ */
456
+ protected function CheckReviewPendingChange($oldpost, $newpost)
457
+ {
458
+ if ($oldpost->post_status == 'pending') {
459
+ $editorLink = $this->GetEditorLink($oldpost);
460
+ $this->plugin->alerts->Trigger(2072, array(
461
+ 'PostID' => $oldpost->ID,
462
+ 'PostType' => $oldpost->post_type,
463
+ 'PostTitle' => $oldpost->post_title,
464
+ $editorLink['name'] => $editorLink['value']
465
+ ));
466
+ return 1;
467
+ }
468
+ return 0;
469
+ }
470
 
471
+ /**
472
+ * Categories changed.
473
+ * @param array $oldCats old categories
474
+ * @param array $newCats new categories
475
+ * @param stdClass $post the post
476
+ */
477
+ protected function CheckCategoriesChange($oldCats, $newCats, $post)
478
+ {
479
+ $oldCats = implode(', ', $oldCats);
480
+ $newCats = implode(', ', $newCats);
481
+ if ($oldCats != $newCats) {
482
+ $event = $this->GetEventTypeForPostType($post, 2016, 0, 2036);
483
+ if ($event) {
484
+ $editorLink = $this->GetEditorLink($post);
485
+ $this->plugin->alerts->Trigger($event, array(
486
+ 'PostID' => $post->ID,
487
+ 'PostType' => $post->post_type,
488
+ 'PostTitle' => $post->post_title,
489
+ 'OldCategories' => $oldCats ? $oldCats : 'no categories',
490
+ 'NewCategories' => $newCats ? $newCats : 'no categories',
491
+ $editorLink['name'] => $editorLink['value']
492
+ ));
493
+ return 1;
494
+ }
495
+ }
496
+ }
497
 
498
+ /**
499
+ * Author changed.
500
+ * @param stdClass $oldPost old post
501
+ * @param stdClass $newPost new post
502
+ */
503
+ protected function CheckAuthorChange($oldpost, $newpost)
504
+ {
505
+ if ($oldpost->post_author != $newpost->post_author) {
506
+ $event = $this->GetEventTypeForPostType($oldpost, 2019, 2020, 2038);
507
+ $editorLink = $this->GetEditorLink($oldpost);
508
+ $oldAuthor = get_userdata($oldpost->post_author);
509
+ $oldAuthor = (is_object($oldAuthor)) ? $oldAuthor->user_login : 'N/A';
510
+ $newAuthor = get_userdata($newpost->post_author);
511
+ $newAuthor = (is_object($newAuthor)) ? $newAuthor->user_login : 'N/A';
512
+ $this->plugin->alerts->Trigger($event, array(
513
+ 'PostID' => $oldpost->ID,
514
+ 'PostType' => $oldpost->post_type,
515
+ 'PostTitle' => $oldpost->post_title,
516
+ 'OldAuthor' => $oldAuthor,
517
+ 'NewAuthor' => $newAuthor,
518
+ $editorLink['name'] => $editorLink['value']
519
+ ));
520
+ return 1;
521
+ }
522
+ }
523
 
524
+ /**
525
+ * Status changed.
526
+ * @param stdClass $oldPost old post
527
+ * @param stdClass $newPost new post
528
+ */
529
+ protected function CheckStatusChange($oldpost, $newpost)
530
+ {
531
+ if ($oldpost->post_status != $newpost->post_status) {
532
+ if (isset($_REQUEST['publish'])) {
533
+ // special case (publishing a post)
534
+ $event = $this->GetEventTypeForPostType($oldpost, 2001, 2005, 2030);
535
+ $editorLink = $this->GetEditorLink($newpost);
536
+ $this->plugin->alerts->Trigger($event, array(
537
+ 'PostID' => $newpost->ID,
538
+ 'PostType' => $newpost->post_type,
539
+ 'PostTitle' => $newpost->post_title,
540
+ 'PostUrl' => get_permalink($newpost->ID),
541
+ $editorLink['name'] => $editorLink['value']
542
+ ));
543
+ } else {
544
+ $event = $this->GetEventTypeForPostType($oldpost, 2021, 2022, 2039);
545
+ $editorLink = $this->GetEditorLink($oldpost);
546
+ $this->plugin->alerts->Trigger($event, array(
547
+ 'PostID' => $oldpost->ID,
548
+ 'PostType' => $oldpost->post_type,
549
+ 'PostTitle' => $oldpost->post_title,
550
+ 'OldStatus' => $oldpost->post_status,
551
+ 'NewStatus' => $newpost->post_status,
552
+ $editorLink['name'] => $editorLink['value']
553
+ ));
554
+ }
555
+ return 1;
556
+ }
557
+ }
558
 
559
+ /**
560
+ * Post parent changed.
561
+ * @param stdClass $oldPost old post
562
+ * @param stdClass $newPost new post
563
+ */
564
+ protected function CheckParentChange($oldpost, $newpost)
565
+ {
566
+ if ($oldpost->post_parent != $newpost->post_parent) {
567
+ $event = $this->GetEventTypeForPostType($oldpost, 0, 2047, 0);
568
+ if ($event) {
569
+ $editorLink = $this->GetEditorLink($oldpost);
570
+ $this->plugin->alerts->Trigger($event, array(
571
+ 'PostID' => $oldpost->ID,
572
+ 'PostType' => $oldpost->post_type,
573
+ 'PostTitle' => $oldpost->post_title,
574
+ 'OldParent' => $oldpost->post_parent,
575
+ 'NewParent' => $newpost->post_parent,
576
+ 'OldParentName' => $oldpost->post_parent ? get_the_title($oldpost->post_parent) : 'no parent',
577
+ 'NewParentName' => $newpost->post_parent ? get_the_title($newpost->post_parent) : 'no parent',
578
+ $editorLink['name'] => $editorLink['value']
579
+ ));
580
+ return 1;
581
+ }
582
+ }
583
+ }
584
 
585
+ /**
586
+ * Permalink changed.
587
+ * @param string $oldLink old permalink
588
+ * @param string $newLink new permalink
589
+ * @param stdClass $post the post
590
+ */
591
+ protected function CheckPermalinkChange($oldLink, $newLink, $post)
592
+ {
593
+ if ($oldLink != $newLink) {
594
+ $event = $this->GetEventTypeForPostType($post, 2017, 2018, 2037);
595
+ $editorLink = $this->GetEditorLink($post);
596
+ $this->plugin->alerts->Trigger($event, array(
597
+ 'PostID' => $post->ID,
598
+ 'PostType' => $post->post_type,
599
+ 'PostTitle' => $post->post_title,
600
+ 'OldUrl' => $oldLink,
601
+ 'NewUrl' => $newLink,
602
+ $editorLink['name'] => $editorLink['value']
603
+ ));
604
+ return 1;
605
+ }
606
+ return 0;
607
+ }
608
 
609
+ /**
610
+ * Post visibility changed.
611
+ * @param stdClass $oldPost old post
612
+ * @param stdClass $newPost new post
613
+ * @param string $oldStatus old status
614
+ * @param string $newStatus new status
615
+ */
616
+ protected function CheckVisibilityChange($oldpost, $newpost, $oldStatus, $newStatus)
617
+ {
618
+ if ($oldStatus == 'draft' || $newStatus == 'draft') {
619
+ return;
620
+ }
621
 
622
+ $oldVisibility = '';
623
+ $newVisibility = '';
624
 
625
+ if ($oldpost->post_password) {
626
+ $oldVisibility = __('Password Protected', 'wp-security-audit-log');
627
+ } elseif ($oldStatus == 'publish') {
628
+ $oldVisibility = __('Public', 'wp-security-audit-log');
629
+ } elseif ($oldStatus == 'private') {
630
+ $oldVisibility = __('Private', 'wp-security-audit-log');
631
+ }
632
 
633
+ if ($newpost->post_password) {
634
+ $newVisibility = __('Password Protected', 'wp-security-audit-log');
635
+ } elseif ($newStatus == 'publish') {
636
+ $newVisibility = __('Public', 'wp-security-audit-log');
637
+ } elseif ($newStatus == 'private') {
638
+ $newVisibility = __('Private', 'wp-security-audit-log');
639
+ }
640
 
641
+ if ($oldVisibility && $newVisibility && ($oldVisibility != $newVisibility)) {
642
+ $event = $this->GetEventTypeForPostType($oldpost, 2025, 2026, 2040);
643
+ $editorLink = $this->GetEditorLink($oldpost);
644
+ $this->plugin->alerts->Trigger($event, array(
645
+ 'PostID' => $oldpost->ID,
646
+ 'PostType' => $oldpost->post_type,
647
+ 'PostTitle' => $oldpost->post_title,
648
+ 'OldVisibility' => $oldVisibility,
649
+ 'NewVisibility' => $newVisibility,
650
+ $editorLink['name'] => $editorLink['value']
651
+ ));
652
+ return 1;
653
+ }
654
+ }
655
 
656
+ /**
657
+ * Post template changed.
658
+ * @param string $oldTmpl old template path
659
+ * @param string $newTmpl new template path
660
+ * @param stdClass $post the post
661
+ */
662
+ protected function CheckTemplateChange($oldTmpl, $newTmpl, $post)
663
+ {
664
+ if ($oldTmpl != $newTmpl) {
665
+ $event = $this->GetEventTypeForPostType($post, 0, 2048, 0);
666
+ if ($event) {
667
+ $editorLink = $this->GetEditorLink($post);
668
+ $this->plugin->alerts->Trigger($event, array(
669
+ 'PostID' => $post->ID,
670
+ 'PostType' => $post->post_type,
671
+ 'PostTitle' => $post->post_title,
672
+ 'OldTemplate' => ucwords(str_replace(array('-' , '_'), ' ', basename($oldTmpl, '.php'))),
673
+ 'NewTemplate' => ucwords(str_replace(array('-' , '_'), ' ', basename($newTmpl, '.php'))),
674
+ 'OldTemplatePath' => $oldTmpl,
675
+ 'NewTemplatePath' => $newTmpl,
676
+ $editorLink['name'] => $editorLink['value']
677
+ ));
678
+ return 1;
679
+ }
680
+ }
681
+ }
682
 
683
+ /**
684
+ * Post sets as sticky changes.
685
+ * @param string $oldTmpl old template path
686
+ * @param string $newTmpl new template path
687
+ * @param stdClass $post the post
688
+ */
689
+ protected function CheckStickyChange($oldStky, $newStky, $post)
690
+ {
691
+ if ($oldStky != $newStky) {
692
+ $event = $newStky ? 2049 : 2050;
693
+ $editorLink = $this->GetEditorLink($post);
694
+ $this->plugin->alerts->Trigger($event, array(
695
+ 'PostID' => $post->ID,
696
+ 'PostType' => $post->post_type,
697
+ 'PostTitle' => $post->post_title,
698
+ 'PostUrl' => get_permalink($post->ID),
699
+ $editorLink['name'] => $editorLink['value']
700
+ ));
701
+ return 1;
702
+ }
703
+ }
704
 
705
+ /**
706
+ * Post modified content.
707
+ * @param integer $post_ID post ID
708
+ * @param stdClass $oldPost old post
709
+ * @param stdClass $newPost new post
710
+ */
711
+ public function CheckModificationChange($post_ID, $oldpost, $newpost)
712
+ {
713
+ if ($this->CheckOtherSensors($oldpost)) {
714
+ return;
715
+ }
716
+ $changes = $this->CheckTitleChange($oldpost, $newpost);
717
+ if (!$changes) {
718
+ $contentChanged = $oldpost->post_content != $newpost->post_content; // TODO what about excerpts?
719
 
720
+ if ($oldpost->post_modified != $newpost->post_modified) {
721
+ $event = 0;
722
+ // @see http://codex.wordpress.org/Class_Reference/WP_Query#Status_Parameters
723
+ switch ($oldpost->post_status) { // TODO or should this be $newpost?
724
+ case 'draft':
725
+ if ($contentChanged) {
726
+ $event = $this->GetEventTypeForPostType($newpost, 2068, 2069, 2070);
727
+ } else {
728
+ $event = $this->GetEventTypeForPostType($newpost, 2003, 2007, 2032);
729
+ }
730
+ break;
731
+ case 'publish':
732
+ if ($contentChanged) {
733
+ $event = $this->GetEventTypeForPostType($newpost, 2065, 2066, 2067);
734
+ } else {
735
+ $event = $this->GetEventTypeForPostType($newpost, 2002, 2006, 2031);
736
+ }
737
+ break;
738
+ }
739
+ if ($event) {
740
+ $editorLink = $this->GetEditorLink($oldpost);
741
+ $this->plugin->alerts->Trigger($event, array(
742
+ 'PostID' => $post_ID,
743
+ 'PostType' => $oldpost->post_type,
744
+ 'PostTitle' => $oldpost->post_title,
745
+ 'PostUrl' => get_permalink($post_ID),
746
+ $editorLink['name'] => $editorLink['value']
747
+ ));
748
+ return 1;
749
+ }
750
+ }
751
+ }
752
+ }
753
 
754
+ /**
755
+ * New category created.
756
+ * @param integer $category_id category ID
757
+ */
758
+ public function EventCategoryCreation($category_id)
759
+ {
760
+ $category = get_category($category_id);
761
+ $category_link = $this->getCategoryLink($category_id);
762
+ $this->plugin->alerts->Trigger(2023, array(
763
+ 'CategoryName' => $category->name,
764
+ 'Slug' => $category->slug,
765
+ 'CategoryLink' => $category_link
766
+ ));
767
+ }
768
 
769
+ /**
770
+ * Category deleted.
771
+ * @global array $_POST post data
772
+ */
773
+ protected function CheckCategoryDeletion()
774
+ {
775
+ if (empty($_POST)) {
776
+ return;
777
+ }
778
+ $action = !empty($_POST['action']) ? $_POST['action']
779
+ : (!empty($_POST['action2']) ? $_POST['action2'] : '');
780
+ if (!$action) {
781
+ return;
782
+ }
783
 
784
+ $categoryIds = array();
785
 
786
+ if (isset($_POST['taxonomy'])) {
787
+ if ($action == 'delete' && $_POST['taxonomy'] == 'category' && !empty($_POST['delete_tags'])) {
788
+ // bulk delete
789
+ $categoryIds[] = $_POST['delete_tags'];
790
+ } elseif ($action == 'delete-tag' && $_POST['taxonomy'] == 'category' && !empty($_POST['tag_ID'])) {
791
+ // single delete
792
+ $categoryIds[] = $_POST['tag_ID'];
793
+ }
794
+ }
795
 
796
+ foreach ($categoryIds as $categoryID) {
797
+ $category = get_category($categoryID);
798
+ $this->plugin->alerts->Trigger(2024, array(
799
+ 'CategoryID' => $categoryID,
800
+ 'CategoryName' => $category->cat_name,
801
+ 'Slug' => $category->slug
802
+ ));
803
+ }
804
+ }
805
 
806
+ /**
807
+ * Changed the parent of the category.
808
+ * @global array $_POST post data
809
+ */
810
+ public function EventChangedCategoryParent()
811
+ {
812
+ if (empty($_POST)) {
813
+ return;
814
+ }
815
+ if (!current_user_can("manage_categories")) {
816
+ return;
817
+ }
818
+ if (isset($_POST['name']) && isset($_POST['tag_ID'])) {
819
+ $category = get_category($_POST['tag_ID']);
820
+ $category_link = $this->getCategoryLink($_POST['tag_ID']);
821
+ if ($category->parent != 0) {
822
+ $oldParent = get_category($category->parent);
823
+ $oldParentName = (empty($oldParent))? 'no parent' : $oldParent->name;
824
+ } else {
825
+ $oldParentName = 'no parent';
826
+ }
827
+ if (isset($_POST['parent'])) {
828
+ $newParent = get_category($_POST['parent']);
829
+ $newParentName = (empty($newParent))? 'no parent' : $newParent->name;
830
+ }
831
+ $this->plugin->alerts->Trigger(2052, array(
832
+ 'CategoryName' => $category->name,
833
+ 'OldParent' => $oldParentName,
834
+ 'NewParent' => $newParentName,
835
+ 'CategoryLink' => $category_link
836
+ ));
837
+ }
838
+ }
839
 
840
+ /**
841
+ * Check auto draft and the setting: Hide Plugin in Plugins Page
842
+ * @param integer $code alert code
843
+ * @param string $title title
844
+ * @return boolean
845
+ */
846
+ private function CheckAutoDraft($code, $title)
847
+ {
848
+ if ($code == 2008 && $title == "auto-draft") {
849
+ // to do check setting else return false
850
+ if ($this->plugin->settings->IsWPBackend() == 1) {
851
+ return true;
852
+ } else {
853
+ return false;
854
+ }
855
+ } else {
856
+ return false;
857
+ }
858
+ }
859
 
860
+ /**
861
+ * Builds revision link.
862
+ * @param integer $revision_id revision ID
863
+ * @return string|null link
864
+ */
865
+ private function getRevisionLink($revision_id)
866
+ {
867
+ if (!empty($revision_id)) {
868
+ return admin_url('revision.php?revision='.$revision_id);
869
+ } else {
870
+ return null;
871
+ }
872
+ }
873
 
874
+ /**
875
+ * Builds category link.
876
+ * @param integer $category_id category ID
877
+ * @return string|null link
878
+ */
879
+ private function getCategoryLink($category_id)
880
+ {
881
+ if (!empty($category_id)) {
882
+ return admin_url('term.php?taxnomy=category&tag_ID='.$category_id);
883
+ } else {
884
+ return null;
885
+ }
886
+ }
887
 
888
+ /**
889
+ * Ignore post from BBPress, WooCommerce Plugin
890
+ * Triggered on the Sensors
891
+ *
892
+ * @param stdClass $post the post.
893
+ */
894
+ private function CheckOtherSensors( $post ) {
895
+ if ( empty( $post ) || ! isset( $post->post_type ) ) {
896
+ return false;
897
+ }
898
+ switch ( $post->post_type ) {
899
+ case 'forum':
900
+ case 'topic':
901
+ case 'reply':
902
+ case 'product':
903
+ return true;
904
+ default:
905
+ return false;
906
+ }
907
+ }
908
 
909
+ /**
910
+ * Triggered after save post for add revision link.
911
+ * @param integer $post_id post ID
912
+ * @param stdClass $post post
913
+ */
914
+ public function SetRevisionLink($post_id, $post, $update)
915
+ {
916
+ $revisions = wp_get_post_revisions($post_id);
917
+ if (!empty($revisions)) {
918
+ $revision = array_shift($revisions);
919
 
920
+ $objOcc = new WSAL_Models_Occurrence();
921
+ $occ = $objOcc->GetByPostID($post_id);
922
+ $occ = count($occ) ? $occ[0] : null;
923
+ if (!empty($occ)) {
924
+ $revisionLink = $this->getRevisionLink($revision->ID);
925
+ if (!empty($revisionLink)) {
926
+ $occ->SetMetaValue('RevisionLink', $revisionLink);
927
+ }
928
+ }
929
+ }
930
+ }
931
 
932
+ /**
933
+ * Alerts for Viewing of Posts, Pages and Custom Posts.
934
+ */
935
+ public function ViewingPost() {
936
+ // Retrieve the current post object.
937
+ $post = get_queried_object();
938
+ if ( is_user_logged_in() ) {
939
+ if ( ! is_admin() ) {
940
+ if ( $this->CheckOtherSensors( $post ) ) {
941
+ return $post->post_title;
942
+ }
943
 
944
+ $currentPath = $_SERVER['REQUEST_URI'];
945
+ if ( ! empty( $_SERVER['HTTP_REFERER'] )
946
+ && strpos( $_SERVER['HTTP_REFERER'], $currentPath ) !== false ) {
947
+ // Ignore this if we were on the same page so we avoid double audit entries.
948
+ return;
949
+ }
950
+ if ( ! empty( $post->post_title ) ) {
951
+ $event = $this->GetEventTypeForPostType( $post, 2101, 2103, 2105 );
952
+ $this->plugin->alerts->Trigger( $event, array(
953
+ 'PostType' => $post->post_type,
954
+ 'PostTitle' => $post->post_title,
955
+ 'PostUrl' => get_permalink( $post->ID ),
956
+ ) );
957
+ }
958
+ }
959
+ }
960
+ }
961
 
962
+ /**
963
+ * Alerts for Editing of Posts, Pages and Custom Posts.
964
+ * @param stdClass $post post
965
+ */
966
+ public function EditingPost($post)
967
+ {
968
+ if (is_user_logged_in()) {
969
+ if (is_admin()) {
970
+ if ($this->CheckOtherSensors($post)) {
971
+ return $post;
972
+ }
973
+ $currentPath = $_SERVER["SCRIPT_NAME"] . "?post=" . $post->ID;
974
+ if (!empty($_SERVER["HTTP_REFERER"])
975
+ && strpos($_SERVER["HTTP_REFERER"], $currentPath) !== false) {
976
+ //Ignore this if we were on the same page so we avoid double audit entries
977
+ return $post;
978
+ }
979
+ if (!empty($post->post_title)) {
980
+ $event = $this->GetEventTypeForPostType($post, 2100, 2102, 2104);
981
+ if (!$this->WasTriggered($event)) {
982
+ $editorLink = $this->GetEditorLink($post);
983
+ $this->plugin->alerts->Trigger($event, array(
984
+ 'PostType' => $post->post_type,
985
+ 'PostTitle' => $post->post_title,
986
+ $editorLink['name'] => $editorLink['value']
987
+ ));
988
+ }
989
+ }
990
+ }
991
+ }
992
+ return $post;
993
+ }
994
 
995
+ /**
996
+ * Check if the alert was triggered.
997
+ * @param integer $alert_id alert code
998
+ * @return boolean
999
+ */
1000
+ private function WasTriggered($alert_id)
1001
+ {
1002
+ $query = new WSAL_Models_OccurrenceQuery();
1003
+ $query->addOrderBy("created_on", true);
1004
+ $query->setLimit(1);
1005
+ $lastOccurence = $query->getAdapter()->Execute($query);
1006
+ if (!empty($lastOccurence)) {
1007
+ if ($lastOccurence[0]->alert_id == $alert_id) {
1008
+ return true;
1009
+ }
1010
+ }
1011
+ return false;
1012
+ }
1013
 
1014
+ /**
1015
+ * Changed title of a post.
1016
+ * @param stdClass $oldPost old post
1017
+ * @param stdClass $newPost new post
1018
+ */
1019
+ private function CheckTitleChange($oldpost, $newpost)
1020
+ {
1021
+ if ($oldpost->post_title != $newpost->post_title) {
1022
+ $event = $this->GetEventTypeForPostType($newpost, 2086, 2087, 2088);
1023
+ $editorLink = $this->GetEditorLink($oldpost);
1024
+ $this->plugin->alerts->Trigger($event, array(
1025
+ 'OldTitle' => $oldpost->post_title,
1026
+ 'NewTitle' => $newpost->post_title,
1027
+ $editorLink['name'] => $editorLink['value']
1028
+ ));
1029
+ return 1;
1030
+ }
1031
+ return 0;
1032
+ }
1033
 
1034
+ /**
1035
+ * Comments/Trackbacks and Pingbacks check.
1036
+ * @param stdClass $oldPost old post
1037
+ * @param stdClass $newPost new post
1038
+ */
1039
+ private function CheckCommentsPings($oldpost, $newpost)
1040
+ {
1041
+ $result = 0;
1042
+ // Comments
1043
+ if ($oldpost->comment_status != $newpost->comment_status) {
1044
+ $type = 'Comments';
1045
 
1046
+ if ($newpost->comment_status == 'open') {
1047
+ $event = $this->GetCommentsPingsEvent($newpost, 'enable');
1048
+ } else {
1049
+ $event = $this->GetCommentsPingsEvent($newpost, 'disable');
1050
+ }
1051
 
1052
+ $this->plugin->alerts->Trigger($event, array(
1053
+ 'Type' => $type,
1054
+ 'PostTitle' => $newpost->post_title,
1055
+ 'PostUrl' => get_permalink($newpost->ID)
1056
+ ));
1057
+ $result = 1;
1058
+ }
1059
+ // Trackbacks and Pingbacks
1060
+ if ($oldpost->ping_status != $newpost->ping_status) {
1061
+ $type = 'Trackbacks and Pingbacks';
1062
 
1063
+ if ($newpost->ping_status == 'open') {
1064
+ $event = $this->GetCommentsPingsEvent($newpost, 'enable');
1065
+ } else {
1066
+ $event = $this->GetCommentsPingsEvent($newpost, 'disable');
1067
+ }
1068
 
1069
+ $this->plugin->alerts->Trigger($event, array(
1070
+ 'Type' => $type,
1071
+ 'PostTitle' => $newpost->post_title,
1072
+ 'PostUrl' => get_permalink($newpost->ID)
1073
+ ));
1074
+ $result = 1;
1075
+ }
1076
+ return $result;
1077
+ }
1078
 
1079
+ /**
1080
+ * Comments/Trackbacks and Pingbacks event code.
1081
+ * @param stdClass $post the post
1082
+ * @param string $status the status
1083
+ */
1084
+ private function GetCommentsPingsEvent($post, $status)
1085
+ {
1086
+ if ($post->post_type == 'post') {
1087
+ if ($post->post_status == 'publish') {
1088
+ if ($status == 'disable') {
1089
+ $event = 2111;
1090
+ } else {
1091
+ $event = 2112;
1092
+ }
1093
+ } else {
1094
+ if ($status == 'disable') {
1095
+ $event = 2113;
1096
+ } else {
1097
+ $event = 2114;
1098
+ }
1099
+ }
1100
+ } else {
1101
+ if ($post->post_status == 'publish') {
1102
+ if ($status == 'disable') {
1103
+ $event = 2115;
1104
+ } else {
1105
+ $event = 2116;
1106
+ }
1107
+ } else {
1108
+ if ($status == 'disable') {
1109
+ $event = 2117;
1110
+ } else {
1111
+ $event = 2118;
1112
+ }
1113
+ }
1114
+ }
1115
+ return $event;
1116
+ }
1117
 
1118
+ /**
1119
+ * Get editor link.
1120
+ * @param stdClass $post the post
1121
+ * @return array $aLink name and value link
1122
+ */
1123
+ private function GetEditorLink($post)
1124
+ {
1125
+ $name = 'EditorLink';
1126
+ $name .= ($post->post_type == 'page') ? 'Page' : 'Post' ;
1127
+ $value = get_edit_post_link($post->ID);
1128
+ $aLink = array(
1129
+ 'name' => $name,
1130
+ 'value' => $value,
1131
+ );
1132
+ return $aLink;
1133
+ }
1134
  }
classes/Sensors/PluginsThemes.php CHANGED
@@ -23,373 +23,378 @@
23
  * 2107 A plugin modified a page
24
  * 2108 A plugin modified a custom post
25
  */
26
- class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor
27
- {
28
- protected $old_themes = array();
29
- protected $old_plugins = array();
30
 
31
- /**
32
- * Listening to events using WP hooks.
33
- */
34
- public function HookEvents()
35
- {
36
- $hasPermission = (current_user_can("install_plugins") || current_user_can("activate_plugins") ||
37
- current_user_can("delete_plugins") || current_user_can("update_plugins") || current_user_can("install_themes"));
38
 
39
- add_action('admin_init', array($this, 'EventAdminInit'));
40
- if ($hasPermission) {
41
- add_action('shutdown', array($this, 'EventAdminShutdown'));
42
- }
43
- add_action('switch_theme', array($this, 'EventThemeActivated'));
44
- // TO DO
45
- add_action('wp_insert_post', array($this, 'EventPluginPostCreate'), 10, 2);
46
- add_action('delete_post', array($this, 'EventPluginPostDelete'), 10, 1);
47
- }
48
-
49
- /**
50
- * Triggered when a user accesses the admin area.
51
- */
52
- public function EventAdminInit()
53
- {
54
- $this->old_themes = wp_get_themes();
55
- $this->old_plugins = get_plugins();
56
- }
57
-
58
- /**
59
- * Install, uninstall, activate, deactivate, upgrade and update.
60
- */
61
- public function EventAdminShutdown()
62
- {
63
- $action = (isset($_REQUEST['action']) && $_REQUEST['action'] != "-1") ? $_REQUEST['action'] : '';
64
- $action = (isset($_REQUEST['action2']) && $_REQUEST['action2'] != "-1") ? $_REQUEST['action2'] : $action;
65
- $actype = basename($_SERVER['SCRIPT_NAME'], '.php');
66
- $is_themes = $actype == 'themes';
67
- $is_plugins = $actype == 'plugins';
68
-
69
- // install plugin
70
- if (in_array($action, array('install-plugin', 'upload-plugin')) && current_user_can("install_plugins")) {
71
- $plugin = array_values(array_diff(array_keys(get_plugins()), array_keys($this->old_plugins)));
72
- if (count($plugin) != 1) {
73
- return $this->LogError(
74
- 'Expected exactly one new plugin but found ' . count($plugin),
75
- array('NewPlugin' => $plugin, 'OldPlugins' => $this->old_plugins, 'NewPlugins' => get_plugins())
76
- );
77
- }
78
- $pluginPath = $plugin[0];
79
- $plugin = get_plugins();
80
- $plugin = $plugin[$pluginPath];
81
- $pluginPath = plugin_dir_path(WP_PLUGIN_DIR . '/' . $pluginPath[0]);
82
- $this->plugin->alerts->Trigger(5000, array(
83
- 'Plugin' => (object)array(
84
- 'Name' => $plugin['Name'],
85
- 'PluginURI' => $plugin['PluginURI'],
86
- 'Version' => $plugin['Version'],
87
- 'Author' => $plugin['Author'],
88
- 'Network' => $plugin['Network'] ? 'True' : 'False',
89
- 'plugin_dir_path' => $pluginPath,
90
- ),
91
- ));
92
- }
93
 
94
- // activate plugin
95
- if ($is_plugins && in_array($action, array('activate', 'activate-selected')) && current_user_can("activate_plugins")) {
96
- if (isset($_REQUEST['plugin'])) {
97
- if (!isset($_REQUEST['checked'])) {
98
- $_REQUEST['checked'] = array();
99
- }
100
- $_REQUEST['checked'][] = $_REQUEST['plugin'];
101
- }
102
- foreach ($_REQUEST['checked'] as $pluginFile) {
103
- $pluginFile = WP_PLUGIN_DIR . '/' . $pluginFile;
104
- $pluginData = get_plugin_data($pluginFile, false, true);
105
- $this->plugin->alerts->Trigger(5001, array(
106
- 'PluginFile' => $pluginFile,
107
- 'PluginData' => (object)array(
108
- 'Name' => $pluginData['Name'],
109
- 'PluginURI' => $pluginData['PluginURI'],
110
- 'Version' => $pluginData['Version'],
111
- 'Author' => $pluginData['Author'],
112
- 'Network' => $pluginData['Network'] ? 'True' : 'False',
113
- ),
114
- ));
115
- }
116
- }
117
 
118
- // deactivate plugin
119
- if ($is_plugins && in_array($action, array('deactivate', 'deactivate-selected')) && current_user_can("activate_plugins")) {
120
- if (isset($_REQUEST['plugin'])) {
121
- if (!isset($_REQUEST['checked'])) {
122
- $_REQUEST['checked'] = array();
123
- }
124
- $_REQUEST['checked'][] = $_REQUEST['plugin'];
125
- }
126
- foreach ($_REQUEST['checked'] as $pluginFile) {
127
- $pluginFile = WP_PLUGIN_DIR . '/' . $pluginFile;
128
- $pluginData = get_plugin_data($pluginFile, false, true);
129
- $this->plugin->alerts->Trigger(5002, array(
130
- 'PluginFile' => $pluginFile,
131
- 'PluginData' => (object)array(
132
- 'Name' => $pluginData['Name'],
133
- 'PluginURI' => $pluginData['PluginURI'],
134
- 'Version' => $pluginData['Version'],
135
- 'Author' => $pluginData['Author'],
136
- 'Network' => $pluginData['Network'] ? 'True' : 'False',
137
- ),
138
- ));
139
- }
140
- }
141
-
142
- // uninstall plugin
143
- if ($is_plugins && in_array($action, array('delete-selected')) && current_user_can("delete_plugins")) {
144
- if (!isset($_REQUEST['verify-delete'])) {
145
- // first step, before user approves deletion
146
- // TODO store plugin data in session here
147
- } else {
148
- // second step, after deletion approval
149
- // TODO use plugin data from session
150
- foreach ($_REQUEST['checked'] as $pluginFile) {
151
- $pluginName = basename($pluginFile, '.php');
152
- $pluginName = str_replace(array('_', '-', ' '), ' ', $pluginName);
153
- $pluginName = ucwords($pluginName);
154
- $pluginFile = WP_PLUGIN_DIR . '/' . $pluginFile;
155
- $this->plugin->alerts->Trigger(5003, array(
156
- 'PluginFile' => $pluginFile,
157
- 'PluginData' => (object)array(
158
- 'Name' => $pluginName,
159
- ),
160
- ));
161
- }
162
- }
163
- }
164
-
165
- // uninstall plugin for Wordpress version 4.6
166
- if (in_array($action, array('delete-plugin')) && current_user_can("delete_plugins")) {
167
- if (isset($_REQUEST['plugin'])) {
168
- $pluginFile = WP_PLUGIN_DIR . '/' . $_REQUEST['plugin'];
169
- $pluginName = basename($pluginFile, '.php');
170
- $pluginName = str_replace(array('_', '-', ' '), ' ', $pluginName);
171
- $pluginName = ucwords($pluginName);
172
- $this->plugin->alerts->Trigger(5003, array(
173
- 'PluginFile' => $pluginFile,
174
- 'PluginData' => (object)array(
175
- 'Name' => $pluginName,
176
- ),
177
- ));
178
- }
179
- }
180
-
181
- // upgrade plugin
182
- if (in_array($action, array('upgrade-plugin', 'update-plugin', 'update-selected')) && current_user_can("update_plugins")) {
183
- $plugins = array();
184
- if (isset($_REQUEST['plugins'])) {
185
- $plugins = explode(",", $_REQUEST['plugins']);
186
- } else if (isset($_REQUEST['plugin'])) {
187
- $plugins[] = $_REQUEST['plugin'];
188
- }
189
- if (isset($plugins)) {
190
- foreach ($plugins as $pluginFile) {
191
- $pluginFile = WP_PLUGIN_DIR . '/' . $pluginFile;
192
- $pluginData = get_plugin_data($pluginFile, false, true);
193
- $this->plugin->alerts->Trigger(5004, array(
194
- 'PluginFile' => $pluginFile,
195
- 'PluginData' => (object)array(
196
- 'Name' => $pluginData['Name'],
197
- 'PluginURI' => $pluginData['PluginURI'],
198
- 'Version' => $pluginData['Version'],
199
- 'Author' => $pluginData['Author'],
200
- 'Network' => $pluginData['Network'] ? 'True' : 'False',
201
- ),
202
- ));
203
- }
204
- }
205
- }
206
-
207
- // update theme
208
- if (in_array($action, array('upgrade-theme', 'update-theme', 'update-selected-themes')) && current_user_can("install_themes")) {
209
- $themes = array();
210
- if (isset($_REQUEST['slug']) || isset($_REQUEST['theme'])) {
211
- $themes[] = isset($_REQUEST['slug']) ? $_REQUEST['slug'] : $_REQUEST['theme'];
212
- } elseif (isset($_REQUEST['themes'])) {
213
- $themes = explode(",", $_REQUEST['themes']);
214
- }
215
- if (isset($themes)) {
216
- foreach ($themes as $theme_name) {
217
- $theme = wp_get_theme($theme_name);
218
- $this->plugin->alerts->Trigger(5031, array(
219
- 'Theme' => (object)array(
220
- 'Name' => $theme->Name,
221
- 'ThemeURI' => $theme->ThemeURI,
222
- 'Description' => $theme->Description,
223
- 'Author' => $theme->Author,
224
- 'Version' => $theme->Version,
225
- 'get_template_directory' => $theme->get_template_directory(),
226
- ),
227
- ));
228
- }
229
- }
230
- }
231
-
232
- // install theme
233
- if (in_array($action, array('install-theme', 'upload-theme')) && current_user_can("install_themes")) {
234
- $themes = array_diff(wp_get_themes(), $this->old_themes);
235
- foreach ($themes as $theme) {
236
- $this->plugin->alerts->Trigger(5005, array(
237
- 'Theme' => (object)array(
238
- 'Name' => $theme->Name,
239
- 'ThemeURI' => $theme->ThemeURI,
240
- 'Description' => $theme->Description,
241
- 'Author' => $theme->Author,
242
- 'Version' => $theme->Version,
243
- 'get_template_directory' => $theme->get_template_directory(),
244
- ),
245
- ));
246
- }
247
- }
248
-
249
- // uninstall theme
250
- if (in_array($action, array('delete-theme')) && current_user_can("install_themes")) {
251
- foreach ($this->GetRemovedThemes() as $theme) {
252
- $this->plugin->alerts->Trigger(5007, array(
253
- 'Theme' => (object)array(
254
- 'Name' => $theme->Name,
255
- 'ThemeURI' => $theme->ThemeURI,
256
- 'Description' => $theme->Description,
257
- 'Author' => $theme->Author,
258
- 'Version' => $theme->Version,
259
- 'get_template_directory' => $theme->get_template_directory(),
260
- ),
261
- ));
262
- }
263
- }
264
- }
265
-
266
- /**
267
- * Activated a theme.
268
- * @param string $themeName name
269
- */
270
- public function EventThemeActivated($themeName)
271
- {
272
- $theme = null;
273
- foreach (wp_get_themes() as $item) {
274
- if ($item->Name == $themeName) {
275
- $theme = $item;
276
- break;
277
- }
278
- }
279
- if ($theme == null) {
280
- return $this->LogError(
281
- 'Could not locate theme named "' . $theme . '".',
282
- array('ThemeName' => $themeName, 'Themes' => wp_get_themes())
283
- );
284
- }
285
- $this->plugin->alerts->Trigger(5006, array(
286
- 'Theme' => (object)array(
287
- 'Name' => $theme->Name,
288
- 'ThemeURI' => $theme->ThemeURI,
289
- 'Description' => $theme->Description,
290
- 'Author' => $theme->Author,
291
- 'Version' => $theme->Version,
292
- 'get_template_directory' => $theme->get_template_directory(),
293
- ),
294
- ));
295
- }
296
 
297
- /**
298
- * Plugin creates/modifies posts.
299
- * @param WP_Post $post post object
300
- */
301
- public function EventPluginPostCreate($insert, $post)
302
- {
303
- $WPActions = array('editpost', 'heartbeat', 'inline-save', 'trash', 'untrash');
304
- if (isset($_REQUEST['action']) && !in_array($_REQUEST['action'], $WPActions)) {
305
- if (!in_array($post->post_type, array('attachment', 'revision', 'nav_menu_item'))) {
306
- // if the plugin modify the post
307
- if (strpos($_REQUEST['action'], 'edit') !== false) {
308
- $event = $this->GetEventTypeForPostType($post, 2106, 2107, 2108);
309
- $editorLink = $this->GetEditorLink($post);
310
- $this->plugin->alerts->Trigger($event, array(
311
- 'PostID' => $post->ID,
312
- 'PostType' => $post->post_type,
313
- 'PostTitle' => $post->post_title,
314
- $editorLink['name'] => $editorLink['value']
315
- ));
316
- } else {
317
- $event = $this->GetEventTypeForPostType($post, 5019, 5020, 5021);
318
- $this->plugin->alerts->Trigger($event, array(
319
- 'PostID' => $post->ID,
320
- 'PostType' => $post->post_type,
321
- 'PostTitle' => $post->post_title,
322
- 'Username' => 'Plugins'
323
- ));
324
- }
325
- }
326
- }
327
- }
328
 
329
- /**
330
- * Plugin deletes posts.
331
- * @param integer $post_id post ID
332
- */
333
- public function EventPluginPostDelete($post_id)
334
- {
335
- if (empty($_REQUEST['action']) && isset($_REQUEST['page'])) {
336
- $post = get_post($post_id);
337
- if (!in_array($post->post_type, array('attachment', 'revision', 'nav_menu_item'))) {
338
- $event = $this->GetEventTypeForPostType($post, 5025, 5026, 5027);
339
- $this->plugin->alerts->Trigger($event, array(
340
- 'PostID' => $post->ID,
341
- 'PostType' => $post->post_type,
342
- 'PostTitle' => $post->post_title,
343
- 'Username' => 'Plugins'
344
- ));
345
- }
346
- }
347
- }
348
-
349
- /**
350
- * Get removed themes.
351
- * @return array of WP_Theme objects
352
- */
353
- protected function GetRemovedThemes()
354
- {
355
- $result = $this->old_themes;
356
- foreach ($result as $i => $theme) {
357
- if (file_exists($theme->get_template_directory())) {
358
- unset($result[$i]);
359
- }
360
- }
361
- return array_values($result);
362
- }
363
 
364
- /**
365
- * Get event code by post type.
366
- */
367
- protected function GetEventTypeForPostType($post, $typePost, $typePage, $typeCustom)
368
- {
369
- switch ($post->post_type) {
370
- case 'page':
371
- return $typePage;
372
- case 'post':
373
- return $typePost;
374
- default:
375
- return $typeCustom;
376
- }
377
- }
 
 
 
 
 
 
 
 
 
 
378
 
379
- /**
380
- * Get editor link.
381
- * @param stdClass $post the post
382
- * @return array $aLink name and value link
383
- */
384
- private function GetEditorLink($post)
385
- {
386
- $name = 'EditorLink';
387
- $name .= ($post->post_type == 'page') ? 'Page' : 'Post' ;
388
- $value = get_edit_post_link($post->ID);
389
- $aLink = array(
390
- 'name' => $name,
391
- 'value' => $value,
392
- );
393
- return $aLink;
394
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
395
  }
23
  * 2107 A plugin modified a page
24
  * 2108 A plugin modified a custom post
25
  */
26
+ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
 
 
 
27
 
28
+ protected $old_themes = array();
29
+ protected $old_plugins = array();
 
 
 
 
 
30
 
31
+ /**
32
+ * Listening to events using WP hooks.
33
+ */
34
+ public function HookEvents() {
35
+ $has_permission = ( current_user_can( 'install_plugins' ) || current_user_can( 'activate_plugins' ) ||
36
+ current_user_can( 'delete_plugins' ) || current_user_can( 'update_plugins' ) || current_user_can( 'install_themes' ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
 
38
+ add_action( 'admin_init', array( $this, 'EventAdminInit' ) );
39
+ if ( $has_permission ) {
40
+ add_action( 'shutdown', array( $this, 'EventAdminShutdown' ) );
41
+ }
42
+ add_action( 'switch_theme', array( $this, 'EventThemeActivated' ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
 
44
+ // TO DO.
45
+ add_action( 'wp_insert_post', array( $this, 'EventPluginPostCreate' ), 10, 2 );
46
+ add_action( 'delete_post', array( $this, 'EventPluginPostDelete' ), 10, 1 );
47
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
 
49
+ /**
50
+ * Triggered when a user accesses the admin area.
51
+ */
52
+ public function EventAdminInit() {
53
+ $this->old_themes = wp_get_themes();
54
+ $this->old_plugins = get_plugins();
55
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
 
57
+ /**
58
+ * Install, uninstall, activate, deactivate, upgrade and update.
59
+ */
60
+ public function EventAdminShutdown()
61
+ {
62
+ $action = (isset($_REQUEST['action']) && $_REQUEST['action'] != "-1") ? $_REQUEST['action'] : '';
63
+ $action = (isset($_REQUEST['action2']) && $_REQUEST['action2'] != "-1") ? $_REQUEST['action2'] : $action;
64
+ $actype = basename($_SERVER['SCRIPT_NAME'], '.php');
65
+ $is_themes = $actype == 'themes';
66
+ $is_plugins = $actype == 'plugins';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
 
68
+ // install plugin
69
+ if (in_array($action, array('install-plugin', 'upload-plugin')) && current_user_can("install_plugins")) {
70
+ $plugin = array_values(array_diff(array_keys(get_plugins()), array_keys($this->old_plugins)));
71
+ if (count($plugin) != 1) {
72
+ return $this->LogError(
73
+ 'Expected exactly one new plugin but found ' . count($plugin),
74
+ array('NewPlugin' => $plugin, 'OldPlugins' => $this->old_plugins, 'NewPlugins' => get_plugins())
75
+ );
76
+ }
77
+ $pluginPath = $plugin[0];
78
+ $plugin = get_plugins();
79
+ $plugin = $plugin[$pluginPath];
80
+ $pluginPath = plugin_dir_path(WP_PLUGIN_DIR . '/' . $pluginPath[0]);
81
+ $this->plugin->alerts->Trigger(5000, array(
82
+ 'Plugin' => (object)array(
83
+ 'Name' => $plugin['Name'],
84
+ 'PluginURI' => $plugin['PluginURI'],
85
+ 'Version' => $plugin['Version'],
86
+ 'Author' => $plugin['Author'],
87
+ 'Network' => $plugin['Network'] ? 'True' : 'False',
88
+ 'plugin_dir_path' => $pluginPath,
89
+ ),
90
+ ));
91
+ }
92
 
93
+ // activate plugin
94
+ if ($is_plugins && in_array($action, array('activate', 'activate-selected')) && current_user_can("activate_plugins")) {
95
+ if (isset($_REQUEST['plugin'])) {
96
+ if (!isset($_REQUEST['checked'])) {
97
+ $_REQUEST['checked'] = array();
98
+ }
99
+ $_REQUEST['checked'][] = $_REQUEST['plugin'];
100
+ }
101
+ foreach ($_REQUEST['checked'] as $pluginFile) {
102
+ $pluginFile = WP_PLUGIN_DIR . '/' . $pluginFile;
103
+ $pluginData = get_plugin_data($pluginFile, false, true);
104
+ $this->plugin->alerts->Trigger(5001, array(
105
+ 'PluginFile' => $pluginFile,
106
+ 'PluginData' => (object)array(
107
+ 'Name' => $pluginData['Name'],
108
+ 'PluginURI' => $pluginData['PluginURI'],
109
+ 'Version' => $pluginData['Version'],
110
+ 'Author' => $pluginData['Author'],
111
+ 'Network' => $pluginData['Network'] ? 'True' : 'False',
112
+ ),
113
+ ));
114
+ }
115
+ }
116
+
117
+ // deactivate plugin
118
+ if ($is_plugins && in_array($action, array('deactivate', 'deactivate-selected')) && current_user_can("activate_plugins")) {
119
+ if (isset($_REQUEST['plugin'])) {
120
+ if (!isset($_REQUEST['checked'])) {
121
+ $_REQUEST['checked'] = array();
122
+ }
123
+ $_REQUEST['checked'][] = $_REQUEST['plugin'];
124
+ }
125
+ foreach ($_REQUEST['checked'] as $pluginFile) {
126
+ $pluginFile = WP_PLUGIN_DIR . '/' . $pluginFile;
127
+ $pluginData = get_plugin_data($pluginFile, false, true);
128
+ $this->plugin->alerts->Trigger(5002, array(
129
+ 'PluginFile' => $pluginFile,
130
+ 'PluginData' => (object)array(
131
+ 'Name' => $pluginData['Name'],
132
+ 'PluginURI' => $pluginData['PluginURI'],
133
+ 'Version' => $pluginData['Version'],
134
+ 'Author' => $pluginData['Author'],
135
+ 'Network' => $pluginData['Network'] ? 'True' : 'False',
136
+ ),
137
+ ));
138
+ }
139
+ }
140
+
141
+ // uninstall plugin
142
+ if ($is_plugins && in_array($action, array('delete-selected')) && current_user_can("delete_plugins")) {
143
+ if (!isset($_REQUEST['verify-delete'])) {
144
+ // first step, before user approves deletion
145
+ // TODO store plugin data in session here
146
+ } else {
147
+ // second step, after deletion approval
148
+ // TODO use plugin data from session
149
+ foreach ($_REQUEST['checked'] as $pluginFile) {
150
+ $pluginName = basename($pluginFile, '.php');
151
+ $pluginName = str_replace(array('_', '-', ' '), ' ', $pluginName);
152
+ $pluginName = ucwords($pluginName);
153
+ $pluginFile = WP_PLUGIN_DIR . '/' . $pluginFile;
154
+ $this->plugin->alerts->Trigger(5003, array(
155
+ 'PluginFile' => $pluginFile,
156
+ 'PluginData' => (object)array(
157
+ 'Name' => $pluginName,
158
+ ),
159
+ ));
160
+ }
161
+ }
162
+ }
163
+
164
+ // uninstall plugin for Wordpress version 4.6
165
+ if (in_array($action, array('delete-plugin')) && current_user_can("delete_plugins")) {
166
+ if (isset($_REQUEST['plugin'])) {
167
+ $pluginFile = WP_PLUGIN_DIR . '/' . $_REQUEST['plugin'];
168
+ $pluginName = basename($pluginFile, '.php');
169
+ $pluginName = str_replace(array('_', '-', ' '), ' ', $pluginName);
170
+ $pluginName = ucwords($pluginName);
171
+ $this->plugin->alerts->Trigger(5003, array(
172
+ 'PluginFile' => $pluginFile,
173
+ 'PluginData' => (object)array(
174
+ 'Name' => $pluginName,
175
+ ),
176
+ ));
177
+ }
178
+ }
179
+
180
+ // upgrade plugin
181
+ if (in_array($action, array('upgrade-plugin', 'update-plugin', 'update-selected')) && current_user_can("update_plugins")) {
182
+ $plugins = array();
183
+ if (isset($_REQUEST['plugins'])) {
184
+ $plugins = explode(",", $_REQUEST['plugins']);
185
+ } else if (isset($_REQUEST['plugin'])) {
186
+ $plugins[] = $_REQUEST['plugin'];
187
+ }
188
+ if (isset($plugins)) {
189
+ foreach ($plugins as $pluginFile) {
190
+ $pluginFile = WP_PLUGIN_DIR . '/' . $pluginFile;
191
+ $pluginData = get_plugin_data($pluginFile, false, true);
192
+ $this->plugin->alerts->Trigger(5004, array(
193
+ 'PluginFile' => $pluginFile,
194
+ 'PluginData' => (object)array(
195
+ 'Name' => $pluginData['Name'],
196
+ 'PluginURI' => $pluginData['PluginURI'],
197
+ 'Version' => $pluginData['Version'],
198
+ 'Author' => $pluginData['Author'],
199
+ 'Network' => $pluginData['Network'] ? 'True' : 'False',
200
+ ),
201
+ ));
202
+ }
203
+ }
204
+ }
205
+
206
+ // update theme
207
+ if (in_array($action, array('upgrade-theme', 'update-theme', 'update-selected-themes')) && current_user_can("install_themes")) {
208
+ $themes = array();
209
+ if (isset($_REQUEST['slug']) || isset($_REQUEST['theme'])) {
210
+ $themes[] = isset($_REQUEST['slug']) ? $_REQUEST['slug'] : $_REQUEST['theme'];
211
+ } elseif (isset($_REQUEST['themes'])) {
212
+ $themes = explode(",", $_REQUEST['themes']);
213
+ }
214
+ if (isset($themes)) {
215
+ foreach ($themes as $theme_name) {
216
+ $theme = wp_get_theme($theme_name);
217
+ $this->plugin->alerts->Trigger(5031, array(
218
+ 'Theme' => (object)array(
219
+ 'Name' => $theme->Name,
220
+ 'ThemeURI' => $theme->ThemeURI,
221
+ 'Description' => $theme->Description,
222
+ 'Author' => $theme->Author,
223
+ 'Version' => $theme->Version,
224
+ 'get_template_directory' => $theme->get_template_directory(),
225
+ ),
226
+ ));
227
+ }
228
+ }
229
+ }
230
+
231
+ // install theme
232
+ if (in_array($action, array('install-theme', 'upload-theme')) && current_user_can("install_themes")) {
233
+ $themes = array_diff(wp_get_themes(), $this->old_themes);
234
+ foreach ($themes as $theme) {
235
+ $this->plugin->alerts->Trigger(5005, array(
236
+ 'Theme' => (object)array(
237
+ 'Name' => $theme->Name,
238
+ 'ThemeURI' => $theme->ThemeURI,
239
+ 'Description' => $theme->Description,
240
+ 'Author' => $theme->Author,
241
+ 'Version' => $theme->Version,
242
+ 'get_template_directory' => $theme->get_template_directory(),
243
+ ),
244
+ ));
245
+ }
246
+ }
247
+
248
+ // uninstall theme
249
+ if (in_array($action, array('delete-theme')) && current_user_can("install_themes")) {
250
+ foreach ($this->GetRemovedThemes() as $theme) {
251
+ $this->plugin->alerts->Trigger(5007, array(
252
+ 'Theme' => (object)array(
253
+ 'Name' => $theme->Name,
254
+ 'ThemeURI' => $theme->ThemeURI,
255
+ 'Description' => $theme->Description,
256
+ 'Author' => $theme->Author,
257
+ 'Version' => $theme->Version,
258
+ 'get_template_directory' => $theme->get_template_directory(),
259
+ ),
260
+ ));
261
+ }
262
+ }
263
+ }
264
+
265
+ /**
266
+ * Activated a theme.
267
+ * @param string $themeName name
268
+ */
269
+ public function EventThemeActivated($themeName)
270
+ {
271
+ $theme = null;
272
+ foreach (wp_get_themes() as $item) {
273
+ if ($item->Name == $themeName) {
274
+ $theme = $item;
275
+ break;
276
+ }
277
+ }
278
+ if ($theme == null) {
279
+ return $this->LogError(
280
+ 'Could not locate theme named "' . $theme . '".',
281
+ array('ThemeName' => $themeName, 'Themes' => wp_get_themes())
282
+ );
283
+ }
284
+ $this->plugin->alerts->Trigger(5006, array(
285
+ 'Theme' => (object)array(
286
+ 'Name' => $theme->Name,
287
+ 'ThemeURI' => $theme->ThemeURI,
288
+ 'Description' => $theme->Description,
289
+ 'Author' => $theme->Author,
290
+ 'Version' => $theme->Version,
291
+ 'get_template_directory' => $theme->get_template_directory(),
292
+ ),
293
+ ));
294
+ }
295
+
296
+ /**
297
+ * Plugin creates/modifies posts.
298
+ *
299
+ * @param int $post_id - Post ID.
300
+ * @param object $post - Post object.
301
+ */
302
+ public function EventPluginPostCreate( $post_id, $post ) {
303
+ $WPActions = array( 'editpost', 'heartbeat', 'inline-save', 'trash', 'untrash' );
304
+ if ( isset( $_REQUEST['action'] ) && ! in_array( $_REQUEST['action'], $WPActions ) ) {
305
+ if ( ! in_array( $post->post_type, array( 'attachment', 'revision', 'nav_menu_item', 'customize_changeset', 'custom_css' ) )
306
+ || ! empty( $post->post_title ) ) {
307
+ // If the plugin modify the post.
308
+ if ( false !== strpos( $_REQUEST['action'], 'edit' ) ) {
309
+ $event = $this->GetEventTypeForPostType( $post, 2106, 2107, 2108 );
310
+ $editorLink = $this->GetEditorLink( $post );
311
+ $this->plugin->alerts->Trigger( $event, array(
312
+ 'PostID' => $post->ID,
313
+ 'PostType' => $post->post_type,
314
+ 'PostTitle' => $post->post_title,
315
+ $editorLink['name'] => $editorLink['value'],
316
+ ) );
317
+ } else {
318
+ $event = $this->GetEventTypeForPostType( $post, 5019, 5020, 5021 );
319
+ $this->plugin->alerts->Trigger( $event, array(
320
+ 'PostID' => $post->ID,
321
+ 'PostType' => $post->post_type,
322
+ 'PostTitle' => $post->post_title,
323
+ 'Username' => 'Plugins',
324
+ ) );
325
+ }
326
+ }
327
+ }
328
+ }
329
+
330
+ /**
331
+ * Plugin deletes posts.
332
+ *
333
+ * @param integer $post_id - Post ID.
334
+ */
335
+ public function EventPluginPostDelete( $post_id ) {
336
+ if ( empty( $_REQUEST['action'] ) && isset( $_REQUEST['page'] ) ) {
337
+ $post = get_post( $post_id );
338
+ if ( ! in_array( $post->post_type, array( 'attachment', 'revision', 'nav_menu_item', 'customize_changeset', 'custom_css' ) )
339
+ || ! empty( $post->post_title ) ) {
340
+ $event = $this->GetEventTypeForPostType( $post, 5025, 5026, 5027 );
341
+ $this->plugin->alerts->Trigger($event, array(
342
+ 'PostID' => $post->ID,
343
+ 'PostType' => $post->post_type,
344
+ 'PostTitle' => $post->post_title,
345
+ 'Username' => 'Plugins',
346
+ ) );
347
+ }
348
+ }
349
+ }
350
+
351
+ /**
352
+ * Get removed themes.
353
+ * @return array of WP_Theme objects
354
+ */
355
+ protected function GetRemovedThemes()
356
+ {
357
+ $result = $this->old_themes;
358
+ foreach ($result as $i => $theme) {
359
+ if (file_exists($theme->get_template_directory())) {
360
+ unset($result[$i]);
361
+ }
362
+ }
363
+ return array_values($result);
364
+ }
365
+
366
+ /**
367
+ * Get event code by post type.
368
+ */
369
+ protected function GetEventTypeForPostType( $post, $typePost, $typePage, $typeCustom ) {
370
+ if ( empty( $post ) || ! isset( $post->post_type ) ) {
371
+ return false;
372
+ }
373
+
374
+ switch ( $post->post_type ) {
375
+ case 'page':
376
+ return $typePage;
377
+ case 'post':
378
+ return $typePost;
379
+ default:
380
+ return $typeCustom;
381
+ }
382
+ }
383
+
384
+ /**
385
+ * Get editor link.
386
+ *
387
+ * @param object $post - The post object.
388
+ * @return array $aLink name and value link.
389
+ */
390
+ private function GetEditorLink( $post ) {
391
+ $name = 'EditorLink';
392
+ $name .= ( $post->post_type == 'page' ) ? 'Page' : 'Post' ;
393
+ $value = get_edit_post_link( $post->ID );
394
+ $aLink = array(
395
+ 'name' => $name,
396
+ 'value' => $value,
397
+ );
398
+ return $aLink;
399
+ }
400
  }
classes/Settings.php CHANGED
@@ -6,955 +6,985 @@
6
  */
7
  class WSAL_Settings
8
  {
9
- /**
10
- * @var WpSecurityAuditLog
11
- */
12
- protected $_plugin;
13
-
14
- // <editor-fold desc="Developer Options">
15
- const OPT_DEV_DATA_INSPECTOR = 'd';
16
- const OPT_DEV_PHP_ERRORS = 'p';
17
- const OPT_DEV_REQUEST_LOG = 'r';
18
- const OPT_DEV_BACKTRACE_LOG = 'b';
19
-
20
- const ERROR_CODE_INVALID_IP = 901;
21
-
22
- protected $_devoption = null;
23
-
24
- protected $_pruning = 0;
25
-
26
- protected $_disabled = null;
27
-
28
- protected $_viewers = null;
29
-
30
- protected $_editors = null;
31
-
32
- protected $_perpage = null;
33
-
34
- /**
35
- * Users excluded from monitoring
36
- */
37
- protected $_excluded_users = array();
38
-
39
- /**
40
- * Roles excluded from monitoring
41
- */
42
- protected $_excluded_roles = array();
43
-
44
- /**
45
- * Custom fields excluded from monitoring
46
- */
47
- protected $_excluded_custom = array();
48
-
49
- /**
50
- * IP excluded from monitoring
51
- */
52
- protected $_excluded_ip = array();
53
-
54
- public function __construct(WpSecurityAuditLog $plugin)
55
- {
56
- $this->_plugin = $plugin;
57
- }
58
-
59
- /**
60
- * @return array Array of developer options to be enabled by default.
61
- */
62
- public function GetDefaultDevOptions()
63
- {
64
- return array();
65
- }
66
-
67
- /**
68
- * Returns whether a developer option is enabled or not.
69
- * @param string $option See self::OPT_DEV_* constants.
70
- * @return boolean If option is enabled or not.
71
- */
72
- public function IsDevOptionEnabled($option)
73
- {
74
- if (is_null($this->_devoption)) {
75
- $this->_devoption = $this->_plugin->GetGlobalOption(
76
- 'dev-options',
77
- implode(',', $this->GetDefaultDevOptions())
78
- );
79
- $this->_devoption = explode(',', $this->_devoption);
80
- }
81
- return in_array($option, $this->_devoption);
82
- }
83
-
84
- /**
85
- * @return boolean Whether any developer option has been enabled or not.
86
- */
87
- public function IsAnyDevOptionEnabled()
88
- {
89
- return !!$this->_plugin->GetGlobalOption('dev-options', null);
90
- }
91
-
92
- /**
93
- * Sets whether a developer option is enabled or not.
94
- * @param string $option See self::OPT_DEV_* constants.
95
- * @param boolean $enabled If option should be enabled or not.
96
- */
97
- public function SetDevOptionEnabled($option, $enabled)
98
- {
99
- // make sure options have been loaded
100
- $this->IsDevOptionEnabled('');
101
- // remove option if it exists
102
- while (($p = array_search($option, $this->_devoption)) !== false) {
103
- unset($this->_devoption[$p]);
104
- }
105
- // add option if callee wants it enabled
106
- if ($enabled) {
107
- $this->_devoption[] = $option;
108
- }
109
- // commit option
110
- $this->_plugin->SetGlobalOption(
111
- 'dev-options',
112
- implode(',', $this->_devoption)
113
- );
114
- }
115
-
116
- /**
117
- * Remove all enabled developer options.
118
- */
119
- public function ClearDevOptions()
120
- {
121
- $this->_devoption = array();
122
- $this->_plugin->SetGlobalOption('dev-options', '');
123
- }
124
-
125
- /**
126
- * @return boolean Whether to enable data inspector or not.
127
- */
128
- public function IsDataInspectorEnabled()
129
- {
130
- return $this->IsDevOptionEnabled(self::OPT_DEV_DATA_INSPECTOR);
131
- }
132
-
133
- /**
134
- * @return boolean Whether to PHP error logging or not.
135
- */
136
- public function IsPhpErrorLoggingEnabled()
137
- {
138
- return $this->IsDevOptionEnabled(self::OPT_DEV_PHP_ERRORS);
139
- }
140
-
141
- /**
142
- * @return boolean Whether to log requests to file or not.
143
- */
144
- public function IsRequestLoggingEnabled()
145
- {
146
- return $this->IsDevOptionEnabled(self::OPT_DEV_REQUEST_LOG);
147
- }
148
-
149
- /**
150
- * @return boolean Whether to store debug backtrace for PHP alerts or not.
151
- */
152
- public function IsBacktraceLoggingEnabled()
153
- {
154
- return $this->IsDevOptionEnabled(self::OPT_DEV_BACKTRACE_LOG);
155
- }
156
-
157
- // </editor-fold>
158
-
159
- /**
160
- * @return boolean Whether dashboard widgets are enabled or not.
161
- */
162
- public function IsWidgetsEnabled()
163
- {
164
- return !$this->_plugin->GetGlobalOption('disable-widgets');
165
- }
166
-
167
- /**
168
- * @param boolean $newvalue Whether dashboard widgets are enabled or not.
169
- */
170
- public function SetWidgetsEnabled($newvalue)
171
- {
172
- $this->_plugin->SetGlobalOption('disable-widgets', !$newvalue);
173
- }
174
-
175
- /**
176
- * @return boolean Whether alerts in audit log view refresh automatically or not.
177
- */
178
- public function IsRefreshAlertsEnabled()
179
- {
180
- return !$this->_plugin->GetGlobalOption('disable-refresh');
181
- }
182
-
183
- /**
184
- * @param boolean $newvalue Whether alerts in audit log view refresh automatically or not.
185
- */
186
- public function SetRefreshAlertsEnabled($newvalue)
187
- {
188
- $this->_plugin->SetGlobalOption('disable-refresh', !$newvalue);
189
- }
190
-
191
- /**
192
- * @return int Maximum number of alerts to show in dashboard widget.
193
- */
194
- public function GetDashboardWidgetMaxAlerts()
195
- {
196
- return 5;
197
- }
198
-
199
- // <editor-fold desc="Pruning Settings">
200
- /**
201
- * @return int The maximum number of alerts allowable.
202
- */
203
- public function GetMaxAllowedAlerts()
204
- {
205
- return 5000;
206
- }
207
-
208
- /**
209
- * @return string The default pruning date.
210
- */
211
- public function GetDefaultPruningDate()
212
- {
213
- return '1 month';
214
- }
215
-
216
- /**
217
- * @return string The current pruning date.
218
- */
219
- public function GetPruningDate()
220
- {
221
- if (!$this->_pruning) {
222
- $this->_pruning = $this->_plugin->GetGlobalOption('pruning-date');
223
- if (!strtotime($this->_pruning)) {
224
- $this->_pruning = $this->GetDefaultPruningDate();
225
- }
226
- }
227
- return $this->_pruning;
228
- }
229
-
230
- /**
231
- * @param string $newvalue The new pruning date.
232
- */
233
- public function SetPruningDate($newvalue)
234
- {
235
- if (strtotime($newvalue)) {
236
- $this->_plugin->SetGlobalOption('pruning-date', $newvalue);
237
- $this->_pruning = $newvalue;
238
- }
239
- }
240
-
241
- /**
242
- * @return integer Maximum number of alerts to keep.
243
- */
244
- public function GetPruningLimit()
245
- {
246
- $val = (int)$this->_plugin->GetGlobalOption('pruning-limit');
247
- return $val ? $val : $this->GetMaxAllowedAlerts();
248
- }
249
-
250
- /**
251
- * @param integer $newvalue The new maximum number of alerts.
252
- */
253
- public function SetPruningLimit($newvalue)
254
- {
255
- $newvalue = max(/*min(*/(int)$newvalue/*, $this->GetMaxAllowedAlerts())*/, 1);
256
- $this->_plugin->SetGlobalOption('pruning-limit', $newvalue);
257
- }
258
-
259
- public function SetPruningDateEnabled($enabled)
260
- {
261
- $this->_plugin->SetGlobalOption('pruning-date-e', $enabled);
262
- }
263
-
264
- public function SetPruningLimitEnabled($enabled)
265
- {
266
- $this->_plugin->SetGlobalOption('pruning-limit-e', $enabled);
267
- }
268
-
269
- public function IsPruningDateEnabled(){
270
- return $this->_plugin->GetGlobalOption('pruning-date-e');
271
- }
272
-
273
- public function IsPruningLimitEnabled()
274
- {
275
- return $this->_plugin->GetGlobalOption('pruning-limit-e');
276
- }
277
-
278
- public function IsRestrictAdmins()
279
- {
280
- return $this->_plugin->GetGlobalOption('restrict-admins', false);
281
- }
282
-
283
- /**
284
- * @deprecated Sandbox functionality is now in an external plugin.
285
- */
286
- public function IsSandboxPageEnabled()
287
- {
288
- $plugins = $this->_plugin->licensing->plugins();
289
- return isset($plugins['wsal-sandbox-extensionphp']);
290
- }
291
-
292
- public function SetRestrictAdmins($enable)
293
- {
294
- $this->_plugin->SetGlobalOption('restrict-admins', (bool)$enable);
295
- }
296
-
297
- // </editor-fold>
298
- public function GetDefaultDisabledAlerts()
299
- {
300
- return array(0000, 0001, 0002, 0003, 0004, 0005);
301
- }
302
-
303
- /**
304
- * @return array IDs of disabled alerts.
305
- */
306
- public function GetDisabledAlerts()
307
- {
308
- if (!$this->_disabled) {
309
- $this->_disabled = implode(',', $this->GetDefaultDisabledAlerts());
310
- $this->_disabled = $this->_plugin->GetGlobalOption('disabled-alerts', $this->_disabled);
311
- $this->_disabled = ($this->_disabled == '') ? array() : explode(',', $this->_disabled);
312
- $this->_disabled = array_map('intval', $this->_disabled);
313
- }
314
- return $this->_disabled;
315
- }
316
-
317
- /**
318
- * @param array $types IDs alerts to disable.
319
- */
320
- public function SetDisabledAlerts($types)
321
- {
322
- $this->_disabled = array_unique(array_map('intval', $types));
323
- $this->_plugin->SetGlobalOption('disabled-alerts', implode(',', $this->_disabled));
324
- }
325
-
326
- public function IsIncognito()
327
- {
328
- return $this->_plugin->GetGlobalOption('hide-plugin');
329
- }
330
-
331
- public function SetIncognito($enabled)
332
- {
333
- return $this->_plugin->SetGlobalOption('hide-plugin', $enabled);
334
- }
335
-
336
- /**
337
- * Checking if Logging is enabled.
338
- */
339
- public function IsLoggingDisabled()
340
- {
341
- return $this->_plugin->GetGlobalOption('disable-logging');
342
- }
343
-
344
- public function SetLoggingDisabled($disabled)
345
- {
346
- return $this->_plugin->SetGlobalOption('disable-logging', $disabled);
347
- }
348
-
349
- /**
350
- * Checking if the data will be removed.
351
- */
352
- public function IsDeleteData()
353
- {
354
- return $this->_plugin->GetGlobalOption('delete-data');
355
- }
356
-
357
- public function SetDeleteData($enabled)
358
- {
359
- return $this->_plugin->SetGlobalOption('delete-data', $enabled);
360
- }
361
-
362
- // <editor-fold desc="Access Control">
363
-
364
- public function SetAllowedPluginViewers($usersOrRoles)
365
- {
366
- $this->_viewers = $usersOrRoles;
367
- $this->_plugin->SetGlobalOption('plugin-viewers', implode(',', $this->_viewers));
368
- }
369
-
370
- public function GetAllowedPluginViewers()
371
- {
372
- if (is_null($this->_viewers)) {
373
- $this->_viewers = array_unique(array_filter(explode(',', $this->_plugin->GetGlobalOption('plugin-viewers'))));
374
- }
375
- return $this->_viewers;
376
- }
377
-
378
- public function SetAllowedPluginEditors($usersOrRoles)
379
- {
380
- $this->_editors = $usersOrRoles;
381
- $this->_plugin->SetGlobalOption('plugin-editors', implode(',', $this->_editors));
382
- }
383
-
384
- public function GetAllowedPluginEditors()
385
- {
386
- if (is_null($this->_editors)) {
387
- $this->_editors = array_unique(array_filter(explode(',', $this->_plugin->GetGlobalOption('plugin-editors'))));
388
- }
389
- return $this->_editors;
390
- }
391
-
392
- public function SetViewPerPage($newvalue)
393
- {
394
- $this->_perpage = max($newvalue, 1);
395
- $this->_plugin->SetGlobalOption('items-per-page', $this->_perpage);
396
- }
397
-
398
- public function GetViewPerPage()
399
- {
400
- if (is_null($this->_perpage)) {
401
- $this->_perpage = (int)$this->_plugin->GetGlobalOption('items-per-page', 10);
402
- }
403
- return $this->_perpage;
404
- }
405
-
406
- /**
407
- * @param string $action Type of action, either 'view' or 'edit'.
408
- * @return boolean If user has access or not.
409
- */
410
- public function CurrentUserCan($action)
411
- {
412
- return $this->UserCan(wp_get_current_user(), $action);
413
- }
414
-
415
- /**
416
- * @return string[] List of superadmin usernames.
417
- */
418
- protected function GetSuperAdmins()
419
- {
420
- return $this->_plugin->IsMultisite() ? get_super_admins() : array();
421
- }
422
-
423
- /**
424
- * @return string[] List of admin usernames.
425
- */
426
- protected function GetAdmins()
427
- {
428
- if ($this->_plugin->IsMultisite()) {
429
- // see: https://gist.github.com/1508426/65785a15b8638d43a9905effb59e4d97319ef8f8
430
- global $wpdb;
431
- $cap = $wpdb->prefix."capabilities";
432
- $sql = "SELECT DISTINCT $wpdb->users.user_login"
433
- . " FROM $wpdb->users"
434
- . " INNER JOIN $wpdb->usermeta ON ($wpdb->users.ID = $wpdb->usermeta.user_id )"
435
- . " WHERE $wpdb->usermeta.meta_key = '$cap'"
436
- . " AND CAST($wpdb->usermeta.meta_value AS CHAR) LIKE '%\"administrator\"%'";
437
- return $wpdb->get_col($sql);
438
- } else {
439
- $result = array();
440
- $query = 'role=administrator&fields[]=user_login';
441
- foreach (get_users($query) as $user) {
442
- $result[] = $user->user_login;
443
- }
444
- return $result;
445
- }
446
- }
447
-
448
- /**
449
- * Returns access tokens for a particular action.
450
- * @param string $action Type of action.
451
- * @return string[] List of tokens (usernames, roles etc).
452
- */
453
- public function GetAccessTokens($action)
454
- {
455
- $allowed = array();
456
- switch ($action) {
457
- case 'view':
458
- $allowed = $this->GetAllowedPluginViewers();
459
- $allowed = array_merge($allowed, $this->GetAllowedPluginEditors());
460
- if (!$this->IsRestrictAdmins()) {
461
- $allowed = array_merge($allowed, $this->GetSuperAdmins());
462
- $allowed = array_merge($allowed, $this->GetAdmins());
463
- }
464
- break;
465
- case 'edit':
466
- $allowed = $this->GetAllowedPluginEditors();
467
- if (!$this->IsRestrictAdmins()) {
468
- $allowed = array_merge($allowed, $this->_plugin->IsMultisite() ? $this->GetSuperAdmins() : $this->GetAdmins());
469
- }
470
- break;
471
- default:
472
- throw new Exception('Unknown action "'.$action.'".');
473
- }
474
- if (!$this->IsRestrictAdmins()) {
475
- if (is_multisite()) {
476
- $allowed = array_merge($allowed, get_super_admins());
477
- } else {
478
- $allowed[] = 'administrator';
479
- }
480
- }
481
- return array_unique($allowed);
482
- }
483
-
484
- /**
485
- * @param integer|WP_user $user User object to check.
486
- * @param string $action Type of action, either 'view' or 'edit'.
487
- * @return boolean If user has access or not.
488
- */
489
- public function UserCan($user, $action)
490
- {
491
- if (is_int($user)) {
492
- $user = get_userdata($user);
493
- }
494
- $allowed = $this->GetAccessTokens($action);
495
- $check = array_merge($user->roles, array($user->user_login));
496
- foreach ($check as $item) {
497
- if (in_array($item, $allowed)) {
498
- return true;
499
- }
500
- }
501
- return false;
502
- }
503
-
504
- public function GetCurrentUserRoles($baseRoles = null)
505
- {
506
- if ($baseRoles == null) {
507
- $baseRoles = wp_get_current_user()->roles;
508
- }
509
- if (function_exists('is_super_admin') && is_super_admin()) {
510
- $baseRoles[] = 'superadmin';
511
- }
512
- return $baseRoles;
513
- }
514
-
515
- public function IsLoginSuperAdmin($username)
516
- {
517
- $userId = username_exists($username);
518
- if (function_exists('is_super_admin') && is_super_admin($userId)) {
519
- return true;
520
- } else {
521
- return false;
522
- }
523
- }
524
-
525
- // </editor-fold>
526
-
527
- // <editor-fold desc="Licensing">
528
- public function GetLicenses()
529
- {
530
- return $this->_plugin->GetGlobalOption('licenses');
531
- }
532
-
533
- public function GetLicense($name)
534
- {
535
- $data = $this->GetLicenses();
536
- $name = sanitize_key(basename($name));
537
- return isset($data[$name]) ? $data[$name] : array();
538
- }
539
-
540
- public function SetLicenses($data)
541
- {
542
- $this->_plugin->SetGlobalOption('licenses', $data);
543
- }
544
-
545
- public function GetLicenseKey($name)
546
- {
547
- $data = $this->GetLicense($name);
548
- return isset($data['key']) ? $data['key'] : '';
549
- }
550
-
551
- public function GetLicenseStatus($name){
552
- $data = $this->GetLicense($name);
553
- return isset($data['sts']) ? $data['sts'] : '';
554
- }
555
-
556
- public function GetLicenseErrors($name)
557
- {
558
- $data = $this->GetLicense($name);
559
- return isset($data['err']) ? $data['err'] : '';
560
- }
561
-
562
- public function SetLicenseKey($name, $key)
563
- {
564
- $data = $this->GetLicenses();
565
- if (!isset($data[$name])) {
566
- $data[$name] = array();
567
- }
568
- $data[$name]['key'] = $key;
569
- $this->SetLicenses($data);
570
- }
571
-
572
- public function SetLicenseStatus($name, $status)
573
- {
574
- $data = $this->GetLicenses();
575
- if (!isset($data[$name])) {
576
- $data[$name] = array();
577
- }
578
- $data[$name]['sts'] = $status;
579
- $this->SetLicenses($data);
580
- }
581
-
582
- public function SetLicenseErrors($name, $errors)
583
- {
584
- $data = $this->GetLicenses();
585
- if (!isset($data[$name])) {
586
- $data[$name] = array();
587
- }
588
- $data[$name]['err'] = $errors;
589
- $this->SetLicenses($data);
590
- }
591
-
592
- public function ClearLicenses()
593
- {
594
- $this->SetLicenses(array());
595
- }
596
-
597
- // </editor-fold>
598
- // <editor-fold desc="Client IP Retrieval">
599
-
600
- public function IsMainIPFromProxy()
601
- {
602
- return $this->_plugin->GetGlobalOption('use-proxy-ip');
603
- }
604
-
605
- public function SetMainIPFromProxy($enabled)
606
- {
607
- return $this->_plugin->SetGlobalOption('use-proxy-ip', $enabled);
608
- }
609
-
610
- public function IsInternalIPsFiltered()
611
- {
612
- return $this->_plugin->GetGlobalOption('filter-internal-ip');
613
- }
614
-
615
- public function SetInternalIPsFiltering($enabled)
616
- {
617
- return $this->_plugin->SetGlobalOption('filter-internal-ip', $enabled);
618
- }
619
-
620
- public function GetMainClientIP()
621
- {
622
- $result = null;
623
- if ($this->IsMainIPFromProxy()) {
624
- // TODO the algorithm below just gets the first IP in the list...we might want to make this more intelligent somehow
625
- $result = $this->GetClientIPs();
626
- $result = reset($result);
627
- $result = isset($result[0]) ? $result[0] : null;
628
- } elseif (isset($_SERVER['REMOTE_ADDR'])) {
629
- $result = $this->NormalizeIP($_SERVER['REMOTE_ADDR']);
630
- if (!$this->ValidateIP($result)) {
631
- $result = "Error " . self::ERROR_CODE_INVALID_IP . ": Invalid IP Address";
632
- }
633
- }
634
- return $result;
635
- }
636
-
637
- public function GetClientIPs()
638
- {
639
- $ips = array();
640
- foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) {
641
- if (isset($_SERVER[$key])) {
642
- $ips[$key] = array();
643
- foreach (explode(',', $_SERVER[$key]) as $ip) {
644
- if ($this->ValidateIP($ip = $this->NormalizeIP($ip))) {
645
- $ips[$key][] = $ip;
646
- }
647
- }
648
- }
649
- }
650
- return $ips;
651
- }
652
-
653
- protected function NormalizeIP($ip)
654
- {
655
- $ip = trim($ip);
656
- if (strpos($ip, ':') !== false && substr_count($ip, '.') == 3 && strpos($ip, '[') === false) {
657
- // IPv4 with a port (eg: 11.22.33.44:80)
658
- $ip = explode(':', $ip);
659
- $ip = $ip[0];
660
- } else {
661
- // IPv6 with a port (eg: [::1]:80)
662
- $ip = explode(']', $ip);
663
- $ip = ltrim($ip[0], '[');
664
- }
665
- return $ip;
666
- }
667
-
668
- protected function ValidateIP($ip)
669
- {
670
- $opts = FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6;
671
- if ($this->IsInternalIPsFiltered()) {
672
- $opts = $opts | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE;
673
- }
674
- $filteredIP = filter_var($ip, FILTER_VALIDATE_IP, $opts);
675
- if (!$filteredIP || empty($filteredIP)) {
676
- //Regex IPV4
677
- if (preg_match("/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/", $ip)) {
678
- return $ip;
679
- }
680
- //Regex IPV6
681
- elseif (preg_match("/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/", $ip)) {
682
- return $ip;
683
- }
684
- if (!$this->IsLoggingDisabled) {
685
- error_log("Invalid IP in ValidateIP function: ".$ip);
686
- }
687
- return false;
688
- } else {
689
- return $filteredIP;
690
- }
691
- }
692
-
693
- /**
694
- * Users excluded from monitoring
695
- */
696
- public function SetExcludedMonitoringUsers($users)
697
- {
698
- $this->_excluded_users = $users;
699
- $this->_plugin->SetGlobalOption('excluded-users', esc_html(implode(',', $this->_excluded_users)));
700
- }
701
-
702
- public function GetExcludedMonitoringUsers()
703
- {
704
- if (empty($this->_excluded_users)) {
705
- $this->_excluded_users = array_unique(array_filter(explode(',', $this->_plugin->GetGlobalOption('excluded-users'))));
706
- }
707
- return $this->_excluded_users;
708
- }
709
-
710
- /**
711
- * Roles excluded from monitoring
712
- */
713
- public function SetExcludedMonitoringRoles($roles)
714
- {
715
- $this->_excluded_roles = $roles;
716
- $this->_plugin->SetGlobalOption('excluded-roles', esc_html(implode(',', $this->_excluded_roles)));
717
- }
718
-
719
- public function GetExcludedMonitoringRoles()
720
- {
721
- if (empty($this->_excluded_roles)) {
722
- $this->_excluded_roles = array_unique(array_filter(explode(',', $this->_plugin->GetGlobalOption('excluded-roles'))));
723
- }
724
- return $this->_excluded_roles;
725
- }
726
-
727
- /**
728
- * Custom fields excluded from monitoring
729
- */
730
- public function SetExcludedMonitoringCustom($custom)
731
- {
732
- $this->_excluded_custom = $custom;
733
- $this->_plugin->SetGlobalOption('excluded-custom', esc_html(implode(',', $this->_excluded_custom)));
734
- }
735
-
736
- public function GetExcludedMonitoringCustom()
737
- {
738
- if (empty($this->_excluded_custom)) {
739
- $this->_excluded_custom = array_unique(array_filter(explode(',', $this->_plugin->GetGlobalOption('excluded-custom'))));
740
- asort($this->_excluded_custom);
741
- }
742
- return $this->_excluded_custom;
743
- }
744
-
745
- /**
746
- * IP excluded from monitoring
747
- */
748
- public function SetExcludedMonitoringIP($ip)
749
- {
750
- $this->_excluded_ip = $ip;
751
- $this->_plugin->SetGlobalOption('excluded-ip', esc_html(implode(',', $this->_excluded_ip)));
752
- }
753
-
754
- public function GetExcludedMonitoringIP()
755
- {
756
- if (empty($this->_excluded_ip)) {
757
- $this->_excluded_ip = array_unique(array_filter(explode(',', $this->_plugin->GetGlobalOption('excluded-ip'))));
758
- }
759
- return $this->_excluded_ip;
760
- }
761
-
762
- /**
763
- * Datetime used in the Alerts.
764
- */
765
- public function GetDatetimeFormat($lineBreak = true)
766
- {
767
- if ($lineBreak) {
768
- $date_time_format = $this->GetDateFormat() . '<\b\r>' . $this->GetTimeFormat();
769
- } else {
770
- $date_time_format = $this->GetDateFormat() . ' ' . $this->GetTimeFormat();
771
- }
772
-
773
- $wp_time_format = get_option('time_format');
774
- if (stripos($wp_time_format, 'A') !== false) {
775
- $date_time_format .= '.$$$&\n\b\s\p;A';
776
- } else {
777
- $date_time_format .= '.$$$';
778
- }
779
- return $date_time_format;
780
- }
781
-
782
- /**
783
- * Date Format from WordPress General Settings.
784
- */
785
- public function GetDateFormat()
786
- {
787
- $wp_date_format = get_option('date_format');
788
- $search = array('F', 'M', 'n', 'j', ' ', '/', 'y', 'S', ',', 'l', 'D');
789
- $replace = array('m', 'm', 'm', 'd', '-', '-', 'Y', '', '', '', '');
790
- $date_format = str_replace($search, $replace, $wp_date_format);
791
- return $date_format;
792
- }
793
-
794
- /**
795
- * Time Format from WordPress General Settings.
796
- */
797
- public function GetTimeFormat()
798
- {
799
- $wp_time_format = get_option('time_format');
800
- $search = array('a', 'A', 'T', ' ');
801
- $replace = array('', '', '', '');
802
- $time_format = str_replace($search, $replace, $wp_time_format);
803
- return $time_format;
804
- }
805
-
806
- /**
807
- * Alerts Timestamp
808
- * Server's timezone or WordPress' timezone
809
- */
810
- public function GetTimezone()
811
- {
812
- return $this->_plugin->GetGlobalOption('timezone', 0);
813
- }
814
-
815
- public function SetTimezone($newvalue)
816
- {
817
- return $this->_plugin->SetGlobalOption('timezone', $newvalue);
818
- }
819
-
820
- /**
821
- * Get type of username to display
822
- */
823
- public function get_type_username() {
824
- return $this->_plugin->GetGlobalOption( 'type_username', 'display_name' );
825
- }
826
-
827
- /**
828
- * Set type of username to display
829
- *
830
- * @param string $newvalue - New value variable.
831
- * @since 2.6.5
832
- */
833
- public function set_type_username( $newvalue ) {
834
- return $this->_plugin->SetGlobalOption( 'type_username', $newvalue );
835
- }
836
-
837
- public function GetAdapterConfig($name_field)
838
- {
839
- return $this->_plugin->GetGlobalOption($name_field);
840
- }
841
-
842
- public function SetAdapterConfig($name_field, $newvalue)
843
- {
844
- return $this->_plugin->SetGlobalOption($name_field, trim($newvalue));
845
- }
846
-
847
- public function GetColumns()
848
- {
849
- $columns = array('alert_code' => '1', 'type' => '1', 'date' => '1', 'username' => '1', 'source_ip' => '1', 'message' => '1');
850
- if ($this->_plugin->IsMultisite()) {
851
- $columns = array_slice($columns, 0, 5, true) + array('site' => '1') + array_slice($columns, 5, null, true);
852
- }
853
- $selected = $this->GetColumnsSelected();
854
- if (!empty($selected)) {
855
- $columns = array('alert_code' => '0', 'type' => '0', 'date' => '0', 'username' => '0', 'source_ip' => '0', 'message' => '0');
856
- if ($this->_plugin->IsMultisite()) {
857
- $columns = array_slice($columns, 0, 5, true) + array('site' => '0') + array_slice($columns, 5, null, true);
858
- }
859
- $selected = (array)json_decode($selected);
860
- $columns = array_merge($columns, $selected);
861
- return $columns;
862
- } else {
863
- return $columns;
864
- }
865
- }
866
-
867
- public function GetColumnsSelected()
868
- {
869
- return $this->_plugin->GetGlobalOption('columns');
870
- }
871
-
872
- public function SetColumns($columns)
873
- {
874
- return $this->_plugin->SetGlobalOption('columns', json_encode($columns));
875
- }
876
-
877
- public function IsWPBackend()
878
- {
879
- return $this->_plugin->GetGlobalOption('wp-backend');
880
- }
881
-
882
- public function SetWPBackend($enabled)
883
- {
884
- return $this->_plugin->SetGlobalOption('wp-backend', $enabled);
885
- }
886
-
887
- public function SetFromEmail($email_address)
888
- {
889
- return $this->_plugin->SetGlobalOption('from-email', trim($email_address));
890
- }
891
-
892
- public function GetFromEmail()
893
- {
894
- return $this->_plugin->GetGlobalOption('from-email');
895
- }
896
-
897
- public function SetDisplayName($display_name)
898
- {
899
- return $this->_plugin->SetGlobalOption('display-name', trim($display_name));
900
- }
901
-
902
- public function GetDisplayName()
903
- {
904
- return $this->_plugin->GetGlobalOption('display-name');
905
- }
906
-
907
- public function Set404LogLimit($value)
908
- {
909
- return $this->_plugin->SetGlobalOption('log-404-limit', abs($value));
910
- }
911
-
912
- public function Get404LogLimit()
913
- {
914
- return $this->_plugin->GetGlobalOption('log-404-limit', 99);
915
- }
916
-
917
- /**
918
- * Sets the 404 log limit for visitor.
919
- *
920
- * @param int $value - 404 log limit.
921
- * @since 2.6.3
922
- */
923
- public function SetVisitor404LogLimit( $value ) {
924
- return $this->_plugin->SetGlobalOption( 'log-visitor-404-limit', abs( $value ) );
925
- }
926
-
927
- /**
928
- * Get the 404 log limit for visitor.
929
- *
930
- * @since 2.6.3
931
- */
932
- public function GetVisitor404LogLimit() {
933
- return $this->_plugin->GetGlobalOption( 'log-visitor-404-limit', 99 );
934
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
935
 
936
  /*============================== Support Archive Database ==============================*/
937
 
938
- public function IsArchivingEnabled()
939
- {
940
- return $this->_plugin->GetGlobalOption('archiving-e');
941
- }
942
-
943
- /**
944
- * Switch to Archive DB if is enabled
945
- */
946
- public function SwitchToArchiveDB()
947
- {
948
- if ($this->IsArchivingEnabled()) {
949
- $archiveType = $this->_plugin->GetGlobalOption('archive-type');
950
- $archiveUser = $this->_plugin->GetGlobalOption('archive-user');
951
- $password = $this->_plugin->GetGlobalOption('archive-password');
952
- $archiveName = $this->_plugin->GetGlobalOption('archive-name');
953
- $archiveHostname = $this->_plugin->GetGlobalOption('archive-hostname');
954
- $archiveBasePrefix = $this->_plugin->GetGlobalOption('archive-base-prefix');
955
- $config = WSAL_Connector_ConnectorFactory::GetConfigArray($archiveType, $archiveUser, $password, $archiveName, $archiveHostname, $archiveBasePrefix);
956
- $this->_plugin->getConnector($config)->getAdapter('Occurrence');
957
- }
958
- }
959
- // </editor-fold>
960
  }
6
  */
7
  class WSAL_Settings
8
  {
9
+ /**
10
+ * @var WpSecurityAuditLog
11
+ */
12
+ protected $_plugin;
13
+
14
+ // <editor-fold desc="Developer Options">
15
+ const OPT_DEV_DATA_INSPECTOR = 'd';
16
+ const OPT_DEV_PHP_ERRORS = 'p';
17
+ const OPT_DEV_REQUEST_LOG = 'r';
18
+ const OPT_DEV_BACKTRACE_LOG = 'b';
19
+
20
+ const ERROR_CODE_INVALID_IP = 901;
21
+
22
+ protected $_devoption = null;
23
+
24
+ protected $_pruning = 0;
25
+
26
+ protected $_disabled = null;
27
+
28
+ protected $_viewers = null;
29
+
30
+ protected $_editors = null;
31
+
32
+ protected $_perpage = null;
33
+
34
+ /**
35
+ * Users excluded from monitoring
36
+ */
37
+ protected $_excluded_users = array();
38
+
39
+ /**
40
+ * Roles excluded from monitoring
41
+ */
42
+ protected $_excluded_roles = array();
43
+
44
+ /**
45
+ * Custom fields excluded from monitoring
46
+ */
47
+ protected $_excluded_custom = array();
48
+
49
+ /**
50
+ * Custom Post Types excluded from monitoring.
51
+ *
52
+ * @var array
53
+ */
54
+ protected $_post_types = array();
55
+
56
+ /**
57
+ * IP excluded from monitoring
58
+ */
59
+ protected $_excluded_ip = array();
60
+
61
+ public function __construct(WpSecurityAuditLog $plugin)
62
+ {
63
+ $this->_plugin = $plugin;
64
+ }
65
+
66
+ /**
67
+ * @return array Array of developer options to be enabled by default.
68
+ */
69
+ public function GetDefaultDevOptions()
70
+ {
71
+ return array();
72
+ }
73
+
74
+ /**
75
+ * Returns whether a developer option is enabled or not.
76
+ * @param string $option See self::OPT_DEV_* constants.
77
+ * @return boolean If option is enabled or not.
78
+ */
79
+ public function IsDevOptionEnabled($option)
80
+ {
81
+ if (is_null($this->_devoption)) {
82
+ $this->_devoption = $this->_plugin->GetGlobalOption(
83
+ 'dev-options',
84
+ implode(',', $this->GetDefaultDevOptions())
85
+ );
86
+ $this->_devoption = explode(',', $this->_devoption);
87
+ }
88
+ return in_array($option, $this->_devoption);
89
+ }
90
+
91
+ /**
92
+ * @return boolean Whether any developer option has been enabled or not.
93
+ */
94
+ public function IsAnyDevOptionEnabled()
95
+ {
96
+ return !!$this->_plugin->GetGlobalOption('dev-options', null);
97
+ }
98
+
99
+ /**
100
+ * Sets whether a developer option is enabled or not.
101
+ * @param string $option See self::OPT_DEV_* constants.
102
+ * @param boolean $enabled If option should be enabled or not.
103
+ */
104
+ public function SetDevOptionEnabled($option, $enabled)
105
+ {
106
+ // make sure options have been loaded
107
+ $this->IsDevOptionEnabled('');
108
+ // remove option if it exists
109
+ while (($p = array_search($option, $this->_devoption)) !== false) {
110
+ unset($this->_devoption[$p]);
111
+ }
112
+ // add option if callee wants it enabled
113
+ if ($enabled) {
114
+ $this->_devoption[] = $option;
115
+ }
116
+ // commit option
117
+ $this->_plugin->SetGlobalOption(
118
+ 'dev-options',
119
+ implode(',', $this->_devoption)
120
+ );
121
+ }
122
+
123
+ /**
124
+ * Remove all enabled developer options.
125
+ */
126
+ public function ClearDevOptions()
127
+ {
128
+ $this->_devoption = array();
129
+ $this->_plugin->SetGlobalOption('dev-options', '');
130
+ }
131
+
132
+ /**
133
+ * @return boolean Whether to enable data inspector or not.
134
+ */
135
+ public function IsDataInspectorEnabled()
136
+ {
137
+ return $this->IsDevOptionEnabled(self::OPT_DEV_DATA_INSPECTOR);
138
+ }
139
+
140
+ /**
141
+ * @return boolean Whether to PHP error logging or not.
142
+ */
143
+ public function IsPhpErrorLoggingEnabled()
144
+ {
145
+ return $this->IsDevOptionEnabled(self::OPT_DEV_PHP_ERRORS);
146
+ }
147
+
148
+ /**
149
+ * @return boolean Whether to log requests to file or not.
150
+ */
151
+ public function IsRequestLoggingEnabled()
152
+ {
153
+ return $this->IsDevOptionEnabled(self::OPT_DEV_REQUEST_LOG);
154
+ }
155
+
156
+ /**
157
+ * @return boolean Whether to store debug backtrace for PHP alerts or not.
158
+ */
159
+ public function IsBacktraceLoggingEnabled()
160
+ {
161
+ return $this->IsDevOptionEnabled(self::OPT_DEV_BACKTRACE_LOG);
162
+ }
163
+
164
+ // </editor-fold>
165
+
166
+ /**
167
+ * @return boolean Whether dashboard widgets are enabled or not.
168
+ */
169
+ public function IsWidgetsEnabled()
170
+ {
171
+ return !$this->_plugin->GetGlobalOption('disable-widgets');
172
+ }
173
+
174
+ /**
175
+ * @param boolean $newvalue Whether dashboard widgets are enabled or not.
176
+ */
177
+ public function SetWidgetsEnabled($newvalue)
178
+ {
179
+ $this->_plugin->SetGlobalOption('disable-widgets', !$newvalue);
180
+ }
181
+
182
+ /**
183
+ * @return boolean Whether alerts in audit log view refresh automatically or not.
184
+ */
185
+ public function IsRefreshAlertsEnabled()
186
+ {
187
+ return !$this->_plugin->GetGlobalOption('disable-refresh');
188
+ }
189
+
190
+ /**
191
+ * @param boolean $newvalue Whether alerts in audit log view refresh automatically or not.
192
+ */
193
+ public function SetRefreshAlertsEnabled($newvalue)
194
+ {
195
+ $this->_plugin->SetGlobalOption('disable-refresh', !$newvalue);
196
+ }
197
+
198
+ /**
199
+ * @return int Maximum number of alerts to show in dashboard widget.
200
+ */
201
+ public function GetDashboardWidgetMaxAlerts()
202
+ {
203
+ return 5;
204
+ }
205
+
206
+ // <editor-fold desc="Pruning Settings">
207
+ /**
208
+ * @return int The maximum number of alerts allowable.
209
+ */
210
+ public function GetMaxAllowedAlerts()
211
+ {
212
+ return 5000;
213
+ }
214
+
215
+ /**
216
+ * @return string The default pruning date.
217
+ */
218
+ public function GetDefaultPruningDate()
219
+ {
220
+ return '1 month';
221
+ }
222
+
223
+ /**
224
+ * @return string The current pruning date.
225
+ */
226
+ public function GetPruningDate()
227
+ {
228
+ if (!$this->_pruning) {
229
+ $this->_pruning = $this->_plugin->GetGlobalOption('pruning-date');
230
+ if (!strtotime($this->_pruning)) {
231
+ $this->_pruning = $this->GetDefaultPruningDate();
232
+ }
233
+ }
234
+ return $this->_pruning;
235
+ }
236
+
237
+ /**
238
+ * @param string $newvalue The new pruning date.
239
+ */
240
+ public function SetPruningDate($newvalue)
241
+ {
242
+ if (strtotime($newvalue)) {
243
+ $this->_plugin->SetGlobalOption('pruning-date', $newvalue);
244
+ $this->_pruning = $newvalue;
245
+ }
246
+ }
247
+
248
+ /**
249
+ * @return integer Maximum number of alerts to keep.
250
+ */
251
+ public function GetPruningLimit()
252
+ {
253
+ $val = (int)$this->_plugin->GetGlobalOption('pruning-limit');
254
+ return $val ? $val : $this->GetMaxAllowedAlerts();
255
+ }
256
+
257
+ /**
258
+ * @param integer $newvalue The new maximum number of alerts.
259
+ */
260
+ public function SetPruningLimit($newvalue)
261
+ {
262
+ $newvalue = max(/*min(*/(int)$newvalue/*, $this->GetMaxAllowedAlerts())*/, 1);
263
+ $this->_plugin->SetGlobalOption('pruning-limit', $newvalue);
264
+ }
265
+
266
+ public function SetPruningDateEnabled($enabled)
267
+ {
268
+ $this->_plugin->SetGlobalOption('pruning-date-e', $enabled);
269
+ }
270
+
271
+ public function SetPruningLimitEnabled($enabled)
272
+ {
273
+ $this->_plugin->SetGlobalOption('pruning-limit-e', $enabled);
274
+ }
275
+
276
+ public function IsPruningDateEnabled(){
277
+ return $this->_plugin->GetGlobalOption('pruning-date-e');
278
+ }
279
+
280
+ public function IsPruningLimitEnabled()
281
+ {
282
+ return $this->_plugin->GetGlobalOption('pruning-limit-e');
283
+ }
284
+
285
+ public function IsRestrictAdmins()
286
+ {
287
+ return $this->_plugin->GetGlobalOption('restrict-admins', false);
288
+ }
289
+
290
+ /**
291
+ * @deprecated Sandbox functionality is now in an external plugin.
292
+ */
293
+ public function IsSandboxPageEnabled()
294
+ {
295
+ $plugins = $this->_plugin->licensing->plugins();
296
+ return isset($plugins['wsal-sandbox-extensionphp']);
297
+ }
298
+
299
+ public function SetRestrictAdmins($enable)
300
+ {
301
+ $this->_plugin->SetGlobalOption('restrict-admins', (bool)$enable);
302
+ }
303
+
304
+ // </editor-fold>
305
+ public function GetDefaultDisabledAlerts()
306
+ {
307
+ return array(0000, 0001, 0002, 0003, 0004, 0005);
308
+ }
309
+
310
+ /**
311
+ * @return array IDs of disabled alerts.
312
+ */
313
+ public function GetDisabledAlerts()
314
+ {
315
+ if (!$this->_disabled) {
316
+ $this->_disabled = implode(',', $this->GetDefaultDisabledAlerts());
317
+ $this->_disabled = $this->_plugin->GetGlobalOption('disabled-alerts', $this->_disabled);
318
+ $this->_disabled = ($this->_disabled == '') ? array() : explode(',', $this->_disabled);
319
+ $this->_disabled = array_map('intval', $this->_disabled);
320
+ }
321
+ return $this->_disabled;
322
+ }
323
+
324
+ /**
325
+ * @param array $types IDs alerts to disable.
326
+ */
327
+ public function SetDisabledAlerts($types)
328
+ {
329
+ $this->_disabled = array_unique(array_map('intval', $types));
330
+ $this->_plugin->SetGlobalOption('disabled-alerts', implode(',', $this->_disabled));
331
+ }
332
+
333
+ public function IsIncognito()
334
+ {
335
+ return $this->_plugin->GetGlobalOption('hide-plugin');
336
+ }
337
+
338
+ public function SetIncognito($enabled)
339
+ {
340
+ return $this->_plugin->SetGlobalOption('hide-plugin', $enabled);
341
+ }
342
+
343
+ /**
344
+ * Checking if Logging is enabled.
345
+ */
346
+ public function IsLoggingDisabled()
347
+ {
348
+ return $this->_plugin->GetGlobalOption('disable-logging');
349
+ }
350
+
351
+ public function SetLoggingDisabled($disabled)
352
+ {
353
+ return $this->_plugin->SetGlobalOption('disable-logging', $disabled);
354
+ }
355
+
356
+ /**
357
+ * Checking if the data will be removed.
358
+ */
359
+ public function IsDeleteData()
360
+ {
361
+ return $this->_plugin->GetGlobalOption('delete-data');
362
+ }
363
+
364
+ public function SetDeleteData($enabled)
365
+ {
366
+ return $this->_plugin->SetGlobalOption('delete-data', $enabled);
367
+ }
368
+
369
+ // <editor-fold desc="Access Control">
370
+
371
+ public function SetAllowedPluginViewers($usersOrRoles)
372
+ {
373
+ $this->_viewers = $usersOrRoles;
374
+ $this->_plugin->SetGlobalOption('plugin-viewers', implode(',', $this->_viewers));
375
+ }
376
+
377
+ public function GetAllowedPluginViewers()
378
+ {
379
+ if (is_null($this->_viewers)) {
380
+ $this->_viewers = array_unique(array_filter(explode(',', $this->_plugin->GetGlobalOption('plugin-viewers'))));
381
+ }
382
+ return $this->_viewers;
383
+ }
384
+
385
+ public function SetAllowedPluginEditors($usersOrRoles)
386
+ {
387
+ $this->_editors = $usersOrRoles;
388
+ $this->_plugin->SetGlobalOption('plugin-editors', implode(',', $this->_editors));
389
+ }
390
+
391
+ public function GetAllowedPluginEditors()
392
+ {
393
+ if (is_null($this->_editors)) {
394
+ $this->_editors = array_unique(array_filter(explode(',', $this->_plugin->GetGlobalOption('plugin-editors'))));
395
+ }
396
+ return $this->_editors;
397
+ }
398
+
399
+ public function SetViewPerPage($newvalue)
400
+ {
401
+ $this->_perpage = max($newvalue, 1);
402
+ $this->_plugin->SetGlobalOption('items-per-page', $this->_perpage);
403
+ }
404
+
405
+ public function GetViewPerPage()
406
+ {
407
+ if (is_null($this->_perpage)) {
408
+ $this->_perpage = (int)$this->_plugin->GetGlobalOption('items-per-page', 10);
409
+ }
410
+ return $this->_perpage;
411
+ }
412
+
413
+ /**
414
+ * @param string $action Type of action, either 'view' or 'edit'.
415
+ * @return boolean If user has access or not.
416
+ */
417
+ public function CurrentUserCan($action)
418
+ {
419
+ return $this->UserCan(wp_get_current_user(), $action);
420
+ }
421
+
422
+ /**
423
+ * @return string[] List of superadmin usernames.
424
+ */
425
+ protected function GetSuperAdmins()
426
+ {
427
+ return $this->_plugin->IsMultisite() ? get_super_admins() : array();
428
+ }
429
+
430
+ /**
431
+ * @return string[] List of admin usernames.
432
+ */
433
+ protected function GetAdmins()
434
+ {
435
+ if ($this->_plugin->IsMultisite()) {
436
+ // see: https://gist.github.com/1508426/65785a15b8638d43a9905effb59e4d97319ef8f8
437
+ global $wpdb;
438
+ $cap = $wpdb->prefix."capabilities";
439
+ $sql = "SELECT DISTINCT $wpdb->users.user_login"
440
+ . " FROM $wpdb->users"
441
+ . " INNER JOIN $wpdb->usermeta ON ($wpdb->users.ID = $wpdb->usermeta.user_id )"
442
+ . " WHERE $wpdb->usermeta.meta_key = '$cap'"
443
+ . " AND CAST($wpdb->usermeta.meta_value AS CHAR) LIKE '%\"administrator\"%'";
444
+ return $wpdb->get_col($sql);
445
+ } else {
446
+ $result = array();
447
+ $query = 'role=administrator&fields[]=user_login';
448
+ foreach (get_users($query) as $user) {
449
+ $result[] = $user->user_login;
450
+ }
451
+ return $result;
452
+ }
453
+ }
454
+
455
+ /**
456
+ * Returns access tokens for a particular action.
457
+ * @param string $action Type of action.
458
+ * @return string[] List of tokens (usernames, roles etc).
459
+ */
460
+ public function GetAccessTokens($action)
461
+ {
462
+ $allowed = array();
463
+ switch ($action) {
464
+ case 'view':
465
+ $allowed = $this->GetAllowedPluginViewers();
466
+ $allowed = array_merge($allowed, $this->GetAllowedPluginEditors());
467
+ if (!$this->IsRestrictAdmins()) {
468
+ $allowed = array_merge($allowed, $this->GetSuperAdmins());
469
+ $allowed = array_merge($allowed, $this->GetAdmins());
470
+ }
471
+ break;
472
+ case 'edit':
473
+ $allowed = $this->GetAllowedPluginEditors();
474
+ if (!$this->IsRestrictAdmins()) {
475
+ $allowed = array_merge($allowed, $this->_plugin->IsMultisite() ? $this->GetSuperAdmins() : $this->GetAdmins());
476
+ }
477
+ break;
478
+ default:
479
+ throw new Exception('Unknown action "'.$action.'".');
480
+ }
481
+ if (!$this->IsRestrictAdmins()) {
482
+ if (is_multisite()) {
483
+ $allowed = array_merge($allowed, get_super_admins());
484
+ } else {
485
+ $allowed[] = 'administrator';
486
+ }
487
+ }
488
+ return array_unique($allowed);
489
+ }
490
+
491
+ /**
492
+ * @param integer|WP_user $user User object to check.
493
+ * @param string $action Type of action, either 'view' or 'edit'.
494
+ * @return boolean If user has access or not.
495
+ */
496
+ public function UserCan($user, $action)
497
+ {
498
+ if (is_int($user)) {
499
+ $user = get_userdata($user);
500
+ }
501
+ $allowed = $this->GetAccessTokens($action);
502
+ $check = array_merge($user->roles, array($user->user_login));
503
+ foreach ($check as $item) {
504
+ if (in_array($item, $allowed)) {
505
+ return true;
506
+ }
507
+ }
508
+ return false;
509
+ }
510
+
511
+ public function GetCurrentUserRoles($baseRoles = null)
512
+ {
513
+ if ($baseRoles == null) {
514
+ $baseRoles = wp_get_current_user()->roles;
515
+ }
516
+ if (function_exists('is_super_admin') && is_super_admin()) {
517
+ $baseRoles[] = 'superadmin';
518
+ }
519
+ return $baseRoles;
520
+ }
521
+
522
+ public function IsLoginSuperAdmin($username)
523
+ {
524
+ $userId = username_exists($username);
525
+ if (function_exists('is_super_admin') && is_super_admin($userId)) {
526
+ return true;
527
+ } else {
528
+ return false;
529
+ }
530
+ }
531
+
532
+ // </editor-fold>
533
+
534
+ // <editor-fold desc="Licensing">
535
+ public function GetLicenses()
536
+ {
537
+ return $this->_plugin->GetGlobalOption('licenses');
538
+ }
539
+
540
+ public function GetLicense($name)
541
+ {
542
+ $data = $this->GetLicenses();
543
+ $name = sanitize_key(basename($name));
544
+ return isset($data[$name]) ? $data[$name] : array();
545
+ }
546
+
547
+ public function SetLicenses($data)
548
+ {
549
+ $this->_plugin->SetGlobalOption('licenses', $data);
550
+ }
551
+
552
+ public function GetLicenseKey($name)
553
+ {
554
+ $data = $this->GetLicense($name);
555
+ return isset($data['key']) ? $data['key'] : '';
556
+ }
557
+
558
+ public function GetLicenseStatus($name){
559
+ $data = $this->GetLicense($name);
560
+ return isset($data['sts']) ? $data['sts'] : '';
561
+ }
562
+
563
+ public function GetLicenseErrors($name)
564
+ {
565
+ $data = $this->GetLicense($name);
566
+ return isset($data['err']) ? $data['err'] : '';
567
+ }
568
+
569
+ public function SetLicenseKey($name, $key)
570
+ {
571
+ $data = $this->GetLicenses();
572
+ if (!isset($data[$name])) {
573
+ $data[$name] = array();
574
+ }
575
+ $data[$name]['key'] = $key;
576
+ $this->SetLicenses($data);
577
+ }
578
+
579
+ public function SetLicenseStatus($name, $status)
580
+ {
581
+ $data = $this->GetLicenses();
582
+ if (!isset($data[$name])) {
583
+ $data[$name] = array();
584
+ }
585
+ $data[$name]['sts'] = $status;
586
+ $this->SetLicenses($data);
587
+ }
588
+
589
+ public function SetLicenseErrors($name, $errors)
590
+ {
591
+ $data = $this->GetLicenses();
592
+ if (!isset($data[$name])) {
593
+ $data[$name] = array();
594
+ }
595
+ $data[$name]['err'] = $errors;
596
+ $this->SetLicenses($data);
597
+ }
598
+
599
+ public function ClearLicenses()
600
+ {
601
+ $this->SetLicenses(array());
602
+ }
603
+
604
+ // </editor-fold>
605
+ // <editor-fold desc="Client IP Retrieval">
606
+
607
+ public function IsMainIPFromProxy()
608
+ {
609
+ return $this->_plugin->GetGlobalOption('use-proxy-ip');
610
+ }
611
+
612
+ public function SetMainIPFromProxy($enabled)
613
+ {
614
+ return $this->_plugin->SetGlobalOption('use-proxy-ip', $enabled);
615
+ }
616
+
617
+ public function IsInternalIPsFiltered()
618
+ {
619
+ return $this->_plugin->GetGlobalOption('filter-internal-ip');
620
+ }
621
+
622
+ public function SetInternalIPsFiltering($enabled)
623
+ {
624
+ return $this->_plugin->SetGlobalOption('filter-internal-ip', $enabled);
625
+ }
626
+
627
+ public function GetMainClientIP()
628
+ {
629
+ $result = null;
630
+ if ($this->IsMainIPFromProxy()) {
631
+ // TODO the algorithm below just gets the first IP in the list...we might want to make this more intelligent somehow
632
+ $result = $this->GetClientIPs();
633
+ $result = reset($result);
634
+ $result = isset($result[0]) ? $result[0] : null;
635
+ } elseif (isset($_SERVER['REMOTE_ADDR'])) {
636
+ $result = $this->NormalizeIP($_SERVER['REMOTE_ADDR']);
637
+ if (!$this->ValidateIP($result)) {
638
+ $result = "Error " . self::ERROR_CODE_INVALID_IP . ": Invalid IP Address";
639
+ }
640
+ }
641
+ return $result;
642
+ }
643
+
644
+ public function GetClientIPs()
645
+ {
646
+ $ips = array();
647
+ foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) {
648
+ if (isset($_SERVER[$key])) {
649
+ $ips[$key] = array();
650
+ foreach (explode(',', $_SERVER[$key]) as $ip) {
651
+ if ($this->ValidateIP($ip = $this->NormalizeIP($ip))) {
652
+ $ips[$key][] = $ip;
653
+ }
654
+ }
655
+ }
656
+ }
657
+ return $ips;
658
+ }
659
+
660
+ protected function NormalizeIP($ip)
661
+ {
662
+ $ip = trim($ip);
663
+ if (strpos($ip, ':') !== false && substr_count($ip, '.') == 3 && strpos($ip, '[') === false) {
664
+ // IPv4 with a port (eg: 11.22.33.44:80)
665
+ $ip = explode(':', $ip);
666
+ $ip = $ip[0];
667
+ } else {
668
+ // IPv6 with a port (eg: [::1]:80)
669
+ $ip = explode(']', $ip);
670
+ $ip = ltrim($ip[0], '[');
671
+ }
672
+ return $ip;
673
+ }
674
+
675
+ protected function ValidateIP($ip)
676
+ {
677
+ $opts = FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6;
678
+ if ($this->IsInternalIPsFiltered()) {
679
+ $opts = $opts | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE;
680
+ }
681
+ $filteredIP = filter_var($ip, FILTER_VALIDATE_IP, $opts);
682
+ if (!$filteredIP || empty($filteredIP)) {
683
+ //Regex IPV4
684
+ if (preg_match("/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/", $ip)) {
685
+ return $ip;
686
+ }
687
+ //Regex IPV6
688
+ elseif (preg_match("/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/", $ip)) {
689
+ return $ip;
690
+ }
691
+ if (!$this->IsLoggingDisabled) {
692
+ error_log("Invalid IP in ValidateIP function: ".$ip);
693
+ }
694
+ return false;
695
+ } else {
696
+ return $filteredIP;
697
+ }
698
+ }
699
+
700
+ /**
701
+ * Users excluded from monitoring
702
+ */
703
+ public function SetExcludedMonitoringUsers($users)
704
+ {
705
+ $this->_excluded_users = $users;
706
+ $this->_plugin->SetGlobalOption('excluded-users', esc_html(implode(',', $this->_excluded_users)));
707
+ }
708
+
709
+ public function GetExcludedMonitoringUsers()
710
+ {
711
+ if (empty($this->_excluded_users)) {
712
+ $this->_excluded_users = array_unique(array_filter(explode(',', $this->_plugin->GetGlobalOption('excluded-users'))));
713
+ }
714
+ return $this->_excluded_users;
715
+ }
716
+
717
+ /**
718
+ * Set Custom Post Types excluded from monitoring.
719
+ *
720
+ * @param array $post_types - Array of post types to exclude.
721
+ * @since 2.6.7
722
+ */
723
+ public function set_excluded_post_types( $post_types ) {
724
+ $this->_post_types = $post_types;
725
+ $this->_plugin->SetGlobalOption( 'custom-post-types', esc_html( implode( ',', $this->_post_types ) ) );
726
+ }
727
+
728
+ /**
729
+ * Get Custom Post Types excluded from monitoring.
730
+ *
731
+ * @since 2.6.7
732
+ */
733
+ public function get_excluded_post_types() {
734
+ if ( empty( $this->_post_types ) ) {
735
+ $this->_post_types = array_unique( array_filter( explode( ',', $this->_plugin->GetGlobalOption( 'custom-post-types' ) ) ) );
736
+ }
737
+ return $this->_post_types;
738
+ }
739
+
740
+ /**
741
+ * Roles excluded from monitoring
742
+ */
743
+ public function SetExcludedMonitoringRoles($roles)
744
+ {
745
+ $this->_excluded_roles = $roles;
746
+ $this->_plugin->SetGlobalOption('excluded-roles', esc_html(implode(',', $this->_excluded_roles)));
747
+ }
748
+
749
+ public function GetExcludedMonitoringRoles()
750
+ {
751
+ if (empty($this->_excluded_roles)) {
752
+ $this->_excluded_roles = array_unique(array_filter(explode(',', $this->_plugin->GetGlobalOption('excluded-roles'))));
753
+ }
754
+ return $this->_excluded_roles;
755
+ }
756
+
757
+ /**
758
+ * Custom fields excluded from monitoring
759
+ */
760
+ public function SetExcludedMonitoringCustom($custom)
761
+ {
762
+ $this->_excluded_custom = $custom;
763
+ $this->_plugin->SetGlobalOption('excluded-custom', esc_html(implode(',', $this->_excluded_custom)));
764
+ }
765
+
766
+ public function GetExcludedMonitoringCustom()
767
+ {
768
+ if (empty($this->_excluded_custom)) {
769
+ $this->_excluded_custom = array_unique(array_filter(explode(',', $this->_plugin->GetGlobalOption('excluded-custom'))));
770
+ asort($this->_excluded_custom);
771
+ }
772
+ return $this->_excluded_custom;
773
+ }
774
+
775
+ /**
776
+ * IP excluded from monitoring
777
+ */
778
+ public function SetExcludedMonitoringIP($ip)
779
+ {
780
+ $this->_excluded_ip = $ip;
781
+ $this->_plugin->SetGlobalOption('excluded-ip', esc_html(implode(',', $this->_excluded_ip)));
782
+ }
783
+
784
+ public function GetExcludedMonitoringIP()
785
+ {
786
+ if (empty($this->_excluded_ip)) {
787
+ $this->_excluded_ip = array_unique(array_filter(explode(',', $this->_plugin->GetGlobalOption('excluded-ip'))));
788
+ }
789
+ return $this->_excluded_ip;
790
+ }
791
+
792
+ /**
793
+ * Datetime used in the Alerts.
794
+ */
795
+ public function GetDatetimeFormat($lineBreak = true)
796
+ {
797
+ if ($lineBreak) {
798
+ $date_time_format = $this->GetDateFormat() . '<\b\r>' . $this->GetTimeFormat();
799
+ } else {
800
+ $date_time_format = $this->GetDateFormat() . ' ' . $this->GetTimeFormat();
801
+ }
802
+
803
+ $wp_time_format = get_option('time_format');
804
+ if (stripos($wp_time_format, 'A') !== false) {
805
+ $date_time_format .= '.$$$&\n\b\s\p;A';
806
+ } else {
807
+ $date_time_format .= '.$$$';
808
+ }
809
+ return $date_time_format;
810
+ }
811
+
812
+ /**
813
+ * Date Format from WordPress General Settings.
814
+ */
815
+ public function GetDateFormat()
816
+ {
817
+ $wp_date_format = get_option('date_format');
818
+ $search = array('F', 'M', 'n', 'j', ' ', '/', 'y', 'S', ',', 'l', 'D');
819
+ $replace = array('m', 'm', 'm', 'd', '-', '-', 'Y', '', '', '', '');
820
+ $date_format = str_replace($search, $replace, $wp_date_format);
821
+ return $date_format;
822
+ }
823
+
824
+ /**
825
+ * Time Format from WordPress General Settings.
826
+ */
827
+ public function GetTimeFormat()
828
+ {
829
+ $wp_time_format = get_option('time_format');
830
+ $search = array('a', 'A', 'T', ' ');
831
+ $replace = array('', '', '', '');
832
+ $time_format = str_replace($search, $replace, $wp_time_format);
833
+ return $time_format;
834
+ }
835
+
836
+ /**
837
+ * Alerts Timestamp
838
+ * Server's timezone or WordPress' timezone
839
+ */
840
+ public function GetTimezone()
841
+ {
842
+ return $this->_plugin->GetGlobalOption('timezone', 0);
843
+ }
844
+
845
+ public function SetTimezone($newvalue)
846
+ {
847
+ return $this->_plugin->SetGlobalOption('timezone', $newvalue);
848
+ }
849
+
850
+ /**
851
+ * Get type of username to display
852
+ */
853
+ public function get_type_username() {
854
+ return $this->_plugin->GetGlobalOption( 'type_username', 'display_name' );
855
+ }
856
+
857
+ /**
858
+ * Set type of username to display
859
+ *
860
+ * @param string $newvalue - New value variable.
861
+ * @since 2.6.5
862
+ */
863
+ public function set_type_username( $newvalue ) {
864
+ return $this->_plugin->SetGlobalOption( 'type_username', $newvalue );
865
+ }
866
+
867
+ public function GetAdapterConfig($name_field)
868
+ {
869
+ return $this->_plugin->GetGlobalOption($name_field);
870
+ }
871
+
872
+ public function SetAdapterConfig($name_field, $newvalue)
873
+ {
874
+ return $this->_plugin->SetGlobalOption($name_field, trim($newvalue));
875
+ }
876
+
877
+ public function GetColumns()
878
+ {
879
+ $columns = array('alert_code' => '1', 'type' => '1', 'date' => '1', 'username' => '1', 'source_ip' => '1', 'message' => '1');
880
+ if ($this->_plugin->IsMultisite()) {
881
+ $columns = array_slice($columns, 0, 5, true) + array('site' => '1') + array_slice($columns, 5, null, true);
882
+ }
883
+ $selected = $this->GetColumnsSelected();
884
+ if (!empty($selected)) {
885
+ $columns = array('alert_code' => '0', 'type' => '0', 'date' => '0', 'username' => '0', 'source_ip' => '0', 'message' => '0');
886
+ if ($this->_plugin->IsMultisite()) {
887
+ $columns = array_slice($columns, 0, 5, true) + array('site' => '0') + array_slice($columns, 5, null, true);
888
+ }
889
+ $selected = (array)json_decode($selected);
890
+ $columns = array_merge($columns, $selected);
891
+ return $columns;
892
+ } else {
893
+ return $columns;
894
+ }
895
+ }
896
+
897
+ public function GetColumnsSelected()
898
+ {
899
+ return $this->_plugin->GetGlobalOption('columns');
900
+ }
901
+
902
+ public function SetColumns($columns)
903
+ {
904
+ return $this->_plugin->SetGlobalOption('columns', json_encode($columns));
905
+ }
906
+
907
+ public function IsWPBackend()
908
+ {
909
+ return $this->_plugin->GetGlobalOption('wp-backend');
910
+ }
911
+
912
+ public function SetWPBackend($enabled)
913
+ {
914
+ return $this->_plugin->SetGlobalOption('wp-backend', $enabled);
915
+ }
916
+
917
+ public function SetFromEmail($email_address)
918
+ {
919
+ return $this->_plugin->SetGlobalOption('from-email', trim($email_address));
920
+ }
921
+
922
+ public function GetFromEmail()
923
+ {
924
+ return $this->_plugin->GetGlobalOption('from-email');
925
+ }
926
+
927
+ public function SetDisplayName($display_name)
928
+ {
929
+ return $this->_plugin->SetGlobalOption('display-name', trim($display_name));
930
+ }
931
+
932
+ public function GetDisplayName()
933
+ {
934
+ return $this->_plugin->GetGlobalOption('display-name');
935
+ }
936
+
937
+ public function Set404LogLimit($value)
938
+ {
939
+ return $this->_plugin->SetGlobalOption('log-404-limit', abs($value));
940
+ }
941
+
942
+ public function Get404LogLimit()
943
+ {
944
+ return $this->_plugin->GetGlobalOption('log-404-limit', 99);
945
+ }
946
+
947
+ /**
948
+ * Sets the 404 log limit for visitor.
949
+ *
950
+ * @param int $value - 404 log limit.
951
+ * @since 2.6.3
952
+ */
953
+ public function SetVisitor404LogLimit( $value ) {
954
+ return $this->_plugin->SetGlobalOption( 'log-visitor-404-limit', abs( $value ) );
955
+ }
956
+
957
+ /**
958
+ * Get the 404 log limit for visitor.
959
+ *
960
+ * @since 2.6.3
961
+ */
962
+ public function GetVisitor404LogLimit() {
963
+ return $this->_plugin->GetGlobalOption( 'log-visitor-404-limit', 99 );
964
+ }
965
 
966
  /*============================== Support Archive Database ==============================*/
967
 
968
+ public function IsArchivingEnabled()
969
+ {
970
+ return $this->_plugin->GetGlobalOption('archiving-e');
971
+ }
972
+
973
+ /**
974
+ * Switch to Archive DB if is enabled
975
+ */
976
+ public function SwitchToArchiveDB()
977
+ {
978
+ if ($this->IsArchivingEnabled()) {
979
+ $archiveType = $this->_plugin->GetGlobalOption('archive-type');
980
+ $archiveUser = $this->_plugin->GetGlobalOption('archive-user');
981
+ $password = $this->_plugin->GetGlobalOption('archive-password');
982
+ $archiveName = $this->_plugin->GetGlobalOption('archive-name');
983
+ $archiveHostname = $this->_plugin->GetGlobalOption('archive-hostname');
984
+ $archiveBasePrefix = $this->_plugin->GetGlobalOption('archive-base-prefix');
985
+ $config = WSAL_Connector_ConnectorFactory::GetConfigArray($archiveType, $archiveUser, $password, $archiveName, $archiveHostname, $archiveBasePrefix);
986
+ $this->_plugin->getConnector($config)->getAdapter('Occurrence');
987
+ }
988
+ }
989
+ // </editor-fold>
990
  }
classes/Views/Settings.php CHANGED
@@ -16,16 +16,16 @@
16
  * @since 1.0.0
17
  */
18
  class WSAL_Views_Settings extends WSAL_AbstractView {
19
- public $adapterMsg = '';
20
 
21
- public function __construct(WpSecurityAuditLog $plugin)
22
- {
23
- parent::__construct($plugin);
24
 
25
- add_action('wp_ajax_AjaxCheckSecurityToken', array($this, 'AjaxCheckSecurityToken'));
26
- add_action('wp_ajax_AjaxRunCleanup', array($this, 'AjaxRunCleanup'));
27
- add_action('wp_ajax_AjaxGetAllUsers', array($this, 'AjaxGetAllUsers'));
28
- add_action('wp_ajax_AjaxGetAllRoles', array($this, 'AjaxGetAllRoles'));
 
 
 
29
  }
30
 
31
  public function HasPluginShortcutLink()
@@ -53,20 +53,29 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
53
  return 3;
54
  }
55
 
56
- protected function GetTokenType($token)
57
- {
 
58
  $users = array();
59
- foreach (get_users('blog_id=0&fields[]=user_login') as $obj) {
60
  $users[] = $obj->user_login;
61
  }
62
- $roles = array_keys(get_editable_roles());
63
 
64
- if (in_array($token, $users)) {
 
 
 
 
 
 
65
  return 'user';
66
  }
67
- if (in_array($token, $roles)) {
68
  return 'role';
69
  }
 
 
 
70
  return 'other';
71
  }
72
 
@@ -93,6 +102,7 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
93
  $this->_plugin->settings->SetExcludedMonitoringRoles( isset( $_REQUEST['ExRoles'] ) ? $_REQUEST['ExRoles'] : array() );
94
  $this->_plugin->settings->SetExcludedMonitoringCustom( isset( $_REQUEST['Customs'] ) ? $_REQUEST['Customs'] : array() );
95
  $this->_plugin->settings->SetExcludedMonitoringIP( isset( $_REQUEST['IpAddrs'] ) ? $_REQUEST['IpAddrs'] : array() );
 
96
 
97
  $this->_plugin->settings->SetRestrictAdmins( isset( $_REQUEST['RestrictAdmins'] ) );
98
  $this->_plugin->settings->SetRefreshAlertsEnabled( $_REQUEST['EnableAuditViewRefresh'] );
@@ -116,15 +126,14 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
116
  }
117
  }
118
 
119
- public function AjaxCheckSecurityToken()
120
- {
121
- if (!$this->_plugin->settings->CurrentUserCan('view')) {
122
- die('Access Denied.');
123
  }
124
- if (!isset($_REQUEST['token'])) {
125
- die('Token parameter expected.');
126
  }
127
- die($this->GetTokenType($_REQUEST['token']));
128
  }
129
 
130
  public function AjaxRunCleanup()
@@ -542,8 +551,7 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
542
  </label>
543
  <br/>
544
  <?php } ?>
545
- <span class="description"><?php _e('When you disable any of the above such details won’t be shown in the Audit Log
546
- viewer though the plugin will still record such information in the database.', 'wp-security-audit-log'); ?></span>
547
  </fieldset>
548
  </td>
549
  </tr>
@@ -570,7 +578,7 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
570
  <table class="form-table wsal-tab widefat" id="tab-exclude">
571
  <tbody>
572
  <tr>
573
- <th><h2>Users &amp; Roles</h2></th>
574
  </tr>
575
  <tr>
576
  <td colspan="2">Any of the users and roles listed in the below options will be excluded from monitoring. This means that any change they do will not be logged.</td>
@@ -616,7 +624,7 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
616
  </td>
617
  </tr>
618
  <tr>
619
- <th><h2>Custom Fields</h2></th>
620
  </tr>
621
  <tr>
622
  <td colspan="2">All of the custom fields listed below will be excluded from monitoring. This means that if they are changed or updated the plugin will not log such activity.<br>
@@ -643,7 +651,7 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
643
  </td>
644
  </tr>
645
  <tr>
646
- <th><h2>IP Addresses</h2></th>
647
  </tr>
648
  <tr>
649
  <td colspan="2">Any of the IP addresses listed below will be excluded from monitoring. This means that all activity from such IP address will not be recorded.</td>
@@ -668,6 +676,32 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
668
  </fieldset>
669
  </td>
670
  </tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
671
  </tbody>
672
  </table>
673
  </div>
@@ -768,33 +802,55 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
768
  </script><?php
769
  }
770
 
771
- public function AjaxGetAllUsers()
772
- {
773
- if (!$this->_plugin->settings->CurrentUserCan('view')) {
774
- die('Access Denied.');
775
  }
776
  $users = array();
777
- foreach (get_users() as $user) {
778
- if (strpos($user->user_login, $_GET['term']) !== false) {
779
- array_push($users, $user->user_login);
780
  }
781
  }
782
- echo json_encode($users);
783
  exit;
784
  }
785
 
786
- public function AjaxGetAllRoles()
787
- {
788
- if (!$this->_plugin->settings->CurrentUserCan('view')) {
789
- die('Access Denied.');
790
  }
791
  $roles = array();
792
- foreach (get_editable_roles() as $role_name => $role_info) {
793
- if (strpos($role_name, $_GET['term']) !== false) {
794
- array_push($roles, $role_name);
795
  }
796
  }
797
- echo json_encode($roles);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
798
  exit;
799
  }
800
  }
16
  * @since 1.0.0
17
  */
18
  class WSAL_Views_Settings extends WSAL_AbstractView {
 
19
 
20
+ public $adapterMsg = '';
 
 
21
 
22
+ public function __construct( WpSecurityAuditLog $plugin ) {
23
+ parent::__construct( $plugin );
24
+ add_action( 'wp_ajax_AjaxCheckSecurityToken', array( $this, 'AjaxCheckSecurityToken' ) );
25
+ add_action( 'wp_ajax_AjaxRunCleanup', array( $this, 'AjaxRunCleanup' ) );
26
+ add_action( 'wp_ajax_AjaxGetAllUsers', array( $this, 'AjaxGetAllUsers' ) );
27
+ add_action( 'wp_ajax_AjaxGetAllRoles', array( $this, 'AjaxGetAllRoles' ) );
28
+ add_action( 'wp_ajax_AjaxGetAllCPT', array( $this, 'AjaxGetAllCPT' ) );
29
  }
30
 
31
  public function HasPluginShortcutLink()
53
  return 3;
54
  }
55
 
56
+ protected function GetTokenType( $token ) {
57
+
58
+ // Get users.
59
  $users = array();
60
+ foreach ( get_users( 'blog_id=0&fields[]=user_login' ) as $obj ) {
61
  $users[] = $obj->user_login;
62
  }
 
63
 
64
+ // Get user roles.
65
+ $roles = array_keys( get_editable_roles() );
66
+
67
+ // Get custom post types.
68
+ $post_types = get_post_types( array(), 'names', 'and' );
69
+
70
+ if ( in_array( $token, $users ) ) {
71
  return 'user';
72
  }
73
+ if ( in_array( $token, $roles ) ) {
74
  return 'role';
75
  }
76
+ if ( in_array( $token, $post_types ) ) {
77
+ return 'cpts';
78
+ }
79
  return 'other';
80
  }
81
 
102
  $this->_plugin->settings->SetExcludedMonitoringRoles( isset( $_REQUEST['ExRoles'] ) ? $_REQUEST['ExRoles'] : array() );
103
  $this->_plugin->settings->SetExcludedMonitoringCustom( isset( $_REQUEST['Customs'] ) ? $_REQUEST['Customs'] : array() );
104
  $this->_plugin->settings->SetExcludedMonitoringIP( isset( $_REQUEST['IpAddrs'] ) ? $_REQUEST['IpAddrs'] : array() );
105
+ $this->_plugin->settings->set_excluded_post_types( isset( $_REQUEST['ExCPTss'] ) ? $_REQUEST['ExCPTss'] : array() );
106
 
107
  $this->_plugin->settings->SetRestrictAdmins( isset( $_REQUEST['RestrictAdmins'] ) );
108
  $this->_plugin->settings->SetRefreshAlertsEnabled( $_REQUEST['EnableAuditViewRefresh'] );
126
  }
127
  }
128
 
129
+ public function AjaxCheckSecurityToken() {
130
+ if ( ! $this->_plugin->settings->CurrentUserCan( 'view' ) ) {
131
+ die( 'Access Denied.' );
 
132
  }
133
+ if ( ! isset( $_REQUEST['token'] ) ) {
134
+ die( 'Token parameter expected.' );
135
  }
136
+ die( $this->GetTokenType( $_REQUEST['token'] ) );
137
  }
138
 
139
  public function AjaxRunCleanup()
551
  </label>
552
  <br/>
553
  <?php } ?>
554
+ <span class="description"><?php _e( 'When you disable any of the above such details won’t be shown in the Audit Log viewer though the plugin will still record such information in the database.', 'wp-security-audit-log' ); ?></span>
 
555
  </fieldset>
556
  </td>
557
  </tr>
578
  <table class="form-table wsal-tab widefat" id="tab-exclude">
579
  <tbody>
580
  <tr>
581
+ <th><h2><?php esc_html_e( 'Users & Roles', 'wp-security-audit-log' ); ?></h2></th>
582
  </tr>
583
  <tr>
584
  <td colspan="2">Any of the users and roles listed in the below options will be excluded from monitoring. This means that any change they do will not be logged.</td>
624
  </td>
625
  </tr>
626
  <tr>
627
+ <th><h2><?php esc_html_e( 'Custom Fields', 'wp-security-audit-log' ); ?></h2></th>
628
  </tr>
629
  <tr>
630
  <td colspan="2">All of the custom fields listed below will be excluded from monitoring. This means that if they are changed or updated the plugin will not log such activity.<br>
651
  </td>
652
  </tr>
653
  <tr>
654
+ <th><h2><?php esc_html_e( 'IP Addresses', 'wp-security-audit-log' ); ?></h2></th>
655
  </tr>
656
  <tr>
657
  <td colspan="2">Any of the IP addresses listed below will be excluded from monitoring. This means that all activity from such IP address will not be recorded.</td>
676
  </fieldset>
677
  </td>
678
  </tr>
679
+ <tr>
680
+ <th><h2><?php esc_html_e( 'Custom Post Types', 'wp-security-audit-log' ); ?></h2></th>
681
+ </tr>
682
+ <tr>
683
+ <td colspan="2"><?php esc_html_e( 'The below list of Custom Post Types are excluded from monitoring. This means that all activity related to these Custom Post Types will not be recorded.', 'wp-security-audit-log' ); ?></td>
684
+ </tr>
685
+ <tr>
686
+ <th><label for="ExCPTsQueryBox"><?php esc_html_e( 'Exclude Custom Post Type from monitoring', 'wp-security-audit-log' ); ?></label></th>
687
+ <td>
688
+ <fieldset>
689
+ <input type="text" id="ExCPTsQueryBox" style="float: left; display: block; width: 250px;">
690
+ <input type="button" id="ExCPTsQueryAdd" style="float: left; display: block;" class="button-primary" value="Add">
691
+ <br style="clear: both;"/>
692
+ <div id="ExCPTsList">
693
+ <?php foreach ( $this->_plugin->settings->get_excluded_post_types() as $item ) : ?>
694
+ <span class="sectoken-<?php echo esc_attr( $this->GetTokenType( $item ) ); ?>">
695
+ <input type="hidden" name="ExCPTss[]" value="<?php echo esc_attr( $item ); ?>"/>
696
+ <?php echo esc_html( $item ); ?>
697
+ <a href="javascript:;" title="Remove">&times;</a>
698
+ </span>
699
+ <?php endforeach; ?>
700
+ </div>
701
+ </fieldset>
702
+ </td>
703
+ </tr>
704
+ <!-- Excluded Custom Post Types -->
705
  </tbody>
706
  </table>
707
  </div>
802
  </script><?php
803
  }
804
 
805
+ public function AjaxGetAllUsers() {
806
+ if ( ! $this->_plugin->settings->CurrentUserCan( 'view' ) ) {
807
+ die( 'Access Denied.' );
 
808
  }
809
  $users = array();
810
+ foreach ( get_users() as $user ) {
811
+ if ( strpos( $user->user_login, $_GET['term'] ) !== false ) {
812
+ array_push( $users, $user->user_login );
813
  }
814
  }
815
+ echo json_encode( $users );
816
  exit;
817
  }
818
 
819
+ public function AjaxGetAllRoles() {
820
+ if ( ! $this->_plugin->settings->CurrentUserCan( 'view' ) ) {
821
+ die( 'Access Denied.' );
 
822
  }
823
  $roles = array();
824
+ foreach ( get_editable_roles() as $role_name => $role_info ) {
825
+ if ( strpos( $role_name, $_GET['term'] ) !== false ) {
826
+ array_push( $roles, $role_name );
827
  }
828
  }
829
+ echo json_encode( $roles );
830
+ exit;
831
+ }
832
+
833
+ /**
834
+ * Method: Get CPTs ajax handle.
835
+ *
836
+ * @since 2.6.7
837
+ */
838
+ public function AjaxGetAllCPT() {
839
+ if ( ! $this->_plugin->settings->CurrentUserCan( 'view' ) ) {
840
+ die( 'Access Denied.' );
841
+ }
842
+
843
+ $custom_post_types = array();
844
+ $output = 'names'; // names or objects, note names is the default
845
+ $operator = 'and'; // Conditions: and, or.
846
+ $post_types = get_post_types( array(), $output, $operator );
847
+ $post_types = array_diff( $post_types, array( 'attachment', 'revision', 'nav_menu_item', 'customize_changeset', 'custom_css' ) );
848
+ foreach ( $post_types as $post_type ) {
849
+ if ( strpos( $post_type, $_GET['term'] ) !== false ) {
850
+ array_push( $custom_post_types, $post_type );
851
+ }
852
+ }
853
+ echo json_encode( $custom_post_types );
854
  exit;
855
  }
856
  }
css/settings.css CHANGED
@@ -18,6 +18,7 @@
18
 
19
  .sectoken-user,
20
  .sectoken-role,
 
21
  .sectoken-other {
22
  display: inline-block;
23
  border-width: 1px;
@@ -34,6 +35,7 @@
34
 
35
  .sectoken-user a,
36
  .sectoken-role a,
 
37
  .sectoken-other a {
38
  text-decoration: none;
39
  font-size: 12px;
@@ -44,6 +46,7 @@
44
  border-radius: 25px;
45
  height: 14px;
46
  display: inline-block;
 
47
  width: 14px;
48
  text-align: center;
49
  line-height: 12px;
@@ -51,12 +54,14 @@
51
 
52
  .sectoken-user a:hover,
53
  .sectoken-role a:hover,
 
54
  .sectoken-other a:hover {
55
  background: #FB9;
56
  }
57
 
58
  .sectoken-user { background: #EFF; border-color: #5BE; }
59
  .sectoken-role { background: #EFE; border-color: #5B5; }
 
60
  .sectoken-other { background: #FFE; border-color: #ED5; }
61
  .sectoken-del { background: #FEE; border-color: #EBB; }
62
 
@@ -73,26 +78,26 @@
73
  /*
74
  * IOS button
75
  */
76
- .f-container {
77
- overflow: hidden;
78
- min-height: 1px;
79
  margin-top: 0;
80
  }
81
- .f-left {
82
  float: left;
83
  }
84
- .f-right {
85
  float: right;
86
  }
87
- .f-text {
88
  margin-top: 3px;
89
  margin-left: 8px;
90
  }
91
- input.switch[type="checkbox"],
92
- input.switch[type="radio"] {
93
  display: none;
94
  }
95
- input.switch[type="checkbox"] + label,
96
  input.switch[type="radio"] + label {
97
  background-color: white;
98
  border: 1px solid #b4b9be;;
@@ -106,7 +111,7 @@ input.switch[type="radio"] + label {
106
  vertical-align: middle;
107
  width: 38px;
108
  }
109
- input.switch[type="checkbox"] + label:after,
110
  input.switch[type="radio"] + label:after {
111
  background: none repeat scroll 0 0 white;
112
  border-radius: 100%;
@@ -119,20 +124,20 @@ input.switch[type="radio"] + label:after {
119
  transition: left 0.2s ease-in-out 0s;
120
  width: 16px;
121
  }
122
- input.switch[type="checkbox"]:checked + label,
123
  input.switch[type="radio"]:checked + label {
124
  background-color: #2ecc71;
125
  border-color: #2ecc71;
126
  box-shadow: 0 0 0 15.999px #2ecc71 inset;
127
  transition: background-color 1.2s ease 0s, border 0.4s ease 0s, box-shadow 0.4s ease 0s;
128
  }
129
- input.switch[type="checkbox"]:checked + label:after,
130
  input.switch[type="radio"]:checked + label:after {
131
  left: 20px;
132
  }
133
- input.switch[type="checkbox"]:disabled + label,
134
- input.switch[type="checkbox"]:disabled:checked + label,
135
- input.switch[type="radio"]:disabled + label,
136
  input.switch[type="radio"]:disabled:checked + label {
137
  background-color: #ecf0f1;
138
  border-color: #ecf0f1;
@@ -143,4 +148,4 @@ a.disabled {
143
  pointer-events: none;
144
  cursor: default;
145
  opacity: 0.6;
146
- }
18
 
19
  .sectoken-user,
20
  .sectoken-role,
21
+ .sectoken-cpts,
22
  .sectoken-other {
23
  display: inline-block;
24
  border-width: 1px;
35
 
36
  .sectoken-user a,
37
  .sectoken-role a,
38
+ .sectoken-cpts a,
39
  .sectoken-other a {
40
  text-decoration: none;
41
  font-size: 12px;
46
  border-radius: 25px;
47
  height: 14px;
48
  display: inline-block;
49
+ vertical-align: middle;
50
  width: 14px;
51
  text-align: center;
52
  line-height: 12px;
54
 
55
  .sectoken-user a:hover,
56
  .sectoken-role a:hover,
57
+ .sectoken-cpts a:hover,
58
  .sectoken-other a:hover {
59
  background: #FB9;
60
  }
61
 
62
  .sectoken-user { background: #EFF; border-color: #5BE; }
63
  .sectoken-role { background: #EFE; border-color: #5B5; }
64
+ .sectoken-cpts { background: #EFF; border-color: #5BE; }
65
  .sectoken-other { background: #FFE; border-color: #ED5; }
66
  .sectoken-del { background: #FEE; border-color: #EBB; }
67
 
78
  /*
79
  * IOS button
80
  */
81
+ .f-container {
82
+ overflow: hidden;
83
+ min-height: 1px;
84
  margin-top: 0;
85
  }
86
+ .f-left {
87
  float: left;
88
  }
89
+ .f-right {
90
  float: right;
91
  }
92
+ .f-text {
93
  margin-top: 3px;
94
  margin-left: 8px;
95
  }
96
+ input.switch[type="checkbox"],
97
+ input.switch[type="radio"] {
98
  display: none;
99
  }
100
+ input.switch[type="checkbox"] + label,
101
  input.switch[type="radio"] + label {
102
  background-color: white;
103
  border: 1px solid #b4b9be;;
111
  vertical-align: middle;
112
  width: 38px;
113
  }
114
+ input.switch[type="checkbox"] + label:after,
115
  input.switch[type="radio"] + label:after {
116
  background: none repeat scroll 0 0 white;
117
  border-radius: 100%;
124
  transition: left 0.2s ease-in-out 0s;
125
  width: 16px;
126
  }
127
+ input.switch[type="checkbox"]:checked + label,
128
  input.switch[type="radio"]:checked + label {
129
  background-color: #2ecc71;
130
  border-color: #2ecc71;
131
  box-shadow: 0 0 0 15.999px #2ecc71 inset;
132
  transition: background-color 1.2s ease 0s, border 0.4s ease 0s, box-shadow 0.4s ease 0s;
133
  }
134
+ input.switch[type="checkbox"]:checked + label:after,
135
  input.switch[type="radio"]:checked + label:after {
136
  left: 20px;
137
  }
138
+ input.switch[type="checkbox"]:disabled + label,
139
+ input.switch[type="checkbox"]:disabled:checked + label,
140
+ input.switch[type="radio"]:disabled + label,
141
  input.switch[type="radio"]:disabled:checked + label {
142
  background-color: #ecf0f1;
143
  border-color: #ecf0f1;
148
  pointer-events: none;
149
  cursor: default;
150
  opacity: 0.6;
151
+ }
js/settings.js CHANGED
@@ -5,22 +5,23 @@ jQuery(document).ready(function(){
5
  $this.remove();
6
  });
7
  };
8
-
9
- jQuery('#ViewerQueryBox, #EditorQueryBox, #ExRoleQueryBox, #ExUserQueryBox, #CustomQueryBox, #IpAddrQueryBox').keydown(function(event){
10
- if(event.keyCode === 13) {
11
  var type = jQuery(this).attr('id').substr(0, 6);
 
12
  jQuery('#'+type+'QueryAdd').click();
13
  return false;
14
  }
15
- });
16
-
17
- jQuery('#ViewerQueryAdd, #EditorQueryAdd, #ExRoleQueryAdd, #ExUserQueryAdd, #CustomQueryAdd, #IpAddrQueryAdd').click(function(){
18
- var type = jQuery(this).attr('id').substr(0, 6);
19
- var value = jQuery.trim(jQuery('#'+type+'QueryBox').val());
20
  var existing = jQuery('#'+type+'List input').filter(function() { return this.value === value; });
21
-
22
- if(!value || existing.length)return; // if value is empty or already used, stop here
23
-
24
  jQuery('#'+type+'QueryBox, #'+type+'QueryAdd').attr('disabled', true);
25
  jQuery.post(jQuery('#ajaxurl').val(), {action: 'AjaxCheckSecurityToken', token: value}, function(data){
26
  jQuery('#'+type+'QueryBox, #'+type+'QueryAdd').attr('disabled', false);
@@ -29,7 +30,7 @@ jQuery(document).ready(function(){
29
  alert('The specified token is not a user nor a role!');
30
  jQuery('#'+type+'QueryBox').val('');
31
  return;
32
- }
33
  }
34
  jQuery('#'+type+'QueryBox').val('');
35
  jQuery('#'+type+'List').append(jQuery('<span class="sectoken-'+data+'"/>').text(value).append(
@@ -38,9 +39,9 @@ jQuery(document).ready(function(){
38
  ));
39
  });
40
  });
41
-
42
- jQuery('#ViewerList>span>a, #EditorList>span>a, #ExRoleList>span>a, #ExUserList>span>a, #CustomList>span>a, #IpAddrList>span>a').click(RemoveSecToken);
43
-
44
  jQuery('#RestrictAdmins').change(function(){
45
  var user = jQuery('#RestrictAdminsDefaultUser').val();
46
  var fltr = function() { return this.value === user; };
@@ -49,7 +50,7 @@ jQuery(document).ready(function(){
49
  jQuery('#EditorList .sectoken-user').each(function(){
50
  if (jQuery(this).find('input[type=hidden]').val() === user) {
51
  jQuery(this).remove();
52
- }
53
  });
54
  }
55
  jQuery('#EditorList').append(jQuery('<span class="sectoken-user"/>').text(user).prepend(jQuery('<input type="hidden" name="Editors[]"/>').val(user)));
@@ -57,7 +58,7 @@ jQuery(document).ready(function(){
57
  jQuery('#EditorList .sectoken-user').each(function(){
58
  if (jQuery(this).find('input[type=hidden]').val() === user) {
59
  jQuery(this).remove();
60
- }
61
  });
62
  }
63
  });
@@ -72,5 +73,12 @@ jQuery(document).ready(function(){
72
  jQuery("#ExRoleQueryBox").autocomplete({
73
  source: rolesUrl,
74
  minLength:1
75
- });
 
 
 
 
 
 
 
76
  });
5
  $this.remove();
6
  });
7
  };
8
+
9
+ jQuery( '#ViewerQueryBox, #EditorQueryBox, #ExRoleQueryBox, #ExUserQueryBox, #CustomQueryBox, #IpAddrQueryBox, #ExCPTsQueryBox' ).keydown( function( event ) {
10
+ if ( event.keyCode === 13 ) {
11
  var type = jQuery(this).attr('id').substr(0, 6);
12
+ console.log( type );
13
  jQuery('#'+type+'QueryAdd').click();
14
  return false;
15
  }
16
+ } );
17
+
18
+ jQuery( '#ViewerQueryAdd, #EditorQueryAdd, #ExRoleQueryAdd, #ExUserQueryAdd, #CustomQueryAdd, #IpAddrQueryAdd, #ExCPTsQueryAdd' ).click(function(){
19
+ var type = jQuery(this).attr('id').substr(0, 6);
20
+ var value = jQuery.trim(jQuery('#'+type+'QueryBox').val());
21
  var existing = jQuery('#'+type+'List input').filter(function() { return this.value === value; });
22
+
23
+ if( ! value || existing.length ) return; // if value is empty or already used, stop here
24
+
25
  jQuery('#'+type+'QueryBox, #'+type+'QueryAdd').attr('disabled', true);
26
  jQuery.post(jQuery('#ajaxurl').val(), {action: 'AjaxCheckSecurityToken', token: value}, function(data){
27
  jQuery('#'+type+'QueryBox, #'+type+'QueryAdd').attr('disabled', false);
30
  alert('The specified token is not a user nor a role!');
31
  jQuery('#'+type+'QueryBox').val('');
32
  return;
33
+ }
34
  }
35
  jQuery('#'+type+'QueryBox').val('');
36
  jQuery('#'+type+'List').append(jQuery('<span class="sectoken-'+data+'"/>').text(value).append(
39
  ));
40
  });
41
  });
42
+
43
+ jQuery( '#ViewerList>span>a, #EditorList>span>a, #ExRoleList>span>a, #ExUserList>span>a, #CustomList>span>a, #IpAddrList>span>a, #ExCPTsList>span>a' ).click( RemoveSecToken );
44
+
45
  jQuery('#RestrictAdmins').change(function(){
46
  var user = jQuery('#RestrictAdminsDefaultUser').val();
47
  var fltr = function() { return this.value === user; };
50
  jQuery('#EditorList .sectoken-user').each(function(){
51
  if (jQuery(this).find('input[type=hidden]').val() === user) {
52
  jQuery(this).remove();
53
+ }
54
  });
55
  }
56
  jQuery('#EditorList').append(jQuery('<span class="sectoken-user"/>').text(user).prepend(jQuery('<input type="hidden" name="Editors[]"/>').val(user)));
58
  jQuery('#EditorList .sectoken-user').each(function(){
59
  if (jQuery(this).find('input[type=hidden]').val() === user) {
60
  jQuery(this).remove();
61
+ }
62
  });
63
  }
64
  });
73
  jQuery("#ExRoleQueryBox").autocomplete({
74
  source: rolesUrl,
75
  minLength:1
76
+ });
77
+
78
+ var cptsUrl = ajaxurl + "?action=AjaxGetAllCPT";
79
+ console.log( cptsUrl );
80
+ jQuery( '#ExCPTsQueryBox' ).autocomplete( {
81
+ source: cptsUrl,
82
+ minLength: 1,
83
+ } );
84
  });
languages/wp-security-audit-log.pot CHANGED
@@ -1,121 +1,163 @@
1
- # Copyright (C) 2016 WP Security Audit Log
2
- # This file is distributed under the same license as the WP Security Audit Log package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: WP Security Audit Log 2.5.3\n"
6
- "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-security-audit-"
7
- "log\n"
8
- "POT-Creation-Date: 2016-09-14 19:44:43+00:00\n"
 
 
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "PO-Revision-Date: 2016-MO-DA HO:MI+ZONE\n"
13
- "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
- "Language-Team: LANGUAGE <LL@li.org>\n"
15
-
16
- #: classes/AuditLogListView.php:36
 
 
 
 
 
 
 
17
  msgid "No events so far."
18
  msgstr ""
19
 
20
- #: classes/AuditLogListView.php:42
21
  msgid "Other"
22
  msgstr ""
23
 
24
- #: classes/AuditLogListView.php:49
25
  msgid "Show "
26
  msgstr ""
27
 
28
- #: classes/AuditLogListView.php:59
29
  msgid " Items"
30
  msgstr ""
31
 
32
- #: classes/AuditLogListView.php:72 classes/Views/AuditLog.php:96
 
33
  msgid "All Sites"
34
  msgstr ""
35
 
36
- #: classes/AuditLogListView.php:123 classes/AuditLogListView.php:143
37
- #: classes/Views/ToggleAlerts.php:75
38
- msgid "Code"
39
  msgstr ""
40
 
41
- #: classes/AuditLogListView.php:124 classes/AuditLogListView.php:146
42
- #: classes/Views/ToggleAlerts.php:76
43
- msgid "Type"
44
  msgstr ""
45
 
46
- #: classes/AuditLogListView.php:125 classes/AuditLogListView.php:149
47
- msgid "Date"
48
  msgstr ""
49
 
50
- #: classes/AuditLogListView.php:126 classes/AuditLogListView.php:152
51
  msgid "Username"
52
  msgstr ""
53
 
54
- #: classes/AuditLogListView.php:127 classes/AuditLogListView.php:155
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
  msgid "Source IP"
56
  msgstr ""
57
 
58
- #: classes/AuditLogListView.php:130 classes/AuditLogListView.php:158
59
  msgid "Site"
60
  msgstr ""
61
 
62
- #: classes/AuditLogListView.php:132 classes/AuditLogListView.php:161
63
  msgid "Message"
64
  msgstr ""
65
 
66
- #: classes/AuditLogListView.php:197
67
  msgid "Click to toggle."
68
  msgstr ""
69
 
70
- #: classes/AuditLogListView.php:203
 
 
 
 
71
  msgid "Unknown error code."
72
  msgstr ""
73
 
74
- #: classes/AuditLogListView.php:227
 
 
 
 
75
  msgid "Unknown"
76
  msgstr ""
77
 
78
- #: classes/AuditLogListView.php:231
79
  msgid "Plugin"
80
  msgstr ""
81
 
82
- #: classes/AuditLogListView.php:235
83
  msgid "Plugins"
84
  msgstr ""
85
 
86
- #: classes/AuditLogListView.php:239
87
  msgid "Website Visitor"
88
  msgstr ""
89
 
90
- #: classes/AuditLogListView.php:243
91
  msgid "System"
92
  msgstr ""
93
 
94
- #: classes/AuditLogListView.php:271
 
 
 
 
95
  msgid "Alert Data Inspector"
96
  msgstr ""
97
 
98
- #: classes/Sensors/Content.php:421 classes/Sensors/Content.php:429
 
99
  msgid "Password Protected"
100
  msgstr ""
101
 
102
- #: classes/Sensors/Content.php:423 classes/Sensors/Content.php:431
103
  msgid "Public"
104
  msgstr ""
105
 
106
- #: classes/Sensors/Content.php:425 classes/Sensors/Content.php:433
107
  msgid "Private"
108
  msgstr ""
109
 
110
- #: classes/Views/About.php:6
 
 
 
 
 
 
 
 
111
  msgid "About WP Security Audit Log"
112
  msgstr ""
113
 
114
- #: classes/Views/About.php:14
115
  msgid "About"
116
  msgstr ""
117
 
118
- #: classes/Views/About.php:28
119
  msgid ""
120
  "WP Security Audit Log enables WordPress administrators and owners to "
121
  "identify WordPress security issues before they become a security problem by "
@@ -123,12 +165,12 @@ msgid ""
123
  "WordPress security professionals WP White Security."
124
  msgstr ""
125
 
126
- #: classes/Views/About.php:30
127
  msgid ""
128
  "Keep A WordPress Security Audit Log & Identify WordPress Security Issues"
129
  msgstr ""
130
 
131
- #: classes/Views/About.php:32
132
  msgid ""
133
  "WP Security Audit Log logs everything happening on your WordPress blog or "
134
  "website and WordPress multisite network. By using WP Security Audit Log "
@@ -137,155 +179,157 @@ msgid ""
137
  "generated by the plugin when:"
138
  msgstr ""
139
 
140
- #: classes/Views/About.php:35
141
  msgid "User creates a new user or a new user is registered"
142
  msgstr ""
143
 
144
- #: classes/Views/About.php:36
145
  msgid ""
146
  "Existing user changes the role, password or other properties of another user"
147
  msgstr ""
148
 
149
- #: classes/Views/About.php:37
150
  msgid "Existing user on a WordPress multisite network is added to a site"
151
  msgstr ""
152
 
153
- #: classes/Views/About.php:38
154
  msgid "User uploads or deletes a file, changes a password or email address"
155
  msgstr ""
156
 
157
- #: classes/Views/About.php:39
158
  msgid "User installs, activates, deactivates, upgrades or uninstalls a plugin"
159
  msgstr ""
160
 
161
- #: classes/Views/About.php:40
162
  msgid ""
163
  "User creates, modifies or deletes a new post, page, category or a custom "
164
  "post type"
165
  msgstr ""
166
 
167
- #: classes/Views/About.php:41
168
  msgid "User installs or activates a WordPress theme"
169
  msgstr ""
170
 
171
- #: classes/Views/About.php:42
172
  msgid "User adds, modifies or deletes a widget"
173
  msgstr ""
174
 
175
- #: classes/Views/About.php:43
176
  msgid "User uses the dashboard file editor"
177
  msgstr ""
178
 
179
- #: classes/Views/About.php:44
180
  msgid "WordPress settings are changed"
181
  msgstr ""
182
 
183
- #: classes/Views/About.php:45
184
  msgid "Failed login attempts"
185
  msgstr ""
186
 
187
- #: classes/Views/About.php:46
188
  msgid "and much more&hellip;"
189
  msgstr ""
190
 
191
- #: classes/Views/About.php:56
192
  msgid "Extend the Functionality & Get More Value from WP Security Audit Log"
193
  msgstr ""
194
 
195
- #: classes/Views/About.php:59
196
  msgid ""
197
  "Get more value out of WP Security Audit Log by extending the functionality "
198
  "of WP Security Audit Log with the premium Add-Ons."
199
  msgstr ""
200
 
201
- #: classes/Views/About.php:61
202
  msgid "See Add-Ons"
203
  msgstr ""
204
 
205
- #: classes/Views/About.php:65 classes/Views/Help.php:68
206
  msgid "WP Security Audit Log in your Language!"
207
  msgstr ""
208
 
209
- #: classes/Views/About.php:67 classes/Views/Help.php:70
210
  msgid ""
211
  "If you are interested in translating our plugin please drop us an email on"
212
  msgstr ""
213
 
214
- #: classes/Views/About.php:72
215
  msgid "WordPress Security Services"
216
  msgstr ""
217
 
218
- #: classes/Views/About.php:74
219
  msgid "Professional WordPress security services provided by WP White Security"
220
  msgstr ""
221
 
222
- #: classes/Views/AuditLog.php:34
223
  msgid "Upgrade to Premium"
224
  msgstr ""
225
 
226
- #: classes/Views/AuditLog.php:35
227
  msgid ""
228
  "and add Email Alerts, Reports, Search and Users Login and Session Management."
229
  msgstr ""
230
 
231
- #: classes/Views/AuditLog.php:36
232
  msgid "Upgrade Now!"
233
  msgstr ""
234
 
235
- #: classes/Views/AuditLog.php:50 classes/Views/AuditLog.php:60
236
  msgid "Audit Log Viewer"
237
  msgstr ""
238
 
239
- #: classes/Views/AuditLog.php:74 classes/Views/Licensing.php:34
240
- #: classes/Views/Settings.php:132 classes/Views/ToggleAlerts.php:30
241
  msgid "You do not have sufficient permissions to access this page."
242
  msgstr ""
243
 
244
- #: classes/Views/AuditLog.php:95
245
  msgid "Please enter the number of alerts you would like to see on one page:"
246
  msgstr ""
247
 
248
- #: classes/Views/AuditLog.php:97
249
  msgid "No Results"
250
  msgstr ""
251
 
252
- #: classes/Views/EmailNotifications.php:7
253
  msgid "Email Notifications Add-On"
254
  msgstr ""
255
 
256
- #: classes/Views/EmailNotifications.php:17
257
  msgid "Notifications Email"
258
  msgstr ""
259
 
260
- #: classes/Views/EmailNotifications.php:39 classes/Views/Extensions.php:69
261
  msgid "Email Notifications"
262
  msgstr ""
263
 
264
- #: classes/Views/EmailNotifications.php:41
265
  msgid ""
266
  "This premium add-on allows you to configure email alerts so you are "
267
  "<br>notified instantly when important changes happen on your WordPress."
268
  msgstr ""
269
 
270
- #: classes/Views/EmailNotifications.php:45 classes/Views/LogInUsers.php:45
271
- #: classes/Views/Reports.php:45 classes/Views/Search.php:45
 
272
  msgid "Learn More"
273
  msgstr ""
274
 
275
- #: classes/Views/EmailNotifications.php:54 classes/Views/LogInUsers.php:54
276
- #: classes/Views/Reports.php:54 classes/Views/Search.php:54
 
277
  msgid "Buy all Add-Ons Bundle"
278
  msgstr ""
279
 
280
- #: classes/Views/Extensions.php:8
281
  msgid "WP Security Audit Log Add-Ons"
282
  msgstr ""
283
 
284
- #: classes/Views/Extensions.php:16
285
  msgid " Add Functionality"
286
  msgstr ""
287
 
288
- #: classes/Views/Extensions.php:35
289
  msgid ""
290
  "The below add-ons allow you to extend the functionality of WP Security Audit "
291
  "Log plugin and enable you to get more benefits out of the WordPress security "
@@ -294,139 +338,155 @@ msgid ""
294
  "regulatory compliance requirements."
295
  msgstr ""
296
 
297
- #: classes/Views/Extensions.php:41
298
  msgid "All Add-Ons Bundle"
299
  msgstr ""
300
 
301
- #: classes/Views/Extensions.php:43
 
302
  msgid ""
303
  "Benefit from a 60% discount when you purchase all the add-ons as a single "
304
  "bundle."
305
  msgstr ""
306
 
307
- #: classes/Views/Extensions.php:46
308
  msgid "Get this Bundle"
309
  msgstr ""
310
 
311
- #: classes/Views/Extensions.php:54
312
  msgid "Users Logins and Management"
313
  msgstr ""
314
 
315
- #: classes/Views/Extensions.php:56
316
  msgid ""
317
  "See who is logged in to your WordPress and manage user sessions and logins."
318
  msgstr ""
319
 
320
- #: classes/Views/Extensions.php:60 classes/Views/Extensions.php:75
321
- #: classes/Views/Extensions.php:90 classes/Views/Extensions.php:105
322
- #: classes/Views/Extensions.php:120
323
  msgid "Get this extension"
324
  msgstr ""
325
 
326
- #: classes/Views/Extensions.php:71
327
  msgid ""
328
  "Get notified instantly via email when important changes are made on your "
329
  "WordPress!"
330
  msgstr ""
331
 
332
- #: classes/Views/Extensions.php:84 classes/Views/Reports.php:17
333
- #: classes/Views/Reports.php:39
334
  msgid "Reports"
335
  msgstr ""
336
 
337
- #: classes/Views/Extensions.php:86
338
  msgid ""
339
  "Generate any type of user,site and activity report to keep track of user "
340
  "productivity and to meet regulatory compliance requirements."
341
  msgstr ""
342
 
343
- #: classes/Views/Extensions.php:99 classes/Views/Search.php:17
344
- #: classes/Views/Search.php:39
345
  msgid "Search"
346
  msgstr ""
347
 
348
- #: classes/Views/Extensions.php:101
349
  msgid ""
350
  "Do free-text based searches for specific activity in the WordPress audit "
351
  "trail. You can also use filters to fine-tune your searches."
352
  msgstr ""
353
 
354
- #: classes/Views/Extensions.php:114
355
  msgid "External DB"
356
  msgstr ""
357
 
358
- #: classes/Views/Extensions.php:116
359
  msgid ""
360
  "Store the WordPress audit trial in an external database for a more secure "
361
  "and faster WordPress website."
362
  msgstr ""
363
 
364
- #: classes/Views/Help.php:6 classes/Views/Help.php:14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
365
  msgid "Help"
366
  msgstr ""
367
 
368
- #: classes/Views/Help.php:27
369
  msgid "Plugin Support"
370
  msgstr ""
371
 
372
- #: classes/Views/Help.php:29
373
  msgid ""
374
  "Have you encountered or noticed any issues while using WP Security Audit Log "
375
  "plugin?"
376
  msgstr ""
377
 
378
- #: classes/Views/Help.php:30
379
  msgid ""
380
  "Or you want to report something to us? Click any of the options below to "
381
  "post on the plugin's forum or contact our support directly."
382
  msgstr ""
383
 
384
- #: classes/Views/Help.php:32
385
  msgid "Free Support Forum"
386
  msgstr ""
387
 
388
- #: classes/Views/Help.php:34
389
  msgid "Free Support Email"
390
  msgstr ""
391
 
392
- #: classes/Views/Help.php:39
393
  msgid "Plugin Documentation"
394
  msgstr ""
395
 
396
- #: classes/Views/Help.php:41
397
  msgid ""
398
  "For more detailed information about WP Security Audit Log you can visit the "
399
  "plugin website."
400
  msgstr ""
401
 
402
- #: classes/Views/Help.php:42
403
  msgid ""
404
  "You can also visit the official list of WordPress Security Alerts for more "
405
  "information about all of the WordPress activity and changes you can monitor "
406
  "with WP Security Audit Log."
407
  msgstr ""
408
 
409
- #: classes/Views/Help.php:44
410
  msgid "Plugin Website"
411
  msgstr ""
412
 
413
- #: classes/Views/Help.php:46
414
  msgid "Plugin Documenation"
415
  msgstr ""
416
 
417
- #: classes/Views/Help.php:48
418
  msgid "FAQs"
419
  msgstr ""
420
 
421
- #: classes/Views/Help.php:50
422
  msgid "List of WordPress Security Alerts"
423
  msgstr ""
424
 
425
- #: classes/Views/Help.php:55
426
  msgid "Keep Yourself Up-to-Date with WordPress Security"
427
  msgstr ""
428
 
429
- #: classes/Views/Help.php:57
430
  msgid ""
431
  "Keep yourself informed with what is happening in the WordPress security "
432
  "ecosystem, which are the new vulnerabilities, which plugins you need to "
@@ -434,1851 +494,1969 @@ msgid ""
434
  "step ahead of the hackers."
435
  msgstr ""
436
 
437
- #: classes/Views/Help.php:59
438
  msgid "Read the WP White Security Blog"
439
  msgstr ""
440
 
441
- #: classes/Views/Help.php:61
442
  msgid ""
443
  "Subscribe to WP Security Bloggers (An Aggregate of WordPress Security Blogs)"
444
  msgstr ""
445
 
446
- #: classes/Views/Licensing.php:6 classes/Views/Licensing.php:14
447
  msgid "Licensing"
448
  msgstr ""
449
 
450
- #: classes/Views/Licensing.php:39 classes/Views/Settings.php:138
451
- #: classes/Views/ToggleAlerts.php:45
452
  msgid "Settings have been saved."
453
  msgstr ""
454
 
455
- #: classes/Views/Licensing.php:41 classes/Views/Settings.php:141
456
- #: classes/Views/ToggleAlerts.php:47
457
  msgid "Error: "
458
  msgstr ""
459
 
460
- #: classes/Views/Licensing.php:61
461
  msgid "Version"
462
  msgstr ""
463
 
464
- #: classes/Views/Licensing.php:71
465
  msgid "Active"
466
  msgstr ""
467
 
468
- #: classes/Views/Licensing.php:73
469
  msgid "Inactive"
470
  msgstr ""
471
 
472
- #: classes/Views/LogInUsers.php:7
473
  msgid "User Sessions Management Add-On"
474
  msgstr ""
475
 
476
- #: classes/Views/LogInUsers.php:17
477
  msgid "Logged In Users"
478
  msgstr ""
479
 
480
- #: classes/Views/LogInUsers.php:39
481
  msgid "Users login and Management"
482
  msgstr ""
483
 
484
- #: classes/Views/LogInUsers.php:41
485
  msgid ""
486
  "This premium add-on allows you to see who is logged in to your WordPress,"
487
  "<br> block multiple same-user WordPress sessions and more."
488
  msgstr ""
489
 
490
- #: classes/Views/Reports.php:7
491
  msgid "Reports Add-On"
492
  msgstr ""
493
 
494
- #: classes/Views/Reports.php:41
495
  msgid ""
496
  "Generate any type of user and site activity report to keep track of user "
497
  "productivity<br> and meet regulatory compliance requirements. You can also "
498
  "configure automated weekly or monthly email summary reports."
499
  msgstr ""
500
 
501
- #: classes/Views/Search.php:7
502
  msgid "Search Add-On"
503
  msgstr ""
504
 
505
- #: classes/Views/Search.php:41
506
  msgid ""
507
  "Do free-text based searches for specific activity in the WordPress audit "
508
  "trail.<br> You can also use the built-in filters to fine-tune your searches."
509
  msgstr ""
510
 
511
- #: classes/Views/Settings.php:22 classes/Views/Settings.php:30
512
  msgid "Settings"
513
  msgstr ""
514
 
515
- #: classes/Views/Settings.php:162
516
- msgid "Security Alerts Pruning"
517
- msgstr ""
518
-
519
- #: classes/Views/Settings.php:165 classes/Views/Settings.php:173
520
- msgid "(eg: 1 month)"
521
- msgstr ""
522
-
523
- #: classes/Views/Settings.php:169
524
- msgid "None"
525
- msgstr ""
526
-
527
- #: classes/Views/Settings.php:177
528
- msgid "Delete alerts older than"
529
- msgstr ""
530
-
531
- #: classes/Views/Settings.php:185
532
- msgid "(eg: 80)"
533
- msgstr ""
534
-
535
- #: classes/Views/Settings.php:189
536
- msgid "Keep up to"
537
- msgstr ""
538
-
539
- #: classes/Views/Settings.php:194
540
- msgid "alerts"
541
- msgstr ""
542
-
543
- #: classes/Views/Settings.php:198
544
- msgid "Next Scheduled Cleanup is in "
545
  msgstr ""
546
 
547
- #: classes/Views/Settings.php:202
548
- msgid "(or %s)"
549
  msgstr ""
550
 
551
- #: classes/Views/Settings.php:203
552
- msgid "Run Manually"
553
  msgstr ""
554
 
555
- #: classes/Views/Settings.php:209
556
  msgid "From Email & Name"
557
  msgstr ""
558
 
559
- #: classes/Views/Settings.php:212
560
  msgid "Email Address"
561
  msgstr ""
562
 
563
- #: classes/Views/Settings.php:215
564
  msgid "Display Name"
565
  msgstr ""
566
 
567
- #: classes/Views/Settings.php:221
 
568
  msgid ""
569
  "These email address and display name will be used as From details in the "
570
  "emails sent by the %s . Please ensure the mail server can relay emails with "
571
  "the domain of the specified email address."
572
  msgstr ""
573
 
574
- #: classes/Views/Settings.php:222
575
  msgid "(premium add-ons)"
576
  msgstr ""
577
 
578
- #: classes/Views/Settings.php:229
579
  msgid "Alerts Dashboard Widget"
580
  msgstr ""
581
 
582
- #: classes/Views/Settings.php:235
583
  msgid "On"
584
  msgstr ""
585
 
586
- #: classes/Views/Settings.php:240
587
  msgid "Off"
588
  msgstr ""
589
 
590
- #: classes/Views/Settings.php:245
 
591
  msgid "Display a dashboard widget with the latest %d security alerts."
592
  msgstr ""
593
 
594
- #: classes/Views/Settings.php:253
595
  msgid "Reverse Proxy / Firewall Options"
596
  msgstr ""
597
 
598
- #: classes/Views/Settings.php:259
599
  msgid "WordPress running behind firewall or proxy"
600
  msgstr ""
601
 
602
- #: classes/Views/Settings.php:260
603
  msgid ""
604
  "Enable this option if your WordPress is running behind a firewall or reverse "
605
  "proxy. When this option is enabled the plugin will retrieve the user's IP "
606
  "address from the proxy header."
607
  msgstr ""
608
 
609
- #: classes/Views/Settings.php:266
610
  msgid "Filter Internal IP Addresses"
611
  msgstr ""
612
 
613
- #: classes/Views/Settings.php:267
614
  msgid ""
615
  "Enable this option to filter internal IP addresses from the proxy headers."
616
  msgstr ""
617
 
618
- #: classes/Views/Settings.php:273
619
- msgid "Can View Alerts"
620
- msgstr ""
621
-
622
- #: classes/Views/Settings.php:280
623
- msgid "Users and Roles in this list can view the security alerts"
624
- msgstr ""
625
-
626
- #: classes/Views/Settings.php:295
627
  msgid "Can Manage Plugin"
628
  msgstr ""
629
 
630
- #: classes/Views/Settings.php:302
631
  msgid "Users and Roles in this list can manage the plugin settings"
632
  msgstr ""
633
 
634
- #: classes/Views/Settings.php:317
635
  msgid "Restrict Plugin Access"
636
  msgstr ""
637
 
638
- #: classes/Views/Settings.php:325
639
  msgid ""
640
- "By default all the administrators on this WordPress have access to manage "
641
- "this plugin.<br/>By enabling this option only the users specified in the two "
642
- "options above and your username will have access to view alerts and manage "
643
- "this plugin."
644
  msgstr ""
645
 
646
- #: classes/Views/Settings.php:332
647
- msgid "Refresh Audit Log Viewer"
 
 
 
648
  msgstr ""
649
 
650
- #: classes/Views/Settings.php:338
651
- msgid "Automatic"
652
  msgstr ""
653
 
654
- #: classes/Views/Settings.php:340
655
- msgid "Refresh Audit Log Viewer as soon as there are new alerts."
 
 
 
656
  msgstr ""
657
 
658
- #: classes/Views/Settings.php:344
659
- msgid "Manual"
660
  msgstr ""
661
 
662
- #: classes/Views/Settings.php:346
663
- msgid "Refresh Audit Log Viewer only when the page is reloaded."
664
  msgstr ""
665
 
666
- #: classes/Views/Settings.php:352
667
- msgid "Alerts Time Format"
668
  msgstr ""
669
 
670
- #: classes/Views/Settings.php:358
671
- msgid "24 hours"
672
  msgstr ""
673
 
674
- #: classes/Views/Settings.php:363
675
- msgid "AM/PM"
 
 
676
  msgstr ""
677
 
678
- #: classes/Views/Settings.php:370
679
- msgid "Alerts Timestamp"
680
  msgstr ""
681
 
682
- #: classes/Views/Settings.php:376
683
- msgid "UTC"
684
  msgstr ""
685
 
686
- #: classes/Views/Settings.php:381
687
- msgid "WordPress' timezone"
 
 
688
  msgstr ""
689
 
690
- #: classes/Views/Settings.php:384
691
- msgid ""
692
- "Select which timestamp should the alerts have in the Audit Log viewer. Note "
693
- "that the WordPress' timezone might be different from that of the server."
694
  msgstr ""
695
 
696
- #: classes/Views/Settings.php:389
697
- msgid "Audit Log Columns Selection"
698
  msgstr ""
699
 
700
- #: classes/Views/Settings.php:400
701
- msgid ""
702
- "When you disable any of the above such details won’t be shown in the Audit "
703
- "Log\n"
704
- "viewer though the plugin will still record such information in the database."
705
  msgstr ""
706
 
707
  #: classes/Views/Settings.php:406
708
- msgid "Developer Options"
 
 
709
  msgstr ""
710
 
711
- #: classes/Views/Settings.php:414
712
- msgid ""
713
- "Only enable these options on testing, staging and development websites. "
714
- "Enabling any of the settings below on LIVE websites may cause unintended "
715
- "side-effects including degraded performance."
 
716
  msgstr ""
717
 
718
  #: classes/Views/Settings.php:418
719
- msgid "Data Inspector"
720
  msgstr ""
721
 
722
- #: classes/Views/Settings.php:419
723
- msgid "View data logged for each triggered alert."
 
 
 
 
724
  msgstr ""
725
 
726
- #: classes/Views/Settings.php:422
727
- msgid "PHP Errors"
728
  msgstr ""
729
 
730
- #: classes/Views/Settings.php:423
731
- msgid "Enables sensor for alerts generated from PHP."
732
  msgstr ""
733
 
734
- #: classes/Views/Settings.php:426
735
- msgid "Request Log"
736
  msgstr ""
737
 
738
- #: classes/Views/Settings.php:427
739
- msgid "Enables logging request to file."
 
740
  msgstr ""
741
 
742
- #: classes/Views/Settings.php:430
743
- msgid "Backtrace"
744
  msgstr ""
745
 
746
- #: classes/Views/Settings.php:431
747
- msgid "Log full backtrace for PHP-generated alerts."
748
  msgstr ""
749
 
750
- #: classes/Views/Settings.php:449
751
- msgid "Hide Plugin in Plugins Page"
752
  msgstr ""
753
 
754
- #: classes/Views/Settings.php:455
755
- msgid "Hide"
756
  msgstr ""
757
 
758
- #: classes/Views/Settings.php:459
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
759
  msgid ""
760
- "To manually revert this setting set the value of option wsal-hide-plugin to "
761
- "0 in the wp_options table."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
762
  msgstr ""
763
 
764
- #: classes/Views/Settings.php:465
765
  msgid "Disable Alerts for WordPress Background Activity"
766
  msgstr ""
767
 
768
- #: classes/Views/Settings.php:471
769
  msgid "Hide activity"
770
  msgstr ""
771
 
772
- #: classes/Views/Settings.php:475
773
  msgid ""
774
  "For example do not raise an alert when WordPress deletes the auto drafts."
775
  msgstr ""
776
 
777
- #: classes/Views/Settings.php:481
778
- msgid "Remove Data on Uninstall"
779
  msgstr ""
780
 
781
- #: classes/Views/Settings.php:504
782
  msgid "Excluded Users"
783
  msgstr ""
784
 
785
- #: classes/Views/Settings.php:523
786
  msgid "Excluded Roles"
787
  msgstr ""
788
 
789
- #: classes/Views/Settings.php:549
 
 
 
 
790
  msgid "Excluded Custom Fields"
791
  msgstr ""
792
 
793
- #: classes/Views/Settings.php:574
 
 
 
 
794
  msgid "Excluded IP Addresses"
795
  msgstr ""
796
 
797
- #: classes/Views/ToggleAlerts.php:6 classes/Views/ToggleAlerts.php:14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
798
  msgid "Enable/Disable Alerts"
799
  msgstr ""
800
 
801
- #: classes/Views/ToggleAlerts.php:77 classes/WidgetManager.php:48
802
  msgid "Description"
803
  msgstr ""
804
 
805
- #: classes/Views/ToggleAlerts.php:87
806
  msgid "Not Implemented"
807
  msgstr ""
808
 
809
- #: classes/Views/ToggleAlerts.php:90
810
  msgid "Not Available"
811
  msgstr ""
812
 
813
- #: classes/Views/ToggleAlerts.php:105
814
  msgid ""
815
  "Capture 404 requests to file (the log file are created in the /wp-content/"
816
  "uploads/wp-security-audit-log/404s/ directory)"
817
  msgstr ""
818
 
819
- #: classes/Views/ToggleAlerts.php:110
820
  msgid "Purge log files older than one month"
821
  msgstr ""
822
 
823
- #: classes/Views/ToggleAlerts.php:118
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
824
  msgid "Save Changes"
825
  msgstr ""
826
 
827
- #: classes/WidgetManager.php:22
828
  msgid "Latest Alerts"
829
  msgstr ""
830
 
831
- #: classes/WidgetManager.php:42
832
  msgid "No alerts found."
833
  msgstr ""
834
 
835
- #: classes/WidgetManager.php:47
836
- msgid "User"
837
- msgstr ""
838
-
839
- #: defaults.php:17
840
  msgid "Fatal run-time error."
841
  msgstr ""
842
 
843
- #: defaults.php:18
844
  msgid "Run-time warning (non-fatal error)."
845
  msgstr ""
846
 
847
- #: defaults.php:19
848
  msgid "Compile-time parse error."
849
  msgstr ""
850
 
851
- #: defaults.php:20
852
  msgid "Run-time notice."
853
  msgstr ""
854
 
855
- #: defaults.php:21
856
  msgid "Fatal error that occurred during startup."
857
  msgstr ""
858
 
859
- #: defaults.php:22
860
  msgid "Warnings that occurred during startup."
861
  msgstr ""
862
 
863
- #: defaults.php:23
864
  msgid "Fatal compile-time error."
865
  msgstr ""
866
 
867
- #: defaults.php:24
868
  msgid "Compile-time warning."
869
  msgstr ""
870
 
871
- #: defaults.php:25
872
  msgid "User-generated error message."
873
  msgstr ""
874
 
875
- #: defaults.php:26
876
  msgid "User-generated warning message."
877
  msgstr ""
878
 
879
- #: defaults.php:27
880
  msgid "User-generated notice message."
881
  msgstr ""
882
 
883
- #: defaults.php:28
884
  msgid "Non-standard/optimal code warning."
885
  msgstr ""
886
 
887
- #: defaults.php:29
888
  msgid "Catchable fatal error."
889
  msgstr ""
890
 
891
- #: defaults.php:30
892
  msgid "Run-time deprecation notices."
893
  msgstr ""
894
 
895
- #: defaults.php:31
896
  msgid "Run-time user deprecation notices."
897
  msgstr ""
898
 
899
- #: defaults.php:33
900
  msgid "Critical, high-impact messages."
901
  msgstr ""
902
 
903
- #: defaults.php:34
904
  msgid "Debug informational messages."
905
  msgstr ""
906
 
907
- #: defaults.php:38
908
- msgid "Other User Activity"
909
  msgstr ""
910
 
911
- #: defaults.php:39
912
- msgid "User logged in"
913
  msgstr ""
914
 
915
- #: defaults.php:39
916
- msgid "Successfully logged in."
917
  msgstr ""
918
 
919
- #: defaults.php:40
920
- msgid "User logged out"
 
 
921
  msgstr ""
922
 
923
- #: defaults.php:40
924
- msgid "Successfully logged out."
925
- msgstr ""
926
-
927
- #: defaults.php:41
928
- msgid "Login failed"
929
- msgstr ""
930
-
931
- #: defaults.php:41
932
- msgid "%Attempts% failed login(s) detected."
933
- msgstr ""
934
-
935
- #: defaults.php:42
936
- msgid "Login failed / non existing user"
937
- msgstr ""
938
-
939
- #: defaults.php:42
940
- msgid "%Attempts% failed login(s) detected using non existing user."
941
- msgstr ""
942
-
943
- #: defaults.php:43
944
- msgid "Login blocked"
945
- msgstr ""
946
-
947
- #: defaults.php:43
948
- msgid ""
949
- "Blocked from logging in because the same WordPress user is logged in from "
950
- "%ClientIP%."
951
- msgstr ""
952
-
953
- #: defaults.php:44
954
- msgid "User logged in with existing session(s)"
955
- msgstr ""
956
-
957
- #: defaults.php:44
958
- msgid ""
959
- "Successfully logged in. Another session from %IPAddress% for this user "
960
- "already exist."
961
- msgstr ""
962
-
963
- #: defaults.php:45
964
- msgid "User uploaded file from Uploads directory"
965
- msgstr ""
966
-
967
- #: defaults.php:45
968
- msgid "Uploaded the file %FileName% in %FilePath%."
969
- msgstr ""
970
-
971
- #: defaults.php:46
972
- msgid "User deleted file from Uploads directory"
973
- msgstr ""
974
-
975
- #: defaults.php:46
976
- msgid "Deleted the file %FileName% from %FilePath%."
977
- msgstr ""
978
-
979
- #: defaults.php:48
980
- msgid "Blog Posts"
981
- msgstr ""
982
-
983
- #: defaults.php:49
984
- msgid "User created a new blog post and saved it as draft"
985
- msgstr ""
986
-
987
- #: defaults.php:49
988
- msgid ""
989
- "Created a new post called %PostTitle% and saved it as draft. %EditorLinkPost"
990
- "%."
991
- msgstr ""
992
-
993
- #: defaults.php:50
994
  msgid "User published a blog post"
995
  msgstr ""
996
 
997
- #: defaults.php:50
998
  msgid ""
999
  "Published a post called %PostTitle%. Post URL is %PostUrl%. %EditorLinkPost%."
1000
  msgstr ""
1001
 
1002
- #: defaults.php:51
1003
  msgid "User modified a published blog post"
1004
  msgstr ""
1005
 
1006
- #: defaults.php:51
1007
  msgid ""
1008
  "Modified the published post %PostTitle%. Post URL is %PostUrl%. "
1009
  "%EditorLinkPost%."
1010
  msgstr ""
1011
 
1012
- #: defaults.php:52
1013
  msgid "User modified a draft blog post"
1014
  msgstr ""
1015
 
1016
- #: defaults.php:52
1017
  msgid "Modified the draft post with the %PostTitle%. %EditorLinkPost%."
1018
  msgstr ""
1019
 
1020
- #: defaults.php:53
1021
  msgid "User permanently deleted a blog post from the trash"
1022
  msgstr ""
1023
 
1024
- #: defaults.php:53
1025
- msgid ""
1026
- "Permanently deleted the post %PostTitle%. Post URL was %PostUrl%. "
1027
- "%EditorLinkPost%."
1028
  msgstr ""
1029
 
1030
- #: defaults.php:54
1031
  msgid "User moved a blog post to the trash"
1032
  msgstr ""
1033
 
1034
- #: defaults.php:54
1035
  msgid "Moved the post %PostTitle% to trash. Post URL is %PostUrl%."
1036
  msgstr ""
1037
 
1038
- #: defaults.php:55
1039
  msgid "User restored a blog post from trash"
1040
  msgstr ""
1041
 
1042
- #: defaults.php:55
1043
  msgid "Post %PostTitle% has been restored from trash. %EditorLinkPost%."
1044
  msgstr ""
1045
 
1046
- #: defaults.php:56
1047
  msgid "User changed blog post category"
1048
  msgstr ""
1049
 
1050
- #: defaults.php:56
1051
  msgid ""
1052
  "Changed the category of the post %PostTitle% from %OldCategories% to "
1053
  "%NewCategories%. %EditorLinkPost%."
1054
  msgstr ""
1055
 
1056
- #: defaults.php:57
1057
  msgid "User changed blog post URL"
1058
  msgstr ""
1059
 
1060
- #: defaults.php:57
1061
  msgid ""
1062
  "Changed the URL of the post %PostTitle% from %OldUrl% to %NewUrl%. "
1063
  "%EditorLinkPost%."
1064
  msgstr ""
1065
 
1066
- #: defaults.php:58
1067
  msgid "User changed blog post author"
1068
  msgstr ""
1069
 
1070
- #: defaults.php:58
1071
  msgid ""
1072
  "Changed the author of %PostTitle% post from %OldAuthor% to %NewAuthor%. "
1073
  "%EditorLinkPost%."
1074
  msgstr ""
1075
 
1076
- #: defaults.php:59
1077
  msgid "User changed blog post status"
1078
  msgstr ""
1079
 
1080
- #: defaults.php:59
1081
  msgid ""
1082
  "Changed the status of %PostTitle% post from %OldStatus% to %NewStatus%. "
1083
  "%EditorLinkPost%."
1084
  msgstr ""
1085
 
1086
- #: defaults.php:60
1087
  msgid "User created new category"
1088
  msgstr ""
1089
 
1090
- #: defaults.php:60
1091
  msgid ""
1092
  "Created a new category called %CategoryName% .Category slug is %Slug%. "
1093
  "%CategoryLink%."
1094
  msgstr ""
1095
 
1096
- #: defaults.php:61
1097
  msgid "User deleted category"
1098
  msgstr ""
1099
 
1100
- #: defaults.php:61
1101
  msgid "Deleted the category %CategoryName%. Category slug was %Slug%."
1102
  msgstr ""
1103
 
1104
- #: defaults.php:62
1105
  msgid "User changed the visibility of a blog post"
1106
  msgstr ""
1107
 
1108
- #: defaults.php:62
1109
  msgid ""
1110
  "Changed the visibility of the post %PostTitle% from %OldVisibility% to "
1111
  "%NewVisibility%. %EditorLinkPost%."
1112
  msgstr ""
1113
 
1114
- #: defaults.php:63
1115
  msgid "User changed the date of a blog post"
1116
  msgstr ""
1117
 
1118
- #: defaults.php:63
1119
  msgid ""
1120
  "Changed the date of the post %PostTitle% from %OldDate% to %NewDate%. "
1121
  "%EditorLinkPost%."
1122
  msgstr ""
1123
 
1124
- #: defaults.php:64
1125
  msgid "User set a post as sticky"
1126
  msgstr ""
1127
 
1128
- #: defaults.php:64
1129
  msgid ""
1130
  "Set the post %PostTitle% as Sticky. Post URL is %PostUrl%. %EditorLinkPost%."
1131
  msgstr ""
1132
 
1133
- #: defaults.php:65
1134
  msgid "User removed post from sticky"
1135
  msgstr ""
1136
 
1137
- #: defaults.php:65
1138
  msgid "Removed the post %PostTitle% from Sticky. %EditorLinkPost%."
1139
  msgstr ""
1140
 
1141
- #: defaults.php:66
1142
  msgid "User changed generic tables"
1143
  msgstr ""
1144
 
1145
- #: defaults.php:66
1146
  msgid ""
1147
  "Changed the parent of the category %CategoryName% from %OldParent% to "
1148
  "%NewParent%. %CategoryLink%."
1149
  msgstr ""
1150
 
1151
- #: defaults.php:67
1152
  msgid "User created a custom field for a post"
1153
  msgstr ""
1154
 
1155
- #: defaults.php:68
1156
- msgid "User updated a custom field value for a post"
1157
- msgstr ""
1158
-
1159
- #: defaults.php:69
1160
- msgid "User deleted a custom field from a post"
1161
- msgstr ""
1162
-
1163
- #: defaults.php:70
1164
- msgid "User updated a custom field name for a post"
1165
- msgstr ""
1166
-
1167
- #: defaults.php:71
1168
- msgid "User modified content for a published post"
1169
- msgstr ""
1170
-
1171
- #: defaults.php:72
1172
- msgid "User modified content for a draft post"
1173
- msgstr ""
1174
-
1175
- #: defaults.php:73
1176
- msgid "User modified content of a post"
1177
- msgstr ""
1178
-
1179
- #: defaults.php:74
1180
- msgid "User submitted a post for review"
1181
- msgstr ""
1182
-
1183
- #: defaults.php:74
1184
- msgid "Submitted the post %PostTitle% for review. %EditorLinkPost%."
1185
- msgstr ""
1186
-
1187
- #: defaults.php:75
1188
- msgid "User scheduled a post"
1189
- msgstr ""
1190
-
1191
- #: defaults.php:75
1192
  msgid ""
1193
- "Scheduled the post %PostTitle% to be published %PublishingDate%. "
1194
- "%EditorLinkPost%."
1195
- msgstr ""
1196
-
1197
- #: defaults.php:76
1198
- msgid "User changed title of a post"
1199
  msgstr ""
1200
 
1201
- #: defaults.php:76
1202
- msgid ""
1203
- "Changed the title of the post %OldTitle% to %NewTitle%. %EditorLinkPost%."
1204
  msgstr ""
1205
 
1206
  #: defaults.php:78
1207
- msgid "Pages"
 
 
1208
  msgstr ""
1209
 
1210
  #: defaults.php:79
1211
- msgid "User created a new WordPress page and saved it as draft"
1212
  msgstr ""
1213
 
1214
  #: defaults.php:79
1215
  msgid ""
1216
- "Created a new page called %PostTitle% and saved it as draft. %EditorLinkPage"
1217
- "%."
1218
  msgstr ""
1219
 
1220
  #: defaults.php:80
1221
- msgid "User published a WorPress page"
1222
  msgstr ""
1223
 
1224
  #: defaults.php:80
1225
  msgid ""
1226
- "Published a page called %PostTitle%. Page URL is %PostUrl%. %EditorLinkPage%."
 
1227
  msgstr ""
1228
 
1229
  #: defaults.php:81
1230
- msgid "User modified a published WordPress page"
1231
  msgstr ""
1232
 
1233
  #: defaults.php:81
1234
  msgid ""
1235
- "Modified the published page %PostTitle%. Page URL is %PostUrl%. "
1236
- "%EditorLinkPage%."
1237
  msgstr ""
1238
 
1239
  #: defaults.php:82
1240
- msgid "User modified a draft WordPress page"
1241
  msgstr ""
1242
 
1243
  #: defaults.php:82
1244
  msgid ""
1245
- "Modified the draft page %PostTitle%. Page ID is %PostID%. %EditorLinkPage%."
 
1246
  msgstr ""
1247
 
1248
  #: defaults.php:83
1249
- msgid "User permanently deleted a page from the trash"
1250
  msgstr ""
1251
 
1252
  #: defaults.php:83
1253
  msgid ""
1254
- "Permanently deleted the page %PostTitle%. Page URL was %PostUrl%. "
1255
- "%EditorLinkPage%."
1256
  msgstr ""
1257
 
1258
  #: defaults.php:84
1259
- msgid "User moved WordPress page to the trash"
1260
  msgstr ""
1261
 
1262
  #: defaults.php:84
1263
- msgid "Moved the page %PostTitle% to trash. Page URL was %PostUrl%."
1264
  msgstr ""
1265
 
1266
  #: defaults.php:85
1267
- msgid "User restored a WordPress page from trash"
1268
  msgstr ""
1269
 
1270
  #: defaults.php:85
1271
- msgid "Page %PostTitle% has been restored from trash. %EditorLinkPage%."
 
 
1272
  msgstr ""
1273
 
1274
  #: defaults.php:86
1275
- msgid "User changed page URL"
1276
  msgstr ""
1277
 
1278
  #: defaults.php:86
1279
  msgid ""
1280
- "Changed the URL of the page %PostTitle% from %OldUrl% to %NewUrl%. "
1281
- "%EditorLinkPage%."
1282
  msgstr ""
1283
 
1284
  #: defaults.php:87
1285
- msgid "User changed page author"
1286
  msgstr ""
1287
 
1288
  #: defaults.php:87
1289
  msgid ""
1290
- "Changed the author of the page %PostTitle% from %OldAuthor% to %NewAuthor%. "
1291
- "%EditorLinkPage%."
1292
  msgstr ""
1293
 
1294
  #: defaults.php:88
1295
- msgid "User changed page status"
1296
  msgstr ""
1297
 
1298
  #: defaults.php:88
1299
- msgid ""
1300
- "Changed the status of the page %PostTitle% from %OldStatus% to %NewStatus%. "
1301
- "%EditorLinkPage%."
1302
  msgstr ""
1303
 
1304
  #: defaults.php:89
1305
- msgid "User changed the visibility of a page post"
1306
  msgstr ""
1307
 
1308
  #: defaults.php:89
1309
  msgid ""
1310
- "Changed the visibility of the page %PostTitle% from %OldVisibility% to "
1311
- "%NewVisibility%. %EditorLinkPage%."
1312
  msgstr ""
1313
 
1314
  #: defaults.php:90
1315
- msgid "User changed the date of a page post"
1316
  msgstr ""
1317
 
1318
  #: defaults.php:90
1319
  msgid ""
1320
- "Changed the date of the page %PostTitle% from %OldDate% to %NewDate%. "
1321
- "%EditorLinkPage%."
1322
  msgstr ""
1323
 
1324
  #: defaults.php:91
1325
- msgid "User changed the parent of a page"
1326
  msgstr ""
1327
 
1328
  #: defaults.php:91
1329
  msgid ""
1330
- "Changed the parent of the page %PostTitle% from %OldParentName% to "
1331
- "%NewParentName%. %EditorLinkPage%."
1332
  msgstr ""
1333
 
1334
  #: defaults.php:92
1335
- msgid "User changed the template of a page"
1336
  msgstr ""
1337
 
1338
  #: defaults.php:92
1339
- msgid ""
1340
- "Changed the template of the page %PostTitle% from %OldTemplate% to "
1341
- "%NewTemplate%. %EditorLinkPage%."
1342
  msgstr ""
1343
 
1344
- #: defaults.php:93
1345
- msgid "User created a custom field for a page"
1346
  msgstr ""
1347
 
1348
- #: defaults.php:94
1349
- msgid "User updated a custom field value for a page"
1350
  msgstr ""
1351
 
1352
  #: defaults.php:95
1353
- msgid "User deleted a custom field from a page"
 
 
1354
  msgstr ""
1355
 
1356
  #: defaults.php:96
1357
- msgid "User updated a custom field name for a page"
 
 
 
 
 
 
1358
  msgstr ""
1359
 
1360
  #: defaults.php:97
1361
- msgid "User modified content for a published page"
1362
  msgstr ""
1363
 
1364
- #: defaults.php:98
1365
- msgid "User modified content for a draft page"
 
 
 
 
 
 
 
 
 
 
 
 
1366
  msgstr ""
1367
 
1368
  #: defaults.php:99
1369
- msgid "User scheduled a page"
 
 
 
 
 
 
1370
  msgstr ""
1371
 
1372
  #: defaults.php:100
1373
- msgid "User changed title of a page"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1374
  msgstr ""
1375
 
1376
  #: defaults.php:102
1377
- msgid "Custom Posts"
 
 
1378
  msgstr ""
1379
 
1380
  #: defaults.php:103
1381
- msgid "User created a new post with custom post type and saved it as draft"
1382
  msgstr ""
1383
 
1384
  #: defaults.php:103
1385
  msgid ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1386
  "Created a new custom post called %PostTitle% of type %PostType%. "
1387
  "%EditorLinkPost%."
1388
  msgstr ""
1389
 
1390
- #: defaults.php:104
1391
  msgid "User published a post with custom post type"
1392
  msgstr ""
1393
 
1394
- #: defaults.php:104
1395
  msgid ""
1396
  "Published a custom post %PostTitle% of type %PostType%. Post URL is %PostUrl"
1397
  "%. %EditorLinkPost%."
1398
  msgstr ""
1399
 
1400
- #: defaults.php:105
1401
  msgid "User modified a post with custom post type"
1402
  msgstr ""
1403
 
1404
- #: defaults.php:105
1405
  msgid ""
1406
  "Modified the custom post %PostTitle% of type %PostType%. Post URL is %PostUrl"
1407
  "%. %EditorLinkPost%."
1408
  msgstr ""
1409
 
1410
- #: defaults.php:106
1411
  msgid "User modified a draft post with custom post type"
1412
  msgstr ""
1413
 
1414
- #: defaults.php:106
1415
  msgid ""
1416
  "Modified the draft custom post %PostTitle% of type is %PostType%. "
1417
  "%EditorLinkPost%."
1418
  msgstr ""
1419
 
1420
- #: defaults.php:107
1421
  msgid "User permanently deleted post with custom post type"
1422
  msgstr ""
1423
 
1424
- #: defaults.php:107
1425
- msgid ""
1426
- "Permanently Deleted the custom post %PostTitle% of type %PostType%. The post "
1427
- "URL was %PostUrl%. %EditorLinkPost%."
1428
  msgstr ""
1429
 
1430
- #: defaults.php:108
1431
  msgid "User moved post with custom post type to trash"
1432
  msgstr ""
1433
 
1434
- #: defaults.php:108
1435
  msgid ""
1436
  "Moved the custom post %PostTitle% of type %PostType% to trash. Post URL was "
1437
  "%PostUrl%."
1438
  msgstr ""
1439
 
1440
- #: defaults.php:109
1441
  msgid "User restored post with custom post type from trash"
1442
  msgstr ""
1443
 
1444
- #: defaults.php:109
1445
  msgid ""
1446
  "The custom post %PostTitle% of type %PostType% has been restored from trash. "
1447
  "%EditorLinkPost%."
1448
  msgstr ""
1449
 
1450
- #: defaults.php:110
1451
  msgid "User changed the category of a post with custom post type"
1452
  msgstr ""
1453
 
1454
- #: defaults.php:110
1455
  msgid ""
1456
  "Changed the category(ies) of the custom post %PostTitle% of type %PostType% "
1457
  "from %OldCategories% to %NewCategories%. %EditorLinkPost%."
1458
  msgstr ""
1459
 
1460
- #: defaults.php:111
1461
  msgid "User changed the URL of a post with custom post type"
1462
  msgstr ""
1463
 
1464
- #: defaults.php:111
1465
  msgid ""
1466
  "Changed the URL of the custom post %PostTitle% of type %PostType% from "
1467
  "%OldUrl% to %NewUrl%. %EditorLinkPost%."
1468
  msgstr ""
1469
 
1470
- #: defaults.php:112
1471
  msgid "User changed the author or post with custom post type"
1472
  msgstr ""
1473
 
1474
- #: defaults.php:112
1475
  msgid ""
1476
  "Changed the author of custom post %PostTitle% of type %PostType% from "
1477
  "%OldAuthor% to %NewAuthor%. %EditorLinkPost%."
1478
  msgstr ""
1479
 
1480
- #: defaults.php:113
1481
  msgid "User changed the status of post with custom post type"
1482
  msgstr ""
1483
 
1484
- #: defaults.php:113
1485
  msgid ""
1486
  "Changed the status of custom post %PostTitle% of type %PostType% from "
1487
  "%OldStatus% to %NewStatus%. %EditorLinkPost%."
1488
  msgstr ""
1489
 
1490
- #: defaults.php:114
1491
  msgid "User changed the visibility of a post with custom post type"
1492
  msgstr ""
1493
 
1494
- #: defaults.php:114
1495
  msgid ""
1496
  "Changed the visibility of the custom post %PostTitle% of type %PostType% "
1497
  "from %OldVisibility% to %NewVisibility%. %EditorLinkPost%."
1498
  msgstr ""
1499
 
1500
- #: defaults.php:115
1501
  msgid "User changed the date of post with custom post type"
1502
  msgstr ""
1503
 
1504
- #: defaults.php:115
1505
  msgid ""
1506
  "Changed the date of the custom post %PostTitle% of type %PostType% from "
1507
  "%OldDate% to %NewDate%. %EditorLinkPost%."
1508
  msgstr ""
1509
 
1510
- #: defaults.php:116
1511
  msgid "User created a custom field for a custom post type"
1512
  msgstr ""
1513
 
1514
- #: defaults.php:117
1515
- msgid "User updated a custom field for a custom post type"
1516
- msgstr ""
1517
-
1518
- #: defaults.php:118
1519
- msgid "User deleted a custom field from a custom post type"
1520
- msgstr ""
1521
-
1522
- #: defaults.php:119
1523
- msgid "User updated a custom field name for a custom post type"
1524
  msgstr ""
1525
 
1526
- #: defaults.php:120
1527
- msgid "User modified content for a published custom post type"
1528
  msgstr ""
1529
 
1530
  #: defaults.php:121
1531
- msgid "User modified content for a draft custom post type"
 
 
 
1532
  msgstr ""
1533
 
1534
  #: defaults.php:122
1535
- msgid "User scheduled a custom post type"
1536
  msgstr ""
1537
 
1538
  #: defaults.php:122
1539
  msgid ""
1540
- "Scheduled the custom post type %PostTitle% to be published %PublishingDate%. "
1541
- "%EditorLinkPost%."
1542
  msgstr ""
1543
 
1544
  #: defaults.php:123
1545
- msgid "User changed title of a custom post type"
1546
  msgstr ""
1547
 
1548
  #: defaults.php:123
1549
  msgid ""
1550
- "Changed the title of the custom post %OldTitle% to %NewTitle%. "
1551
- "%EditorLinkPost%."
 
 
 
 
 
 
 
 
 
 
1552
  msgstr ""
1553
 
1554
  #: defaults.php:125
1555
- msgid "Widgets"
 
 
 
 
 
 
1556
  msgstr ""
1557
 
1558
  #: defaults.php:126
1559
- msgid "User added a new widget"
1560
  msgstr ""
1561
 
1562
  #: defaults.php:126
1563
- msgid "Added a new %WidgetName% widget in %Sidebar%."
 
 
1564
  msgstr ""
1565
 
1566
  #: defaults.php:127
1567
- msgid "User modified a widget"
1568
  msgstr ""
1569
 
1570
  #: defaults.php:127
1571
- msgid "Modified the %WidgetName% widget in %Sidebar%."
 
 
1572
  msgstr ""
1573
 
1574
  #: defaults.php:128
1575
- msgid "User deleted widget"
1576
  msgstr ""
1577
 
1578
  #: defaults.php:128
1579
- msgid "Deleted the %WidgetName% widget from %Sidebar%."
 
 
1580
  msgstr ""
1581
 
1582
  #: defaults.php:129
1583
- msgid "User moved widget"
1584
  msgstr ""
1585
 
1586
  #: defaults.php:129
1587
- msgid "Moved the %WidgetName% widget from %OldSidebar% to %NewSidebar%."
 
 
1588
  msgstr ""
1589
 
1590
- #: defaults.php:130
1591
- msgid "User changed widget position"
1592
  msgstr ""
1593
 
1594
- #: defaults.php:130
1595
- msgid "Changed the position of the widget %WidgetName% in sidebar %Sidebar%."
1596
  msgstr ""
1597
 
1598
  #: defaults.php:132
1599
- msgid "User Profiles"
 
 
1600
  msgstr ""
1601
 
1602
  #: defaults.php:133
1603
- msgid "New user was created on WordPress"
1604
  msgstr ""
1605
 
1606
  #: defaults.php:133
1607
  msgid ""
1608
- "A new user %NewUserData->Username% was created with role of %NewUserData-"
1609
- ">Roles%."
1610
  msgstr ""
1611
 
1612
  #: defaults.php:134
1613
- msgid "User created another WordPress user"
1614
  msgstr ""
1615
 
1616
  #: defaults.php:134
1617
  msgid ""
1618
- "%UserChanger% created a new user %NewUserData->Username% with the role of "
1619
- "%NewUserData->Roles%."
1620
  msgstr ""
1621
 
1622
  #: defaults.php:135
1623
- msgid "The role of a user was changed by another WordPress user"
1624
  msgstr ""
1625
 
1626
  #: defaults.php:135
1627
  msgid ""
1628
- "Changed the role of the user %TargetUsername% from %OldRole% to %NewRole%."
1629
  msgstr ""
1630
 
1631
  #: defaults.php:136
1632
- msgid "User has changed his or her password"
1633
  msgstr ""
1634
 
1635
  #: defaults.php:136
1636
- msgid "Changed the password."
1637
  msgstr ""
1638
 
1639
  #: defaults.php:137
1640
- msgid "User changed another user's password"
1641
  msgstr ""
1642
 
1643
  #: defaults.php:137
1644
- msgid ""
1645
- "Changed the password for the user %TargetUserData->Username% with the role "
1646
- "of %TargetUserData->Roles%."
1647
  msgstr ""
1648
 
1649
  #: defaults.php:138
1650
- msgid "User changed his or her email address"
1651
  msgstr ""
1652
 
1653
  #: defaults.php:138
1654
- msgid "Changed the email address from %OldEmail% to %NewEmail%."
1655
  msgstr ""
1656
 
1657
  #: defaults.php:139
1658
- msgid "User changed another user's email address"
1659
  msgstr ""
1660
 
1661
  #: defaults.php:139
1662
  msgid ""
1663
- "Changed the email address of the user %TargetUsername% from %OldEmail% to "
1664
- "%NewEmail%."
1665
  msgstr ""
1666
 
1667
  #: defaults.php:140
1668
- msgid "User was deleted by another user"
1669
  msgstr ""
1670
 
1671
  #: defaults.php:140
1672
  msgid ""
1673
- "Deleted the user %TargetUserData->Username% with the role of %TargetUserData-"
1674
- ">Roles%."
 
 
 
 
 
 
 
 
 
 
1675
  msgstr ""
1676
 
1677
  #: defaults.php:142
1678
- msgid "Plugins & Themes"
 
 
 
 
 
 
1679
  msgstr ""
1680
 
1681
  #: defaults.php:143
1682
- msgid "User installed a plugin"
1683
  msgstr ""
1684
 
1685
  #: defaults.php:143
1686
- msgid "Installed the plugin %Plugin->Name% in %Plugin->plugin_dir_path%."
 
 
1687
  msgstr ""
1688
 
1689
  #: defaults.php:144
1690
- msgid "User activated a WordPress plugin"
1691
  msgstr ""
1692
 
1693
  #: defaults.php:144
1694
- msgid "Activated the plugin %PluginData->Name% installed in %PluginFile%."
 
 
1695
  msgstr ""
1696
 
1697
  #: defaults.php:145
1698
- msgid "User deactivated a WordPress plugin"
1699
  msgstr ""
1700
 
1701
  #: defaults.php:145
1702
- msgid "Deactivated the plugin %PluginData->Name% installed in %PluginFile%."
 
 
1703
  msgstr ""
1704
 
1705
  #: defaults.php:146
1706
- msgid "User uninstalled a plugin"
1707
  msgstr ""
1708
 
1709
  #: defaults.php:146
1710
  msgid ""
1711
- "Uninstalled the plugin %PluginData->Name% which was installed in %PluginFile"
1712
- "%."
1713
  msgstr ""
1714
 
1715
  #: defaults.php:147
1716
- msgid "User upgraded a plugin"
1717
  msgstr ""
1718
 
1719
  #: defaults.php:147
1720
- msgid "Upgraded the plugin %PluginData->Name% installed in %PluginFile%."
 
 
1721
  msgstr ""
1722
 
1723
  #: defaults.php:148
1724
- msgid "User installed a theme"
1725
  msgstr ""
1726
 
1727
  #: defaults.php:148
1728
  msgid ""
1729
- "Installed the theme \"%Theme->Name%\" in %Theme->get_template_directory%."
 
1730
  msgstr ""
1731
 
1732
  #: defaults.php:149
1733
- msgid "User activated a theme"
1734
  msgstr ""
1735
 
1736
  #: defaults.php:149
1737
  msgid ""
1738
- "Activated the theme \"%Theme->Name%\", installed in %Theme-"
1739
- ">get_template_directory%."
1740
  msgstr ""
1741
 
1742
  #: defaults.php:150
1743
- msgid "User uninstalled a theme"
1744
  msgstr ""
1745
 
1746
  #: defaults.php:150
1747
  msgid ""
1748
- "Deleted the theme \"%Theme->Name%\" installed in %Theme-"
1749
- ">get_template_directory%."
1750
  msgstr ""
1751
 
1752
  #: defaults.php:151
1753
- msgid "A plugin created a post"
1754
  msgstr ""
1755
 
1756
  #: defaults.php:151
1757
- msgid "A plugin automatically created the following post: %PostTitle%."
 
 
1758
  msgstr ""
1759
 
1760
  #: defaults.php:152
1761
- msgid "A plugin created a page"
1762
  msgstr ""
1763
 
1764
  #: defaults.php:152
1765
- msgid "A plugin automatically created the following page: %PostTitle%."
 
 
1766
  msgstr ""
1767
 
1768
  #: defaults.php:153
1769
- msgid "A plugin created a custom post"
1770
  msgstr ""
1771
 
1772
  #: defaults.php:153
1773
- msgid "A plugin automatically created the following custom post: %PostTitle%."
 
1774
  msgstr ""
1775
 
1776
  #: defaults.php:154
1777
- msgid "A plugin deleted a post"
1778
  msgstr ""
1779
 
1780
  #: defaults.php:154
1781
- msgid "A plugin automatically deleted the following post: %PostTitle%."
 
1782
  msgstr ""
1783
 
1784
  #: defaults.php:155
1785
- msgid "A plugin deleted a page"
1786
  msgstr ""
1787
 
1788
  #: defaults.php:155
1789
- msgid "A plugin automatically deleted the following page: %PostTitle%."
1790
  msgstr ""
1791
 
1792
  #: defaults.php:156
1793
- msgid "A plugin deleted a custom post"
1794
  msgstr ""
1795
 
1796
  #: defaults.php:156
1797
- msgid "A plugin automatically deleted the following custom post: %PostTitle%."
 
1798
  msgstr ""
1799
 
1800
  #: defaults.php:157
1801
- msgid "User updated a theme"
1802
  msgstr ""
1803
 
1804
  #: defaults.php:157
1805
  msgid ""
1806
- "Updated the theme \"%Theme->Name%\" installed in %Theme-"
1807
- ">get_template_directory%."
1808
  msgstr ""
1809
 
1810
  #: defaults.php:158
1811
- msgid "User changed a file using the theme editor"
1812
  msgstr ""
1813
 
1814
  #: defaults.php:158
1815
- msgid "Modified %File% with the Theme Editor."
 
1816
  msgstr ""
1817
 
1818
  #: defaults.php:159
1819
- msgid "User changed a file using the plugin editor"
1820
  msgstr ""
1821
 
1822
  #: defaults.php:159
1823
- msgid "Modified %File% with the Plugin Editor."
1824
- msgstr ""
1825
-
1826
- #: defaults.php:161
1827
- msgid "System Activity"
1828
- msgstr ""
1829
-
1830
- #: defaults.php:162
1831
- msgid "Unknown Error"
1832
  msgstr ""
1833
 
1834
  #: defaults.php:162
1835
- msgid "An unexpected error has occurred ."
1836
  msgstr ""
1837
 
1838
  #: defaults.php:163
1839
- msgid "PHP error"
1840
  msgstr ""
1841
 
1842
- #: defaults.php:163 defaults.php:164 defaults.php:165 defaults.php:166
1843
- #: defaults.php:167
1844
- msgid "%Message%."
1845
  msgstr ""
1846
 
1847
  #: defaults.php:164
1848
- msgid "PHP warning"
 
1849
  msgstr ""
1850
 
1851
  #: defaults.php:165
1852
- msgid "PHP notice"
 
 
 
 
 
 
1853
  msgstr ""
1854
 
1855
  #: defaults.php:166
1856
- msgid "PHP exception"
 
 
 
 
 
 
1857
  msgstr ""
1858
 
1859
  #: defaults.php:167
1860
- msgid "PHP shutdown error"
 
 
 
 
1861
  msgstr ""
1862
 
1863
  #: defaults.php:168
1864
- msgid "Events automatically pruned by system"
1865
  msgstr ""
1866
 
1867
  #: defaults.php:168
1868
- msgid "System automatically deleted %EventCount% alert(s)."
 
 
1869
  msgstr ""
1870
 
1871
  #: defaults.php:169
1872
- msgid "Option Anyone Can Register in WordPress settings changed"
1873
  msgstr ""
1874
 
1875
  #: defaults.php:169
1876
- msgid "%NewValue% the option \"Anyone can register\"."
 
 
1877
  msgstr ""
1878
 
1879
  #: defaults.php:170
1880
- msgid "New User Default Role changed"
1881
  msgstr ""
1882
 
1883
  #: defaults.php:170
1884
- msgid "Changed the New User Default Role from %OldRole% to %NewRole%."
 
1885
  msgstr ""
1886
 
1887
  #: defaults.php:171
1888
- msgid "WordPress Administrator Notification email changed"
1889
  msgstr ""
1890
 
1891
  #: defaults.php:171
1892
  msgid ""
1893
- "Changed the WordPress administrator notifications email address from "
1894
- "%OldEmail% to %NewEmail%."
1895
  msgstr ""
1896
 
1897
  #: defaults.php:172
1898
- msgid "WordPress was updated"
1899
  msgstr ""
1900
 
1901
  #: defaults.php:172
1902
- msgid "Updated WordPress from version %OldVersion% to %NewVersion%."
1903
- msgstr ""
1904
-
1905
- #: defaults.php:173
1906
- msgid "User changes the WordPress Permalinks"
1907
- msgstr ""
1908
-
1909
- #: defaults.php:173
1910
- msgid "Changed the WordPress permalinks from %OldPattern% to %NewPattern%."
1911
- msgstr ""
1912
-
1913
- #: defaults.php:174
1914
- msgid "User requests non-existing pages (404 Error Pages)"
1915
- msgstr ""
1916
-
1917
- #: defaults.php:174
1918
  msgid ""
1919
- "Has requested a non existing page (404 Error Pages) %Attempts% %Msg%. These "
1920
- "requests are being logged to a log file in the /uploads/wp-security-audit-"
1921
- "log/404s/ directory."
1922
- msgstr ""
1923
-
1924
- #: defaults.php:175
1925
- msgid "Advertising Add-ons."
1926
- msgstr ""
1927
-
1928
- #: defaults.php:175
1929
- msgid "%PromoName% %PromoMessage%"
1930
  msgstr ""
1931
 
1932
- #: defaults.php:177
1933
  msgid "MultiSite"
1934
  msgstr ""
1935
 
1936
- #: defaults.php:178
1937
  msgid "User granted Super Admin privileges"
1938
  msgstr ""
1939
 
1940
- #: defaults.php:178
1941
  msgid "Granted Super Admin privileges to %TargetUsername%."
1942
  msgstr ""
1943
 
1944
- #: defaults.php:179
1945
  msgid "User revoked from Super Admin privileges"
1946
  msgstr ""
1947
 
1948
- #: defaults.php:179
1949
  msgid "Revoked Super Admin privileges from %TargetUsername%."
1950
  msgstr ""
1951
 
1952
- #: defaults.php:180
1953
  msgid "Existing user added to a site"
1954
  msgstr ""
1955
 
1956
- #: defaults.php:180
1957
  msgid ""
1958
  "Added the existing user %TargetUsername% with %TargetUserRole% role to site "
1959
  "%SiteName%."
1960
  msgstr ""
1961
 
1962
- #: defaults.php:181
1963
  msgid "User removed from site"
1964
  msgstr ""
1965
 
1966
- #: defaults.php:181
1967
  msgid ""
1968
  "Removed the user %TargetUsername% with role %TargetUserRole% from %SiteName% "
1969
  "site."
1970
  msgstr ""
1971
 
1972
- #: defaults.php:182
1973
  msgid "New network user created"
1974
  msgstr ""
1975
 
1976
- #: defaults.php:182
1977
  msgid "Created a new network user %NewUserData->Username%."
1978
  msgstr ""
1979
 
1980
- #: defaults.php:183
1981
  msgid "The forum role of a user was changed by another WordPress user"
1982
  msgstr ""
1983
 
1984
- #: defaults.php:183
1985
  msgid ""
1986
  "Change the forum role of the user %TargetUsername% from %OldRole% to %NewRole"
1987
  "% by %UserChanger%."
1988
  msgstr ""
1989
 
1990
- #: defaults.php:184
1991
  msgid "New site added on the network"
1992
  msgstr ""
1993
 
1994
- #: defaults.php:184
1995
  msgid "Added the site %SiteName% to the network."
1996
  msgstr ""
1997
 
1998
- #: defaults.php:185
1999
  msgid "Existing site archived"
2000
  msgstr ""
2001
 
2002
- #: defaults.php:185
2003
  msgid "Archived the site %SiteName%."
2004
  msgstr ""
2005
 
2006
- #: defaults.php:186
2007
  msgid "Archived site has been unarchived"
2008
  msgstr ""
2009
 
2010
- #: defaults.php:186
2011
  msgid "Unarchived the site %SiteName%."
2012
  msgstr ""
2013
 
2014
- #: defaults.php:187
2015
  msgid "Deactivated site has been activated"
2016
  msgstr ""
2017
 
2018
- #: defaults.php:187
2019
  msgid "Activated the site %SiteName%."
2020
  msgstr ""
2021
 
2022
- #: defaults.php:188
2023
  msgid "Site has been deactivated"
2024
  msgstr ""
2025
 
2026
- #: defaults.php:188
2027
  msgid "Deactivated the site %SiteName%."
2028
  msgstr ""
2029
 
2030
- #: defaults.php:189
2031
  msgid "Existing site deleted from network"
2032
  msgstr ""
2033
 
2034
- #: defaults.php:189
2035
  msgid "Deleted the site %SiteName%."
2036
  msgstr ""
2037
 
2038
- #: defaults.php:190
2039
  msgid "Activated theme on network"
2040
  msgstr ""
2041
 
2042
- #: defaults.php:190
2043
  msgid ""
2044
  "Network activated the theme %Theme->Name% installed in %Theme-"
2045
  ">get_template_directory%."
2046
  msgstr ""
2047
 
2048
- #: defaults.php:191
2049
  msgid "Deactivated theme from network"
2050
  msgstr ""
2051
 
2052
- #: defaults.php:191
2053
  msgid ""
2054
  "Network deactivated the theme %Theme->Name% installed in %Theme-"
2055
  ">get_template_directory%."
2056
  msgstr ""
2057
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2058
  #: defaults.php:193
2059
- msgid "Database"
 
 
 
 
2060
  msgstr ""
2061
 
2062
  #: defaults.php:194
2063
- msgid "Plugin created tables"
2064
  msgstr ""
2065
 
2066
  #: defaults.php:194
2067
  msgid ""
2068
- "Plugin %Plugin->Name% created these tables in the database: %TableNames%."
 
2069
  msgstr ""
2070
 
2071
  #: defaults.php:195
2072
- msgid "Plugin modified tables structure"
2073
  msgstr ""
2074
 
2075
  #: defaults.php:195
2076
- msgid ""
2077
- "Plugin %Plugin->Name% modified the structure of these database tables: "
2078
- "%TableNames%."
2079
  msgstr ""
2080
 
2081
  #: defaults.php:196
2082
- msgid "Plugin deleted tables"
2083
  msgstr ""
2084
 
2085
  #: defaults.php:196
2086
  msgid ""
2087
- "Plugin %Plugin->Name% deleted the following tables from the database: "
2088
- "%TableNames%."
2089
  msgstr ""
2090
 
2091
  #: defaults.php:197
2092
- msgid "Theme created tables"
2093
  msgstr ""
2094
 
2095
  #: defaults.php:197
2096
- msgid "Theme %Theme->Name% created these tables in the database: %TableNames%."
 
 
2097
  msgstr ""
2098
 
2099
  #: defaults.php:198
2100
- msgid "Theme modified tables structure"
2101
  msgstr ""
2102
 
2103
  #: defaults.php:198
2104
  msgid ""
2105
- "Theme %Theme->Name% modified the structure of these database tables: "
2106
- "%TableNames%."
2107
  msgstr ""
2108
 
2109
  #: defaults.php:199
2110
- msgid "Theme deleted tables"
2111
  msgstr ""
2112
 
2113
  #: defaults.php:199
2114
- msgid ""
2115
- "Theme %Theme->Name% deleted the following tables from the database: "
2116
- "%TableNames%."
2117
  msgstr ""
2118
 
2119
  #: defaults.php:200
2120
- msgid "Unknown component created tables"
2121
  msgstr ""
2122
 
2123
  #: defaults.php:200
2124
- msgid ""
2125
- "An unknown component created these tables in the database: %TableNames%."
2126
  msgstr ""
2127
 
2128
  #: defaults.php:201
2129
- msgid "Unknown component modified tables structure"
2130
  msgstr ""
2131
 
2132
  #: defaults.php:201
2133
- msgid ""
2134
- "An unknown component modified the structure of these database tables: "
2135
- "%TableNames%."
2136
  msgstr ""
2137
 
2138
  #: defaults.php:202
2139
- msgid "Unknown component deleted tables"
2140
  msgstr ""
2141
 
2142
  #: defaults.php:202
2143
- msgid ""
2144
- "An unknown component deleted the following tables from the database: "
2145
- "%TableNames%."
 
 
 
 
 
 
2146
  msgstr ""
2147
 
2148
  #: defaults.php:204
2149
- msgid "BBPress Forum"
 
 
 
 
2150
  msgstr ""
2151
 
2152
  #: defaults.php:205
2153
- msgid "User created new forum"
 
 
 
 
 
 
2154
  msgstr ""
2155
 
2156
  #: defaults.php:206
2157
- msgid "User changed status of a forum"
 
 
 
 
2158
  msgstr ""
2159
 
2160
  #: defaults.php:207
2161
- msgid "User changed visibility of a forum"
 
 
 
 
2162
  msgstr ""
2163
 
2164
  #: defaults.php:208
2165
- msgid "User changed the URL of a forum"
2166
  msgstr ""
2167
 
2168
- #: defaults.php:209
2169
- msgid "User changed order of a forum"
2170
  msgstr ""
2171
 
2172
- #: defaults.php:210
2173
- msgid "User moved forum to trash"
2174
  msgstr ""
2175
 
2176
- #: defaults.php:210
2177
- msgid "Moved the forum %ForumName% to trash."
2178
  msgstr ""
2179
 
2180
- #: defaults.php:211
2181
- msgid "User permanently deleted forum"
2182
  msgstr ""
2183
 
2184
- #: defaults.php:211
2185
- msgid "Permanently deleted the forum %ForumName%."
 
2186
  msgstr ""
2187
 
2188
  #: defaults.php:212
2189
- msgid "User restored forum from trash"
2190
  msgstr ""
2191
 
2192
  #: defaults.php:213
2193
- msgid "User changed the parent of a forum"
2194
  msgstr ""
2195
 
2196
- #: defaults.php:214
2197
- msgid "User changed forum's role"
2198
  msgstr ""
2199
 
2200
  #: defaults.php:214
2201
- msgid "Changed the forum's auto role from %OldRole% to %NewRole%."
2202
  msgstr ""
2203
 
2204
- #: defaults.php:215
2205
- msgid "User changed option of a forum"
 
2206
  msgstr ""
2207
 
2208
  #: defaults.php:215
2209
- msgid "%Status% the option for anonymous posting on forum."
2210
  msgstr ""
2211
 
2212
  #: defaults.php:216
2213
- msgid "User changed type of a forum"
2214
- msgstr ""
2215
-
2216
- #: defaults.php:217
2217
- msgid "User changed time to disallow post editing"
2218
  msgstr ""
2219
 
2220
  #: defaults.php:217
2221
- msgid ""
2222
- "Changed the time to disallow post editing from %OldTime% to %NewTime% "
2223
- "minutes in the forums."
2224
  msgstr ""
2225
 
2226
  #: defaults.php:218
2227
- msgid "User changed the forum setting posting throttle time"
2228
  msgstr ""
2229
 
2230
- #: defaults.php:218
2231
- msgid ""
2232
- "Changed the posting throttle time from %OldTime% to %NewTime% seconds in the "
2233
- "forums."
2234
  msgstr ""
2235
 
2236
  #: defaults.php:219
2237
- msgid "User created new topic"
2238
  msgstr ""
2239
 
2240
  #: defaults.php:220
2241
- msgid "User changed status of a topic"
 
 
 
 
2242
  msgstr ""
2243
 
2244
  #: defaults.php:221
2245
- msgid "User changed type of a topic"
 
 
 
 
2246
  msgstr ""
2247
 
2248
  #: defaults.php:222
2249
- msgid "User changed URL of a topic"
2250
  msgstr ""
2251
 
2252
  #: defaults.php:222
2253
- msgid "Changed the URL of the topic %TopicName% from %OldUrl% to %NewUrl%."
 
 
2254
  msgstr ""
2255
 
2256
  #: defaults.php:223
2257
- msgid "User changed the forum of a topic"
 
 
 
 
2258
  msgstr ""
2259
 
2260
  #: defaults.php:224
2261
- msgid "User moved topic to trash"
2262
  msgstr ""
2263
 
2264
  #: defaults.php:224
2265
- msgid "Moved the topic %TopicName% to trash."
2266
  msgstr ""
2267
 
2268
  #: defaults.php:225
2269
- msgid "User permanently deleted topic"
2270
  msgstr ""
2271
 
2272
  #: defaults.php:225
2273
- msgid "Permanently deleted the topic %TopicName%."
 
 
2274
  msgstr ""
2275
 
2276
  #: defaults.php:226
2277
- msgid "User restored topic from trash"
 
 
 
 
 
 
2278
  msgstr ""
2279
 
2280
  #: defaults.php:227
2281
- msgid "User changed visibility of a topic"
 
 
 
 
2282
  msgstr ""
2283
 
2284
  #: defaults.php:229
@@ -2359,128 +2537,899 @@ msgid "Moved %ItemName% as a sub-item of %ParentName% in menu %MenuName%."
2359
  msgstr ""
2360
 
2361
  #: defaults.php:240
2362
- msgid "Comments"
2363
  msgstr ""
2364
 
2365
  #: defaults.php:241
2366
- msgid "User approved a comment"
2367
  msgstr ""
2368
 
2369
  #: defaults.php:241
2370
- msgid ""
2371
- "Approved the comment posted in response to the post %PostTitle% by %Author% "
2372
- "on %CommentLink%."
2373
  msgstr ""
2374
 
2375
  #: defaults.php:242
2376
- msgid "User unapproved a comment"
2377
  msgstr ""
2378
 
2379
  #: defaults.php:242
2380
- msgid ""
2381
- "Unapproved the comment posted in response to the post %PostTitle% by %Author"
2382
- "% on %CommentLink%."
2383
  msgstr ""
2384
 
2385
  #: defaults.php:243
2386
- msgid "User replied to a comment"
2387
  msgstr ""
2388
 
2389
  #: defaults.php:243
2390
- msgid ""
2391
- "Replied to the comment posted in response to the post %PostTitle% by %Author"
2392
- "% on %CommentLink%."
2393
  msgstr ""
2394
 
2395
  #: defaults.php:244
2396
- msgid "User edited a comment"
2397
  msgstr ""
2398
 
2399
  #: defaults.php:244
2400
- msgid ""
2401
- "Edited a comment posted in response to the post %PostTitle% by %Author% on "
2402
- "%CommentLink%."
2403
  msgstr ""
2404
 
2405
  #: defaults.php:245
2406
- msgid "User marked a comment as Spam"
2407
  msgstr ""
2408
 
2409
  #: defaults.php:245
2410
- msgid ""
2411
- "Marked the comment posted in response to the post %PostTitle% by %Author% on "
2412
- "%CommentLink% as Spam."
2413
  msgstr ""
2414
 
2415
- #: defaults.php:246
2416
- msgid "User marked a comment as Not Spam"
2417
  msgstr ""
2418
 
2419
- #: defaults.php:246
2420
  msgid ""
2421
- "Marked the comment posted in response to the post %PostTitle% by %Author% on "
2422
- "%CommentLink% as Not Spam."
2423
  msgstr ""
2424
 
2425
- #: defaults.php:247
2426
- msgid "User moved a comment to trash"
2427
  msgstr ""
2428
 
2429
- #: defaults.php:247
2430
- msgid ""
2431
- "Moved the comment posted in response to the post %PostTitle% by %Author% on "
2432
- "%Date% to trash."
2433
  msgstr ""
2434
 
2435
- #: defaults.php:248
2436
- msgid "User restored a comment from the trash"
2437
  msgstr ""
2438
 
2439
- #: defaults.php:248
2440
- msgid ""
2441
- "Restored the comment posted in response to the post %PostTitle% by %Author% "
2442
- "on %CommentLink% from the trash."
2443
  msgstr ""
2444
 
2445
- #: defaults.php:249
2446
- msgid "User permanently deleted a comment"
2447
  msgstr ""
2448
 
2449
- #: defaults.php:249
2450
  msgid ""
2451
- "Permanently deleted the comment posted in response to the post %PostTitle% "
2452
- "by %Author% on %Date%."
2453
  msgstr ""
2454
 
2455
- #: defaults.php:250
2456
- msgid "User posted a comment"
2457
  msgstr ""
2458
 
2459
- #: defaults.php:250
2460
- msgid "%CommentMsg% on %CommentLink%."
2461
  msgstr ""
2462
 
2463
  #: defaults.php:252
2464
- msgid "Custom Alerts"
 
 
 
 
2465
  msgstr ""
2466
 
2467
  #: defaults.php:253
2468
- msgid "Custom critical Alert"
 
 
2469
  msgstr ""
2470
 
2471
- #: defaults.php:253 defaults.php:254 defaults.php:255
2472
- msgid "%CustomAlertText%"
2473
  msgstr ""
2474
 
2475
  #: defaults.php:254
2476
- msgid "Custom warning Alert"
 
 
 
 
 
 
2477
  msgstr ""
2478
 
2479
  #: defaults.php:255
2480
- msgid "Custom notice Alert"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2481
  msgstr ""
2482
 
2483
- #: wp-security-audit-log.php:261
 
2484
  msgid ""
2485
  "You are using a version of PHP that is older than %s, which is no longer "
2486
  "supported.<br/>Contact us on <a href=\"mailto:plugins@wpwhitesecurity.com"
@@ -2492,9 +3441,7 @@ msgstr ""
2492
  msgid "WP Security Audit Log"
2493
  msgstr ""
2494
 
2495
- #. #-#-#-#-# plugin.pot (WP Security Audit Log 2.5.3) #-#-#-#-#
2496
  #. Plugin URI of the plugin/theme
2497
- #. #-#-#-#-# plugin.pot (WP Security Audit Log 2.5.3) #-#-#-#-#
2498
  #. Author URI of the plugin/theme
2499
  msgid "http://www.wpsecurityauditlog.com/"
2500
  msgstr ""
1
+ #, fuzzy
 
2
  msgid ""
3
  msgstr ""
4
+ "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
5
+ "Project-Id-Version: WP Security Audit Log\n"
6
+ "POT-Creation-Date: 2017-09-19 15:19+0100\n"
7
+ "PO-Revision-Date: 2017-09-19 15:19+0100\n"
8
+ "Last-Translator: \n"
9
+ "Language-Team: \n"
10
  "MIME-Version: 1.0\n"
11
  "Content-Type: text/plain; charset=UTF-8\n"
12
  "Content-Transfer-Encoding: 8bit\n"
13
+ "X-Generator: Poedit 2.0.3\n"
14
+ "X-Poedit-Basepath: ..\n"
15
+ "X-Poedit-Flags-xgettext: --add-comments=translators:\n"
16
+ "X-Poedit-WPHeader: wp-security-audit-log.php\n"
17
+ "X-Poedit-SourceCharset: UTF-8\n"
18
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;"
19
+ "esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;"
20
+ "_nx_noop:3c,1,2;__ngettext_noop:1,2\n"
21
+ "X-Poedit-SearchPath-0: .\n"
22
+ "X-Poedit-SearchPathExcluded-0: *.js\n"
23
+
24
+ #: classes/AuditLogListView.php:40
25
  msgid "No events so far."
26
  msgstr ""
27
 
28
+ #: classes/AuditLogListView.php:46
29
  msgid "Other"
30
  msgstr ""
31
 
32
+ #: classes/AuditLogListView.php:53
33
  msgid "Show "
34
  msgstr ""
35
 
36
+ #: classes/AuditLogListView.php:63
37
  msgid " Items"
38
  msgstr ""
39
 
40
+ #: classes/AuditLogListView.php:76 classes/Views/AuditLog.php:150
41
+ #: classes/Views/AuditLog.php:170
42
  msgid "All Sites"
43
  msgstr ""
44
 
45
+ #: classes/AuditLogListView.php:97
46
+ msgid "Live Database"
 
47
  msgstr ""
48
 
49
+ #: classes/AuditLogListView.php:98
50
+ msgid "Archive Database"
 
51
  msgstr ""
52
 
53
+ #: classes/AuditLogListView.php:137 classes/WidgetManager.php:51
54
+ msgid "User"
55
  msgstr ""
56
 
57
+ #: classes/AuditLogListView.php:139 classes/Views/Settings.php:529
58
  msgid "Username"
59
  msgstr ""
60
 
61
+ #: classes/AuditLogListView.php:144 classes/AuditLogListView.php:161
62
+ #: classes/Views/ToggleAlerts.php:109
63
+ msgid "Code"
64
+ msgstr ""
65
+
66
+ #: classes/AuditLogListView.php:145 classes/AuditLogListView.php:164
67
+ #: classes/Views/ToggleAlerts.php:110
68
+ msgid "Type"
69
+ msgstr ""
70
+
71
+ #: classes/AuditLogListView.php:146 classes/AuditLogListView.php:167
72
+ msgid "Date"
73
+ msgstr ""
74
+
75
+ #: classes/AuditLogListView.php:148 classes/AuditLogListView.php:173
76
  msgid "Source IP"
77
  msgstr ""
78
 
79
+ #: classes/AuditLogListView.php:151 classes/AuditLogListView.php:176
80
  msgid "Site"
81
  msgstr ""
82
 
83
+ #: classes/AuditLogListView.php:153 classes/AuditLogListView.php:179
84
  msgid "Message"
85
  msgstr ""
86
 
87
+ #: classes/AuditLogListView.php:217
88
  msgid "Click to toggle."
89
  msgstr ""
90
 
91
+ #: classes/AuditLogListView.php:220
92
+ msgid "Disable this type of alerts."
93
+ msgstr ""
94
+
95
+ #: classes/AuditLogListView.php:225
96
  msgid "Unknown error code."
97
  msgstr ""
98
 
99
+ #: classes/AuditLogListView.php:256
100
+ msgid "Show me all activity by this User"
101
+ msgstr ""
102
+
103
+ #: classes/AuditLogListView.php:271
104
  msgid "Unknown"
105
  msgstr ""
106
 
107
+ #: classes/AuditLogListView.php:275
108
  msgid "Plugin"
109
  msgstr ""
110
 
111
+ #: classes/AuditLogListView.php:279
112
  msgid "Plugins"
113
  msgstr ""
114
 
115
+ #: classes/AuditLogListView.php:283
116
  msgid "Website Visitor"
117
  msgstr ""
118
 
119
+ #: classes/AuditLogListView.php:287
120
  msgid "System"
121
  msgstr ""
122
 
123
+ #: classes/AuditLogListView.php:307 classes/AuditLogListView.php:320
124
+ msgid "Show me all activity originating from this IP Address"
125
+ msgstr ""
126
+
127
+ #: classes/AuditLogListView.php:341
128
  msgid "Alert Data Inspector"
129
  msgstr ""
130
 
131
+ #: classes/Sensors/Content.php:626 classes/Sensors/Content.php:634
132
+ #: classes/Sensors/WooCommerce.php:331 classes/Sensors/WooCommerce.php:337
133
  msgid "Password Protected"
134
  msgstr ""
135
 
136
+ #: classes/Sensors/Content.php:628 classes/Sensors/Content.php:636
137
  msgid "Public"
138
  msgstr ""
139
 
140
+ #: classes/Sensors/Content.php:630 classes/Sensors/Content.php:638
141
  msgid "Private"
142
  msgstr ""
143
 
144
+ #: classes/Sensors/WooCommerce.php:807
145
+ msgid "In stock"
146
+ msgstr ""
147
+
148
+ #: classes/Sensors/WooCommerce.php:809
149
+ msgid "Out of stock"
150
+ msgstr ""
151
+
152
+ #: classes/Views/About.php:11
153
  msgid "About WP Security Audit Log"
154
  msgstr ""
155
 
156
+ #: classes/Views/About.php:21
157
  msgid "About"
158
  msgstr ""
159
 
160
+ #: classes/Views/About.php:37
161
  msgid ""
162
  "WP Security Audit Log enables WordPress administrators and owners to "
163
  "identify WordPress security issues before they become a security problem by "
165
  "WordPress security professionals WP White Security."
166
  msgstr ""
167
 
168
+ #: classes/Views/About.php:39
169
  msgid ""
170
  "Keep A WordPress Security Audit Log & Identify WordPress Security Issues"
171
  msgstr ""
172
 
173
+ #: classes/Views/About.php:41
174
  msgid ""
175
  "WP Security Audit Log logs everything happening on your WordPress blog or "
176
  "website and WordPress multisite network. By using WP Security Audit Log "
179
  "generated by the plugin when:"
180
  msgstr ""
181
 
182
+ #: classes/Views/About.php:44
183
  msgid "User creates a new user or a new user is registered"
184
  msgstr ""
185
 
186
+ #: classes/Views/About.php:45
187
  msgid ""
188
  "Existing user changes the role, password or other properties of another user"
189
  msgstr ""
190
 
191
+ #: classes/Views/About.php:46
192
  msgid "Existing user on a WordPress multisite network is added to a site"
193
  msgstr ""
194
 
195
+ #: classes/Views/About.php:47
196
  msgid "User uploads or deletes a file, changes a password or email address"
197
  msgstr ""
198
 
199
+ #: classes/Views/About.php:48
200
  msgid "User installs, activates, deactivates, upgrades or uninstalls a plugin"
201
  msgstr ""
202
 
203
+ #: classes/Views/About.php:49
204
  msgid ""
205
  "User creates, modifies or deletes a new post, page, category or a custom "
206
  "post type"
207
  msgstr ""
208
 
209
+ #: classes/Views/About.php:50
210
  msgid "User installs or activates a WordPress theme"
211
  msgstr ""
212
 
213
+ #: classes/Views/About.php:51
214
  msgid "User adds, modifies or deletes a widget"
215
  msgstr ""
216
 
217
+ #: classes/Views/About.php:52
218
  msgid "User uses the dashboard file editor"
219
  msgstr ""
220
 
221
+ #: classes/Views/About.php:53
222
  msgid "WordPress settings are changed"
223
  msgstr ""
224
 
225
+ #: classes/Views/About.php:54
226
  msgid "Failed login attempts"
227
  msgstr ""
228
 
229
+ #: classes/Views/About.php:55
230
  msgid "and much more&hellip;"
231
  msgstr ""
232
 
233
+ #: classes/Views/About.php:65
234
  msgid "Extend the Functionality & Get More Value from WP Security Audit Log"
235
  msgstr ""
236
 
237
+ #: classes/Views/About.php:68
238
  msgid ""
239
  "Get more value out of WP Security Audit Log by extending the functionality "
240
  "of WP Security Audit Log with the premium Add-Ons."
241
  msgstr ""
242
 
243
+ #: classes/Views/About.php:70
244
  msgid "See Add-Ons"
245
  msgstr ""
246
 
247
+ #: classes/Views/About.php:74 classes/Views/Help.php:79
248
  msgid "WP Security Audit Log in your Language!"
249
  msgstr ""
250
 
251
+ #: classes/Views/About.php:76 classes/Views/Help.php:81
252
  msgid ""
253
  "If you are interested in translating our plugin please drop us an email on"
254
  msgstr ""
255
 
256
+ #: classes/Views/About.php:81
257
  msgid "WordPress Security Services"
258
  msgstr ""
259
 
260
+ #: classes/Views/About.php:83
261
  msgid "Professional WordPress security services provided by WP White Security"
262
  msgstr ""
263
 
264
+ #: classes/Views/AuditLog.php:72
265
  msgid "Upgrade to Premium"
266
  msgstr ""
267
 
268
+ #: classes/Views/AuditLog.php:73
269
  msgid ""
270
  "and add Email Alerts, Reports, Search and Users Login and Session Management."
271
  msgstr ""
272
 
273
+ #: classes/Views/AuditLog.php:74
274
  msgid "Upgrade Now!"
275
  msgstr ""
276
 
277
+ #: classes/Views/AuditLog.php:90 classes/Views/AuditLog.php:102
278
  msgid "Audit Log Viewer"
279
  msgstr ""
280
 
281
+ #: classes/Views/AuditLog.php:125 classes/Views/Licensing.php:47
282
+ #: classes/Views/Settings.php:152 classes/Views/ToggleAlerts.php:39
283
  msgid "You do not have sufficient permissions to access this page."
284
  msgstr ""
285
 
286
+ #: classes/Views/AuditLog.php:149 classes/Views/AuditLog.php:169
287
  msgid "Please enter the number of alerts you would like to see on one page:"
288
  msgstr ""
289
 
290
+ #: classes/Views/AuditLog.php:151 classes/Views/AuditLog.php:171
291
  msgid "No Results"
292
  msgstr ""
293
 
294
+ #: classes/Views/EmailNotifications.php:13
295
  msgid "Email Notifications Add-On"
296
  msgstr ""
297
 
298
+ #: classes/Views/EmailNotifications.php:23
299
  msgid "Notifications Email"
300
  msgstr ""
301
 
302
+ #: classes/Views/EmailNotifications.php:46 classes/Views/Extensions.php:78
303
  msgid "Email Notifications"
304
  msgstr ""
305
 
306
+ #: classes/Views/EmailNotifications.php:48
307
  msgid ""
308
  "This premium add-on allows you to configure email alerts so you are "
309
  "<br>notified instantly when important changes happen on your WordPress."
310
  msgstr ""
311
 
312
+ #: classes/Views/EmailNotifications.php:52 classes/Views/ExternalDB.php:52
313
+ #: classes/Views/LogInUsers.php:51 classes/Views/Reports.php:51
314
+ #: classes/Views/Search.php:51
315
  msgid "Learn More"
316
  msgstr ""
317
 
318
+ #: classes/Views/EmailNotifications.php:61 classes/Views/ExternalDB.php:61
319
+ #: classes/Views/LogInUsers.php:60 classes/Views/Reports.php:60
320
+ #: classes/Views/Search.php:60
321
  msgid "Buy all Add-Ons Bundle"
322
  msgstr ""
323
 
324
+ #: classes/Views/Extensions.php:13
325
  msgid "WP Security Audit Log Add-Ons"
326
  msgstr ""
327
 
328
+ #: classes/Views/Extensions.php:23
329
  msgid " Add Functionality"
330
  msgstr ""
331
 
332
+ #: classes/Views/Extensions.php:44
333
  msgid ""
334
  "The below add-ons allow you to extend the functionality of WP Security Audit "
335
  "Log plugin and enable you to get more benefits out of the WordPress security "
338
  "regulatory compliance requirements."
339
  msgstr ""
340
 
341
+ #: classes/Views/Extensions.php:50
342
  msgid "All Add-Ons Bundle"
343
  msgstr ""
344
 
345
+ #: classes/Views/Extensions.php:52
346
+ #, php-format
347
  msgid ""
348
  "Benefit from a 60% discount when you purchase all the add-ons as a single "
349
  "bundle."
350
  msgstr ""
351
 
352
+ #: classes/Views/Extensions.php:55
353
  msgid "Get this Bundle"
354
  msgstr ""
355
 
356
+ #: classes/Views/Extensions.php:63
357
  msgid "Users Logins and Management"
358
  msgstr ""
359
 
360
+ #: classes/Views/Extensions.php:65
361
  msgid ""
362
  "See who is logged in to your WordPress and manage user sessions and logins."
363
  msgstr ""
364
 
365
+ #: classes/Views/Extensions.php:69 classes/Views/Extensions.php:84
366
+ #: classes/Views/Extensions.php:99 classes/Views/Extensions.php:114
367
+ #: classes/Views/Extensions.php:129
368
  msgid "Get this extension"
369
  msgstr ""
370
 
371
+ #: classes/Views/Extensions.php:80
372
  msgid ""
373
  "Get notified instantly via email when important changes are made on your "
374
  "WordPress!"
375
  msgstr ""
376
 
377
+ #: classes/Views/Extensions.php:93 classes/Views/Reports.php:22
378
+ #: classes/Views/Reports.php:45
379
  msgid "Reports"
380
  msgstr ""
381
 
382
+ #: classes/Views/Extensions.php:95
383
  msgid ""
384
  "Generate any type of user,site and activity report to keep track of user "
385
  "productivity and to meet regulatory compliance requirements."
386
  msgstr ""
387
 
388
+ #: classes/Views/Extensions.php:108 classes/Views/Search.php:22
389
+ #: classes/Views/Search.php:45
390
  msgid "Search"
391
  msgstr ""
392
 
393
+ #: classes/Views/Extensions.php:110
394
  msgid ""
395
  "Do free-text based searches for specific activity in the WordPress audit "
396
  "trail. You can also use filters to fine-tune your searches."
397
  msgstr ""
398
 
399
+ #: classes/Views/Extensions.php:123 classes/Views/ExternalDB.php:46
400
  msgid "External DB"
401
  msgstr ""
402
 
403
+ #: classes/Views/Extensions.php:125
404
  msgid ""
405
  "Store the WordPress audit trial in an external database for a more secure "
406
  "and faster WordPress website."
407
  msgstr ""
408
 
409
+ #: classes/Views/ExternalDB.php:13
410
+ msgid "External DB Add-On"
411
+ msgstr ""
412
+
413
+ #: classes/Views/ExternalDB.php:23
414
+ msgid "External DB "
415
+ msgstr ""
416
+
417
+ #: classes/Views/ExternalDB.php:48
418
+ msgid ""
419
+ "Meet Legal and Regulatory Compliance Requirements, Improve the Security of "
420
+ "Your WordPress and Boost its Performance by storing the WordPress Audit "
421
+ "Trail in an external database."
422
+ msgstr ""
423
+
424
+ #: classes/Views/Help.php:13 classes/Views/Help.php:23
425
  msgid "Help"
426
  msgstr ""
427
 
428
+ #: classes/Views/Help.php:38
429
  msgid "Plugin Support"
430
  msgstr ""
431
 
432
+ #: classes/Views/Help.php:40
433
  msgid ""
434
  "Have you encountered or noticed any issues while using WP Security Audit Log "
435
  "plugin?"
436
  msgstr ""
437
 
438
+ #: classes/Views/Help.php:41
439
  msgid ""
440
  "Or you want to report something to us? Click any of the options below to "
441
  "post on the plugin's forum or contact our support directly."
442
  msgstr ""
443
 
444
+ #: classes/Views/Help.php:43
445
  msgid "Free Support Forum"
446
  msgstr ""
447
 
448
+ #: classes/Views/Help.php:45
449
  msgid "Free Support Email"
450
  msgstr ""
451
 
452
+ #: classes/Views/Help.php:50
453
  msgid "Plugin Documentation"
454
  msgstr ""
455
 
456
+ #: classes/Views/Help.php:52
457
  msgid ""
458
  "For more detailed information about WP Security Audit Log you can visit the "
459
  "plugin website."
460
  msgstr ""
461
 
462
+ #: classes/Views/Help.php:53
463
  msgid ""
464
  "You can also visit the official list of WordPress Security Alerts for more "
465
  "information about all of the WordPress activity and changes you can monitor "
466
  "with WP Security Audit Log."
467
  msgstr ""
468
 
469
+ #: classes/Views/Help.php:55
470
  msgid "Plugin Website"
471
  msgstr ""
472
 
473
+ #: classes/Views/Help.php:57
474
  msgid "Plugin Documenation"
475
  msgstr ""
476
 
477
+ #: classes/Views/Help.php:59
478
  msgid "FAQs"
479
  msgstr ""
480
 
481
+ #: classes/Views/Help.php:61
482
  msgid "List of WordPress Security Alerts"
483
  msgstr ""
484
 
485
+ #: classes/Views/Help.php:66
486
  msgid "Keep Yourself Up-to-Date with WordPress Security"
487
  msgstr ""
488
 
489
+ #: classes/Views/Help.php:68
490
  msgid ""
491
  "Keep yourself informed with what is happening in the WordPress security "
492
  "ecosystem, which are the new vulnerabilities, which plugins you need to "
494
  "step ahead of the hackers."
495
  msgstr ""
496
 
497
+ #: classes/Views/Help.php:70
498
  msgid "Read the WP White Security Blog"
499
  msgstr ""
500
 
501
+ #: classes/Views/Help.php:72
502
  msgid ""
503
  "Subscribe to WP Security Bloggers (An Aggregate of WordPress Security Blogs)"
504
  msgstr ""
505
 
506
+ #: classes/Views/Licensing.php:11 classes/Views/Licensing.php:21
507
  msgid "Licensing"
508
  msgstr ""
509
 
510
+ #: classes/Views/Licensing.php:52 classes/Views/Settings.php:158
511
+ #: classes/Views/ToggleAlerts.php:56
512
  msgid "Settings have been saved."
513
  msgstr ""
514
 
515
+ #: classes/Views/Licensing.php:54 classes/Views/Settings.php:161
516
+ #: classes/Views/ToggleAlerts.php:58
517
  msgid "Error: "
518
  msgstr ""
519
 
520
+ #: classes/Views/Licensing.php:74
521
  msgid "Version"
522
  msgstr ""
523
 
524
+ #: classes/Views/Licensing.php:84
525
  msgid "Active"
526
  msgstr ""
527
 
528
+ #: classes/Views/Licensing.php:86
529
  msgid "Inactive"
530
  msgstr ""
531
 
532
+ #: classes/Views/LogInUsers.php:12
533
  msgid "User Sessions Management Add-On"
534
  msgstr ""
535
 
536
+ #: classes/Views/LogInUsers.php:22
537
  msgid "Logged In Users"
538
  msgstr ""
539
 
540
+ #: classes/Views/LogInUsers.php:45
541
  msgid "Users login and Management"
542
  msgstr ""
543
 
544
+ #: classes/Views/LogInUsers.php:47
545
  msgid ""
546
  "This premium add-on allows you to see who is logged in to your WordPress,"
547
  "<br> block multiple same-user WordPress sessions and more."
548
  msgstr ""
549
 
550
+ #: classes/Views/Reports.php:12
551
  msgid "Reports Add-On"
552
  msgstr ""
553
 
554
+ #: classes/Views/Reports.php:47
555
  msgid ""
556
  "Generate any type of user and site activity report to keep track of user "
557
  "productivity<br> and meet regulatory compliance requirements. You can also "
558
  "configure automated weekly or monthly email summary reports."
559
  msgstr ""
560
 
561
+ #: classes/Views/Search.php:12
562
  msgid "Search Add-On"
563
  msgstr ""
564
 
565
+ #: classes/Views/Search.php:47
566
  msgid ""
567
  "Do free-text based searches for specific activity in the WordPress audit "
568
  "trail.<br> You can also use the built-in filters to fine-tune your searches."
569
  msgstr ""
570
 
571
+ #: classes/Views/Settings.php:38 classes/Views/Settings.php:48
572
  msgid "Settings"
573
  msgstr ""
574
 
575
+ #: classes/Views/Settings.php:166
576
+ msgid "General"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
577
  msgstr ""
578
 
579
+ #: classes/Views/Settings.php:167
580
+ msgid "Audit Log"
581
  msgstr ""
582
 
583
+ #: classes/Views/Settings.php:168
584
+ msgid "Exclude Objects"
585
  msgstr ""
586
 
587
+ #: classes/Views/Settings.php:184
588
  msgid "From Email & Name"
589
  msgstr ""
590
 
591
+ #: classes/Views/Settings.php:187
592
  msgid "Email Address"
593
  msgstr ""
594
 
595
+ #: classes/Views/Settings.php:190
596
  msgid "Display Name"
597
  msgstr ""
598
 
599
+ #: classes/Views/Settings.php:196
600
+ #, php-format
601
  msgid ""
602
  "These email address and display name will be used as From details in the "
603
  "emails sent by the %s . Please ensure the mail server can relay emails with "
604
  "the domain of the specified email address."
605
  msgstr ""
606
 
607
+ #: classes/Views/Settings.php:197
608
  msgid "(premium add-ons)"
609
  msgstr ""
610
 
611
+ #: classes/Views/Settings.php:205
612
  msgid "Alerts Dashboard Widget"
613
  msgstr ""
614
 
615
+ #: classes/Views/Settings.php:211
616
  msgid "On"
617
  msgstr ""
618
 
619
+ #: classes/Views/Settings.php:216
620
  msgid "Off"
621
  msgstr ""
622
 
623
+ #: classes/Views/Settings.php:221
624
+ #, php-format
625
  msgid "Display a dashboard widget with the latest %d security alerts."
626
  msgstr ""
627
 
628
+ #: classes/Views/Settings.php:230
629
  msgid "Reverse Proxy / Firewall Options"
630
  msgstr ""
631
 
632
+ #: classes/Views/Settings.php:236
633
  msgid "WordPress running behind firewall or proxy"
634
  msgstr ""
635
 
636
+ #: classes/Views/Settings.php:239
637
  msgid ""
638
  "Enable this option if your WordPress is running behind a firewall or reverse "
639
  "proxy. When this option is enabled the plugin will retrieve the user's IP "
640
  "address from the proxy header."
641
  msgstr ""
642
 
643
+ #: classes/Views/Settings.php:244
644
  msgid "Filter Internal IP Addresses"
645
  msgstr ""
646
 
647
+ #: classes/Views/Settings.php:247
648
  msgid ""
649
  "Enable this option to filter internal IP addresses from the proxy headers."
650
  msgstr ""
651
 
652
+ #: classes/Views/Settings.php:253
 
 
 
 
 
 
 
 
653
  msgid "Can Manage Plugin"
654
  msgstr ""
655
 
656
+ #: classes/Views/Settings.php:260
657
  msgid "Users and Roles in this list can manage the plugin settings"
658
  msgstr ""
659
 
660
+ #: classes/Views/Settings.php:278
661
  msgid "Restrict Plugin Access"
662
  msgstr ""
663
 
664
+ #: classes/Views/Settings.php:288
665
  msgid ""
666
+ "If this option is disabled all the administrators on this WordPress have "
667
+ "access to manage this plugin."
 
 
668
  msgstr ""
669
 
670
+ #: classes/Views/Settings.php:289
671
+ msgid ""
672
+ "By enabling this option only <strong>You</strong> and the users specified in "
673
+ "the <strong>Can Manage Plugin</strong> and <strong>Can View Alerts</strong> "
674
+ "can configure this plugin or view the alerts in the WordPress audit trail."
675
  msgstr ""
676
 
677
+ #: classes/Views/Settings.php:296
678
+ msgid "Developer Options"
679
  msgstr ""
680
 
681
+ #: classes/Views/Settings.php:304
682
+ msgid ""
683
+ "Only enable these options on testing, staging and development websites. "
684
+ "Enabling any of the settings below on LIVE websites may cause unintended "
685
+ "side-effects including degraded performance."
686
  msgstr ""
687
 
688
+ #: classes/Views/Settings.php:309
689
+ msgid "Data Inspector"
690
  msgstr ""
691
 
692
+ #: classes/Views/Settings.php:310
693
+ msgid "View data logged for each triggered alert."
694
  msgstr ""
695
 
696
+ #: classes/Views/Settings.php:317
697
+ msgid "Request Log"
698
  msgstr ""
699
 
700
+ #: classes/Views/Settings.php:318
701
+ msgid "Enables logging request to file."
702
  msgstr ""
703
 
704
+ #: classes/Views/Settings.php:336
705
+ msgid ""
706
+ "The request log file is saved in the /wp-content/uploads/wp-security-audit-"
707
+ "log/ directory."
708
  msgstr ""
709
 
710
+ #: classes/Views/Settings.php:344
711
+ msgid "Hide Plugin in Plugins Page"
712
  msgstr ""
713
 
714
+ #: classes/Views/Settings.php:350
715
+ msgid "Hide"
716
  msgstr ""
717
 
718
+ #: classes/Views/Settings.php:354
719
+ msgid ""
720
+ "To manually revert this setting set the value of option wsal-hide-plugin to "
721
+ "0 in the wp_wsal_options table."
722
  msgstr ""
723
 
724
+ #: classes/Views/Settings.php:361
725
+ msgid "Logging"
 
 
726
  msgstr ""
727
 
728
+ #: classes/Views/Settings.php:375
729
+ msgid "Disable all plugin logging."
730
  msgstr ""
731
 
732
+ #: classes/Views/Settings.php:382
733
+ msgid "Remove Data on Uninstall"
 
 
 
734
  msgstr ""
735
 
736
  #: classes/Views/Settings.php:406
737
+ msgid ""
738
+ "The options below are disabled because you enabled archiving of alerts to "
739
+ "the archiving table from"
740
  msgstr ""
741
 
742
+ #: classes/Views/Settings.php:411
743
+ msgid "Security Alerts Pruning"
744
+ msgstr ""
745
+
746
+ #: classes/Views/Settings.php:414 classes/Views/Settings.php:422
747
+ msgid "(eg: 1 month)"
748
  msgstr ""
749
 
750
  #: classes/Views/Settings.php:418
751
+ msgid "None"
752
  msgstr ""
753
 
754
+ #: classes/Views/Settings.php:426
755
+ msgid "Delete alerts older than"
756
+ msgstr ""
757
+
758
+ #: classes/Views/Settings.php:434
759
+ msgid "(eg: 80)"
760
  msgstr ""
761
 
762
+ #: classes/Views/Settings.php:438
763
+ msgid "Keep up to"
764
  msgstr ""
765
 
766
+ #: classes/Views/Settings.php:443
767
+ msgid "alerts"
768
  msgstr ""
769
 
770
+ #: classes/Views/Settings.php:447
771
+ msgid "Next Scheduled Cleanup is in "
772
  msgstr ""
773
 
774
+ #: classes/Views/Settings.php:451
775
+ #, php-format
776
+ msgid "(or %s)"
777
  msgstr ""
778
 
779
+ #: classes/Views/Settings.php:452
780
+ msgid "Run Manually"
781
  msgstr ""
782
 
783
+ #: classes/Views/Settings.php:459
784
+ msgid "Can View Alerts"
785
  msgstr ""
786
 
787
+ #: classes/Views/Settings.php:466
788
+ msgid "Users and Roles in this list can view the security alerts"
789
  msgstr ""
790
 
791
+ #: classes/Views/Settings.php:482
792
+ msgid "Refresh Audit Log Viewer"
793
  msgstr ""
794
 
795
+ #: classes/Views/Settings.php:488
796
+ msgid "Automatic"
797
+ msgstr ""
798
+
799
+ #: classes/Views/Settings.php:490
800
+ msgid "Refresh Audit Log Viewer as soon as there are new alerts."
801
+ msgstr ""
802
+
803
+ #: classes/Views/Settings.php:494
804
+ msgid "Manual"
805
+ msgstr ""
806
+
807
+ #: classes/Views/Settings.php:496
808
+ msgid "Refresh Audit Log Viewer only when the page is reloaded."
809
+ msgstr ""
810
+
811
+ #: classes/Views/Settings.php:503
812
+ msgid "Alerts Timestamp"
813
+ msgstr ""
814
+
815
+ #: classes/Views/Settings.php:509
816
+ msgid "UTC"
817
+ msgstr ""
818
+
819
+ #: classes/Views/Settings.php:514
820
+ msgid "WordPress' timezone"
821
+ msgstr ""
822
+
823
+ #: classes/Views/Settings.php:517
824
  msgid ""
825
+ "Select which timestamp the alerts should have in the Audit Log viewer. Note "
826
+ "that the WordPress' timezone might be different from that of the server."
827
+ msgstr ""
828
+
829
+ #: classes/Views/Settings.php:523
830
+ msgid "User Information in Audit Log"
831
+ msgstr ""
832
+
833
+ #: classes/Views/Settings.php:534
834
+ msgid "First Name & Last Name"
835
+ msgstr ""
836
+
837
+ #: classes/Views/Settings.php:537
838
+ msgid ""
839
+ "Select the type of user information that should be displayed in the audit "
840
+ "log."
841
+ msgstr ""
842
+
843
+ #: classes/Views/Settings.php:543
844
+ msgid "Audit Log Columns Selection"
845
+ msgstr ""
846
+
847
+ #: classes/Views/Settings.php:554
848
+ msgid ""
849
+ "When you disable any of the above such details won’t be shown in the Audit "
850
+ "Log viewer though the plugin will still record such information in the "
851
+ "database."
852
  msgstr ""
853
 
854
+ #: classes/Views/Settings.php:560
855
  msgid "Disable Alerts for WordPress Background Activity"
856
  msgstr ""
857
 
858
+ #: classes/Views/Settings.php:566
859
  msgid "Hide activity"
860
  msgstr ""
861
 
862
+ #: classes/Views/Settings.php:570
863
  msgid ""
864
  "For example do not raise an alert when WordPress deletes the auto drafts."
865
  msgstr ""
866
 
867
+ #: classes/Views/Settings.php:581
868
+ msgid "Users & Roles"
869
  msgstr ""
870
 
871
+ #: classes/Views/Settings.php:588
872
  msgid "Excluded Users"
873
  msgstr ""
874
 
875
+ #: classes/Views/Settings.php:608
876
  msgid "Excluded Roles"
877
  msgstr ""
878
 
879
+ #: classes/Views/Settings.php:627
880
+ msgid "Custom Fields"
881
+ msgstr ""
882
+
883
+ #: classes/Views/Settings.php:635
884
  msgid "Excluded Custom Fields"
885
  msgstr ""
886
 
887
+ #: classes/Views/Settings.php:654
888
+ msgid "IP Addresses"
889
+ msgstr ""
890
+
891
+ #: classes/Views/Settings.php:661
892
  msgid "Excluded IP Addresses"
893
  msgstr ""
894
 
895
+ #: classes/Views/Settings.php:680 defaults.php:106
896
+ msgid "Custom Post Types"
897
+ msgstr ""
898
+
899
+ #: classes/Views/Settings.php:683
900
+ msgid ""
901
+ "The below list of Custom Post Types are excluded from monitoring. This means "
902
+ "that all activity related to these Custom Post Types will not be recorded."
903
+ msgstr ""
904
+
905
+ #: classes/Views/Settings.php:686
906
+ msgid "Exclude Custom Post Type from monitoring"
907
+ msgstr ""
908
+
909
+ #: classes/Views/ToggleAlerts.php:11 classes/Views/ToggleAlerts.php:21
910
  msgid "Enable/Disable Alerts"
911
  msgstr ""
912
 
913
+ #: classes/Views/ToggleAlerts.php:111 classes/WidgetManager.php:52
914
  msgid "Description"
915
  msgstr ""
916
 
917
+ #: classes/Views/ToggleAlerts.php:125
918
  msgid "Not Implemented"
919
  msgstr ""
920
 
921
+ #: classes/Views/ToggleAlerts.php:128
922
  msgid "Not Available"
923
  msgstr ""
924
 
925
+ #: classes/Views/ToggleAlerts.php:143 classes/Views/ToggleAlerts.php:170
926
  msgid ""
927
  "Capture 404 requests to file (the log file are created in the /wp-content/"
928
  "uploads/wp-security-audit-log/404s/ directory)"
929
  msgstr ""
930
 
931
+ #: classes/Views/ToggleAlerts.php:148 classes/Views/ToggleAlerts.php:175
932
  msgid "Purge log files older than one month"
933
  msgstr ""
934
 
935
+ #: classes/Views/ToggleAlerts.php:153 classes/Views/ToggleAlerts.php:180
936
+ msgid "Number of 404 Requests to Log"
937
+ msgstr ""
938
+
939
+ #: classes/Views/ToggleAlerts.php:159 classes/Views/ToggleAlerts.php:186
940
+ msgid ""
941
+ "By default the plugin keeps up to 99 requests to non-existing pages from the "
942
+ "same IP address. Increase the value in this setting to the desired amount to "
943
+ "keep a log of more or less requests."
944
+ msgstr ""
945
+
946
+ #: classes/Views/ToggleAlerts.php:160 classes/Views/ToggleAlerts.php:187
947
+ msgid ""
948
+ "Note that by increasing this value to a high number, should your website be "
949
+ "scanned the plugin will consume more resources to log all the requests."
950
+ msgstr ""
951
+
952
+ #: classes/Views/ToggleAlerts.php:200
953
  msgid "Save Changes"
954
  msgstr ""
955
 
956
+ #: classes/WidgetManager.php:26
957
  msgid "Latest Alerts"
958
  msgstr ""
959
 
960
+ #: classes/WidgetManager.php:46
961
  msgid "No alerts found."
962
  msgstr ""
963
 
964
+ #: defaults.php:36
 
 
 
 
965
  msgid "Fatal run-time error."
966
  msgstr ""
967
 
968
+ #: defaults.php:37
969
  msgid "Run-time warning (non-fatal error)."
970
  msgstr ""
971
 
972
+ #: defaults.php:38
973
  msgid "Compile-time parse error."
974
  msgstr ""
975
 
976
+ #: defaults.php:39
977
  msgid "Run-time notice."
978
  msgstr ""
979
 
980
+ #: defaults.php:40
981
  msgid "Fatal error that occurred during startup."
982
  msgstr ""
983
 
984
+ #: defaults.php:41
985
  msgid "Warnings that occurred during startup."
986
  msgstr ""
987
 
988
+ #: defaults.php:42
989
  msgid "Fatal compile-time error."
990
  msgstr ""
991
 
992
+ #: defaults.php:43
993
  msgid "Compile-time warning."
994
  msgstr ""
995
 
996
+ #: defaults.php:44
997
  msgid "User-generated error message."
998
  msgstr ""
999
 
1000
+ #: defaults.php:45
1001
  msgid "User-generated warning message."
1002
  msgstr ""
1003
 
1004
+ #: defaults.php:46
1005
  msgid "User-generated notice message."
1006
  msgstr ""
1007
 
1008
+ #: defaults.php:47
1009
  msgid "Non-standard/optimal code warning."
1010
  msgstr ""
1011
 
1012
+ #: defaults.php:48
1013
  msgid "Catchable fatal error."
1014
  msgstr ""
1015
 
1016
+ #: defaults.php:49
1017
  msgid "Run-time deprecation notices."
1018
  msgstr ""
1019
 
1020
+ #: defaults.php:50
1021
  msgid "Run-time user deprecation notices."
1022
  msgstr ""
1023
 
1024
+ #: defaults.php:52
1025
  msgid "Critical, high-impact messages."
1026
  msgstr ""
1027
 
1028
+ #: defaults.php:53
1029
  msgid "Debug informational messages."
1030
  msgstr ""
1031
 
1032
+ #: defaults.php:57
1033
+ msgid "Content & Comments"
1034
  msgstr ""
1035
 
1036
+ #: defaults.php:58
1037
+ msgid "Blog Posts"
1038
  msgstr ""
1039
 
1040
+ #: defaults.php:59
1041
+ msgid "User created a new blog post and saved it as draft"
1042
  msgstr ""
1043
 
1044
+ #: defaults.php:59
1045
+ msgid ""
1046
+ "Created a new post called %PostTitle% and saved it as draft. %EditorLinkPost"
1047
+ "%."
1048
  msgstr ""
1049
 
1050
+ #: defaults.php:60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1051
  msgid "User published a blog post"
1052
  msgstr ""
1053
 
1054
+ #: defaults.php:60
1055
  msgid ""
1056
  "Published a post called %PostTitle%. Post URL is %PostUrl%. %EditorLinkPost%."
1057
  msgstr ""
1058
 
1059
+ #: defaults.php:61
1060
  msgid "User modified a published blog post"
1061
  msgstr ""
1062
 
1063
+ #: defaults.php:61
1064
  msgid ""
1065
  "Modified the published post %PostTitle%. Post URL is %PostUrl%. "
1066
  "%EditorLinkPost%."
1067
  msgstr ""
1068
 
1069
+ #: defaults.php:62
1070
  msgid "User modified a draft blog post"
1071
  msgstr ""
1072
 
1073
+ #: defaults.php:62
1074
  msgid "Modified the draft post with the %PostTitle%. %EditorLinkPost%."
1075
  msgstr ""
1076
 
1077
+ #: defaults.php:63
1078
  msgid "User permanently deleted a blog post from the trash"
1079
  msgstr ""
1080
 
1081
+ #: defaults.php:63
1082
+ msgid "Permanently deleted the post %PostTitle%."
 
 
1083
  msgstr ""
1084
 
1085
+ #: defaults.php:64
1086
  msgid "User moved a blog post to the trash"
1087
  msgstr ""
1088
 
1089
+ #: defaults.php:64
1090
  msgid "Moved the post %PostTitle% to trash. Post URL is %PostUrl%."
1091
  msgstr ""
1092
 
1093
+ #: defaults.php:65
1094
  msgid "User restored a blog post from trash"
1095
  msgstr ""
1096
 
1097
+ #: defaults.php:65
1098
  msgid "Post %PostTitle% has been restored from trash. %EditorLinkPost%."
1099
  msgstr ""
1100
 
1101
+ #: defaults.php:66
1102
  msgid "User changed blog post category"
1103
  msgstr ""
1104
 
1105
+ #: defaults.php:66
1106
  msgid ""
1107
  "Changed the category of the post %PostTitle% from %OldCategories% to "
1108
  "%NewCategories%. %EditorLinkPost%."
1109
  msgstr ""
1110
 
1111
+ #: defaults.php:67
1112
  msgid "User changed blog post URL"
1113
  msgstr ""
1114
 
1115
+ #: defaults.php:67
1116
  msgid ""
1117
  "Changed the URL of the post %PostTitle% from %OldUrl% to %NewUrl%. "
1118
  "%EditorLinkPost%."
1119
  msgstr ""
1120
 
1121
+ #: defaults.php:68
1122
  msgid "User changed blog post author"
1123
  msgstr ""
1124
 
1125
+ #: defaults.php:68
1126
  msgid ""
1127
  "Changed the author of %PostTitle% post from %OldAuthor% to %NewAuthor%. "
1128
  "%EditorLinkPost%."
1129
  msgstr ""
1130
 
1131
+ #: defaults.php:69
1132
  msgid "User changed blog post status"
1133
  msgstr ""
1134
 
1135
+ #: defaults.php:69
1136
  msgid ""
1137
  "Changed the status of %PostTitle% post from %OldStatus% to %NewStatus%. "
1138
  "%EditorLinkPost%."
1139
  msgstr ""
1140
 
1141
+ #: defaults.php:70
1142
  msgid "User created new category"
1143
  msgstr ""
1144
 
1145
+ #: defaults.php:70
1146
  msgid ""
1147
  "Created a new category called %CategoryName% .Category slug is %Slug%. "
1148
  "%CategoryLink%."
1149
  msgstr ""
1150
 
1151
+ #: defaults.php:71
1152
  msgid "User deleted category"
1153
  msgstr ""
1154
 
1155
+ #: defaults.php:71
1156
  msgid "Deleted the category %CategoryName%. Category slug was %Slug%."
1157
  msgstr ""
1158
 
1159
+ #: defaults.php:72
1160
  msgid "User changed the visibility of a blog post"
1161
  msgstr ""
1162
 
1163
+ #: defaults.php:72
1164
  msgid ""
1165
  "Changed the visibility of the post %PostTitle% from %OldVisibility% to "
1166
  "%NewVisibility%. %EditorLinkPost%."
1167
  msgstr ""
1168
 
1169
+ #: defaults.php:73
1170
  msgid "User changed the date of a blog post"
1171
  msgstr ""
1172
 
1173
+ #: defaults.php:73
1174
  msgid ""
1175
  "Changed the date of the post %PostTitle% from %OldDate% to %NewDate%. "
1176
  "%EditorLinkPost%."
1177
  msgstr ""
1178
 
1179
+ #: defaults.php:74
1180
  msgid "User set a post as sticky"
1181
  msgstr ""
1182
 
1183
+ #: defaults.php:74
1184
  msgid ""
1185
  "Set the post %PostTitle% as Sticky. Post URL is %PostUrl%. %EditorLinkPost%."
1186
  msgstr ""
1187
 
1188
+ #: defaults.php:75
1189
  msgid "User removed post from sticky"
1190
  msgstr ""
1191
 
1192
+ #: defaults.php:75
1193
  msgid "Removed the post %PostTitle% from Sticky. %EditorLinkPost%."
1194
  msgstr ""
1195
 
1196
+ #: defaults.php:76
1197
  msgid "User changed generic tables"
1198
  msgstr ""
1199
 
1200
+ #: defaults.php:76
1201
  msgid ""
1202
  "Changed the parent of the category %CategoryName% from %OldParent% to "
1203
  "%NewParent%. %CategoryLink%."
1204
  msgstr ""
1205
 
1206
+ #: defaults.php:77
1207
  msgid "User created a custom field for a post"
1208
  msgstr ""
1209
 
1210
+ #: defaults.php:77
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1211
  msgid ""
1212
+ "Created a new custom field %MetaKey% with value %MetaValue% in the post "
1213
+ "%PostTitle% %EditorLinkPost%.<br>%MetaLink%."
 
 
 
 
1214
  msgstr ""
1215
 
1216
+ #: defaults.php:78
1217
+ msgid "User updated a custom field value for a post"
 
1218
  msgstr ""
1219
 
1220
  #: defaults.php:78
1221
+ msgid ""
1222
+ "Modified the value of the custom field %MetaKey% from %MetaValueOld% to "
1223
+ "%MetaValueNew% in the post %PostTitle% %EditorLinkPost%.<br>%MetaLink%."
1224
  msgstr ""
1225
 
1226
  #: defaults.php:79
1227
+ msgid "User deleted a custom field from a post"
1228
  msgstr ""
1229
 
1230
  #: defaults.php:79
1231
  msgid ""
1232
+ "Deleted the custom field %MetaKey% with id %MetaID% from the post %PostTitle"
1233
+ "% %EditorLinkPost%.<br>%MetaLink%."
1234
  msgstr ""
1235
 
1236
  #: defaults.php:80
1237
+ msgid "User updated a custom field name for a post"
1238
  msgstr ""
1239
 
1240
  #: defaults.php:80
1241
  msgid ""
1242
+ "Changed the custom field name from %MetaKeyOld% to %MetaKeyNew% in the post "
1243
+ "%PostTitle% %EditorLinkPost%.<br>%MetaLink%."
1244
  msgstr ""
1245
 
1246
  #: defaults.php:81
1247
+ msgid "User modified content for a published post"
1248
  msgstr ""
1249
 
1250
  #: defaults.php:81
1251
  msgid ""
1252
+ "Modified the content of the published post %PostTitle%.%RevisionLink% "
1253
+ "%EditorLinkPost%."
1254
  msgstr ""
1255
 
1256
  #: defaults.php:82
1257
+ msgid "User modified content for a draft post"
1258
  msgstr ""
1259
 
1260
  #: defaults.php:82
1261
  msgid ""
1262
+ "Modified the content of the draft post %PostTitle%.%RevisionLink% "
1263
+ "%EditorLinkPost%."
1264
  msgstr ""
1265
 
1266
  #: defaults.php:83
1267
+ msgid "User modified content of a post"
1268
  msgstr ""
1269
 
1270
  #: defaults.php:83
1271
  msgid ""
1272
+ "Modified the content of post %PostTitle% which is submitted for review."
1273
+ "%RevisionLink% %EditorLinkPost%."
1274
  msgstr ""
1275
 
1276
  #: defaults.php:84
1277
+ msgid "User submitted a post for review"
1278
  msgstr ""
1279
 
1280
  #: defaults.php:84
1281
+ msgid "Submitted the post %PostTitle% for review. %EditorLinkPost%."
1282
  msgstr ""
1283
 
1284
  #: defaults.php:85
1285
+ msgid "User scheduled a post"
1286
  msgstr ""
1287
 
1288
  #: defaults.php:85
1289
+ msgid ""
1290
+ "Scheduled the post %PostTitle% to be published %PublishingDate%. "
1291
+ "%EditorLinkPost%."
1292
  msgstr ""
1293
 
1294
  #: defaults.php:86
1295
+ msgid "User changed title of a post"
1296
  msgstr ""
1297
 
1298
  #: defaults.php:86
1299
  msgid ""
1300
+ "Changed the title of the post %OldTitle% to %NewTitle%. %EditorLinkPost%."
 
1301
  msgstr ""
1302
 
1303
  #: defaults.php:87
1304
+ msgid "User opened a post in the editor"
1305
  msgstr ""
1306
 
1307
  #: defaults.php:87
1308
  msgid ""
1309
+ "Opened the post %PostTitle% in the editor. View the post: %EditorLinkPost%."
 
1310
  msgstr ""
1311
 
1312
  #: defaults.php:88
1313
+ msgid "User viewed a post"
1314
  msgstr ""
1315
 
1316
  #: defaults.php:88
1317
+ msgid "Viewed the post %PostTitle%. View the post: %PostUrl%."
 
 
1318
  msgstr ""
1319
 
1320
  #: defaults.php:89
1321
+ msgid "User disabled Comments/Trackbacks and Pingbacks on a published post"
1322
  msgstr ""
1323
 
1324
  #: defaults.php:89
1325
  msgid ""
1326
+ "Disabled %Type% on the published post %PostTitle%. View the post: %PostUrl%."
 
1327
  msgstr ""
1328
 
1329
  #: defaults.php:90
1330
+ msgid "User enabled Comments/Trackbacks and Pingbacks on a published post"
1331
  msgstr ""
1332
 
1333
  #: defaults.php:90
1334
  msgid ""
1335
+ "Enabled %Type% on the published post %PostTitle%. View the post: %PostUrl%."
 
1336
  msgstr ""
1337
 
1338
  #: defaults.php:91
1339
+ msgid "User disabled Comments/Trackbacks and Pingbacks on a draft post"
1340
  msgstr ""
1341
 
1342
  #: defaults.php:91
1343
  msgid ""
1344
+ "Disabled %Type% on the draft post %PostTitle%. View the post: %PostUrl%."
 
1345
  msgstr ""
1346
 
1347
  #: defaults.php:92
1348
+ msgid "User enabled Comments/Trackbacks and Pingbacks on a draft post"
1349
  msgstr ""
1350
 
1351
  #: defaults.php:92
1352
+ msgid "Enabled %Type% on the draft post %PostTitle%. View the post: %PostUrl%."
 
 
1353
  msgstr ""
1354
 
1355
+ #: defaults.php:94
1356
+ msgid "Comments"
1357
  msgstr ""
1358
 
1359
+ #: defaults.php:95
1360
+ msgid "User approved a comment"
1361
  msgstr ""
1362
 
1363
  #: defaults.php:95
1364
+ msgid ""
1365
+ "Approved the comment posted in response to the post %PostTitle% by %Author% "
1366
+ "on %CommentLink%."
1367
  msgstr ""
1368
 
1369
  #: defaults.php:96
1370
+ msgid "User unapproved a comment"
1371
+ msgstr ""
1372
+
1373
+ #: defaults.php:96
1374
+ msgid ""
1375
+ "Unapproved the comment posted in response to the post %PostTitle% by %Author"
1376
+ "% on %CommentLink%."
1377
  msgstr ""
1378
 
1379
  #: defaults.php:97
1380
+ msgid "User replied to a comment"
1381
  msgstr ""
1382
 
1383
+ #: defaults.php:97
1384
+ msgid ""
1385
+ "Replied to the comment posted in response to the post %PostTitle% by %Author"
1386
+ "% on %CommentLink%."
1387
+ msgstr ""
1388
+
1389
+ #: defaults.php:98
1390
+ msgid "User edited a comment"
1391
+ msgstr ""
1392
+
1393
+ #: defaults.php:98
1394
+ msgid ""
1395
+ "Edited a comment posted in response to the post %PostTitle% by %Author% on "
1396
+ "%CommentLink%."
1397
  msgstr ""
1398
 
1399
  #: defaults.php:99
1400
+ msgid "User marked a comment as Spam"
1401
+ msgstr ""
1402
+
1403
+ #: defaults.php:99
1404
+ msgid ""
1405
+ "Marked the comment posted in response to the post %PostTitle% by %Author% on "
1406
+ "%CommentLink% as Spam."
1407
  msgstr ""
1408
 
1409
  #: defaults.php:100
1410
+ msgid "User marked a comment as Not Spam"
1411
+ msgstr ""
1412
+
1413
+ #: defaults.php:100
1414
+ msgid ""
1415
+ "Marked the comment posted in response to the post %PostTitle% by %Author% on "
1416
+ "%CommentLink% as Not Spam."
1417
+ msgstr ""
1418
+
1419
+ #: defaults.php:101
1420
+ msgid "User moved a comment to trash"
1421
+ msgstr ""
1422
+
1423
+ #: defaults.php:101
1424
+ msgid ""
1425
+ "Moved the comment posted in response to the post %PostTitle% by %Author% on "
1426
+ "%Date% to trash."
1427
+ msgstr ""
1428
+
1429
+ #: defaults.php:102
1430
+ msgid "User restored a comment from the trash"
1431
  msgstr ""
1432
 
1433
  #: defaults.php:102
1434
+ msgid ""
1435
+ "Restored the comment posted in response to the post %PostTitle% by %Author% "
1436
+ "on %CommentLink% from the trash."
1437
  msgstr ""
1438
 
1439
  #: defaults.php:103
1440
+ msgid "User permanently deleted a comment"
1441
  msgstr ""
1442
 
1443
  #: defaults.php:103
1444
  msgid ""
1445
+ "Permanently deleted the comment posted in response to the post %PostTitle% "
1446
+ "by %Author% on %Date%."
1447
+ msgstr ""
1448
+
1449
+ #: defaults.php:104
1450
+ msgid "User posted a comment"
1451
+ msgstr ""
1452
+
1453
+ #: defaults.php:104
1454
+ msgid "%CommentMsg% on %CommentLink%."
1455
+ msgstr ""
1456
+
1457
+ #: defaults.php:107
1458
+ msgid "User created a new post with custom post type and saved it as draft"
1459
+ msgstr ""
1460
+
1461
+ #: defaults.php:107
1462
+ msgid ""
1463
  "Created a new custom post called %PostTitle% of type %PostType%. "
1464
  "%EditorLinkPost%."
1465
  msgstr ""
1466
 
1467
+ #: defaults.php:108
1468
  msgid "User published a post with custom post type"
1469
  msgstr ""
1470
 
1471
+ #: defaults.php:108
1472
  msgid ""
1473
  "Published a custom post %PostTitle% of type %PostType%. Post URL is %PostUrl"
1474
  "%. %EditorLinkPost%."
1475
  msgstr ""
1476
 
1477
+ #: defaults.php:109
1478
  msgid "User modified a post with custom post type"
1479
  msgstr ""
1480
 
1481
+ #: defaults.php:109
1482
  msgid ""
1483
  "Modified the custom post %PostTitle% of type %PostType%. Post URL is %PostUrl"
1484
  "%. %EditorLinkPost%."
1485
  msgstr ""
1486
 
1487
+ #: defaults.php:110
1488
  msgid "User modified a draft post with custom post type"
1489
  msgstr ""
1490
 
1491
+ #: defaults.php:110
1492
  msgid ""
1493
  "Modified the draft custom post %PostTitle% of type is %PostType%. "
1494
  "%EditorLinkPost%."
1495
  msgstr ""
1496
 
1497
+ #: defaults.php:111
1498
  msgid "User permanently deleted post with custom post type"
1499
  msgstr ""
1500
 
1501
+ #: defaults.php:111
1502
+ msgid "Permanently Deleted the custom post %PostTitle% of type %PostType%."
 
 
1503
  msgstr ""
1504
 
1505
+ #: defaults.php:112
1506
  msgid "User moved post with custom post type to trash"
1507
  msgstr ""
1508
 
1509
+ #: defaults.php:112
1510
  msgid ""
1511
  "Moved the custom post %PostTitle% of type %PostType% to trash. Post URL was "
1512
  "%PostUrl%."
1513
  msgstr ""
1514
 
1515
+ #: defaults.php:113
1516
  msgid "User restored post with custom post type from trash"
1517
  msgstr ""
1518
 
1519
+ #: defaults.php:113
1520
  msgid ""
1521
  "The custom post %PostTitle% of type %PostType% has been restored from trash. "
1522
  "%EditorLinkPost%."
1523
  msgstr ""
1524
 
1525
+ #: defaults.php:114
1526
  msgid "User changed the category of a post with custom post type"
1527
  msgstr ""
1528
 
1529
+ #: defaults.php:114
1530
  msgid ""
1531
  "Changed the category(ies) of the custom post %PostTitle% of type %PostType% "
1532
  "from %OldCategories% to %NewCategories%. %EditorLinkPost%."
1533
  msgstr ""
1534
 
1535
+ #: defaults.php:115
1536
  msgid "User changed the URL of a post with custom post type"
1537
  msgstr ""
1538
 
1539
+ #: defaults.php:115
1540
  msgid ""
1541
  "Changed the URL of the custom post %PostTitle% of type %PostType% from "
1542
  "%OldUrl% to %NewUrl%. %EditorLinkPost%."
1543
  msgstr ""
1544
 
1545
+ #: defaults.php:116
1546
  msgid "User changed the author or post with custom post type"
1547
  msgstr ""
1548
 
1549
+ #: defaults.php:116
1550
  msgid ""
1551
  "Changed the author of custom post %PostTitle% of type %PostType% from "
1552
  "%OldAuthor% to %NewAuthor%. %EditorLinkPost%."
1553
  msgstr ""
1554
 
1555
+ #: defaults.php:117
1556
  msgid "User changed the status of post with custom post type"
1557
  msgstr ""
1558
 
1559
+ #: defaults.php:117
1560
  msgid ""
1561
  "Changed the status of custom post %PostTitle% of type %PostType% from "
1562
  "%OldStatus% to %NewStatus%. %EditorLinkPost%."
1563
  msgstr ""
1564
 
1565
+ #: defaults.php:118
1566
  msgid "User changed the visibility of a post with custom post type"
1567
  msgstr ""
1568
 
1569
+ #: defaults.php:118
1570
  msgid ""
1571
  "Changed the visibility of the custom post %PostTitle% of type %PostType% "
1572
  "from %OldVisibility% to %NewVisibility%. %EditorLinkPost%."
1573
  msgstr ""
1574
 
1575
+ #: defaults.php:119
1576
  msgid "User changed the date of post with custom post type"
1577
  msgstr ""
1578
 
1579
+ #: defaults.php:119
1580
  msgid ""
1581
  "Changed the date of the custom post %PostTitle% of type %PostType% from "
1582
  "%OldDate% to %NewDate%. %EditorLinkPost%."
1583
  msgstr ""
1584
 
1585
+ #: defaults.php:120
1586
  msgid "User created a custom field for a custom post type"
1587
  msgstr ""
1588
 
1589
+ #: defaults.php:120
1590
+ msgid ""
1591
+ "Created a new custom field %MetaKey% with value %MetaValue% in custom post "
1592
+ "%PostTitle% of type %PostType%. %EditorLinkPost%.<br>%MetaLink%."
 
 
 
 
 
 
1593
  msgstr ""
1594
 
1595
+ #: defaults.php:121
1596
+ msgid "User updated a custom field for a custom post type"
1597
  msgstr ""
1598
 
1599
  #: defaults.php:121
1600
+ msgid ""
1601
+ "Modified the value of the custom field %MetaKey% from %MetaValueOld% to "
1602
+ "%MetaValueNew% in custom post %PostTitle% of type %PostType% %EditorLinkPost"
1603
+ "%.<br>%MetaLink%."
1604
  msgstr ""
1605
 
1606
  #: defaults.php:122
1607
+ msgid "User deleted a custom field from a custom post type"
1608
  msgstr ""
1609
 
1610
  #: defaults.php:122
1611
  msgid ""
1612
+ "Deleted the custom field %MetaKey% with id %MetaID% from custom post "
1613
+ "%PostTitle% of type %PostType% %EditorLinkPost%.<br>%MetaLink%."
1614
  msgstr ""
1615
 
1616
  #: defaults.php:123
1617
+ msgid "User updated a custom field name for a custom post type"
1618
  msgstr ""
1619
 
1620
  #: defaults.php:123
1621
  msgid ""
1622
+ "Changed the custom field name from %MetaKeyOld% to %MetaKeyNew% in custom "
1623
+ "post %PostTitle% of type %PostType% %EditorLinkPost%.<br>%MetaLink%."
1624
+ msgstr ""
1625
+
1626
+ #: defaults.php:124
1627
+ msgid "User modified content for a published custom post type"
1628
+ msgstr ""
1629
+
1630
+ #: defaults.php:124
1631
+ msgid ""
1632
+ "Modified the content of the published custom post type %PostTitle%. Post URL "
1633
+ "is %PostUrl%.%EditorLinkPost%."
1634
  msgstr ""
1635
 
1636
  #: defaults.php:125
1637
+ msgid "User modified content for a draft custom post type"
1638
+ msgstr ""
1639
+
1640
+ #: defaults.php:125
1641
+ msgid ""
1642
+ "Modified the content of the draft custom post type %PostTitle%."
1643
+ "%EditorLinkPost%."
1644
  msgstr ""
1645
 
1646
  #: defaults.php:126
1647
+ msgid "User scheduled a custom post type"
1648
  msgstr ""
1649
 
1650
  #: defaults.php:126
1651
+ msgid ""
1652
+ "Scheduled the custom post type %PostTitle% to be published %PublishingDate%. "
1653
+ "%EditorLinkPost%."
1654
  msgstr ""
1655
 
1656
  #: defaults.php:127
1657
+ msgid "User changed title of a custom post type"
1658
  msgstr ""
1659
 
1660
  #: defaults.php:127
1661
+ msgid ""
1662
+ "Changed the title of the custom post %OldTitle% to %NewTitle%. "
1663
+ "%EditorLinkPost%."
1664
  msgstr ""
1665
 
1666
  #: defaults.php:128
1667
+ msgid "User opened a custom post type in the editor"
1668
  msgstr ""
1669
 
1670
  #: defaults.php:128
1671
+ msgid ""
1672
+ "Opened the custom post %PostTitle% of type %PostType% in the editor. View "
1673
+ "the post: %EditorLinkPost%."
1674
  msgstr ""
1675
 
1676
  #: defaults.php:129
1677
+ msgid "User viewed a custom post type"
1678
  msgstr ""
1679
 
1680
  #: defaults.php:129
1681
+ msgid ""
1682
+ "Viewed the custom post %PostTitle% of type %PostType%. View the post: "
1683
+ "%PostUrl%."
1684
  msgstr ""
1685
 
1686
+ #: defaults.php:131
1687
+ msgid "Pages"
1688
  msgstr ""
1689
 
1690
+ #: defaults.php:132
1691
+ msgid "User created a new WordPress page and saved it as draft"
1692
  msgstr ""
1693
 
1694
  #: defaults.php:132
1695
+ msgid ""
1696
+ "Created a new page called %PostTitle% and saved it as draft. %EditorLinkPage"
1697
+ "%."
1698
  msgstr ""
1699
 
1700
  #: defaults.php:133
1701
+ msgid "User published a WordPress page"
1702
  msgstr ""
1703
 
1704
  #: defaults.php:133
1705
  msgid ""
1706
+ "Published a page called %PostTitle%. Page URL is %PostUrl%. %EditorLinkPage%."
 
1707
  msgstr ""
1708
 
1709
  #: defaults.php:134
1710
+ msgid "User modified a published WordPress page"
1711
  msgstr ""
1712
 
1713
  #: defaults.php:134
1714
  msgid ""
1715
+ "Modified the published page %PostTitle%. Page URL is %PostUrl%. "
1716
+ "%EditorLinkPage%."
1717
  msgstr ""
1718
 
1719
  #: defaults.php:135
1720
+ msgid "User modified a draft WordPress page"
1721
  msgstr ""
1722
 
1723
  #: defaults.php:135
1724
  msgid ""
1725
+ "Modified the draft page %PostTitle%. Page ID is %PostID%. %EditorLinkPage%."
1726
  msgstr ""
1727
 
1728
  #: defaults.php:136
1729
+ msgid "User permanently deleted a page from the trash"
1730
  msgstr ""
1731
 
1732
  #: defaults.php:136
1733
+ msgid "Permanently deleted the page %PostTitle%."
1734
  msgstr ""
1735
 
1736
  #: defaults.php:137
1737
+ msgid "User moved WordPress page to the trash"
1738
  msgstr ""
1739
 
1740
  #: defaults.php:137
1741
+ msgid "Moved the page %PostTitle% to trash. Page URL was %PostUrl%."
 
 
1742
  msgstr ""
1743
 
1744
  #: defaults.php:138
1745
+ msgid "User restored a WordPress page from trash"
1746
  msgstr ""
1747
 
1748
  #: defaults.php:138
1749
+ msgid "Page %PostTitle% has been restored from trash. %EditorLinkPage%."
1750
  msgstr ""
1751
 
1752
  #: defaults.php:139
1753
+ msgid "User changed page URL"
1754
  msgstr ""
1755
 
1756
  #: defaults.php:139
1757
  msgid ""
1758
+ "Changed the URL of the page %PostTitle% from %OldUrl% to %NewUrl%. "
1759
+ "%EditorLinkPage%."
1760
  msgstr ""
1761
 
1762
  #: defaults.php:140
1763
+ msgid "User changed page author"
1764
  msgstr ""
1765
 
1766
  #: defaults.php:140
1767
  msgid ""
1768
+ "Changed the author of the page %PostTitle% from %OldAuthor% to %NewAuthor%. "
1769
+ "%EditorLinkPage%."
1770
+ msgstr ""
1771
+
1772
+ #: defaults.php:141
1773
+ msgid "User changed page status"
1774
+ msgstr ""
1775
+
1776
+ #: defaults.php:141
1777
+ msgid ""
1778
+ "Changed the status of the page %PostTitle% from %OldStatus% to %NewStatus%. "
1779
+ "%EditorLinkPage%."
1780
  msgstr ""
1781
 
1782
  #: defaults.php:142
1783
+ msgid "User changed the visibility of a page post"
1784
+ msgstr ""
1785
+
1786
+ #: defaults.php:142
1787
+ msgid ""
1788
+ "Changed the visibility of the page %PostTitle% from %OldVisibility% to "
1789
+ "%NewVisibility%. %EditorLinkPage%."
1790
  msgstr ""
1791
 
1792
  #: defaults.php:143
1793
+ msgid "User changed the date of a page post"
1794
  msgstr ""
1795
 
1796
  #: defaults.php:143
1797
+ msgid ""
1798
+ "Changed the date of the page %PostTitle% from %OldDate% to %NewDate%. "
1799
+ "%EditorLinkPage%."
1800
  msgstr ""
1801
 
1802
  #: defaults.php:144
1803
+ msgid "User changed the parent of a page"
1804
  msgstr ""
1805
 
1806
  #: defaults.php:144
1807
+ msgid ""
1808
+ "Changed the parent of the page %PostTitle% from %OldParentName% to "
1809
+ "%NewParentName%. %EditorLinkPage%."
1810
  msgstr ""
1811
 
1812
  #: defaults.php:145
1813
+ msgid "User changed the template of a page"
1814
  msgstr ""
1815
 
1816
  #: defaults.php:145
1817
+ msgid ""
1818
+ "Changed the template of the page %PostTitle% from %OldTemplate% to "
1819
+ "%NewTemplate%. %EditorLinkPage%."
1820
  msgstr ""
1821
 
1822
  #: defaults.php:146
1823
+ msgid "User created a custom field for a page"
1824
  msgstr ""
1825
 
1826
  #: defaults.php:146
1827
  msgid ""
1828
+ "Created a new custom field called %MetaKey% with value %MetaValue% in the "
1829
+ "page %PostTitle% %EditorLinkPage%.<br>%MetaLink%."
1830
  msgstr ""
1831
 
1832
  #: defaults.php:147
1833
+ msgid "User updated a custom field value for a page"
1834
  msgstr ""
1835
 
1836
  #: defaults.php:147
1837
+ msgid ""
1838
+ "Modified the value of the custom field %MetaKey% from %MetaValueOld% to "
1839
+ "%MetaValueNew% in the page %PostTitle% %EditorLinkPage%.<br>%MetaLink%."
1840
  msgstr ""
1841
 
1842
  #: defaults.php:148
1843
+ msgid "User deleted a custom field from a page"
1844
  msgstr ""
1845
 
1846
  #: defaults.php:148
1847
  msgid ""
1848
+ "Deleted the custom field %MetaKey% with id %MetaID% from page %PostTitle% "
1849
+ "%EditorLinkPage%.<br>%MetaLink%."
1850
  msgstr ""
1851
 
1852
  #: defaults.php:149
1853
+ msgid "User updated a custom field name for a page"
1854
  msgstr ""
1855
 
1856
  #: defaults.php:149
1857
  msgid ""
1858
+ "Changed the custom field name from %MetaKeyOld% to %MetaKeyNew% in the page "
1859
+ "%PostTitle% %EditorLinkPage%.<br>%MetaLink%."
1860
  msgstr ""
1861
 
1862
  #: defaults.php:150
1863
+ msgid "User modified content for a published page"
1864
  msgstr ""
1865
 
1866
  #: defaults.php:150
1867
  msgid ""
1868
+ "Modified the content of the published page %PostTitle%. Page URL is %PostUrl"
1869
+ "%.%RevisionLink% %EditorLinkPage%."
1870
  msgstr ""
1871
 
1872
  #: defaults.php:151
1873
+ msgid "User modified content for a draft page"
1874
  msgstr ""
1875
 
1876
  #: defaults.php:151
1877
+ msgid ""
1878
+ "Modified the content of draft page %PostTitle%.%RevisionLink% %EditorLinkPage"
1879
+ "%."
1880
  msgstr ""
1881
 
1882
  #: defaults.php:152
1883
+ msgid "User scheduled a page"
1884
  msgstr ""
1885
 
1886
  #: defaults.php:152
1887
+ msgid ""
1888
+ "Scheduled the page %PostTitle% to be published %PublishingDate%. "
1889
+ "%EditorLinkPage%."
1890
  msgstr ""
1891
 
1892
  #: defaults.php:153
1893
+ msgid "User changed title of a page"
1894
  msgstr ""
1895
 
1896
  #: defaults.php:153
1897
+ msgid ""
1898
+ "Changed the title of the page %OldTitle% to %NewTitle%. %EditorLinkPage%."
1899
  msgstr ""
1900
 
1901
  #: defaults.php:154
1902
+ msgid "User opened a page in the editor"
1903
  msgstr ""
1904
 
1905
  #: defaults.php:154
1906
+ msgid ""
1907
+ "Opened the page %PostTitle% in the editor. View the page: %EditorLinkPage%."
1908
  msgstr ""
1909
 
1910
  #: defaults.php:155
1911
+ msgid "User viewed a page"
1912
  msgstr ""
1913
 
1914
  #: defaults.php:155
1915
+ msgid "Viewed the page %PostTitle%. View the page: %PostUrl%."
1916
  msgstr ""
1917
 
1918
  #: defaults.php:156
1919
+ msgid "User disabled Comments/Trackbacks and Pingbacks on a published page"
1920
  msgstr ""
1921
 
1922
  #: defaults.php:156
1923
+ msgid ""
1924
+ "Disabled %Type% on the published page %PostTitle%. View the page: %PostUrl%."
1925
  msgstr ""
1926
 
1927
  #: defaults.php:157
1928
+ msgid "User enabled Comments/Trackbacks and Pingbacks on a published page"
1929
  msgstr ""
1930
 
1931
  #: defaults.php:157
1932
  msgid ""
1933
+ "Enabled %Type% on the published page %PostTitle%. View the page: %PostUrl%."
 
1934
  msgstr ""
1935
 
1936
  #: defaults.php:158
1937
+ msgid "User disabled Comments/Trackbacks and Pingbacks on a draft page"
1938
  msgstr ""
1939
 
1940
  #: defaults.php:158
1941
+ msgid ""
1942
+ "Disabled %Type% on the draft page %PostTitle%. View the page: %PostUrl%."
1943
  msgstr ""
1944
 
1945
  #: defaults.php:159
1946
+ msgid "User enabled Comments/Trackbacks and Pingbacks on a draft page"
1947
  msgstr ""
1948
 
1949
  #: defaults.php:159
1950
+ msgid "Enabled %Type% on the draft page %PostTitle%. View the page: %PostUrl%."
 
 
 
 
 
 
 
 
1951
  msgstr ""
1952
 
1953
  #: defaults.php:162
1954
+ msgid "WordPress & Multisite Management"
1955
  msgstr ""
1956
 
1957
  #: defaults.php:163
1958
+ msgid "Database"
1959
  msgstr ""
1960
 
1961
+ #: defaults.php:164
1962
+ msgid "Plugin created tables"
 
1963
  msgstr ""
1964
 
1965
  #: defaults.php:164
1966
+ msgid ""
1967
+ "Plugin %Plugin->Name% created these tables in the database: %TableNames%."
1968
  msgstr ""
1969
 
1970
  #: defaults.php:165
1971
+ msgid "Plugin modified tables structure"
1972
+ msgstr ""
1973
+
1974
+ #: defaults.php:165
1975
+ msgid ""
1976
+ "Plugin %Plugin->Name% modified the structure of these database tables: "
1977
+ "%TableNames%."
1978
  msgstr ""
1979
 
1980
  #: defaults.php:166
1981
+ msgid "Plugin deleted tables"
1982
+ msgstr ""
1983
+
1984
+ #: defaults.php:166
1985
+ msgid ""
1986
+ "Plugin %Plugin->Name% deleted the following tables from the database: "
1987
+ "%TableNames%."
1988
  msgstr ""
1989
 
1990
  #: defaults.php:167
1991
+ msgid "Theme created tables"
1992
+ msgstr ""
1993
+
1994
+ #: defaults.php:167
1995
+ msgid "Theme %Theme->Name% created these tables in the database: %TableNames%."
1996
  msgstr ""
1997
 
1998
  #: defaults.php:168
1999
+ msgid "Theme modified tables structure"
2000
  msgstr ""
2001
 
2002
  #: defaults.php:168
2003
+ msgid ""
2004
+ "Theme %Theme->Name% modified the structure of these database tables: "
2005
+ "%TableNames%."
2006
  msgstr ""
2007
 
2008
  #: defaults.php:169
2009
+ msgid "Theme deleted tables"
2010
  msgstr ""
2011
 
2012
  #: defaults.php:169
2013
+ msgid ""
2014
+ "Theme %Theme->Name% deleted the following tables from the database: "
2015
+ "%TableNames%."
2016
  msgstr ""
2017
 
2018
  #: defaults.php:170
2019
+ msgid "Unknown component created tables"
2020
  msgstr ""
2021
 
2022
  #: defaults.php:170
2023
+ msgid ""
2024
+ "An unknown component created these tables in the database: %TableNames%."
2025
  msgstr ""
2026
 
2027
  #: defaults.php:171
2028
+ msgid "Unknown component modified tables structure"
2029
  msgstr ""
2030
 
2031
  #: defaults.php:171
2032
  msgid ""
2033
+ "An unknown component modified the structure of these database tables: "
2034
+ "%TableNames%."
2035
  msgstr ""
2036
 
2037
  #: defaults.php:172
2038
+ msgid "Unknown component deleted tables"
2039
  msgstr ""
2040
 
2041
  #: defaults.php:172
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2042
  msgid ""
2043
+ "An unknown component deleted the following tables from the database: "
2044
+ "%TableNames%."
 
 
 
 
 
 
 
 
 
2045
  msgstr ""
2046
 
2047
+ #: defaults.php:174
2048
  msgid "MultiSite"
2049
  msgstr ""
2050
 
2051
+ #: defaults.php:175
2052
  msgid "User granted Super Admin privileges"
2053
  msgstr ""
2054
 
2055
+ #: defaults.php:175
2056
  msgid "Granted Super Admin privileges to %TargetUsername%."
2057
  msgstr ""
2058
 
2059
+ #: defaults.php:176
2060
  msgid "User revoked from Super Admin privileges"
2061
  msgstr ""
2062
 
2063
+ #: defaults.php:176
2064
  msgid "Revoked Super Admin privileges from %TargetUsername%."
2065
  msgstr ""
2066
 
2067
+ #: defaults.php:177
2068
  msgid "Existing user added to a site"
2069
  msgstr ""
2070
 
2071
+ #: defaults.php:177
2072
  msgid ""
2073
  "Added the existing user %TargetUsername% with %TargetUserRole% role to site "
2074
  "%SiteName%."
2075
  msgstr ""
2076
 
2077
+ #: defaults.php:178
2078
  msgid "User removed from site"
2079
  msgstr ""
2080
 
2081
+ #: defaults.php:178
2082
  msgid ""
2083
  "Removed the user %TargetUsername% with role %TargetUserRole% from %SiteName% "
2084
  "site."
2085
  msgstr ""
2086
 
2087
+ #: defaults.php:179
2088
  msgid "New network user created"
2089
  msgstr ""
2090
 
2091
+ #: defaults.php:179
2092
  msgid "Created a new network user %NewUserData->Username%."
2093
  msgstr ""
2094
 
2095
+ #: defaults.php:180
2096
  msgid "The forum role of a user was changed by another WordPress user"
2097
  msgstr ""
2098
 
2099
+ #: defaults.php:180
2100
  msgid ""
2101
  "Change the forum role of the user %TargetUsername% from %OldRole% to %NewRole"
2102
  "% by %UserChanger%."
2103
  msgstr ""
2104
 
2105
+ #: defaults.php:181
2106
  msgid "New site added on the network"
2107
  msgstr ""
2108
 
2109
+ #: defaults.php:181
2110
  msgid "Added the site %SiteName% to the network."
2111
  msgstr ""
2112
 
2113
+ #: defaults.php:182
2114
  msgid "Existing site archived"
2115
  msgstr ""
2116
 
2117
+ #: defaults.php:182
2118
  msgid "Archived the site %SiteName%."
2119
  msgstr ""
2120
 
2121
+ #: defaults.php:183
2122
  msgid "Archived site has been unarchived"
2123
  msgstr ""
2124
 
2125
+ #: defaults.php:183
2126
  msgid "Unarchived the site %SiteName%."
2127
  msgstr ""
2128
 
2129
+ #: defaults.php:184
2130
  msgid "Deactivated site has been activated"
2131
  msgstr ""
2132
 
2133
+ #: defaults.php:184
2134
  msgid "Activated the site %SiteName%."
2135
  msgstr ""
2136
 
2137
+ #: defaults.php:185
2138
  msgid "Site has been deactivated"
2139
  msgstr ""
2140
 
2141
+ #: defaults.php:185
2142
  msgid "Deactivated the site %SiteName%."
2143
  msgstr ""
2144
 
2145
+ #: defaults.php:186
2146
  msgid "Existing site deleted from network"
2147
  msgstr ""
2148
 
2149
+ #: defaults.php:186
2150
  msgid "Deleted the site %SiteName%."
2151
  msgstr ""
2152
 
2153
+ #: defaults.php:187
2154
  msgid "Activated theme on network"
2155
  msgstr ""
2156
 
2157
+ #: defaults.php:187
2158
  msgid ""
2159
  "Network activated the theme %Theme->Name% installed in %Theme-"
2160
  ">get_template_directory%."
2161
  msgstr ""
2162
 
2163
+ #: defaults.php:188
2164
  msgid "Deactivated theme from network"
2165
  msgstr ""
2166
 
2167
+ #: defaults.php:188
2168
  msgid ""
2169
  "Network deactivated the theme %Theme->Name% installed in %Theme-"
2170
  ">get_template_directory%."
2171
  msgstr ""
2172
 
2173
+ #: defaults.php:190
2174
+ msgid "Plugins & Themes"
2175
+ msgstr ""
2176
+
2177
+ #: defaults.php:191
2178
+ msgid "User installed a plugin"
2179
+ msgstr ""
2180
+
2181
+ #: defaults.php:191
2182
+ msgid "Installed the plugin %Plugin->Name% in %Plugin->plugin_dir_path%."
2183
+ msgstr ""
2184
+
2185
+ #: defaults.php:192
2186
+ msgid "User activated a WordPress plugin"
2187
+ msgstr ""
2188
+
2189
+ #: defaults.php:192
2190
+ msgid "Activated the plugin %PluginData->Name% installed in %PluginFile%."
2191
+ msgstr ""
2192
+
2193
  #: defaults.php:193
2194
+ msgid "User deactivated a WordPress plugin"
2195
+ msgstr ""
2196
+
2197
+ #: defaults.php:193
2198
+ msgid "Deactivated the plugin %PluginData->Name% installed in %PluginFile%."
2199
  msgstr ""
2200
 
2201
  #: defaults.php:194
2202
+ msgid "User uninstalled a plugin"
2203
  msgstr ""
2204
 
2205
  #: defaults.php:194
2206
  msgid ""
2207
+ "Uninstalled the plugin %PluginData->Name% which was installed in %PluginFile"
2208
+ "%."
2209
  msgstr ""
2210
 
2211
  #: defaults.php:195
2212
+ msgid "User upgraded a plugin"
2213
  msgstr ""
2214
 
2215
  #: defaults.php:195
2216
+ msgid "Upgraded the plugin %PluginData->Name% installed in %PluginFile%."
 
 
2217
  msgstr ""
2218
 
2219
  #: defaults.php:196
2220
+ msgid "User installed a theme"
2221
  msgstr ""
2222
 
2223
  #: defaults.php:196
2224
  msgid ""
2225
+ "Installed the theme \"%Theme->Name%\" in %Theme->get_template_directory%."
 
2226
  msgstr ""
2227
 
2228
  #: defaults.php:197
2229
+ msgid "User activated a theme"
2230
  msgstr ""
2231
 
2232
  #: defaults.php:197
2233
+ msgid ""
2234
+ "Activated the theme \"%Theme->Name%\", installed in %Theme-"
2235
+ ">get_template_directory%."
2236
  msgstr ""
2237
 
2238
  #: defaults.php:198
2239
+ msgid "User uninstalled a theme"
2240
  msgstr ""
2241
 
2242
  #: defaults.php:198
2243
  msgid ""
2244
+ "Deleted the theme \"%Theme->Name%\" installed in %Theme-"
2245
+ ">get_template_directory%."
2246
  msgstr ""
2247
 
2248
  #: defaults.php:199
2249
+ msgid "A plugin created a post"
2250
  msgstr ""
2251
 
2252
  #: defaults.php:199
2253
+ msgid "A plugin automatically created the following post: %PostTitle%."
 
 
2254
  msgstr ""
2255
 
2256
  #: defaults.php:200
2257
+ msgid "A plugin created a page"
2258
  msgstr ""
2259
 
2260
  #: defaults.php:200
2261
+ msgid "A plugin automatically created the following page: %PostTitle%."
 
2262
  msgstr ""
2263
 
2264
  #: defaults.php:201
2265
+ msgid "A plugin created a custom post"
2266
  msgstr ""
2267
 
2268
  #: defaults.php:201
2269
+ msgid "A plugin automatically created the following custom post: %PostTitle%."
 
 
2270
  msgstr ""
2271
 
2272
  #: defaults.php:202
2273
+ msgid "A plugin deleted a post"
2274
  msgstr ""
2275
 
2276
  #: defaults.php:202
2277
+ msgid "A plugin automatically deleted the following post: %PostTitle%."
2278
+ msgstr ""
2279
+
2280
+ #: defaults.php:203
2281
+ msgid "A plugin deleted a page"
2282
+ msgstr ""
2283
+
2284
+ #: defaults.php:203
2285
+ msgid "A plugin automatically deleted the following page: %PostTitle%."
2286
  msgstr ""
2287
 
2288
  #: defaults.php:204
2289
+ msgid "A plugin deleted a custom post"
2290
+ msgstr ""
2291
+
2292
+ #: defaults.php:204
2293
+ msgid "A plugin automatically deleted the following custom post: %PostTitle%."
2294
  msgstr ""
2295
 
2296
  #: defaults.php:205
2297
+ msgid "User updated a theme"
2298
+ msgstr ""
2299
+
2300
+ #: defaults.php:205
2301
+ msgid ""
2302
+ "Updated the theme \"%Theme->Name%\" installed in %Theme-"
2303
+ ">get_template_directory%."
2304
  msgstr ""
2305
 
2306
  #: defaults.php:206
2307
+ msgid "User changed a file using the theme editor"
2308
+ msgstr ""
2309
+
2310
+ #: defaults.php:206
2311
+ msgid "Modified %File% with the Theme Editor."
2312
  msgstr ""
2313
 
2314
  #: defaults.php:207
2315
+ msgid "User changed a file using the plugin editor"
2316
+ msgstr ""
2317
+
2318
+ #: defaults.php:207
2319
+ msgid "Modified %File% with the Plugin Editor."
2320
  msgstr ""
2321
 
2322
  #: defaults.php:208
2323
+ msgid "A plugin modified a post"
2324
  msgstr ""
2325
 
2326
+ #: defaults.php:208
2327
+ msgid "Plugin modified the post %PostTitle%. View the post: %EditorLinkPost%."
2328
  msgstr ""
2329
 
2330
+ #: defaults.php:209
2331
+ msgid "A plugin modified a page"
2332
  msgstr ""
2333
 
2334
+ #: defaults.php:209
2335
+ msgid "Plugin modified the page %PostTitle%. View the page: %EditorLinkPage%."
2336
  msgstr ""
2337
 
2338
+ #: defaults.php:210
2339
+ msgid "A plugin modified a custom post"
2340
  msgstr ""
2341
 
2342
+ #: defaults.php:210
2343
+ msgid ""
2344
+ "Plugin modified the custom post %PostTitle%. View the post: %EditorLinkPost%."
2345
  msgstr ""
2346
 
2347
  #: defaults.php:212
2348
+ msgid "System Activity"
2349
  msgstr ""
2350
 
2351
  #: defaults.php:213
2352
+ msgid "Unknown Error"
2353
  msgstr ""
2354
 
2355
+ #: defaults.php:213
2356
+ msgid "An unexpected error has occurred ."
2357
  msgstr ""
2358
 
2359
  #: defaults.php:214
2360
+ msgid "PHP error"
2361
  msgstr ""
2362
 
2363
+ #: defaults.php:214 defaults.php:215 defaults.php:216 defaults.php:217
2364
+ #: defaults.php:218
2365
+ msgid "%Message%."
2366
  msgstr ""
2367
 
2368
  #: defaults.php:215
2369
+ msgid "PHP warning"
2370
  msgstr ""
2371
 
2372
  #: defaults.php:216
2373
+ msgid "PHP notice"
 
 
 
 
2374
  msgstr ""
2375
 
2376
  #: defaults.php:217
2377
+ msgid "PHP exception"
 
 
2378
  msgstr ""
2379
 
2380
  #: defaults.php:218
2381
+ msgid "PHP shutdown error"
2382
  msgstr ""
2383
 
2384
+ #: defaults.php:219
2385
+ msgid "Events automatically pruned by system"
 
 
2386
  msgstr ""
2387
 
2388
  #: defaults.php:219
2389
+ msgid "System automatically deleted %EventCount% alert(s)."
2390
  msgstr ""
2391
 
2392
  #: defaults.php:220
2393
+ msgid "Option Anyone Can Register in WordPress settings changed"
2394
+ msgstr ""
2395
+
2396
+ #: defaults.php:220
2397
+ msgid "%NewValue% the option \"Anyone can register\"."
2398
  msgstr ""
2399
 
2400
  #: defaults.php:221
2401
+ msgid "New User Default Role changed"
2402
+ msgstr ""
2403
+
2404
+ #: defaults.php:221
2405
+ msgid "Changed the New User Default Role from %OldRole% to %NewRole%."
2406
  msgstr ""
2407
 
2408
  #: defaults.php:222
2409
+ msgid "WordPress Administrator Notification email changed"
2410
  msgstr ""
2411
 
2412
  #: defaults.php:222
2413
+ msgid ""
2414
+ "Changed the WordPress administrator notifications email address from "
2415
+ "%OldEmail% to %NewEmail%."
2416
  msgstr ""
2417
 
2418
  #: defaults.php:223
2419
+ msgid "WordPress was updated"
2420
+ msgstr ""
2421
+
2422
+ #: defaults.php:223
2423
+ msgid "Updated WordPress from version %OldVersion% to %NewVersion%."
2424
  msgstr ""
2425
 
2426
  #: defaults.php:224
2427
+ msgid "User changes the WordPress Permalinks"
2428
  msgstr ""
2429
 
2430
  #: defaults.php:224
2431
+ msgid "Changed the WordPress permalinks from %OldPattern% to %NewPattern%."
2432
  msgstr ""
2433
 
2434
  #: defaults.php:225
2435
+ msgid "User requests non-existing pages (404 Error Pages)"
2436
  msgstr ""
2437
 
2438
  #: defaults.php:225
2439
+ msgid ""
2440
+ "Has requested a non existing page (404 Error Pages) %Attempts% %Msg%. "
2441
+ "%LinkFile%."
2442
  msgstr ""
2443
 
2444
  #: defaults.php:226
2445
+ msgid "Website Visitor User requests non-existing pages (404 Error Pages)"
2446
+ msgstr ""
2447
+
2448
+ #: defaults.php:226
2449
+ msgid ""
2450
+ "Website Visitor Has requested a non existing page (404 Error Pages) %Attempts"
2451
+ "% %Msg%. %LinkFile%."
2452
  msgstr ""
2453
 
2454
  #: defaults.php:227
2455
+ msgid "Advertising Add-ons."
2456
+ msgstr ""
2457
+
2458
+ #: defaults.php:227
2459
+ msgid "%PromoName% %PromoMessage%"
2460
  msgstr ""
2461
 
2462
  #: defaults.php:229
2537
  msgstr ""
2538
 
2539
  #: defaults.php:240
2540
+ msgid "Widgets"
2541
  msgstr ""
2542
 
2543
  #: defaults.php:241
2544
+ msgid "User added a new widget"
2545
  msgstr ""
2546
 
2547
  #: defaults.php:241
2548
+ msgid "Added a new %WidgetName% widget in %Sidebar%."
 
 
2549
  msgstr ""
2550
 
2551
  #: defaults.php:242
2552
+ msgid "User modified a widget"
2553
  msgstr ""
2554
 
2555
  #: defaults.php:242
2556
+ msgid "Modified the %WidgetName% widget in %Sidebar%."
 
 
2557
  msgstr ""
2558
 
2559
  #: defaults.php:243
2560
+ msgid "User deleted widget"
2561
  msgstr ""
2562
 
2563
  #: defaults.php:243
2564
+ msgid "Deleted the %WidgetName% widget from %Sidebar%."
 
 
2565
  msgstr ""
2566
 
2567
  #: defaults.php:244
2568
+ msgid "User moved widget"
2569
  msgstr ""
2570
 
2571
  #: defaults.php:244
2572
+ msgid "Moved the %WidgetName% widget from %OldSidebar% to %NewSidebar%."
 
 
2573
  msgstr ""
2574
 
2575
  #: defaults.php:245
2576
+ msgid "User changed widget position"
2577
  msgstr ""
2578
 
2579
  #: defaults.php:245
2580
+ msgid "Changed the position of the widget %WidgetName% in sidebar %Sidebar%."
 
 
2581
  msgstr ""
2582
 
2583
+ #: defaults.php:247
2584
+ msgid "Site Settings"
2585
  msgstr ""
2586
 
2587
+ #: defaults.php:248
2588
  msgid ""
2589
+ "Enabled/Disabled the option Discourage search engines from indexing this site"
 
2590
  msgstr ""
2591
 
2592
+ #: defaults.php:248
2593
+ msgid "%Status% the option Discourage search engines from indexing this site."
2594
  msgstr ""
2595
 
2596
+ #: defaults.php:249
2597
+ msgid "Enabled/Disabled comments on all the website"
 
 
2598
  msgstr ""
2599
 
2600
+ #: defaults.php:249
2601
+ msgid "%Status% comments on all the website."
2602
  msgstr ""
2603
 
2604
+ #: defaults.php:250
2605
+ msgid "Enabled/Disabled the option Comment author must fill out name and email"
 
 
2606
  msgstr ""
2607
 
2608
+ #: defaults.php:250
2609
+ msgid "%Status% the option Comment author must fill out name and email."
2610
  msgstr ""
2611
 
2612
+ #: defaults.php:251
2613
  msgid ""
2614
+ "Enabled/Disabled the option Users must be logged in and registered to comment"
 
2615
  msgstr ""
2616
 
2617
+ #: defaults.php:251
2618
+ msgid "%Status% the option Users must be logged in and registered to comment."
2619
  msgstr ""
2620
 
2621
+ #: defaults.php:252
2622
+ msgid "Enabled/Disabled the option to automatically close comments"
2623
  msgstr ""
2624
 
2625
  #: defaults.php:252
2626
+ msgid "%Status% the option to automatically close comments after %Value% days."
2627
+ msgstr ""
2628
+
2629
+ #: defaults.php:253
2630
+ msgid "Changed the value of the option Automatically close comments"
2631
  msgstr ""
2632
 
2633
  #: defaults.php:253
2634
+ msgid ""
2635
+ "Changed the value of the option Automatically close comments from %OldValue% "
2636
+ "to %NewValue% days."
2637
  msgstr ""
2638
 
2639
+ #: defaults.php:254
2640
+ msgid "Enabled/Disabled the option for comments to be manually approved"
2641
  msgstr ""
2642
 
2643
  #: defaults.php:254
2644
+ msgid "%Status% the option for comments to be manually approved."
2645
+ msgstr ""
2646
+
2647
+ #: defaults.php:255
2648
+ msgid ""
2649
+ "Enabled/Disabled the option for an author to have previously approved "
2650
+ "comments for the comments to appear"
2651
  msgstr ""
2652
 
2653
  #: defaults.php:255
2654
+ msgid ""
2655
+ "%Status% the option for an author to have previously approved comments for "
2656
+ "the comments to appear."
2657
+ msgstr ""
2658
+
2659
+ #: defaults.php:256
2660
+ msgid ""
2661
+ "Changed the number of links that a comment must have to be held in the queue"
2662
+ msgstr ""
2663
+
2664
+ #: defaults.php:256
2665
+ msgid ""
2666
+ "Changed the number of links from %OldValue% to %NewValue% that a comment "
2667
+ "must have to be held in the queue."
2668
+ msgstr ""
2669
+
2670
+ #: defaults.php:257
2671
+ msgid "Modified the list of keywords for comments moderation"
2672
+ msgstr ""
2673
+
2674
+ #: defaults.php:257
2675
+ msgid "Modified the list of keywords for comments moderation."
2676
+ msgstr ""
2677
+
2678
+ #: defaults.php:258
2679
+ msgid "Modified the list of keywords for comments blacklisting"
2680
+ msgstr ""
2681
+
2682
+ #: defaults.php:258
2683
+ msgid "Modified the list of keywords for comments blacklisting."
2684
+ msgstr ""
2685
+
2686
+ #: defaults.php:261
2687
+ msgid "Users Profiles & Activity"
2688
+ msgstr ""
2689
+
2690
+ #: defaults.php:262
2691
+ msgid "Other User Activity"
2692
+ msgstr ""
2693
+
2694
+ #: defaults.php:263
2695
+ msgid "User logged in"
2696
+ msgstr ""
2697
+
2698
+ #: defaults.php:263
2699
+ msgid "Successfully logged in."
2700
+ msgstr ""
2701
+
2702
+ #: defaults.php:264
2703
+ msgid "User logged out"
2704
+ msgstr ""
2705
+
2706
+ #: defaults.php:264
2707
+ msgid "Successfully logged out."
2708
+ msgstr ""
2709
+
2710
+ #: defaults.php:265
2711
+ msgid "Login failed"
2712
+ msgstr ""
2713
+
2714
+ #: defaults.php:265
2715
+ msgid "%Attempts% failed login(s) detected."
2716
+ msgstr ""
2717
+
2718
+ #: defaults.php:266
2719
+ msgid "Login failed / non existing user"
2720
+ msgstr ""
2721
+
2722
+ #: defaults.php:266
2723
+ msgid "%Attempts% failed login(s) detected using non existing user."
2724
+ msgstr ""
2725
+
2726
+ #: defaults.php:267
2727
+ msgid "Login blocked"
2728
+ msgstr ""
2729
+
2730
+ #: defaults.php:267
2731
+ msgid ""
2732
+ "Blocked from logging in because the same WordPress user is logged in from "
2733
+ "%ClientIP%."
2734
+ msgstr ""
2735
+
2736
+ #: defaults.php:268
2737
+ msgid "User logged in with existing session(s)"
2738
+ msgstr ""
2739
+
2740
+ #: defaults.php:268
2741
+ msgid ""
2742
+ "Successfully logged in. Another session from %IPAddress% for this user "
2743
+ "already exist."
2744
+ msgstr ""
2745
+
2746
+ #: defaults.php:269
2747
+ msgid "User logged out all other sessions with the same username"
2748
+ msgstr ""
2749
+
2750
+ #: defaults.php:269
2751
+ msgid "Logged out all other sessions with the same username."
2752
+ msgstr ""
2753
+
2754
+ #: defaults.php:270
2755
+ msgid "User session destroyed and logged out."
2756
+ msgstr ""
2757
+
2758
+ #: defaults.php:270
2759
+ msgid "Logged out session %TargetSessionID% which belonged to %TargetUserName%"
2760
+ msgstr ""
2761
+
2762
+ #: defaults.php:271
2763
+ msgid "User uploaded file from Uploads directory"
2764
+ msgstr ""
2765
+
2766
+ #: defaults.php:271
2767
+ msgid "Uploaded the file %FileName% in %FilePath%."
2768
+ msgstr ""
2769
+
2770
+ #: defaults.php:272
2771
+ msgid "User deleted file from Uploads directory"
2772
+ msgstr ""
2773
+
2774
+ #: defaults.php:272
2775
+ msgid "Deleted the file %FileName% from %FilePath%."
2776
+ msgstr ""
2777
+
2778
+ #: defaults.php:274
2779
+ msgid "User Profiles"
2780
+ msgstr ""
2781
+
2782
+ #: defaults.php:275
2783
+ msgid "New user was created on WordPress"
2784
+ msgstr ""
2785
+
2786
+ #: defaults.php:275
2787
+ msgid ""
2788
+ "A new user %NewUserData->Username% was created with role of %NewUserData-"
2789
+ ">Roles%."
2790
+ msgstr ""
2791
+
2792
+ #: defaults.php:276
2793
+ msgid "User created another WordPress user"
2794
+ msgstr ""
2795
+
2796
+ #: defaults.php:276
2797
+ msgid ""
2798
+ "%UserChanger% created a new user %NewUserData->Username% with the role of "
2799
+ "%NewUserData->Roles%."
2800
+ msgstr ""
2801
+
2802
+ #: defaults.php:277
2803
+ msgid "The role of a user was changed by another WordPress user"
2804
+ msgstr ""
2805
+
2806
+ #: defaults.php:277
2807
+ msgid ""
2808
+ "Changed the role of the user %TargetUsername% from %OldRole% to %NewRole%."
2809
+ msgstr ""
2810
+
2811
+ #: defaults.php:278
2812
+ msgid "User has changed his or her password"
2813
+ msgstr ""
2814
+
2815
+ #: defaults.php:278
2816
+ msgid "Changed the password."
2817
+ msgstr ""
2818
+
2819
+ #: defaults.php:279
2820
+ msgid "User changed another user's password"
2821
+ msgstr ""
2822
+
2823
+ #: defaults.php:279
2824
+ msgid ""
2825
+ "Changed the password for the user %TargetUserData->Username% with the role "
2826
+ "of %TargetUserData->Roles%."
2827
+ msgstr ""
2828
+
2829
+ #: defaults.php:280
2830
+ msgid "User changed his or her email address"
2831
+ msgstr ""
2832
+
2833
+ #: defaults.php:280
2834
+ msgid "Changed the email address from %OldEmail% to %NewEmail%."
2835
+ msgstr ""
2836
+
2837
+ #: defaults.php:281
2838
+ msgid "User changed another user's email address"
2839
+ msgstr ""
2840
+
2841
+ #: defaults.php:281
2842
+ msgid ""
2843
+ "Changed the email address of the user %TargetUsername% from %OldEmail% to "
2844
+ "%NewEmail%."
2845
+ msgstr ""
2846
+
2847
+ #: defaults.php:282
2848
+ msgid "User was deleted by another user"
2849
+ msgstr ""
2850
+
2851
+ #: defaults.php:282
2852
+ msgid ""
2853
+ "Deleted the user %TargetUserData->Username% with the role of %TargetUserData-"
2854
+ ">Roles%."
2855
+ msgstr ""
2856
+
2857
+ #: defaults.php:283
2858
+ msgid "User opened the profile page of another user"
2859
+ msgstr ""
2860
+
2861
+ #: defaults.php:283
2862
+ msgid "%UserChanger% opened the profile page of the user %TargetUsername%."
2863
+ msgstr ""
2864
+
2865
+ #: defaults.php:284
2866
+ msgid "User updated a custom field value for a user"
2867
+ msgstr ""
2868
+
2869
+ #: defaults.php:284
2870
+ msgid ""
2871
+ "Changed the value of the custom field %custom_field_name% from %old_value% "
2872
+ "to %new_value% for the user %TargetUsername%."
2873
+ msgstr ""
2874
+
2875
+ #: defaults.php:285
2876
+ msgid "User created a custom field value for a user"
2877
+ msgstr ""
2878
+
2879
+ #: defaults.php:285
2880
+ msgid ""
2881
+ "Created the value of the custom field %custom_field_name% with %new_value% "
2882
+ "for the user %TargetUsername%."
2883
+ msgstr ""
2884
+
2885
+ #: defaults.php:288
2886
+ msgid "Third Party Support"
2887
+ msgstr ""
2888
+
2889
+ #: defaults.php:289
2890
+ msgid "BBPress Forum"
2891
+ msgstr ""
2892
+
2893
+ #: defaults.php:290
2894
+ msgid "User created new forum"
2895
+ msgstr ""
2896
+
2897
+ #: defaults.php:290
2898
+ msgid ""
2899
+ "Created new forum %ForumName%. Forum URL is %ForumURL%. %EditorLinkForum%."
2900
+ msgstr ""
2901
+
2902
+ #: defaults.php:291
2903
+ msgid "User changed status of a forum"
2904
+ msgstr ""
2905
+
2906
+ #: defaults.php:291
2907
+ msgid ""
2908
+ "Changed the status of the forum %ForumName% from %OldStatus% to %NewStatus%. "
2909
+ "%EditorLinkForum%."
2910
+ msgstr ""
2911
+
2912
+ #: defaults.php:292
2913
+ msgid "User changed visibility of a forum"
2914
+ msgstr ""
2915
+
2916
+ #: defaults.php:292
2917
+ msgid ""
2918
+ "Changed the visibility of the forum %ForumName% from %OldVisibility% to "
2919
+ "%NewVisibility%. %EditorLinkForum%."
2920
+ msgstr ""
2921
+
2922
+ #: defaults.php:293
2923
+ msgid "User changed the URL of a forum"
2924
+ msgstr ""
2925
+
2926
+ #: defaults.php:293
2927
+ msgid ""
2928
+ "Changed the URL of the forum %ForumName% from %OldUrl% to %NewUrl%. "
2929
+ "%EditorLinkForum%."
2930
+ msgstr ""
2931
+
2932
+ #: defaults.php:294
2933
+ msgid "User changed order of a forum"
2934
+ msgstr ""
2935
+
2936
+ #: defaults.php:294
2937
+ msgid ""
2938
+ "Changed the order of the forum %ForumName% from %OldOrder% to %NewOrder%. "
2939
+ "%EditorLinkForum%."
2940
+ msgstr ""
2941
+
2942
+ #: defaults.php:295
2943
+ msgid "User moved forum to trash"
2944
+ msgstr ""
2945
+
2946
+ #: defaults.php:295
2947
+ msgid "Moved the forum %ForumName% to trash."
2948
+ msgstr ""
2949
+
2950
+ #: defaults.php:296
2951
+ msgid "User permanently deleted forum"
2952
+ msgstr ""
2953
+
2954
+ #: defaults.php:296
2955
+ msgid "Permanently deleted the forum %ForumName%."
2956
+ msgstr ""
2957
+
2958
+ #: defaults.php:297
2959
+ msgid "User restored forum from trash"
2960
+ msgstr ""
2961
+
2962
+ #: defaults.php:297
2963
+ msgid "Restored the forum %ForumName% from trash. %EditorLinkForum%."
2964
+ msgstr ""
2965
+
2966
+ #: defaults.php:298
2967
+ msgid "User changed the parent of a forum"
2968
+ msgstr ""
2969
+
2970
+ #: defaults.php:298
2971
+ msgid ""
2972
+ "Changed the parent of the forum %ForumName% from %OldParent% to %NewParent%. "
2973
+ "%EditorLinkForum%."
2974
+ msgstr ""
2975
+
2976
+ #: defaults.php:299
2977
+ msgid "User changed forum's role"
2978
+ msgstr ""
2979
+
2980
+ #: defaults.php:299
2981
+ msgid "Changed the forum's auto role from %OldRole% to %NewRole%."
2982
+ msgstr ""
2983
+
2984
+ #: defaults.php:300
2985
+ msgid "User changed option of a forum"
2986
+ msgstr ""
2987
+
2988
+ #: defaults.php:300
2989
+ msgid "%Status% the option for anonymous posting on forum."
2990
+ msgstr ""
2991
+
2992
+ #: defaults.php:301
2993
+ msgid "User changed type of a forum"
2994
+ msgstr ""
2995
+
2996
+ #: defaults.php:301
2997
+ msgid ""
2998
+ "Changed the type of the forum %ForumName% from %OldType% to %NewType%. "
2999
+ "%EditorLinkForum%."
3000
+ msgstr ""
3001
+
3002
+ #: defaults.php:302
3003
+ msgid "User changed time to disallow post editing"
3004
+ msgstr ""
3005
+
3006
+ #: defaults.php:302
3007
+ msgid ""
3008
+ "Changed the time to disallow post editing from %OldTime% to %NewTime% "
3009
+ "minutes in the forums."
3010
+ msgstr ""
3011
+
3012
+ #: defaults.php:303
3013
+ msgid "User changed the forum setting posting throttle time"
3014
+ msgstr ""
3015
+
3016
+ #: defaults.php:303
3017
+ msgid ""
3018
+ "Changed the posting throttle time from %OldTime% to %NewTime% seconds in the "
3019
+ "forums."
3020
+ msgstr ""
3021
+
3022
+ #: defaults.php:304
3023
+ msgid "User created new topic"
3024
+ msgstr ""
3025
+
3026
+ #: defaults.php:304
3027
+ msgid "Created a new topic %TopicName%. %EditorLinkTopic%."
3028
+ msgstr ""
3029
+
3030
+ #: defaults.php:305
3031
+ msgid "User changed status of a topic"
3032
+ msgstr ""
3033
+
3034
+ #: defaults.php:305
3035
+ msgid ""
3036
+ "Changed the status of the topic %TopicName% from %OldStatus% to %NewStatus%. "
3037
+ "%EditorLinkTopic%."
3038
+ msgstr ""
3039
+
3040
+ #: defaults.php:306
3041
+ msgid "User changed type of a topic"
3042
+ msgstr ""
3043
+
3044
+ #: defaults.php:306
3045
+ msgid ""
3046
+ "Changed the type of the topic %TopicName% from %OldType% to %NewType%. "
3047
+ "%EditorLinkTopic%."
3048
+ msgstr ""
3049
+
3050
+ #: defaults.php:307
3051
+ msgid "User changed URL of a topic"
3052
+ msgstr ""
3053
+
3054
+ #: defaults.php:307
3055
+ msgid "Changed the URL of the topic %TopicName% from %OldUrl% to %NewUrl%."
3056
+ msgstr ""
3057
+
3058
+ #: defaults.php:308
3059
+ msgid "User changed the forum of a topic"
3060
+ msgstr ""
3061
+
3062
+ #: defaults.php:308
3063
+ msgid ""
3064
+ "Changed the forum of the topic %TopicName% from %OldForum% to %NewForum%. "
3065
+ "%EditorLinkTopic%."
3066
+ msgstr ""
3067
+
3068
+ #: defaults.php:309
3069
+ msgid "User moved topic to trash"
3070
+ msgstr ""
3071
+
3072
+ #: defaults.php:309
3073
+ msgid "Moved the topic %TopicName% to trash."
3074
+ msgstr ""
3075
+
3076
+ #: defaults.php:310
3077
+ msgid "User permanently deleted topic"
3078
+ msgstr ""
3079
+
3080
+ #: defaults.php:310
3081
+ msgid "Permanently deleted the topic %TopicName%."
3082
+ msgstr ""
3083
+
3084
+ #: defaults.php:311
3085
+ msgid "User restored topic from trash"
3086
+ msgstr ""
3087
+
3088
+ #: defaults.php:311
3089
+ msgid "Restored the topic %TopicName% from trash. %EditorLinkTopic%."
3090
+ msgstr ""
3091
+
3092
+ #: defaults.php:312
3093
+ msgid "User changed visibility of a topic"
3094
+ msgstr ""
3095
+
3096
+ #: defaults.php:312
3097
+ msgid ""
3098
+ "Changed the visibility of the topic %TopicName% from %OldVisibility% to "
3099
+ "%NewVisibility%. %EditorLinkTopic%."
3100
+ msgstr ""
3101
+
3102
+ #: defaults.php:314
3103
+ msgid "WooCommerce"
3104
+ msgstr ""
3105
+
3106
+ #: defaults.php:315
3107
+ msgid "User created a new product"
3108
+ msgstr ""
3109
+
3110
+ #: defaults.php:315
3111
+ msgid ""
3112
+ "Created a new product called %ProductTitle% and saved it as draft. View the "
3113
+ "product: %EditorLinkProduct%."
3114
+ msgstr ""
3115
+
3116
+ #: defaults.php:316
3117
+ msgid "User published a product"
3118
+ msgstr ""
3119
+
3120
+ #: defaults.php:316
3121
+ msgid ""
3122
+ "Published a product called %ProductTitle%. Product URL is %ProductUrl%. View "
3123
+ "the product: %EditorLinkProduct%."
3124
+ msgstr ""
3125
+
3126
+ #: defaults.php:317
3127
+ msgid "User created a new product category"
3128
+ msgstr ""
3129
+
3130
+ #: defaults.php:317
3131
+ msgid ""
3132
+ "Created a new product category called %CategoryName% in WooCommerce. Product "
3133
+ "category slug is %Slug%."
3134
+ msgstr ""
3135
+
3136
+ #: defaults.php:318
3137
+ msgid "User changed the category of a product"
3138
+ msgstr ""
3139
+
3140
+ #: defaults.php:318
3141
+ msgid ""
3142
+ "Changed the category of the product %ProductTitle% from %OldCategories% to "
3143
+ "%NewCategories%. View the product: %EditorLinkProduct%."
3144
+ msgstr ""
3145
+
3146
+ #: defaults.php:319
3147
+ msgid "User modified the short description of a product"
3148
+ msgstr ""
3149
+
3150
+ #: defaults.php:319
3151
+ msgid ""
3152
+ "Modified the short description of the product %ProductTitle%. View the "
3153
+ "product: %EditorLinkProduct%."
3154
+ msgstr ""
3155
+
3156
+ #: defaults.php:320
3157
+ msgid "User modified the text of a product"
3158
+ msgstr ""
3159
+
3160
+ #: defaults.php:320
3161
+ msgid ""
3162
+ "Modified the text of the product %ProductTitle%. View the product: "
3163
+ "%EditorLinkProduct%."
3164
+ msgstr ""
3165
+
3166
+ #: defaults.php:321
3167
+ msgid "User changed the URL of a product"
3168
+ msgstr ""
3169
+
3170
+ #: defaults.php:321
3171
+ msgid ""
3172
+ "Changed the URL of the product %ProductTitle% from %OldUrl% to %NewUrl%. "
3173
+ "View the product: %EditorLinkProduct%."
3174
+ msgstr ""
3175
+
3176
+ #: defaults.php:322
3177
+ msgid "User changed the Product Data of a product"
3178
+ msgstr ""
3179
+
3180
+ #: defaults.php:322
3181
+ msgid ""
3182
+ "Changed the Product Data of the product %ProductTitle%. View the product: "
3183
+ "%EditorLinkProduct%."
3184
+ msgstr ""
3185
+
3186
+ #: defaults.php:323
3187
+ msgid "User changed the date of a product"
3188
+ msgstr ""
3189
+
3190
+ #: defaults.php:323
3191
+ msgid ""
3192
+ "Changed the date of the product %ProductTitle% from %OldDate% to %NewDate%. "
3193
+ "View the product: %EditorLinkProduct%."
3194
+ msgstr ""
3195
+
3196
+ #: defaults.php:324
3197
+ msgid "User changed the visibility of a product"
3198
+ msgstr ""
3199
+
3200
+ #: defaults.php:324
3201
+ msgid ""
3202
+ "Changed the visibility of the product %ProductTitle% from %OldVisibility% to "
3203
+ "%NewVisibility%. View the product: %EditorLinkProduct%."
3204
+ msgstr ""
3205
+
3206
+ #: defaults.php:325
3207
+ msgid "User modified the published product"
3208
+ msgstr ""
3209
+
3210
+ #: defaults.php:325
3211
+ msgid ""
3212
+ "Modified the published product %ProductTitle%. Product URL is %ProductUrl%. "
3213
+ "View the product: %EditorLinkProduct%."
3214
+ msgstr ""
3215
+
3216
+ #: defaults.php:326
3217
+ msgid "User modified the draft product"
3218
+ msgstr ""
3219
+
3220
+ #: defaults.php:326
3221
+ msgid ""
3222
+ "Modified the draft product %ProductTitle%. View the product: "
3223
+ "%EditorLinkProduct%."
3224
+ msgstr ""
3225
+
3226
+ #: defaults.php:327
3227
+ msgid "User moved a product to trash"
3228
+ msgstr ""
3229
+
3230
+ #: defaults.php:327
3231
+ msgid ""
3232
+ "Moved the product %ProductTitle% to trash. Product URL was %ProductUrl%."
3233
+ msgstr ""
3234
+
3235
+ #: defaults.php:328
3236
+ msgid "User permanently deleted a product"
3237
+ msgstr ""
3238
+
3239
+ #: defaults.php:328
3240
+ msgid "Permanently deleted the product %ProductTitle%."
3241
+ msgstr ""
3242
+
3243
+ #: defaults.php:329
3244
+ msgid "User restored a product from the trash"
3245
+ msgstr ""
3246
+
3247
+ #: defaults.php:329
3248
+ msgid ""
3249
+ "Product %ProductTitle% has been restored from trash. View product: "
3250
+ "%EditorLinkProduct%."
3251
+ msgstr ""
3252
+
3253
+ #: defaults.php:330
3254
+ msgid "User changed status of a product"
3255
+ msgstr ""
3256
+
3257
+ #: defaults.php:330
3258
+ msgid ""
3259
+ "Changed the status of the product %ProductTitle% from %OldStatus% to "
3260
+ "%NewStatus%. View the product: %EditorLinkProduct%."
3261
+ msgstr ""
3262
+
3263
+ #: defaults.php:331
3264
+ msgid "User changed type of a price"
3265
+ msgstr ""
3266
+
3267
+ #: defaults.php:331
3268
+ msgid ""
3269
+ "Changed the %PriceType% of the product %ProductTitle% from %OldPrice% to "
3270
+ "%NewPrice%. View the product: %EditorLinkProduct%."
3271
+ msgstr ""
3272
+
3273
+ #: defaults.php:332
3274
+ msgid "User changed the SKU of a product"
3275
+ msgstr ""
3276
+
3277
+ #: defaults.php:332
3278
+ msgid ""
3279
+ "Changed the SKU of the product %ProductTitle% from %OldSku% to %NewSku%. "
3280
+ "View the product: %EditorLinkProduct%."
3281
+ msgstr ""
3282
+
3283
+ #: defaults.php:333
3284
+ msgid "User changed the stock status of a product"
3285
+ msgstr ""
3286
+
3287
+ #: defaults.php:333
3288
+ msgid ""
3289
+ "Changed the stock status of the product %ProductTitle% from %OldStatus% to "
3290
+ "%NewStatus%. View the product: %EditorLinkProduct%."
3291
+ msgstr ""
3292
+
3293
+ #: defaults.php:334
3294
+ msgid "User changed the stock quantity"
3295
+ msgstr ""
3296
+
3297
+ #: defaults.php:334
3298
+ msgid ""
3299
+ "Changed the stock quantity from %OldValue% to %NewValue%. View the product: "
3300
+ "%EditorLinkProduct%"
3301
+ msgstr ""
3302
+
3303
+ #: defaults.php:335
3304
+ msgid "User set a product type"
3305
+ msgstr ""
3306
+
3307
+ #: defaults.php:335
3308
+ msgid ""
3309
+ "Set the product %ProductTitle% as %Type%. View the product: "
3310
+ "%EditorLinkProduct%."
3311
+ msgstr ""
3312
+
3313
+ #: defaults.php:336
3314
+ msgid "User changed the weight of a product"
3315
+ msgstr ""
3316
+
3317
+ #: defaults.php:336
3318
+ msgid ""
3319
+ "Changed the weight of the product %ProductTitle% from %OldWeight% to "
3320
+ "%NewWeight%. View the product: %EditorLinkProduct%."
3321
+ msgstr ""
3322
+
3323
+ #: defaults.php:337
3324
+ msgid "User changed the dimensions of a product"
3325
+ msgstr ""
3326
+
3327
+ #: defaults.php:337
3328
+ msgid ""
3329
+ "Changed the %DimensionType% dimensions of the product %ProductTitle% from "
3330
+ "%OldDimension% to %NewDimension%. View the product: %EditorLinkProduct%."
3331
+ msgstr ""
3332
+
3333
+ #: defaults.php:338
3334
+ msgid "User added the Downloadable File to a product"
3335
+ msgstr ""
3336
+
3337
+ #: defaults.php:338
3338
+ msgid ""
3339
+ "Added the Downloadable File %FileName% with File URL %FileUrl% to the "
3340
+ "product %ProductTitle%. View the product: %EditorLinkProduct%."
3341
+ msgstr ""
3342
+
3343
+ #: defaults.php:339
3344
+ msgid "User Removed the Downloadable File from a product"
3345
+ msgstr ""
3346
+
3347
+ #: defaults.php:339
3348
+ msgid ""
3349
+ "Removed the Downloadable File %FileName% with File URL %FileUrl% from the "
3350
+ "product %ProductTitle%. View the product: %EditorLinkProduct%."
3351
+ msgstr ""
3352
+
3353
+ #: defaults.php:340
3354
+ msgid "User changed the name of a Downloadable File in a product"
3355
+ msgstr ""
3356
+
3357
+ #: defaults.php:340
3358
+ msgid ""
3359
+ "Changed the name of a Downloadable File from %OldName% to %NewName% in "
3360
+ "product %ProductTitle%. View the product: %EditorLinkProduct%."
3361
+ msgstr ""
3362
+
3363
+ #: defaults.php:341
3364
+ msgid "User changed the URL of the Downloadable File in a product"
3365
+ msgstr ""
3366
+
3367
+ #: defaults.php:341
3368
+ msgid ""
3369
+ "Changed the URL of the Downloadable File %FileName% from %OldUrl% to %NewUrl"
3370
+ "% in product %ProductTitle%. View the product: %EditorLinkProduct%."
3371
+ msgstr ""
3372
+
3373
+ #: defaults.php:342
3374
+ msgid "User changed the Weight Unit"
3375
+ msgstr ""
3376
+
3377
+ #: defaults.php:342
3378
+ msgid "Changed the Weight Unit from %OldUnit% to %NewUnit% in WooCommerce."
3379
+ msgstr ""
3380
+
3381
+ #: defaults.php:343
3382
+ msgid "User changed the Dimensions Unit"
3383
+ msgstr ""
3384
+
3385
+ #: defaults.php:343
3386
+ msgid "Changed the Dimensions Unit from %OldUnit% to %NewUnit% in WooCommerce."
3387
+ msgstr ""
3388
+
3389
+ #: defaults.php:344
3390
+ msgid "User changed the Base Location"
3391
+ msgstr ""
3392
+
3393
+ #: defaults.php:344
3394
+ msgid ""
3395
+ "Changed the Base Location from %OldLocation% to %NewLocation% in WooCommerce."
3396
+ msgstr ""
3397
+
3398
+ #: defaults.php:345
3399
+ msgid "User Enabled/Disabled taxes"
3400
+ msgstr ""
3401
+
3402
+ #: defaults.php:345
3403
+ msgid "%Status% taxes in the WooCommerce store."
3404
+ msgstr ""
3405
+
3406
+ #: defaults.php:346
3407
+ msgid "User changed the currency"
3408
+ msgstr ""
3409
+
3410
+ #: defaults.php:346
3411
+ msgid ""
3412
+ "Changed the currency from %OldCurrency% to %NewCurrency% in WooCommerce."
3413
+ msgstr ""
3414
+
3415
+ #: defaults.php:347
3416
+ msgid "User Enabled/Disabled the use of coupons during checkout"
3417
+ msgstr ""
3418
+
3419
+ #: defaults.php:347
3420
+ msgid "%Status% the use of coupons during checkout in WooCommerce."
3421
+ msgstr ""
3422
+
3423
+ #: defaults.php:348
3424
+ msgid "User Enabled/Disabled guest checkout"
3425
+ msgstr ""
3426
+
3427
+ #: defaults.php:348
3428
+ msgid "%Status% guest checkout in WooCommerce."
3429
  msgstr ""
3430
 
3431
+ #: wp-security-audit-log.php:355
3432
+ #, php-format
3433
  msgid ""
3434
  "You are using a version of PHP that is older than %s, which is no longer "
3435
  "supported.<br/>Contact us on <a href=\"mailto:plugins@wpwhitesecurity.com"
3441
  msgid "WP Security Audit Log"
3442
  msgstr ""
3443
 
 
3444
  #. Plugin URI of the plugin/theme
 
3445
  #. Author URI of the plugin/theme
3446
  msgid "http://www.wpsecurityauditlog.com/"
3447
  msgstr ""
readme.txt CHANGED
@@ -7,7 +7,7 @@ License URI: http://www.gnu.org/licenses/gpl.html
7
  Tags: wordpress security plugin, wordpress security audit log, audit log, wordpress log, event log wordpress, wordpress user tracking, wordpress activity log, wordpress audit, security event log, audit trail, security audit trail, wordpress security alerts, wordpress monitor, wordpress security monitor, wordpress admin, wordpress admin monitoring, analytics, activity, admin, multisite, wordpress multisite, actions, dashboard, log, notification, wordpress monitoring, email notification, wordpress email alerts, tracking, user tracking, user activity report, wordpress audit trail
8
  Requires at least: 3.6
9
  Tested up to: 4.8.1
10
- Stable tag: 2.6.7
11
 
12
  Keep an audit trail of all changes and under the hood WordPress activity to ensure productivity and thwart possible WordPress hacker attacks.
13
 
@@ -188,6 +188,14 @@ Please refer to the [FAQs page](https://www.wpsecurityauditlog.com/documentation
188
 
189
  == Changelog ==
190
 
 
 
 
 
 
 
 
 
191
  = 2.6.7 (2017-09-09) =
192
 
193
  * **Improvements**
7
  Tags: wordpress security plugin, wordpress security audit log, audit log, wordpress log, event log wordpress, wordpress user tracking, wordpress activity log, wordpress audit, security event log, audit trail, security audit trail, wordpress security alerts, wordpress monitor, wordpress security monitor, wordpress admin, wordpress admin monitoring, analytics, activity, admin, multisite, wordpress multisite, actions, dashboard, log, notification, wordpress monitoring, email notification, wordpress email alerts, tracking, user tracking, user activity report, wordpress audit trail
8
  Requires at least: 3.6
9
  Tested up to: 4.8.1
10
+ Stable tag: 2.6.8
11
 
12
  Keep an audit trail of all changes and under the hood WordPress activity to ensure productivity and thwart possible WordPress hacker attacks.
13
 
188
 
189
  == Changelog ==
190
 
191
+ = 2.6.8 (2017-09-19) =
192
+
193
+ * **Improvement**
194
+ * Improved the sensor for custom post types so posts with NULL value or other temp custom posts are not reported. This was reported in several support tickets; [here](https://wordpress.org/support/topic/a-plugin-automatically-created-the-following-custom-post-null/), [here](https://wordpress.org/support/topic/would-you-tell-me-about-meanings-of-2-message/) and [here](https://wordpress.org/support/topic/pinpointing-the-plugin/).
195
+
196
+ * **Bug Fix**
197
+ * Add a new check to ensure the object is of WP_Post class [Support Ticket](https://wordpress.org/support/topic/undefined-property-wp_post_typepost_type/)
198
+
199
  = 2.6.7 (2017-09-09) =
200
 
201
  * **Improvements**
wp-security-audit-log.php CHANGED
@@ -4,7 +4,7 @@ Plugin Name: WP Security Audit Log
4
  Plugin URI: http://www.wpsecurityauditlog.com/
5
  Description: Identify WordPress security issues before they become a problem. Keep track of everything happening on your WordPress including WordPress users activity. Similar to Windows Event Log and Linux Syslog, WP Security Audit Log generates a security alert for everything that happens on your WordPress blogs and websites. Use the Audit Log Viewer included in the plugin to see all the security alerts.
6
  Author: WP White Security
7
- Version: 2.6.7
8
  Text Domain: wp-security-audit-log
9
  Author URI: http://www.wpsecurityauditlog.com/
10
  License: GPL2
@@ -36,7 +36,7 @@ class WpSecurityAuditLog {
36
  *
37
  * @var string
38
  */
39
- public $version = '2.6.7';
40
 
41
  // Plugin constants.
42
  const PLG_CLS_PRFX = 'WSAL_';
4
  Plugin URI: http://www.wpsecurityauditlog.com/
5
  Description: Identify WordPress security issues before they become a problem. Keep track of everything happening on your WordPress including WordPress users activity. Similar to Windows Event Log and Linux Syslog, WP Security Audit Log generates a security alert for everything that happens on your WordPress blogs and websites. Use the Audit Log Viewer included in the plugin to see all the security alerts.
6
  Author: WP White Security
7
+ Version: 2.6.8
8
  Text Domain: wp-security-audit-log
9
  Author URI: http://www.wpsecurityauditlog.com/
10
  License: GPL2
36
  *
37
  * @var string
38
  */
39
+ public $version = '2.6.8';
40
 
41
  // Plugin constants.
42
  const PLG_CLS_PRFX = 'WSAL_';