WP Security Audit Log - Version 1.2.8

Version Description

(2014-10-14) = * New Feature * Added new Extensions page to allow users to see which extensions they can use to increase the functionality of the plugin * Included licensing mechanism to support premium extensions

  • Improvements

    • Updated latest language files for German and Italian translations (also include corrections for some old translations)
  • Bug Fixes

    • Fixed a problem with the pruning of WordPress Security Alerts support ticket
    • Fixed pagination issue in the Audit Log Viewer when running on WordPress multisite
Download this release

Release Info

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

Code changes from version 1.2.7 to 1.2.8

classes/AbstractView.php CHANGED
@@ -32,6 +32,54 @@ abstract class WSAL_AbstractView {
32
  if(!isset($wp_version))
33
  $wp_version = get_bloginfo('version');
34
  $this->_wpversion = floatval($wp_version);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  }
36
 
37
  /**
32
  if(!isset($wp_version))
33
  $wp_version = get_bloginfo('version');
34
  $this->_wpversion = floatval($wp_version);
35
+
36
+ // handle admin notices
37
+ add_action('wp_ajax_AjaxDismissNotice', array($this, 'AjaxDismissNotice'));
38
+ }
39
+
40
+ public static $AllowedNoticeNames = array();
41
+
42
+ /**
43
+ * Dismiss an admin notice through ajax.
44
+ * @internal
45
+ */
46
+ public function AjaxDismissNotice(){
47
+ if(!$this->_plugin->settings->CurrentUserCan('view'))
48
+ die('Access Denied.');
49
+
50
+ if(!isset($_REQUEST['notice']))
51
+ die('Notice name expected as "notice" parameter.');
52
+
53
+ $this->DismissNotice($_REQUEST['notice']);
54
+ }
55
+
56
+ /**
57
+ * @param string $name Name of notice.
58
+ * @return boolean Whether notice got dismissed or not.
59
+ */
60
+ public function IsNoticeDismissed($name){
61
+ $user_id = get_current_user_id();
62
+ $meta_key = 'wsal-notice-' . $name;
63
+ self::$AllowedNoticeNames[] = $name;
64
+ return !!get_user_meta($user_id, $meta_key, true);
65
+ }
66
+
67
+ /**
68
+ * @param string $name Name of notice to dismiss.
69
+ */
70
+ public function DismissNotice($name){
71
+ $user_id = get_current_user_id();
72
+ $meta_key = 'wsal-notice-' . $name;
73
+ $old_value = get_user_meta($user_id, $meta_key, true);
74
+ if (in_array($name, self::$AllowedNoticeNames) || $old_value === '0')
75
+ add_user_meta($user_id, $meta_key, '1', true);
76
+ }
77
+
78
+ /**
79
+ * @param string $name Makes this notice available.
80
+ */
81
+ public function RegisterNotice($name){
82
+ self::$AllowedNoticeNames[] = $name;
83
  }
84
 
85
  /**
classes/EDD_SL_Plugin_Updater.php CHANGED
@@ -1,170 +1,170 @@
1
- <?php
2
-
3
- // uncomment this line for testing
4
- //set_site_transient( 'update_plugins', null );
5
-
6
- /**
7
- * Allows plugins to use their own update API.
8
- *
9
- * @author Pippin Williamson
10
- * @version 1.2
11
- */
12
- class EDD_SL_Plugin_Updater {
13
- private $api_url = '';
14
- private $api_data = array();
15
- private $name = '';
16
- private $slug = '';
17
- private $do_check = false;
18
-
19
- /**
20
- * Class constructor.
21
- *
22
- * @uses plugin_basename()
23
- * @uses hook()
24
- *
25
- * @param string $_api_url The URL pointing to the custom API endpoint.
26
- * @param string $_plugin_file Path to the plugin file.
27
- * @param array $_api_data Optional data to send with API calls.
28
- * @return void
29
- */
30
- function __construct( $_api_url, $_plugin_file, $_api_data = null ) {
31
- $this->api_url = trailingslashit( $_api_url );
32
- $this->api_data = urlencode_deep( $_api_data );
33
- $this->name = plugin_basename( $_plugin_file );
34
- $this->slug = basename( $_plugin_file, '.php');
35
- $this->version = $_api_data['version'];
36
-
37
- // Set up hooks.
38
- $this->hook();
39
- }
40
-
41
- /**
42
- * Set up WordPress filters to hook into WP's update process.
43
- *
44
- * @uses add_filter()
45
- *
46
- * @return void
47
- */
48
- private function hook() {
49
- add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'pre_set_site_transient_update_plugins_filter' ) );
50
- add_filter( 'plugins_api', array( $this, 'plugins_api_filter' ), 10, 3 );
51
- add_filter( 'http_request_args', array( $this, 'http_request_args' ), 10, 2 );
52
- }
53
-
54
- /**
55
- * Check for Updates at the defined API endpoint and modify the update array.
56
- *
57
- * This function dives into the update API just when WordPress creates its update array,
58
- * then adds a custom API call and injects the custom plugin data retrieved from the API.
59
- * It is reassembled from parts of the native WordPress plugin update code.
60
- * See wp-includes/update.php line 121 for the original wp_update_plugins() function.
61
- *
62
- * @uses api_request()
63
- *
64
- * @param array $_transient_data Update array build by WordPress.
65
- * @return array Modified update array with custom plugin data.
66
- */
67
- function pre_set_site_transient_update_plugins_filter( $_transient_data ) {
68
-
69
- if( empty( $_transient_data ) || ! $this->do_check ) {
70
-
71
- // This ensures that the custom API request only runs on the second time that WP fires the update check
72
- $this->do_check = true;
73
-
74
- return $_transient_data;
75
- }
76
-
77
- $to_send = array( 'slug' => $this->slug );
78
-
79
- $api_response = $this->api_request( 'plugin_latest_version', $to_send );
80
-
81
- if( false !== $api_response && is_object( $api_response ) && isset( $api_response->new_version ) ) {
82
-
83
- if( version_compare( $this->version, $api_response->new_version, '<' ) ) {
84
- $_transient_data->response[$this->name] = $api_response;
85
- }
86
- }
87
- return $_transient_data;
88
- }
89
-
90
-
91
- /**
92
- * Updates information on the "View version x.x details" page with custom data.
93
- *
94
- * @uses api_request()
95
- *
96
- * @param mixed $_data
97
- * @param string $_action
98
- * @param object $_args
99
- * @return object $_data
100
- */
101
- function plugins_api_filter( $_data, $_action = '', $_args = null ) {
102
- if ( ( $_action != 'plugin_information' ) || !isset( $_args->slug ) || ( $_args->slug != $this->slug ) ) return $_data;
103
-
104
- $to_send = array( 'slug' => $this->slug );
105
-
106
- $api_response = $this->api_request( 'plugin_information', $to_send );
107
- if ( false !== $api_response ) $_data = $api_response;
108
-
109
- return $_data;
110
- }
111
-
112
-
113
- /**
114
- * Disable SSL verification in order to prevent download update failures
115
- *
116
- * @param array $args
117
- * @param string $url
118
- * @return object $array
119
- */
120
- function http_request_args( $args, $url ) {
121
- // If it is an https request and we are performing a package download, disable ssl verification
122
- if( strpos( $url, 'https://' ) !== false && strpos( $url, 'edd_action=package_download' ) ) {
123
- $args['sslverify'] = false;
124
- }
125
- return $args;
126
- }
127
-
128
- /**
129
- * Calls the API and, if successfull, returns the object delivered by the API.
130
- *
131
- * @uses get_bloginfo()
132
- * @uses wp_remote_post()
133
- * @uses is_wp_error()
134
- *
135
- * @param string $_action The requested action.
136
- * @param array $_data Parameters for the API action.
137
- * @return false||object
138
- */
139
- private function api_request( $_action, $_data ) {
140
-
141
- global $wp_version;
142
-
143
- $data = array_merge( $this->api_data, $_data );
144
-
145
- if( $data['slug'] != $this->slug )
146
- return;
147
-
148
- if( empty( $data['license'] ) )
149
- return;
150
-
151
- $api_params = array(
152
- 'edd_action' => 'get_version',
153
- 'license' => $data['license'],
154
- 'name' => $data['item_name'],
155
- 'slug' => $this->slug,
156
- 'author' => $data['author'],
157
- 'url' => home_url()
158
- );
159
- $request = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => false, 'body' => $api_params ) );
160
-
161
- if ( ! is_wp_error( $request ) ):
162
- $request = json_decode( wp_remote_retrieve_body( $request ) );
163
- if( $request && isset( $request->sections ) )
164
- $request->sections = maybe_unserialize( $request->sections );
165
- return $request;
166
- else:
167
- return false;
168
- endif;
169
- }
170
- }
1
+ <?php
2
+
3
+ // uncomment this line for testing
4
+ //set_site_transient( 'update_plugins', null );
5
+
6
+ /**
7
+ * Allows plugins to use their own update API.
8
+ *
9
+ * @author Pippin Williamson
10
+ * @version 1.2
11
+ */
12
+ class EDD_SL_Plugin_Updater {
13
+ private $api_url = '';
14
+ private $api_data = array();
15
+ private $name = '';
16
+ private $slug = '';
17
+ private $do_check = false;
18
+
19
+ /**
20
+ * Class constructor.
21
+ *
22
+ * @uses plugin_basename()
23
+ * @uses hook()
24
+ *
25
+ * @param string $_api_url The URL pointing to the custom API endpoint.
26
+ * @param string $_plugin_file Path to the plugin file.
27
+ * @param array $_api_data Optional data to send with API calls.
28
+ * @return void
29
+ */
30
+ function __construct( $_api_url, $_plugin_file, $_api_data = null ) {
31
+ $this->api_url = trailingslashit( $_api_url );
32
+ $this->api_data = urlencode_deep( $_api_data );
33
+ $this->name = plugin_basename( $_plugin_file );
34
+ $this->slug = basename( $_plugin_file, '.php');
35
+ $this->version = $_api_data['version'];
36
+
37
+ // Set up hooks.
38
+ $this->hook();
39
+ }
40
+
41
+ /**
42
+ * Set up WordPress filters to hook into WP's update process.
43
+ *
44
+ * @uses add_filter()
45
+ *
46
+ * @return void
47
+ */
48
+ private function hook() {
49
+ add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'pre_set_site_transient_update_plugins_filter' ) );
50
+ add_filter( 'plugins_api', array( $this, 'plugins_api_filter' ), 10, 3 );
51
+ add_filter( 'http_request_args', array( $this, 'http_request_args' ), 10, 2 );
52
+ }
53
+
54
+ /**
55
+ * Check for Updates at the defined API endpoint and modify the update array.
56
+ *
57
+ * This function dives into the update API just when WordPress creates its update array,
58
+ * then adds a custom API call and injects the custom plugin data retrieved from the API.
59
+ * It is reassembled from parts of the native WordPress plugin update code.
60
+ * See wp-includes/update.php line 121 for the original wp_update_plugins() function.
61
+ *
62
+ * @uses api_request()
63
+ *
64
+ * @param array $_transient_data Update array build by WordPress.
65
+ * @return array Modified update array with custom plugin data.
66
+ */
67
+ function pre_set_site_transient_update_plugins_filter( $_transient_data ) {
68
+
69
+ if( empty( $_transient_data ) || ! $this->do_check ) {
70
+
71
+ // This ensures that the custom API request only runs on the second time that WP fires the update check
72
+ $this->do_check = true;
73
+
74
+ return $_transient_data;
75
+ }
76
+
77
+ $to_send = array( 'slug' => $this->slug );
78
+
79
+ $api_response = $this->api_request( 'plugin_latest_version', $to_send );
80
+
81
+ if( false !== $api_response && is_object( $api_response ) && isset( $api_response->new_version ) ) {
82
+
83
+ if( version_compare( $this->version, $api_response->new_version, '<' ) ) {
84
+ $_transient_data->response[$this->name] = $api_response;
85
+ }
86
+ }
87
+ return $_transient_data;
88
+ }
89
+
90
+
91
+ /**
92
+ * Updates information on the "View version x.x details" page with custom data.
93
+ *
94
+ * @uses api_request()
95
+ *
96
+ * @param mixed $_data
97
+ * @param string $_action
98
+ * @param object $_args
99
+ * @return object $_data
100
+ */
101
+ function plugins_api_filter( $_data, $_action = '', $_args = null ) {
102
+ if ( ( $_action != 'plugin_information' ) || !isset( $_args->slug ) || ( $_args->slug != $this->slug ) ) return $_data;
103
+
104
+ $to_send = array( 'slug' => $this->slug );
105
+
106
+ $api_response = $this->api_request( 'plugin_information', $to_send );
107
+ if ( false !== $api_response ) $_data = $api_response;
108
+
109
+ return $_data;
110
+ }
111
+
112
+
113
+ /**
114
+ * Disable SSL verification in order to prevent download update failures
115
+ *
116
+ * @param array $args
117
+ * @param string $url
118
+ * @return object $array
119
+ */
120
+ function http_request_args( $args, $url ) {
121
+ // If it is an https request and we are performing a package download, disable ssl verification
122
+ if( strpos( $url, 'https://' ) !== false && strpos( $url, 'edd_action=package_download' ) ) {
123
+ $args['sslverify'] = false;
124
+ }
125
+ return $args;
126
+ }
127
+
128
+ /**
129
+ * Calls the API and, if successfull, returns the object delivered by the API.
130
+ *
131
+ * @uses get_bloginfo()
132
+ * @uses wp_remote_post()
133
+ * @uses is_wp_error()
134
+ *
135
+ * @param string $_action The requested action.
136
+ * @param array $_data Parameters for the API action.
137
+ * @return false||object
138
+ */
139
+ private function api_request( $_action, $_data ) {
140
+
141
+ global $wp_version;
142
+
143
+ $data = array_merge( $this->api_data, $_data );
144
+
145
+ if( $data['slug'] != $this->slug )
146
+ return;
147
+
148
+ if( empty( $data['license'] ) )
149
+ return;
150
+
151
+ $api_params = array(
152
+ 'edd_action' => 'get_version',
153
+ 'license' => $data['license'],
154
+ 'name' => $data['item_name'],
155
+ 'slug' => $this->slug,
156
+ 'author' => $data['author'],
157
+ 'url' => home_url()
158
+ );
159
+ $request = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => false, 'body' => $api_params ) );
160
+
161
+ if ( ! is_wp_error( $request ) ):
162
+ $request = json_decode( wp_remote_retrieve_body( $request ) );
163
+ if( $request && isset( $request->sections ) )
164
+ $request->sections = maybe_unserialize( $request->sections );
165
+ return $request;
166
+ else:
167
+ return false;
168
+ endif;
169
+ }
170
+ }
classes/LicenseManager.php CHANGED
@@ -11,76 +11,154 @@ class WSAL_LicenseManager {
11
  */
12
  protected $plugin;
13
 
14
- public $plugins = array();
15
 
16
  public function __construct(WpSecurityAuditLog $plugin){
17
  $this->plugin = $plugin;
 
18
  }
19
 
20
  protected function GetStoreUrl(){
21
- return 'http://wpwhitesecurity.com/';
22
  }
23
 
24
  public function CountPlugins(){
25
  return count($this->plugins);
26
  }
27
 
28
- public function AddPremiumPlugin($pluginFile){
29
- $name = sanitize_key($pluginFile);
30
- $pluginData = get_plugin_data($pluginFile);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
 
32
- $this->plugins[$name] = array(
33
  'PluginData' => $pluginData,
34
- 'EddUpdater' => new EDD_SL_Plugin_Updater(
35
- $this->GetStoreUrl(),
36
- $pluginFile,
37
- array(
38
- 'license' => $this->plugin->settings->GetLicenseKey($name),
39
- 'item_name' => $pluginData['Name'],
40
- 'author' => $pluginData['Author'],
41
- 'version' => $pluginData['Version'],
42
- )
43
- ),
44
  );
45
  }
46
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  public function ActivateLicense($name, $license){
48
  $this->plugin->settings->SetLicenseKey($name, $license);
49
 
 
50
  $api_params = array(
51
  'edd_action'=> 'activate_license',
52
  'license' => urlencode($license),
53
- 'item_name' => urlencode($this->plugins[$name]['PluginData']['Name']),
54
- 'url' => urlencode(home_url())
55
  );
56
 
57
- $response = wp_remote_get(
58
- add_query_arg($api_params, $this->GetStoreUrl()),
59
- array('timeout' => 15, 'sslverify' => false)
60
- );
 
 
 
 
 
 
 
61
 
62
- if (is_wp_error($response)) {
63
- $this->plugin->settings->SetLicenseErrors($name, 'Invalid Licensing Server Response: ' . $response->get_error_message());
64
- return false;
65
- }
 
66
 
67
- $license_data = json_decode( wp_remote_retrieve_body( $response ) );
68
-
69
- if(is_object($license_data)){
70
- $this->plugin->settings->SetLicenseStatus($name, $license_data->license);
71
- if($license_data->license !== 'valid'){
72
- $error = 'License Not Valid';
73
- if (isset($license_data->error)) $error .= ': ' . ucfirst(str_replace('_', ' ', $license_data->error));
74
- $this->plugin->settings->SetLicenseErrors($name, $error);
 
 
 
 
 
 
 
75
  }
76
- }else{
77
- $this->plugin->settings->SetLicenseErrors($name, 'Unexpected Licensing Server Response');
78
  }
79
 
80
  return true;
81
  }
82
 
83
- public function DeactivateLicense($name){
 
 
 
 
84
  $this->plugin->settings->SetLicenseStatus($name, '');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
  }
86
  }
11
  */
12
  protected $plugin;
13
 
14
+ protected $plugins = array();
15
 
16
  public function __construct(WpSecurityAuditLog $plugin){
17
  $this->plugin = $plugin;
18
+ add_action('plugins_loaded', array($this, 'LoadPlugins'));
19
  }
20
 
21
  protected function GetStoreUrl(){
22
+ return 'http://www.wpwhitesecurity.com/';
23
  }
24
 
25
  public function CountPlugins(){
26
  return count($this->plugins);
27
  }
28
 
29
+ public function Plugins(){
30
+ return $this->plugins;
31
+ }
32
+
33
+ public function LoadPlugins(){
34
+ foreach(apply_filters('wsal_register', array()) as $pluginFile)
35
+ $this->AddPremiumPlugin($pluginFile);
36
+ }
37
+
38
+ protected function GetPluginData($pluginFile, $license){
39
+ // A hack since get_plugin_data() is not available now
40
+ $pluginData = get_file_data($pluginFile, array(
41
+ 'Name' => 'Plugin Name',
42
+ 'PluginURI' => 'Plugin URI',
43
+ 'Version' => 'Version',
44
+ 'Description' => 'Description',
45
+ 'Author' => 'Author',
46
+ 'TextDomain' => 'Text Domain',
47
+ 'DomainPath' => 'Domain Path',
48
+ ), 'plugin' );
49
+
50
+ $pluginUpdater = new EDD_SL_Plugin_Updater(
51
+ $this->GetStoreUrl(),
52
+ $pluginFile,
53
+ array(
54
+ 'license' => $license,
55
+ 'item_name' => $pluginData['Name'],
56
+ 'author' => $pluginData['Author'],
57
+ 'version' => $pluginData['Version'],
58
+ )
59
+ );
60
 
61
+ return array(
62
  'PluginData' => $pluginData,
63
+ 'EddUpdater' => $pluginUpdater,
 
 
 
 
 
 
 
 
 
64
  );
65
  }
66
 
67
+ public function AddPremiumPlugin($pluginFile){
68
+ $name = sanitize_key(basename($pluginFile));
69
+ $license = $this->plugin->settings->GetLicenseKey($name);
70
+ $this->plugins[$name] = $this->GetPluginData($pluginFile, $license);
71
+ }
72
+
73
+ protected function GetBlogIds(){
74
+ global $wpdb;
75
+ $sql = 'SELECT blog_id FROM ' . $wpdb->blogs;
76
+ return $wpdb->get_col($sql);
77
+ }
78
+
79
  public function ActivateLicense($name, $license){
80
  $this->plugin->settings->SetLicenseKey($name, $license);
81
 
82
+ $plugins = $this->Plugins();
83
  $api_params = array(
84
  'edd_action'=> 'activate_license',
85
  'license' => urlencode($license),
86
+ 'item_name' => urlencode($plugins[$name]['PluginData']['Name']),
87
+ 'url' => urlencode(home_url()),
88
  );
89
 
90
+ $blog_ids = $this->plugin->IsMultisite() ? $this->GetBlogIds() : array(1);
91
+
92
+ foreach($blog_ids as $blog_id){
93
+
94
+ if($this->plugin->IsMultisite())
95
+ $api_params['url'] = urlencode(get_home_url($blog_id));
96
+
97
+ $response = wp_remote_get(
98
+ add_query_arg($api_params, $this->GetStoreUrl()),
99
+ array('timeout' => 15, 'sslverify' => false)
100
+ );
101
 
102
+ if (is_wp_error($response)) {
103
+ $this->plugin->settings->SetLicenseErrors($name, 'Invalid Licensing Server Response: ' . $response->get_error_message());
104
+ $this->DeactivateLicense($name, $license);
105
+ return false;
106
+ }
107
 
108
+ $license_data = json_decode(wp_remote_retrieve_body($response));
109
+
110
+ if(is_object($license_data)){
111
+ $this->plugin->settings->SetLicenseStatus($name, $license_data->license);
112
+ if($license_data->license !== 'valid'){
113
+ $error = 'License Not Valid';
114
+ if (isset($license_data->error)) $error .= ': ' . ucfirst(str_replace('_', ' ', $license_data->error));
115
+ $this->plugin->settings->SetLicenseErrors($name, $error);
116
+ $this->DeactivateLicense($name, $license);
117
+ return false;
118
+ }
119
+ }else{
120
+ $this->plugin->settings->SetLicenseErrors($name, 'Unexpected Licensing Server Response');
121
+ $this->DeactivateLicense($name, $license);
122
+ return false;
123
  }
 
 
124
  }
125
 
126
  return true;
127
  }
128
 
129
+ public function IsLicenseValid($name){
130
+ return trim(strtolower($this->plugin->settings->GetLicenseStatus($name))) === 'valid';
131
+ }
132
+
133
+ public function DeactivateLicense($name, $license = null){
134
  $this->plugin->settings->SetLicenseStatus($name, '');
135
+
136
+ // deactivate it on the server (if license was given)
137
+ if(!is_null($license)){
138
+ $plugins = $this->Plugins();
139
+ $api_params = array(
140
+ 'edd_action'=> 'deactivate_license',
141
+ 'license' => urlencode($license),
142
+ 'item_name' => urlencode($plugins[$name]['PluginData']['Name']),
143
+ 'url' => urlencode(home_url()),
144
+ );
145
+
146
+ $blog_ids = $this->plugin->IsMultisite() ? $this->GetBlogIds() : array(1);
147
+
148
+ foreach($blog_ids as $blog_id){
149
+
150
+ if($this->plugin->IsMultisite())
151
+ $api_params['url'] = urlencode(get_home_url($blog_id));
152
+
153
+ $response = wp_remote_get(
154
+ add_query_arg($api_params, $this->GetStoreUrl()),
155
+ array('timeout' => 15, 'sslverify' => false)
156
+ );
157
+
158
+ if (is_wp_error($response)) return false;
159
+
160
+ wp_remote_retrieve_body($response);
161
+ }
162
+ }
163
  }
164
  }
classes/Loggers/Database.php CHANGED
@@ -23,15 +23,15 @@ class WSAL_Loggers_Database extends WSAL_AbstractLogger {
23
 
24
  public function CleanUp() {
25
  $now = current_time('timestamp');
26
- $max_count = $this->plugin->settings->GetPruningLimit();
27
  $max_sdate = $this->plugin->settings->GetPruningDate();
 
 
 
 
28
  $max_stamp = $now - (strtotime($max_sdate) - $now);
29
  $cnt_items = WSAL_DB_Occurrence::Count();
30
- if($cnt_items == $max_count)return;
31
  $max_items = max(($cnt_items - $max_count) + 1, 0);
32
 
33
- $is_date_e = $this->plugin->settings->IsPruningDateEnabled();
34
- $is_limt_e = $this->plugin->settings->IsPruningLimitEnabled();
35
  if (!$is_date_e && !$is_limt_e) return; // pruning disabled
36
 
37
  $query = new WSAL_DB_OccurrenceQuery('WSAL_DB_Occurrence');
@@ -43,8 +43,17 @@ class WSAL_Loggers_Database extends WSAL_AbstractLogger {
43
  $count = $query->Count();
44
  if (!$count) return; // nothing to delete
45
 
46
- // delete data and notify system
47
  $query->Delete();
 
 
 
 
 
 
 
 
 
48
  do_action('wsal_prune', $count, vsprintf($query->GetSql(), $query->GetArgs()));
49
  }
50
 
23
 
24
  public function CleanUp() {
25
  $now = current_time('timestamp');
 
26
  $max_sdate = $this->plugin->settings->GetPruningDate();
27
+ $max_count = $this->plugin->settings->GetPruningLimit();
28
+ $is_date_e = $this->plugin->settings->IsPruningDateEnabled();
29
+ $is_limt_e = $this->plugin->settings->IsPruningLimitEnabled();
30
+
31
  $max_stamp = $now - (strtotime($max_sdate) - $now);
32
  $cnt_items = WSAL_DB_Occurrence::Count();
 
33
  $max_items = max(($cnt_items - $max_count) + 1, 0);
34
 
 
 
35
  if (!$is_date_e && !$is_limt_e) return; // pruning disabled
36
 
37
  $query = new WSAL_DB_OccurrenceQuery('WSAL_DB_Occurrence');
43
  $count = $query->Count();
44
  if (!$count) return; // nothing to delete
45
 
46
+ // delete data
47
  $query->Delete();
48
+
49
+ // keep track of what we're doing
50
+ $this->plugin->alerts->Trigger(0003, array(
51
+ 'Message' => 'Running system cleanup.',
52
+ 'Query SQL' => $query->GetSql(),
53
+ 'Query Args' => $query->GetArgs(),
54
+ ), true);
55
+
56
+ // notify system
57
  do_action('wsal_prune', $count, vsprintf($query->GetSql(), $query->GetArgs()));
58
  }
59
 
classes/Settings.php CHANGED
@@ -416,6 +416,7 @@ class WSAL_Settings {
416
 
417
  public function GetLicense($name){
418
  $data = $this->GetLicenses();
 
419
  return isset($data[$name]) ? $data[$name] : array();
420
  }
421
 
416
 
417
  public function GetLicense($name){
418
  $data = $this->GetLicenses();
419
+ $name = sanitize_key(basename($name));
420
  return isset($data[$name]) ? $data[$name] : array();
421
  }
422
 
classes/Views/AuditLog.php CHANGED
@@ -12,6 +12,24 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
12
  add_action('wp_ajax_AjaxRefresh', array($this, 'AjaxRefresh'));
13
  add_action('wp_ajax_AjaxSetIpp', array($this, 'AjaxSetIpp'));
14
  add_action('wp_ajax_AjaxSearchSite', array($this, 'AjaxSearchSite'));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  }
16
 
17
  public function HasPluginShortcutLink(){
@@ -51,7 +69,7 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
51
  ?><form id="audit-log-viewer" method="post">
52
  <div id="audit-log-viewer-content">
53
  <input type="hidden" name="page" value="<?php echo esc_attr($_REQUEST['page']); ?>" />
54
- <input type="hidden" id="wsal-cbid" name="wsal-cbid" value="<?php echo esc_attr(isset($_REQUEST['wsal-cbid']) ? $_REQUEST['wsal-cbid'] : ''); ?>" />
55
  <?php do_action('wsal_auditlog_before_view', $this->GetListView()); ?>
56
  <?php $this->GetListView()->display(); ?>
57
  <?php do_action('wsal_auditlog_after_view', $this->GetListView()); ?>
12
  add_action('wp_ajax_AjaxRefresh', array($this, 'AjaxRefresh'));
13
  add_action('wp_ajax_AjaxSetIpp', array($this, 'AjaxSetIpp'));
14
  add_action('wp_ajax_AjaxSearchSite', array($this, 'AjaxSearchSite'));
15
+ add_action('all_admin_notices', array($this, 'AdminNoticesNotificationsExtension'));
16
+
17
+ $this->RegisterNotice('notifications-extension');
18
+ }
19
+
20
+ public function AdminNoticesNotificationsExtension() {
21
+ $NotificationExtensionInstalled = $this->_plugin->licensing->IsLicenseValid('wsal-notifications-extension.php');
22
+ $IsCurrentView = $this->_plugin->views->GetActiveView() == $this;
23
+ if($IsCurrentView && !$this->IsNoticeDismissed('notifications-extension') && !$NotificationExtensionInstalled){
24
+ ?><div class="updated" data-notice-name="notifications-extension">
25
+ <p><?php _e('Get notified instantly via email of important changes on your WordPress', 'wp-security-audit-log'); ?></p>
26
+ <p>
27
+ <?php $url = 'http://www.wpwhitesecurity.com/plugins-premium-extensions/email-notifications-wordpress/'; ?>
28
+ <a href="<?php echo esc_attr($url); ?>" target="_blank"><?php _e('Learn More', 'wp-security-audit-log'); ?></a>
29
+ | <a href="javascript:;" class="wsal-dismiss-notification"><?php _e('Dismiss this notice', 'wp-security-audit-log'); ?></a>
30
+ </p>
31
+ </div><?php
32
+ }
33
  }
34
 
35
  public function HasPluginShortcutLink(){
69
  ?><form id="audit-log-viewer" method="post">
70
  <div id="audit-log-viewer-content">
71
  <input type="hidden" name="page" value="<?php echo esc_attr($_REQUEST['page']); ?>" />
72
+ <input type="hidden" id="wsal-cbid" name="wsal-cbid" value="<?php echo esc_attr(isset($_REQUEST['wsal-cbid']) ? $_REQUEST['wsal-cbid'] : '0'); ?>" />
73
  <?php do_action('wsal_auditlog_before_view', $this->GetListView()); ?>
74
  <?php $this->GetListView()->display(); ?>
75
  <?php do_action('wsal_auditlog_after_view', $this->GetListView()); ?>
classes/Views/Extensions.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class WSAL_Views_Extensions extends WSAL_AbstractView {
4
+
5
+ public function GetTitle() {
6
+ return __('WP Security Audit Log Functionality Extensions', 'wp-security-audit-log');
7
+ }
8
+
9
+ public function GetIcon() {
10
+ return 'admin-plugins';
11
+ }
12
+
13
+ public function GetName() {
14
+ return __('Extensions', 'wp-security-audit-log');
15
+ }
16
+
17
+ public function GetWeight() {
18
+ return 3.5;
19
+ }
20
+
21
+ public function Render(){
22
+ ?><div class="metabox-holder" style="position: relative;">
23
+
24
+ <div class="postbox" style="margin-right: 270px;">
25
+ <div class="inside">
26
+ <div class="activity-block">
27
+ <h2><?php _e('Extend the functionality of your WP Security Audit Log plugin', 'wp-security-audit-log'); ?></h2>
28
+ <p><?php _e('Below is a list of extensions that allow you to extend the functionality of WP Security Audit Log plugin for a much better auditing and monitoring experience.', 'wp-security-audit-log'); ?></p>
29
+ </div>
30
+
31
+ <div class="">
32
+ <h2><?php _e('Notifications Extension', 'wp-security-audit-log'); ?></h2>
33
+ <strong><?php _e('Get notified instantly via email when important changes are made on your WordPress!', 'wp-security-audit-log'); ?></strong>
34
+ <p><?php _e('The Notifications Extension allows you to easily configure rules to receive an email when there is a change on WordPress. You do not need manually browse through the Audit Lock viewer anymore when looking for a specific change and the good thing is that you will be instantly alerted when it happens!', 'wp-security-audit-log'); ?></p>
35
+ <a class="button" href="http://www.wpwhitesecurity.com/plugins-premium-extensions/email-notifications-wordpress/" target="_blank"><?php _e('More Information', 'wp-security-audit-log'); ?></a>
36
+ </div>
37
+ </div>
38
+ </div>
39
+ </div><?php
40
+ }
41
+
42
+ }
classes/Views/Help.php CHANGED
@@ -22,7 +22,6 @@ class WSAL_Views_Help extends WSAL_AbstractView {
22
  ?><div class="metabox-holder" style="position: relative;">
23
 
24
  <div class="postbox" style="margin-right: 270px;">
25
- <h3 class="hndl"><span><?php _e('Help', 'wp-security-audit-log'); ?></span></h3>
26
  <div class="inside">
27
  <div class="activity-block">
28
  <h2><?php _e('Plugin Support', 'wp-security-audit-log'); ?></h2>
22
  ?><div class="metabox-holder" style="position: relative;">
23
 
24
  <div class="postbox" style="margin-right: 270px;">
 
25
  <div class="inside">
26
  <div class="activity-block">
27
  <h2><?php _e('Plugin Support', 'wp-security-audit-log'); ?></h2>
classes/Views/Licensing.php CHANGED
@@ -49,7 +49,7 @@ class WSAL_Views_Licensing extends WSAL_AbstractView {
49
  <tr><th>Plugin</th><th>License</th><th></th></tr>
50
  </thead><tbody>
51
  <?php $counter = 0; ?>
52
- <?php foreach($this->_plugin->licensing->plugins as $name => $plugin){ ?>
53
  <?php $licenseKey = trim($this->_plugin->settings->GetLicenseKey($name)); ?>
54
  <?php $licenseStatus = trim($this->_plugin->settings->GetLicenseStatus($name)); ?>
55
  <?php $licenseErrors = trim($this->_plugin->settings->GetLicenseErrors($name)); ?>
49
  <tr><th>Plugin</th><th>License</th><th></th></tr>
50
  </thead><tbody>
51
  <?php $counter = 0; ?>
52
+ <?php foreach($this->_plugin->licensing->Plugins() as $name => $plugin){ ?>
53
  <?php $licenseKey = trim($this->_plugin->settings->GetLicenseKey($name)); ?>
54
  <?php $licenseStatus = trim($this->_plugin->settings->GetLicenseStatus($name)); ?>
55
  <?php $licenseErrors = trim($this->_plugin->settings->GetLicenseErrors($name)); ?>
classes/Views/Sandbox.php CHANGED
@@ -82,7 +82,8 @@ return array(
82
  \'view\' => $settings->GetAccessTokens(\'view\'),
83
  \'edit\' => $settings->GetAccessTokens(\'edit\'),
84
  );',
85
- 'Show Profiler Results' => 'return array_map(\'strval\', WpSecurityAuditLog::GetInstance()->profiler->GetItems());'
 
86
  );
87
 
88
  public function HandleError($code, $message, $filename = 'unknown', $lineno = 0){
82
  \'view\' => $settings->GetAccessTokens(\'view\'),
83
  \'edit\' => $settings->GetAccessTokens(\'edit\'),
84
  );',
85
+ 'Show Profiler Results' => 'return array_map(\'strval\', WpSecurityAuditLog::GetInstance()->profiler->GetItems());',
86
+ 'Reset Notices' => 'foreach (WSAL_AbstractView::$AllowedNoticeNames as $name) delete_user_meta(get_current_user_id(), "wsal-notice-$name");',
87
  );
88
 
89
  public function HandleError($code, $message, $filename = 'unknown', $lineno = 0){
classes/Views/Settings.php CHANGED
@@ -43,9 +43,9 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
43
 
44
  protected function Save(){
45
  check_admin_referer('wsal-settings');
46
- $this->_plugin->settings->SetPruningDateEnabled(isset($_REQUEST['PruneByDate']));
47
  $this->_plugin->settings->SetPruningDate($_REQUEST['PruningDate']);
48
- $this->_plugin->settings->SetPruningLimitEnabled(isset($_REQUEST['PruneByLimit']));
49
  $this->_plugin->settings->SetPruningLimit($_REQUEST['PruningLimit']);
50
  $this->_plugin->settings->SetWidgetsEnabled($_REQUEST['EnableDashboardWidgets']);
51
  $this->_plugin->settings->SetAllowedPluginViewers(isset($_REQUEST['Viewers']) ? $_REQUEST['Viewers'] : array());
@@ -97,28 +97,36 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
97
  <tr>
98
  <th><label for="delete1"><?php _e('Security Alerts Pruning', 'wp-security-audit-log'); ?></label></th>
99
  <td>
 
 
 
 
 
 
 
 
100
  <fieldset>
101
  <?php $text = __('(eg: 1 month)', 'wp-security-audit-log'); ?>
102
  <?php $nbld = $this->_plugin->settings->IsPruningDateEnabled(); ?>
103
  <label for="delete1">
104
- <input type="checkbox" id="delete1" name="PruneByDate" value="1" <?php if($nbld)echo 'checked="checked"'; ?>
105
- onchange="jQuery('#PruningDate').attr('readonly', !checked);"/>
106
  <?php echo __('Delete alerts older than', 'wp-security-audit-log'); ?>
107
  </label>
108
- <input type="text" id="PruningDate" name="PruningDate" placeholder="<?php echo $text; ?>" <?php if(!$nbld)echo 'readonly="readonly"'; ?>
109
- value="<?php echo esc_attr($this->_plugin->settings->GetPruningDate()); ?>"/>
 
110
  <span> <?php echo $text; ?></span>
111
  </fieldset>
112
  <fieldset>
113
  <?php $text = __('(eg: 80)', 'wp-security-audit-log'); ?>
114
  <?php $nbld = $this->_plugin->settings->IsPruningLimitEnabled(); ?>
115
  <label for="delete2">
116
- <input type="checkbox" id="delete2" name="PruneByLimit" value="1" <?php if($nbld)echo 'checked="checked"'; ?>
117
- onchange="jQuery('#PruningLimit').attr('readonly', !checked);"/>
118
  <?php echo __('Keep up to', 'wp-security-audit-log'); ?>
119
  </label>
120
- <input type="text" id="PruningLimit" name="PruningLimit" placeholder="<?php echo $text;?>" <?php if(!$nbld)echo 'readonly="readonly"'; ?>
121
- value="<?php echo esc_attr($this->_plugin->settings->GetPruningLimit()); ?>"/>
 
122
  <?php echo __('alerts', 'wp-security-audit-log'); ?>
123
  <span><?php echo $text; ?></span>
124
  </fieldset>
43
 
44
  protected function Save(){
45
  check_admin_referer('wsal-settings');
46
+ $this->_plugin->settings->SetPruningDateEnabled($_REQUEST['PruneBy'] == 'date');
47
  $this->_plugin->settings->SetPruningDate($_REQUEST['PruningDate']);
48
+ $this->_plugin->settings->SetPruningLimitEnabled($_REQUEST['PruneBy'] == 'limit');
49
  $this->_plugin->settings->SetPruningLimit($_REQUEST['PruningLimit']);
50
  $this->_plugin->settings->SetWidgetsEnabled($_REQUEST['EnableDashboardWidgets']);
51
  $this->_plugin->settings->SetAllowedPluginViewers(isset($_REQUEST['Viewers']) ? $_REQUEST['Viewers'] : array());
97
  <tr>
98
  <th><label for="delete1"><?php _e('Security Alerts Pruning', 'wp-security-audit-log'); ?></label></th>
99
  <td>
100
+ <fieldset>
101
+ <?php $text = __('(eg: 1 month)', 'wp-security-audit-log'); ?>
102
+ <?php $nbld = !($this->_plugin->settings->IsPruningDateEnabled() || $this->_plugin->settings->IsPruningLimitEnabled()); ?>
103
+ <label for="delete0">
104
+ <input type="radio" id="delete0" name="PruneBy" value="" <?php if($nbld)echo 'checked="checked"'; ?>/>
105
+ <?php echo __('None', 'wp-security-audit-log'); ?>
106
+ </label>
107
+ </fieldset>
108
  <fieldset>
109
  <?php $text = __('(eg: 1 month)', 'wp-security-audit-log'); ?>
110
  <?php $nbld = $this->_plugin->settings->IsPruningDateEnabled(); ?>
111
  <label for="delete1">
112
+ <input type="radio" id="delete1" name="PruneBy" value="date" <?php if($nbld)echo 'checked="checked"'; ?>/>
 
113
  <?php echo __('Delete alerts older than', 'wp-security-audit-log'); ?>
114
  </label>
115
+ <input type="text" id="PruningDate" name="PruningDate" placeholder="<?php echo $text; ?>"
116
+ value="<?php echo esc_attr($this->_plugin->settings->GetPruningDate()); ?>"
117
+ onfocus="jQuery('#delete1').attr('checked', true);"/>
118
  <span> <?php echo $text; ?></span>
119
  </fieldset>
120
  <fieldset>
121
  <?php $text = __('(eg: 80)', 'wp-security-audit-log'); ?>
122
  <?php $nbld = $this->_plugin->settings->IsPruningLimitEnabled(); ?>
123
  <label for="delete2">
124
+ <input type="radio" id="delete2" name="PruneBy" value="limit" <?php if($nbld)echo 'checked="checked"'; ?>/>
 
125
  <?php echo __('Keep up to', 'wp-security-audit-log'); ?>
126
  </label>
127
+ <input type="text" id="PruningLimit" name="PruningLimit" placeholder="<?php echo $text;?>"
128
+ value="<?php echo esc_attr($this->_plugin->settings->GetPruningLimit()); ?>"
129
+ onfocus="jQuery('#delete2').attr('checked', true);"/>
130
  <?php echo __('alerts', 'wp-security-audit-log'); ?>
131
  <span><?php echo $text; ?></span>
132
  </fieldset>
css/install-error.css CHANGED
@@ -1,41 +1,41 @@
1
- .warn-icon-tri {
2
- top: 5px;
3
- left: 5px;
4
- position: absolute;
5
- border-left: 16px solid #FFF;
6
- border-right: 16px solid #FFF;
7
- border-bottom: 28px solid #C33;
8
- height: 3px;
9
- width: 4px
10
- }
11
-
12
- .warn-icon-chr {
13
- top: 8px;
14
- left: 18px;
15
- position: absolute;
16
- color: #FFF;
17
- font: 26px Georgia;
18
- }
19
-
20
- .warn-icon-cir {
21
- top: 2px;
22
- left: 0px;
23
- position: absolute;
24
- overflow: hidden;
25
- border: 6px solid #FFF;
26
- border-radius: 32px;
27
- width: 34px;
28
- height: 34px;
29
- }
30
-
31
- .warn-wrap {
32
- position: relative;
33
- color: #A00;
34
- font: 14px Arial;
35
- padding: 6px 48px;
36
- }
37
-
38
- .warn-wrap a,
39
- .warn-wrap a:hover {
40
- color: #F56;
41
- }
1
+ .warn-icon-tri {
2
+ top: 5px;
3
+ left: 5px;
4
+ position: absolute;
5
+ border-left: 16px solid #FFF;
6
+ border-right: 16px solid #FFF;
7
+ border-bottom: 28px solid #C33;
8
+ height: 3px;
9
+ width: 4px
10
+ }
11
+
12
+ .warn-icon-chr {
13
+ top: 8px;
14
+ left: 18px;
15
+ position: absolute;
16
+ color: #FFF;
17
+ font: 26px Georgia;
18
+ }
19
+
20
+ .warn-icon-cir {
21
+ top: 2px;
22
+ left: 0px;
23
+ position: absolute;
24
+ overflow: hidden;
25
+ border: 6px solid #FFF;
26
+ border-radius: 32px;
27
+ width: 34px;
28
+ height: 34px;
29
+ }
30
+
31
+ .warn-wrap {
32
+ position: relative;
33
+ color: #A00;
34
+ font: 14px Arial;
35
+ padding: 6px 48px;
36
+ }
37
+
38
+ .warn-wrap a,
39
+ .warn-wrap a:hover {
40
+ color: #F56;
41
+ }
css/settings.css CHANGED
@@ -1,39 +1,39 @@
1
- .sectoken-user,
2
- .sectoken-role,
3
- .sectoken-other {
4
- display: inline-block;
5
- border-width: 1px;
6
- border-style: solid;
7
- padding: 2px 4px;
8
- margin: 2px 0 0 2px;
9
- border-radius: 3px;
10
- cursor: default;
11
- }
12
-
13
- .sectoken-user a,
14
- .sectoken-role a,
15
- .sectoken-other a {
16
- text-decoration: none;
17
- font-size: 12px;
18
- font-weight: bold;
19
- color: #FFF;
20
- margin-left: 2px;
21
- background: #BBB;
22
- border-radius: 25px;
23
- height: 14px;
24
- display: inline-block;
25
- width: 14px;
26
- text-align: center;
27
- line-height: 16px;
28
- }
29
-
30
- .sectoken-user a:hover,
31
- .sectoken-role a:hover,
32
- .sectoken-other a:hover {
33
- background: #FB9;
34
- }
35
-
36
- .sectoken-user { background: #EFF; border-color: #5BE; }
37
- .sectoken-role { background: #EFE; border-color: #5B5; }
38
- .sectoken-other { background: #FFE; border-color: #ED5; }
39
- .sectoken-del { background: #FEE; border-color: #EBB; }
1
+ .sectoken-user,
2
+ .sectoken-role,
3
+ .sectoken-other {
4
+ display: inline-block;
5
+ border-width: 1px;
6
+ border-style: solid;
7
+ padding: 2px 4px;
8
+ margin: 2px 0 0 2px;
9
+ border-radius: 3px;
10
+ cursor: default;
11
+ }
12
+
13
+ .sectoken-user a,
14
+ .sectoken-role a,
15
+ .sectoken-other a {
16
+ text-decoration: none;
17
+ font-size: 12px;
18
+ font-weight: bold;
19
+ color: #FFF;
20
+ margin-left: 2px;
21
+ background: #BBB;
22
+ border-radius: 25px;
23
+ height: 14px;
24
+ display: inline-block;
25
+ width: 14px;
26
+ text-align: center;
27
+ line-height: 16px;
28
+ }
29
+
30
+ .sectoken-user a:hover,
31
+ .sectoken-role a:hover,
32
+ .sectoken-other a:hover {
33
+ background: #FB9;
34
+ }
35
+
36
+ .sectoken-user { background: #EFF; border-color: #5BE; }
37
+ .sectoken-role { background: #EFE; border-color: #5B5; }
38
+ .sectoken-other { background: #FFE; border-color: #ED5; }
39
+ .sectoken-del { background: #FEE; border-color: #EBB; }
js/auditlog.js CHANGED
@@ -1,115 +1,135 @@
1
- var WsalData;
2
-
3
- window['WsalAuditLogRefreshed'] = function(){};
4
-
5
- function WsalAuditLogInit(_WsalData){
6
- WsalData = _WsalData;
7
- var WsalTkn = WsalData.autorefresh.token;
8
-
9
- // list refresher
10
- var WsalAjx = null;
11
- var WsalChk = function(){
12
- if(WsalAjx)WsalAjx.abort();
13
- WsalAjx = jQuery.post(WsalData.ajaxurl, {
14
- action: 'AjaxRefresh',
15
- logcount: WsalTkn
16
- }, function(data){
17
- WsalAjx = null;
18
- if(data && data !== 'false'){
19
- WsalTkn = data;
20
- jQuery('#audit-log-viewer').load(
21
- location.href + ' #audit-log-viewer-content',
22
- window['WsalAuditLogRefreshed']
23
- );
24
- }
25
- WsalChk();
26
- });
27
- };
28
- if(WsalData.autorefresh.enabled){
29
- setInterval(WsalChk, 40000);
30
- WsalChk();
31
- }
32
-
33
- WsalSsasInit();
34
- }
35
-
36
- var WsalIppsPrev;
37
-
38
- function WsalIppsFocus(value){
39
- WsalIppsPrev = value;
40
- }
41
-
42
- function WsalIppsChange(value){
43
- if(value === ''){
44
- value = window.prompt(WsalData.tr8n.numofitems, WsalIppsPrev);
45
- if(value === null || value === WsalIppsPrev)return this.value = WsalIppsPrev; // operation canceled
46
- }
47
- jQuery('select.wsal-ipps').attr('disabled', true);
48
- jQuery.post(WsalData.ajaxurl, {
49
- action: 'AjaxSetIpp',
50
- count: value
51
- }, function(){
52
- location.reload();
53
- });
54
- }
55
-
56
- function WsalSsasInit(){
57
- var SsasAjx = null;
58
- var SsasInps = jQuery("input.wsal-ssas");
59
- SsasInps.after('<div class="wsal-ssas-dd" style="display: none;"/>');
60
- SsasInps.click(function(){
61
- jQuery(this).select();
62
- });
63
- SsasInps.keyup(function(){
64
- var SsasInp = jQuery(this);
65
- var SsasDiv = SsasInp.next();
66
- var SsasVal = SsasInp.val();
67
- if(SsasAjx)SsasAjx.abort();
68
- SsasInp.removeClass('loading');
69
-
70
- // do a new search
71
- if(SsasInp.attr('data-oldvalue') !== SsasVal && SsasVal.length > 2){
72
- SsasInp.addClass('loading');
73
- SsasAjx = jQuery.post(WsalData.ajaxurl, {
74
- action: 'AjaxSearchSite',
75
- search: SsasVal
76
- }, function(data){
77
- if(SsasAjx)SsasAjx = null;
78
- SsasInp.removeClass('loading');
79
- SsasDiv.hide();
80
- SsasDiv.html('');
81
- if(data && data.length){
82
- var SsasReg = new RegExp(SsasVal.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, '\\$1'), 'gi');
83
- for (var i = 0; i < data.length; i++){
84
- var link = jQuery('<a href="javascript:;" onclick="WsalSsasChange(' + data[i].blog_id + ')"/>')
85
- .text(data[i].blogname + ' (' + data[i].domain + ')');
86
- link.html(link.text().replace(SsasReg, '<u>$&</u>'));
87
- SsasDiv.append(link);
88
- }
89
- }else{
90
- SsasDiv.append(jQuery('<span/>').text(WsalData.tr8n.searchnone));
91
- }
92
- SsasDiv.prepend(jQuery('<a href="javascript:;" onclick="WsalSsasChange(0)" class="allsites"/>').text(WsalData.tr8n.searchback));
93
- SsasDiv.show();
94
- }, 'json');
95
- SsasInp.attr('data-oldvalue', SsasVal);
96
- }
97
-
98
- // handle keys
99
- });
100
- SsasInps.blur(function(){
101
- setTimeout(function(){
102
- var SsasInp = jQuery(this);
103
- var SsasDiv = SsasInp.next();
104
- SsasInp.attr('data-oldvalue', '');
105
- SsasDiv.hide();
106
- }, 200);
107
- });
108
- }
109
-
110
- function WsalSsasChange(value){
111
- jQuery('div.wsal-ssas-dd').hide();
112
- jQuery('input.wsal-ssas').attr('disabled', true);
113
- jQuery('#wsal-cbid').val(value);
114
- jQuery('#audit-log-viewer').submit();
115
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var WsalData;
2
+
3
+ window['WsalAuditLogRefreshed'] = function(){
4
+ // fix pagination links causing form params to get lost
5
+ jQuery('span.pagination-links a').click(function(ev){
6
+ ev.preventDefault();
7
+ var deparam = function(url){
8
+ var obj = {};
9
+ var pairs = url.split('&');
10
+ for(var i in pairs){
11
+ var split = pairs[i].split('=');
12
+ obj[decodeURIComponent(split[0])] = decodeURIComponent(split[1]);
13
+ }
14
+ return obj;
15
+ };
16
+ var paged = deparam(this.href).paged;
17
+ if (typeof paged === 'undefined') paged = 1;
18
+ jQuery('#audit-log-viewer').append(
19
+ jQuery('<input type="hidden" name="paged"/>').val(paged)
20
+ ).submit();
21
+ });
22
+ };
23
+
24
+ function WsalAuditLogInit(_WsalData){
25
+ WsalData = _WsalData;
26
+ var WsalTkn = WsalData.autorefresh.token;
27
+
28
+ // list refresher
29
+ var WsalAjx = null;
30
+ var WsalChk = function(){
31
+ if(WsalAjx)WsalAjx.abort();
32
+ WsalAjx = jQuery.post(WsalData.ajaxurl, {
33
+ action: 'AjaxRefresh',
34
+ logcount: WsalTkn
35
+ }, function(data){
36
+ WsalAjx = null;
37
+ if(data && data !== 'false'){
38
+ WsalTkn = data;
39
+ jQuery('#audit-log-viewer').load(
40
+ location.href + ' #audit-log-viewer-content',
41
+ window['WsalAuditLogRefreshed']
42
+ );
43
+ }
44
+ WsalChk();
45
+ });
46
+ };
47
+ if(WsalData.autorefresh.enabled){
48
+ setInterval(WsalChk, 40000);
49
+ WsalChk();
50
+ }
51
+
52
+ WsalSsasInit();
53
+ }
54
+
55
+ var WsalIppsPrev;
56
+
57
+ function WsalIppsFocus(value){
58
+ WsalIppsPrev = value;
59
+ }
60
+
61
+ function WsalIppsChange(value){
62
+ if(value === ''){
63
+ value = window.prompt(WsalData.tr8n.numofitems, WsalIppsPrev);
64
+ if(value === null || value === WsalIppsPrev)return this.value = WsalIppsPrev; // operation canceled
65
+ }
66
+ jQuery('select.wsal-ipps').attr('disabled', true);
67
+ jQuery.post(WsalData.ajaxurl, {
68
+ action: 'AjaxSetIpp',
69
+ count: value
70
+ }, function(){
71
+ location.reload();
72
+ });
73
+ }
74
+
75
+ function WsalSsasInit(){
76
+ var SsasAjx = null;
77
+ var SsasInps = jQuery("input.wsal-ssas");
78
+ SsasInps.after('<div class="wsal-ssas-dd" style="display: none;"/>');
79
+ SsasInps.click(function(){
80
+ jQuery(this).select();
81
+ });
82
+ window['WsalAuditLogRefreshed']();
83
+ SsasInps.keyup(function(){
84
+ var SsasInp = jQuery(this);
85
+ var SsasDiv = SsasInp.next();
86
+ var SsasVal = SsasInp.val();
87
+ if(SsasAjx)SsasAjx.abort();
88
+ SsasInp.removeClass('loading');
89
+
90
+ // do a new search
91
+ if(SsasInp.attr('data-oldvalue') !== SsasVal && SsasVal.length > 2){
92
+ SsasInp.addClass('loading');
93
+ SsasAjx = jQuery.post(WsalData.ajaxurl, {
94
+ action: 'AjaxSearchSite',
95
+ search: SsasVal
96
+ }, function(data){
97
+ if(SsasAjx)SsasAjx = null;
98
+ SsasInp.removeClass('loading');
99
+ SsasDiv.hide();
100
+ SsasDiv.html('');
101
+ if(data && data.length){
102
+ var SsasReg = new RegExp(SsasVal.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, '\\$1'), 'gi');
103
+ for (var i = 0; i < data.length; i++){
104
+ var link = jQuery('<a href="javascript:;" onclick="WsalSsasChange(' + data[i].blog_id + ')"/>')
105
+ .text(data[i].blogname + ' (' + data[i].domain + ')');
106
+ link.html(link.text().replace(SsasReg, '<u>$&</u>'));
107
+ SsasDiv.append(link);
108
+ }
109
+ }else{
110
+ SsasDiv.append(jQuery('<span/>').text(WsalData.tr8n.searchnone));
111
+ }
112
+ SsasDiv.prepend(jQuery('<a href="javascript:;" onclick="WsalSsasChange(0)" class="allsites"/>').text(WsalData.tr8n.searchback));
113
+ SsasDiv.show();
114
+ }, 'json');
115
+ SsasInp.attr('data-oldvalue', SsasVal);
116
+ }
117
+
118
+ // handle keys
119
+ });
120
+ SsasInps.blur(function(){
121
+ setTimeout(function(){
122
+ var SsasInp = jQuery(this);
123
+ var SsasDiv = SsasInp.next();
124
+ SsasInp.attr('data-oldvalue', '');
125
+ SsasDiv.hide();
126
+ }, 200);
127
+ });
128
+ }
129
+
130
+ function WsalSsasChange(value){
131
+ jQuery('div.wsal-ssas-dd').hide();
132
+ jQuery('input.wsal-ssas').attr('disabled', true);
133
+ jQuery('#wsal-cbid').val(value);
134
+ jQuery('#audit-log-viewer').submit();
135
+ }
js/common.js ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ jQuery(document).ready(function(){
3
+ jQuery('a.wsal-dismiss-notification').click(function(){
4
+ var nfe = jQuery(this).parents('div:first');
5
+ var nfn = nfe.attr('data-notice-name');
6
+ jQuery.ajax({
7
+ type: 'POST',
8
+ url: ajaxurl,
9
+ async: false,
10
+ data: { action: 'AjaxDismissNotice', notice: nfn }
11
+ });
12
+ nfe.fadeOut();
13
+ });
14
+ });
js/nice_r.js CHANGED
@@ -1,12 +1,12 @@
1
- function nice_r_toggle(pfx, id){
2
- var el = document.getElementById(pfx+'_v'+id);
3
- if(el){
4
- if(el.style.display==='block'){
5
- el.style.display = 'none';
6
- document.getElementById(pfx+'_a'+id).innerHTML = '&#9658;';
7
- }else{
8
- el.style.display = 'block';
9
- document.getElementById(pfx+'_a'+id).innerHTML = '&#9660;';
10
- }
11
- }
12
  }
1
+ function nice_r_toggle(pfx, id){
2
+ var el = document.getElementById(pfx+'_v'+id);
3
+ if(el){
4
+ if(el.style.display==='block'){
5
+ el.style.display = 'none';
6
+ document.getElementById(pfx+'_a'+id).innerHTML = '&#9658;';
7
+ }else{
8
+ el.style.display = 'block';
9
+ document.getElementById(pfx+'_a'+id).innerHTML = '&#9660;';
10
+ }
11
+ }
12
  }
js/settings.js CHANGED
@@ -1,49 +1,49 @@
1
- jQuery(document).ready(function(){
2
- var RemoveSecToken = function(){
3
- var $this = jQuery(this).parents('span:first');
4
- $this.addClass('sectoken-del').fadeOut('fast', function(){
5
- $this.remove();
6
- });
7
- };
8
-
9
- jQuery('#ViewerQueryBox, #EditorQueryBox').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').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);
27
- if(data==='other' && !confirm('The specified token is not a user nor a role, do you still want to add it?'))return;
28
- jQuery('#'+type+'QueryBox').val('');
29
- jQuery('#'+type+'List').append(jQuery('<span class="sectoken-'+data+'"/>').text(value).append(
30
- jQuery('<input type="hidden" name="'+type+'s[]"/>').val(value),
31
- jQuery('<a href="javascript:;" title="Remove">&times;</a>').click(RemoveSecToken)
32
- ));
33
- });
34
- });
35
-
36
- jQuery('#ViewerList>span>a, #EditorList>span>a').click(RemoveSecToken);
37
-
38
- jQuery('#RestrictAdmins').change(function(){
39
- var user = jQuery('#RestrictAdminsDefaultUser').val();
40
- var fltr = function() { return this.value === user; };
41
- if (this.checked && jQuery('#EditorList input').filter(fltr).length === 0) {
42
- jQuery('#EditorList').append(
43
- jQuery('<span class="sectoken-user"/>').text(user)
44
- .prepend(jQuery('<input type="hidden" name="Editors[]"/>').val(user))
45
- .append(jQuery('<a href="javascript:;" title="Remove">&times;</a>').click(RemoveSecToken))
46
- );
47
- }
48
- });
49
  });
1
+ jQuery(document).ready(function(){
2
+ var RemoveSecToken = function(){
3
+ var $this = jQuery(this).parents('span:first');
4
+ $this.addClass('sectoken-del').fadeOut('fast', function(){
5
+ $this.remove();
6
+ });
7
+ };
8
+
9
+ jQuery('#ViewerQueryBox, #EditorQueryBox').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').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);
27
+ if(data==='other' && !confirm('The specified token is not a user nor a role, do you still want to add it?'))return;
28
+ jQuery('#'+type+'QueryBox').val('');
29
+ jQuery('#'+type+'List').append(jQuery('<span class="sectoken-'+data+'"/>').text(value).append(
30
+ jQuery('<input type="hidden" name="'+type+'s[]"/>').val(value),
31
+ jQuery('<a href="javascript:;" title="Remove">&times;</a>').click(RemoveSecToken)
32
+ ));
33
+ });
34
+ });
35
+
36
+ jQuery('#ViewerList>span>a, #EditorList>span>a').click(RemoveSecToken);
37
+
38
+ jQuery('#RestrictAdmins').change(function(){
39
+ var user = jQuery('#RestrictAdminsDefaultUser').val();
40
+ var fltr = function() { return this.value === user; };
41
+ if (this.checked && jQuery('#EditorList input').filter(fltr).length === 0) {
42
+ jQuery('#EditorList').append(
43
+ jQuery('<span class="sectoken-user"/>').text(user)
44
+ .prepend(jQuery('<input type="hidden" name="Editors[]"/>').val(user))
45
+ .append(jQuery('<a href="javascript:;" title="Remove">&times;</a>').click(RemoveSecToken))
46
+ );
47
+ }
48
+ });
49
  });
languages/wp-security-audit-log-de_DE.mo CHANGED
Binary file
languages/wp-security-audit-log-it_IT.mo CHANGED
Binary file
languages/wp-security-audit-log.pot CHANGED
@@ -2,9 +2,9 @@
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 1.2.7\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/wp-security-audit-log\n"
7
- "POT-Creation-Date: 2014-09-26 09:43:13+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -12,6 +12,74 @@ msgstr ""
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  #: classes/Sensors/Content.php:326 classes/Sensors/Content.php:334
16
  msgid "Password Protected"
17
  msgstr ""
@@ -105,25 +173,25 @@ msgstr ""
105
  msgid "and much more&hellip;"
106
  msgstr ""
107
 
108
- #: classes/Views/About.php:56 classes/Views/Help.php:80
109
  msgid "WP Password Policy Manager"
110
  msgstr ""
111
 
112
- #: classes/Views/About.php:59 classes/Views/Help.php:83
113
  msgid ""
114
  "Easily configure WordPress password policies and ensure users use strong "
115
  "passwords with our plugin WP Password Policy Manager."
116
  msgstr ""
117
 
118
- #: classes/Views/About.php:61 classes/Views/Help.php:85
119
  msgid "Download"
120
  msgstr ""
121
 
122
- #: classes/Views/About.php:65 classes/Views/Help.php:89
123
  msgid "WP Security Audit Log in your Language!"
124
  msgstr ""
125
 
126
- #: classes/Views/About.php:67 classes/Views/Help.php:91
127
  msgid ""
128
  "If you are interested in translating our plugin please drop us an email on"
129
  msgstr ""
@@ -136,131 +204,180 @@ msgstr ""
136
  msgid "Professional WordPress security services provided by WP White Security"
137
  msgstr ""
138
 
139
- #: classes/Views/AuditLog.php:22 classes/Views/AuditLog.php:32
 
 
 
 
 
 
 
 
 
 
 
 
140
  msgid "Audit Log Viewer"
141
  msgstr ""
142
 
143
- #: classes/Views/AuditLog.php:46 classes/Views/Licensing.php:34
144
  #: classes/Views/Settings.php:80 classes/Views/ToggleAlerts.php:29
145
  msgid "You do not have sufficient permissions to access this page."
146
  msgstr ""
147
 
148
- #: classes/Views/AuditLog.php:66
149
  msgid "Please enter the number of alerts you would like to see on one page:"
150
  msgstr ""
151
 
152
- #: classes/Views/AuditLog.php:67
153
- msgid "All Sites"
154
  msgstr ""
155
 
156
- #: classes/Views/AuditLog.php:68
157
- msgid "No Results"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
  msgstr ""
159
 
160
  #: classes/Views/Help.php:6 classes/Views/Help.php:14
161
- #: classes/Views/Help.php:25
162
  msgid "Help"
163
  msgstr ""
164
 
165
- #: classes/Views/Help.php:28
166
  msgid "Plugin Support"
167
  msgstr ""
168
 
169
- #: classes/Views/Help.php:30
170
  msgid ""
171
  "Have you encountered or noticed any issues while using WP Security Audit Log "
172
  "plugin?"
173
  msgstr ""
174
 
175
- #: classes/Views/Help.php:31
176
  msgid ""
177
  "Or you want to report something to us? Click any of the options below to "
178
  "post on the plugin's forum or contact our support directly."
179
  msgstr ""
180
 
181
- #: classes/Views/Help.php:33
182
  msgid "Free Support Forum"
183
  msgstr ""
184
 
185
- #: classes/Views/Help.php:35
186
  msgid "Free Support Email"
187
  msgstr ""
188
 
189
- #: classes/Views/Help.php:40
190
  msgid "Plugin Documentation"
191
  msgstr ""
192
 
193
- #: classes/Views/Help.php:42
194
  msgid ""
195
  "For more detailed information about WP Security Audit Log you can visit the "
196
  "official plugin page."
197
  msgstr ""
198
 
199
- #: classes/Views/Help.php:43
200
  msgid ""
201
  "You can also visit the official list of WordPress Security Alerts for more "
202
  "information about all of the activity you can monitor with WP Security Audit "
203
  "Log."
204
  msgstr ""
205
 
206
- #: classes/Views/Help.php:45
207
  msgid "Official Plugin Page"
208
  msgstr ""
209
 
210
- #: classes/Views/Help.php:47
211
  msgid "List of WordPress Security Alerts"
212
  msgstr ""
213
 
214
- #: classes/Views/Help.php:52
215
  msgid "Need Help Securing WordPress?"
216
  msgstr ""
217
 
218
- #: classes/Views/Help.php:54
219
  msgid "Is your WordPress website hackable?"
220
  msgstr ""
221
 
222
- #: classes/Views/Help.php:55
223
  msgid ""
224
  "If you are not sure contact our WordPress security professionals to audit "
225
  "your WordPress or to simply secure your WordPress website."
226
  msgstr ""
227
 
228
- #: classes/Views/Help.php:56
229
  msgid "Click on any of the below service buttons for more information."
230
  msgstr ""
231
 
232
- #: classes/Views/Help.php:58
233
  msgid "WordPress Security Hardening"
234
  msgstr ""
235
 
236
- #: classes/Views/Help.php:60
237
  msgid "WordPress Security Audit"
238
  msgstr ""
239
 
240
- #: classes/Views/Help.php:65
241
  msgid "WordPress Security Readings"
242
  msgstr ""
243
 
244
- #: classes/Views/Help.php:67
245
  msgid "New to WordPress security?"
246
  msgstr ""
247
 
248
- #: classes/Views/Help.php:68
249
  msgid "Do not know from where to start or which is the best services for you?"
250
  msgstr ""
251
 
252
- #: classes/Views/Help.php:69
253
  msgid ""
254
  "Visit our WordPress security blog or the WordPress Security category "
255
  "directly for more information and a number of tips and tricks about "
256
  "WordPress security."
257
  msgstr ""
258
 
259
- #: classes/Views/Help.php:71
260
  msgid "WP White Security Blog"
261
  msgstr ""
262
 
263
- #: classes/Views/Help.php:73
264
  msgid "WordPress Security Category"
265
  msgstr ""
266
 
@@ -291,11 +408,11 @@ msgid "Inactive"
291
  msgstr ""
292
 
293
  #: classes/Views/Sandbox.php:11 classes/Views/Sandbox.php:19
294
- #: classes/Views/Settings.php:264
295
  msgid "Sandbox"
296
  msgstr ""
297
 
298
- #: classes/Views/Sandbox.php:197
299
  msgid "Ready."
300
  msgstr ""
301
 
@@ -307,75 +424,79 @@ msgstr ""
307
  msgid "Security Alerts Pruning"
308
  msgstr ""
309
 
310
- #: classes/Views/Settings.php:101
311
  msgid "(eg: 1 month)"
312
  msgstr ""
313
 
314
- #: classes/Views/Settings.php:106
315
- msgid "Delete alerts older than"
316
  msgstr ""
317
 
318
  #: classes/Views/Settings.php:113
 
 
 
 
319
  msgid "(eg: 80)"
320
  msgstr ""
321
 
322
- #: classes/Views/Settings.php:118
323
  msgid "Keep up to"
324
  msgstr ""
325
 
326
- #: classes/Views/Settings.php:122
327
  msgid "alerts"
328
  msgstr ""
329
 
330
- #: classes/Views/Settings.php:126
331
  msgid "Next Scheduled Cleanup is in "
332
  msgstr ""
333
 
334
- #: classes/Views/Settings.php:130
335
  msgid "(or %s)"
336
  msgstr ""
337
 
338
- #: classes/Views/Settings.php:131
339
  msgid "Run Manually"
340
  msgstr ""
341
 
342
- #: classes/Views/Settings.php:137
343
  msgid "Alerts Dashboard Widget"
344
  msgstr ""
345
 
346
- #: classes/Views/Settings.php:143
347
  msgid "On"
348
  msgstr ""
349
 
350
- #: classes/Views/Settings.php:148
351
  msgid "Off"
352
  msgstr ""
353
 
354
- #: classes/Views/Settings.php:153
355
  msgid "Display a dashboard widget with the latest %d security alerts."
356
  msgstr ""
357
 
358
- #: classes/Views/Settings.php:161
359
  msgid "Can View Alerts"
360
  msgstr ""
361
 
362
- #: classes/Views/Settings.php:168
363
  msgid "Users and Roles in this list can view the security alerts"
364
  msgstr ""
365
 
366
- #: classes/Views/Settings.php:183
367
  msgid "Can Manage Plugin"
368
  msgstr ""
369
 
370
- #: classes/Views/Settings.php:190
371
  msgid "Users and Roles in this list can manage the plugin settings"
372
  msgstr ""
373
 
374
- #: classes/Views/Settings.php:205
375
  msgid "Restrict Plugin Access"
376
  msgstr ""
377
 
378
- #: classes/Views/Settings.php:213
379
  msgid ""
380
  "By default all the administrators on this WordPress have access to manage "
381
  "this plugin.<br/>By enabling this option only the users specified in the two "
@@ -383,78 +504,78 @@ msgid ""
383
  "this plugin."
384
  msgstr ""
385
 
386
- #: classes/Views/Settings.php:220
387
  msgid "Refresh Audit View"
388
  msgstr ""
389
 
390
- #: classes/Views/Settings.php:226
391
  msgid "Automatic"
392
  msgstr ""
393
 
394
- #: classes/Views/Settings.php:228
395
  msgid "Refresh Audit View as soon as there are new events."
396
  msgstr ""
397
 
398
- #: classes/Views/Settings.php:232
399
  msgid "Manual"
400
  msgstr ""
401
 
402
- #: classes/Views/Settings.php:234
403
  msgid "Refresh Audit View only when page is reloaded."
404
  msgstr ""
405
 
406
- #: classes/Views/Settings.php:240
407
  msgid "Developer Options"
408
  msgstr ""
409
 
410
- #: classes/Views/Settings.php:248
411
  msgid ""
412
  "Only enable these options on testing, staging and development websites. "
413
  "Enabling any of the settings below on LIVE websites may cause unintended "
414
  "side-effects including degraded performance."
415
  msgstr ""
416
 
417
- #: classes/Views/Settings.php:252
418
  msgid "Data Inspector"
419
  msgstr ""
420
 
421
- #: classes/Views/Settings.php:253
422
  msgid "View data logged for each triggered alert."
423
  msgstr ""
424
 
425
- #: classes/Views/Settings.php:256
426
  msgid "PHP Errors"
427
  msgstr ""
428
 
429
- #: classes/Views/Settings.php:257
430
  msgid "Enables sensor for alerts generated from PHP."
431
  msgstr ""
432
 
433
- #: classes/Views/Settings.php:260
434
  msgid "Request Log"
435
  msgstr ""
436
 
437
- #: classes/Views/Settings.php:261
438
  msgid "Enables logging request to file."
439
  msgstr ""
440
 
441
- #: classes/Views/Settings.php:265
442
  msgid "Enables sandbox for testing PHP code."
443
  msgstr ""
444
 
445
- #: classes/Views/Settings.php:268
446
  msgid "Backtrace"
447
  msgstr ""
448
 
449
- #: classes/Views/Settings.php:269
450
  msgid "Log full backtrace for PHP-generated alerts."
451
  msgstr ""
452
 
453
- #: classes/Views/Settings.php:287
454
  msgid "Hide Plugin from Plugins Page"
455
  msgstr ""
456
 
457
- #: classes/Views/Settings.php:293
458
  msgid "Hide"
459
  msgstr ""
460
 
@@ -462,14 +583,6 @@ msgstr ""
462
  msgid "Enable/Disable Alerts"
463
  msgstr ""
464
 
465
- #: classes/Views/ToggleAlerts.php:69
466
- msgid "Code"
467
- msgstr ""
468
-
469
- #: classes/Views/ToggleAlerts.php:70
470
- msgid "Type"
471
- msgstr ""
472
-
473
  #: classes/Views/ToggleAlerts.php:71 classes/WidgetManager.php:38
474
  msgid "Description"
475
  msgstr ""
@@ -1521,7 +1634,7 @@ msgid ""
1521
  ">get_template_directory%"
1522
  msgstr ""
1523
 
1524
- #: wp-security-audit-log.php:169
1525
  msgid ""
1526
  "You are using a version of PHP that is older than %s, which is no longer "
1527
  "supported.<br/>Contact us on <a href=\"mailto:plugins@wpwhitesecurity.com"
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 1.2.8\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/wp-security-audit-log\n"
7
+ "POT-Creation-Date: 2014-10-20 10:29:58+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
 
15
+ #: classes/AuditLogListView.php:29
16
+ msgid "No events so far."
17
+ msgstr ""
18
+
19
+ #: classes/AuditLogListView.php:34
20
+ msgid "Other"
21
+ msgstr ""
22
+
23
+ #: classes/AuditLogListView.php:41
24
+ msgid "Show "
25
+ msgstr ""
26
+
27
+ #: classes/AuditLogListView.php:51
28
+ msgid " Items"
29
+ msgstr ""
30
+
31
+ #: classes/AuditLogListView.php:64 classes/Views/AuditLog.php:85
32
+ msgid "All Sites"
33
+ msgstr ""
34
+
35
+ #: classes/AuditLogListView.php:113 classes/Views/ToggleAlerts.php:69
36
+ msgid "Code"
37
+ msgstr ""
38
+
39
+ #: classes/AuditLogListView.php:114 classes/Views/ToggleAlerts.php:70
40
+ msgid "Type"
41
+ msgstr ""
42
+
43
+ #: classes/AuditLogListView.php:115
44
+ msgid "Date"
45
+ msgstr ""
46
+
47
+ #: classes/AuditLogListView.php:116
48
+ msgid "Username"
49
+ msgstr ""
50
+
51
+ #: classes/AuditLogListView.php:117
52
+ msgid "Source IP"
53
+ msgstr ""
54
+
55
+ #: classes/AuditLogListView.php:120
56
+ msgid "Site"
57
+ msgstr ""
58
+
59
+ #: classes/AuditLogListView.php:122
60
+ msgid "Message"
61
+ msgstr ""
62
+
63
+ #: classes/AuditLogListView.php:151
64
+ msgid "Click to toggle."
65
+ msgstr ""
66
+
67
+ #: classes/AuditLogListView.php:157
68
+ msgid "Unknown error code."
69
+ msgstr ""
70
+
71
+ #: classes/AuditLogListView.php:178 classes/AuditLogListView.php:181
72
+ msgid "Unknown"
73
+ msgstr ""
74
+
75
+ #: classes/AuditLogListView.php:182
76
+ msgid "System"
77
+ msgstr ""
78
+
79
+ #: classes/AuditLogListView.php:195
80
+ msgid "Alert Data Inspector"
81
+ msgstr ""
82
+
83
  #: classes/Sensors/Content.php:326 classes/Sensors/Content.php:334
84
  msgid "Password Protected"
85
  msgstr ""
173
  msgid "and much more&hellip;"
174
  msgstr ""
175
 
176
+ #: classes/Views/About.php:56 classes/Views/Help.php:79
177
  msgid "WP Password Policy Manager"
178
  msgstr ""
179
 
180
+ #: classes/Views/About.php:59 classes/Views/Help.php:82
181
  msgid ""
182
  "Easily configure WordPress password policies and ensure users use strong "
183
  "passwords with our plugin WP Password Policy Manager."
184
  msgstr ""
185
 
186
+ #: classes/Views/About.php:61 classes/Views/Help.php:84
187
  msgid "Download"
188
  msgstr ""
189
 
190
+ #: classes/Views/About.php:65 classes/Views/Help.php:88
191
  msgid "WP Security Audit Log in your Language!"
192
  msgstr ""
193
 
194
+ #: classes/Views/About.php:67 classes/Views/Help.php:90
195
  msgid ""
196
  "If you are interested in translating our plugin please drop us an email on"
197
  msgstr ""
204
  msgid "Professional WordPress security services provided by WP White Security"
205
  msgstr ""
206
 
207
+ #: classes/Views/AuditLog.php:25
208
+ msgid "Get notified instantly via email of important changes on your WordPress"
209
+ msgstr ""
210
+
211
+ #: classes/Views/AuditLog.php:28
212
+ msgid "Learn More"
213
+ msgstr ""
214
+
215
+ #: classes/Views/AuditLog.php:29
216
+ msgid "Dismiss this notice"
217
+ msgstr ""
218
+
219
+ #: classes/Views/AuditLog.php:40 classes/Views/AuditLog.php:50
220
  msgid "Audit Log Viewer"
221
  msgstr ""
222
 
223
+ #: classes/Views/AuditLog.php:64 classes/Views/Licensing.php:34
224
  #: classes/Views/Settings.php:80 classes/Views/ToggleAlerts.php:29
225
  msgid "You do not have sufficient permissions to access this page."
226
  msgstr ""
227
 
228
+ #: classes/Views/AuditLog.php:84
229
  msgid "Please enter the number of alerts you would like to see on one page:"
230
  msgstr ""
231
 
232
+ #: classes/Views/AuditLog.php:86
233
+ msgid "No Results"
234
  msgstr ""
235
 
236
+ #: classes/Views/Extensions.php:6
237
+ msgid "WP Security Audit Log Functionality Extensions"
238
+ msgstr ""
239
+
240
+ #: classes/Views/Extensions.php:14
241
+ msgid "Extensions"
242
+ msgstr ""
243
+
244
+ #: classes/Views/Extensions.php:27
245
+ msgid "Extend the functionality of your WP Security Audit Log plugin"
246
+ msgstr ""
247
+
248
+ #: classes/Views/Extensions.php:28
249
+ msgid ""
250
+ "Below is a list of extensions that allow you to extend the functionality of "
251
+ "WP Security Audit Log plugin for a much better auditing and monitoring "
252
+ "experience."
253
+ msgstr ""
254
+
255
+ #: classes/Views/Extensions.php:32
256
+ msgid "Notifications Extension"
257
+ msgstr ""
258
+
259
+ #: classes/Views/Extensions.php:33
260
+ msgid ""
261
+ "Get notified instantly via email when important changes are made on your "
262
+ "WordPress!"
263
+ msgstr ""
264
+
265
+ #: classes/Views/Extensions.php:34
266
+ msgid ""
267
+ "The Notifications Extension allows you to easily configure rules to receive "
268
+ "an email when there is a change on WordPress. You do not need manually "
269
+ "browse through the Audit Lock viewer anymore when looking for a specific "
270
+ "change and the good thing is that you will be instantly alerted when it "
271
+ "happens!"
272
+ msgstr ""
273
+
274
+ #: classes/Views/Extensions.php:35
275
+ msgid "More Information"
276
  msgstr ""
277
 
278
  #: classes/Views/Help.php:6 classes/Views/Help.php:14
 
279
  msgid "Help"
280
  msgstr ""
281
 
282
+ #: classes/Views/Help.php:27
283
  msgid "Plugin Support"
284
  msgstr ""
285
 
286
+ #: classes/Views/Help.php:29
287
  msgid ""
288
  "Have you encountered or noticed any issues while using WP Security Audit Log "
289
  "plugin?"
290
  msgstr ""
291
 
292
+ #: classes/Views/Help.php:30
293
  msgid ""
294
  "Or you want to report something to us? Click any of the options below to "
295
  "post on the plugin's forum or contact our support directly."
296
  msgstr ""
297
 
298
+ #: classes/Views/Help.php:32
299
  msgid "Free Support Forum"
300
  msgstr ""
301
 
302
+ #: classes/Views/Help.php:34
303
  msgid "Free Support Email"
304
  msgstr ""
305
 
306
+ #: classes/Views/Help.php:39
307
  msgid "Plugin Documentation"
308
  msgstr ""
309
 
310
+ #: classes/Views/Help.php:41
311
  msgid ""
312
  "For more detailed information about WP Security Audit Log you can visit the "
313
  "official plugin page."
314
  msgstr ""
315
 
316
+ #: classes/Views/Help.php:42
317
  msgid ""
318
  "You can also visit the official list of WordPress Security Alerts for more "
319
  "information about all of the activity you can monitor with WP Security Audit "
320
  "Log."
321
  msgstr ""
322
 
323
+ #: classes/Views/Help.php:44
324
  msgid "Official Plugin Page"
325
  msgstr ""
326
 
327
+ #: classes/Views/Help.php:46
328
  msgid "List of WordPress Security Alerts"
329
  msgstr ""
330
 
331
+ #: classes/Views/Help.php:51
332
  msgid "Need Help Securing WordPress?"
333
  msgstr ""
334
 
335
+ #: classes/Views/Help.php:53
336
  msgid "Is your WordPress website hackable?"
337
  msgstr ""
338
 
339
+ #: classes/Views/Help.php:54
340
  msgid ""
341
  "If you are not sure contact our WordPress security professionals to audit "
342
  "your WordPress or to simply secure your WordPress website."
343
  msgstr ""
344
 
345
+ #: classes/Views/Help.php:55
346
  msgid "Click on any of the below service buttons for more information."
347
  msgstr ""
348
 
349
+ #: classes/Views/Help.php:57
350
  msgid "WordPress Security Hardening"
351
  msgstr ""
352
 
353
+ #: classes/Views/Help.php:59
354
  msgid "WordPress Security Audit"
355
  msgstr ""
356
 
357
+ #: classes/Views/Help.php:64
358
  msgid "WordPress Security Readings"
359
  msgstr ""
360
 
361
+ #: classes/Views/Help.php:66
362
  msgid "New to WordPress security?"
363
  msgstr ""
364
 
365
+ #: classes/Views/Help.php:67
366
  msgid "Do not know from where to start or which is the best services for you?"
367
  msgstr ""
368
 
369
+ #: classes/Views/Help.php:68
370
  msgid ""
371
  "Visit our WordPress security blog or the WordPress Security category "
372
  "directly for more information and a number of tips and tricks about "
373
  "WordPress security."
374
  msgstr ""
375
 
376
+ #: classes/Views/Help.php:70
377
  msgid "WP White Security Blog"
378
  msgstr ""
379
 
380
+ #: classes/Views/Help.php:72
381
  msgid "WordPress Security Category"
382
  msgstr ""
383
 
408
  msgstr ""
409
 
410
  #: classes/Views/Sandbox.php:11 classes/Views/Sandbox.php:19
411
+ #: classes/Views/Settings.php:272
412
  msgid "Sandbox"
413
  msgstr ""
414
 
415
+ #: classes/Views/Sandbox.php:198
416
  msgid "Ready."
417
  msgstr ""
418
 
424
  msgid "Security Alerts Pruning"
425
  msgstr ""
426
 
427
+ #: classes/Views/Settings.php:101 classes/Views/Settings.php:109
428
  msgid "(eg: 1 month)"
429
  msgstr ""
430
 
431
+ #: classes/Views/Settings.php:105
432
+ msgid "None"
433
  msgstr ""
434
 
435
  #: classes/Views/Settings.php:113
436
+ msgid "Delete alerts older than"
437
+ msgstr ""
438
+
439
+ #: classes/Views/Settings.php:121
440
  msgid "(eg: 80)"
441
  msgstr ""
442
 
443
+ #: classes/Views/Settings.php:125
444
  msgid "Keep up to"
445
  msgstr ""
446
 
447
+ #: classes/Views/Settings.php:130
448
  msgid "alerts"
449
  msgstr ""
450
 
451
+ #: classes/Views/Settings.php:134
452
  msgid "Next Scheduled Cleanup is in "
453
  msgstr ""
454
 
455
+ #: classes/Views/Settings.php:138
456
  msgid "(or %s)"
457
  msgstr ""
458
 
459
+ #: classes/Views/Settings.php:139
460
  msgid "Run Manually"
461
  msgstr ""
462
 
463
+ #: classes/Views/Settings.php:145
464
  msgid "Alerts Dashboard Widget"
465
  msgstr ""
466
 
467
+ #: classes/Views/Settings.php:151
468
  msgid "On"
469
  msgstr ""
470
 
471
+ #: classes/Views/Settings.php:156
472
  msgid "Off"
473
  msgstr ""
474
 
475
+ #: classes/Views/Settings.php:161
476
  msgid "Display a dashboard widget with the latest %d security alerts."
477
  msgstr ""
478
 
479
+ #: classes/Views/Settings.php:169
480
  msgid "Can View Alerts"
481
  msgstr ""
482
 
483
+ #: classes/Views/Settings.php:176
484
  msgid "Users and Roles in this list can view the security alerts"
485
  msgstr ""
486
 
487
+ #: classes/Views/Settings.php:191
488
  msgid "Can Manage Plugin"
489
  msgstr ""
490
 
491
+ #: classes/Views/Settings.php:198
492
  msgid "Users and Roles in this list can manage the plugin settings"
493
  msgstr ""
494
 
495
+ #: classes/Views/Settings.php:213
496
  msgid "Restrict Plugin Access"
497
  msgstr ""
498
 
499
+ #: classes/Views/Settings.php:221
500
  msgid ""
501
  "By default all the administrators on this WordPress have access to manage "
502
  "this plugin.<br/>By enabling this option only the users specified in the two "
504
  "this plugin."
505
  msgstr ""
506
 
507
+ #: classes/Views/Settings.php:228
508
  msgid "Refresh Audit View"
509
  msgstr ""
510
 
511
+ #: classes/Views/Settings.php:234
512
  msgid "Automatic"
513
  msgstr ""
514
 
515
+ #: classes/Views/Settings.php:236
516
  msgid "Refresh Audit View as soon as there are new events."
517
  msgstr ""
518
 
519
+ #: classes/Views/Settings.php:240
520
  msgid "Manual"
521
  msgstr ""
522
 
523
+ #: classes/Views/Settings.php:242
524
  msgid "Refresh Audit View only when page is reloaded."
525
  msgstr ""
526
 
527
+ #: classes/Views/Settings.php:248
528
  msgid "Developer Options"
529
  msgstr ""
530
 
531
+ #: classes/Views/Settings.php:256
532
  msgid ""
533
  "Only enable these options on testing, staging and development websites. "
534
  "Enabling any of the settings below on LIVE websites may cause unintended "
535
  "side-effects including degraded performance."
536
  msgstr ""
537
 
538
+ #: classes/Views/Settings.php:260
539
  msgid "Data Inspector"
540
  msgstr ""
541
 
542
+ #: classes/Views/Settings.php:261
543
  msgid "View data logged for each triggered alert."
544
  msgstr ""
545
 
546
+ #: classes/Views/Settings.php:264
547
  msgid "PHP Errors"
548
  msgstr ""
549
 
550
+ #: classes/Views/Settings.php:265
551
  msgid "Enables sensor for alerts generated from PHP."
552
  msgstr ""
553
 
554
+ #: classes/Views/Settings.php:268
555
  msgid "Request Log"
556
  msgstr ""
557
 
558
+ #: classes/Views/Settings.php:269
559
  msgid "Enables logging request to file."
560
  msgstr ""
561
 
562
+ #: classes/Views/Settings.php:273
563
  msgid "Enables sandbox for testing PHP code."
564
  msgstr ""
565
 
566
+ #: classes/Views/Settings.php:276
567
  msgid "Backtrace"
568
  msgstr ""
569
 
570
+ #: classes/Views/Settings.php:277
571
  msgid "Log full backtrace for PHP-generated alerts."
572
  msgstr ""
573
 
574
+ #: classes/Views/Settings.php:295
575
  msgid "Hide Plugin from Plugins Page"
576
  msgstr ""
577
 
578
+ #: classes/Views/Settings.php:301
579
  msgid "Hide"
580
  msgstr ""
581
 
583
  msgid "Enable/Disable Alerts"
584
  msgstr ""
585
 
 
 
 
 
 
 
 
 
586
  #: classes/Views/ToggleAlerts.php:71 classes/WidgetManager.php:38
587
  msgid "Description"
588
  msgstr ""
1634
  ">get_template_directory%"
1635
  msgstr ""
1636
 
1637
+ #: wp-security-audit-log.php:193
1638
  msgid ""
1639
  "You are using a version of PHP that is older than %s, which is no longer "
1640
  "supported.<br/>Contact us on <a href=\"mailto:plugins@wpwhitesecurity.com"
readme.txt CHANGED
@@ -4,15 +4,22 @@ Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=payme
4
  Plugin URI: http://www.wpwhitesecurity.com/wordpress-security-plugins/wp-security-audit-log/
5
  License: GPLv3
6
  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
8
  Requires at least: 3.6
9
- Tested up to: 4
10
- Stable tag: 1.2.7
11
 
12
  Identify WordPress issues before they become a security problem by keeping an audit log of users and all of the under the hood WordPress activity.
13
 
14
  == Description ==
15
- Identify WordPress security issues before they become a security problem by keeping a security audit log of what is happening under the hood of your WordPress blog or website or your WordPress Multisite installation. WP Security Audit Log plugin is developed by WordPress Security Consultants and Professionals [WP White Security](http://www.wpwhitesecurity.com/wordpress-security-services/) and is the only WordPress monitoring and auditing plugin that works on both WordPress single site installations and [WordPress Multisite](http://www.wpwhitesecurity.com/wordpress-plugins/wp-security-audit-log-plugin-features-wordpress-multisite/).
 
 
 
 
 
 
 
16
 
17
  = Keep A WordPress Security Audit Log & Identify WordPress Security Issues =
18
  WP Security Audit Log keeps a log of everything happening on your WordPress blog or website and WordPress multisite network. By using WP Security Audit Log security plugin it is very easy to track suspicious user activity before it becomes a problem or a security issue. A security alert is generated by the plugin when:
@@ -50,6 +57,11 @@ If you own a multi user WordPress blog or website, or a WordPress multisite netw
50
 
51
  Refer to the complete list of [WordPress Security Audit Alerts](http://www.wpwhitesecurity.com/wordpress-security-plugins/wp-security-audit-log/security-audit-alerts-logs/) for more information on what other WordPress user activity can be monitored with the WP Security Audit Log WordPress plugin.
52
 
 
 
 
 
 
53
  = WP Security Audit Log for WordPress Multisite =
54
  WP Security Audit Log is the first tracking and audit WordPress security monitoring plugin that supports WordPress multisite network installations and can monitor activity on such WordPress multisite network installations.
55
 
@@ -70,10 +82,11 @@ NOTE: Developer options should NEVER be enabled on Live websites. They should on
70
  = Other Noteworthy Features =
71
  WP Security Audit Log plugin also has a number of features that make WordPress and WordPress multisite monitoring and auditing easier, such as:
72
 
 
73
  * Limit who can view the security alerts by users or roles
74
  * Limit who can manage the plugin by users or roles
75
  * Configurable WordPress dashboard widget highlighting the most recent critical activity
76
- * Configure WordPress security alerts purging by time or by number of alerts
77
  * User role is reported in alerts for a complete overview of what is happening
78
  * User avatar is reported in the alerts for better recognizability
79
  * Enable or disable any security alerts
@@ -131,6 +144,18 @@ Yes, WP Security Audit Log works on WordPress Multisite networks, i.e. it can mo
131
 
132
  == Changelog ==
133
 
 
 
 
 
 
 
 
 
 
 
 
 
134
  = 1.2.7 (2014-09-26) =
135
  * New Feature
136
  * New option "Restrict Plugin Access" that allows WordPress administrators to further restrict access to the plugin and the WordPress security alerts
@@ -200,7 +225,7 @@ Yes, WP Security Audit Log works on WordPress Multisite networks, i.e. it can mo
200
  * Italian translation available thanks to [Leonardo Musumeci](http://leonardomusumeci.net/)
201
 
202
  * Improvements
203
- * Added a warning to developer options
204
  * "Hidden" developer options from default settings; user has to click link to access developer settings
205
  * Backtrace logging now made optional from a developer setting
206
 
4
  Plugin URI: http://www.wpwhitesecurity.com/wordpress-security-plugins/wp-security-audit-log/
5
  License: GPLv3
6
  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
8
  Requires at least: 3.6
9
+ Tested up to: 4.0
10
+ Stable tag: 1.2.8
11
 
12
  Identify WordPress issues before they become a security problem by keeping an audit log of users and all of the under the hood WordPress activity.
13
 
14
  == Description ==
15
+ **Note: This plugin requires PHP 5.3 or higher to be activated because older versions of PHP are no longer maintained by PHP themselves, which make them prone to security issues. For more information or if you need assistance with your version of PHP please get in touch with us by using our [contact form](https://www.wpwhitesecurity.com/contact-wp-white-security/).**
16
+
17
+ Keep an audit log and track of everything that is happening on your WordPress and [WordPress multisite](http://www.wpwhitesecurity.com/wordpress-plugins/wp-security-audit-log-plugin-features-wordpress-multisite/) with WP Security Audit Log plugin to ensure user productivity and identify WordPress security issues before they become a security problem. WP Security Audit Log already helps thousands of WordPress administrators, owners and security professionals ensure the security of their websites and blogs. Ensure the security of your WordPress too by installing WP Security Audit Log. The community's favourite security monitoring and auditing plugin and is developed by WordPress Security Consultants and Professionals [WP White Security](http://www.wpwhitesecurity.com/wordpress-security-services/).
18
+
19
+ > <strong>Free and Premium Support</strong><br>
20
+ >
21
+ > WP White Security provides support for WP Security Audit Log plugin on the WordPress forums for free, though please note that it is free support hence it is not always possible to answer all questions on a timely manner, although we do try.
22
+ > Personalized premium support is available via email to anyone who purchases the [Notifications Extension](http://www.wpwhitesecurity.com/plugins-premium-extensions/email-notifications-wordpress/), an extension that allows WordPress administrators and owners to be instantly notified of changes on their WordPress via email.
23
 
24
  = Keep A WordPress Security Audit Log & Identify WordPress Security Issues =
25
  WP Security Audit Log keeps a log of everything happening on your WordPress blog or website and WordPress multisite network. By using WP Security Audit Log security plugin it is very easy to track suspicious user activity before it becomes a problem or a security issue. A security alert is generated by the plugin when:
57
 
58
  Refer to the complete list of [WordPress Security Audit Alerts](http://www.wpwhitesecurity.com/wordpress-security-plugins/wp-security-audit-log/security-audit-alerts-logs/) for more information on what other WordPress user activity can be monitored with the WP Security Audit Log WordPress plugin.
59
 
60
+ = Get Notified Instantly of Changes on Your WordPress =
61
+ <strong>Get notified instantly via email of important changes happening on your blogs and websites running on WordPress and WordPress multisite.</strong>
62
+
63
+ Use the [WSAL Notifications Extension](http://www.wpwhitesecurity.com/plugins-premium-extensions/email-notifications-wordpress/) to configure monitoring rules and get notified via email of specific actions. For example you can setup notifications rules to be alerted via email should any WordPress user logs in to your WordPress outside office hours. The email alerts include all the details a WordPress administrator or owner might need, such as the source IP address, user, user role, date, time, details about the actual action and much more.
64
+
65
  = WP Security Audit Log for WordPress Multisite =
66
  WP Security Audit Log is the first tracking and audit WordPress security monitoring plugin that supports WordPress multisite network installations and can monitor activity on such WordPress multisite network installations.
67
 
82
  = Other Noteworthy Features =
83
  WP Security Audit Log plugin also has a number of features that make WordPress and WordPress multisite monitoring and auditing easier, such as:
84
 
85
+ * Realtime Audit Log viewer to watch user activity as it happens without any delays
86
  * Limit who can view the security alerts by users or roles
87
  * Limit who can manage the plugin by users or roles
88
  * Configurable WordPress dashboard widget highlighting the most recent critical activity
89
+ * Configurable WordPress security alerts pruning rules
90
  * User role is reported in alerts for a complete overview of what is happening
91
  * User avatar is reported in the alerts for better recognizability
92
  * Enable or disable any security alerts
144
 
145
  == Changelog ==
146
 
147
+ = 1.2.8 (2014-10-14) =
148
+ * New Feature
149
+ * Added new Extensions page to allow users to see which extensions they can use to increase the functionality of the plugin
150
+ * Included licensing mechanism to support premium extensions
151
+
152
+ * Improvements
153
+ * Updated latest language files for German and Italian translations (also include corrections for some old translations)
154
+
155
+ * Bug Fixes
156
+ * Fixed a problem with the pruning of WordPress Security Alerts [support ticket](https://wordpress.org/support/topic/security-alerts-pruning-not-working-as-intended)
157
+ * Fixed pagination issue in the Audit Log Viewer when running on WordPress multisite
158
+
159
  = 1.2.7 (2014-09-26) =
160
  * New Feature
161
  * New option "Restrict Plugin Access" that allows WordPress administrators to further restrict access to the plugin and the WordPress security alerts
225
  * Italian translation available thanks to [Leonardo Musumeci](http://leonardomusumeci.net/)
226
 
227
  * Improvements
228
+ * Added a warning for developer options
229
  * "Hidden" developer options from default settings; user has to click link to access developer settings
230
  * Backtrace logging now made optional from a developer setting
231
 
wp-security-audit-log.php CHANGED
@@ -4,7 +4,7 @@ Plugin Name: WP Security Audit Log
4
  Plugin URI: http://www.wpwhitesecurity.com/wordpress-security-plugins/wp-security-audit-log/
5
  Description: Identify WordPress security issues before they become a problem and keep track of everything happening on your WordPress, including WordPress users activity. Similar to Windows Event Log and Linux Syslog, WP Security Audit Log will generate a security alert for everything that happens on your WordPress blog or website. Use the Audit Log Viewer included in the plugin to see all the security alerts.
6
  Author: WP White Security
7
- Version: 1.2.7
8
  Text Domain: wp-security-audit-log
9
  Author URI: http://www.wpwhitesecurity.com/
10
  License: GPL2
@@ -134,14 +134,38 @@ class WpSecurityAuditLog {
134
  // listen for cleanup event
135
  add_action('wsal_cleanup', array($this, 'CleanUp'));
136
 
 
 
 
 
 
 
137
  // hide plugin
138
  if($this->settings->IsIncognito())
139
  add_action('admin_head', array($this, 'HidePlugin'));
140
  }
141
 
142
  /**
143
- * Load the rest of the system.
144
- * @internal
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
145
  */
146
  public function Load(){
147
  // load translations
@@ -370,8 +394,8 @@ class WpSecurityAuditLog {
370
  */
371
  public function CleanUp(){
372
  $s = $this->profiler->Start('Clean Up');
373
- //foreach($this->_cleanup_hooks as $hook)
374
- // call_user_func($hook);
375
  $s->Stop();
376
  }
377
 
4
  Plugin URI: http://www.wpwhitesecurity.com/wordpress-security-plugins/wp-security-audit-log/
5
  Description: Identify WordPress security issues before they become a problem and keep track of everything happening on your WordPress, including WordPress users activity. Similar to Windows Event Log and Linux Syslog, WP Security Audit Log will generate a security alert for everything that happens on your WordPress blog or website. Use the Audit Log Viewer included in the plugin to see all the security alerts.
6
  Author: WP White Security
7
+ Version: 1.2.8
8
  Text Domain: wp-security-audit-log
9
  Author URI: http://www.wpwhitesecurity.com/
10
  License: GPL2
134
  // listen for cleanup event
135
  add_action('wsal_cleanup', array($this, 'CleanUp'));
136
 
137
+ // render wsal header
138
+ add_action('admin_enqueue_scripts', array($this, 'RenderHeader'));
139
+
140
+ // render wsal footer
141
+ add_action('admin_footer', array($this, 'RenderFooter'));
142
+
143
  // hide plugin
144
  if($this->settings->IsIncognito())
145
  add_action('admin_head', array($this, 'HidePlugin'));
146
  }
147
 
148
  /**
149
+ * @internal Render plugin stuff in page header.
150
+ */
151
+ public function RenderHeader(){
152
+ // common.css?
153
+ }
154
+
155
+ /**
156
+ * @internal Render plugin stuff in page footer.
157
+ */
158
+ public function RenderFooter(){
159
+ wp_enqueue_script(
160
+ 'wsal-common',
161
+ $this->GetBaseUrl() . '/js/common.js',
162
+ array('jquery'),
163
+ filemtime($this->GetBaseDir() . '/js/common.js')
164
+ );
165
+ }
166
+
167
+ /**
168
+ * @internal Load the rest of the system.
169
  */
170
  public function Load(){
171
  // load translations
394
  */
395
  public function CleanUp(){
396
  $s = $this->profiler->Start('Clean Up');
397
+ foreach($this->_cleanup_hooks as $hook)
398
+ call_user_func($hook);
399
  $s->Stop();
400
  }
401