MalCare WordPress Security Plugin – Malware Scanner, Cleaner, Security Firewall - Version 4.77

Version Description

  • Improved the landing pages.
  • Enhanced future vulnerability protection
  • IP Blocking Improvements
  • Improved firewall configuration for migrations
Download this release

Release Info

Developer ritesh.soni36
Plugin Icon 128x128 MalCare WordPress Security Plugin – Malware Scanner, Cleaner, Security Firewall
Version 4.77
Comparing to
See all releases

Code changes from version 4.76 to 4.77

admin/account_details.php CHANGED
@@ -1,55 +1,14 @@
1
- <div id="content-wrapper" style="width: 99%;">
2
- <!-- Content HTML goes here -->
3
- <div class="mui-container-fluid">
4
- <div class="mui--appbar-height"></div>
5
- <br><br>
6
- <div class="mui-row">
7
- <div style="background: #4686f5; overflow: hidden;">
8
- <a href="https://www.malcare.com/?utm_source=mc_free_plugin_lp_logo&utm_medium=logo_link&utm_campaign=mc_free_plugin_lp_header&utm_term=header_logo&utm_content=image_link"><img src="<?php echo plugins_url($this->getPluginLogo(), __FILE__); ?>" style="padding: 10px;"></a>
9
- <div class="top-links" style="width:400px;float: right;margin-top: 15px;">
10
- <span class="bv-top-button" style="padding: 5px;margin:5px;border: 1px solid #17252A;display:inline-block;background:ghostwhite;border-radius: 5px;float:right;"><a href="https://wordpress.org/support/plugin/malcare-security/reviews/#new-post">Leave a Review</a></span>
11
- <span class="bv-top-button" style="padding: 5px;margin:5px;border: 1px solid #17252A;display:inline-block;background:ghostwhite;border-radius: 5px;float:right;"><a href="https://wordpress.org/support/plugin/malcare-security/">Need Help?</a></span>
12
- </div>
13
  </div>
14
- </div>
 
 
 
 
 
15
  </div>
16
-
17
-
18
- </br> </br>
19
- <div class="mui-container-fluid">
20
- <?php $accounts = MCAccount::accountsByPlugname($this->settings);?>
21
- <div class="mui-panel" style="width:800px; margin:0 auto;border:1px solid #CCC;">
22
- <div class="mui--text-body1" style="text-align:center;font-size:18px;">Accounts associated with this website.</div><br/>
23
- <table cellpadding="10" style="width:700px; margin:0 auto;border:1px solid black;">
24
- <tr style="text-align:center;font-size:15px;border: 1px solid black;"> <th> Account Email</th><th>Last Scanned At</th><th></th></tr>
25
- <?php
26
- $nonce = wp_create_nonce( 'bvnonce' );
27
- foreach($accounts as $key => $value){
28
- ?>
29
- <form dummy=">" action="" style="padding:0 2% 2em 1%;" method="post">
30
- <input type='hidden' name='bvnonce' value="<?php echo $nonce ?>" />
31
- <input type='hidden' name='pubkey' value="<?php echo $key ?>" />
32
- <tr style="text-align:center;font-size:15px;border: 1px solid black;">
33
- <td >
34
- <?php echo $value['email'] ?>
35
- </td>
36
- <td>
37
- <?php echo date('Y-m-d H:i:s', $value['lastbackuptime']); ?>
38
- </td>
39
- <td >
40
- <input type='submit' class="button-primary" value='Disconnect' name='disconnect'>
41
- </td>
42
- </tr>
43
- </form>
44
- <?php } ?>
45
- </table>
46
- <div class="mui-col-md-12 mui-col-md-offset-3" style="padding-top:2%;">
47
-
48
- <?php if(isset($this->account)) { ?>
49
- <a class="mui-btn mui-btn--raised mui-btn--primary" href=<?php echo $this->account->authenticatedUrl('/malcare/access') ?> target="_blank">Visit Dashboard</a>
50
- <?php } ?>
51
- <a class="mui-btn mui-btn--raised mui-btn--primary" href=<?php echo $this->mainUrl('&add_account=true'); ?> >Connect New Account</a>
52
- </div>
53
- </div>
54
- </div>
55
  </div>
1
+ <div class="malcare">
2
+ <div id="main-page">
3
+ <section id="header">
4
+ <div class="custom-container">
5
+ <?php require_once dirname( __FILE__ ) . "/components/header_top.php"; ?>
 
 
 
 
 
 
 
6
  </div>
7
+ </section>
8
+ <?php
9
+ require_once dirname( __FILE__ ) . "/components/list_accounts.php";
10
+ require_once dirname( __FILE__ ) . "/components/testimony.php";
11
+ require_once dirname( __FILE__ ) . "/components/footer.php";
12
+ ?>
13
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  </div>
admin/add_new_account.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="malcare">
2
+ <div id="add-new-account">
3
+ <section id="header">
4
+ <div class="custom-container">
5
+ <?php
6
+ require_once dirname( __FILE__ ) . "/components/header_top.php";
7
+ require_once dirname( __FILE__ ) . "/components/form.php";
8
+ ?>
9
+ </div>
10
+ </section>
11
+ <?php
12
+ require_once dirname( __FILE__ ) . "/components/features_list.php";
13
+ require_once dirname( __FILE__ ) . "/components/testimony.php";
14
+ require_once dirname( __FILE__ ) . "/components/footer.php";
15
+ ?>
16
+ </div>
17
+ </div>
admin/components/features_list.php ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $heading = "MALCARE 360 DEGREE PROTECTION";
3
+ $subheading = "How can Malcare help protect your site?";
4
+ $img_url = plugins_url("/../../img/mc-features-list.png", __FILE__);
5
+ $intro_video_url = "https://youtu.be/rBuYh2dIadk";
6
+ $brand_name = "MalCare";
7
+ ?>
8
+ <section id="list-features">
9
+ <div class="custom-container">
10
+ <div class="heading text-center">
11
+ <h5><?php echo $heading; ?></h5>
12
+ <h4><?php echo $subheading; ?></h4>
13
+ </div>
14
+ <div class="row">
15
+ <div class="col-xs-12 d-flex">
16
+ <div class="col-xs-12 col-lg-6">
17
+ <div>
18
+ <img class="main-image" src="<?php echo $img_url; ?>"/>
19
+ </div>
20
+ <div class="text-center intro-video d-flex">
21
+ <a href="<?php echo $intro_video_url; ?>" target="_blank" rel="noopener noreferrer">
22
+ <img src="<?php echo plugins_url("/../../img/play-video.png", __FILE__); ?>"/>
23
+ &nbsp;Watch the <?php echo $brand_name; ?> Video
24
+ </a>
25
+ </div>
26
+ </div>
27
+ <div class="col-xs-12 col-lg-6 d-flex">
28
+ <div id="accordion">
29
+ <div>
30
+ <input type="radio" name="accordion-group" id="option-1" checked />
31
+ <div class="acc-card">
32
+ <label for="option-1">
33
+ <h5>MALCARE SCANNER</h5>
34
+ <h4>WordPress Malware Scanner that will NEVER slow down your website.</h4>
35
+ </label>
36
+ <div class="article">
37
+ <p>MalCare’s “Early Detection Technology” finds WordPress Malware that other popular plugins miss!
38
+ It uses 100+ signals to accurately detect and pinpoint even “Unknown” malware. You can now scan your website
39
+ for malware automatically, with ZERO overload on your server!</p>
40
+ </div>
41
+ </div>
42
+ </div>
43
+ <div>
44
+ <input type="radio" name="accordion-group" id="option-2" />
45
+ <div class="acc-card">
46
+ <label for="option-2">
47
+ <h5>MALCARE FIREWALL</h5>
48
+ <h4>Get 100% Protection from Hackers with our Advanced WordPress Firewall </h4>
49
+ </label>
50
+ <div class="article">
51
+ <p>Automatically block malicious traffic with MalCare’s intelligent visitor pattern detection.
52
+ With CAPTCHA-based Login Protection, Timely alerts for suspicious logins and Security Features
53
+ recommended by WordPress - you can say Goodbye to Hackers!</p>
54
+ </div>
55
+ </div>
56
+ </div>
57
+ <div>
58
+ <input type="radio" name="accordion-group" id="option-3" />
59
+ <div class="acc-card">
60
+ <label for="option-3">
61
+ <h5>MALCARE CLEANER</h5>
62
+ <h4>Instant Malware Removal that takes less than 60 Seconds in just 1-Click!</h4>
63
+ </label>
64
+ <div class="article">
65
+ <p>No more waiting for hours or days to clean your hacked website. With MalCare’s fully automated
66
+ malware removal, you malware will be gone in a jiffy! Our powerful cleaner removes even complex &amp;
67
+ unknown malware in a matter of seconds. Leave the heavy lifting to us while you sit back and
68
+ relax - your site is in safe hands!</p>
69
+ </div>
70
+ </div>
71
+ </div>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+ </div>
77
+ </section>
admin/components/footer.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $subtitle = "25,000 happy customers and counting"; ?>
2
+ <section id="footer">
3
+ <div class="custom-container text-center" id="">
4
+ <div class="row">
5
+ <div class="col-lg-12">
6
+ <div class="heading">
7
+ <h5>TRUSTED BY BRANDS WORLDWIDE</h5>
8
+ <h4><?php echo $subtitle; ?></h4>
9
+ </div>
10
+ <div class="heading text-center brand d-flex ">
11
+ <img src="<?php echo plugins_url("/../../img/wpbuffs.png", __FILE__); ?>" style="height: 42px;"/>
12
+ <img src="<?php echo plugins_url("/../../img/cloudways.png", __FILE__); ?>" style="height: 42px;" />
13
+ <img src="<?php echo plugins_url("/../../img/gowp_new.png", __FILE__); ?>" style="height: 42px;"/>
14
+ <img src="<?php echo plugins_url("/../../img/sitecare.png", __FILE__); ?>" style="height: 42px;" />
15
+ <img src="<?php echo plugins_url("/../../img/astra.png", __FILE__); ?>" style="height: 42px;" />
16
+ </div>
17
+ </div>
18
+ </div>
19
+ </div>
20
+ </section>
admin/components/form.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $brand_name = "MalCare";
3
+ $webpage = "https://www.malcare.com";
4
+ ?>
5
+ <div class="email-form">
6
+ <div class="row">
7
+ <div class="col-xs-12 form-container">
8
+ <div class="search-container text-center ">
9
+ <form action="<?php echo $this->bvinfo->appUrl(); ?>/plugin/signup" style="padding-top:10px; margin: 0px;" onsubmit="document.getElementById('get-started').disabled = true;" method="post" name="signup">
10
+ <input type='hidden' name='bvsrc' value='wpplugin'/>
11
+ <input type='hidden' name='origin' value='protect'/>
12
+ <?php echo $this->siteInfoTags(); ?>
13
+ <input type="text" placeholder="Enter your email address to continue" id="email" name="email" class="search" required>
14
+ <h5 class="check-box-text mt-2"><input type="checkbox" class="check-box" name="consent" value="1" required>
15
+ <label>I agree to <?php echo $brand_name; ?> <a href="<?php echo $webpage.'/tos'; ?>" target="_blank" rel="noopener noreferrer">Terms of Service</a> and <a href="<?php echo $webpage.'/privacy'; ?>" target="_blank" rel="noopener noreferrer">Privacy Policy</a></label></h5>
16
+ <button id="get-started" type="submit" class="e-mail-button"><span class="text-white">Submit</span></button>
17
+ </form>
18
+ </div>
19
+ </div>
20
+ </div>
admin/components/header_top.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $plugin_slug = "malcare-security";
3
+ $brand_name = "MalCare";
4
+ $plugin_logo = plugins_url("/../../img/mclogo.svg", __FILE__);
5
+ $title = "Secure your website with MalCare's 360 degree protection";
6
+ $intro_video_url = "https://youtu.be/rBuYh2dIadk";
7
+ $header_logo_link = "https://malcare.com/?utm_source=mc_plugin_lp_logo&utm_medium=logo_link&utm_campaign=mc_plugin_lp_header&utm_term=header_logo&utm_content=image_link";
8
+ ?>
9
+ <div class="header-top">
10
+ <div class="top-links">
11
+ <span>
12
+ <a href="https://wordpress.org/support/plugin/<?php echo $plugin_slug; ?>/reviews/#new-post" target="_blank" rel="noopener noreferrer">
13
+ Leave a Review
14
+ </a>
15
+ </span>
16
+ &nbsp;
17
+ <span>
18
+ <a href="https://wordpress.org/support/plugin/<?php echo $plugin_slug; ?>/" target="_blank" rel="noopener noreferrer">
19
+ Need Help?
20
+ </a>
21
+ </span>
22
+ </div>
23
+ <div class="logo-img">
24
+ <a href="<?php echo $header_logo_link; ?>" target="_blank" rel="noopener noreferrer">
25
+ <img height="65" src="<?php echo $plugin_logo; ?>" alt="Logo">
26
+ </a>
27
+ </div>
28
+ <h2 class="text-center heading"><?php echo $title; ?></h2>
29
+ <div class="text-center intro-video">
30
+ <a href="<?php echo $intro_video_url; ?>" target="_blank" rel="noopener noreferrer">
31
+ <img src="<?php echo plugins_url("/../../img/play-video.png", __FILE__); ?>"/>
32
+ Watch the <?php echo $brand_name; ?> Video
33
+ </a>
34
+ </div>
35
+ </div>
admin/components/list_accounts.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <section id="account-list">
2
+ <?php $accounts = MCAccount::accountsByPlugname($this->settings); ?>
3
+ <div class="account-list-container custom-container text-center">
4
+ <h4>Accounts associated with this website</h4>
5
+ <div class="table-container">
6
+ <table>
7
+ <tr><th>Account Email</th><th>Last Synced At</th><th></th></tr>
8
+ <?php
9
+ $nonce = wp_create_nonce('bvnonce');
10
+ foreach($accounts as $key => $value) {
11
+ ?>
12
+ <form action="" method="post">
13
+ <input type='hidden' name='bvnonce' value="<?php echo $nonce; ?>" />
14
+ <input type='hidden' name='pubkey' value="<?php echo $key; ?>" />
15
+ <tr>
16
+ <td><?php echo $value['email']; ?></td>
17
+ <td><?php echo date('Y-m-d H:i:s', $value['lastbackuptime']); ?></td>
18
+ <td><input type='submit' class="button-primary" value='Disconnect' name='disconnect' onclick="return confirm('Are you sure?');"></td>
19
+ </tr>
20
+ </form>
21
+ <?php } ?>
22
+ </table>
23
+ </div>
24
+ <div style="margin: 15px;">
25
+ <a class="btn btn-primary" href="<?php echo $this->bvinfo->appUrl(); ?>" target="_blank">Visit Dashboard</a>
26
+ <a class="btn btn-primary" style="margin-left: 15px;" href="<?php echo $this->mainUrl('&add_account=true'); ?>">Connect New Account</a>
27
+ </div>
28
+ </div>
29
+ </section>
admin/components/mc_testimony.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <ul class="slides text-center">
2
+ <li class="slide text-center">
3
+ <img class="user" src="<?php echo plugins_url("/../../img/mc-testimony-ivica-delic.jpg", __FILE__); ?>"/><br/>
4
+ <p>
5
+ <h1>&ldquo;</h1>
6
+ <h4>Incredibly simple but powerful plugin. I am amazed how smooth its all going, scanning is very fast and I am so happy that I found it &#128578;</h4>
7
+ <h5>Ivica Delic</h5>
8
+ </p>
9
+ </li>
10
+ <li class="slide text-center">
11
+ <img class="user" src="<?php echo plugins_url("/../../img/mc-testimony-miriam-schwab.jpg", __FILE__); ?>"/><br/>
12
+ <p>
13
+ <h1>&ldquo;</h1>
14
+ <h4>When you are backing up a site MalCare tells you if that site is infected & cleans it up for you. Another way for us web developers to save valuable time & resources! MalCare is magical.</h4>
15
+ <h5>Miriam Schwab, Strattic</h5>
16
+ </p>
17
+ </li>
18
+ <li class="slide text-center">
19
+ <img class="user" src="<?php echo plugins_url("/../../img/mc-testimony-david-mccan.jpg", __FILE__); ?>"/><br/>
20
+ <p>
21
+ <h1>&ldquo;</h1>
22
+ <h4>I’m very pleased. This has reduced server load since the scans are run from their server. Setup took 5 minutes. The team has been very responsive.</h4>
23
+ <h5>David McCan, WebTNG</h5>
24
+ </p>
25
+ </li>
26
+ <li class="slide text-center">
27
+ <img class="user" src="<?php echo plugins_url("/../../img/mc-testimony-armand-girard.jpg", __FILE__); ?>"/><br/>
28
+ <p>
29
+ <h1>&ldquo;</h1>
30
+ <h4>It’s nice to know that my site is being monitored by MalCare. It’s one less thing I have to worry about thereby giving me more time to work on my business.</h4>
31
+ <h5>Armand Girard, Central Florida Promo</h5>
32
+ </p>
33
+ </li>
34
+ </ul>
admin/components/testimony.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <section id="testimony">
2
+ <div class="carousel text-center">
3
+ <div class="slide-div text-center">
4
+ <input type="radio" name="slides" id="radio-1" checked>
5
+ <input type="radio" name="slides" id="radio-2">
6
+ <input type="radio" name="slides" id="radio-3">
7
+ <input type="radio" name="slides" id="radio-4">
8
+ <?php require_once dirname( __FILE__ ) . "/mc_testimony.php"; ?>
9
+ <div class="slidesNavigation text-center">
10
+ <label for="radio-1" id="dotForRadio-1"></label>
11
+ <label for="radio-2" id="dotForRadio-2"></label>
12
+ <label for="radio-3" id="dotForRadio-3"></label>
13
+ <label for="radio-4" id="dotForRadio-4"></label>
14
+ </div>
15
+ </div>
16
+ </div>
17
+ </section>
admin/dashboard.php CHANGED
@@ -1,4 +1,3 @@
1
  <div>
2
- <iframe style="width: 100%; min-height: 100vh;" src="<?=$this->account->authenticatedUrl('/malcare/access')?>">
3
- </iframe>
4
  </div>
1
  <div>
2
+ <iframe style="width: 100%; min-height: 100vh;" src="<?=$this->account->authenticatedUrl('/malcare/access')?>"/>
 
3
  </div>
admin/registration.php DELETED
@@ -1,172 +0,0 @@
1
- <div class="malcare9">
2
- <section id="malcare-1">
3
- <div class="malcare-logo-img text-center">
4
- <img height="70" width="240" src="<?php echo plugins_url("/../img/mc-top-logo.svg", __FILE__); ?>" alt="">
5
- </div>
6
- <div class="container-malcare" id="">
7
- <div class="row">
8
- <div class="col-xs-12 malcare-1-container">
9
- <h2 class="text-center heading">Signup to secure your website with MalCare's 360 degree protection</h2>
10
- <?php $this->showErrors(); ?>
11
- <div class="search-container text-center ">
12
- <form dummy=">" action="<?php echo $this->bvinfo->appUrl(); ?>/plugin/signup" style="padding-top:10px; margin: 0px;" onsubmit="document.getElementById('get-started').disabled = true;" method="post" name="signup">
13
- <input type='hidden' name='bvsrc' value='wpplugin' />
14
- <input type='hidden' name='origin' value='protect' />
15
- <?php echo $this->siteInfoTags(); ?>
16
- <input type="text" placeholder="Enter your email address to continue" id="email" name="email" class="search" required>
17
- <h5 class="check-box-text mt-2"><input type="checkbox" class="check-box" name="consent" value="1">
18
- <label>I agree to MalCare <a href="https://www.malcare.com/tos" target="_blank" rel="noopener noreferrer">Terms of Service</a> and <a href="https://www.malcare.com/privacy" target="_blank" rel="noopener noreferrer">Privacy Policy</a></label></h5>
19
- <button id="get-started" type="submit" class="e-mail-button"><span class="text-white">Submit</span></button>
20
- </form>
21
- </div>
22
- </div>
23
- </div>
24
- </div>
25
- </section>
26
-
27
- <section id="malcare-3">
28
- <div class="container-malcare" id="">
29
- <div class="heading-malcare text-center">
30
- <h5>MALCARE 360 DEGREE PROTECTION</h5>
31
- <h4>How can Malcare help protect your site?</h4>
32
- </div>
33
- <div class="row">
34
- <div class="col-xs-12 d-flex">
35
- <div class="col-xs-12 col-lg-6">
36
- <div>
37
- <img class = "main-image" src="<?php echo plugins_url("/../img/main-image.png", __FILE__); ?>"/>
38
- </div>
39
- <div class="text-center malcare-video">
40
- <a href="https://www.youtube.com/watch?v=rBuYh2dIadk" target="_blank">
41
- <img src="<?php echo plugins_url("/../img/play-video.png", __FILE__); ?>"/>
42
- Watch the Malcare Video
43
- </a>
44
- </div>
45
- </div>
46
- <div class="col-xs-12 col-lg-6 d-flex">
47
- <div id="accordion">
48
- <div>
49
- <input type="radio" name="accordion-group" id="option-1" checked />
50
- <div class="acc-card">
51
- <label for="option-1">
52
- <h5>MALCARE SCANNER</h5>
53
- <h4>WordPress Malware Scanner that will NEVER slow down your website.</h4>
54
- </label>
55
- <div class="article">
56
- <p>MalCare’s “Early Detection Technology” finds WordPress Malware that other popular plugins miss!
57
- It uses 100+ signals to accurately detect and pinpoint even “Unknown” malware. You can now scan your website
58
- for malware automatically, with ZERO overload on your server!</p>
59
- </div>
60
- </div>
61
- </div>
62
- <div>
63
- <input type="radio" name="accordion-group" id="option-2" />
64
- <div class="acc-card">
65
- <label for="option-2">
66
- <h5>MALCARE FIREWALL</h5>
67
- <h4>Get 100% Protection from Hackers with our Advanced WordPress Firewall </h4>
68
- </label>
69
- <div class="article">
70
- <p>Automatically block malicious traffic with MalCare’s intelligent visitor pattern detection.
71
- With CAPTCHA-based Login Protection, Timely alerts for suspicious logins and Security Features
72
- recommended by WordPress - you can say Goodbye to Hackers!</p>
73
- </div>
74
- </div>
75
- </div>
76
- <div>
77
- <input type="radio" name="accordion-group" id="option-3" />
78
- <div class="acc-card">
79
- <label for="option-3">
80
- <h5>MALCARE CLEANER</h5>
81
- <h4>Instant Malware Removal that takes less than 60 Seconds in just 1-Click!</h4>
82
- </label>
83
- <div class="article">
84
- <p>No more waiting for hours or days to clean your hacked website. With MalCare’s fully automated
85
- malware removal, you malware will be gone in a jiffy! Our powerful cleaner removes even complex &amp;
86
- unknown malware in a matter of seconds. Leave the heavy lifting to us while you sit back and
87
- relax - your site is in safe hands!</p>
88
- </div>
89
- </div>
90
- </div>
91
- </div>
92
- </div>
93
- </div>
94
- </div>
95
- </div>
96
- </section>
97
-
98
- <section id="malcare-9">
99
- <div class="carousel text-center">
100
- <div class="left-fig"></div>
101
- <div class="slide-div text-center">
102
- <input type="radio" name="slides" id="radio-1" checked>
103
- <input type="radio" name="slides" id="radio-2">
104
- <input type="radio" name="slides" id="radio-3">
105
- <input type="radio" name="slides" id="radio-4">
106
- <ul class="slides text-center">
107
- <li class="slide text-center">
108
- <img class="user" src="https://mk0malcaredecgig0d6a.kinstacdn.com/wp-content/uploads/2019/09/Ivica-Delic-1.jpg"/><br/>
109
- <p>
110
- <h1>&ldquo;</h1>
111
- <h4>Incredibly simple but powerful plugin. I am amazed how smooth its all going, scanning is very fast and I am so happy that I found it&#128578;</h4>
112
- <h5>Ivica Delic</h5>
113
- </p>
114
- </li>
115
- <li class="slide text-center">
116
- <img class = "user" src="https://mk0malcaredecgig0d6a.kinstacdn.com/wp-content/uploads/2019/01/Miriam-Schwab-2.jpg"/><br/>
117
-
118
- <p>
119
- <h1>&ldquo;</h1>
120
- <h4>When you are backing up a site MalCare tells you if that site is infected & cleans it up for you. Another way for us web developers to save valuable time & resources! MalCare is magical.</h4>
121
- <h5>Miriam Schwab, Strattic</h5>
122
- </p>
123
- </li>
124
- <li class="slide text-center">
125
- <img class = "user" src="https://mk0malcaredecgig0d6a.kinstacdn.com/wp-content/uploads/2019/09/david-mccan-wordpress-cpt-1-1.jpg"/><br/>
126
-
127
- <p>
128
- <h1>&ldquo;</h1>
129
- <h4>I’m very pleased. This has reduced server load since the scans are run from their server. Setup took 5 minutes. The team has been very responsive.</h4>
130
- <h5>David McCan, WebTNG</h5>
131
- </p>
132
- </li>
133
- <li class="slide text-center">
134
- <img class = "user" src="https://mk0malcaredecgig0d6a.kinstacdn.com/wp-content/uploads/2019/09/Armand-Girard-1.jpg"/><br/>
135
-
136
- <p>
137
- <h1>&ldquo;</h1>
138
- <h4>It’s nice to know that my site is being monitored by MalCare. It’s one less thing I have to worry about thereby giving me more time to work on my business.</h4>
139
- <h5>Armand Girard, Central Florida Promo</h5>
140
- </p>
141
- </li>
142
- </ul>
143
- <div class="slidesNavigation text-center">
144
- <label for="radio-1" id="dotForRadio-1"></label>
145
- <label for="radio-2" id="dotForRadio-2"></label>
146
- <label for="radio-3" id="dotForRadio-3"></label>
147
- <label for="radio-4" id="dotForRadio-4"></label>
148
- </div>
149
- </div>
150
- </div>
151
- </section>
152
-
153
- <section id="malcare-4">
154
- <div class="container-malcare text-center" id="">
155
- <div class="row">
156
- <div class="col-lg-12">
157
- <div class="heading-malcare">
158
- <h5>TRUSTED BY BRANDS WORLDWIDE</h5>
159
- <h4>25,000 happy customers and counting</h4>
160
- </div>
161
- <div class="heading-malcare text-center brand d-flex ">
162
- <img src="<?php echo plugins_url("/../img/wpbuffs.png", __FILE__); ?>" style="height: 42px;"/>
163
- <img src="<?php echo plugins_url("/../img/cloudways.png", __FILE__); ?>" style="height: 42px;" />
164
- <img src="<?php echo plugins_url("/../img/gowp.png", __FILE__); ?>" style="height: 42px;"/>
165
- <img src="<?php echo plugins_url("/../img/sitecare.png", __FILE__); ?>" style="height: 42px;" />
166
- <img src="<?php echo plugins_url("/../img/astra.png", __FILE__); ?>" style="height: 42px;" />
167
- </div>
168
- </div>
169
- </div>
170
- </div>
171
- </section>
172
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/bvnew.min.css DELETED
@@ -1 +0,0 @@
1
- @import url(https://fonts.googleapis.com/css?family=Roboto:400,500);@import url(https://fonts.googleapis.com/css2?family=Noto+Serif&display=swap);.text-center{text-align:center}.text-right{text-align:right}.d-flex{display:flex}.testimonial_subtitle{color:#0aaa7a;font-size:12px}.testimonial_btn{background-color:#373d4b!important;color:#fff!important}.seprator{height:2px;width:56px;background-color:#0aaa7a;margin:7px 0 10px 0}.center-align-dflex{align-items:center;display:flex;justify-content:center;flex-direction:column}.card-title img{height:100px;width:125px}.h-100{height:100%}.mb-2{margin-bottom:20px}.mr-1{margin-right:10px}.mt-1{margin-top:10px}.float-right{float:right}.fw-600{font-weight:600}.malcare-logo-img{margin-top:72px}.search-container label>a{color:red;text-decoration:underline}#malcare-1{padding-top:20px;padding-bottom:70px;background-color:#f6f6ff;height:100%;position:relative}.container-malcare{max-width:1440px;margin:auto}#malcare-1 a:hover{color:red}.text-white{color:#fff!important}a.malcare-top{font-size:14px;line-height:20px;letter-spacing:.25px;font-weight:600;text-decoration-line:underline!important;color:#fff;mix-blend-mode:normal;opacity:.73}#malcare-1 .e-mail-button{background:#7b7afe;border:1px solid #e5e5e5;box-sizing:border-box;padding:25px;max-width:600px;width:100%;border-radius:8px;font-style:normal;font-weight:600;font-size:17px;line-height:1px;text-align:center;letter-spacing:.333333px;color:#4a4a4a}#malcare-1 .heading{font-family:Roboto;font-style:normal;font-weight:500}#malcare-1 .e-mail-button:hover,#malcare-5 .premium-subscription a:hover{color:#3a3a3a}#malcare-1 h4{line-height:24px;font-size:24px}#malcare-1 h2{line-height:28px;font-size:20px}#malcare-1 form img{margin-left:-20px;position:absolute;bottom:-98px;width:100%;max-width:225px}#malcare-1 input.search{background:#fff;border:1px solid rgba(101,99,255,.5);box-sizing:border-box;box-shadow:0 2px 10px rgba(204,203,203,.4);border-radius:8px;padding:25px;max-width:600px;width:100%;font-family:Roboto;font-weight:400;font-size:16px;line-height:10px;letter-spacing:.319444px;height:52px}#malcare-1 h5.check-box-text{font-style:normal;font-weight:400;font-size:14px;line-height:17px;text-align:center;letter-spacing:.291667px;color:#4a4a4a;margin:15px 5px}#malcare-2 h6.card-subtitle{margin:20px 0 0 0}#malcare-3 .heading-malcare{padding-bottom:20px}#malcare-3 .container-malcare .main-image{margin:5px 10px 100px 10px;padding:0px 10px 10px 10px}.heading-malcare h4{font-family:Roboto;font-weight:500;font-style:normal;font-size:24px;line-height:28px;text-align:center;letter-spacing:.416667px;color:#4a4a4a}.heading-malcare h5{font-family:Roboto;font-weight:400;font-style:normal;font-size:12px;line-height:28px;text-align:center;letter-spacing:.8px;color:#ee5151}input[type="checkbox"]:checked::before{width:2.3rem}input[type="checkbox"]:focus{outline:unset!important}#malcare-1 h5.check-box-text input.check-box{position:relative;width:20px;height:20px;margin:0 0 5px 0}#malcare-2 h1.number-malcare{margin:0;position:absolute;font-size:50px;color:#7683ad;top:110px;left:25px}#malcare-2,#malcare-3,#malcare-4{padding:5px 0;margin:50px 0 50px 0}#malcare-5{padding:30px 0}#malcare-2{padding-top:30px}#malcare-2 h6{font-style:normal;font-weight:700;font-size:20px;line-height:26px;text-align:center;letter-spacing:.333333px;color:#4a4a4a}#malcare-2 p{font-style:normal;font-weight:400;font-size:18px;line-height:22px;text-align:center;letter-spacing:.25px;color:#7683ad}#malcare-3 .embed-responsive{border-radius:10px}#malcare-5 .malcare-testimonial h4{font-size:22px;line-height:36px;margin-top:50px;text-align:center;color:#4a4a4a}#malcare-5 .malcare-testimonial h5.testimonial_subtitle{font-style:normal;font-weight:400;font-size:18px;line-height:36px;text-align:center;color:#4d50a7}#malcare-5 .malcare-testimonial p.testimonial_para{font-style:normal;font-weight:400;font-size:18px;line-height:27px;text-align:center;letter-spacing:.2px;color:#7683ad}.heading-malcare{margin-bottom:30px}#malcare-4 .brand{justify-content:center}#malcare-4 .brand img{margin:0 15px}#malcare-5 ul li{list-style:none}#malcare-5 ul li{font-style:normal;font-weight:400;font-size:18px;line-height:36px;text-align:initial;color:#4d50a7}#malcare-5 h6{font-size:22px;line-height:36px;text-align:center;font-family:AvenirNextLTPro-Regular,sans-serif;color:#4a4a4a}#malcare-5 ul{padding:0}#malcare-5 .premium-subscription a{background:#50e3c2;border:2px solid #17abff;box-sizing:border-box;border-radius:60px;font-style:normal;text-decoration:none;font-weight:600;font-size:24px;outline:0;line-height:31px;text-align:center;letter-spacing:.333333px;padding:20px;color:#4a4a4a}#malcare-5 .subscription{align-items:center;background:#fff;border:1px solid rgba(97,120,238,.487177);box-sizing:border-box;box-shadow:0 17px 40px rgba(217,223,252,.539883);border-radius:19px;overflow:hidden;height:330px}#malcare-5 .premium-subscription{align-items:center;display:flex}.bg-light-green{background-color:rgba(80,227,194,.18)}body.malcare9 a,body.malcare9 h1,body.malcare9 h2,body.malcare9 h3,body.malcare9 h4{font-family:Roboto,sans-serif}body.malcare9 button,body.malcare9 h5,body.malcare9 h6,body.malcare9 p,body.malcare9 ul li a{font-family:Roboto,sans-serif}#malcare-2-1{padding-top:80px;padding-bottom:350px;background:url(../img/malcare-heading-2.svg) no-repeat center;height:100%;background-size:cover;background-position:bottom}#malcare-2-3 .progress.custom-progress .progress-bar{background-color:#777}#malcare-2-3 .progress-heading p{font-size:12px;line-height:41px;text-align:center;color:#4a4a4a}.malcare-3 #malcare-1{padding-top:80px;padding-bottom:130px;background-color:#f6f6ff;height:100%}.color-grey{color:#4a4a4a!important}.color-blue{color:#7683ad!important}#wpcontent{padding:0!important}.malcare-video{padding:10px 35px;background:rgba(255,255,255,.25);border:1px solid #e3ebfd;box-sizing:border-box;border-radius:8px;max-width:40%;font-family:Lato;font-weight:400;font-style:normal;font-size:14px;line-height:17px;color:#7683ad}#malcare-3 #accordion input{display:none}#malcare-3 #accordion{background:#fff;font-family:Roboto;font-style:normal}#malcare-3 #accordion h4{color:#333;font-weight:500;font-size:18px;line-height:24px}#malcare-3 #accordion h5{color:#ff6459;font-weight:400;font-size:11px;line-height:22px;letter-spacing:.5px}#malcare-3 #accordion label{border-radius:8px;display:block;margin-bottom:.125em;padding:.25em 1em;z-index:20}#malcare-3 #accordion label:hover{text-decoration:underline}#malcare-3 #accordion .article{display:none;overflow:hidden;z-index:10;font-weight:400;font-size:14px;line-height:22px;padding:.25em 1em;color:#888}#malcare-3 #accordion input:checked~.acc-card{border:1px solid rgba(101,99,255,.3);box-sizing:border-box;box-shadow:0 2px 8px rgba(229,229,229,.25);border-radius:8px}#malcare-3 #accordion input:checked~.acc-card .article{display:block}#malcare-9{overflow:hidden}#malcare-9 .carousel{padding-top:80px;text-align:center;height:auto;width:100%;margin:auto;position:relative}#malcare-9 .slide h1{font-family:"Noto Serif";font-style:normal;font-weight:400;font-size:144px;line-height:51px;text-align:center;letter-spacing:.9px;color:#7b7afe;margin:20px}#malcare-9 .slide h4{font-family:Roboto;font-style:normal;font-weight:400;font-size:28px;line-height:46px;text-align:center;letter-spacing:.2px;color:#fff;margin:20px}#malcare-9 .slide h5{font-family:Roboto;font-style:normal;font-weight:400;font-size:18px;line-height:21px;text-align:center;letter-spacing:.15px;color:#fff;mix-blend-mode:normal;opacity:.58;margin:20px}#malcare-9 .carousel .slides{width:400%;left:0;padding-left:0;padding-top:1em;list-style:none;position:relative;-webkit-transition:transform 0.5s;-moz-transition:transform 0.5s;-o-transition:transform 0.5s;transition:transform 0.5s}#malcare-9 .carousel .slide .user{position:relative;top:-90px;border-radius:50%;height:140px;width:140px}#malcare-9 .carousel .slide-div{background:#2d3a67;width:100%}#malcare-9 .carousel .slides li{width:25%;position:relative;float:left}#malcare-9 .carousel li p{margin-top:0}#malcare-9 .carousel .slidesNavigation{display:inline-block;list-style:none;margin:40px}#malcare-9 .carousel input{display:none}#malcare-9 .carousel .slidesNavigation label{float:left;margin:6px;display:block;height:10px;width:10px;-webkit-border-radius:50%;border-radius:50%;border:solid 1px #fff;background:#fff;opacity:.4;font-size:0}#radio-1:checked~.slides{transform:translateX(0)}#radio-2:checked~.slides{transform:translateX(-25%)}#radio-3:checked~.slides{transform:translateX(-50%)}#radio-4:checked~.slides{transform:translateX(-75%)}#malcare-9 .carousel #radio-1:checked~.slidesNavigation label#dotForRadio-1,#malcare-9 .carousel #radio-2:checked~.slidesNavigation label#dotForRadio-2,#malcare-9 .carousel #radio-3:checked~.slidesNavigation label#dotForRadio-3,#malcare-9 .carousel #radio-4:checked~.slidesNavigation label#dotForRadio-4{opacity:1}@media (max-width:624px){#malcare-1 h5.check-box-text{font-size:11px!important}#get-started span{display:none}#get-started:before{font-size:13px;content:"Submit"}#malcare-1 h2{font-size:22px}#malcare-1 h4{font-size:20px}.malcare-logo-img img{height:47px;width:161px}#malcare-4 .brand{justify-content:center}#malcare-4 .brand img{margin:20px;display:inline-block}#malcare-1 .search-container{margin-top:20px}#malcare-3 .container-malcare .main-image{margin:5px 10px 100px 10px;padding:0px 10px 10px 10px;width:550px}.malcare-video{max-width:100%}}@media (max-width:1024px){.man-img{display:none}.d-flex{display:inline-block}.malcare-video{margin:auto;margin-bottom:70px}#malcare-1 .e-mail-button{width:80%!important}#malcare-1 input.search{width:80%!important}.malcare-1-container h2{margin-top:70px!important}}@media (min-width:1024px) and (max-width:1367px){#get-started span{display:none}#get-started:before{content:"Submit"}}@media (min-width:768px){.justify-content-center{justify-content:center}}@media (max-width:1440px){.row{margin-left:0!important;margin-right:0!important}}@media (min-width:1440px){.malcare-video{margin:auto}.malcare-testimonial{width:100%;margin-left:auto;margin-right:auto}}
 
css/bvplugin.min.css ADDED
@@ -0,0 +1 @@
 
1
+ @import url('https://fonts.googleapis.com/css?family=Roboto:400, 500');@import url(https://fonts.googleapis.com/css2?family=Noto+Serif&display=swap);body a,body h1,body h2,body h3,body h4{font-family:Roboto,sans-serif}body button,body h5,body h6,body li,body p,body ul li a{font-family:Roboto,sans-serif}.text-center{text-align:center}.text-right{text-align:right}.d-flex{display:flex}.center-align-dflex{align-items:center;display:flex;justify-content:center;flex-direction:column}.h-100{height:100%}.mb-2{margin-bottom:20px}.mr-1{margin-right:10px}.mt-1{margin-top:10px}.float-right{float:right}.fw-600{font-weight:600}.text-white{color:#fff!important}.text-capitalize{text-transform:capitalize}.text-uppercase{text-transform:uppercase}input[type=checkbox]:checked::before{width:2.3rem;margin:-1px 0 0 -4px}input[type=checkbox]:focus{outline:unset!important}.color-grey{color:#4a4a4a!important}.color-blue{color:#7683ad!important}a{outline:unset!important;box-shadow:none!important}.custom-container{max-width:1440px;margin:auto}#wpcontent{padding:0!important}#wpbody-content{padding-bottom:65px;float:left;width:100%;overflow:visible!important}#add-new-account #header .intro-video{display:none}#header{padding-top:77px;padding-bottom:40px;background-color:#f6f6ff;height:100%;position:relative;text-align:center}#header .top-links{position:absolute;top:15px;right:10px}#header .top-links a{text-decoration:underline}.blogvault #header .logo-img img{height:70px}.blogvault #header a:hover{color:#2f9d92}.malcare #header a:hover{color:#ee5151}#header .heading{font-family:Roboto;font-style:normal;font-size:22px;font-weight:500}#header .intro-video,#list-features .intro-video{padding:10px 25px;background:rgba(255,255,255);border:1px solid #e3ebfd;box-sizing:border-box;border-radius:8px;max-width:300px;font-family:Lato;font-weight:400;font-style:normal;font-size:14px;line-height:17px;color:#7683ad;margin:auto;margin-top:15px}#list-features .intro-video{margin:unset;margin-top:50px}.email-form{margin-top:10px}.email-form h5.check-box-text input.check-box{position:relative;width:20px;height:20px;margin:0 0 5px 0;border-radius:4px}.email-form h5.check-box-text{font-style:normal;font-weight:400;font-size:14px;line-height:17px;text-align:center;letter-spacing:.291667px;color:#4a4a4a;margin:15px 5px}.email-form .search-container label>a{text-decoration:underline}.blogvault .email-form .search-container label>a{color:#2f9d92}.malcare .email-form .search-container label>a{color:#ee5151}.email-form input.search{background:#fff;box-sizing:border-box;box-shadow:0 2px 10px rgba(204,203,203,.4);border-radius:8px;padding:25px;max-width:600px;width:100%;font-family:Roboto;font-weight:400;font-size:16px;line-height:10px;letter-spacing:.319444px;height:52px}.blogvault .email-form input.search{border:1px solid rgba(71,194,214,.5)}.malcare .email-form input.search{border:1px solid rgba(101,99,255,.5)}.email-form .e-mail-button{border:1px solid #e5e5e5;box-sizing:border-box;padding:25px;max-width:600px;width:100%;border-radius:8px;font-style:normal;font-weight:600;font-size:17px;line-height:1px;text-align:center;letter-spacing:.333333px;color:#4a4a4a}.email-form .e-mail-button:active{transform:translateY(.5px)}.blogvault .email-form .e-mail-button{background:#47c2d6}.malcare .email-form .e-mail-button{background:#7b7afe}#account-list h4,#footer h4,#list-features h4{font-family:Roboto;font-weight:500;font-style:normal;font-size:24px;line-height:28px;text-align:center;letter-spacing:.416667px;color:#4a4a4a}#account-list h5,#footer h5,#list-features h5{font-family:Roboto;font-weight:400;font-style:normal;font-size:12px;line-height:28px;text-align:center;letter-spacing:.8px;text-transform:uppercase}.blogvault h5{color:#2f9d92}.malcare h5{color:#ee5151}#footer .brand{justify-content:center}#footer .brand img{margin:0 15px}#footer .heading{margin-bottom:30px}#wpbody-content{padding-bottom:65px;float:left;width:100%;overflow:visible!important}#wpbody-content{padding-bottom:65px;float:left;width:100%;overflow:visible!important}#account-list,#footer,#list-features{padding:50px 0}#list-features .heading{padding-bottom:20px}.blogvault #list-features img.main-image{width:100%}#list-features ul{list-style:inside}#list-features li{font-size:12px}#list-features #accordion input{display:none}#list-features #accordion{background:#fff;font-family:Roboto;font-style:normal}#list-features #accordion h4{color:#333;font-weight:500;font-size:18px;line-height:24px;text-align:left}#list-features #accordion h5{color:#2f9d92;font-weight:400;font-size:11px;line-height:22px;letter-spacing:.5px}.blogvault #list-features #accordion h5{color:#2f9d92}.malcare #list-features #accordion h5{color:#ee5151}#list-features #accordion label{border-radius:8px;display:block;margin-bottom:.125em;padding:.25em 1em;z-index:20}#list-features #accordion label:hover{text-decoration:underline}#list-features #accordion .article{display:none;overflow:hidden;z-index:10;font-weight:400;font-size:14px;line-height:22px;padding:.25em 1em;color:#888}#list-features #accordion input:checked~.acc-card{border:1px solid rgba(101,99,255,.3);box-sizing:border-box;box-shadow:0 2px 8px rgba(229,229,229,.25);border-radius:8px}#list-features #accordion input:checked~.acc-card .article{display:block}#account-list .account-list-container{width:800px;margin:auto;padding:20px;box-sizing:border-box;box-shadow:2px 2px 9px rgb(212 212 212),0 0 9px rgb(212 212 212);border-radius:11.5px}#account-list table{min-width:700px;margin:auto;margin-top:30px}#account-list .table-container{max-height:340px;overflow:auto}#account-list table input.button-primary{box-shadow:unset}#account-list .table-container::-webkit-scrollbar{width:6px;height:6px}#account-list .table-container::-webkit-scrollbar-thumb{background:#ccc;border-radius:10px;width:6px;height:6px}#account-list table tr th{text-align:center}#account-list table tr td{padding:10px}#testimony{overflow:hidden}#testimony .carousel{padding-top:80px;text-align:center;height:auto;width:100%;margin:auto;position:relative}#testimony .slide h1{font-family:"Noto Serif";font-style:normal;font-weight:400;font-size:144px;line-height:51px;text-align:center;letter-spacing:.9px;color:#7b7afe;margin:20px}#testimony .slide h4{font-family:Roboto;font-style:normal;font-weight:400;font-size:28px;line-height:46px;text-align:center;letter-spacing:.2px;color:#fff;padding:20px;max-width:1440px;margin:auto}#testimony .slide h5{font-family:Roboto;font-style:normal;font-weight:400;font-size:18px;line-height:21px;text-align:center;letter-spacing:.15px;color:#fff;mix-blend-mode:normal;opacity:.58;padding:20px;max-width:1440px;margin:auto}#testimony .carousel .slides{width:400%;left:0;padding-left:0;padding-top:1em;list-style:none;position:relative;-webkit-transition:transform .5s;-moz-transition:transform .5s;-o-transition:transform .5s;transition:transform .5s}#testimony .carousel .slide .user{position:relative;top:-90px;border-radius:50%;height:140px;width:140px;object-fit:cover}#testimony .carousel .slide-div{background:#2d3a67;width:100%}#testimony .carousel .slides li{width:25%;position:relative;float:left}#testimony .carousel li p{margin-top:0}#testimony .carousel .slidesNavigation{display:inline-block;list-style:none;margin:40px}#testimony .carousel input{display:none}#testimony .carousel .slidesNavigation label{float:left;margin:6px;display:block;height:10px;width:10px;-webkit-border-radius:50%;border-radius:50%;border:solid 1px #fff;background:#fff;opacity:.4;font-size:0}#radio-1:checked~.slides{transform:translateX(0)}#radio-2:checked~.slides{transform:translateX(-25%)}#radio-3:checked~.slides{transform:translateX(-50%)}#radio-4:checked~.slides{transform:translateX(-75%)}#testimony .carousel #radio-1:checked~.slidesNavigation label#dotForRadio-1,#testimony .carousel #radio-2:checked~.slidesNavigation label#dotForRadio-2,#testimony .carousel #radio-3:checked~.slidesNavigation label#dotForRadio-3,#testimony .carousel #radio-4:checked~.slidesNavigation label#dotForRadio-4{opacity:1}@media (max-width:624px){#get-started span{display:none}#get-started:before{font-size:13px;content:"Submit"}#footer .brand{justify-content:center}#footer .brand img{margin:20px;display:inline-block}.email-form .search-container label{font-size:11px}#header .heading{font-size:18px}#header .logo-img img{height:60px}#header .intro-video,#list-features .intro-video{max-width:77%}slide #list-features .intro-video{margin-bottom:15px}#list-features img.main-image{width:100%}#account-list .account-list-container{width:unset;box-shadow:unset;margin:0 10px}#account-list a.btn{margin-bottom:10px}}@media (max-width:1024px){.man-img{display:none}.d-flex{display:inline-block}.intro-video{margin:auto;margin-bottom:70px}}@media (min-width:1024px) and (max-width:1367px){#get-started span{display:none}#get-started:before{content:"Submit"}}@media (min-width:768px){.justify-content-center{justify-content:center}}@media (max-width:1440px){.row{margin-left:0!important;margin-right:0!important}}
img/{gowp.png → gowp_new.png} RENAMED
File without changes
img/icon.png CHANGED
Binary file
img/logo.png DELETED
Binary file
img/{main-image.png → mc-features-list.png} RENAMED
File without changes
img/mc-full-logo.png DELETED
Binary file
img/mc-testimony-armand-girard.jpg ADDED
Binary file
img/mc-testimony-david-mccan.jpg ADDED
Binary file
img/mc-testimony-ivica-delic.jpg ADDED
Binary file
img/mc-testimony-miriam-schwab.jpg ADDED
Binary file
img/{mc-top-logo.svg → mclogo.svg} RENAMED
File without changes
info.php CHANGED
@@ -10,7 +10,7 @@ if (!class_exists('MCInfo')) :
10
  public $badgeinfo = 'mcbadge';
11
  public $ip_header_option = 'mcipheader';
12
  public $brand_option = 'mcbrand';
13
- public $version = '4.76';
14
  public $webpage = 'https://www.malcare.com';
15
  public $appurl = 'https://app.malcare.com';
16
  public $slug = 'malcare-security/malcare.php';
@@ -107,8 +107,19 @@ if ($bvinfo->canSetCWBranding()) {
107
  return ($this->getWatchTime() > $expiry_time);
108
  }
109
 
 
 
 
 
 
 
 
 
 
 
 
110
  public function isProtectModuleEnabled() {
111
- return $this->isServiceActive("protect");
112
  }
113
 
114
  public function isDynSyncModuleEnabled() {
@@ -134,7 +145,7 @@ if ($bvinfo->canSetCWBranding()) {
134
  }
135
 
136
  public function isMalcare() {
137
- return $this->getBrandName() === 'MalCare - Pro';
138
  }
139
 
140
  public function isBlogvault() {
10
  public $badgeinfo = 'mcbadge';
11
  public $ip_header_option = 'mcipheader';
12
  public $brand_option = 'mcbrand';
13
+ public $version = '4.77';
14
  public $webpage = 'https://www.malcare.com';
15
  public $appurl = 'https://app.malcare.com';
16
  public $slug = 'malcare-security/malcare.php';
107
  return ($this->getWatchTime() > $expiry_time);
108
  }
109
 
110
+ public function isValidEnvironment(){
111
+ $bvsiteinfo = new MCWPSiteInfo();
112
+ $siteurl = $bvsiteinfo->siteurl();
113
+ $bvconfig = $this->config;
114
+ if ($bvconfig && array_key_exists("abspath", $bvconfig) &&
115
+ array_key_exists("siteurl", $bvconfig) && !empty($siteurl)) {
116
+ return ($bvconfig["abspath"] == ABSPATH && $bvconfig["siteurl"] == $siteurl);
117
+ }
118
+ return true;
119
+ }
120
+
121
  public function isProtectModuleEnabled() {
122
+ return $this->isServiceActive("protect") && $this->isValidEnvironment();
123
  }
124
 
125
  public function isDynSyncModuleEnabled() {
145
  }
146
 
147
  public function isMalcare() {
148
+ return $this->getBrandName() === 'MalCare';
149
  }
150
 
151
  public function isBlogvault() {
malcare.php CHANGED
@@ -1,11 +1,11 @@
1
  <?php
2
  /*
3
- Plugin Name: MalCare Security - Free Malware Scanner, Protection & Security for WordPress
4
  Plugin URI: https://www.malcare.com
5
- Description: MalCare Security - Free Malware Scanner, Protection & Security for WordPress
6
  Author: MalCare Security
7
  Author URI: https://www.malcare.com
8
- Version: 4.76
9
  Network: True
10
  */
11
 
1
  <?php
2
  /*
3
+ Plugin Name: MalCare WordPress Security Plugin - Malware Scanner, Cleaner, Security Firewall
4
  Plugin URI: https://www.malcare.com
5
+ Description: MalCare WordPress Security Plugin - Malware Scanner, Cleaner, Security Firewall
6
  Author: MalCare Security
7
  Author URI: https://www.malcare.com
8
+ Version: 4.77
9
  Network: True
10
  */
11
 
protect/base.php CHANGED
@@ -25,5 +25,86 @@ class BVProtectBase {
25
 
26
  return $ip;
27
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  }
29
  endif;
25
 
26
  return $ip;
27
  }
28
+
29
+ public static function hasIPv6Support() {
30
+ return defined('AF_INET6');
31
+ }
32
+
33
+ public static function isValidIP($ip) {
34
+ return filter_var($ip, FILTER_VALIDATE_IP) !== false;
35
+ }
36
+
37
+ public static function bvInetPton($ip) {
38
+ $pton = self::isValidIP($ip) ? (self::hasIPv6Support() ? inet_pton($ip) : self::_bvInetPton($ip)) : false;
39
+ return $pton;
40
+ }
41
+
42
+ public static function _bvInetPton($ip) {
43
+ if (preg_match('/^(?:\d{1,3}(?:\.|$)){4}/', $ip)) {
44
+ $octets = explode('.', $ip);
45
+ $bin = chr($octets[0]) . chr($octets[1]) . chr($octets[2]) . chr($octets[3]);
46
+ return $bin;
47
+ }
48
+
49
+ if (preg_match('/^((?:[\da-f]{1,4}(?::|)){0,8})(::)?((?:[\da-f]{1,4}(?::|)){0,8})$/i', $ip)) {
50
+ if ($ip === '::') {
51
+ return "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
52
+ }
53
+ $colon_count = substr_count($ip, ':');
54
+ $dbl_colon_pos = strpos($ip, '::');
55
+ if ($dbl_colon_pos !== false) {
56
+ $ip = str_replace('::', str_repeat(':0000',
57
+ (($dbl_colon_pos === 0 || $dbl_colon_pos === strlen($ip) - 2) ? 9 : 8) - $colon_count) . ':', $ip);
58
+ $ip = trim($ip, ':');
59
+ }
60
+
61
+ $ip_groups = explode(':', $ip);
62
+ $ipv6_bin = '';
63
+ foreach ($ip_groups as $ip_group) {
64
+ $ipv6_bin .= pack('H*', str_pad($ip_group, 4, '0', STR_PAD_LEFT));
65
+ }
66
+
67
+ return strlen($ipv6_bin) === 16 ? $ipv6_bin : false;
68
+ }
69
+
70
+ if (preg_match('/^(?:\:(?:\:0{1,4}){0,4}\:|(?:0{1,4}\:){5})ffff\:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i', $ip, $matches)) {
71
+ $octets = explode('.', $matches[1]);
72
+ return chr($octets[0]) . chr($octets[1]) . chr($octets[2]) . chr($octets[3]);
73
+ }
74
+
75
+ return false;
76
+ }
77
+
78
+ public static function isIPInRange($start_ip_range, $end_ip_range, $ip) {
79
+ $bin_ip = null;
80
+ if ($ip) {
81
+ $bin_ip = self::bvInetPton($ip);
82
+ }
83
+ if ($bin_ip && $bin_ip >= self::bvInetPton($start_ip_range)
84
+ && $bin_ip <= self::bvInetPton($end_ip_range)) {
85
+ return true;
86
+ }
87
+ return false;
88
+ }
89
+
90
+ public static function isPrivateIP($ip) {
91
+ $private_ip_ranges = array(
92
+ array("10.0.0.0", "10.255.255.255"),
93
+ array("172.16.0.0", "172.31.255.255"),
94
+ array("192.168.0.0", "192.168.255.255"),
95
+ array("127.0.0.1", "127.255.255.255"),
96
+ array("::1","::1"),
97
+ array("fc00::","fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")
98
+ );
99
+
100
+ $result = false;
101
+ foreach ($private_ip_ranges as $ip_range) {
102
+ $result = self::isIPInRange($ip_range[0], $ip_range[1], $ip);
103
+ if($result) {
104
+ return $result;
105
+ }
106
+ }
107
+ return $result;
108
+ }
109
  }
110
  endif;
protect/fw/fw.php CHANGED
@@ -12,9 +12,16 @@ class BVFW {
12
  public $ipstore;
13
  public $category;
14
  public $logger;
15
- public $ruleSet;
 
16
  public $ruleEvaluator;
17
  public $break_rule_evaluation;
 
 
 
 
 
 
18
 
19
  const SQLIREGEX = '/(?:[^\\w<]|\\/\\*\\![0-9]*|^)(?:
20
  @@HOSTNAME|
@@ -53,17 +60,26 @@ class BVFW {
53
  const IP_COOKIE = "bvfw-ip-cookie";
54
  const PREVENT_CACHE_COOKIE = "wp-bvfw-prevent-cache-cookie";
55
 
56
- public function __construct($logger, $confHash, $ip, $bvinfo, $ipstore, $ruleSet) {
 
57
  $this->config = new BVFWConfig($confHash);
58
  $this->request = new BVWPRequest($ip);
59
  $this->bvinfo = $bvinfo;
60
  $this->ipstore = $ipstore;
61
  $this->logger = $logger;
62
- $this->ruleSet = $ruleSet;
63
- $this->ruleEvaluator = new BVFWRuleEvaluator($this->request);
64
  $this->break_rule_evaluation = false;
65
  }
66
 
 
 
 
 
 
 
 
 
67
  public function setcookie($name, $value, $expire) {
68
  $path = $this->config->cookiePath;
69
  $cookie_domain = $this->config->cookieDomain;
@@ -162,8 +178,8 @@ class BVFW {
162
  if ($this->config->isCompleteLoggingEnabled()) {
163
  $canlog = true;
164
  } else if ($this->config->isVisitorLoggingEnabled()) {
165
- $canlog = !$this->hasValidBypassCookie() &&
166
- (!function_exists('is_user_logged_in') || !is_user_logged_in());
167
  }
168
  return $canlog;
169
  }
@@ -215,6 +231,10 @@ class BVFW {
215
  $this->request->setCategory(BVWPRequest::WHITELISTED);
216
  $this->request->setStatus(BVWPRequest::BYPASSED);
217
  return true;
 
 
 
 
218
  }
219
  return false;
220
  }
@@ -251,16 +271,53 @@ class BVFW {
251
  if ($this->isBlacklistedIP()) {
252
  $this->terminateRequest(BVWPRequest::BLACKLISTED);
253
  }
254
- if ($this->config->isRulesModeEnabled()) {
255
- if (is_array($this->ruleSet)) {
256
- $this->evaluateRules($this->ruleSet);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
257
  } else {
258
- $this->request->updateRulesInfo('errors', 'ruleset', 'Invalid RuleSet');
259
  }
260
  }
261
  }
262
  }
263
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
264
  public function matchCount($pattern, $subject) {
265
  $count = 0;
266
  if (is_array($subject)) {
@@ -389,52 +446,67 @@ class BVFW {
389
  foreach ($ruleSet as $rule) {
390
  $id = $rule["id"];
391
  $ruleLogic = $rule["rule_logic"];
392
- $actions = $rule["actions"];
393
- $min_rule_engine_ver = $rule["min_rule_engine_ver"];
394
  $this->ruleEvaluator->resetErrors();
395
 
396
- if (BVFWRuleEvaluator::VERSION >= $min_rule_engine_ver) {
397
- if ($this->ruleEvaluator->evaluateRule($ruleLogic) && empty($this->ruleEvaluator->getErrors())) {
398
- $this->request->updateMatchedRules($id);
399
- $this->executeActions($actions);
400
- } elseif (!empty($this->ruleEvaluator->getErrors())) {
401
- $this->request->updateRulesInfo("errors", (string) $id, $this->ruleEvaluator->getErrors());
402
- }
403
  }
 
404
  if ($this->break_rule_evaluation) {
405
  return;
406
  }
407
  }
408
  }
409
 
410
- function executeActions($actions){
411
- foreach($actions as $action) {
 
 
 
 
 
412
  switch ($action["type"]) {
413
  case "ALLOW":
414
  $this->break_rule_evaluation = true;
415
  $this->request->setCategory(BVWPRequest::RULE_ALLOWED);
416
  return;
417
  case "BLOCK":
418
- $this->terminateRequest(BVWPRequest::RULE_BLOCKED);
 
 
419
  return;
420
  case "INSPECT":
421
  $this->inspectRequest();
422
  break;
423
- case "DEBUG":
424
- //TODO
425
- break;
426
- case "SCRUB":
427
- //TODO
428
- break;
429
- case "FILTER":
430
- //TODO
431
- break;
432
  }
433
  }
434
  }
435
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
436
  public function inspectRequest() {
437
  $this->request->updateRulesInfo('inspect', "headers", $this->request->getHeaders());
 
 
 
 
 
 
438
  $this->request->updateRulesInfo('inspect', "getParams", $this->request->getGetParams());
439
  $this->request->updateRulesInfo('inspect', "postParams", $this->getPostParamsToLog($this->request->getPostParams()));
440
  $this->request->updateRulesInfo('inspect', "cookies", $this->request->getCookies());
12
  public $ipstore;
13
  public $category;
14
  public $logger;
15
+ public $generic_rule_set = array();
16
+ public $wpf_rule_set = array();
17
  public $ruleEvaluator;
18
  public $break_rule_evaluation;
19
+ public $ruleActions = array();
20
+ private static $instance = null;
21
+
22
+ #RuleLevels
23
+ const GENERIC = 1;
24
+ const WPF = 2;
25
 
26
  const SQLIREGEX = '/(?:[^\\w<]|\\/\\*\\![0-9]*|^)(?:
27
  @@HOSTNAME|
60
  const IP_COOKIE = "bvfw-ip-cookie";
61
  const PREVENT_CACHE_COOKIE = "wp-bvfw-prevent-cache-cookie";
62
 
63
+ #singleton design
64
+ private function __construct($logger, $confHash, $ip, $bvinfo, $ipstore, $ruleSet) {
65
  $this->config = new BVFWConfig($confHash);
66
  $this->request = new BVWPRequest($ip);
67
  $this->bvinfo = $bvinfo;
68
  $this->ipstore = $ipstore;
69
  $this->logger = $logger;
70
+ $this->initializeLevelWiseRuleSets($ruleSet);
71
+ $this->ruleEvaluator = new BVFWRuleEvaluator($this);
72
  $this->break_rule_evaluation = false;
73
  }
74
 
75
+ public static function getInstance($logger, $confHash, $ip, $bvinfo, $ipstore, $ruleSet) {
76
+ if (!isset(self::$instance)) {
77
+ self::$instance = new BVFW($logger, $confHash, $ip, $bvinfo, $ipstore, $ruleSet);
78
+ }
79
+
80
+ return self::$instance;
81
+ }
82
+
83
  public function setcookie($name, $value, $expire) {
84
  $path = $this->config->cookiePath;
85
  $cookie_domain = $this->config->cookieDomain;
178
  if ($this->config->isCompleteLoggingEnabled()) {
179
  $canlog = true;
180
  } else if ($this->config->isVisitorLoggingEnabled()) {
181
+ $canlog = ($this->request->hasMatchedRules()) || (!$this->hasValidBypassCookie() &&
182
+ (!function_exists('is_user_logged_in') || !is_user_logged_in()));
183
  }
184
  return $canlog;
185
  }
231
  $this->request->setCategory(BVWPRequest::WHITELISTED);
232
  $this->request->setStatus(BVWPRequest::BYPASSED);
233
  return true;
234
+ } else if(BVProtectBase::isPrivateIP($this->request->getIP())) {
235
+ $this->request->setCategory(BVWPRequest::PRIVATEIP);
236
+ $this->request->setStatus(BVWPRequest::BYPASSED);
237
+ return true;
238
  }
239
  return false;
240
  }
271
  if ($this->isBlacklistedIP()) {
272
  $this->terminateRequest(BVWPRequest::BLACKLISTED);
273
  }
274
+ }
275
+ }
276
+
277
+ public function canExecuteRules() {
278
+ if (!$this->isWhitelistedIP() && $this->config->isRulesModeEnabled()) {
279
+ return true;
280
+ }
281
+ return false;
282
+ }
283
+
284
+ public function initializeLevelWiseRuleSets($rule_set) {
285
+ if (!is_array($rule_set)) {
286
+ $this->request->updateRulesInfo('errors', 'ruleset', 'Invalid RuleSet');
287
+ return;
288
+ }
289
+
290
+ foreach ($rule_set as $rule) {
291
+ if (BVFWRuleEvaluator::VERSION >= $rule["min_rule_engine_ver"]) {
292
+ if (array_key_exists("level", $rule) && $rule["level"] == BVFW::WPF) {
293
+ array_push($this->wpf_rule_set, $rule);
294
  } else {
295
+ array_push($this->generic_rule_set, $rule);
296
  }
297
  }
298
  }
299
  }
300
 
301
+ public function ruleSetToExecute() {
302
+ $rule_set = array();
303
+ if ($this->isWpLoaded()) {
304
+ $rule_set = $this->wpf_rule_set;
305
+ }
306
+ if (!defined('MCWAFLOADED') && !$this->hasValidBypassCookie()) {
307
+ $rule_set = array_merge($rule_set, $this->generic_rule_set);
308
+ }
309
+ return $rule_set;
310
+ }
311
+
312
+ public function executeRules() {
313
+ if (!$this->canExecuteRules()) {
314
+ return;
315
+ }
316
+
317
+ $rule_set = $this->ruleSetToExecute();
318
+ $this->evaluateRules($rule_set);
319
+ }
320
+
321
  public function matchCount($pattern, $subject) {
322
  $count = 0;
323
  if (is_array($subject)) {
446
  foreach ($ruleSet as $rule) {
447
  $id = $rule["id"];
448
  $ruleLogic = $rule["rule_logic"];
449
+ $this->ruleActions[$id] = $rule["actions"];
 
450
  $this->ruleEvaluator->resetErrors();
451
 
452
+ if ($this->ruleEvaluator->evaluateRule($ruleLogic) && empty($this->ruleEvaluator->getErrors())) {
453
+ $this->handleMatchedRule($id);
454
+ } elseif (!empty($this->ruleEvaluator->getErrors())) {
455
+ $this->request->updateRulesInfo("errors", (string) $id, $this->ruleEvaluator->getErrors());
 
 
 
456
  }
457
+
458
  if ($this->break_rule_evaluation) {
459
  return;
460
  }
461
  }
462
  }
463
 
464
+ function handleMatchedRule($id) {
465
+ $this->request->updateMatchedRules($id);
466
+ $this->executeActions($id);
467
+ }
468
+
469
+ function executeActions($id){
470
+ foreach($this->ruleActions[$id] as $action) {
471
  switch ($action["type"]) {
472
  case "ALLOW":
473
  $this->break_rule_evaluation = true;
474
  $this->request->setCategory(BVWPRequest::RULE_ALLOWED);
475
  return;
476
  case "BLOCK":
477
+ if ($this->config->isProtecting()) {
478
+ $this->terminateRequest(BVWPRequest::RULE_BLOCKED);
479
+ }
480
  return;
481
  case "INSPECT":
482
  $this->inspectRequest();
483
  break;
 
 
 
 
 
 
 
 
 
484
  }
485
  }
486
  }
487
 
488
+ function isWPLoaded() {
489
+ return defined('BVWPLOADED');
490
+ }
491
+
492
+ function getCurrentWPUser() {
493
+ if (!$this->isWPLoaded()) {
494
+ return;
495
+ }
496
+ if (!function_exists('wp_get_current_user')) {
497
+ @include_once(ABSPATH . "wp-includes/pluggable.php");
498
+ }
499
+ return wp_get_current_user();
500
+ }
501
+
502
  public function inspectRequest() {
503
  $this->request->updateRulesInfo('inspect', "headers", $this->request->getHeaders());
504
+
505
+ $wp_user = $this->getCurrentWPUser();
506
+ if ($wp_user && isset($wp_user->ID)) {
507
+ $this->request->updateRulesInfo('inspect', "userID", $wp_user->ID);
508
+ }
509
+
510
  $this->request->updateRulesInfo('inspect', "getParams", $this->request->getGetParams());
511
  $this->request->updateRulesInfo('inspect', "postParams", $this->getPostParamsToLog($this->request->getPostParams()));
512
  $this->request->updateRulesInfo('inspect', "cookies", $this->request->getCookies());
protect/fw/request.php CHANGED
@@ -36,6 +36,7 @@ class BVWPRequest {
36
  const USER_BLACKLISTED = 50;
37
  const RULE_BLOCKED = 60;
38
  const RULE_ALLOWED = 70;
 
39
 
40
  public function __construct($ip) {
41
  $fileNames = array();
@@ -180,6 +181,10 @@ class BVWPRequest {
180
  return $this->matchedRules;
181
  }
182
 
 
 
 
 
183
  public function updateReqInfo($info) {
184
  if (is_array($info)) {
185
  $this->reqInfo = $this->reqInfo + $info;
36
  const USER_BLACKLISTED = 50;
37
  const RULE_BLOCKED = 60;
38
  const RULE_ALLOWED = 70;
39
+ const PRIVATEIP = 80;
40
 
41
  public function __construct($ip) {
42
  $fileNames = array();
181
  return $this->matchedRules;
182
  }
183
 
184
+ public function hasMatchedRules() {
185
+ return !empty($this->matchedRules);
186
+ }
187
+
188
  public function updateReqInfo($info) {
189
  if (is_array($info)) {
190
  $this->reqInfo = $this->reqInfo + $info;
protect/fw/rule_evaluator.php CHANGED
@@ -6,10 +6,11 @@ if (!class_exists('BVFWRuleEvaluator')) :
6
  class BVFWRuleEvaluator {
7
  private $request;
8
 
9
- const VERSION = 0.2;
10
 
11
- public function __construct($request) {
12
- $this->request = $request;
 
13
  }
14
 
15
  function getErrors() {
@@ -310,9 +311,8 @@ class BVFWRuleEvaluator {
310
  function evaluateExpression($expr) {
311
  switch ($expr["type"]) {
312
  case "AND" :
313
- $loperand = $this->getValue($expr["left_operand"]);
314
- $roperand = $this->getValue($expr["right_operand"]);
315
- return ($loperand && $roperand);
316
  case "OR" :
317
  $loperand = $this->getValue($expr["left_operand"]);
318
  $roperand = $this->getValue($expr["right_operand"]);
@@ -343,6 +343,111 @@ class BVFWRuleEvaluator {
343
  return $_args;
344
  }
345
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
346
  function executeFunctionCall($func) {
347
  $name = $func["name"];
348
  $handler = array($this, $name);
@@ -367,6 +472,18 @@ class BVFWRuleEvaluator {
367
  return $this->fetchConstantValue($expr["value"]);
368
  case "FUNCTION" :
369
  return $this->executeFunctionCall($expr);
 
 
 
 
 
 
 
 
 
 
 
 
370
  default :
371
  return $this->evaluateExpression($expr);
372
  }
6
  class BVFWRuleEvaluator {
7
  private $request;
8
 
9
+ const VERSION = 0.3;
10
 
11
+ public function __construct($fw) {
12
+ $this->fw = $fw;
13
+ $this->request = $fw->request;
14
  }
15
 
16
  function getErrors() {
311
  function evaluateExpression($expr) {
312
  switch ($expr["type"]) {
313
  case "AND" :
314
+ return ($this->getValue($expr["left_operand"]) &&
315
+ $this->getValue($expr["right_operand"]));
 
316
  case "OR" :
317
  $loperand = $this->getValue($expr["left_operand"]);
318
  $roperand = $this->getValue($expr["right_operand"]);
343
  return $_args;
344
  }
345
 
346
+ function loadPluggable() {
347
+ if (!function_exists('wp_get_current_user')) {
348
+ @include_once(ABSPATH . "wp-includes/pluggable.php");
349
+ }
350
+ }
351
+
352
+ function addWPAction($hook_name, $func_name, $priority, $accepted_args, $config) {
353
+ $this->loadPluggable();
354
+ add_action($hook_name, array($this, $func_name), $priority, $accepted_args);
355
+ $this->setVariable($hook_name, $config);
356
+ return false;
357
+ }
358
+
359
+ function addWPFilter($hook_name, $func_name, $priority, $accepted_args, $config) {
360
+ $this->loadPluggable();
361
+ add_filter($hook_name, array($this, $func_name), $priority, $accepted_args);
362
+ $this->setVariable($hook_name, $config);
363
+ return false;
364
+ }
365
+
366
+ function setVariable($name, $value) {
367
+ $this->{$name} = $value;
368
+ }
369
+
370
+ function getVariable($name) {
371
+ return $this->{$name};
372
+ }
373
+
374
+ function preInsertUpdatePost($maybe_empty, $postarr) {
375
+ $curr_hook = current_filter();
376
+ $config = $this->getVariable($curr_hook);
377
+ $posts_to_consider = $config["posts_to_consider"];
378
+ $rule_id = $config["rule_id"];
379
+ if (in_array($postarr['post_type'], $posts_to_consider)) {
380
+ if ((!empty($postarr['ID']) && !current_user_can("edit_{$postarr['post_type']}", $postarr['ID']))
381
+ || !current_user_can("edit_posts")) {
382
+ $log_data = array($postarr['post_type'], $postarr['ID']);
383
+ $this->request->updateRulesInfo("wp_hook_info", $curr_hook, $log_data);
384
+ $this->fw->handleMatchedRule($rule_id);
385
+ }
386
+ }
387
+ return false;
388
+ }
389
+
390
+ function preDeletePost($delete, $post) {
391
+ $curr_hook = current_filter();
392
+ $config = $this->getVariable($curr_hook);
393
+ $posts_to_consider = $config["posts_to_consider"];
394
+ $rule_id = $config["rule_id"];
395
+ if (isset($post->post_type) && in_array($post->post_type, $posts_to_consider) &&
396
+ !current_user_can("delete_{$post->post_type}", $post->ID)) {
397
+ $log_data = array($post->post_type, $post->ID);
398
+ $this->request->updateRulesInfo("wp_hook_info", $curr_hook, $log_data);
399
+ $this->fw->handleMatchedRule($rule_id);
400
+ }
401
+ }
402
+
403
+ function preUserCreation($user_login) {
404
+ $curr_hook = current_filter();
405
+ $config = $this->getVariable($curr_hook);
406
+ $rule_id = $config["rule_id"];
407
+ if (!username_exists($user_login) && !current_user_can('create_users')) {
408
+ $this->request->updateRulesInfo("wp_hook_info", $curr_hook, $user_login);
409
+ $this->fw->handleMatchedRule($rule_id);
410
+ }
411
+ return $user_login;
412
+ }
413
+
414
+ function preDeleteUser($id, $reassign, $user) {
415
+ $curr_hook = current_filter();
416
+ $config = $this->getVariable($curr_hook);
417
+ $rule_id = $config["rule_id"];
418
+ if (!current_user_can('delete_users')) {
419
+ $log_data = array($id, $reassign, array("ID" => $user->ID,
420
+ "username" => $user->user_login,
421
+ "user_email" => $user->user_email,
422
+ "caps" => $user->allcaps,
423
+ "roles" => $user->roles));
424
+ $this->request->updateRulesInfo("wp_hook_info", $curr_hook, $log_data);
425
+ $this->fw->handleMatchedRule($rule_id);
426
+ }
427
+ }
428
+
429
+ function handleOption($option, $log_data) {
430
+ $curr_hook = current_filter();
431
+ $config = $this->getVariable($curr_hook);
432
+ $options_to_consider = $config["options_to_consider"];
433
+ $rule_id = $config["rule_id"];
434
+ if (in_array($option, $options_to_consider) && !current_user_can('manage_options')) {
435
+ $this->request->updateRulesInfo("wp_hook_info", $curr_hook, $log_data);
436
+ $this->fw->handleMatchedRule($rule_id);
437
+ }
438
+ }
439
+
440
+ function preUpdateOption($value, $option, $old_value) {
441
+ $log_data = array($value, $option, $old_value);
442
+ $this->handleOption($option, $log_data);
443
+ return $value;
444
+ }
445
+
446
+ function preDeleteOption($option) {
447
+ $this->handleOption($option, $option);
448
+ return $option;
449
+ }
450
+
451
  function executeFunctionCall($func) {
452
  $name = $func["name"];
453
  $handler = array($this, $name);
472
  return $this->fetchConstantValue($expr["value"]);
473
  case "FUNCTION" :
474
  return $this->executeFunctionCall($expr);
475
+ case "ARRAY" :
476
+ $arr = array();
477
+ foreach ($expr["value"] as $element) {
478
+ $arr[] = $this->getValue($element);
479
+ }
480
+ return $arr;
481
+ case "HASH" :
482
+ $hash = array();
483
+ foreach($expr["value"] as $key => $value) {
484
+ $hash[strval($key)] = $value;
485
+ }
486
+ return $hash;
487
  default :
488
  return $this->evaluateExpression($expr);
489
  }
protect/prepend/protect.php CHANGED
@@ -58,7 +58,7 @@ require_once dirname( __FILE__ ) . '/logger.php';
58
  $fwlogger = new BVPrependLogger();
59
 
60
  $fwConfHash = array_key_exists('fw', $mcConf) ? $mcConf['fw'] : array();
61
- $fw = new BVFW($fwlogger, $fwConfHash, $ip, $bvinfo, $bvipstore, $mcRuleSet);
62
 
63
  if ($fw->isActive()) {
64
 
@@ -69,7 +69,8 @@ require_once dirname( __FILE__ ) . '/logger.php';
69
  register_shutdown_function(array($fw, 'log'));
70
 
71
  $fw->execute();
72
- define('MCFWLOADED', true);
 
73
  }
74
 
75
  return true;
58
  $fwlogger = new BVPrependLogger();
59
 
60
  $fwConfHash = array_key_exists('fw', $mcConf) ? $mcConf['fw'] : array();
61
+ $fw = BVFW::getInstance($fwlogger, $fwConfHash, $ip, $bvinfo, $bvipstore, $mcRuleSet);
62
 
63
  if ($fw->isActive()) {
64
 
69
  register_shutdown_function(array($fw, 'log'));
70
 
71
  $fw->execute();
72
+ $fw->executeRules();
73
+ define('MCWAFLOADED', true);
74
  }
75
 
76
  return true;
protect/wp/ipstore.php CHANGED
@@ -27,55 +27,6 @@ if (!class_exists('BVIPStore')) :
27
  $this->db->dropBVTable(BVIPStore::$name);
28
  }
29
 
30
- public function hasIPv6Support() {
31
- return defined('AF_INET6');
32
- }
33
-
34
- public static function isValidIP($ip) {
35
- return filter_var($ip, FILTER_VALIDATE_IP) !== false;
36
- }
37
-
38
- public function bvInetPton($ip) {
39
- $pton = $this->isValidIP($ip) ? ($this->hasIPv6Support() ? inet_pton($ip) : $this->_bvInetPton($ip)) : false;
40
- return $pton;
41
- }
42
-
43
- public function _bvInetPton($ip) {
44
- if (preg_match('/^(?:\d{1,3}(?:\.|$)){4}/', $ip)) {
45
- $octets = explode('.', $ip);
46
- $bin = chr($octets[0]) . chr($octets[1]) . chr($octets[2]) . chr($octets[3]);
47
- return $bin;
48
- }
49
-
50
- if (preg_match('/^((?:[\da-f]{1,4}(?::|)){0,8})(::)?((?:[\da-f]{1,4}(?::|)){0,8})$/i', $ip)) {
51
- if ($ip === '::') {
52
- return "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
53
- }
54
- $colon_count = substr_count($ip, ':');
55
- $dbl_colon_pos = strpos($ip, '::');
56
- if ($dbl_colon_pos !== false) {
57
- $ip = str_replace('::', str_repeat(':0000',
58
- (($dbl_colon_pos === 0 || $dbl_colon_pos === strlen($ip) - 2) ? 9 : 8) - $colon_count) . ':', $ip);
59
- $ip = trim($ip, ':');
60
- }
61
-
62
- $ip_groups = explode(':', $ip);
63
- $ipv6_bin = '';
64
- foreach ($ip_groups as $ip_group) {
65
- $ipv6_bin .= pack('H*', str_pad($ip_group, 4, '0', STR_PAD_LEFT));
66
- }
67
-
68
- return strlen($ipv6_bin) === 16 ? $ipv6_bin : false;
69
- }
70
-
71
- if (preg_match('/^(?:\:(?:\:0{1,4}){0,4}\:|(?:0{1,4}\:){5})ffff\:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i', $ip, $matches)) {
72
- $octets = explode('.', $matches[1]);
73
- return chr($octets[0]) . chr($octets[1]) . chr($octets[2]) . chr($octets[3]);
74
- }
75
-
76
- return false;
77
- }
78
-
79
  public function isLPIPBlacklisted($ip) {
80
  return $this->checkIPPresent($ip, BVIPStore::BLACKLISTED, BVIPStore::LP);
81
  }
@@ -97,7 +48,7 @@ if (!class_exists('BVIPStore')) :
97
  $db = $this->db;
98
  $table = $db->getBVTable(BVIPStore::$name);
99
  if ($db->isTablePresent($table)) {
100
- $binIP = $this->bvInetPton($ip);
101
  if ($binIP !== false) {
102
  $category_str = ($category == BVIPStore::FW) ? "`is_fw` = true" : "`is_lp` = true";
103
  $query_str = "SELECT * FROM $table WHERE %s >= `start_ip_range` && %s <= `end_ip_range` && " . $category_str . " && `type` = %d LIMIT 1;";
27
  $this->db->dropBVTable(BVIPStore::$name);
28
  }
29
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  public function isLPIPBlacklisted($ip) {
31
  return $this->checkIPPresent($ip, BVIPStore::BLACKLISTED, BVIPStore::LP);
32
  }
48
  $db = $this->db;
49
  $table = $db->getBVTable(BVIPStore::$name);
50
  if ($db->isTablePresent($table)) {
51
+ $binIP = BVProtectBase::bvInetPton($ip);
52
  if ($binIP !== false) {
53
  $category_str = ($category == BVIPStore::FW) ? "`is_fw` = true" : "`is_lp` = true";
54
  $query_str = "SELECT * FROM $table WHERE %s >= `start_ip_range` && %s <= `end_ip_range` && " . $category_str . " && `type` = %d LIMIT 1;";
protect/wp/lp/lp.php CHANGED
@@ -31,6 +31,7 @@ class BVWPLP {
31
  const BLACKLISTED = 5;
32
  const BYPASSED = 6;
33
  const ALLOWED = 7;
 
34
 
35
  public function __construct($db, $settings, $ip, $ipstore, $confHash) {
36
  $this->db = $db;
@@ -199,6 +200,8 @@ class BVWPLP {
199
  $failed_attempts = $this->getLoginCount(BVWPLP::LOGINFAILURE, $this->ip, $this->getFailedLoginGap());
200
  if ($this->isWhitelistedIP()) {
201
  $this->setCategory(BVWPLP::BYPASSED);
 
 
202
  } else if ($this->isBlacklistedIP()) {
203
  $this->setCategory(BVWPLP::BLACKLISTED);
204
  $this->terminateLogin();
31
  const BLACKLISTED = 5;
32
  const BYPASSED = 6;
33
  const ALLOWED = 7;
34
+ const PRIVATEIP = 8;
35
 
36
  public function __construct($db, $settings, $ip, $ipstore, $confHash) {
37
  $this->db = $db;
200
  $failed_attempts = $this->getLoginCount(BVWPLP::LOGINFAILURE, $this->ip, $this->getFailedLoginGap());
201
  if ($this->isWhitelistedIP()) {
202
  $this->setCategory(BVWPLP::BYPASSED);
203
+ } else if (BVProtectBase::isPrivateIP($this->ip)) {
204
+ $this->setCategory(BVWPLP::PRIVATEIP);
205
  } else if ($this->isBlacklistedIP()) {
206
  $this->setCategory(BVWPLP::BLACKLISTED);
207
  $this->terminateLogin();
protect/wp/protect.php CHANGED
@@ -28,7 +28,7 @@ class BVProtect {
28
  $bvipstore = new BVIPStore($this->db);
29
  $bvipstore->init();
30
  $bvinfo = new MCInfo($this->settings);
31
-
32
  $config = $this->settings->getOption($bvinfo->services_option_name);
33
  if (array_key_exists('protect', $config)) {
34
  $config = $config['protect'];
@@ -38,12 +38,12 @@ class BVProtect {
38
 
39
  $ipHeader = array_key_exists('ipheader', $config) ? $config['ipheader'] : false;
40
  $ip = BVProtectBase::getIP($ipHeader);
41
-
42
  $fwLogger = new BVLogger($this->db, BVFWConfig::$requests_table);
43
 
44
  $fwConfHash = array_key_exists('fw', $config) ? $config['fw'] : array();
45
  $ruleSet = $this->getRuleSet();
46
- $fw = new BVFW($fwLogger, $fwConfHash, $ip, $bvinfo, $bvipstore, $ruleSet);
47
 
48
  if ($fw->isActive()) {
49
 
@@ -51,15 +51,18 @@ class BVProtect {
51
  add_action('init', array($fw, 'setBypassCookie'));
52
  }
53
 
54
- if (!defined('MCFWLOADED') && $fw->canSetIPCookie()) {
55
  $fw->setIPCookie();
56
  }
57
 
58
- if (!defined('MCFWLOADED')) {
 
 
59
  register_shutdown_function(array($fw, 'log'));
60
 
61
  $fw->execute();
62
  }
 
63
  }
64
 
65
  $lpConfHash = array_key_exists('lp', $config) ? $config['lp'] : array();
28
  $bvipstore = new BVIPStore($this->db);
29
  $bvipstore->init();
30
  $bvinfo = new MCInfo($this->settings);
31
+
32
  $config = $this->settings->getOption($bvinfo->services_option_name);
33
  if (array_key_exists('protect', $config)) {
34
  $config = $config['protect'];
38
 
39
  $ipHeader = array_key_exists('ipheader', $config) ? $config['ipheader'] : false;
40
  $ip = BVProtectBase::getIP($ipHeader);
41
+
42
  $fwLogger = new BVLogger($this->db, BVFWConfig::$requests_table);
43
 
44
  $fwConfHash = array_key_exists('fw', $config) ? $config['fw'] : array();
45
  $ruleSet = $this->getRuleSet();
46
+ $fw = BVFW::getInstance($fwLogger, $fwConfHash, $ip, $bvinfo, $bvipstore, $ruleSet);
47
 
48
  if ($fw->isActive()) {
49
 
51
  add_action('init', array($fw, 'setBypassCookie'));
52
  }
53
 
54
+ if (!defined('MCWAFLOADED') && $fw->canSetIPCookie()) {
55
  $fw->setIPCookie();
56
  }
57
 
58
+ define('BVWPLOADED', true);
59
+
60
+ if (!defined('MCWAFLOADED')) {
61
  register_shutdown_function(array($fw, 'log'));
62
 
63
  $fw->execute();
64
  }
65
+ $fw->executeRules();
66
  }
67
 
68
  $lpConfHash = array_key_exists('lp', $config) ? $config['lp'] : array();
readme.txt CHANGED
@@ -6,7 +6,7 @@ Donate link: https://www.malcare.com
6
  Requires at least: 4.0
7
  Tested up to: 5.9
8
  Requires PHP: 5.4.0
9
- Stable tag: 4.76
10
  License: GPLv2 or later
11
  License URI: [http://www.gnu.org/licenses/gpl-2.0.html](http://www.gnu.org/licenses/gpl-2.0.html)
12
 
@@ -392,6 +392,12 @@ These are available on our website: [Terms of Service](https://www.malcare.com/t
392
  8. MalCare’s Uptime Monitoring notifies if a website goes down so that you can handle the situation before starting to lose visitors.
393
 
394
  == CHANGELOG ==
 
 
 
 
 
 
395
  = 4.76 =
396
  * Improvements in fetching file stats
397
 
6
  Requires at least: 4.0
7
  Tested up to: 5.9
8
  Requires PHP: 5.4.0
9
+ Stable tag: 4.77
10
  License: GPLv2 or later
11
  License URI: [http://www.gnu.org/licenses/gpl-2.0.html](http://www.gnu.org/licenses/gpl-2.0.html)
12
 
392
  8. MalCare’s Uptime Monitoring notifies if a website goes down so that you can handle the situation before starting to lose visitors.
393
 
394
  == CHANGELOG ==
395
+ = 4.77 =
396
+ * Improved the landing pages.
397
+ * Enhanced future vulnerability protection
398
+ * IP Blocking Improvements
399
+ * Improved firewall configuration for migrations
400
+
401
  = 4.76 =
402
  * Improvements in fetching file stats
403
 
wp_admin.php CHANGED
@@ -67,6 +67,7 @@ class MCWPAdmin {
67
  }
68
  if ($this->bvinfo->isActivateRedirectSet()) {
69
  $this->settings->updateOption($this->bvinfo->plug_redirect, 'no');
 
70
  wp_redirect($this->mainUrl());
71
  }
72
  }
@@ -74,27 +75,8 @@ class MCWPAdmin {
74
  public function mcsecAdminMenu($hook) {
75
  if ($hook === 'toplevel_page_malcare' || preg_match("/bv_add_account$/", $hook) || preg_match("/bv_account_details$/", $hook)) {
76
  wp_enqueue_style( 'mcsurface', plugins_url('css/bvmui.min.css', __FILE__));
77
- wp_enqueue_style( 'bvnew', plugins_url('css/bvnew.min.css', __FILE__));
78
- }
79
- }
80
-
81
- public function enqueueBootstrapCSS() {
82
- wp_enqueue_style( 'bootstrap', plugins_url('css/bootstrap.min.css', __FILE__));
83
- }
84
-
85
- public function showErrors() {
86
- $error = NULL;
87
- if (isset($_REQUEST['error'])) {
88
- $error = $_REQUEST['error'];
89
- $open_tag = '<div style="padding-bottom:0.5px;color:#ffaa0d;text-align:center"><p style="font-size:16px;">';
90
- $close_tag = '</p></div>';
91
- if ($error == "email") {
92
- echo $open_tag.'Please enter email in the correct format.'.$close_tag;
93
- }
94
- else if (($error == "custom") && isset($_REQUEST['bvnonce']) && wp_verify_nonce($_REQUEST['bvnonce'], "bvnonce")
95
- && isset($_REQUEST['message'])) {
96
- echo $open_tag.nl2br(esc_html(base64_decode($_REQUEST['message']))).$close_tag;
97
- }
98
  }
99
  }
100
 
@@ -104,7 +86,8 @@ class MCWPAdmin {
104
  add_submenu_page(null, 'Malcare', 'Malcare', 'manage_options', 'bv_account_details',
105
  array($this, 'showAccountDetailsPage'));
106
 
107
- if (!$this->bvinfo->canSetCWBranding()) {
 
108
  $bname = $this->bvinfo->getBrandName();
109
  $icon = $this->bvinfo->getBrandIcon();
110
 
@@ -157,8 +140,8 @@ class MCWPAdmin {
157
  public function siteInfoTags() {
158
  require_once dirname( __FILE__ ) . '/recover.php';
159
  $bvnonce = wp_create_nonce("bvnonce");
160
- $secret = MCRecover::defaultSecret($this->settings);
161
  $public = MCAccount::getApiPublicKey($this->settings);
 
162
  $tags = "<input type='hidden' name='url' value='".$this->siteinfo->wpurl()."'/>\n".
163
  "<input type='hidden' name='homeurl' value='".$this->siteinfo->homeurl()."'/>\n".
164
  "<input type='hidden' name='siteurl' value='".$this->siteinfo->siteurl()."'/>\n".
@@ -187,8 +170,7 @@ class MCWPAdmin {
187
  }
188
 
189
  public function showAddAccountPage() {
190
- $this->enqueueBootstrapCSS();
191
- require_once dirname( __FILE__ ) . "/admin/registration.php";
192
  }
193
 
194
  public function showAccountDetailsPage() {
@@ -227,28 +209,38 @@ class MCWPAdmin {
227
 
228
  if ($this->bvinfo->canSetCWBranding()) {
229
  $brand = $this->cwBrandInfo();
230
- if (array_key_exists('name', $brand)) {
231
- $plugins[$slug]['Name'] = $brand['name'];
232
- }
233
- if (array_key_exists('title', $brand)) {
234
- $plugins[$slug]['Title'] = $brand['title'];
235
- }
236
- if (array_key_exists('description', $brand)) {
237
- $plugins[$slug]['Description'] = $brand['description'];
238
- }
239
- if (array_key_exists('authoruri', $brand)) {
240
- $plugins[$slug]['AuthorURI'] = $brand['authoruri'];
241
- }
242
- if (array_key_exists('author', $brand)) {
243
- $plugins[$slug]['Author'] = $brand['author'];
244
- }
245
- if (array_key_exists('authorname', $brand)) {
246
- $plugins[$slug]['AuthorName'] = $brand['authorname'];
247
- }
248
- if (array_key_exists('pluginuri', $brand)) {
249
- $plugins[$slug]['PluginURI'] = $brand['pluginuri'];
 
 
 
 
 
 
 
 
 
250
  }
251
  }
 
252
  return $plugins;
253
  }
254
  }
67
  }
68
  if ($this->bvinfo->isActivateRedirectSet()) {
69
  $this->settings->updateOption($this->bvinfo->plug_redirect, 'no');
70
+ ##ACTIVATEREDIRECTCODE##
71
  wp_redirect($this->mainUrl());
72
  }
73
  }
75
  public function mcsecAdminMenu($hook) {
76
  if ($hook === 'toplevel_page_malcare' || preg_match("/bv_add_account$/", $hook) || preg_match("/bv_account_details$/", $hook)) {
77
  wp_enqueue_style( 'mcsurface', plugins_url('css/bvmui.min.css', __FILE__));
78
+ wp_enqueue_style( 'bootstrap', plugins_url('css/bootstrap.min.css', __FILE__));
79
+ wp_enqueue_style( 'bvplugin', plugins_url('css/bvplugin.min.css', __FILE__));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
  }
81
  }
82
 
86
  add_submenu_page(null, 'Malcare', 'Malcare', 'manage_options', 'bv_account_details',
87
  array($this, 'showAccountDetailsPage'));
88
 
89
+ $brand = $this->bvinfo->getBrandInfo();
90
+ if (!$this->bvinfo->canSetCWBranding() && (!$brand || (!array_key_exists('hide', $brand) && !array_key_exists('hide_from_menu', $brand)))) {
91
  $bname = $this->bvinfo->getBrandName();
92
  $icon = $this->bvinfo->getBrandIcon();
93
 
140
  public function siteInfoTags() {
141
  require_once dirname( __FILE__ ) . '/recover.php';
142
  $bvnonce = wp_create_nonce("bvnonce");
 
143
  $public = MCAccount::getApiPublicKey($this->settings);
144
+ $secret = MCRecover::defaultSecret($this->settings);
145
  $tags = "<input type='hidden' name='url' value='".$this->siteinfo->wpurl()."'/>\n".
146
  "<input type='hidden' name='homeurl' value='".$this->siteinfo->homeurl()."'/>\n".
147
  "<input type='hidden' name='siteurl' value='".$this->siteinfo->siteurl()."'/>\n".
170
  }
171
 
172
  public function showAddAccountPage() {
173
+ require_once dirname( __FILE__ ) . "/admin/add_new_account.php";
 
174
  }
175
 
176
  public function showAccountDetailsPage() {
209
 
210
  if ($this->bvinfo->canSetCWBranding()) {
211
  $brand = $this->cwBrandInfo();
212
+ } else {
213
+ $brand = $this->bvinfo->getBrandInfo();
214
+ }
215
+
216
+ if ($brand) {
217
+ if (array_key_exists('hide', $brand)) {
218
+ unset($plugins[$slug]);
219
+ } else {
220
+ if (array_key_exists('name', $brand)) {
221
+ $plugins[$slug]['Name'] = $brand['name'];
222
+ }
223
+ if (array_key_exists('title', $brand)) {
224
+ $plugins[$slug]['Title'] = $brand['title'];
225
+ }
226
+ if (array_key_exists('description', $brand)) {
227
+ $plugins[$slug]['Description'] = $brand['description'];
228
+ }
229
+ if (array_key_exists('authoruri', $brand)) {
230
+ $plugins[$slug]['AuthorURI'] = $brand['authoruri'];
231
+ }
232
+ if (array_key_exists('author', $brand)) {
233
+ $plugins[$slug]['Author'] = $brand['author'];
234
+ }
235
+ if (array_key_exists('authorname', $brand)) {
236
+ $plugins[$slug]['AuthorName'] = $brand['authorname'];
237
+ }
238
+ if (array_key_exists('pluginuri', $brand)) {
239
+ $plugins[$slug]['PluginURI'] = $brand['pluginuri'];
240
+ }
241
  }
242
  }
243
+
244
  return $plugins;
245
  }
246
  }