Defender Security – Malware Scanner, Login Security & Firewall - Version 1.9.1

Version Description

  • Fix: Mask Login Area description text is misleading
  • Fix: wp-admin link of sub-sites in networks link to wrong admin URL
  • Fix: Prevent Information Disclosure & Prevent PHP Execution show false error message when first applied
  • Fix: Dashboard reporting section mis-alignment
  • Other minor enhancements and fixes
Download this release

Release Info

Developer hoang1213
Plugin Icon 128x128 Defender Security – Malware Scanner, Login Security & Firewall
Version 1.9.1
Comparing to
See all releases

Code changes from version 1.9 to 1.9.1

Files changed (41) hide show
  1. app/behavior/report-free.php +2 -2
  2. app/controller/gdpr.php +0 -1
  3. app/module/advanced-tools/behavior/at-widget.php +2 -2
  4. app/module/advanced-tools/component/auth-api.php +1 -0
  5. app/module/advanced-tools/component/mask-api.php +57 -4
  6. app/module/advanced-tools/controller/mask-login.php +62 -2
  7. app/module/advanced-tools/view/login/disabled.php +9 -2
  8. app/module/advanced-tools/view/mask-login/disabled.php +2 -2
  9. app/module/advanced-tools/view/mask-login/enabled.php +4 -4
  10. app/module/audit/behavior/audit-free.php +3 -3
  11. app/module/audit/view/pro-feature.php +3 -3
  12. app/module/hardener/component/db-prefix-service.php +3 -3
  13. app/module/hardener/component/disable-file-editor-service.php +3 -3
  14. app/module/hardener/component/hide-error-service.php +2 -2
  15. app/module/hardener/component/protect-information-service.php +3 -3
  16. app/module/hardener/component/security-key-service.php +2 -2
  17. app/module/hardener/component/servers/apache-service.php +95 -93
  18. app/module/ip-lockout/component/logs-table.php +2 -2
  19. app/module/ip-lockout/controller/main.php +3 -2
  20. app/module/ip-lockout/model/settings.php +7 -1
  21. app/module/ip-lockout/view/blacklist/enabled.php +2 -2
  22. app/module/ip-lockout/view/notification/report-free.php +2 -2
  23. app/module/ip-lockout/view/pro-feature.php +3 -3
  24. app/module/scan/behavior/scan.php +4 -4
  25. app/module/scan/component/result-table.php +2 -2
  26. app/module/scan/component/scan-api.php +3 -0
  27. app/module/scan/controller/main.php +3 -3
  28. app/module/scan/js/script.js +17 -0
  29. app/module/scan/model/settings.php +8 -2
  30. app/module/scan/view/automation-free.php +2 -2
  31. app/module/scan/view/new.php +1 -1
  32. app/module/scan/view/pro-feature.php +3 -3
  33. app/module/scan/view/scanning.php +2 -2
  34. app/module/scan/view/setting-free.php +2 -2
  35. app/view/pro-feature.php +3 -3
  36. app/view/settings.php +2 -2
  37. assets/css/styles.css +12 -8
  38. languages/wpdef-default.pot +116 -120
  39. main-activator.php +3 -7
  40. readme.txt +8 -1
  41. wp-defender.php +1 -1
app/behavior/report-free.php CHANGED
@@ -59,7 +59,7 @@ class Report_Free extends Behavior {
59
  <div class="presale-text">
60
  <div>
61
  <?php printf( __( " Automated reports are included in a WPMU DEV membership along with 100+ plugins
62
- & themes, 24/7 support and lots of handy site management tools – <a target='_blank' href=\"%s\">Try
63
  it all absolutely FREE</a>", "defender-security" ), Utils::instance()->campaignURL( 'defender_dash_reports_upsell_link' ) ) ?>
64
  </div>
65
  </div>
@@ -138,4 +138,4 @@ class Report_Free extends Behavior {
138
 
139
  return $text;
140
  }
141
- }
59
  <div class="presale-text">
60
  <div>
61
  <?php printf( __( " Automated reports are included in a WPMU DEV membership along with 100+ plugins
62
+ , 24/7 support and lots of handy site management tools – <a target='_blank' href=\"%s\">Try
63
  it all absolutely FREE</a>", "defender-security" ), Utils::instance()->campaignURL( 'defender_dash_reports_upsell_link' ) ) ?>
64
  </div>
65
  </div>
138
 
139
  return $text;
140
  }
141
+ }
app/controller/gdpr.php CHANGED
@@ -19,7 +19,6 @@ class GDPR extends Controller {
19
  $content .= '<p>' . __( "This site may be using WPMU DEV third-party cloud storage to store backups of its audit logs where personal information is collected.", "defender-security" ) . '</p>';
20
  $content .= '<p><strong>' . __( "Additional data", "defender-security" ) . '</strong></p>';
21
  $content .= '<p>' . __( "This site creates and stores an activity log that capture the IP address, username, email address and tracks user activity (like when a user makes a comment). Information will be stored locally for 30 days and remotely for 1 year. Information on remote logs cannot be cleared for security purposes.", "defender-security" ) . '</p>';
22
-
23
  return $content;
24
  }
25
  }
19
  $content .= '<p>' . __( "This site may be using WPMU DEV third-party cloud storage to store backups of its audit logs where personal information is collected.", "defender-security" ) . '</p>';
20
  $content .= '<p><strong>' . __( "Additional data", "defender-security" ) . '</strong></p>';
21
  $content .= '<p>' . __( "This site creates and stores an activity log that capture the IP address, username, email address and tracks user activity (like when a user makes a comment). Information will be stored locally for 30 days and remotely for 1 year. Information on remote logs cannot be cleared for security purposes.", "defender-security" ) . '</p>';
 
22
  return $content;
23
  }
24
  }
app/module/advanced-tools/behavior/at-widget.php CHANGED
@@ -76,7 +76,7 @@ class AT_Widget extends Behavior {
76
  </strong>
77
  <span>
78
  <?php
79
- _e( "Change the location of WordPress’s default wp-admin and wp-login URLs.", "defender-security" )
80
  ?>
81
  </span>
82
  <?php
@@ -111,4 +111,4 @@ class AT_Widget extends Behavior {
111
  </div>
112
  <?php
113
  }
114
- }
76
  </strong>
77
  <span>
78
  <?php
79
+ _e( 'Change the location of WordPress’s default login area.', "defender-security" )
80
  ?>
81
  </span>
82
  <?php
111
  </div>
112
  <?php
113
  }
114
+ }
app/module/advanced-tools/component/auth-api.php CHANGED
@@ -61,6 +61,7 @@ class Auth_API extends Component {
61
  $secret = $base32->decode( $secret );
62
  //timestep fixed at 30
63
  if ( is_null( $counter ) ) {
 
64
  $counter = time();
65
  }
66
  $input = floor( $counter / 30 );
61
  $secret = $base32->decode( $secret );
62
  //timestep fixed at 30
63
  if ( is_null( $counter ) ) {
64
+
65
  $counter = time();
66
  }
67
  $input = floor( $counter / 30 );
app/module/advanced-tools/component/mask-api.php CHANGED
@@ -23,8 +23,7 @@ class Mask_Api extends Component {
23
  if ( empty( $requestUri ) ) {
24
  $requestUri = $_SERVER['REQUEST_URI'];
25
  }
26
- //todo fix the case subfolder
27
- $prefix = parse_url( network_site_url(), PHP_URL_PATH );
28
  $requestPath = parse_url( $requestUri, PHP_URL_PATH );
29
  //clean it a bit
30
  if ( Utils::instance()->isActivatedSingle() == false
@@ -32,6 +31,7 @@ class Mask_Api extends Component {
32
  && constant( 'SUBDOMAIN_INSTALL' ) == false
33
  && get_current_blog_id() != 1
34
  ) {
 
35
  //get the prefix
36
  $siteInfo = get_blog_details();
37
  $path = $siteInfo->path;
@@ -51,6 +51,56 @@ class Mask_Api extends Component {
51
  return $requestPath;
52
  }
53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  /**
55
  * @return string
56
  */
@@ -63,10 +113,13 @@ class Mask_Api extends Component {
63
  /**
64
  * @return string
65
  */
66
- public static function getNewLoginUrl() {
67
  $settings = Mask_Settings::instance();
 
 
 
68
 
69
- return untrailingslashit( site_url() ) . '/' . ltrim( $settings->maskUrl, '/' );
70
  }
71
 
72
  /**
23
  if ( empty( $requestUri ) ) {
24
  $requestUri = $_SERVER['REQUEST_URI'];
25
  }
26
+ $prefix = parse_url( self::site_url(), PHP_URL_PATH );;
 
27
  $requestPath = parse_url( $requestUri, PHP_URL_PATH );
28
  //clean it a bit
29
  if ( Utils::instance()->isActivatedSingle() == false
31
  && constant( 'SUBDOMAIN_INSTALL' ) == false
32
  && get_current_blog_id() != 1
33
  ) {
34
+ $prefix = parse_url( self::network_site_url(), PHP_URL_PATH );
35
  //get the prefix
36
  $siteInfo = get_blog_details();
37
  $path = $siteInfo->path;
51
  return $requestPath;
52
  }
53
 
54
+ /**
55
+ * A clone of network_site_url but remove the filter
56
+ *
57
+ * @param string $path
58
+ * @param null $scheme
59
+ *
60
+ * @return string
61
+ */
62
+ private static function site_url( $path = '', $scheme = null ) {
63
+ if ( empty( $blog_id ) || ! is_multisite() ) {
64
+ $url = get_option( 'siteurl' );
65
+ } else {
66
+ switch_to_blog( $blog_id );
67
+ $url = get_option( 'siteurl' );
68
+ restore_current_blog();
69
+ }
70
+
71
+ $url = set_url_scheme( $url, $scheme );
72
+
73
+ if ( $path && is_string( $path ) ) {
74
+ $url .= '/' . ltrim( $path, '/' );
75
+ }
76
+
77
+ return $url;
78
+ }
79
+
80
+ /**
81
+ * A clone of network_site_url but remove the filter
82
+ *
83
+ * @param string $path
84
+ * @param null $scheme
85
+ *
86
+ * @return string
87
+ */
88
+ private static function network_site_url( $path = '', $scheme = null ) {
89
+ $current_network = get_network();
90
+
91
+ if ( 'relative' == $scheme ) {
92
+ $url = $current_network->path;
93
+ } else {
94
+ $url = set_url_scheme( 'http://' . $current_network->domain . $current_network->path, $scheme );
95
+ }
96
+
97
+ if ( $path && is_string( $path ) ) {
98
+ $url .= ltrim( $path, '/' );
99
+ }
100
+
101
+ return $url;
102
+ }
103
+
104
  /**
105
  * @return string
106
  */
113
  /**
114
  * @return string
115
  */
116
+ public static function getNewLoginUrl( $domain = null ) {
117
  $settings = Mask_Settings::instance();
118
+ if ( $domain == null ) {
119
+ $domain = site_url();
120
+ }
121
 
122
+ return untrailingslashit( $domain . '/' . ltrim( $settings->maskUrl, '/' ) );
123
  }
124
 
125
  /**
app/module/advanced-tools/controller/mask-login.php CHANGED
@@ -41,6 +41,8 @@ class Mask_Login extends Controller {
41
  $this->add_filter( 'wp_redirect', 'filterWPRedirect', 10, 2 );
42
  $this->add_filter( 'site_url', 'filterSiteUrl', 9999, 4 );
43
  $this->add_filter( 'network_site_url', 'filterNetworkSiteUrl', 9999, 3 );
 
 
44
  remove_action( 'template_redirect', 'wp_redirect_admin_locations' );
45
  } else {
46
  if ( $isJetpackSSO ) {
@@ -71,18 +73,45 @@ class Mask_Login extends Controller {
71
  }
72
  }
73
 
 
 
 
 
 
 
 
74
  public function filterNetworkSiteUrl( $url, $path, $scheme ) {
75
  return $this->alterLoginUrl( $url, $scheme );
76
  }
77
 
 
 
 
 
 
 
 
 
78
  public function filterSiteUrl( $url, $path, $scheme, $blog_id ) {
79
  return $this->alterLoginUrl( $url, $scheme );
80
  }
81
 
 
 
 
 
 
 
82
  public function filterWPRedirect( $location, $status ) {
83
  return $this->alterLoginUrl( $location );
84
  }
85
 
 
 
 
 
 
 
86
  private function alterLoginUrl( $currentUrl, $scheme = null ) {
87
  if ( strpos( $currentUrl, 'wp-login.php' ) !== false ) {
88
  //this is URL go to old wp-login.php
@@ -94,11 +123,44 @@ class Mask_Login extends Controller {
94
  } else {
95
  return Mask_Api::getNewLoginUrl();
96
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
  }
98
 
99
  return $currentUrl;
100
  }
101
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
  /**
103
  * Catch any request to wp-admin/*, block or redirect it base on settings.
104
  * This wont apply for logged in user
@@ -109,7 +171,6 @@ class Mask_Login extends Controller {
109
  //we need to allow ajax access for other tasks
110
  return;
111
  }
112
-
113
  if ( is_user_logged_in() ) {
114
  return;
115
  }
@@ -117,7 +178,6 @@ class Mask_Login extends Controller {
117
  $this->_maybeLock();
118
  }
119
 
120
-
121
  private function _handleRequestToLoginPage() {
122
  $this->_maybeLock();
123
  }
41
  $this->add_filter( 'wp_redirect', 'filterWPRedirect', 10, 2 );
42
  $this->add_filter( 'site_url', 'filterSiteUrl', 9999, 4 );
43
  $this->add_filter( 'network_site_url', 'filterNetworkSiteUrl', 9999, 3 );
44
+ // $this->add_filter( 'network_admin_url', 'filterAdminUrl', 9999, 2 );
45
+ // $this->add_filter( 'admin_url', 'filterAdminUrl', 9999, 2 );
46
  remove_action( 'template_redirect', 'wp_redirect_admin_locations' );
47
  } else {
48
  if ( $isJetpackSSO ) {
73
  }
74
  }
75
 
76
+ /**
77
+ * @param $url
78
+ * @param $path
79
+ * @param $scheme
80
+ *
81
+ * @return string
82
+ */
83
  public function filterNetworkSiteUrl( $url, $path, $scheme ) {
84
  return $this->alterLoginUrl( $url, $scheme );
85
  }
86
 
87
+ /**
88
+ * @param $url
89
+ * @param $path
90
+ * @param $scheme
91
+ * @param $blog_id
92
+ *
93
+ * @return string
94
+ */
95
  public function filterSiteUrl( $url, $path, $scheme, $blog_id ) {
96
  return $this->alterLoginUrl( $url, $scheme );
97
  }
98
 
99
+ /**
100
+ * @param $location
101
+ * @param $status
102
+ *
103
+ * @return string
104
+ */
105
  public function filterWPRedirect( $location, $status ) {
106
  return $this->alterLoginUrl( $location );
107
  }
108
 
109
+ /**
110
+ * @param $currentUrl
111
+ * @param null $scheme
112
+ *
113
+ * @return string
114
+ */
115
  private function alterLoginUrl( $currentUrl, $scheme = null ) {
116
  if ( strpos( $currentUrl, 'wp-login.php' ) !== false ) {
117
  //this is URL go to old wp-login.php
123
  } else {
124
  return Mask_Api::getNewLoginUrl();
125
  }
126
+ } else {
127
+ //this case when admin map a domain into subsite, we need to update the new domain/masked-login into the list
128
+ if ( ! function_exists( 'get_current_screen' ) ) {
129
+ require_once( ABSPATH . 'wp-admin/includes/screen.php' );
130
+ }
131
+ $screen = get_current_screen();
132
+ if ( ! is_object( $screen ) ) {
133
+ return $currentUrl;
134
+ }
135
+ if ( $screen->id == 'sites-network' ) {
136
+ //case URLs inside sites list, need to check those with custom domain cause when redirect, it will require re-loggin
137
+ $requestPath = Mask_Api::getRequestPath( $currentUrl );
138
+ if ( $requestPath == '/wp-admin' ) {
139
+ $currentDomain = $_SERVER['HTTP_HOST'];
140
+ $subDomain = parse_url( $currentUrl, PHP_URL_HOST );
141
+ if ( stristr( $subDomain, $currentDomain ) === false ) {
142
+ return Mask_Api::getNewLoginUrl( $subDomain );
143
+ }
144
+ }
145
+ }
146
  }
147
 
148
  return $currentUrl;
149
  }
150
 
151
+ /**
152
+ * Filter admin URL when sync with HUB
153
+ *
154
+ * @param $currentUrl
155
+ * @param null $scheme
156
+ *
157
+ * @return mixed
158
+ */
159
+ public function filterAdminUrl( $currentUrl, $scheme = null ) {
160
+
161
+ return $currentUrl;
162
+ }
163
+
164
  /**
165
  * Catch any request to wp-admin/*, block or redirect it base on settings.
166
  * This wont apply for logged in user
171
  //we need to allow ajax access for other tasks
172
  return;
173
  }
 
174
  if ( is_user_logged_in() ) {
175
  return;
176
  }
178
  $this->_maybeLock();
179
  }
180
 
 
181
  private function _handleRequestToLoginPage() {
182
  $this->_maybeLock();
183
  }
app/module/advanced-tools/view/login/disabled.php CHANGED
@@ -16,6 +16,13 @@
16
  ?>
17
  </div>
18
  <?php endif; ?>
 
 
 
 
 
 
 
19
  <div id="def2">
20
  <div class="destroy-sessions">
21
  <button type="button" class="button" id="show2AuthActivator">
@@ -47,7 +54,7 @@
47
  <p><strong><?php _e( "2. Scan the barcode", "defender-security" ) ?></strong></p>
48
  <p><?php _e( "Open the Google Authenticator app you just downloaded, tap the “+” symbol and then use your phone’s camera to scan the barcode below.", "defender-security" ) ?></p>
49
  <img class="barcode"
50
- src="<?php echo \WP_Defender\Module\Advanced_Tools\Component\Auth_API::generateQRCode( get_site_url(), $secretKey, 149, 149, get_site_url() ) ?>"/>
51
  <div class="line"></div>
52
  <p><strong><?php _e( "3. Enter passcode", "defender-security" ) ?></strong></p>
53
  <p>
@@ -79,7 +86,7 @@
79
  $('#def2qr').hide();
80
  $('#def2').show();
81
  })
82
- $("input#otpCode").keydown(function(event) {
83
  if (event.keyCode == 13) {
84
  event.preventDefault();
85
 
16
  ?>
17
  </div>
18
  <?php endif; ?>
19
+ <?php
20
+ $user = wp_get_current_user();
21
+ $email = '';
22
+ if ( is_object( $user ) ) {
23
+ $email = $user->user_email;
24
+ }
25
+ ?>
26
  <div id="def2">
27
  <div class="destroy-sessions">
28
  <button type="button" class="button" id="show2AuthActivator">
54
  <p><strong><?php _e( "2. Scan the barcode", "defender-security" ) ?></strong></p>
55
  <p><?php _e( "Open the Google Authenticator app you just downloaded, tap the “+” symbol and then use your phone’s camera to scan the barcode below.", "defender-security" ) ?></p>
56
  <img class="barcode"
57
+ src="<?php echo \WP_Defender\Module\Advanced_Tools\Component\Auth_API::generateQRCode( urlencode( get_bloginfo( 'name' ) ) . ':' . $email, $secretKey, 149, 149, urlencode( get_bloginfo( 'name' ) ) ) ?>"/>
58
  <div class="line"></div>
59
  <p><strong><?php _e( "3. Enter passcode", "defender-security" ) ?></strong></p>
60
  <p>
86
  $('#def2qr').hide();
87
  $('#def2').show();
88
  })
89
+ $("input#otpCode").keydown(function (event) {
90
  if (event.keyCode == 13) {
91
  event.preventDefault();
92
 
app/module/advanced-tools/view/mask-login/disabled.php CHANGED
@@ -7,7 +7,7 @@
7
  <div class="box-content issues-box-content tc">
8
  <img src="<?php echo wp_defender()->getPluginUrl() . 'assets/img/2factor-disabled.svg' ?>"/>
9
  <p>
10
- <?php _e( "Change the location of WordPress’s default wp-admin and wp-login URLs to make it harder for automated bots to find, and more convenient for your users.", "defender-security" ) ?>
11
  </p>
12
  <form method="post" id="advanced-settings-frm" class="advanced-settings-frm">
13
 
@@ -21,4 +21,4 @@
21
  <div class="clear"></div>
22
  </form>
23
  </div>
24
- </div>
7
  <div class="box-content issues-box-content tc">
8
  <img src="<?php echo wp_defender()->getPluginUrl() . 'assets/img/2factor-disabled.svg' ?>"/>
9
  <p>
10
+ <?php _e( 'Change the location of WordPress’s default login area, making it harder for automated bots to find and also more convenient for your users.', "defender-security" ) ?>
11
  </p>
12
  <form method="post" id="advanced-settings-frm" class="advanced-settings-frm">
13
 
21
  <div class="clear"></div>
22
  </form>
23
  </div>
24
+ </div>
app/module/advanced-tools/view/mask-login/enabled.php CHANGED
@@ -6,7 +6,7 @@
6
  </div>
7
  <div class="box-content issues-box-content">
8
  <form method="post" id="ad-mask-settings-frm" class="advanced-settings-frm">
9
- <p class="line"><?php _e( "Change your default wp-admin and wp-content login URL.", "defender-security" ) ?></p>
10
  <?php if ( isset( wp_defender()->global['compatibility'] ) ): ?>
11
  <div class="well well-error with-cap">
12
  <i class="def-icon icon-warning icon-yellow "></i>
@@ -32,7 +32,7 @@
32
  <div class="column is-one-third">
33
  <label><?php _e( "Masking URLs", "defender-security" ) ?></label>
34
  <span class="sub">
35
- <?php _e( "Choose the new URL slug where users of your website will now navigate to to log in, register or administrate.", "defender-security" ) ?>
36
  </span>
37
  </div>
38
  <div class="column">
@@ -46,7 +46,7 @@
46
  <div class="column is-one-third">
47
  <label><?php _e( "Redirect traffic", "defender-security" ) ?></label>
48
  <span class="sub">
49
- <?php _e( "With this feature you can send visitors and bots who try to visit the default Wordpress login URLs to a separate URL to avoid 404s.", "defender-security" ) ?>
50
  </span>
51
  </div>
52
  <div class="column">
@@ -90,4 +90,4 @@
90
  <div class="clear"></div>
91
  </form>
92
  </div>
93
- </div>
6
  </div>
7
  <div class="box-content issues-box-content">
8
  <form method="post" id="ad-mask-settings-frm" class="advanced-settings-frm">
9
+ <p class="line"><?php _e( "Change your default WordPress login URL to hide your login area from hackers and bots.", "defender-security" ) ?></p>
10
  <?php if ( isset( wp_defender()->global['compatibility'] ) ): ?>
11
  <div class="well well-error with-cap">
12
  <i class="def-icon icon-warning icon-yellow "></i>
32
  <div class="column is-one-third">
33
  <label><?php _e( "Masking URLs", "defender-security" ) ?></label>
34
  <span class="sub">
35
+ <?php _e( "Choose the new URL slug where users of your website will now navigate to log in or register.", "defender-security" ) ?>
36
  </span>
37
  </div>
38
  <div class="column">
46
  <div class="column is-one-third">
47
  <label><?php _e( "Redirect traffic", "defender-security" ) ?></label>
48
  <span class="sub">
49
+ <?php _e( "With this feature you can send visitors and bots who try to visit the default WordPress login URLs to a separate URL to avoid 404s.", "defender-security" ) ?>
50
  </span>
51
  </div>
52
  <div class="column">
90
  <div class="clear"></div>
91
  </form>
92
  </div>
93
+ </div>
app/module/audit/behavior/audit-free.php CHANGED
@@ -27,8 +27,8 @@ class Audit_Free extends Behavior {
27
  </div>
28
  <div class="presale-text">
29
  <div>
30
- <?php printf( __( "Audit logging is a pro feature included in a WPMU DEV membership along with 100+ plugins &
31
- themes, 24/7 support and lots of handy site management tools – <a target='_blank' href=\"%s\">Try it all absolutely FREE</a>", "defender-security" ), Utils::instance()->campaignURL('defender_dash_auditlogging_upsell_link') ) ?>
32
  </a>
33
  </div>
34
  </div>
@@ -37,4 +37,4 @@ class Audit_Free extends Behavior {
37
  </div>
38
  <?php
39
  }
40
- }
27
  </div>
28
  <div class="presale-text">
29
  <div>
30
+ <?php printf( __( "Audit logging is a pro feature included in a WPMU DEV membership along with 100+ plugins,
31
+ 24/7 support and lots of handy site management tools – <a target='_blank' href=\"%s\">Try it all absolutely FREE</a>", "defender-security" ), Utils::instance()->campaignURL('defender_dash_auditlogging_upsell_link') ) ?>
32
  </a>
33
  </div>
34
  </div>
37
  </div>
38
  <?php
39
  }
40
+ }
app/module/audit/view/pro-feature.php CHANGED
@@ -1,6 +1,6 @@
1
  <dialog class="dev-team" id="pro-feature" title="<?php _e( "Defender Pro Features", "defender-security" ) ?>">
2
  <div class="wp-defender">
3
- <p class=""><?php _e( "Here’s what you’ll get by upgrading to Defender Pro;", "defender-security" ) ?></p>
4
  <div class="well well-blank with-cap">
5
  <i class="def-icon icon-tick fill-blue"></i>
6
  <strong><?php _e( "Automatic Full File Scans & Notifications", "defender-security" ) ?></strong>
@@ -33,7 +33,7 @@
33
  </div>
34
  <div class="tc">
35
  <a class="button button-green mline" href="https://premium.wpmudev.org/project/wp-defender/?utm_source=defender&utm_medium=plugin&utm_campaign=defender_modal_upgrade"><?php _e( "Get Defender Pro for Free", "defender-security" ) ?></a>
36
- <p class="is-marginless"><?php _e( "As part part of a WPMU DEV free trial.", "defender-security" ) ?></p>
37
  </div>
38
  </div>
39
- </dialog>
1
  <dialog class="dev-team" id="pro-feature" title="<?php _e( "Defender Pro Features", "defender-security" ) ?>">
2
  <div class="wp-defender">
3
+ <p class=""><?php _e( "Here’s what you’ll get by upgrading to Defender Pro:", "defender-security" ) ?></p>
4
  <div class="well well-blank with-cap">
5
  <i class="def-icon icon-tick fill-blue"></i>
6
  <strong><?php _e( "Automatic Full File Scans & Notifications", "defender-security" ) ?></strong>
33
  </div>
34
  <div class="tc">
35
  <a class="button button-green mline" href="https://premium.wpmudev.org/project/wp-defender/?utm_source=defender&utm_medium=plugin&utm_campaign=defender_modal_upgrade"><?php _e( "Get Defender Pro for Free", "defender-security" ) ?></a>
36
+ <p class="is-marginless"><?php _e( "As part of a WPMU DEV free trial.", "defender-security" ) ?></p>
37
  </div>
38
  </div>
39
+ </dialog>
app/module/hardener/component/db-prefix-service.php CHANGED
@@ -29,7 +29,7 @@ class DB_Prefix_Service extends Rule_Service implements IRule_Service {
29
  $config_path = $this->retrieveWPConfigPath();
30
  if ( ! is_writeable( $config_path ) ) {
31
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
32
- sprintf( __( "The file %s is not writeable", "defender-security" ), $config_path ) );
33
  }
34
 
35
  $hook_line = $this->findDefaultHookLine( file( $config_path ) );
@@ -92,7 +92,7 @@ class DB_Prefix_Service extends Rule_Service implements IRule_Service {
92
  if ( ! file_put_contents( $config_path, implode( null, $config ), LOCK_EX ) ) {
93
  //should not happen
94
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
95
- sprintf( __( "The file %s is not writeable", "defender-security" ), $config_path ) );
96
  }
97
 
98
  return true;
@@ -224,4 +224,4 @@ class DB_Prefix_Service extends Rule_Service implements IRule_Service {
224
  public function listen() {
225
  // TODO: Implement listen() method.
226
  }
227
- }
29
  $config_path = $this->retrieveWPConfigPath();
30
  if ( ! is_writeable( $config_path ) ) {
31
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
32
+ sprintf( __( "The file %s is not writable", "defender-security" ), $config_path ) );
33
  }
34
 
35
  $hook_line = $this->findDefaultHookLine( file( $config_path ) );
92
  if ( ! file_put_contents( $config_path, implode( null, $config ), LOCK_EX ) ) {
93
  //should not happen
94
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
95
+ sprintf( __( "The file %s is not writable", "defender-security" ), $config_path ) );
96
  }
97
 
98
  return true;
224
  public function listen() {
225
  // TODO: Implement listen() method.
226
  }
227
+ }
app/module/hardener/component/disable-file-editor-service.php CHANGED
@@ -29,7 +29,7 @@ class Disable_File_Editor_Service extends Rule_Service implements IRule_Service
29
  $config_path = $this->retrieveWPConfigPath();
30
  if ( ! is_writeable( $config_path ) ) {
31
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
32
- sprintf( __( "The file %s is not writeable", "defender-security" ), $config_path ) );
33
  }
34
  $config = file( $config_path );
35
  $line = $this->findLine( $config );
@@ -63,7 +63,7 @@ class Disable_File_Editor_Service extends Rule_Service implements IRule_Service
63
  $config_path = $this->retrieveWPConfigPath();
64
  if ( ! is_writeable( $config_path ) ) {
65
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
66
- sprintf( __( "The file %s is not writeable", "defender-security" ), $config_path ) );
67
  }
68
  $config = file( $config_path );
69
  $line = $this->findLine( $config );
@@ -96,4 +96,4 @@ class Disable_File_Editor_Service extends Rule_Service implements IRule_Service
96
 
97
  return false;
98
  }
99
- }
29
  $config_path = $this->retrieveWPConfigPath();
30
  if ( ! is_writeable( $config_path ) ) {
31
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
32
+ sprintf( __( "The file %s is not writable", "defender-security" ), $config_path ) );
33
  }
34
  $config = file( $config_path );
35
  $line = $this->findLine( $config );
63
  $config_path = $this->retrieveWPConfigPath();
64
  if ( ! is_writeable( $config_path ) ) {
65
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
66
+ sprintf( __( "The file %s is not writable", "defender-security" ), $config_path ) );
67
  }
68
  $config = file( $config_path );
69
  $line = $this->findLine( $config );
96
 
97
  return false;
98
  }
99
+ }
app/module/hardener/component/hide-error-service.php CHANGED
@@ -58,7 +58,7 @@ class Hide_Error_Service extends Rule_Service implements IRule_Service {
58
  //check if can write
59
  if ( ! is_writeable( $config_path ) ) {
60
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
61
- sprintf( __( "The file %s is not writeable", "defender-security" ), $config_path ) );
62
  }
63
  $config = file( $config_path );
64
  if ( ( $info = $this->findWPDebugLine( $config ) ) === - 1 ) {
@@ -158,4 +158,4 @@ class Hide_Error_Service extends Rule_Service implements IRule_Service {
158
  public function listen() {
159
 
160
  }
161
- }
58
  //check if can write
59
  if ( ! is_writeable( $config_path ) ) {
60
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
61
+ sprintf( __( "The file %s is not writable", "defender-security" ), $config_path ) );
62
  }
63
  $config = file( $config_path );
64
  if ( ( $info = $this->findWPDebugLine( $config ) ) === - 1 ) {
158
  public function listen() {
159
 
160
  }
161
+ }
app/module/hardener/component/protect-information-service.php CHANGED
@@ -43,7 +43,7 @@ class Protect_Information_Service extends Rule_Service implements IRule_Service
43
  }
44
  if ( ! is_writeable( $htPath ) ) {
45
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
46
- sprintf( __( "The file %s is not writeable", "defender-security" ), $htPath ) );
47
  }
48
  $htConfig = file( $htPath );
49
  $rules = $this->apache_rule();
@@ -66,7 +66,7 @@ class Protect_Information_Service extends Rule_Service implements IRule_Service
66
  $htPath = ABSPATH . '.htaccess';
67
  if ( ! is_writeable( $htPath ) ) {
68
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
69
- sprintf( __( "The file %s is not writeable", "defender-security" ), $htPath ) );
70
  }
71
  $htConfig = file_get_contents( $htPath );
72
  $rules = $this->apache_rule();
@@ -126,4 +126,4 @@ class Protect_Information_Service extends Rule_Service implements IRule_Service
126
  }
127
  return $rules;
128
  }
129
- }
43
  }
44
  if ( ! is_writeable( $htPath ) ) {
45
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
46
+ sprintf( __( "The file %s is not writable", "defender-security" ), $htPath ) );
47
  }
48
  $htConfig = file( $htPath );
49
  $rules = $this->apache_rule();
66
  $htPath = ABSPATH . '.htaccess';
67
  if ( ! is_writeable( $htPath ) ) {
68
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
69
+ sprintf( __( "The file %s is not writable", "defender-security" ), $htPath ) );
70
  }
71
  $htConfig = file_get_contents( $htPath );
72
  $rules = $this->apache_rule();
126
  }
127
  return $rules;
128
  }
129
+ }
app/module/hardener/component/security-key-service.php CHANGED
@@ -45,7 +45,7 @@ class Security_Key_Service extends Rule_Service implements IRule_Service {
45
  //check if can write
46
  if ( ! is_writeable( $config_path ) ) {
47
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
48
- sprintf( __( "The file %s is not writeable", "defender-security" ), $config_path ) );
49
  }
50
 
51
  return $this->generateSalt( $config_path );
@@ -124,4 +124,4 @@ class Security_Key_Service extends Rule_Service implements IRule_Service {
124
 
125
  return true;
126
  }
127
- }
45
  //check if can write
46
  if ( ! is_writeable( $config_path ) ) {
47
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
48
+ sprintf( __( "The file %s is not writable", "defender-security" ), $config_path ) );
49
  }
50
 
51
  return $this->generateSalt( $config_path );
124
 
125
  return true;
126
  }
127
+ }
app/module/hardener/component/servers/apache-service.php CHANGED
@@ -12,32 +12,32 @@ use WP_Defender\Module\Hardener\Rule_Service;
12
 
13
  class Apache_Service extends Rule_Service implements IRule_Service {
14
 
15
- /**
16
- * Exclude file paths
17
- *
18
- * @var array|bool|mixed
19
- */
20
- private $exclude_file_paths = array();
21
 
22
  /**
23
- * New htaccess file
24
- *
25
- * @var array|bool|mixed
26
- */
27
- private $new_htconfig = array();
28
 
29
- /**
30
  * @return bool
31
  */
32
  public function check() {
33
- return true;
34
- }
35
 
36
- /**
37
  * @return bool|\WP_Error
38
  */
39
- public function process() {
40
- $ret = $this->protectContentDir();
41
  if ( is_wp_error( $ret ) ) {
42
  return $ret;
43
  }
@@ -53,36 +53,36 @@ class Apache_Service extends Rule_Service implements IRule_Service {
53
  }
54
 
55
  return true;
56
- }
57
 
58
- /**
59
  * @return bool|\WP_Error
60
  */
61
  private function protectIncludesDir() {
62
  $htPath = ABSPATH . WPINC . '/' . '.htaccess';
63
 
64
  if ( ! is_file( $htPath ) ) {
65
- if ( ! file_put_contents( $htPath, '', LOCK_EX ) ) {
66
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
67
- sprintf( __( "The file %s is not writeable", "defender-security" ), $htPath ) );
68
  }
69
  } elseif ( ! is_writeable( $htPath ) ) {
70
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
71
- sprintf( __( "The file %s is not writeable", "defender-security" ), $htPath ) );
72
  }
73
- $htConfig = file( $htPath );
74
- $deny = $this->generateHtAccessRule( false );
75
- $allow = $this->generateHtAccessRule( true );
76
- $default = array(
77
  PHP_EOL . '## WP Defender - Protect PHP Executed ##' . PHP_EOL,
78
  '<Files *.php>' . PHP_EOL .
79
- $deny .
80
  '</Files>' . PHP_EOL,
81
  '<Files wp-tinymce.php>' . PHP_EOL .
82
- $allow .
83
  '</Files>' . PHP_EOL,
84
  '<Files ms-files.php>' . PHP_EOL .
85
- $allow .
86
  '</Files>' . PHP_EOL,
87
  '## WP Defender - End ##' . PHP_EOL
88
  );
@@ -106,18 +106,18 @@ class Apache_Service extends Rule_Service implements IRule_Service {
106
  private function protectContentDir() {
107
  $htPath = WP_CONTENT_DIR . '/' . '.htaccess';
108
  if ( ! file_exists( $htPath ) ) {
109
- if ( ! file_put_contents( $htPath, '', LOCK_EX ) ) {
110
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
111
- sprintf( __( "The file %s is not writeable", "defender-security" ), $htPath ) );
112
  }
113
  } elseif ( ! is_writeable( $htPath ) ) {
114
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
115
- sprintf( __( "The file %s is not writeable", "defender-security" ), $htPath ) );
116
  }
117
- $htConfig = file( $htPath );
118
- $deny = $this->generateHtAccessRule( false );
119
- $allow = $this->generateHtAccessRule( true );
120
- $default = array(
121
  PHP_EOL . '## WP Defender - Protect PHP Executed ##' . PHP_EOL,
122
  '<Files *.php>' . PHP_EOL .
123
  $deny .
@@ -130,11 +130,11 @@ class Apache_Service extends Rule_Service implements IRule_Service {
130
  $custom_exclude = array();
131
 
132
  foreach ( $this->exclude_file_paths as $file_path ) {
133
- $file_path = trim( preg_replace('/\s\s+/', ' ', $file_path ) ); //remove trailing new lines
134
- if ( !empty( $file_path ) ) {
135
- $custom_exclude[] = '<Files ' . $file_path . '> '. PHP_EOL .
136
- $allow .
137
- '</Files>' . PHP_EOL;
138
  }
139
  }
140
 
@@ -157,7 +157,7 @@ class Apache_Service extends Rule_Service implements IRule_Service {
157
  /**
158
  * Protect uploads directory
159
  * Sometimes a user will set a custom upload directory
160
- *
161
  * @return bool|\WP_Error
162
  */
163
  public function protectUploadsDir() {
@@ -166,16 +166,16 @@ class Apache_Service extends Rule_Service implements IRule_Service {
166
  if ( ! file_exists( $htPath ) ) {
167
  if ( ! file_put_contents( $htPath, '', LOCK_EX ) ) {
168
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
169
- sprintf( __( "The file %s is not writeable", "defender-security" ), $htPath ) );
170
  }
171
  } elseif ( ! is_writeable( $htPath ) ) {
172
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
173
- sprintf( __( "The file %s is not writeable", "defender-security" ), $htPath ) );
174
  }
175
- $htConfig = file( $htPath );
176
- $deny = $this->generateHtAccessRule( false );
177
- $allow = $this->generateHtAccessRule( true );
178
- $default = array(
179
  PHP_EOL . '## WP Defender - Protect PHP Executed ##' . PHP_EOL,
180
  '<Files *.php>' . PHP_EOL .
181
  $deny .
@@ -188,11 +188,11 @@ class Apache_Service extends Rule_Service implements IRule_Service {
188
  $custom_exclude = array();
189
 
190
  foreach ( $this->exclude_file_paths as $file_path ) {
191
- $file_path = trim( preg_replace('/\s\s+/', ' ', $file_path ) ); //remove trailing new lines
192
- if ( !empty( $file_path ) ) {
193
- $custom_exclude[] = '<Files ' . $file_path . '> '. PHP_EOL .
194
- $allow .
195
- '</Files>' . PHP_EOL;
196
  }
197
  }
198
 
@@ -209,6 +209,7 @@ class Apache_Service extends Rule_Service implements IRule_Service {
209
  file_put_contents( $htPath, implode( '', $htConfig ), LOCK_EX );
210
  }
211
  }
 
212
  return true;
213
  }
214
 
@@ -216,14 +217,14 @@ class Apache_Service extends Rule_Service implements IRule_Service {
216
  $htPath = WP_CONTENT_DIR . '/' . '.htaccess';
217
  if ( ! is_writeable( $htPath ) ) {
218
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
219
- sprintf( __( "The file %s is not writeable", "defender-security" ), $htPath ) );
220
  }
221
- $htConfig = file_get_contents( $htPath );
222
- $deny = $this->generateHtAccessRule( false );
223
- $default = array(
224
- PHP_EOL .'## WP Defender - Protect PHP Executed ##' . PHP_EOL,
225
  '<Files *.php>' . PHP_EOL .
226
- $deny .
227
  '</Files>' . PHP_EOL,
228
  '## WP Defender - End ##' . PHP_EOL
229
  );
@@ -233,7 +234,7 @@ class Apache_Service extends Rule_Service implements IRule_Service {
233
  }
234
 
235
  //Introduced regex
236
- preg_match_all('/## WP Defender(.*?)## WP Defender - End ##/s', $htConfig, $matches);
237
  if ( is_array( $matches ) && count( $matches ) > 0 ) {
238
  $htConfig = str_replace( implode( '', $matches[0] ), '', $htConfig );
239
  } else {
@@ -247,26 +248,26 @@ class Apache_Service extends Rule_Service implements IRule_Service {
247
  $htPath = ABSPATH . WPINC . '/' . '.htaccess';
248
  if ( ! is_writeable( $htPath ) ) {
249
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
250
- sprintf( __( "The file %s is not writeable", "defender-security" ), $htPath ) );
251
  }
252
- $htConfig = file_get_contents( $htPath );
253
- $deny = $this->generateHtAccessRule( false );
254
- $allow = $this->generateHtAccessRule( true );
255
- $default = array(
256
  PHP_EOL . '## WP Defender - Protect PHP Executed ##' . PHP_EOL,
257
  '<Files *.php>' . PHP_EOL .
258
- $deny .
259
  '</Files>' . PHP_EOL,
260
  '<Files wp-tinymce.php>' . PHP_EOL .
261
- $allow .
262
  '</Files>' . PHP_EOL,
263
  '<Files ms-files.php>' . PHP_EOL .
264
- $allow .
265
  '</Files>' . PHP_EOL,
266
  '## WP Defender - End ##' . PHP_EOL
267
  );
268
 
269
- preg_match_all('/## WP Defender(.*?)## WP Defender - End ##/s', $htConfig, $matches);
270
  if ( is_array( $matches ) && count( $matches ) > 0 ) {
271
  $htConfig = str_replace( implode( '', $matches[0] ), '', $htConfig );
272
  } else {
@@ -281,14 +282,14 @@ class Apache_Service extends Rule_Service implements IRule_Service {
281
  $htPath = ABSPATH . UPLOADS . '/' . '.htaccess';
282
  if ( ! is_writeable( $htPath ) ) {
283
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
284
- sprintf( __( "The file %s is not writeable", "defender-security" ), $htPath ) );
285
  }
286
- $htConfig = file_get_contents( $htPath );
287
- $deny = $this->generateHtAccessRule( false );
288
- $default = array(
289
- PHP_EOL .'## WP Defender - Protect PHP Executed ##' . PHP_EOL,
290
  '<Files *.php>' . PHP_EOL .
291
- $deny .
292
  '</Files>' . PHP_EOL,
293
  '## WP Defender - End ##' . PHP_EOL
294
  );
@@ -298,7 +299,7 @@ class Apache_Service extends Rule_Service implements IRule_Service {
298
  }
299
 
300
  //Introduced regex
301
- preg_match_all('/## WP Defender(.*?)## WP Defender - End ##/s', $htConfig, $matches);
302
  if ( is_array( $matches ) && count( $matches ) > 0 ) {
303
  $htConfig = str_replace( implode( '', $matches[0] ), '', $htConfig );
304
  } else {
@@ -309,28 +310,28 @@ class Apache_Service extends Rule_Service implements IRule_Service {
309
  }
310
  }
311
 
312
- /**
313
  * @return bool|\WP_Error
314
  */
315
  public function revert() {
316
- $ret = $this->unProtectContentDir();
317
- if ( is_wp_error( $ret ) ) {
318
- return $ret;
319
- }
320
-
321
- $ret = $this->unProtectIncludeDir();
322
- if ( is_wp_error( $ret ) ) {
323
- return $ret;
324
  }
325
  $ret = $this->unProtectUploadDir();
326
  if ( is_wp_error( $ret ) ) {
327
- return $ret;
328
  }
329
 
330
- return true;
331
- }
332
 
333
- /**
334
  * Set the exclude file paths
335
  *
336
  * @param String $paths
@@ -349,7 +350,7 @@ class Apache_Service extends Rule_Service implements IRule_Service {
349
  */
350
  public function getExcludedFilePaths() {
351
  return $this->exclude_file_paths;
352
- }
353
 
354
  /**
355
  * Set the exclude file paths
@@ -370,7 +371,7 @@ class Apache_Service extends Rule_Service implements IRule_Service {
370
  */
371
  public function getNewHtConfig() {
372
  return $this->new_htconfig;
373
- }
374
 
375
  /**
376
  * Return the correct apache rules for allow/deny
@@ -390,9 +391,10 @@ class Apache_Service extends Rule_Service implements IRule_Service {
390
  return 'Allow from all' . PHP_EOL;
391
  } else {
392
  return 'Order allow,deny' . PHP_EOL .
393
- 'Deny from all' . PHP_EOL;
394
  }
395
  }
396
  }
397
  }
398
- ?>
 
12
 
13
  class Apache_Service extends Rule_Service implements IRule_Service {
14
 
15
+ /**
16
+ * Exclude file paths
17
+ *
18
+ * @var array|bool|mixed
19
+ */
20
+ private $exclude_file_paths = array();
21
 
22
  /**
23
+ * New htaccess file
24
+ *
25
+ * @var array|bool|mixed
26
+ */
27
+ private $new_htconfig = array();
28
 
29
+ /**
30
  * @return bool
31
  */
32
  public function check() {
33
+ return true;
34
+ }
35
 
36
+ /**
37
  * @return bool|\WP_Error
38
  */
39
+ public function process() {
40
+ $ret = $this->protectContentDir();
41
  if ( is_wp_error( $ret ) ) {
42
  return $ret;
43
  }
53
  }
54
 
55
  return true;
56
+ }
57
 
58
+ /**
59
  * @return bool|\WP_Error
60
  */
61
  private function protectIncludesDir() {
62
  $htPath = ABSPATH . WPINC . '/' . '.htaccess';
63
 
64
  if ( ! is_file( $htPath ) ) {
65
+ if ( file_put_contents( $htPath, '', LOCK_EX ) === false ) {
66
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
67
+ sprintf( __( "The file %s is not writable", "defender-security" ), $htPath ) );
68
  }
69
  } elseif ( ! is_writeable( $htPath ) ) {
70
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
71
+ sprintf( __( "The file %s is not writable", "defender-security" ), $htPath ) );
72
  }
73
+ $htConfig = file( $htPath );
74
+ $deny = $this->generateHtAccessRule( false );
75
+ $allow = $this->generateHtAccessRule( true );
76
+ $default = array(
77
  PHP_EOL . '## WP Defender - Protect PHP Executed ##' . PHP_EOL,
78
  '<Files *.php>' . PHP_EOL .
79
+ $deny .
80
  '</Files>' . PHP_EOL,
81
  '<Files wp-tinymce.php>' . PHP_EOL .
82
+ $allow .
83
  '</Files>' . PHP_EOL,
84
  '<Files ms-files.php>' . PHP_EOL .
85
+ $allow .
86
  '</Files>' . PHP_EOL,
87
  '## WP Defender - End ##' . PHP_EOL
88
  );
106
  private function protectContentDir() {
107
  $htPath = WP_CONTENT_DIR . '/' . '.htaccess';
108
  if ( ! file_exists( $htPath ) ) {
109
+ if ( file_put_contents( $htPath, '', LOCK_EX ) === false ) {
110
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
111
+ sprintf( __( "The file %s is not writable", "defender-security" ), $htPath ) );
112
  }
113
  } elseif ( ! is_writeable( $htPath ) ) {
114
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
115
+ sprintf( __( "The file %s is not writable", "defender-security" ), $htPath ) );
116
  }
117
+ $htConfig = file( $htPath );
118
+ $deny = $this->generateHtAccessRule( false );
119
+ $allow = $this->generateHtAccessRule( true );
120
+ $default = array(
121
  PHP_EOL . '## WP Defender - Protect PHP Executed ##' . PHP_EOL,
122
  '<Files *.php>' . PHP_EOL .
123
  $deny .
130
  $custom_exclude = array();
131
 
132
  foreach ( $this->exclude_file_paths as $file_path ) {
133
+ $file_path = trim( preg_replace( '/\s\s+/', ' ', $file_path ) ); //remove trailing new lines
134
+ if ( ! empty( $file_path ) ) {
135
+ $custom_exclude[] = '<Files ' . $file_path . '> ' . PHP_EOL .
136
+ $allow .
137
+ '</Files>' . PHP_EOL;
138
  }
139
  }
140
 
157
  /**
158
  * Protect uploads directory
159
  * Sometimes a user will set a custom upload directory
160
+ *
161
  * @return bool|\WP_Error
162
  */
163
  public function protectUploadsDir() {
166
  if ( ! file_exists( $htPath ) ) {
167
  if ( ! file_put_contents( $htPath, '', LOCK_EX ) ) {
168
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
169
+ sprintf( __( "The file %s is not writable", "defender-security" ), $htPath ) );
170
  }
171
  } elseif ( ! is_writeable( $htPath ) ) {
172
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
173
+ sprintf( __( "The file %s is not writable", "defender-security" ), $htPath ) );
174
  }
175
+ $htConfig = file( $htPath );
176
+ $deny = $this->generateHtAccessRule( false );
177
+ $allow = $this->generateHtAccessRule( true );
178
+ $default = array(
179
  PHP_EOL . '## WP Defender - Protect PHP Executed ##' . PHP_EOL,
180
  '<Files *.php>' . PHP_EOL .
181
  $deny .
188
  $custom_exclude = array();
189
 
190
  foreach ( $this->exclude_file_paths as $file_path ) {
191
+ $file_path = trim( preg_replace( '/\s\s+/', ' ', $file_path ) ); //remove trailing new lines
192
+ if ( ! empty( $file_path ) ) {
193
+ $custom_exclude[] = '<Files ' . $file_path . '> ' . PHP_EOL .
194
+ $allow .
195
+ '</Files>' . PHP_EOL;
196
  }
197
  }
198
 
209
  file_put_contents( $htPath, implode( '', $htConfig ), LOCK_EX );
210
  }
211
  }
212
+
213
  return true;
214
  }
215
 
217
  $htPath = WP_CONTENT_DIR . '/' . '.htaccess';
218
  if ( ! is_writeable( $htPath ) ) {
219
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
220
+ sprintf( __( "The file %s is not writable", "defender-security" ), $htPath ) );
221
  }
222
+ $htConfig = file_get_contents( $htPath );
223
+ $deny = $this->generateHtAccessRule( false );
224
+ $default = array(
225
+ PHP_EOL . '## WP Defender - Protect PHP Executed ##' . PHP_EOL,
226
  '<Files *.php>' . PHP_EOL .
227
+ $deny .
228
  '</Files>' . PHP_EOL,
229
  '## WP Defender - End ##' . PHP_EOL
230
  );
234
  }
235
 
236
  //Introduced regex
237
+ preg_match_all( '/## WP Defender(.*?)## WP Defender - End ##/s', $htConfig, $matches );
238
  if ( is_array( $matches ) && count( $matches ) > 0 ) {
239
  $htConfig = str_replace( implode( '', $matches[0] ), '', $htConfig );
240
  } else {
248
  $htPath = ABSPATH . WPINC . '/' . '.htaccess';
249
  if ( ! is_writeable( $htPath ) ) {
250
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
251
+ sprintf( __( "The file %s is not writable", "defender-security" ), $htPath ) );
252
  }
253
+ $htConfig = file_get_contents( $htPath );
254
+ $deny = $this->generateHtAccessRule( false );
255
+ $allow = $this->generateHtAccessRule( true );
256
+ $default = array(
257
  PHP_EOL . '## WP Defender - Protect PHP Executed ##' . PHP_EOL,
258
  '<Files *.php>' . PHP_EOL .
259
+ $deny .
260
  '</Files>' . PHP_EOL,
261
  '<Files wp-tinymce.php>' . PHP_EOL .
262
+ $allow .
263
  '</Files>' . PHP_EOL,
264
  '<Files ms-files.php>' . PHP_EOL .
265
+ $allow .
266
  '</Files>' . PHP_EOL,
267
  '## WP Defender - End ##' . PHP_EOL
268
  );
269
 
270
+ preg_match_all( '/## WP Defender(.*?)## WP Defender - End ##/s', $htConfig, $matches );
271
  if ( is_array( $matches ) && count( $matches ) > 0 ) {
272
  $htConfig = str_replace( implode( '', $matches[0] ), '', $htConfig );
273
  } else {
282
  $htPath = ABSPATH . UPLOADS . '/' . '.htaccess';
283
  if ( ! is_writeable( $htPath ) ) {
284
  return new \WP_Error( Error_Code::NOT_WRITEABLE,
285
+ sprintf( __( "The file %s is not writable", "defender-security" ), $htPath ) );
286
  }
287
+ $htConfig = file_get_contents( $htPath );
288
+ $deny = $this->generateHtAccessRule( false );
289
+ $default = array(
290
+ PHP_EOL . '## WP Defender - Protect PHP Executed ##' . PHP_EOL,
291
  '<Files *.php>' . PHP_EOL .
292
+ $deny .
293
  '</Files>' . PHP_EOL,
294
  '## WP Defender - End ##' . PHP_EOL
295
  );
299
  }
300
 
301
  //Introduced regex
302
+ preg_match_all( '/## WP Defender(.*?)## WP Defender - End ##/s', $htConfig, $matches );
303
  if ( is_array( $matches ) && count( $matches ) > 0 ) {
304
  $htConfig = str_replace( implode( '', $matches[0] ), '', $htConfig );
305
  } else {
310
  }
311
  }
312
 
313
+ /**
314
  * @return bool|\WP_Error
315
  */
316
  public function revert() {
317
+ $ret = $this->unProtectContentDir();
318
+ if ( is_wp_error( $ret ) ) {
319
+ return $ret;
320
+ }
321
+
322
+ $ret = $this->unProtectIncludeDir();
323
+ if ( is_wp_error( $ret ) ) {
324
+ return $ret;
325
  }
326
  $ret = $this->unProtectUploadDir();
327
  if ( is_wp_error( $ret ) ) {
328
+ return $ret;
329
  }
330
 
331
+ return true;
332
+ }
333
 
334
+ /**
335
  * Set the exclude file paths
336
  *
337
  * @param String $paths
350
  */
351
  public function getExcludedFilePaths() {
352
  return $this->exclude_file_paths;
353
+ }
354
 
355
  /**
356
  * Set the exclude file paths
371
  */
372
  public function getNewHtConfig() {
373
  return $this->new_htconfig;
374
+ }
375
 
376
  /**
377
  * Return the correct apache rules for allow/deny
391
  return 'Allow from all' . PHP_EOL;
392
  } else {
393
  return 'Order allow,deny' . PHP_EOL .
394
+ 'Deny from all' . PHP_EOL;
395
  }
396
  }
397
  }
398
  }
399
+
400
+ ?>
app/module/ip-lockout/component/logs-table.php CHANGED
@@ -178,7 +178,7 @@ class Logs_Table extends \WP_List_Table {
178
  </div>
179
  <div class="column is-4">
180
  <strong>
181
- <?php _e( "Ip Address", "defender-security" ) ?>
182
  </strong>
183
  <input name="ip_address" type="text"
184
  placeholder="<?php esc_attr_e( "Enter an IP address", "defender-security" ) ?>">
@@ -471,4 +471,4 @@ class Logs_Table extends \WP_List_Table {
471
  echo "<$tag $scope $id $class>$column_display_name</$tag>";
472
  }
473
  }
474
- }
178
  </div>
179
  <div class="column is-4">
180
  <strong>
181
+ <?php _e( "IP Address", "defender-security" ) ?>
182
  </strong>
183
  <input name="ip_address" type="text"
184
  placeholder="<?php esc_attr_e( "Enter an IP address", "defender-security" ) ?>">
471
  echo "<$tag $scope $id $class>$column_display_name</$tag>";
472
  }
473
  }
474
+ }
app/module/ip-lockout/controller/main.php CHANGED
@@ -222,11 +222,12 @@ class Main extends Controller {
222
  'message' => Login_Protection_Api::getLogsActionsText( $log )
223
  ) );
224
  } else {
225
- $item = new \StdClass();
226
  $item->ip = $ip;
 
227
  wp_send_json_success( array(
228
  'message' => sprintf( __( "IP %s has been added to your blacklist. You can control your blacklist in <a href=\"%s\">IP Lockouts.</a>", "defender-security" ), $ip, network_admin_url( 'admin.php?page=wdf-ip-lockout&view=blacklist' ) ),
229
- 'buttons' => Login_Protection_Api::getLogsActionsText($item )
230
  ) );
231
  }
232
  } else {
222
  'message' => Login_Protection_Api::getLogsActionsText( $log )
223
  ) );
224
  } else {
225
+ $item = new \StdClass();
226
  $item->ip = $ip;
227
+ $item->id = null;
228
  wp_send_json_success( array(
229
  'message' => sprintf( __( "IP %s has been added to your blacklist. You can control your blacklist in <a href=\"%s\">IP Lockouts.</a>", "defender-security" ), $ip, network_admin_url( 'admin.php?page=wdf-ip-lockout&view=blacklist' ) ),
230
+ 'buttons' => Login_Protection_Api::getLogsActionsText( $item )
231
  ) );
232
  }
233
  } else {
app/module/ip-lockout/model/settings.php CHANGED
@@ -65,7 +65,13 @@ class Settings extends \Hammer\WP\Settings {
65
 
66
  //default is weekly
67
  $this->report_day = strtolower( date( 'l' ) );
68
- $this->report_time = ltrim( date( 'H', current_time( 'timestamp' ) ) . ':0', '0' );
 
 
 
 
 
 
69
  }
70
  parent::__construct( $id, $isMulti );
71
  }
65
 
66
  //default is weekly
67
  $this->report_day = strtolower( date( 'l' ) );
68
+ $hour = date( 'H', current_time( 'timestamp' ) );
69
+ if ( $hour == '00' ) {
70
+ $hour = 0;
71
+ } else {
72
+ $hour = ltrim( $hour, '0' );
73
+ }
74
+ $this->report_time = $hour . ':0';
75
  }
76
  parent::__construct( $id, $isMulti );
77
  }
app/module/ip-lockout/view/blacklist/enabled.php CHANGED
@@ -14,7 +14,7 @@
14
  <?php _e( "Blacklist", "defender-security" ) ?>
15
  </label>
16
  <span class="sub">
17
- <?php _e( "Any IP addresses you list here will be completely blocked from accessing our website, including admins.", "defender-security" ) ?>
18
  </span>
19
  </div>
20
  <div class="column">
@@ -116,4 +116,4 @@
116
  <div class="clear"></div>
117
  </form>
118
  </div>
119
- </div>
14
  <?php _e( "Blacklist", "defender-security" ) ?>
15
  </label>
16
  <span class="sub">
17
+ <?php _e( "Any IP addresses you list here will be completely blocked from accessing your website, including admins.", "defender-security" ) ?>
18
  </span>
19
  </div>
20
  <div class="column">
116
  <div class="clear"></div>
117
  </form>
118
  </div>
119
+ </div>
app/module/ip-lockout/view/notification/report-free.php CHANGED
@@ -76,9 +76,9 @@
76
  </form>
77
  <div class="presale-text">
78
  <div>
79
- <?php printf( __( "Schedule automated file scanning and email reporting for all your websites. This feature is included in a WPMU DEV membership along with 100+ plugins & themes, 24/7 support and lots of handy site management tools – <a target='_blank' href=\"%s\">Try it all FREE today!</a>", "defender-security" ), \WP_Defender\Behavior\Utils::instance()->campaignURL('defender_iplockouts_reports_upsell_link') ) ?>
80
  </div>
81
  </div>
82
  </div>
83
  </div>
84
- <?php $controller->renderPartial('pro-feature') ?>
76
  </form>
77
  <div class="presale-text">
78
  <div>
79
+ <?php printf( __( "Schedule automated file scanning and email reporting for all your websites. This feature is included in a WPMU DEV membership along with 100+ plugins, 24/7 support and lots of handy site management tools – <a target='_blank' href=\"%s\">Try it all FREE today!</a>", "defender-security" ), \WP_Defender\Behavior\Utils::instance()->campaignURL('defender_iplockouts_reports_upsell_link') ) ?>
80
  </div>
81
  </div>
82
  </div>
83
  </div>
84
+ <?php $controller->renderPartial('pro-feature') ?>
app/module/ip-lockout/view/pro-feature.php CHANGED
@@ -1,6 +1,6 @@
1
  <dialog class="dev-team" id="pro-feature" title="<?php _e( "Defender Pro Features", "defender-security" ) ?>">
2
  <div class="wp-defender">
3
- <p class=""><?php _e( "Here’s what you’ll get by upgrading to Defender Pro;", "defender-security" ) ?></p>
4
  <div class="well well-blank with-cap">
5
  <i class="def-icon icon-tick fill-blue"></i>
6
  <strong><?php _e( "Automatic Full File Scans & Notifications", "defender-security" ) ?></strong>
@@ -33,7 +33,7 @@
33
  </div>
34
  <div class="tc">
35
  <a class="button button-green mline" href="https://premium.wpmudev.org/project/wp-defender/?utm_source=defender&utm_medium=plugin&utm_campaign=defender_modal_upgrade"><?php _e( "Get Defender Pro for Free", "defender-security" ) ?></a>
36
- <p class="is-marginless"><?php _e( "As part part of a WPMU DEV free trial.", "defender-security" ) ?></p>
37
  </div>
38
  </div>
39
- </dialog>
1
  <dialog class="dev-team" id="pro-feature" title="<?php _e( "Defender Pro Features", "defender-security" ) ?>">
2
  <div class="wp-defender">
3
+ <p class=""><?php _e( "Here’s what you’ll get by upgrading to Defender Pro:", "defender-security" ) ?></p>
4
  <div class="well well-blank with-cap">
5
  <i class="def-icon icon-tick fill-blue"></i>
6
  <strong><?php _e( "Automatic Full File Scans & Notifications", "defender-security" ) ?></strong>
33
  </div>
34
  <div class="tc">
35
  <a class="button button-green mline" href="https://premium.wpmudev.org/project/wp-defender/?utm_source=defender&utm_medium=plugin&utm_campaign=defender_modal_upgrade"><?php _e( "Get Defender Pro for Free", "defender-security" ) ?></a>
36
+ <p class="is-marginless"><?php _e( "As part of a WPMU DEV free trial.", "defender-security" ) ?></p>
37
  </div>
38
  </div>
39
+ </dialog>
app/module/scan/behavior/scan.php CHANGED
@@ -88,7 +88,7 @@ class Scan extends Behavior {
88
  <?php
89
  if ( $this->countAll == 0 ): ?>
90
  <span class="def-tag tag-success">
91
- <?php else:
92
  ?>
93
  <span class="def-tag tag-error">
94
  <?php endif;
@@ -195,8 +195,8 @@ class Scan extends Behavior {
195
  ob_start();
196
  ?>
197
  <div class="line">
198
- <?php _e( "Scan your website for file changes, vulnerabilities and injected code and get and
199
- get notified about anything suspicious.", "defender-security" ) ?>
200
  </div>
201
  <form id="start-a-scan" method="post" class="scan-frm">
202
  <?php
@@ -239,4 +239,4 @@ class Scan extends Behavior {
239
  <?php
240
  return ob_get_clean();
241
  }
242
- }
88
  <?php
89
  if ( $this->countAll == 0 ): ?>
90
  <span class="def-tag tag-success">
91
+ <?php else:
92
  ?>
93
  <span class="def-tag tag-error">
94
  <?php endif;
195
  ob_start();
196
  ?>
197
  <div class="line">
198
+ <?php _e( "Scan your website for file changes, vulnerabilities and injected code and get
199
+ notified about anything suspicious.", "defender-security" ) ?>
200
  </div>
201
  <form id="start-a-scan" method="post" class="scan-frm">
202
  <?php
239
  <?php
240
  return ob_get_clean();
241
  }
242
+ }
app/module/scan/component/result-table.php CHANGED
@@ -103,7 +103,7 @@ class Result_Table extends \WP_List_Table {
103
  */
104
  function prepare_items() {
105
  $model = Scan_Api::getLastScan();
106
- $itemsPerPage = 20;
107
  $totalItems = $model->countAll( $this->type );
108
 
109
  $this->set_pagination_args( array(
@@ -197,7 +197,7 @@ class Result_Table extends \WP_List_Table {
197
  <select name="bulk" class="bulk-action">
198
  <?php if ( $this->type != Result_Item::STATUS_IGNORED ): ?>
199
  <option value="ignore"><?php _e( "Ignore", "defender-security" ) ?></option>
200
- <!-- <option value="resolve">--><?php //_e( "Resolve", "defender-security" ) ?><!--</option>-->
201
  <!-- <option value="delete">--><?php //_e( "Delete", "defender-security" ) ?><!--</option>-->
202
  <?php endif; ?>
203
  <?php if ( $this->type == Result_Item::STATUS_IGNORED ): ?>
103
  */
104
  function prepare_items() {
105
  $model = Scan_Api::getLastScan();
106
+ $itemsPerPage = 100;
107
  $totalItems = $model->countAll( $this->type );
108
 
109
  $this->set_pagination_args( array(
197
  <select name="bulk" class="bulk-action">
198
  <?php if ( $this->type != Result_Item::STATUS_IGNORED ): ?>
199
  <option value="ignore"><?php _e( "Ignore", "defender-security" ) ?></option>
200
+ <!-- <option value="resolve">--><?php //_e( "Resolve", "defender-security" ) ?><!--</option>-->
201
  <!-- <option value="delete">--><?php //_e( "Delete", "defender-security" ) ?><!--</option>-->
202
  <?php endif; ?>
203
  <?php if ( $this->type == Result_Item::STATUS_IGNORED ): ?>
app/module/scan/component/scan-api.php CHANGED
@@ -432,6 +432,9 @@ class Scan_Api extends Component {
432
  }
433
  }
434
  }
 
 
 
435
 
436
  if ( $total > 0 ) {
437
  return round( ( $currentIndex / $total ) * 100, 2 );
432
  }
433
  }
434
  }
435
+ if ( php_sapi_name() == "cli" ) {
436
+ echo $total . PHP_EOL;
437
+ }
438
 
439
  if ( $total > 0 ) {
440
  return round( ( $currentIndex / $total ) * 100, 2 );
app/module/scan/controller/main.php CHANGED
@@ -209,7 +209,7 @@ class Main extends \WP_Defender\Controller {
209
  if ( $ids ) {
210
  $this->submitStatsToDev();
211
  wp_send_json_success( array(
212
- 'message' => _n( "The suspicious files has been successfully deleted.",
213
  "The suspicious files have been successfully deleted.",
214
  count( $items ), "defender-security" )
215
  ) );
@@ -232,7 +232,7 @@ class Main extends \WP_Defender\Controller {
232
  if ( $ids ) {
233
  $this->submitStatsToDev();
234
  wp_send_json_success( array(
235
- 'message' => _n( "The suspicious files has been successfully resolved.",
236
  "The suspicious files have been successfully resolved.",
237
  count( $items ), "defender-security" )
238
  ) );
@@ -912,4 +912,4 @@ class Main extends \WP_Defender\Controller {
912
 
913
  return $counts;
914
  }
915
- }
209
  if ( $ids ) {
210
  $this->submitStatsToDev();
211
  wp_send_json_success( array(
212
+ 'message' => _n( "The suspicious file has been successfully deleted.",
213
  "The suspicious files have been successfully deleted.",
214
  count( $items ), "defender-security" )
215
  ) );
232
  if ( $ids ) {
233
  $this->submitStatsToDev();
234
  wp_send_json_success( array(
235
+ 'message' => _n( "The suspicious file has been successfully resolved.",
236
  "The suspicious files have been successfully resolved.",
237
  count( $items ), "defender-security" )
238
  ) );
912
 
913
  return $counts;
914
  }
915
+ }
app/module/scan/js/script.js CHANGED
@@ -14,6 +14,22 @@ jQuery(function ($) {
14
  Defender.showNotification('error', data.data.message);
15
  }
16
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  //processing scan
18
  if ($('#scanning').size() > 0) {
19
  $('body').addClass('wpmud');
@@ -121,6 +137,7 @@ jQuery(function ($) {
121
  }
122
 
123
  if (data.success == true) {
 
124
  var parent = form.closest('.source-code');
125
  parent.html(data.data.html);
126
 
14
  Defender.showNotification('error', data.data.message);
15
  }
16
  });
17
+ var current_issue = null;
18
+ $('body').on('click', '#next_issue', function () {
19
+ var parent = $(this).parent().find('.inner-sourcecode').first();
20
+ if (current_issue === null) {
21
+ current_issue = parent.find('del').first();
22
+ } else {
23
+ current_issue = current_issue.next('del').first();
24
+ }
25
+ console.log(parent);
26
+ if (current_issue.size() > 0) {
27
+ var pos = current_issue.position();
28
+ console.log(current_issue.offset());
29
+ console.log(current_issue.position());
30
+ parent.scrollTop(pos.top);
31
+ }
32
+ })
33
  //processing scan
34
  if ($('#scanning').size() > 0) {
35
  $('body').addClass('wpmud');
137
  }
138
 
139
  if (data.success == true) {
140
+ current_issue = null;
141
  var parent = form.closest('.source-code');
142
  parent.html(data.data.html);
143
 
app/module/scan/model/settings.php CHANGED
@@ -128,8 +128,14 @@ Official WPMU DEV Superhero', "defender-security" );
128
  if ( is_admin() || is_network_admin() && current_user_can( 'manage_options' ) ) {
129
  $this->receipts[] = get_current_user_id();
130
  //default is weekly
131
- $this->day = date( 'l' );
132
- $this->time = ltrim( date( 'H', current_time( 'timestamp' ) ) . ':0', '0' );
 
 
 
 
 
 
133
  }
134
 
135
  parent::__construct( $id, $is_multi );
128
  if ( is_admin() || is_network_admin() && current_user_can( 'manage_options' ) ) {
129
  $this->receipts[] = get_current_user_id();
130
  //default is weekly
131
+ $this->day = date( 'l' );
132
+ $hour = date( 'H', current_time( 'timestamp' ) );
133
+ if ( $hour == '00' ) {
134
+ $hour = 0;
135
+ } else {
136
+ $hour = ltrim( $hour, '0' );
137
+ }
138
+ $this->time = $hour . ':0';
139
  }
140
 
141
  parent::__construct( $id, $is_multi );
app/module/scan/view/automation-free.php CHANGED
@@ -60,8 +60,8 @@
60
  </form>
61
  <div class="presale-text">
62
  <div>
63
- <?php printf( __( "Schedule automated file scanning and email reporting for all your websites. This feature is included in a WPMU DEV membership along with 100+ plugins & themes, 24/7 support and lots of handy site management tools – <a target='_blank' href=\"%s\">Try it all FREE today!</a>", "defender-security" ), \WP_Defender\Behavior\Utils::instance()->campaignURL('defender_filescanning_reports_upsell_link') ) ?>
64
  </div>
65
  </div>
66
  </div>
67
- </div>
60
  </form>
61
  <div class="presale-text">
62
  <div>
63
+ <?php printf( __( "Schedule automated file scanning and email reporting for all your websites. This feature is included in a WPMU DEV membership along with 100+ plugins, 24/7 support and lots of handy site management tools – <a target='_blank' href=\"%s\">Try it all FREE today!</a>", "defender-security" ), \WP_Defender\Behavior\Utils::instance()->campaignURL('defender_filescanning_reports_upsell_link') ) ?>
64
  </div>
65
  </div>
66
  </div>
67
+ </div>
app/module/scan/view/new.php CHANGED
@@ -8,7 +8,7 @@
8
  <div class="box-content tc">
9
  <img src="<?php echo wp_defender()->getPluginUrl() ?>assets/img/scan-man.svg" class="mline">
10
  <div class="line max-600">
11
- <?php _e( "Scan your website for file changes, vulnerabilities and injected code and get and get notified about anything suspicious. Defender will keep an eye on your code without you having to worry.", "defender-security" ) ?>
12
  </div>
13
  <form id="start-a-scan" method="post" class="scan-frm">
14
  <?php
8
  <div class="box-content tc">
9
  <img src="<?php echo wp_defender()->getPluginUrl() ?>assets/img/scan-man.svg" class="mline">
10
  <div class="line max-600">
11
+ <?php _e( "Scan your website for file changes, vulnerabilities and injected code and get notified about anything suspicious. Defender will keep an eye on your code without you having to worry.", "defender-security" ) ?>
12
  </div>
13
  <form id="start-a-scan" method="post" class="scan-frm">
14
  <?php
app/module/scan/view/pro-feature.php CHANGED
@@ -1,6 +1,6 @@
1
  <dialog class="dev-team" id="pro-feature" title="<?php _e( "Defender Pro Features", "defender-security" ) ?>">
2
  <div class="wp-defender">
3
- <p class=""><?php _e( "Here’s what you’ll get by upgrading to Defender Pro;", "defender-security" ) ?></p>
4
  <div class="well well-blank with-cap">
5
  <i class="def-icon icon-tick fill-blue" aria-hidden="true"></i>
6
  <strong><?php _e( "Automatic Full File Scans & Notifications", "defender-security" ) ?></strong>
@@ -33,7 +33,7 @@
33
  </div>
34
  <div class="tc">
35
  <a class="button button-green mline" href="https://premium.wpmudev.org/project/wp-defender/?utm_source=defender&utm_medium=plugin&utm_campaign=defender_modal_upgrade"><?php _e( "Get Defender Pro for Free", "defender-security" ) ?></a>
36
- <p class="is-marginless"><?php _e( "As part part of a WPMU DEV free trial.", "defender-security" ) ?></p>
37
  </div>
38
  </div>
39
- </dialog>
1
  <dialog class="dev-team" id="pro-feature" title="<?php _e( "Defender Pro Features", "defender-security" ) ?>">
2
  <div class="wp-defender">
3
+ <p class=""><?php _e( "Here’s what you’ll get by upgrading to Defender Pro:", "defender-security" ) ?></p>
4
  <div class="well well-blank with-cap">
5
  <i class="def-icon icon-tick fill-blue" aria-hidden="true"></i>
6
  <strong><?php _e( "Automatic Full File Scans & Notifications", "defender-security" ) ?></strong>
33
  </div>
34
  <div class="tc">
35
  <a class="button button-green mline" href="https://premium.wpmudev.org/project/wp-defender/?utm_source=defender&utm_medium=plugin&utm_campaign=defender_modal_upgrade"><?php _e( "Get Defender Pro for Free", "defender-security" ) ?></a>
36
+ <p class="is-marginless"><?php _e( "As part of a WPMU DEV free trial.", "defender-security" ) ?></p>
37
  </div>
38
  </div>
39
+ </dialog>
app/module/scan/view/scanning.php CHANGED
@@ -46,9 +46,9 @@
46
  <div class="presale-text">
47
  <div>
48
  <?php printf( __( "Did you know the Pro version of Defender comes with advanced full code scanning and automated reporting?
49
- Get enhanced security protection as part of a WPMU DEV membership including 100+ plugins & themes, 24/7
50
  support and lots of handy site management tools – <a target='_blank' href=\"%s\">Try Defender Pro today for FREE</a>", "defender-security" ), \WP_Defender\Behavior\Utils::instance()->campaignURL('defender_filescanning_modal_inprogress_upsell_link') ) ?>
51
  </div>
52
  </div>
53
  <?php endif; ?>
54
- </dialog>
46
  <div class="presale-text">
47
  <div>
48
  <?php printf( __( "Did you know the Pro version of Defender comes with advanced full code scanning and automated reporting?
49
+ Get enhanced security protection as part of a WPMU DEV membership including 100+ plugins, 24/7
50
  support and lots of handy site management tools – <a target='_blank' href=\"%s\">Try Defender Pro today for FREE</a>", "defender-security" ), \WP_Defender\Behavior\Utils::instance()->campaignURL('defender_filescanning_modal_inprogress_upsell_link') ) ?>
51
  </div>
52
  </div>
53
  <?php endif; ?>
54
+ </dialog>
app/module/scan/view/setting-free.php CHANGED
@@ -56,7 +56,7 @@
56
  <div class="clear"></div>
57
  <div class="presale-text">
58
  <div>
59
- <?php printf( __( "Defenders scans through every line of code on your website, searching for anything suspicious. This feature is included when you join WPMU DEV, along with 100+ plugins and themes, 24/7 support and lots of handy site management tools. – <a href=\"%s\" target='_blank' role='button'>Try it all FREE today!
60
  </a>", "defender-security" ), \WP_Defender\Behavior\Utils::instance()->campaignURL('defender_filescanning_settings_upsell_link') ) ?>
61
  </div>
62
  </div>
@@ -148,4 +148,4 @@
148
  <textarea rows="12" name="email_all_ok"><?php echo $setting->email_all_ok ?></textarea>
149
  <button class="button"><?php _e( "Save", "defender-security" ) ?></button>
150
  </form>
151
- </dialog>
56
  <div class="clear"></div>
57
  <div class="presale-text">
58
  <div>
59
+ <?php printf( __( "Defender scans through every line of code on your website, searching for anything suspicious. This feature is included when you join WPMU DEV, along with 100+ plugins, 24/7 support and lots of handy site management tools. – <a href=\"%s\" target='_blank' role='button'>Try it all FREE today!
60
  </a>", "defender-security" ), \WP_Defender\Behavior\Utils::instance()->campaignURL('defender_filescanning_settings_upsell_link') ) ?>
61
  </div>
62
  </div>
148
  <textarea rows="12" name="email_all_ok"><?php echo $setting->email_all_ok ?></textarea>
149
  <button class="button"><?php _e( "Save", "defender-security" ) ?></button>
150
  </form>
151
+ </dialog>
app/view/pro-feature.php CHANGED
@@ -1,6 +1,6 @@
1
  <dialog class="dev-team" id="pro-feature" title="<?php _e( "Defender Pro Features", "defender-security" ) ?>">
2
  <div class="wp-defender">
3
- <p class=""><?php _e( "Here’s what you’ll get by upgrading to Defender Pro;", "defender-security" ) ?></p>
4
  <div class="well well-blank with-cap">
5
  <i class="def-icon icon-tick fill-blue"></i>
6
  <strong><?php _e( "Automatic Full File Scans & Notifications", "defender-security" ) ?></strong>
@@ -33,7 +33,7 @@
33
  </div>
34
  <div class="tc">
35
  <a class="button button-green mline" href="https://premium.wpmudev.org/project/wp-defender/?utm_source=defender&utm_medium=plugin&utm_campaign=defender_modal_upgrade"><?php _e( "Get Defender Pro for Free", "defender-security" ) ?></a>
36
- <p class="is-marginless"><?php _e( "As part part of a WPMU DEV free trial.", "defender-security" ) ?></p>
37
  </div>
38
  </div>
39
- </dialog>
1
  <dialog class="dev-team" id="pro-feature" title="<?php _e( "Defender Pro Features", "defender-security" ) ?>">
2
  <div class="wp-defender">
3
+ <p class=""><?php _e( "Here’s what you’ll get by upgrading to Defender Pro:", "defender-security" ) ?></p>
4
  <div class="well well-blank with-cap">
5
  <i class="def-icon icon-tick fill-blue"></i>
6
  <strong><?php _e( "Automatic Full File Scans & Notifications", "defender-security" ) ?></strong>
33
  </div>
34
  <div class="tc">
35
  <a class="button button-green mline" href="https://premium.wpmudev.org/project/wp-defender/?utm_source=defender&utm_medium=plugin&utm_campaign=defender_modal_upgrade"><?php _e( "Get Defender Pro for Free", "defender-security" ) ?></a>
36
+ <p class="is-marginless"><?php _e( "As part of a WPMU DEV free trial.", "defender-security" ) ?></p>
37
  </div>
38
  </div>
39
+ </dialog>
app/view/settings.php CHANGED
@@ -235,7 +235,7 @@
235
  <p>{USER_NAME}</p>
236
  </div>
237
  <div class="col span_8_of_12">
238
- <?php esc_html_e( "We’ll grab the users first name, or display name is first name isn’t available", "defender-security" ) ?>
239
  </div>
240
  </div>
241
  <div class="wd-clearfix"></div>
@@ -332,4 +332,4 @@
332
  </div>
333
  </div>
334
  </div>
335
- </div>
235
  <p>{USER_NAME}</p>
236
  </div>
237
  <div class="col span_8_of_12">
238
+ <?php esc_html_e( "We’ll grab the users first name, or display name if first name isn’t available", "defender-security" ) ?>
239
  </div>
240
  </div>
241
  <div class="wd-clearfix"></div>
332
  </div>
333
  </div>
334
  </div>
335
+ </div>
assets/css/styles.css CHANGED
@@ -1468,15 +1468,17 @@
1468
  .wp-defender .report-status.with-corner.feature-disabled:after {
1469
  border-right-color: #E6E6E6;
1470
  border-top-color: #E6E6E6; }
1471
- .wp-defender .report-status.feature-disabled .corner {
1472
- color: #666;
1473
- font-size: 18px;
1474
- cursor: pointer; }
1475
- .wp-defender .report-status.feature-disabled .corner i:before {
1476
- font-size: 16px;
1477
  color: #666;
1478
- width: 16px;
1479
- height: 16px; }
 
 
 
 
 
1480
  .wp-defender .well {
1481
  width: 100%;
1482
  background: #F9F9F9;
@@ -2175,6 +2177,8 @@
2175
  margin-right: 18px; }
2176
  .wp-defender .wdf-scanning .inner-nav li a span.def-tag, .wp-defender .scan-dialog .inner-nav li a span.def-tag {
2177
  color: white; }
 
 
2178
  .wp-defender .auditing .row > .col-third {
2179
  width: 25%; }
2180
  .wp-defender .auditing .row > .col-two-third {
1468
  .wp-defender .report-status.with-corner.feature-disabled:after {
1469
  border-right-color: #E6E6E6;
1470
  border-top-color: #E6E6E6; }
1471
+ .wp-defender .report-status.feature-disabled {
1472
+ left: 0; }
1473
+ .wp-defender .report-status.feature-disabled .corner {
 
 
 
1474
  color: #666;
1475
+ font-size: 18px;
1476
+ cursor: pointer; }
1477
+ .wp-defender .report-status.feature-disabled .corner i:before {
1478
+ font-size: 16px;
1479
+ color: #666;
1480
+ width: 16px;
1481
+ height: 16px; }
1482
  .wp-defender .well {
1483
  width: 100%;
1484
  background: #F9F9F9;
2177
  margin-right: 18px; }
2178
  .wp-defender .wdf-scanning .inner-nav li a span.def-tag, .wp-defender .scan-dialog .inner-nav li a span.def-tag {
2179
  color: white; }
2180
+ .wp-defender .wdf-scanning .inner-sourcecode, .wp-defender .scan-dialog .inner-sourcecode {
2181
+ position: relative; }
2182
  .wp-defender .auditing .row > .col-third {
2183
  width: 25%; }
2184
  .wp-defender .auditing .row > .col-two-third {
languages/wpdef-default.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the GNU General Public License (Version 2 - GPLv2).
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Defender Pro 1.9-beta5\n"
6
  "Report-Msgid-Bugs-To: https://wpmudev.org\n"
7
- "POT-Creation-Date: 2018-05-23 04:19:52+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -134,8 +134,8 @@ msgstr ""
134
  msgid ""
135
  " Automated reports are included in a WPMU DEV membership along with 100+ "
136
  "plugins\n"
137
- " & themes, 24/7 support and lots of handy site "
138
- "management tools – <a target='_blank' href=\"%s\">Try\n"
139
  " it all absolutely FREE</a>"
140
  msgstr ""
141
 
@@ -152,17 +152,17 @@ msgid "Lockout reports are active scheduled to send %s"
152
  msgstr ""
153
 
154
  #: app/behavior/report-free.php:129 app/behavior/report.php:224
155
- #: app/behavior/utils.php:913 free/utils.php:709
156
  msgid "daily"
157
  msgstr ""
158
 
159
  #: app/behavior/report-free.php:132 app/behavior/report.php:227
160
- #: app/behavior/utils.php:916 free/utils.php:712
161
  msgid "weekly"
162
  msgstr ""
163
 
164
  #: app/behavior/report-free.php:135 app/behavior/report.php:230
165
- #: app/behavior/utils.php:919 free/utils.php:715
166
  msgid "monthly"
167
  msgstr ""
168
 
@@ -236,7 +236,7 @@ msgstr ""
236
  msgid "Never"
237
  msgstr ""
238
 
239
- #: app/behavior/utils.php:896 free/utils.php:692
240
  msgid "Please upgrade to 5.3 or later"
241
  msgstr ""
242
 
@@ -407,7 +407,7 @@ msgid "Mask Login Area"
407
  msgstr ""
408
 
409
  #: app/module/advanced-tools/behavior/at-widget.php:79
410
- msgid "Change the location of WordPress’s default wp-admin and wp-login URLs."
411
  msgstr ""
412
 
413
  #: app/module/advanced-tools/behavior/at-widget.php:89
@@ -421,26 +421,26 @@ msgstr ""
421
  msgid "Masking is currently active at <strong>%s</strong>"
422
  msgstr ""
423
 
424
- #: app/module/advanced-tools/component/mask-api.php:88
425
  msgid "The URL is invalid"
426
  msgstr ""
427
 
428
- #: app/module/advanced-tools/component/mask-api.php:93
429
- #: app/module/advanced-tools/component/mask-api.php:104
430
  msgid ""
431
  "A page already exists at this URL, please pick a unique page for your new "
432
  "login area."
433
  msgstr ""
434
 
435
  #: app/module/advanced-tools/controller/main.php:60
436
- #: app/module/advanced-tools/controller/mask-login.php:47
437
  msgid ""
438
  "We’ve detected a conflict with Jetpack’s Wordpress.com Log In feature. "
439
  "Please disable it and return to this page to continue setup."
440
  msgstr ""
441
 
442
  #: app/module/advanced-tools/controller/main.php:63
443
- #: app/module/advanced-tools/controller/mask-login.php:50
444
  msgid ""
445
  "We’ve detected a conflict with Theme my login. Please disable it and return "
446
  "to this page to continue setup."
@@ -486,9 +486,9 @@ msgid "Edit Email"
486
  msgstr ""
487
 
488
  #: app/module/advanced-tools/controller/main.php:554
489
- #: app/module/advanced-tools/controller/mask-login.php:191
490
  #: app/module/audit/controller/main.php:197
491
- #: app/module/ip-lockout/controller/main.php:738
492
  #: app/module/scan/controller/main.php:306
493
  msgid "Your settings have been updated."
494
  msgstr ""
@@ -510,11 +510,11 @@ msgstr ""
510
  msgid "Test email failed."
511
  msgstr ""
512
 
513
- #: app/module/advanced-tools/controller/mask-login.php:137
514
  msgid "This feature is disabled"
515
  msgstr ""
516
 
517
- #: app/module/advanced-tools/controller/mask-login.php:183
518
  msgid "Login and 404 redirect URLs can't be the same. Please use different URLs."
519
  msgstr ""
520
 
@@ -544,7 +544,7 @@ msgid "Available variables"
544
  msgstr ""
545
 
546
  #: app/module/advanced-tools/view/2factor-otp-email-edit-from.php:39
547
- #: app/module/advanced-tools/view/login/disabled.php:31
548
  #: app/module/scan/controller/main.php:531 app/module/scan/view/setting.php:138
549
  #: app/module/scan/view/setting.php:158
550
  msgid "Cancel"
@@ -579,48 +579,48 @@ msgstr ""
579
  msgid "Security"
580
  msgstr ""
581
 
582
- #: app/module/advanced-tools/view/login/disabled.php:22
583
  #: app/module/ip-lockout/view/detect-404/disabled.php:16
584
  #: app/module/ip-lockout/view/login-lockouts/disabled.php:18
585
  msgid "Enable"
586
  msgstr ""
587
 
588
- #: app/module/advanced-tools/view/login/disabled.php:26
589
- #: app/module/advanced-tools/view/login/disabled.php:32
590
  msgid "Use the Google Authenticator app to sign in with a separate passcode."
591
  msgstr ""
592
 
593
- #: app/module/advanced-tools/view/login/disabled.php:35
594
  msgid "1. Install the Verification app"
595
  msgstr ""
596
 
597
- #: app/module/advanced-tools/view/login/disabled.php:38
598
  msgid ""
599
  "Download and install the Google Authenticator app on your device using the "
600
  "links below."
601
  msgstr ""
602
 
603
- #: app/module/advanced-tools/view/login/disabled.php:47
604
  msgid "2. Scan the barcode"
605
  msgstr ""
606
 
607
- #: app/module/advanced-tools/view/login/disabled.php:48
608
  msgid ""
609
  "Open the Google Authenticator app you just downloaded, tap the “+” symbol "
610
  "and then use your phone’s camera to scan the barcode below."
611
  msgstr ""
612
 
613
- #: app/module/advanced-tools/view/login/disabled.php:52
614
  msgid "3. Enter passcode"
615
  msgstr ""
616
 
617
- #: app/module/advanced-tools/view/login/disabled.php:54
618
  msgid ""
619
  "Enter the 6 digit passcode that is shown on your device into the input "
620
  "field below and hit “Verify”."
621
  msgstr ""
622
 
623
- #: app/module/advanced-tools/view/login/disabled.php:60
624
  msgid "Verify"
625
  msgstr ""
626
 
@@ -853,13 +853,14 @@ msgstr ""
853
 
854
  #: app/module/advanced-tools/view/mask-login/disabled.php:10
855
  msgid ""
856
- "Change the location of WordPress’s default wp-admin and wp-login URLs to "
857
- "make it harder for automated bots to find, and more convenient for your "
858
- "users."
859
  msgstr ""
860
 
861
  #: app/module/advanced-tools/view/mask-login/enabled.php:9
862
- msgid "Change your default wp-admin and wp-content login URL."
 
 
863
  msgstr ""
864
 
865
  #: app/module/advanced-tools/view/mask-login/enabled.php:19
@@ -874,8 +875,8 @@ msgstr ""
874
 
875
  #: app/module/advanced-tools/view/mask-login/enabled.php:35
876
  msgid ""
877
- "Choose the new URL slug where users of your website will now navigate to to "
878
- "log in, register or administrate."
879
  msgstr ""
880
 
881
  #: app/module/advanced-tools/view/mask-login/enabled.php:39
@@ -899,7 +900,7 @@ msgstr ""
899
  #: app/module/advanced-tools/view/mask-login/enabled.php:49
900
  msgid ""
901
  "With this feature you can send visitors and bots who try to visit the "
902
- "default Wordpress login URLs to a separate URL to avoid 404s."
903
  msgstr ""
904
 
905
  #: app/module/advanced-tools/view/mask-login/enabled.php:60
@@ -931,75 +932,74 @@ msgstr ""
931
  #: app/module/audit/behavior/audit-free.php:30
932
  msgid ""
933
  "Audit logging is a pro feature included in a WPMU DEV membership along with "
934
- "100+ plugins &\n"
935
- " themes, 24/7 support and lots of handy site "
936
- "management tools – <a target='_blank' href=\"%s\">Try it all absolutely "
937
- "FREE</a>"
938
  msgstr ""
939
 
940
  #: app/module/audit/behavior/audit.php:31
941
  msgid "Please hold on, Defender will update Audit information soon..."
942
  msgstr ""
943
 
944
- #: app/module/audit/component/audit-api.php:57
945
- #: app/module/audit/component/audit-api.php:89
946
  msgid ""
947
  "Whoops, Defender had trouble loading up your event log. You can try a <a "
948
  "href='%s'class=''>​quick refresh</a>​ of this page or check back again "
949
  "later."
950
  msgstr ""
951
 
952
- #: app/module/audit/component/audit-api.php:114
953
  msgid "trashed"
954
  msgstr ""
955
 
956
- #: app/module/audit/component/audit-api.php:115
957
  msgid "updated"
958
  msgstr ""
959
 
960
- #: app/module/audit/component/audit-api.php:116
961
  msgid "deleted"
962
  msgstr ""
963
 
964
- #: app/module/audit/component/audit-api.php:117
965
  msgid "created"
966
  msgstr ""
967
 
968
- #: app/module/audit/component/audit-api.php:118
969
  msgid "restored"
970
  msgstr ""
971
 
972
- #: app/module/audit/component/audit-api.php:161
973
  #: app/module/ip-lockout/component/login-protection-api.php:248
974
  msgid "year"
975
  msgstr ""
976
 
977
- #: app/module/audit/component/audit-api.php:162
978
  #: app/module/ip-lockout/component/login-protection-api.php:249
979
  msgid "month"
980
  msgstr ""
981
 
982
- #: app/module/audit/component/audit-api.php:163
983
  #: app/module/ip-lockout/component/login-protection-api.php:250
984
  msgid "week"
985
  msgstr ""
986
 
987
- #: app/module/audit/component/audit-api.php:164
988
  #: app/module/ip-lockout/component/login-protection-api.php:251
989
  msgid "day"
990
  msgstr ""
991
 
992
- #: app/module/audit/component/audit-api.php:165
993
  #: app/module/ip-lockout/component/login-protection-api.php:252
994
  msgid "hour"
995
  msgstr ""
996
 
997
- #: app/module/audit/component/audit-api.php:166
998
  #: app/module/ip-lockout/component/login-protection-api.php:253
999
  msgid "minute"
1000
  msgstr ""
1001
 
1002
- #: app/module/audit/component/audit-api.php:167
1003
  #: app/module/ip-lockout/component/login-protection-api.php:254
1004
  msgid "second"
1005
  msgstr ""
@@ -1492,7 +1492,7 @@ msgstr ""
1492
  #: app/module/scan/view/layouts/layout.php:132
1493
  #: app/module/scan/view/layouts/layout.php:149
1494
  #: app/module/scan/view/setting-free.php:3 app/module/scan/view/setting.php:3
1495
- #: app/view/settings.php:6 free/main-activator.php:165 main-activator.php:103
1496
  msgid "Settings"
1497
  msgstr ""
1498
 
@@ -1759,8 +1759,8 @@ msgstr ""
1759
  msgid "<a href=\"%s\">Configure reporting preferences</a>"
1760
  msgstr ""
1761
 
1762
- #: app/module/audit/view/free.php:9 free/main-activator.php:126
1763
- #: free/main-activator.php:171
1764
  msgid "Upgrade"
1765
  msgstr ""
1766
 
@@ -1840,7 +1840,7 @@ msgstr ""
1840
  #: app/module/audit/view/pro-feature.php:3
1841
  #: app/module/ip-lockout/view/pro-feature.php:3
1842
  #: app/module/scan/view/pro-feature.php:3 app/view/pro-feature.php:3
1843
- msgid "Here’s what you’ll get by upgrading to Defender Pro;"
1844
  msgstr ""
1845
 
1846
  #: app/module/audit/view/pro-feature.php:6
@@ -1906,7 +1906,7 @@ msgstr ""
1906
  #: app/module/audit/view/pro-feature.php:36
1907
  #: app/module/ip-lockout/view/pro-feature.php:36
1908
  #: app/module/scan/view/pro-feature.php:36 app/view/pro-feature.php:36
1909
- msgid "As part part of a WPMU DEV free trial."
1910
  msgstr ""
1911
 
1912
  #: app/module/audit/view/report.php:3
@@ -2022,7 +2022,7 @@ msgid ""
2022
  "access."
2023
  msgstr ""
2024
 
2025
- #: app/module/audit/view/table.php:183
2026
  msgid "There have been no events logged in the selected time period."
2027
  msgstr ""
2028
 
@@ -2113,10 +2113,10 @@ msgstr ""
2113
  #: app/module/hardener/component/servers/apache-service.php:115
2114
  #: app/module/hardener/component/servers/apache-service.php:169
2115
  #: app/module/hardener/component/servers/apache-service.php:173
2116
- #: app/module/hardener/component/servers/apache-service.php:219
2117
- #: app/module/hardener/component/servers/apache-service.php:250
2118
- #: app/module/hardener/component/servers/apache-service.php:284
2119
- msgid "The file %s is not writeable"
2120
  msgstr ""
2121
 
2122
  #: app/module/hardener/component/db-prefix-service.php:37
@@ -2271,7 +2271,7 @@ msgstr ""
2271
 
2272
  #: app/module/hardener/rule.php:111
2273
  #: app/module/scan/behavior/core-result.php:189
2274
- #: app/module/scan/behavior/pro/content-result.php:106
2275
  #: app/module/scan/behavior/pro/vuln-result.php:156
2276
  #: app/module/scan/component/result-table.php:199
2277
  msgid "Ignore"
@@ -2797,8 +2797,8 @@ msgid "Lockout notifications are disabled"
2797
  msgstr ""
2798
 
2799
  #: app/module/ip-lockout/component/login-protection-api.php:61
2800
- #: app/module/ip-lockout/controller/main.php:633
2801
- #: app/module/ip-lockout/controller/main.php:642
2802
  msgid ""
2803
  "You have been locked out by the administrator for attempting to login with "
2804
  "a banned username"
@@ -2902,7 +2902,8 @@ msgid "404 lockout"
2902
  msgstr ""
2903
 
2904
  #: app/module/ip-lockout/component/logs-table.php:181
2905
- msgid "Ip Address"
 
2906
  msgstr ""
2907
 
2908
  #: app/module/ip-lockout/component/logs-table.php:184
@@ -2963,78 +2964,78 @@ msgstr ""
2963
  msgid "Your logs have been successfully deleted."
2964
  msgstr ""
2965
 
2966
- #: app/module/ip-lockout/controller/main.php:228
2967
  msgid ""
2968
  "IP %s has been added to your blacklist. You can control your blacklist in "
2969
  "<a href=\"%s\">IP Lockouts.</a>"
2970
  msgstr ""
2971
 
2972
- #: app/module/ip-lockout/controller/main.php:234
2973
  msgid "No record found"
2974
  msgstr ""
2975
 
2976
- #: app/module/ip-lockout/controller/main.php:259
2977
  msgid "Demo"
2978
  msgstr ""
2979
 
2980
- #: app/module/ip-lockout/controller/main.php:447
2981
  msgid "404 lockout alert for %s"
2982
  msgstr ""
2983
 
2984
- #: app/module/ip-lockout/controller/main.php:474
2985
  msgid "Login lockout alert for %s"
2986
  msgstr ""
2987
 
2988
- #: app/module/ip-lockout/controller/main.php:572
2989
  msgid "Failed login attempt with username %s"
2990
  msgstr ""
2991
 
2992
- #: app/module/ip-lockout/controller/main.php:635
2993
- #: app/module/ip-lockout/controller/main.php:645
2994
  msgid "%d login attempts remaining"
2995
  msgstr ""
2996
 
2997
- #: app/module/ip-lockout/controller/main.php:734
2998
  msgid ""
2999
  "Your settings have been updated, however some IPs were removed because "
3000
  "invalid format, or you blacklist yourself"
3001
  msgstr ""
3002
 
3003
- #: app/module/ip-lockout/controller/main.php:745
3004
  msgid "Login Protection has been activated."
3005
  msgstr ""
3006
 
3007
- #: app/module/ip-lockout/controller/main.php:747
3008
  msgid "Login Protection has been deactivated."
3009
  msgstr ""
3010
 
3011
- #: app/module/ip-lockout/controller/main.php:752
3012
  msgid "404 Detection has been activated."
3013
  msgstr ""
3014
 
3015
- #: app/module/ip-lockout/controller/main.php:754
3016
  msgid "404 Detection has been deactivated."
3017
  msgstr ""
3018
 
3019
- #: app/module/ip-lockout/controller/main.php:784 app/module/ip-lockout.php:35
3020
  #: app/view/activator-free.php:33 app/view/activator.php:49
3021
  msgid "IP Lockouts"
3022
  msgstr ""
3023
 
3024
- #: app/module/ip-lockout/controller/main.php:801
3025
- #: app/module/ip-lockout/controller/main.php:807
3026
  msgid "Your file is invalid!"
3027
  msgstr ""
3028
 
3029
- #: app/module/ip-lockout/controller/main.php:813
3030
  msgid "Your file content is invalid!"
3031
  msgstr ""
3032
 
3033
- #: app/module/ip-lockout/controller/main.php:822
3034
  msgid "Your whitelist/blacklist has been successfully imported."
3035
  msgstr ""
3036
 
3037
- #: app/module/ip-lockout/controller/main.php:1007
3038
  msgid "Thanks for your patience. All set."
3039
  msgstr ""
3040
 
@@ -3066,7 +3067,7 @@ msgstr ""
3066
  #: app/module/ip-lockout/view/blacklist/enabled.php:17
3067
  msgid ""
3068
  "Any IP addresses you list here will be completely blocked from accessing "
3069
- "our website, including admins."
3070
  msgstr ""
3071
 
3072
  #: app/module/ip-lockout/view/blacklist/enabled.php:24
@@ -3440,10 +3441,6 @@ msgstr ""
3440
  msgid "Oldest"
3441
  msgstr ""
3442
 
3443
- #: app/module/ip-lockout/view/logging/enabled.php:10
3444
- msgid "IP Address"
3445
- msgstr ""
3446
-
3447
  #: app/module/ip-lockout/view/login-lockouts/disabled.php:10
3448
  msgid ""
3449
  "Watch and protect your login area for attackers trying to randomly guess "
@@ -3651,9 +3648,9 @@ msgstr ""
3651
  #: app/module/scan/view/automation-free.php:63
3652
  msgid ""
3653
  "Schedule automated file scanning and email reporting for all your websites. "
3654
- "This feature is included in a WPMU DEV membership along with 100+ plugins & "
3655
- "themes, 24/7 support and lots of handy site management tools – <a "
3656
- "target='_blank' href=\"%s\">Try it all FREE today!</a>"
3657
  msgstr ""
3658
 
3659
  #: app/module/ip-lockout/view/settings.php:10
@@ -3762,7 +3759,7 @@ msgid "Date Added"
3762
  msgstr ""
3763
 
3764
  #: app/module/scan/behavior/core-result.php:197
3765
- #: app/module/scan/behavior/pro/content-result.php:127
3766
  msgid "Delete"
3767
  msgstr ""
3768
 
@@ -3773,12 +3770,12 @@ msgid ""
3773
  msgstr ""
3774
 
3775
  #: app/module/scan/behavior/core-result.php:202
3776
- #: app/module/scan/behavior/pro/content-result.php:132
3777
  msgid "Yes"
3778
  msgstr ""
3779
 
3780
  #: app/module/scan/behavior/core-result.php:205
3781
- #: app/module/scan/behavior/pro/content-result.php:135
3782
  msgid "No"
3783
  msgstr ""
3784
 
@@ -3798,7 +3795,7 @@ msgstr ""
3798
  #: app/module/scan/behavior/core-result.php:281
3799
  #: app/module/scan/behavior/core-result.php:303
3800
  #: app/module/scan/behavior/core-result.php:325
3801
- #: app/module/scan/behavior/pro/content-result.php:93
3802
  msgid "Pulling source file..."
3803
  msgstr ""
3804
 
@@ -3830,19 +3827,19 @@ msgid ""
3830
  "recommend backing up your website."
3831
  msgstr ""
3832
 
3833
- #: app/module/scan/behavior/pro/content-result.php:113
3834
  msgid ""
3835
  "This will permanent delete the whole plugin containing this file, do you "
3836
  "want to do this?"
3837
  msgstr ""
3838
 
3839
- #: app/module/scan/behavior/pro/content-result.php:116
3840
  msgid ""
3841
  "This will permanent delete the whole theme containing this file, do you "
3842
  "want to do this?"
3843
  msgstr ""
3844
 
3845
- #: app/module/scan/behavior/pro/content-result.php:119
3846
  msgid "This will permanent delete this file, do you want to do this?"
3847
  msgstr ""
3848
 
@@ -3946,8 +3943,8 @@ msgstr ""
3946
  #: app/module/scan/behavior/scan.php:198
3947
  msgid ""
3948
  "Scan your website for file changes, vulnerabilities and injected code and "
3949
- "get and\n"
3950
- " get notified about anything suspicious."
3951
  msgstr ""
3952
 
3953
  #: app/module/scan/behavior/scan.php:218 app/module/scan/view/scanning.php:24
@@ -4037,7 +4034,7 @@ msgstr[0] ""
4037
  msgstr[1] ""
4038
 
4039
  #: app/module/scan/controller/main.php:212
4040
- msgid "The suspicious files has been successfully deleted."
4041
  msgid_plural "The suspicious files have been successfully deleted."
4042
  msgstr[0] ""
4043
  msgstr[1] ""
@@ -4047,7 +4044,7 @@ msgid "No item has been deleted"
4047
  msgstr ""
4048
 
4049
  #: app/module/scan/controller/main.php:235
4050
- msgid "The suspicious files has been successfully resolved."
4051
  msgid_plural "The suspicious files have been successfully resolved."
4052
  msgstr[0] ""
4053
  msgstr[1] ""
@@ -4200,8 +4197,8 @@ msgstr ""
4200
  #: app/module/scan/view/new.php:11
4201
  msgid ""
4202
  "Scan your website for file changes, vulnerabilities and injected code and "
4203
- "get and get notified about anything suspicious. Defender will keep an eye "
4204
- "on your code without you having to worry."
4205
  msgstr ""
4206
 
4207
  #: app/module/scan/view/scanning.php:7
@@ -4213,7 +4210,7 @@ msgid ""
4213
  "Did you know the Pro version of Defender comes with advanced full code "
4214
  "scanning and automated reporting?\n"
4215
  " Get enhanced security protection as part of a WPMU DEV "
4216
- "membership including 100+ plugins & themes, 24/7\n"
4217
  " support and lots of handy site management tools – <a "
4218
  "target='_blank' href=\"%s\">Try Defender Pro today for FREE</a>"
4219
  msgstr ""
@@ -4247,11 +4244,10 @@ msgstr ""
4247
 
4248
  #: app/module/scan/view/setting-free.php:59
4249
  msgid ""
4250
- "Defenders scans through every line of code on your website, searching for "
4251
  "anything suspicious. This feature is included when you join WPMU DEV, along "
4252
- "with 100+ plugins and themes, 24/7 support and lots of handy site "
4253
- "management tools. – <a href=\"%s\" target='_blank' role='button'>Try it "
4254
- "all FREE today!\n"
4255
  " </a>"
4256
  msgstr ""
4257
 
@@ -4544,7 +4540,7 @@ msgstr ""
4544
 
4545
  #: app/view/settings.php:238
4546
  msgid ""
4547
- "We’ll grab the users first name, or display name is first name isn’t "
4548
  "available"
4549
  msgstr ""
4550
 
@@ -4572,11 +4568,11 @@ msgid ""
4572
  "this email."
4573
  msgstr ""
4574
 
4575
- #: free/main-activator.php:74
4576
  msgid "Get Members!"
4577
  msgstr ""
4578
 
4579
- #: free/main-activator.php:82
4580
  msgid ""
4581
  "We're happy that you've chosen to install Defender! Are you interested in "
4582
  "how to make the most of this plugin? How would you like a quick 5 day email "
@@ -4584,18 +4580,18 @@ msgid ""
4584
  "bulletproof? Only the info you want, no subscription!"
4585
  msgstr ""
4586
 
4587
- #: free/main-activator.php:124
4588
  msgid ""
4589
  "%s, you now have access to Defender's pro features but you still have the "
4590
  "free version installed. Let's upgrade Defender and unlock all those juicy "
4591
  "features! &nbsp; %s"
4592
  msgstr ""
4593
 
4594
- #: free/main-activator.php:154
4595
  msgid "<br/>Something went wrong. Please try again later!"
4596
  msgstr ""
4597
 
4598
- #: free/main-activator.php:170 main-activator.php:108
4599
  msgid "Docs"
4600
  msgstr ""
4601
 
@@ -4635,7 +4631,7 @@ msgstr ""
4635
  msgid "Rate %s"
4636
  msgstr ""
4637
 
4638
- #: main-activator.php:92
4639
  msgid ""
4640
  "We noticed you have both the free and pro versions of Defender installed, "
4641
  "so we've automatically deactivated the free version for you."
2
  # This file is distributed under the GNU General Public License (Version 2 - GPLv2).
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Defender Pro 1.9.1-beta5\n"
6
  "Report-Msgid-Bugs-To: https://wpmudev.org\n"
7
+ "POT-Creation-Date: 2018-07-03 16:10:03+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
134
  msgid ""
135
  " Automated reports are included in a WPMU DEV membership along with 100+ "
136
  "plugins\n"
137
+ " , 24/7 support and lots of handy site management "
138
+ "tools – <a target='_blank' href=\"%s\">Try\n"
139
  " it all absolutely FREE</a>"
140
  msgstr ""
141
 
152
  msgstr ""
153
 
154
  #: app/behavior/report-free.php:129 app/behavior/report.php:224
155
+ #: app/behavior/utils.php:917 free/utils.php:709
156
  msgid "daily"
157
  msgstr ""
158
 
159
  #: app/behavior/report-free.php:132 app/behavior/report.php:227
160
+ #: app/behavior/utils.php:920 free/utils.php:712
161
  msgid "weekly"
162
  msgstr ""
163
 
164
  #: app/behavior/report-free.php:135 app/behavior/report.php:230
165
+ #: app/behavior/utils.php:923 free/utils.php:715
166
  msgid "monthly"
167
  msgstr ""
168
 
236
  msgid "Never"
237
  msgstr ""
238
 
239
+ #: app/behavior/utils.php:900 free/utils.php:692
240
  msgid "Please upgrade to 5.3 or later"
241
  msgstr ""
242
 
407
  msgstr ""
408
 
409
  #: app/module/advanced-tools/behavior/at-widget.php:79
410
+ msgid "Change the location of WordPress’s default login area."
411
  msgstr ""
412
 
413
  #: app/module/advanced-tools/behavior/at-widget.php:89
421
  msgid "Masking is currently active at <strong>%s</strong>"
422
  msgstr ""
423
 
424
+ #: app/module/advanced-tools/component/mask-api.php:141
425
  msgid "The URL is invalid"
426
  msgstr ""
427
 
428
+ #: app/module/advanced-tools/component/mask-api.php:146
429
+ #: app/module/advanced-tools/component/mask-api.php:157
430
  msgid ""
431
  "A page already exists at this URL, please pick a unique page for your new "
432
  "login area."
433
  msgstr ""
434
 
435
  #: app/module/advanced-tools/controller/main.php:60
436
+ #: app/module/advanced-tools/controller/mask-login.php:49
437
  msgid ""
438
  "We’ve detected a conflict with Jetpack’s Wordpress.com Log In feature. "
439
  "Please disable it and return to this page to continue setup."
440
  msgstr ""
441
 
442
  #: app/module/advanced-tools/controller/main.php:63
443
+ #: app/module/advanced-tools/controller/mask-login.php:52
444
  msgid ""
445
  "We’ve detected a conflict with Theme my login. Please disable it and return "
446
  "to this page to continue setup."
486
  msgstr ""
487
 
488
  #: app/module/advanced-tools/controller/main.php:554
489
+ #: app/module/advanced-tools/controller/mask-login.php:251
490
  #: app/module/audit/controller/main.php:197
491
+ #: app/module/ip-lockout/controller/main.php:739
492
  #: app/module/scan/controller/main.php:306
493
  msgid "Your settings have been updated."
494
  msgstr ""
510
  msgid "Test email failed."
511
  msgstr ""
512
 
513
+ #: app/module/advanced-tools/controller/mask-login.php:197
514
  msgid "This feature is disabled"
515
  msgstr ""
516
 
517
+ #: app/module/advanced-tools/controller/mask-login.php:243
518
  msgid "Login and 404 redirect URLs can't be the same. Please use different URLs."
519
  msgstr ""
520
 
544
  msgstr ""
545
 
546
  #: app/module/advanced-tools/view/2factor-otp-email-edit-from.php:39
547
+ #: app/module/advanced-tools/view/login/disabled.php:38
548
  #: app/module/scan/controller/main.php:531 app/module/scan/view/setting.php:138
549
  #: app/module/scan/view/setting.php:158
550
  msgid "Cancel"
579
  msgid "Security"
580
  msgstr ""
581
 
582
+ #: app/module/advanced-tools/view/login/disabled.php:29
583
  #: app/module/ip-lockout/view/detect-404/disabled.php:16
584
  #: app/module/ip-lockout/view/login-lockouts/disabled.php:18
585
  msgid "Enable"
586
  msgstr ""
587
 
588
+ #: app/module/advanced-tools/view/login/disabled.php:33
589
+ #: app/module/advanced-tools/view/login/disabled.php:39
590
  msgid "Use the Google Authenticator app to sign in with a separate passcode."
591
  msgstr ""
592
 
593
+ #: app/module/advanced-tools/view/login/disabled.php:42
594
  msgid "1. Install the Verification app"
595
  msgstr ""
596
 
597
+ #: app/module/advanced-tools/view/login/disabled.php:45
598
  msgid ""
599
  "Download and install the Google Authenticator app on your device using the "
600
  "links below."
601
  msgstr ""
602
 
603
+ #: app/module/advanced-tools/view/login/disabled.php:54
604
  msgid "2. Scan the barcode"
605
  msgstr ""
606
 
607
+ #: app/module/advanced-tools/view/login/disabled.php:55
608
  msgid ""
609
  "Open the Google Authenticator app you just downloaded, tap the “+” symbol "
610
  "and then use your phone’s camera to scan the barcode below."
611
  msgstr ""
612
 
613
+ #: app/module/advanced-tools/view/login/disabled.php:59
614
  msgid "3. Enter passcode"
615
  msgstr ""
616
 
617
+ #: app/module/advanced-tools/view/login/disabled.php:61
618
  msgid ""
619
  "Enter the 6 digit passcode that is shown on your device into the input "
620
  "field below and hit “Verify”."
621
  msgstr ""
622
 
623
+ #: app/module/advanced-tools/view/login/disabled.php:67
624
  msgid "Verify"
625
  msgstr ""
626
 
853
 
854
  #: app/module/advanced-tools/view/mask-login/disabled.php:10
855
  msgid ""
856
+ "Change the location of WordPress’s default login area, making it harder for "
857
+ "automated bots to find and also more convenient for your users."
 
858
  msgstr ""
859
 
860
  #: app/module/advanced-tools/view/mask-login/enabled.php:9
861
+ msgid ""
862
+ "Change your default WordPress login URL to hide your login area from "
863
+ "hackers and bots."
864
  msgstr ""
865
 
866
  #: app/module/advanced-tools/view/mask-login/enabled.php:19
875
 
876
  #: app/module/advanced-tools/view/mask-login/enabled.php:35
877
  msgid ""
878
+ "Choose the new URL slug where users of your website will now navigate to "
879
+ "log in or register."
880
  msgstr ""
881
 
882
  #: app/module/advanced-tools/view/mask-login/enabled.php:39
900
  #: app/module/advanced-tools/view/mask-login/enabled.php:49
901
  msgid ""
902
  "With this feature you can send visitors and bots who try to visit the "
903
+ "default WordPress login URLs to a separate URL to avoid 404s."
904
  msgstr ""
905
 
906
  #: app/module/advanced-tools/view/mask-login/enabled.php:60
932
  #: app/module/audit/behavior/audit-free.php:30
933
  msgid ""
934
  "Audit logging is a pro feature included in a WPMU DEV membership along with "
935
+ "100+ plugins,\n"
936
+ " 24/7 support and lots of handy site management "
937
+ "tools – <a target='_blank' href=\"%s\">Try it all absolutely FREE</a>"
 
938
  msgstr ""
939
 
940
  #: app/module/audit/behavior/audit.php:31
941
  msgid "Please hold on, Defender will update Audit information soon..."
942
  msgstr ""
943
 
944
+ #: app/module/audit/component/audit-api.php:66
945
+ #: app/module/audit/component/audit-api.php:133
946
  msgid ""
947
  "Whoops, Defender had trouble loading up your event log. You can try a <a "
948
  "href='%s'class=''>​quick refresh</a>​ of this page or check back again "
949
  "later."
950
  msgstr ""
951
 
952
+ #: app/module/audit/component/audit-api.php:158
953
  msgid "trashed"
954
  msgstr ""
955
 
956
+ #: app/module/audit/component/audit-api.php:159
957
  msgid "updated"
958
  msgstr ""
959
 
960
+ #: app/module/audit/component/audit-api.php:160
961
  msgid "deleted"
962
  msgstr ""
963
 
964
+ #: app/module/audit/component/audit-api.php:161
965
  msgid "created"
966
  msgstr ""
967
 
968
+ #: app/module/audit/component/audit-api.php:162
969
  msgid "restored"
970
  msgstr ""
971
 
972
+ #: app/module/audit/component/audit-api.php:205
973
  #: app/module/ip-lockout/component/login-protection-api.php:248
974
  msgid "year"
975
  msgstr ""
976
 
977
+ #: app/module/audit/component/audit-api.php:206
978
  #: app/module/ip-lockout/component/login-protection-api.php:249
979
  msgid "month"
980
  msgstr ""
981
 
982
+ #: app/module/audit/component/audit-api.php:207
983
  #: app/module/ip-lockout/component/login-protection-api.php:250
984
  msgid "week"
985
  msgstr ""
986
 
987
+ #: app/module/audit/component/audit-api.php:208
988
  #: app/module/ip-lockout/component/login-protection-api.php:251
989
  msgid "day"
990
  msgstr ""
991
 
992
+ #: app/module/audit/component/audit-api.php:209
993
  #: app/module/ip-lockout/component/login-protection-api.php:252
994
  msgid "hour"
995
  msgstr ""
996
 
997
+ #: app/module/audit/component/audit-api.php:210
998
  #: app/module/ip-lockout/component/login-protection-api.php:253
999
  msgid "minute"
1000
  msgstr ""
1001
 
1002
+ #: app/module/audit/component/audit-api.php:211
1003
  #: app/module/ip-lockout/component/login-protection-api.php:254
1004
  msgid "second"
1005
  msgstr ""
1492
  #: app/module/scan/view/layouts/layout.php:132
1493
  #: app/module/scan/view/layouts/layout.php:149
1494
  #: app/module/scan/view/setting-free.php:3 app/module/scan/view/setting.php:3
1495
+ #: app/view/settings.php:6 free/main-activator.php:161 main-activator.php:102
1496
  msgid "Settings"
1497
  msgstr ""
1498
 
1759
  msgid "<a href=\"%s\">Configure reporting preferences</a>"
1760
  msgstr ""
1761
 
1762
+ #: app/module/audit/view/free.php:9 free/main-activator.php:122
1763
+ #: free/main-activator.php:167
1764
  msgid "Upgrade"
1765
  msgstr ""
1766
 
1840
  #: app/module/audit/view/pro-feature.php:3
1841
  #: app/module/ip-lockout/view/pro-feature.php:3
1842
  #: app/module/scan/view/pro-feature.php:3 app/view/pro-feature.php:3
1843
+ msgid "Here’s what you’ll get by upgrading to Defender Pro:"
1844
  msgstr ""
1845
 
1846
  #: app/module/audit/view/pro-feature.php:6
1906
  #: app/module/audit/view/pro-feature.php:36
1907
  #: app/module/ip-lockout/view/pro-feature.php:36
1908
  #: app/module/scan/view/pro-feature.php:36 app/view/pro-feature.php:36
1909
+ msgid "As part of a WPMU DEV free trial."
1910
  msgstr ""
1911
 
1912
  #: app/module/audit/view/report.php:3
2022
  "access."
2023
  msgstr ""
2024
 
2025
+ #: app/module/audit/view/table.php:184
2026
  msgid "There have been no events logged in the selected time period."
2027
  msgstr ""
2028
 
2113
  #: app/module/hardener/component/servers/apache-service.php:115
2114
  #: app/module/hardener/component/servers/apache-service.php:169
2115
  #: app/module/hardener/component/servers/apache-service.php:173
2116
+ #: app/module/hardener/component/servers/apache-service.php:220
2117
+ #: app/module/hardener/component/servers/apache-service.php:251
2118
+ #: app/module/hardener/component/servers/apache-service.php:285
2119
+ msgid "The file %s is not writable"
2120
  msgstr ""
2121
 
2122
  #: app/module/hardener/component/db-prefix-service.php:37
2271
 
2272
  #: app/module/hardener/rule.php:111
2273
  #: app/module/scan/behavior/core-result.php:189
2274
+ #: app/module/scan/behavior/pro/content-result.php:107
2275
  #: app/module/scan/behavior/pro/vuln-result.php:156
2276
  #: app/module/scan/component/result-table.php:199
2277
  msgid "Ignore"
2797
  msgstr ""
2798
 
2799
  #: app/module/ip-lockout/component/login-protection-api.php:61
2800
+ #: app/module/ip-lockout/controller/main.php:634
2801
+ #: app/module/ip-lockout/controller/main.php:643
2802
  msgid ""
2803
  "You have been locked out by the administrator for attempting to login with "
2804
  "a banned username"
2902
  msgstr ""
2903
 
2904
  #: app/module/ip-lockout/component/logs-table.php:181
2905
+ #: app/module/ip-lockout/view/logging/enabled.php:10
2906
+ msgid "IP Address"
2907
  msgstr ""
2908
 
2909
  #: app/module/ip-lockout/component/logs-table.php:184
2964
  msgid "Your logs have been successfully deleted."
2965
  msgstr ""
2966
 
2967
+ #: app/module/ip-lockout/controller/main.php:229
2968
  msgid ""
2969
  "IP %s has been added to your blacklist. You can control your blacklist in "
2970
  "<a href=\"%s\">IP Lockouts.</a>"
2971
  msgstr ""
2972
 
2973
+ #: app/module/ip-lockout/controller/main.php:235
2974
  msgid "No record found"
2975
  msgstr ""
2976
 
2977
+ #: app/module/ip-lockout/controller/main.php:260
2978
  msgid "Demo"
2979
  msgstr ""
2980
 
2981
+ #: app/module/ip-lockout/controller/main.php:448
2982
  msgid "404 lockout alert for %s"
2983
  msgstr ""
2984
 
2985
+ #: app/module/ip-lockout/controller/main.php:475
2986
  msgid "Login lockout alert for %s"
2987
  msgstr ""
2988
 
2989
+ #: app/module/ip-lockout/controller/main.php:573
2990
  msgid "Failed login attempt with username %s"
2991
  msgstr ""
2992
 
2993
+ #: app/module/ip-lockout/controller/main.php:636
2994
+ #: app/module/ip-lockout/controller/main.php:646
2995
  msgid "%d login attempts remaining"
2996
  msgstr ""
2997
 
2998
+ #: app/module/ip-lockout/controller/main.php:735
2999
  msgid ""
3000
  "Your settings have been updated, however some IPs were removed because "
3001
  "invalid format, or you blacklist yourself"
3002
  msgstr ""
3003
 
3004
+ #: app/module/ip-lockout/controller/main.php:746
3005
  msgid "Login Protection has been activated."
3006
  msgstr ""
3007
 
3008
+ #: app/module/ip-lockout/controller/main.php:748
3009
  msgid "Login Protection has been deactivated."
3010
  msgstr ""
3011
 
3012
+ #: app/module/ip-lockout/controller/main.php:753
3013
  msgid "404 Detection has been activated."
3014
  msgstr ""
3015
 
3016
+ #: app/module/ip-lockout/controller/main.php:755
3017
  msgid "404 Detection has been deactivated."
3018
  msgstr ""
3019
 
3020
+ #: app/module/ip-lockout/controller/main.php:785 app/module/ip-lockout.php:35
3021
  #: app/view/activator-free.php:33 app/view/activator.php:49
3022
  msgid "IP Lockouts"
3023
  msgstr ""
3024
 
3025
+ #: app/module/ip-lockout/controller/main.php:802
3026
+ #: app/module/ip-lockout/controller/main.php:808
3027
  msgid "Your file is invalid!"
3028
  msgstr ""
3029
 
3030
+ #: app/module/ip-lockout/controller/main.php:814
3031
  msgid "Your file content is invalid!"
3032
  msgstr ""
3033
 
3034
+ #: app/module/ip-lockout/controller/main.php:823
3035
  msgid "Your whitelist/blacklist has been successfully imported."
3036
  msgstr ""
3037
 
3038
+ #: app/module/ip-lockout/controller/main.php:1008
3039
  msgid "Thanks for your patience. All set."
3040
  msgstr ""
3041
 
3067
  #: app/module/ip-lockout/view/blacklist/enabled.php:17
3068
  msgid ""
3069
  "Any IP addresses you list here will be completely blocked from accessing "
3070
+ "your website, including admins."
3071
  msgstr ""
3072
 
3073
  #: app/module/ip-lockout/view/blacklist/enabled.php:24
3441
  msgid "Oldest"
3442
  msgstr ""
3443
 
 
 
 
 
3444
  #: app/module/ip-lockout/view/login-lockouts/disabled.php:10
3445
  msgid ""
3446
  "Watch and protect your login area for attackers trying to randomly guess "
3648
  #: app/module/scan/view/automation-free.php:63
3649
  msgid ""
3650
  "Schedule automated file scanning and email reporting for all your websites. "
3651
+ "This feature is included in a WPMU DEV membership along with 100+ plugins, "
3652
+ "24/7 support and lots of handy site management tools – <a target='_blank' "
3653
+ "href=\"%s\">Try it all FREE today!</a>"
3654
  msgstr ""
3655
 
3656
  #: app/module/ip-lockout/view/settings.php:10
3759
  msgstr ""
3760
 
3761
  #: app/module/scan/behavior/core-result.php:197
3762
+ #: app/module/scan/behavior/pro/content-result.php:128
3763
  msgid "Delete"
3764
  msgstr ""
3765
 
3770
  msgstr ""
3771
 
3772
  #: app/module/scan/behavior/core-result.php:202
3773
+ #: app/module/scan/behavior/pro/content-result.php:133
3774
  msgid "Yes"
3775
  msgstr ""
3776
 
3777
  #: app/module/scan/behavior/core-result.php:205
3778
+ #: app/module/scan/behavior/pro/content-result.php:136
3779
  msgid "No"
3780
  msgstr ""
3781
 
3795
  #: app/module/scan/behavior/core-result.php:281
3796
  #: app/module/scan/behavior/core-result.php:303
3797
  #: app/module/scan/behavior/core-result.php:325
3798
+ #: app/module/scan/behavior/pro/content-result.php:94
3799
  msgid "Pulling source file..."
3800
  msgstr ""
3801
 
3827
  "recommend backing up your website."
3828
  msgstr ""
3829
 
3830
+ #: app/module/scan/behavior/pro/content-result.php:114
3831
  msgid ""
3832
  "This will permanent delete the whole plugin containing this file, do you "
3833
  "want to do this?"
3834
  msgstr ""
3835
 
3836
+ #: app/module/scan/behavior/pro/content-result.php:117
3837
  msgid ""
3838
  "This will permanent delete the whole theme containing this file, do you "
3839
  "want to do this?"
3840
  msgstr ""
3841
 
3842
+ #: app/module/scan/behavior/pro/content-result.php:120
3843
  msgid "This will permanent delete this file, do you want to do this?"
3844
  msgstr ""
3845
 
3943
  #: app/module/scan/behavior/scan.php:198
3944
  msgid ""
3945
  "Scan your website for file changes, vulnerabilities and injected code and "
3946
+ "get\n"
3947
+ " notified about anything suspicious."
3948
  msgstr ""
3949
 
3950
  #: app/module/scan/behavior/scan.php:218 app/module/scan/view/scanning.php:24
4034
  msgstr[1] ""
4035
 
4036
  #: app/module/scan/controller/main.php:212
4037
+ msgid "The suspicious file has been successfully deleted."
4038
  msgid_plural "The suspicious files have been successfully deleted."
4039
  msgstr[0] ""
4040
  msgstr[1] ""
4044
  msgstr ""
4045
 
4046
  #: app/module/scan/controller/main.php:235
4047
+ msgid "The suspicious file has been successfully resolved."
4048
  msgid_plural "The suspicious files have been successfully resolved."
4049
  msgstr[0] ""
4050
  msgstr[1] ""
4197
  #: app/module/scan/view/new.php:11
4198
  msgid ""
4199
  "Scan your website for file changes, vulnerabilities and injected code and "
4200
+ "get notified about anything suspicious. Defender will keep an eye on your "
4201
+ "code without you having to worry."
4202
  msgstr ""
4203
 
4204
  #: app/module/scan/view/scanning.php:7
4210
  "Did you know the Pro version of Defender comes with advanced full code "
4211
  "scanning and automated reporting?\n"
4212
  " Get enhanced security protection as part of a WPMU DEV "
4213
+ "membership including 100+ plugins, 24/7\n"
4214
  " support and lots of handy site management tools – <a "
4215
  "target='_blank' href=\"%s\">Try Defender Pro today for FREE</a>"
4216
  msgstr ""
4244
 
4245
  #: app/module/scan/view/setting-free.php:59
4246
  msgid ""
4247
+ "Defender scans through every line of code on your website, searching for "
4248
  "anything suspicious. This feature is included when you join WPMU DEV, along "
4249
+ "with 100+ plugins, 24/7 support and lots of handy site management tools. – "
4250
+ "<a href=\"%s\" target='_blank' role='button'>Try it all FREE today!\n"
 
4251
  " </a>"
4252
  msgstr ""
4253
 
4540
 
4541
  #: app/view/settings.php:238
4542
  msgid ""
4543
+ "We’ll grab the users first name, or display name if first name isn’t "
4544
  "available"
4545
  msgstr ""
4546
 
4568
  "this email."
4569
  msgstr ""
4570
 
4571
+ #: free/main-activator.php:70
4572
  msgid "Get Members!"
4573
  msgstr ""
4574
 
4575
+ #: free/main-activator.php:78
4576
  msgid ""
4577
  "We're happy that you've chosen to install Defender! Are you interested in "
4578
  "how to make the most of this plugin? How would you like a quick 5 day email "
4580
  "bulletproof? Only the info you want, no subscription!"
4581
  msgstr ""
4582
 
4583
+ #: free/main-activator.php:120
4584
  msgid ""
4585
  "%s, you now have access to Defender's pro features but you still have the "
4586
  "free version installed. Let's upgrade Defender and unlock all those juicy "
4587
  "features! &nbsp; %s"
4588
  msgstr ""
4589
 
4590
+ #: free/main-activator.php:150
4591
  msgid "<br/>Something went wrong. Please try again later!"
4592
  msgstr ""
4593
 
4594
+ #: free/main-activator.php:166 main-activator.php:107
4595
  msgid "Docs"
4596
  msgstr ""
4597
 
4631
  msgid "Rate %s"
4632
  msgstr ""
4633
 
4634
+ #: main-activator.php:91
4635
  msgid ""
4636
  "We noticed you have both the free and pro versions of Defender installed, "
4637
  "so we've automatically deactivated the free version for you."
main-activator.php CHANGED
@@ -44,10 +44,7 @@ class WD_Main_Activator {
44
  update_site_option( 'wd_db_version', "1.7.1" );
45
  }
46
 
47
- add_filter( 'plugin_action_links_' . plugin_basename( wp_defender()->plugin_slug ), array(
48
- &$this,
49
- 'addSettingsLink'
50
- ) );
51
  add_action( 'admin_enqueue_scripts', array( &$this, 'register_styles' ) );
52
  if ( ! \WP_Defender\Behavior\Utils::instance()->checkRequirement() ) {
53
  } else {
@@ -120,7 +117,7 @@ class WD_Main_Activator {
120
  }
121
 
122
  public function showUpgradeNotification() {
123
- $class = 'notice notice-info is-dismissible wp-defender-notice';
124
  $message = sprintf( __( "%s, you now have access to Defender's pro features but you still have the free version installed. Let's upgrade Defender and unlock all those juicy features! &nbsp; %s", "defender-security" ),
125
  \WP_Defender\Behavior\Utils::instance()->getDisplayName(),
126
  '<button id="install-defender-pro" type="button" data-id="1081723" data-nonce="' . wp_create_nonce( 'installDefenderPro' ) . '" class="button button-small">' . __( "Upgrade", "defender-security" ) . '</button>'
@@ -168,9 +165,8 @@ class WD_Main_Activator {
168
  $mylinks = array_merge( $mylinks, $links );
169
  $mylinks = array_merge( $mylinks, array(
170
  '<a target="_blank" href="https://premium.wpmudev.org/docs/wpmu-dev-plugins/defender/">' . __( "Docs", "defender-security" ) . '</a>',
171
- '<a style="color: #1ABC9C" target="_blank" href="' . \WP_Defender\Behavior\Utils::instance()->campaignURL( 'defender_wppluginslist_upgrade' ) . '">' . __( "Upgrade", "defender-security" ) . '</a>',
172
  ) );
173
-
174
  return $mylinks;
175
  }
176
 
44
  update_site_option( 'wd_db_version', "1.7.1" );
45
  }
46
 
47
+ add_filter( 'plugin_action_links_' . plugin_basename( wp_defender()->plugin_slug ), array( &$this, 'addSettingsLink' ) );
 
 
 
48
  add_action( 'admin_enqueue_scripts', array( &$this, 'register_styles' ) );
49
  if ( ! \WP_Defender\Behavior\Utils::instance()->checkRequirement() ) {
50
  } else {
117
  }
118
 
119
  public function showUpgradeNotification() {
120
+ $class = 'notice notice-info is-dismissible wp-defender-notice';
121
  $message = sprintf( __( "%s, you now have access to Defender's pro features but you still have the free version installed. Let's upgrade Defender and unlock all those juicy features! &nbsp; %s", "defender-security" ),
122
  \WP_Defender\Behavior\Utils::instance()->getDisplayName(),
123
  '<button id="install-defender-pro" type="button" data-id="1081723" data-nonce="' . wp_create_nonce( 'installDefenderPro' ) . '" class="button button-small">' . __( "Upgrade", "defender-security" ) . '</button>'
165
  $mylinks = array_merge( $mylinks, $links );
166
  $mylinks = array_merge( $mylinks, array(
167
  '<a target="_blank" href="https://premium.wpmudev.org/docs/wpmu-dev-plugins/defender/">' . __( "Docs", "defender-security" ) . '</a>',
168
+ '<a style="color: #1ABC9C" target="_blank" href="'.\WP_Defender\Behavior\Utils::instance()->campaignURL('defender_wppluginslist_upgrade').'">' . __( "Upgrade", "defender-security" ) . '</a>',
169
  ) );
 
170
  return $mylinks;
171
  }
172
 
readme.txt CHANGED
@@ -7,7 +7,7 @@ Contributors: WPMUDEV
7
  Tags: Security, Security Tweaks, Hardening, IP lockout, Monitoring, Blacklist, Site Protection, Hacked, Security Scan
8
  Requires at least: 4.6
9
  Tested up to: 4.9.7
10
- Stable tag: 1.9
11
  License: GPL v2 - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
12
 
13
  Protect WordPress from hackers with security tweaks, code scans, 2-Step Verification, IP lockouts, and monitoring.
@@ -122,6 +122,13 @@ Hackers and bot attacks are not the only threat to your site. No matter what se
122
 
123
  == Changelog ==
124
 
 
 
 
 
 
 
 
125
  = 1.9 =
126
  - New: Ability to edit default two-factor authentication email notifications
127
  - New: Added Privacy Policy in privacy guideline page
7
  Tags: Security, Security Tweaks, Hardening, IP lockout, Monitoring, Blacklist, Site Protection, Hacked, Security Scan
8
  Requires at least: 4.6
9
  Tested up to: 4.9.7
10
+ Stable tag: 1.9.1
11
  License: GPL v2 - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
12
 
13
  Protect WordPress from hackers with security tweaks, code scans, 2-Step Verification, IP lockouts, and monitoring.
122
 
123
  == Changelog ==
124
 
125
+ = 1.9.1 =
126
+ - Fix: Mask Login Area description text is misleading
127
+ - Fix: wp-admin link of sub-sites in networks link to wrong admin URL
128
+ - Fix: Prevent Information Disclosure & Prevent PHP Execution show false error message when first applied
129
+ - Fix: Dashboard reporting section mis-alignment
130
+ - Other minor enhancements and fixes
131
+
132
  = 1.9 =
133
  - New: Ability to edit default two-factor authentication email notifications
134
  - New: Added Privacy Policy in privacy guideline page
wp-defender.php CHANGED
@@ -3,7 +3,7 @@
3
  /**
4
  * Plugin Name: Defender
5
  * Plugin URI: https://premium.wpmudev.org/project/wp-defender/
6
- * Version: 1.9
7
  * Description: Get regular security scans, vulnerability reports, safety recommendations and customized hardening for your site in just a few clicks. Defender is the analyst and enforcer who never sleeps.
8
  * Author: WPMU DEV
9
  * Author URI: http://premium.wpmudev.org/
3
  /**
4
  * Plugin Name: Defender
5
  * Plugin URI: https://premium.wpmudev.org/project/wp-defender/
6
+ * Version: 1.9.1
7
  * Description: Get regular security scans, vulnerability reports, safety recommendations and customized hardening for your site in just a few clicks. Defender is the analyst and enforcer who never sleeps.
8
  * Author: WPMU DEV
9
  * Author URI: http://premium.wpmudev.org/