Hide My WP Ghost – Security Plugin - Version 4.0.10

Version Description

(31 Aug 2020 ) = * Fixed some errors cause by the last version

Download this release

Release Info

Developer johndarrel
Plugin Icon 128x128 Hide My WP Ghost – Security Plugin
Version 4.0.10
Comparing to
See all releases

Version 4.0.10

Files changed (53) hide show
  1. classes/Action.php +116 -0
  2. classes/DisplayController.php +98 -0
  3. classes/Error.php +95 -0
  4. classes/FrontController.php +124 -0
  5. classes/HookController.php +92 -0
  6. classes/ObjController.php +159 -0
  7. classes/Tools.php +1243 -0
  8. config.json +82 -0
  9. config/config.php +38 -0
  10. config/paths.php +24 -0
  11. controllers/Brute.php +281 -0
  12. controllers/Menu.php +248 -0
  13. controllers/Notice.php +174 -0
  14. controllers/Plugins.php +83 -0
  15. controllers/Rewrite.php +318 -0
  16. controllers/SecurityCheck.php +1446 -0
  17. controllers/Settings.php +603 -0
  18. controllers/Widget.php +43 -0
  19. debug/index.php +238 -0
  20. index.php +83 -0
  21. languages/hide-my-wp-en_US.mo +0 -0
  22. languages/hide-my-wp-en_US.po +2846 -0
  23. languages/hide-my-wp-es_ES.mo +0 -0
  24. languages/hide-my-wp-es_ES.po +3580 -0
  25. languages/hide-my-wp-ro_RO.mo +0 -0
  26. languages/hide-my-wp-ro_RO.po +3416 -0
  27. models/Brute.php +477 -0
  28. models/Compatibility.php +470 -0
  29. models/Cookies.php +185 -0
  30. models/Files.php +400 -0
  31. models/Menu.php +130 -0
  32. models/Rewrite.php +2070 -0
  33. models/Rules.php +263 -0
  34. models/Settings.php +347 -0
  35. models/Woocommerce.php +20 -0
  36. readme.txt +745 -0
  37. uninstall.php +15 -0
  38. view/Advanced.php +245 -0
  39. view/Backup.php +65 -0
  40. view/Brute.php +160 -0
  41. view/Connect.php +91 -0
  42. view/Dashboard.php +133 -0
  43. view/FrontendCheck.php +63 -0
  44. view/Log.php +93 -0
  45. view/Mapping.php +257 -0
  46. view/Notices.php +2 -0
  47. view/Permalinks.php +611 -0
  48. view/Plugins.php +44 -0
  49. view/SecurityCheck.php +142 -0
  50. view/Support.php +14 -0
  51. view/Tweaks.php +213 -0
  52. view/css/alert.css +72 -0
  53. view/css/bootstrap.min.css +1 -0
classes/Action.php ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') || die('Cheatin\' uh?');
3
+
4
+ /**
5
+ * Set the ajax action and call for wordpress
6
+ */
7
+ class HMW_Classes_Action extends HMW_Classes_FrontController {
8
+
9
+ /** @var array with all form and ajax actions */
10
+ var $actions = array();
11
+
12
+ /** @var array from core config */
13
+ private static $config;
14
+
15
+
16
+ /**
17
+ * The hookAjax is loaded as custom hook in hookController class
18
+ *
19
+ * @return void
20
+ */
21
+ public function hookInit() {
22
+ if (HMW_Classes_Tools::isAjax()) {
23
+ $this->getActions(true);
24
+ }
25
+ }
26
+
27
+ function hookFrontinit() {
28
+ /* Only if post */
29
+ if (HMW_Classes_Tools::isAjax()) {
30
+ $this->getActions();
31
+ }
32
+ }
33
+
34
+ /**
35
+ * The hookSubmit is loaded when action si posted
36
+ *
37
+ * @return void
38
+ */
39
+ function hookMenu() {
40
+ /* Only if post */
41
+ if (!HMW_Classes_Tools::isAjax()) {
42
+ $this->getActions();
43
+ }
44
+ }
45
+
46
+ function hookMultisiteMenu() {
47
+ /* Only if post */
48
+ if (!HMW_Classes_Tools::isAjax()) {
49
+ $this->getActions();
50
+ }
51
+ }
52
+
53
+
54
+ /**
55
+ * Get all actions from config.json in core directory and add them in the WP
56
+ *
57
+ * @param boolean $ajax
58
+ * @return void
59
+ */
60
+ public function getActions($ajax = false) {
61
+ $this->actions = array();
62
+ $action = HMW_Classes_Tools::getValue('action');
63
+ $nonce = HMW_Classes_Tools::getValue('hmw_nonce');
64
+
65
+ if ($action == '' || $nonce == '') {
66
+ return;
67
+ }
68
+
69
+ /* if config allready in cache */
70
+ if (!isset(self::$config)) {
71
+ $config_file = _HMW_ROOT_DIR_ . '/config.json';
72
+ if (!file_exists($config_file))
73
+ return;
74
+
75
+ /* load configuration blocks data from core config files */
76
+ self::$config = json_decode(file_get_contents($config_file), 1);
77
+ }
78
+
79
+ if (is_array(self::$config))
80
+ foreach (self::$config['blocks']['block'] as $block) {
81
+ if (isset($block['active']) && $block['active'] == 1)
82
+ if (isset($block['admin']) &&
83
+ (($block['admin'] == 1 && (is_admin() || is_network_admin())) ||
84
+ $block['admin'] == 0)
85
+ ) {
86
+ /* if there is a single action */
87
+ if (isset($block['actions']['action']))
88
+
89
+ /* if there are more actions for the current block */
90
+ if (!is_array($block['actions']['action'])) {
91
+ /* add the action in the actions array */
92
+ if ($block['actions']['action'] == $action)
93
+ $this->actions[] = array('class' => $block['name']);
94
+ } else {
95
+ /* if there are more actions for the current block */
96
+ foreach ($block['actions']['action'] as $value) {
97
+ /* add the actions in the actions array */
98
+ if ($value == $action)
99
+ $this->actions[] = array('class' => $block['name']);
100
+ }
101
+ }
102
+ }
103
+ }
104
+
105
+ if ($ajax) {
106
+ check_ajax_referer(_HMW_NONCE_ID_, 'hmw_nonce');
107
+ } else {
108
+ check_admin_referer($action, 'hmw_nonce');
109
+ }
110
+ /* add the actions in WP */
111
+ foreach ($this->actions as $actions) {
112
+ HMW_Classes_ObjController::getClass($actions['class'])->action();
113
+ }
114
+ }
115
+
116
+ }
classes/DisplayController.php ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') || die('Cheatin\' uh?');
3
+
4
+ /**
5
+ * The class handles the theme part in WP
6
+ */
7
+ class HMW_Classes_DisplayController {
8
+
9
+ private static $cache;
10
+
11
+ /**
12
+ * echo the css link from theme css directory
13
+ *
14
+ * @param string $uri The name of the css file or the entire uri path of the css file
15
+ * @param string $media
16
+ *
17
+ * @return void
18
+ */
19
+ public static function loadMedia($uri = '', $media = 'all') {
20
+ $css_uri = '';
21
+ $js_uri = '';
22
+
23
+ if (HMW_Classes_Tools::isAjax()) {
24
+ return;
25
+ }
26
+
27
+ if (isset(self::$cache[$uri]))
28
+ return;
29
+
30
+ self::$cache[$uri] = true;
31
+
32
+ /* if is a custom css file */
33
+ if (strpos($uri, '//') === false) {
34
+ $name = strtolower($uri);
35
+ if (file_exists(_HMW_THEME_DIR_ . 'css/' . $name . '.css')) {
36
+ $css_uri = _HMW_THEME_URL_ . 'css/' . $name . '.css?ver=' . HMW_VERSION_ID;
37
+ }
38
+ if (file_exists(_HMW_THEME_DIR_ . 'css/' . $name . '.scss')) {
39
+ $css_uri = _HMW_THEME_URL_ . 'css/' . $name . '.scss?ver=' . HMW_VERSION_ID;
40
+ }
41
+ if (file_exists(_HMW_THEME_DIR_ . 'js/' . $name . '.js')) {
42
+ $js_uri = _HMW_THEME_URL_ . 'js/' . $name . '.js?ver=' . HMW_VERSION_ID;
43
+ }
44
+ } else {
45
+ $name = strtolower(basename($uri));
46
+ if (strpos($uri, '.css') !== FALSE) {
47
+ $css_uri = $uri;
48
+ } elseif (strpos($uri, '.scss') !== FALSE) {
49
+ $css_uri = $uri;
50
+ } elseif (strpos($uri, '.js') !== FALSE) {
51
+ $js_uri = $uri;
52
+ }
53
+ }
54
+
55
+ if ($css_uri <> '') {
56
+ if (!wp_style_is($name)) {
57
+ if (did_action('wp_print_styles')) {
58
+ echo "<link rel='stylesheet' id='$name-css' href='$css_uri' type='text/css' media='all' />";
59
+ } elseif (is_admin()) { //load CSS for admin or on triggered
60
+ wp_enqueue_style($name, $css_uri, null, HMW_VERSION_ID, $media);
61
+ wp_print_styles(array($name));
62
+ }
63
+ }
64
+ }
65
+
66
+ if ($js_uri <> '') {
67
+ if (!wp_script_is($name)) {
68
+ if (did_action('wp_print_scripts')) {
69
+ echo "<script type='text/javascript' src='$js_uri'></script>";
70
+ } elseif (is_admin()) {
71
+ wp_enqueue_script($name, $js_uri, null, HMW_VERSION_ID, true);
72
+ wp_print_scripts(array($name));
73
+ }
74
+ }
75
+ }
76
+ }
77
+
78
+ /**
79
+ *
80
+ * return the block content from theme directory
81
+ *
82
+ * @param $block
83
+ * @param HMW_Classes_FrontController $view
84
+ * @return null|string
85
+ */
86
+ public function getView($block, $view) {
87
+ $output = null;
88
+
89
+ if (file_exists(_HMW_THEME_DIR_ . $block . '.php')) {
90
+ ob_start();
91
+ include(_HMW_THEME_DIR_ . $block . '.php');
92
+ $output .= ob_get_clean();
93
+ }
94
+
95
+ return $output;
96
+ }
97
+
98
+ }
classes/Error.php ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
3
+
4
+ class HMW_Classes_Error extends HMW_Classes_FrontController {
5
+
6
+ /** @var array */
7
+ private static $errors = array();
8
+
9
+ /**
10
+ * The error controller for StarBox
11
+ */
12
+ function __construct() {
13
+ parent::__construct();
14
+
15
+ /* Verify dependences */
16
+ if (!function_exists('get_class')) {
17
+ self::setError(__('Function get_class does not exist! It\'s required for Hide My WP to work properly.', _HMW_PLUGIN_NAME_));
18
+ }
19
+ if (!function_exists('file_exists')) {
20
+ self::setError(__('Function file_exists does not exist! It\'s required for Hide My WP to work properly.', _HMW_PLUGIN_NAME_));
21
+ }
22
+
23
+ if (!defined('ABSPATH'))
24
+ self::setError(__('The home directory is not set!', _HMW_PLUGIN_NAME_), 'fatal');
25
+
26
+ /* Check the PHP version */
27
+ if (PHP_VERSION_ID < 5100) {
28
+ self::setError(__('The PHP version has to be greater than 5.1', _HMW_PLUGIN_NAME_), 'fatal');
29
+ }
30
+ }
31
+
32
+ /**
33
+ * Show version error
34
+ */
35
+ public function phpVersionError() {
36
+ echo '<div class="update-nag"><span style="color:red; font-weight:bold;">' . __('For Hide My WP to work, the PHP version has to be equal or greater than 5.1', _HMW_PLUGIN_NAME_) . '</span></div>';
37
+ }
38
+
39
+ /**
40
+ * Show the error in wrodpress
41
+ *
42
+ * @param string $error
43
+ * @param string $type
44
+ * @param null $index
45
+ */
46
+ public static function setError($error = '', $type = 'notice', $index = null) {
47
+ if (!isset($index)) {
48
+ $index = count(self::$errors);
49
+ }
50
+
51
+ self::$errors[$index] = array(
52
+ 'type' => $type,
53
+ 'text' => $error);
54
+ }
55
+
56
+ /**
57
+ * This hook will show the error in WP header
58
+ */
59
+ public function hookNotices() {
60
+ HMW_Classes_ObjController::getClass('HMW_Classes_DisplayController')->loadMedia('alert');
61
+
62
+ if (is_array(self::$errors) &&
63
+ ((is_string(HMW_Classes_Tools::getValue('page', '')) && stripos(HMW_Classes_Tools::getValue('page', ''), _HMW_NAMESPACE_) !== false) ||
64
+ (is_string(HMW_Classes_Tools::getValue('plugin', '')) && stripos(HMW_Classes_Tools::getValue('plugin', ''), _HMW_PLUGIN_NAME_) !== false))
65
+ ) {
66
+ foreach (self::$errors as $error) {
67
+
68
+ switch ($error['type']) {
69
+ case 'fatal':
70
+ self::showError(ucfirst(_HMW_PLUGIN_NAME_ . " " . $error['type']) . ': ' . $error['text'], $error['type']);
71
+ die();
72
+ break;
73
+ default:
74
+ self::showError($error['text'], $error['type']);
75
+ }
76
+ }
77
+ }
78
+ self::$errors = array();
79
+ }
80
+
81
+ /**
82
+ * Show the notices to WP
83
+ *
84
+ * @param $message
85
+ * @param string $type
86
+ */
87
+ public static function showError($message, $type = '') {
88
+ if (file_exists(_HMW_THEME_DIR_ . 'Notices.php')) {
89
+ include(_HMW_THEME_DIR_ . 'Notices.php');
90
+ } else {
91
+ echo $message;
92
+ }
93
+ }
94
+
95
+ }
classes/FrontController.php ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
3
+
4
+ /**
5
+ * The main class for controllers
6
+ *
7
+ */
8
+ class HMW_Classes_FrontController {
9
+
10
+ /** @var object of the model class */
11
+ public $model;
12
+
13
+ /** @var object of the view class */
14
+ public $view;
15
+
16
+ /** @var string name of theclass */
17
+ protected $name;
18
+
19
+ public function __construct() {
20
+
21
+ /* Load error class */
22
+ HMW_Classes_ObjController::getClass('HMW_Classes_Error');
23
+
24
+ /* Load Tools */
25
+ HMW_Classes_ObjController::getClass('HMW_Classes_Tools');
26
+
27
+ /* get the name of the current class */
28
+ $this->name = get_class($this);
29
+
30
+ /* load the model and hooks here for wordpress actions to take efect */
31
+ /* create the model and view instances */
32
+ $model_classname = str_replace('Controllers', 'Models', $this->name);
33
+ if(HMW_Classes_ObjController::getClassPath($model_classname)) {
34
+ $this->model = HMW_Classes_ObjController::getClass($model_classname);
35
+ }
36
+
37
+ //IMPORTANT TO LOAD HOOKS HERE
38
+ /* check if there is a hook defined in the controller clients class */
39
+ HMW_Classes_ObjController::getClass('HMW_Classes_HookController')->setHooks($this);
40
+
41
+ /* Load the rewrite */
42
+ HMW_Classes_ObjController::getClass('HMW_Controllers_Rewrite');
43
+
44
+ /* Load the Main classes Actions Handler */
45
+ HMW_Classes_ObjController::getClass('HMW_Classes_Action');
46
+ HMW_Classes_ObjController::getClass('HMW_Classes_DisplayController');
47
+
48
+ }
49
+
50
+ /**
51
+ * load sequence of classes
52
+ * Function called usualy when the controller is loaded in WP
53
+ *
54
+ * @return HMW_Classes_FrontController
55
+ */
56
+ public function init() {
57
+ return $this;
58
+ }
59
+
60
+ /**
61
+ * Get the block view
62
+ *
63
+ * @param mixed $view
64
+ * @param mixed $obj
65
+ * @return string HTML
66
+ */
67
+ public function getView($view = null, $obj = null) {
68
+ if(!isset($obj)){
69
+ $obj = $this;
70
+ }
71
+ if (!isset($view)) {
72
+ if ($class = HMW_Classes_ObjController::getClassPath($this->name)) {
73
+ $view = $class['name'];
74
+ }
75
+ }
76
+
77
+ if (isset($view)) {
78
+ $this->view = HMW_Classes_ObjController::getClass('HMW_Classes_DisplayController');
79
+ return $this->view->getView($view, $obj);
80
+ }
81
+
82
+ return '';
83
+ }
84
+
85
+ /**
86
+ * Called as menu callback to show the block
87
+ *
88
+ */
89
+ public function show() {
90
+ echo $this->init()->getView();
91
+ }
92
+
93
+ /**
94
+ * first function call for any class
95
+ *
96
+ */
97
+ protected function action() {
98
+ // generated nonce we created
99
+ }
100
+
101
+
102
+ /**
103
+ * initialize settings
104
+ * Called from index
105
+ *
106
+ * @return void
107
+ */
108
+ public function hookInit() { }
109
+
110
+
111
+ /**
112
+ * Called on frontend. For disconnected users
113
+ */
114
+ public function hookFrontinit() { }
115
+
116
+ /**
117
+ * Hook the admin head
118
+ * This function will load the media in the header for each class
119
+ *
120
+ * @return void
121
+ */
122
+ public function hookHead() { }
123
+
124
+ }
classes/HookController.php ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
3
+
4
+ /**
5
+ * The class handles the actions in WP
6
+ */
7
+ class HMW_Classes_HookController {
8
+
9
+ /** @var array the WP actions list from admin */
10
+ private $admin_hooks = array();
11
+ private $front_hooks = array();
12
+
13
+ public function __construct() {
14
+ //called in admin
15
+ $this->admin_hooks = array(
16
+ 'init' => 'init',
17
+ 'menu' => 'admin_menu',
18
+ 'multisiteMenu' => 'network_admin_menu',
19
+ 'notices' => 'admin_notices',
20
+ 'footer' => 'admin_footer',
21
+ );
22
+
23
+ //called in frontend
24
+ $this->front_hooks = array(
25
+ // --
26
+ 'frontinit' => 'init',
27
+ );
28
+
29
+ }
30
+
31
+ /**
32
+ * Calls the specified action in WP
33
+ * @param object $instance The parent class instance
34
+ *
35
+ * @return void
36
+ */
37
+ public function setHooks($instance) {
38
+ if (is_admin() || is_network_admin()) {
39
+ $this->setAdminHooks($instance);
40
+ } else {
41
+ $this->setFrontHooks($instance);
42
+ }
43
+ }
44
+
45
+ /**
46
+ * Calls the specified action in WP
47
+ * @param object $instance The parent class instance
48
+ *
49
+ * @return void
50
+ */
51
+ public function setAdminHooks($instance) {
52
+ /* for each admin action check if is defined in class and call it */
53
+ foreach ($this->admin_hooks as $hook => $value) {
54
+
55
+ if (is_callable(array($instance, 'hook' . ucfirst($hook)))) {
56
+ //call the WP add_action function
57
+ add_action($value, array($instance, 'hook' . ucfirst($hook)));
58
+ }
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Calls the specified action in WP
64
+ * @param object $instance The parent class instance
65
+ *
66
+ * @return void
67
+ */
68
+ public function setFrontHooks($instance) {
69
+ /* for each admin action check if is defined in class and call it */
70
+ foreach ($this->front_hooks as $hook => $value) {
71
+ if (is_callable(array($instance, 'hook' . ucfirst($hook)))) {
72
+ //call the WP add_action function
73
+ add_action($value, array($instance, 'hook' . ucfirst($hook)), 11111);
74
+ }
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Calls the specified action in WP
80
+ * @param string $action
81
+ * @param HMW_Classes_FrontController $obj
82
+ * @param array $callback Contains the class name or object and the callback function
83
+ *
84
+ * @return void
85
+ */
86
+ public function setAction($action, $obj, $callback) {
87
+
88
+ /* calls the custom action function from WP */
89
+ add_action($action, array($obj, $callback), 10);
90
+ }
91
+
92
+ }
classes/ObjController.php ADDED
@@ -0,0 +1,159 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') || die('Cheatin\' uh?');
3
+
4
+ /**
5
+ * The class creates object for plugin classes
6
+ */
7
+ class HMW_Classes_ObjController {
8
+
9
+ /** @var array of instances */
10
+ public static $instances;
11
+
12
+ /** @var array from core config */
13
+ public static $config;
14
+
15
+ /**
16
+ * @param $className
17
+ * @param array $args
18
+ * @return bool|mixed
19
+ */
20
+ public static function getClass($className, $args = array()) {
21
+
22
+ if ($class = self::getClassPath($className)) {
23
+ if (!isset(self::$instances[$className])) {
24
+ /* check if class is already defined */
25
+ if (!class_exists($className) || $className == get_class()) {
26
+ try {
27
+ self::includeClass($class['dir'], $class['name']);
28
+
29
+ //check if abstract
30
+ $check = new ReflectionClass($className);
31
+ $abstract = $check->isAbstract();
32
+ if (!$abstract) {
33
+ self::$instances[$className] = new $className();
34
+ if (!empty($args)) {
35
+ call_user_func_array(array(self::$instances[$className], '__construct'), $args);
36
+ }
37
+ return self::$instances[$className];
38
+ } else {
39
+ self::$instances[$className] = true;
40
+ }
41
+ } catch (Exception $e) {
42
+ }
43
+ }
44
+ } else
45
+ return self::$instances[$className];
46
+ }
47
+ return false;
48
+ }
49
+
50
+ /**
51
+ * Clear the class instance
52
+ *
53
+ * @param string $className
54
+ * @param array $args
55
+ *
56
+ * @return mixed
57
+ * @throws Exception
58
+ */
59
+ public static function newInstance( $className, $args = array() ) {
60
+ if ( $class = self::getClassPath( $className ) ) {
61
+ /* check if class is already defined */
62
+ if ( class_exists( $className ) ) {
63
+ //check if abstract
64
+ self::$instances[ $className ] = new $className();
65
+ if ( ! empty( $args ) ) {
66
+ call_user_func_array( array( self::$instances[ $className ], '__construct' ), $args );
67
+ }
68
+
69
+ return self::$instances[ $className ];
70
+ } else {
71
+ return self::getClass( $className, $args );
72
+ }
73
+ }
74
+
75
+ return false;
76
+ }
77
+
78
+ /**
79
+ * Include Class if exists
80
+ * @param $classDir
81
+ * @param $className
82
+ * @throws Exception
83
+ */
84
+ private static function includeClass($classDir, $className) {
85
+ try {
86
+ if (file_exists($classDir . $className . '.php')) {
87
+ include_once($classDir . $className . '.php');
88
+ }
89
+ } catch (Exception $e) {
90
+ throw new Exception('Controller Error: ' . $e->getMessage());
91
+ }
92
+ }
93
+
94
+ /**
95
+ * Get the class domain
96
+ * @param $className
97
+ * @param array $args
98
+ * @return mixed
99
+ * @throws Exception
100
+ */
101
+ public static function getDomain($className, $args = array()) {
102
+ if ($class = self::getClassPath($className)) {
103
+
104
+ /* check if class is already defined */
105
+
106
+ self::includeClass($class['dir'], $class['name']);
107
+ return new $className($args);
108
+ }
109
+
110
+ throw new Exception('Could not create domain: ' . $className);
111
+ }
112
+
113
+
114
+ /**
115
+ * Check if the class is correctly set
116
+ *
117
+ * @param string $className
118
+ * @return boolean
119
+ */
120
+ private static function checkClassPath($className) {
121
+ $path = preg_split('/[_]+/', $className);
122
+ if (is_array($path) && count($path) > 1) {
123
+ if (in_array(_HMW_NAMESPACE_, $path)) {
124
+ return true;
125
+ }
126
+ }
127
+
128
+ return false;
129
+ }
130
+
131
+ /**
132
+ * Get the path of the class and name of the class
133
+ *
134
+ * @param string $className
135
+ * @return array | boolean
136
+ * array(
137
+ * dir - absolute path of the class
138
+ * name - the name of the file
139
+ * }
140
+ */
141
+ public static function getClassPath($className) {
142
+ $dir = '';
143
+
144
+ if (self::checkClassPath($className)) {
145
+ $path = preg_split('/[_]+/', $className);
146
+ for ($i = 1; $i < sizeof($path) - 1; $i++)
147
+ $dir .= strtolower($path[$i]) . '/';
148
+
149
+ $class = array('dir' => _HMW_ROOT_DIR_ . '/' . $dir,
150
+ 'name' => $path[sizeof($path) - 1]);
151
+
152
+ if (file_exists($class['dir'] . $class['name'] . '.php')) {
153
+ return $class;
154
+ }
155
+ }
156
+ return false;
157
+ }
158
+
159
+ }
classes/Tools.php ADDED
@@ -0,0 +1,1243 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
3
+
4
+ /**
5
+ * Handles the parameters and url
6
+ *
7
+ * @author StarBox
8
+ */
9
+ class HMW_Classes_Tools extends HMW_Classes_FrontController {
10
+
11
+ /** @var array Saved options in database */
12
+ public static $init = array(), $default = array(), $lite = array(), $ninja = array();
13
+ public static $options = array();
14
+ public static $debug = array();
15
+ public static $is_multisite;
16
+ public static $active_plugins;
17
+
18
+ /** @var integer Count the errors in site */
19
+ static $errors_count = 0;
20
+
21
+ public function __construct() {
22
+ //Check the max memory usage
23
+ $maxmemory = self::getMaxMemory();
24
+ if ( $maxmemory && $maxmemory < 60 ) {
25
+ if ( defined( 'WP_MAX_MEMORY_LIMIT' ) && (int) WP_MAX_MEMORY_LIMIT > 60 ) {
26
+ @ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', WP_MAX_MEMORY_LIMIT ) );
27
+ $maxmemory = self::getMaxMemory();
28
+ if ( $maxmemory && $maxmemory < 60 ) {
29
+ define( 'HMW_DISABLE', true );
30
+ HMW_Classes_Error::setError( sprintf( __( 'Your memory limit is %sM. You need at least %sM to prevent loading errors in frontend. See: %sIncreasing memory allocated to PHP%s', _HMW_PLUGIN_NAME_ ), $maxmemory, 64, '<a href="https://codex.wordpress.org/Editing_wp-config.php#Increasing_memory_allocated_to_PHP" target="_blank">', '</a>' ) );
31
+ }
32
+ } else {
33
+ define( 'HMW_DISABLE', true );
34
+ HMW_Classes_Error::setError( sprintf( __( 'Your memory limit is %sM. You need at least %sM to prevent loading errors in frontend. See: %sIncreasing memory allocated to PHP%s', _HMW_PLUGIN_NAME_ ), $maxmemory, 64, '<a href="https://codex.wordpress.org/Editing_wp-config.php#Increasing_memory_allocated_to_PHP" target="_blank">', '</a>' ) );
35
+ }
36
+ }
37
+ //Get the plugin options from database
38
+ self::$options = self::getOptions();
39
+
40
+ //Load multilanguage
41
+ add_filter( "init", array( $this, 'loadMultilanguage' ) );
42
+
43
+ //add review link in plugin list
44
+ add_filter( "plugin_row_meta", array( $this, 'hookExtraLinks' ), 10, 4 );
45
+
46
+ //add setting link in plugin
47
+ add_filter( 'plugin_action_links', array( $this, 'hookActionlink' ), 5, 2 );
48
+ }
49
+
50
+ /**
51
+ * Check the memory and make sure it's enough
52
+ * @return bool|string
53
+ */
54
+ public static function getMaxMemory() {
55
+ try {
56
+ $memory_limit = @ini_get( 'memory_limit' );
57
+ if ( (int) $memory_limit > 0 ) {
58
+ if ( preg_match( '/^(\d+)(.)$/', $memory_limit, $matches ) ) {
59
+ if ( $matches[2] == 'G' ) {
60
+ $memory_limit = $matches[1] * 1024 * 1024 * 1024; // nnnM -> nnn MB
61
+ } elseif ( $matches[2] == 'M' ) {
62
+ $memory_limit = $matches[1] * 1024 * 1024; // nnnM -> nnn MB
63
+ } elseif ( $matches[2] == 'K' ) {
64
+ $memory_limit = $matches[1] * 1024; // nnnK -> nnn KB
65
+ }
66
+ }
67
+
68
+ if ( (int) $memory_limit > 0 ) {
69
+ return number_format( (int) $memory_limit / 1024 / 1024, 0, '', '' );
70
+ }
71
+ }
72
+ } catch ( Exception $e ) {
73
+ }
74
+
75
+ return false;
76
+
77
+ }
78
+
79
+ /**
80
+ * Load the Options from user option table in DB
81
+ *
82
+ * @param bool|false $safe
83
+ *
84
+ * @return array|mixed|object
85
+ */
86
+ public static function getOptions( $safe = false ) {
87
+ $keymeta = HMW_OPTION;
88
+ $homepath = ltrim( parse_url( site_url(), PHP_URL_PATH ), '/' );
89
+ $pluginurl = ltrim( parse_url( plugins_url(), PHP_URL_PATH ), '/' );
90
+ $contenturl = ltrim( parse_url( content_url(), PHP_URL_PATH ), '/' );
91
+
92
+ if ( $safe ) {
93
+ $keymeta = HMW_OPTION_SAFE;
94
+ }
95
+
96
+ self::$init = array(
97
+ 'hmw_ver' => 0,
98
+ 'api_token' => false,
99
+ 'hmw_token' => 0,
100
+ 'hmw_disable' => mt_rand( 111111, 999999 ),
101
+ 'hmw_disable_name' => 'hmw_disable',
102
+ 'logout' => false,
103
+ 'error' => false,
104
+ 'rewrites' => 0,
105
+ 'test_frontend' => false,
106
+ 'changes' => false,
107
+ 'admin_notice' => array(),
108
+ //--
109
+ 'hmw_laterload' => 0,
110
+ 'hmw_fix_relative' => 1,
111
+ 'hmw_shutdown_load' => 0, //check Hide My WP on shutdown
112
+ //--
113
+ 'hmw_url_redirect' => '.',
114
+ 'hmw_remove_third_hooks' => 0,
115
+ 'hmw_send_email' => 1,
116
+ 'hmw_activity_log' => 1,
117
+ 'hmw_activity_log_roles' => array(),
118
+ 'hmw_email_address' => '',
119
+
120
+ //-- Brute Force
121
+ 'hmw_bruteforce' => 0,
122
+ 'hmw_bruteforce_log' => 1,
123
+ 'hmw_brute_message' => __( 'Your IP has been flagged for potential security violations. Please try again in a little while...', _HMW_PLUGIN_NAME_ ),
124
+ 'whitelist_ip' => array(),
125
+ 'banlist_ip' => array(),
126
+ 'hmw_hide_classes' => json_encode( array() ),
127
+ 'trusted_ip_header' => '',
128
+ //
129
+ 'brute_use_math' => 0,
130
+ 'brute_max_attempts' => 5,
131
+ 'brute_max_timeout' => 3600,
132
+ //captcha
133
+ 'brute_use_captcha' => 1,
134
+ 'brute_captcha_site_key' => '',
135
+ 'brute_captcha_secret_key' => '',
136
+ 'brute_captcha_theme' => 'light',
137
+ 'brute_captcha_language' => '',
138
+ //
139
+ 'hmw_new_plugins' => array(),
140
+ 'hmw_new_themes' => array(),
141
+ //
142
+ 'hmw_in_dashboard' => 0,
143
+ 'hmw_hide_loggedusers' => 1,
144
+ 'hmw_hide_version' => 1,
145
+ 'hmw_hide_header' => 1,
146
+ 'hmw_hide_comments' => 1,
147
+ 'hmw_disable_emojicons' => 0,
148
+ 'hmw_disable_xmlrpc' => 0,
149
+ 'hmw_disable_manifest' => 1,
150
+ 'hmw_disable_embeds' => 0,
151
+ 'hmw_disable_debug' => 1,
152
+ 'hmw_file_cache' => 0,
153
+ 'hmw_security_alert' => 1,
154
+ 'html_cdn_urls' => array(),
155
+
156
+ //
157
+ 'hmw_robots' => 0,
158
+ 'hmw_mapping_classes' => 1,
159
+ 'hmw_text_mapping' => json_encode(
160
+ array(
161
+ 'from' => array( 'wp-custom' ),
162
+ 'to' => array( 'custom' ),
163
+ )
164
+ ),
165
+ );
166
+ self::$default = array(
167
+ 'hmw_mode' => 'default',
168
+ 'hmw_admin_url' => 'wp-admin',
169
+ 'hmw_login_url' => 'wp-login.php',
170
+ 'hmw_activate_url' => 'wp-activate.php',
171
+ 'hmw_lostpassword_url' => '',
172
+ 'hmw_register_url' => '',
173
+ 'hmw_logout_url' => '',
174
+ 'hmw_logout_redirect' => '',
175
+ 'hmw_plugin_url' => trim( preg_replace( '/' . str_replace( '/', '\/', $homepath ) . '/', '', $pluginurl, 1 ), '/' ),
176
+ 'hmw_plugins' => array(),
177
+ 'hmw_themes_url' => 'themes',
178
+ 'hmw_themes' => array(),
179
+ 'hmw_upload_url' => 'uploads',
180
+ 'hmw_admin-ajax_url' => 'admin-ajax.php',
181
+ 'hmw_hideajax_admin' => 0,
182
+ 'hmw_hideajax_paths' => 0,
183
+ 'hmw_tags_url' => 'tag',
184
+ 'hmw_wp-content_url' => trim( preg_replace( '/' . str_replace( '/', '\/', $homepath ) . '/', '', $contenturl, 1 ), '/' ),
185
+ 'hmw_wp-includes_url' => 'wp-includes',
186
+ 'hmw_author_url' => 'author',
187
+ 'hmw_hide_authors' => 0,
188
+ 'hmw_wp-comments-post' => 'wp-comments-post.php',
189
+ 'hmw_themes_style' => 'style.css',
190
+ 'hmw_hide_img_classes' => 0,
191
+ 'hmw_hide_styleids' => 0,
192
+ 'hmw_wp-json' => 'wp-json',
193
+ 'hmw_disable_rest_api' => 0,
194
+ 'hmw_hide_admin' => 0,
195
+ 'hmw_hide_newadmin' => 0,
196
+ 'hmw_hide_login' => 0,
197
+ 'hmw_hide_wplogin' => 0,
198
+ 'hmw_hide_plugins' => 0,
199
+ 'hmw_hide_themes' => 0,
200
+
201
+ //
202
+ 'hmw_sqlinjection' => 0,
203
+ 'hmw_hide_commonfiles' => 0,
204
+ 'hmw_hide_oldpaths' => 0,
205
+ 'hmw_disable_browsing' => 0,
206
+
207
+ 'hmw_category_base' => '',
208
+ 'hmw_tag_base' => '',
209
+ );
210
+ self::$lite = array(
211
+ 'hmw_mode' => 'lite',
212
+ 'hmw_login_url' => 'newlogin',
213
+ 'hmw_activate_url' => 'activate',
214
+ 'hmw_lostpassword_url' => 'lostpass',
215
+ 'hmw_register_url' => 'signup',
216
+ 'hmw_logout_url' => '',
217
+ 'hmw_logout_redirect' => '',
218
+ 'hmw_admin-ajax_url' => 'admin-ajax.php',
219
+ 'hmw_hideajax_admin' => 0,
220
+ 'hmw_hideajax_paths' => 1,
221
+ 'hmw_plugin_url' => 'core/modules',
222
+ 'hmw_themes_url' => 'core/assets',
223
+ 'hmw_upload_url' => 'storage',
224
+ 'hmw_wp-content_url' => 'core',
225
+ 'hmw_wp-includes_url' => 'lib',
226
+ 'hmw_author_url' => 'writer',
227
+ 'hmw_hide_authors' => 0,
228
+ 'hmw_wp-comments-post' => 'comments',
229
+ 'hmw_themes_style' => 'style.css',
230
+ 'hmw_hide_admin' => 1,
231
+ 'hmw_hide_newadmin' => 0,
232
+ 'hmw_hide_login' => 1,
233
+ 'hmw_hide_wplogin' => 1,
234
+ 'hmw_hide_plugins' => 1,
235
+ 'hmw_hide_themes' => 1,
236
+ 'hmw_disable_rest_api' => 0,
237
+ 'hmw_hide_styleids' => 0,
238
+ //
239
+ 'hmw_sqlinjection' => 0,
240
+ 'hmw_hide_commonfiles' => 0,
241
+ 'hmw_hide_oldpaths' => 0,
242
+ 'hmw_disable_browsing' => 0
243
+ );
244
+ self::$ninja = array();
245
+
246
+ if ( is_multisite() && defined( 'BLOG_ID_CURRENT_SITE' ) ) {
247
+ $options = json_decode( get_blog_option( BLOG_ID_CURRENT_SITE, $keymeta ), true );
248
+ } else {
249
+ $options = json_decode( get_option( $keymeta ), true );
250
+ }
251
+
252
+ //Set default hmw_hide_wplogin
253
+ if ( !isset( $options['hmw_hide_wplogin'] ) && $options['hmw_hide_login'] ) {
254
+ $options['hmw_hide_wplogin'] = $options['hmw_hide_login'];
255
+ }
256
+
257
+ if ( is_array( $options ) ) {
258
+ $options = @array_merge( self::$init, self::$default, $options );
259
+ } else {
260
+ $options = @array_merge( self::$init, self::$default );
261
+ }
262
+
263
+ $category_base = get_option( 'category_base' );
264
+ $tag_base = get_option( 'tag_base' );
265
+
266
+ if ( is_multisite() && ! is_subdomain_install() && is_main_site() && 0 === strpos( get_option( 'permalink_structure' ), '/blog/' ) ) {
267
+ $category_base = preg_replace( '|^/?blog|', '', $category_base );
268
+ $tag_base = preg_replace( '|^/?blog|', '', $tag_base );
269
+ }
270
+
271
+ $options['hmw_category_base'] = $category_base;
272
+ $options['hmw_tag_base'] = $tag_base;
273
+
274
+
275
+ return $options;
276
+ }
277
+
278
+ /**
279
+ * Get the option from database
280
+ *
281
+ * @param $key
282
+ *
283
+ * @return mixed
284
+ */
285
+ public static function getOption( $key ) {
286
+ if ( ! isset( self::$options[ $key ] ) ) {
287
+ self::$options = self::getOptions();
288
+
289
+ if ( ! isset( self::$options[ $key ] ) ) {
290
+ self::$options[ $key ] = 0;
291
+ }
292
+ }
293
+
294
+ return self::$options[ $key ];
295
+ }
296
+
297
+ /**
298
+ * Save the Options in user option table in DB
299
+ *
300
+ * @param string $key
301
+ * @param string $value
302
+ * @param bool|false $safe
303
+ *
304
+ */
305
+ public static function saveOptions( $key = null, $value = '', $safe = false ) {
306
+ $keymeta = HMW_OPTION;
307
+
308
+ if ( $safe ) {
309
+ $keymeta = HMW_OPTION_SAFE;
310
+ }
311
+
312
+ if ( isset( $key ) ) {
313
+ self::$options[ $key ] = $value;
314
+ }
315
+
316
+ if ( is_multisite() && defined( 'BLOG_ID_CURRENT_SITE' ) ) {
317
+ update_blog_option( BLOG_ID_CURRENT_SITE, $keymeta, json_encode( self::$options ) );
318
+ } else {
319
+ update_option( $keymeta, json_encode( self::$options ) );
320
+ }
321
+ }
322
+
323
+
324
+ /**
325
+ * Adds extra links to plugin page
326
+ *
327
+ * @param $meta
328
+ * @param $file
329
+ * @param $data
330
+ * @param $status
331
+ *
332
+ * @return array
333
+ */
334
+ public function hookExtraLinks( $meta, $file, $data = null, $status = null ) {
335
+ if ( $file == _HMW_PLUGIN_NAME_ . '/index.php' ) {
336
+ echo '<style>
337
+ .ml-stars{display:inline-block;color:#ffb900;position:relative;top:3px}
338
+ .ml-stars svg{fill:#ffb900}
339
+ .ml-stars svg:hover{fill:#ffb900}
340
+ .ml-stars svg:hover ~ svg{fill:none}
341
+ </style>';
342
+
343
+ $meta[] = "<a href='https://hidemywpghost.com/knowledge-base/' target='_blank'>" . __( 'Documentation', _HMW_PLUGIN_NAME_ ) . "</a>";
344
+ $meta[] = "<a href='https://wordpress.org/support/plugin/hide-my-wp/reviews/#new-post' target='_blank' title='" . __( 'Leave a review', _HMW_PLUGIN_NAME_ ) . "'><i class='ml-stars'><svg xmlns='http://www.w3.org/2000/svg' width='15' height='15' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-star'><polygon points='12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2'/></svg><svg xmlns='http://www.w3.org/2000/svg' width='15' height='15' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-star'><polygon points='12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2'/></svg><svg xmlns='http://www.w3.org/2000/svg' width='15' height='15' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-star'><polygon points='12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2'/></svg><svg xmlns='http://www.w3.org/2000/svg' width='15' height='15' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-star'><polygon points='12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2'/></svg><svg xmlns='http://www.w3.org/2000/svg' width='15' height='15' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-star'><polygon points='12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2'/></svg></i></a>";
345
+ }
346
+
347
+ return $meta;
348
+ }
349
+
350
+
351
+ /**
352
+ * Add a link to settings in the plugin list
353
+ *
354
+ * @param array $links
355
+ * @param string $file
356
+ *
357
+ * @return array
358
+ */
359
+ public function hookActionlink( $links, $file ) {
360
+ if ( $file == _HMW_PLUGIN_NAME_ . '/index.php' ) {
361
+ $link = '<a href="https://hidemywpghost.com/wordpress_update" title="Hide My WP Ghost" target="_blank" style="color:#11967A; font-weight: bold">' . __( 'Upgrade to Premium', _HMW_PLUGIN_NAME_ ) . '</a>';
362
+ $link .= ' | ';
363
+ $link .= '<a href="' . self::getSettingsUrl() . '" title="Hide My Wp Settings">' . __( 'Settings', _HMW_PLUGIN_NAME_ ) . '</a>';
364
+ array_unshift( $links, $link );
365
+ }
366
+
367
+ return $links;
368
+ }
369
+
370
+ /**
371
+ * Load the multilanguage support from .mo
372
+ */
373
+ public static function loadMultilanguage() {
374
+ if ( ! defined( 'WP_PLUGIN_DIR' ) ) {
375
+ load_plugin_textdomain( _HMW_PLUGIN_NAME_, _HMW_PLUGIN_NAME_ . '/languages/' );
376
+ } else {
377
+ load_plugin_textdomain( _HMW_PLUGIN_NAME_, null, _HMW_PLUGIN_NAME_ . '/languages/' );
378
+ }
379
+ }
380
+
381
+ /**
382
+ * Check if it's Ajax call
383
+ * @return bool
384
+ */
385
+ public static function isAjax() {
386
+ if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
387
+ return true;
388
+ }
389
+
390
+ return false;
391
+ }
392
+
393
+ /**
394
+ * Change the paths in admin and for logged users
395
+ * @return bool
396
+ */
397
+ public static function doChangesAdmin() {
398
+ if ( function_exists( 'is_user_logged_in' ) && function_exists( 'current_user_can' ) ) {
399
+ if ( ! is_admin() && ! is_network_admin() ) {
400
+ if ( HMW_Classes_Tools::getOption( 'hmw_hide_loggedusers' ) || ! is_user_logged_in() ) {
401
+ return true;
402
+ }
403
+ }
404
+ }
405
+
406
+ return false;
407
+ }
408
+
409
+ /**
410
+ * Get the plugin settings URL
411
+ *
412
+ * @param string $page
413
+ *
414
+ * @return string
415
+ */
416
+ public static function getSettingsUrl( $page = 'hmw_settings' ) {
417
+ if ( ! is_multisite() ) {
418
+ return admin_url( 'admin.php?page=' . $page );
419
+ } else {
420
+ return network_admin_url( 'admin.php?page=' . $page );
421
+ }
422
+ }
423
+
424
+ /**
425
+ * Set the header type
426
+ *
427
+ * @param string $type
428
+ */
429
+ public static function setHeader( $type ) {
430
+ switch ( $type ) {
431
+ case 'json':
432
+ header( 'Content-Type: application/json' );
433
+ break;
434
+ case 'text':
435
+ header( "Content-type: text/plain" );
436
+ break;
437
+ }
438
+ }
439
+
440
+ /**
441
+ * Get a value from $_POST / $_GET
442
+ * if unavailable, take a default value
443
+ *
444
+ * @param string $key Value key
445
+ * @param boolean $keep_newlines Keep the new lines in variable in case of texareas
446
+ * @param mixed $defaultValue (optional)
447
+ *
448
+ * @return mixed Value
449
+ */
450
+ public static function getValue( $key = null, $defaultValue = false, $keep_newlines = false ) {
451
+ if ( ! isset( $key ) || $key == '' ) {
452
+ return false;
453
+ }
454
+
455
+ $ret = ( isset( $_POST[ $key ] ) ? $_POST[ $key ] : ( isset( $_GET[ $key ] ) ? $_GET[ $key ] : $defaultValue ) );
456
+
457
+ if ( is_string( $ret ) === true ) {
458
+ if ( $keep_newlines === false ) {
459
+ if ( in_array( $key, array( 'hmw_email_address', 'hmw_email' ) ) ) { //validate email address
460
+ $ret = preg_replace( '/[^A-Za-z0-9-_\.\#\/\*\@]/', '', $ret );
461
+ } elseif ( in_array( $key, array( 'hmw_disable_name' ) ) ) { //validate url parameter
462
+ $ret = preg_replace( '/[^A-Za-z0-9-_]/', '', $ret );
463
+ } else {
464
+ $ret = preg_replace( '/[^A-Za-z0-9-_\/\.]/', '', $ret ); //validate fields
465
+ }
466
+ $ret = sanitize_text_field( $ret );
467
+ } else {
468
+ $ret = preg_replace( '/[^A-Za-z0-9-_.\#\n\r\s\/\* ]\@/', '', $ret );
469
+ if ( function_exists( 'sanitize_textarea_field' ) ) {
470
+ $ret = sanitize_textarea_field( $ret );
471
+ }
472
+ }
473
+ }
474
+
475
+ return wp_unslash( $ret );
476
+ }
477
+
478
+ /**
479
+ * Check if the parameter is set
480
+ *
481
+ * @param string $key
482
+ *
483
+ * @return boolean
484
+ */
485
+ public static function getIsset( $key = null ) {
486
+ if ( ! isset( $key ) || $key == '' ) {
487
+ return false;
488
+ }
489
+
490
+ return isset( $_POST[ $key ] ) ? true : ( isset( $_GET[ $key ] ) ? true : false );
491
+ }
492
+
493
+ /**
494
+ * Show the notices to WP
495
+ *
496
+ * @param $message
497
+ * @param string $type
498
+ *
499
+ * @return string
500
+ */
501
+ public static function showNotices( $message, $type = '' ) {
502
+ if ( file_exists( _HMW_THEME_DIR_ . 'Notices.php' ) ) {
503
+ ob_start();
504
+ include( _HMW_THEME_DIR_ . 'Notices.php' );
505
+ $message = ob_get_contents();
506
+ ob_end_clean();
507
+ }
508
+
509
+ return $message;
510
+ }
511
+
512
+ /**
513
+ * Connect remote with wp_remote_get
514
+ *
515
+ * @param $url
516
+ * @param array $params
517
+ * @param array $options
518
+ *
519
+ * @return bool|string
520
+ */
521
+ public static function hmw_remote_get( $url, $params = array(), $options = array() ) {
522
+ $options['method'] = 'GET';
523
+
524
+ $parameters = '';
525
+ if ( ! empty( $params ) ) {
526
+ foreach ( $params as $key => $value ) {
527
+ if ( $key <> '' ) {
528
+ $parameters .= ( $parameters == "" ? "" : "&" ) . $key . "=" . $value;
529
+ }
530
+ }
531
+
532
+ if ( $parameters <> '' ) {
533
+ $url .= ( ( strpos( $url, "?" ) === false ) ? "?" : "&" ) . $parameters;
534
+ }
535
+ }
536
+ //echo $url; exit();
537
+ if ( ! $response = self::hmw_wpcall( $url, $params, $options ) ) {
538
+ return false;
539
+ }
540
+
541
+ return $response;
542
+ }
543
+
544
+ /**
545
+ * Connect remote with wp_remote_get
546
+ *
547
+ * @param $url
548
+ * @param array $params
549
+ * @param array $options
550
+ *
551
+ * @return bool|string
552
+ */
553
+ public static function hmw_remote_post( $url, $params = array(), $options = array() ) {
554
+ $options['method'] = 'POST';
555
+ if ( ! $response = self::hmw_wpcall( $url, $params, $options ) ) {
556
+ return false;
557
+ }
558
+
559
+ return $response;
560
+ }
561
+
562
+ /**
563
+ * Use the WP remote call
564
+ *
565
+ * @param string $url
566
+ * @param array $params
567
+ * @param array $options
568
+ *
569
+ * @return string
570
+ */
571
+ private static function hmw_wpcall( $url, $params, $options ) {
572
+ $options['timeout'] = ( isset( $options['timeout'] ) ) ? $options['timeout'] : 30;
573
+ $options['sslverify'] = false;
574
+ $options['httpversion'] = '1.0';
575
+
576
+ if ( $options['method'] == 'POST' ) {
577
+ $options['body'] = $params;
578
+ unset( $options['method'] );
579
+ $response = wp_remote_post( $url, $options );
580
+ } else {
581
+ unset( $options['method'] );
582
+ $response = wp_remote_get( $url, $options );
583
+ }
584
+ if ( is_wp_error( $response ) ) {
585
+ HMW_Debug::dump( $response );
586
+
587
+ return false;
588
+ }
589
+
590
+ $response = self::cleanResponce( wp_remote_retrieve_body( $response ) ); //clear and get the body
591
+ HMW_Debug::dump( 'hmw_wpcall', $url, $options, $response ); //output debug
592
+
593
+ return $response;
594
+ }
595
+
596
+ /**
597
+ * Get the Json from responce if any
598
+ *
599
+ * @param string $response
600
+ *
601
+ * @return string
602
+ */
603
+ private static function cleanResponce( $response ) {
604
+ $response = trim( $response, '()' );
605
+
606
+ return $response;
607
+ }
608
+
609
+ /**
610
+ * Returns true if permalink structure
611
+ *
612
+ * @return boolean
613
+ */
614
+ public static function isPermalinkStructure() {
615
+ return get_option( 'permalink_structure' );
616
+ }
617
+
618
+
619
+ /**
620
+ * Check if HTML Headers to prevent chenging the code for other file extension
621
+ *
622
+ * @param array $types
623
+ *
624
+ * @return bool
625
+ */
626
+ public static function isContentHeader( $types = array( 'text/html', 'text/xml' ) ) {
627
+ $headers = headers_list();
628
+ foreach ( $headers as $index => $value ) {
629
+ if ( strpos( $value, ':' ) !== false ) {
630
+ $exploded = @explode( ': ', $value );
631
+ if ( count( $exploded ) > 1 ) {
632
+ $headers[ $exploded[0] ] = $exploded[1];
633
+ }
634
+ }
635
+ }
636
+
637
+
638
+ if ( ! empty( $types ) && isset( $headers['Content-Type'] ) ) {
639
+ foreach ( $types as $type ) {
640
+ if ( strpos( $headers['Content-Type'], $type ) !== false ) {
641
+ return true;
642
+ }
643
+ }
644
+
645
+ } else {
646
+ return false;
647
+ }
648
+
649
+ return false;
650
+ }
651
+
652
+ /**
653
+ * Returns true if server is Apache
654
+ *
655
+ * @return boolean
656
+ */
657
+ public static function isApache() {
658
+ global $is_apache;
659
+
660
+ if ( self::isFlywheel() ) { //force Nginx on Flywheel server
661
+ return false;
662
+ }
663
+
664
+ return $is_apache;
665
+ }
666
+
667
+ /**
668
+ * Check if mode rewrite is on
669
+ * @return bool
670
+ */
671
+ public static function isModeRewrite() {
672
+ if ( function_exists( 'apache_get_modules' ) ) {
673
+ $modules = apache_get_modules();
674
+ if ( ! empty( $modules ) ) {
675
+ return in_array( 'mod_rewrite', $modules );
676
+ }
677
+ }
678
+
679
+ return true;
680
+ }
681
+
682
+ /**
683
+ * Check whether server is LiteSpeed
684
+ *
685
+ * @return bool
686
+ */
687
+ public static function isLitespeed() {
688
+ $litespeed = false;
689
+ if ( isset( $_SERVER['SERVER_SOFTWARE'] ) && stristr( $_SERVER['SERVER_SOFTWARE'], 'LiteSpeed' ) !== false ) {
690
+ $litespeed = true;
691
+ } elseif ( isset( $_SERVER['SERVER_NAME'] ) && stristr( $_SERVER['SERVER_NAME'], 'LiteSpeed' ) !== false ) {
692
+ $litespeed = true;
693
+ } elseif ( isset( $_SERVER['X-Litespeed-Cache-Control'] ) ) {
694
+ $litespeed = true;
695
+ }
696
+
697
+ if ( self::isFlywheel() ) {
698
+ return false;
699
+ }
700
+
701
+ return $litespeed;
702
+ }
703
+
704
+ /**
705
+ * Check whether server is Lighthttp
706
+ *
707
+ * @return bool
708
+ */
709
+ public static function isLighthttp() {
710
+ return ( isset( $_SERVER['SERVER_SOFTWARE'] ) && stristr( $_SERVER['SERVER_SOFTWARE'], 'lighttpd' ) !== false );
711
+ }
712
+
713
+ /**
714
+ * Check if multisites with path
715
+ *
716
+ * @return bool
717
+ */
718
+ public static function isMultisites() {
719
+ if ( ! isset( self::$is_multisite ) ) {
720
+ self::$is_multisite = ( is_multisite() && ( ( defined( 'SUBDOMAIN_INSTALL' ) && ! SUBDOMAIN_INSTALL ) || ( defined( 'VHOST' ) && VHOST == 'no' ) ) );
721
+ }
722
+
723
+ return self::$is_multisite;
724
+ }
725
+
726
+
727
+ /**
728
+ * Returns true if server is nginx
729
+ *
730
+ * @return boolean
731
+ */
732
+ public static function isNginx() {
733
+ global $is_nginx;
734
+
735
+ if ( self::isFlywheel() ) {
736
+ return true;
737
+ }
738
+
739
+ return ( $is_nginx || ( isset( $_SERVER['SERVER_SOFTWARE'] ) && stristr( $_SERVER['SERVER_SOFTWARE'], 'nginx' ) !== false ) );
740
+ }
741
+
742
+ /**
743
+ * Returns true if server is Wpengine
744
+ *
745
+ * @return boolean
746
+ */
747
+ public static function isWpengine() {
748
+ return ( isset( $_SERVER['WPENGINE_PHPSESSIONS'] ) );
749
+ }
750
+
751
+ /**
752
+ * Returns true if server is Inmotion
753
+ *
754
+ * @return boolean
755
+ */
756
+ public static function isInmotion() {
757
+ return ( isset( $_SERVER['SERVER_ADDR'] ) && strpos( @gethostbyaddr( $_SERVER['SERVER_ADDR'] ), 'inmotionhosting.com' ) !== false );
758
+ }
759
+
760
+ /**
761
+ * Returns true if server is Godaddy
762
+ *
763
+ * @return boolean
764
+ */
765
+ public static function isGodaddy() {
766
+ return ( file_exists( ABSPATH . 'gd-config.php' ) );
767
+ }
768
+
769
+ /**
770
+ * Returns true if server is Wpengine
771
+ *
772
+ * @return boolean
773
+ */
774
+ public static function isFlywheel() {
775
+ return (isset( $_SERVER['SERVER_SOFTWARE'] ) && stristr( $_SERVER['SERVER_SOFTWARE'], 'Flywheel' ) !== false);
776
+ }
777
+
778
+
779
+ /**
780
+ * Returns true if server is IIS
781
+ *
782
+ * @return boolean
783
+ */
784
+ public static function isIIS() {
785
+ global $is_IIS, $is_iis7;
786
+
787
+ return ( $is_iis7 || $is_IIS || ( isset( $_SERVER['SERVER_SOFTWARE'] ) && stristr( $_SERVER['SERVER_SOFTWARE'], 'microsoft-iis' ) !== false ) );
788
+ }
789
+
790
+ /**
791
+ * Returns true if windows
792
+ * @return bool
793
+ */
794
+ public static function isWindows() {
795
+ return ( strtoupper( substr( PHP_OS, 0, 3 ) ) === 'WIN' );
796
+ }
797
+
798
+ /**
799
+ * Check if IIS has rewrite 2 structure enabled
800
+ * @return bool
801
+ */
802
+ public static function isPHPPermalink() {
803
+ if ( get_option( 'permalink_structure' ) ) {
804
+ if ( strpos( get_option( 'permalink_structure' ), 'index.php' ) !== false || strpos( get_option( 'permalink_structure' ), 'index.html' ) !== false || strpos( get_option( 'permalink_structure' ), 'index.htm' ) !== false ) {
805
+ return true;
806
+ }
807
+ }
808
+
809
+ return false;
810
+ }
811
+
812
+ /**
813
+ * Check whether the plugin is active by checking the active_plugins list.
814
+ *
815
+ * @source wp-admin/includes/plugin.php
816
+ *
817
+ * @param string $plugin Plugin folder/main file.
818
+ *
819
+ * @return boolean
820
+ */
821
+ public static function isPluginActive( $plugin ) {
822
+ if ( empty( self::$active_plugins ) ) {
823
+ self::$active_plugins = (array) get_option( 'active_plugins', array() );
824
+
825
+ if ( is_multisite() ) {
826
+ self::$active_plugins = array_merge( array_values( self::$active_plugins ), array_keys( get_site_option( 'active_sitewide_plugins' ) ) );
827
+ }
828
+
829
+ HMW_Debug::dump( self::$active_plugins );
830
+
831
+ }
832
+
833
+ return in_array( $plugin, self::$active_plugins, true );
834
+ }
835
+
836
+ /**
837
+ * Check whether the theme is active.
838
+ *
839
+ * @param string $theme Theme folder/main file.
840
+ *
841
+ * @return boolean
842
+ */
843
+ public static function isThemeActive( $theme ) {
844
+ if ( function_exists( 'wp_get_theme' ) ) {
845
+ $themes = wp_get_theme();
846
+ if ( isset( $themes->name ) && ( strtolower( $themes->name ) == strtolower( $theme ) || strtolower( $themes->name ) == strtolower( $theme ) . ' child' ) ) {
847
+ return true;
848
+ }
849
+ }
850
+
851
+ return false;
852
+ }
853
+
854
+ /**
855
+ * Get all the plugin names
856
+ *
857
+ * @return array
858
+ */
859
+ public static function getAllPlugins() {
860
+ $all_plugins = (array) get_option( 'active_plugins', array() );;
861
+
862
+ if ( is_multisite() ) {
863
+ $all_plugins = array_merge( array_values( $all_plugins ), array_keys( get_site_option( 'active_sitewide_plugins' ) ) );
864
+ }
865
+
866
+ return $all_plugins;
867
+ }
868
+
869
+ /**
870
+ * Get all the themes names
871
+ *
872
+ * @return array
873
+ */
874
+ public static function getAllThemes() {
875
+ return search_theme_directories();
876
+ }
877
+
878
+ /**
879
+ * Get the absolute filesystem path to the root of the WordPress installation
880
+ *
881
+ * @return string Full filesystem path to the root of the WordPress installation
882
+ */
883
+ public static function getRootPath() {
884
+ return ABSPATH;
885
+ }
886
+
887
+ /**
888
+ * Get Relative path for the current blog in case of WP Multisite
889
+ *
890
+ * @param $url
891
+ *
892
+ * @return mixed|string
893
+ */
894
+ public static function getRelativePath( $url ) {
895
+ $url = wp_make_link_relative( $url );
896
+
897
+ if ( $url <> '' ) {
898
+ $url = str_replace( wp_make_link_relative( get_bloginfo( 'url' ) ), '', $url );
899
+
900
+ if ( HMW_Classes_Tools::isMultisites() && defined( 'PATH_CURRENT_SITE' ) ) {
901
+ $url = str_replace( rtrim( PATH_CURRENT_SITE, '/' ), '', $url );
902
+ $url = trim( $url, '/' );
903
+ $url = $url . '/';
904
+ } else {
905
+ $url = trim( $url, '/' );
906
+ }
907
+ }
908
+
909
+ HMW_Debug::dump( $url );
910
+
911
+ return $url;
912
+ }
913
+
914
+ /**
915
+ * Empty the cache from other cache plugins when save the settings
916
+ */
917
+ public static function emptyCache() {
918
+ //Empty WordPress rewrites count for 404 error.
919
+ //This happens when the rules are not saved through config file
920
+ HMW_Classes_Tools::saveOptions( 'rewrites', 0 );
921
+
922
+ if ( function_exists( 'w3tc_pgcache_flush' ) ) {
923
+ w3tc_pgcache_flush();
924
+ }
925
+
926
+ if ( function_exists( 'w3tc_minify_flush' ) ) {
927
+ w3tc_minify_flush();
928
+ }
929
+ if ( function_exists( 'w3tc_dbcache_flush' ) ) {
930
+ w3tc_dbcache_flush();
931
+ }
932
+ if ( function_exists( 'w3tc_objectcache_flush' ) ) {
933
+ w3tc_objectcache_flush();
934
+ }
935
+
936
+ if ( function_exists( 'wp_cache_clear_cache' ) ) {
937
+ wp_cache_clear_cache();
938
+ }
939
+
940
+ if ( function_exists( 'rocket_clean_domain' ) && function_exists( 'rocket_clean_minify' ) && function_exists( 'rocket_clean_cache_busting' ) ) {
941
+ // Remove all cache files
942
+ rocket_clean_domain();
943
+ rocket_clean_minify();
944
+ rocket_clean_cache_busting();
945
+ }
946
+
947
+ if ( function_exists( 'opcache_reset' ) ) {
948
+ // Remove all opcache if enabled
949
+ opcache_reset();
950
+ }
951
+
952
+ if ( function_exists( 'apc_clear_cache' ) ) {
953
+ // Remove all apc if enabled
954
+ apc_clear_cache();
955
+ }
956
+
957
+ if ( class_exists( 'Cache_Enabler_Disk' ) && method_exists( 'Cache_Enabler_Disk', 'clear_cache' ) ) {
958
+ // clear disk cache
959
+ Cache_Enabler_Disk::clear_cache();
960
+ }
961
+
962
+ if ( class_exists( 'LiteSpeed_Cache' ) ) {
963
+ LiteSpeed_Cache::get_instance()->purge_all();
964
+ }
965
+
966
+ if ( class_exists( 'WpeCommon' ) ) {
967
+ if ( method_exists( 'WpeCommon', 'purge_memcached' ) ) {
968
+ WpeCommon::purge_memcached();
969
+ }
970
+ if ( method_exists( 'WpeCommon', 'clear_maxcdn_cache' ) ) {
971
+ WpeCommon::clear_maxcdn_cache();
972
+ }
973
+ if ( method_exists( 'WpeCommon', 'purge_varnish_cache' ) ) {
974
+ WpeCommon::purge_varnish_cache();
975
+ }
976
+ }
977
+
978
+ //Clear the fastest cache
979
+ global $wp_fastest_cache;
980
+ if ( isset( $wp_fastest_cache ) && method_exists( $wp_fastest_cache, 'deleteCache' ) ) {
981
+ $wp_fastest_cache->deleteCache();
982
+ }
983
+
984
+ }
985
+
986
+ /**
987
+ * Flush the WordPress rewrites
988
+ */
989
+ public static function flushWPRewrites() {
990
+ if ( HMW_Classes_Tools::isPluginActive( 'woocommerce/woocommerce.php' ) ) {
991
+ update_option( 'woocommerce_queue_flush_rewrite_rules', 'yes' );
992
+ }
993
+
994
+ flush_rewrite_rules();
995
+ }
996
+
997
+ /**
998
+ * Called on plugin activation
999
+ */
1000
+ public function hmw_activate() {
1001
+ set_transient( 'hmw_activate', true );
1002
+
1003
+ $lastsafeoptions = self::getOptions( true );
1004
+ if ( isset( $lastsafeoptions['hmw_mode'] ) && ( $lastsafeoptions['hmw_mode'] == 'ninja' || $lastsafeoptions['hmw_mode'] == 'lite' ) ) {
1005
+ set_transient( 'hmw_restore', true );
1006
+ }
1007
+
1008
+ self::$options = @array_merge( self::$init, self::$default );
1009
+ self::$options['hmw_ver'] = HMW_VERSION_ID;
1010
+ self::saveOptions();
1011
+ }
1012
+
1013
+ /**
1014
+ * Called on plugin deactivation
1015
+ */
1016
+ public function hmw_deactivate() {
1017
+ $options = self::$default;
1018
+ //Prevent duplicates
1019
+ foreach ( $options as $key => $value ) {
1020
+ //set the default params from tools
1021
+ HMW_Classes_Tools::saveOptions( $key, $value );
1022
+ }
1023
+
1024
+ //clear the locked ips
1025
+ HMW_Classes_ObjController::getClass( 'HMW_Controllers_Brute' )->clearBlockedIPs();
1026
+
1027
+ //remove the custom rules
1028
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rules' )->writeToFile( '', 'HMWP_RULES' );
1029
+
1030
+ //Flush the changes
1031
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' )->flushChanges();
1032
+ }
1033
+
1034
+ /**
1035
+ * Call this function on rewrite update from other plugins
1036
+ *
1037
+ * @param $wp_rules
1038
+ *
1039
+ * @return mixed
1040
+ * @throws Exception
1041
+ */
1042
+ public function checkRewriteUpdate( $wp_rules ) {
1043
+ try {
1044
+ if ( ! HMW_Classes_Tools::getOption( 'error' ) && ! HMW_Classes_Tools::getOption( 'logout' ) ) {
1045
+ //Build the redirect table
1046
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' )->clearRedirect()->buildRedirect()->setRewriteRules()->flushRewrites();
1047
+
1048
+ }
1049
+
1050
+ } catch ( Exception $e ) {
1051
+
1052
+ }
1053
+
1054
+ return $wp_rules;
1055
+ }
1056
+
1057
+ /**
1058
+ * Check for updates
1059
+ * Called on activation
1060
+ */
1061
+ public static function checkUpgrade() {
1062
+ self::$options = self::getOptions();
1063
+
1064
+ if ( (int) self::$options['hmw_ver'] == 0 ) {
1065
+ $homepath = ltrim( parse_url( site_url(), PHP_URL_PATH ), '/' );
1066
+ $pluginurl = ltrim( parse_url( plugins_url(), PHP_URL_PATH ), '/' );
1067
+ $contenturl = ltrim( parse_url( content_url(), PHP_URL_PATH ), '/' );
1068
+
1069
+ if ( self::$options['hmw_mode'] == 'custom' ) {
1070
+ self::$options['hmw_mode'] = 'lite';
1071
+ }
1072
+ self::$options['hmw_plugin_url'] = trim( str_replace( $homepath, '', $pluginurl ), '/' );
1073
+ self::$options['hmw_wp-content_url'] = trim( str_replace( $homepath, '', $contenturl ), '/' );
1074
+ self::$options['hmw_themes_url'] = 'themes';
1075
+ self::$options['hmw_activate_url'] = 'wp-activate.php';
1076
+
1077
+ }
1078
+
1079
+ self::$options['hmw_ver'] = HMW_VERSION_ID;
1080
+ self::saveOptions();
1081
+
1082
+ }
1083
+
1084
+ /**
1085
+ * Check if new themes or plugins are added
1086
+ */
1087
+ public function checkWpUpdates() {
1088
+ if ( HMW_Classes_Tools::getOption( 'hmw_hide_plugins' ) ) {
1089
+ $all_plugins = HMW_Classes_Tools::getAllPlugins();
1090
+ $dbplugins = HMW_Classes_Tools::getOption( 'hmw_plugins' );
1091
+ foreach ( $all_plugins as $plugin ) {
1092
+ if ( is_plugin_active( $plugin ) && isset( $dbplugins['from'] ) && ! empty( $dbplugins['from'] ) ) {
1093
+ if ( ! in_array( plugin_dir_path( $plugin ), $dbplugins['from'] ) ) {
1094
+ self::saveOptions( 'changes', true );
1095
+ }
1096
+ }
1097
+ }
1098
+ }
1099
+
1100
+ if ( HMW_Classes_Tools::getOption( 'hmw_hide_themes' ) ) {
1101
+ $all_themes = HMW_Classes_Tools::getAllThemes();
1102
+ $dbthemes = HMW_Classes_Tools::getOption( 'hmw_themes' );
1103
+ foreach ( $all_themes as $theme => $value ) {
1104
+ if ( is_dir( $value['theme_root'] ) && isset( $dbthemes['from'] ) && ! empty( $dbthemes['from'] ) ) {
1105
+ if ( ! in_array( $theme . '/', $dbthemes['from'] ) ) {
1106
+ self::saveOptions( 'changes', true );
1107
+ }
1108
+ }
1109
+ }
1110
+ }
1111
+
1112
+ }
1113
+
1114
+ /**
1115
+ * Call API Server
1116
+ *
1117
+ * @param null $email
1118
+ * @param string $redirect_to
1119
+ *
1120
+ * @return array|bool|mixed|object
1121
+ */
1122
+ public static function checkApi( $email = null, $redirect_to = '' ) {
1123
+ $check = array();
1124
+ $howtolessons = HMW_Classes_Tools::getValue( 'hmw_howtolessons', 0 );
1125
+ $monitor = HMW_Classes_Tools::getValue( 'hmw_monitor', 0 );
1126
+ if ( isset( $email ) && $email <> '' ) {
1127
+ $args = array(
1128
+ 'email' => $email,
1129
+ 'url' => home_url(),
1130
+ 'howtolessons' => (int) $howtolessons,
1131
+ 'monitor' => (int) $monitor,
1132
+ 'source' => _HMW_PLUGIN_NAME_
1133
+ );
1134
+ $response = self::hmw_remote_get( _HMW_API_SITE_ . '/api/free/token', $args, array( 'timeout' => 10 ) );
1135
+ } elseif ( self::getOption( 'hmw_token' ) ) {
1136
+ $args = array(
1137
+ 'token' => self::getOption( 'hmw_token' ),
1138
+ 'url' => home_url(),
1139
+ 'howtolessons' => (int) $howtolessons,
1140
+ 'monitor' => (int) $monitor,
1141
+ 'source' => _HMW_PLUGIN_NAME_
1142
+ );
1143
+ $response = self::hmw_remote_get( _HMW_API_SITE_ . '/api/free/token', $args, array( 'timeout' => 10 ) );
1144
+ } else {
1145
+ return $check;
1146
+ }
1147
+ if ( $response && json_decode( $response ) ) {
1148
+ $check = json_decode( $response, true );
1149
+
1150
+ HMW_Classes_Tools::saveOptions( 'hmw_token', ( isset( $check['token'] ) ? $check['token'] : 0 ) );
1151
+ HMW_Classes_Tools::saveOptions( 'api_token', ( isset( $check['api_token'] ) ? $check['api_token'] : false ) );
1152
+ HMW_Classes_Tools::saveOptions( 'error', isset( $check['error'] ) );
1153
+
1154
+ if ( ! isset( $check['error'] ) ) {
1155
+ if ( $redirect_to <> '' ) {
1156
+ wp_redirect( $redirect_to );
1157
+ exit();
1158
+ }
1159
+ } elseif ( isset( $check['message'] ) ) {
1160
+ HMW_Classes_Error::setError( $check['message'] );
1161
+ }
1162
+ } else {
1163
+ //HMW_Classes_Tools::saveOptions('error', true);
1164
+ HMW_Classes_Error::setError( sprintf( __( 'CONNECTION ERROR! Make sure your website can access: %s', _HMW_PLUGIN_NAME_ ), '<a href="' . _HMW_SUPPORT_SITE_ . '" target="_blank">' . _HMW_SUPPORT_SITE_ . '</a>' ) . " <br /> " );
1165
+ }
1166
+
1167
+ return $check;
1168
+ }
1169
+
1170
+ /**
1171
+ * Send the email is case there are major changes
1172
+ * @return bool
1173
+ */
1174
+ public static function sendEmail() {
1175
+ $email = self::getOption( 'hmw_email_address' );
1176
+ if ( $email == '' ) {
1177
+ global $current_user;
1178
+ $email = $current_user->user_email;
1179
+ }
1180
+
1181
+ $line = "\n" . "________________________________________" . "\n\n";
1182
+ $to = $email;
1183
+ $from = 'no-reply@wpplugins.tips';
1184
+ $subject = get_bloginfo( 'name' ) . ' - ' . __( 'New Login Information', _HMW_PLUGIN_NAME_ );
1185
+ $message = "Thank you for using Hide My WordPress!" . "\n\n";
1186
+ $message .= $line;
1187
+ $message .= "SPECIAL OFFER: Get Hide My WP Ghost with just $10/website if you buy a 5 Websites License pack." . "\n";
1188
+ $message .= "https://hidemywpghost.com/buy/special_5_websites_plugin" . "\n";
1189
+ $message .= $line . "\n";
1190
+ $message .= "Your new website URLs are:" . "\n";
1191
+ $message .= "Admin URL: " . admin_url() . "\n";
1192
+ $message .= "Login URL: " . site_url( self::$options['hmw_login_url'] ) . "\n";
1193
+ $message .= $line . "\n";
1194
+ $message .= "Note: If you can't login to your site, just access this URL: \n";
1195
+ $message .= site_url() . "/wp-login.php?" . self::getOption( 'hmw_disable_name' ) . "=" . self::$options['hmw_disable'] . "\n\n\n";
1196
+
1197
+ $message .= "Best regards," . "\n";
1198
+ $message .= "Wpplugins.tips Team" . "\n";
1199
+
1200
+ $headers = array();
1201
+ $headers[] = 'From: Hide My WP <' . $from . '>';
1202
+ $headers[] = 'Content-type: text/plain';
1203
+
1204
+ add_filter( 'wp_mail_content_type', array( 'HMW_Classes_Tools', 'setContentType' ) );
1205
+
1206
+ if ( @wp_mail( $to, $subject, $message, $headers ) ) {
1207
+ return true;
1208
+ }
1209
+
1210
+ return false;
1211
+ }
1212
+
1213
+ /**
1214
+ * Set the content type to text/plain
1215
+ * @return string
1216
+ */
1217
+ public static function setContentType() {
1218
+ return "text/plain";
1219
+ }
1220
+
1221
+ /**
1222
+ * Return false on hooks
1223
+ *
1224
+ * @param string $param
1225
+ *
1226
+ * @return bool
1227
+ */
1228
+ public static function returnFalse( $param = null ) {
1229
+ return false;
1230
+ }
1231
+
1232
+ /**
1233
+ * Return true on hooks
1234
+ *
1235
+ * @param string $param
1236
+ *
1237
+ * @return bool
1238
+ */
1239
+ public static function returnTrue( $param = null ) {
1240
+ return true;
1241
+ }
1242
+
1243
+ }
config.json ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "blocks": {
3
+ "block": [
4
+ {
5
+ "name": "HMW_Controllers_Settings",
6
+ "actions": {
7
+ "action": [
8
+ "hmw_settings",
9
+ "hmw_tweakssettings",
10
+ "hmw_confirm",
11
+ "hmw_mappsettings",
12
+ "hmw_logout",
13
+ "hmw_abort",
14
+ "hmw_manualrewrite",
15
+ "hmw_advsettings",
16
+ "hmw_backup",
17
+ "hmw_restore",
18
+ "hmw_support",
19
+ "hmw_connect",
20
+ "hmw_dont_connect"
21
+ ]
22
+ },
23
+ "admin": "1",
24
+ "active": "1"
25
+ },
26
+ {
27
+ "name": "HMW_Controllers_Plugins",
28
+ "actions": {
29
+ "action": [
30
+ "hmw_plugin_install"
31
+ ]
32
+ },
33
+ "admin": "1",
34
+ "active": "1"
35
+ },
36
+ {
37
+ "name": "HMW_Controllers_SecurityCheck",
38
+ "actions": {
39
+ "action": [
40
+ "hmw_securitycheck",
41
+ "hmw_securityexclude",
42
+ "hmw_resetexclude"
43
+ ]
44
+ },
45
+ "admin": "1",
46
+ "active": "1"
47
+ },
48
+ {
49
+ "name": "HMW_Controllers_Brute",
50
+ "actions": {
51
+ "action": [
52
+ "hmw_brutesettings",
53
+ "hmw_blockedips",
54
+ "hmw_deleteip",
55
+ "hmw_deleteallips"
56
+ ]
57
+ },
58
+ "admin": "1",
59
+ "active": "1"
60
+ },
61
+ {
62
+ "name": "HMW_Controllers_Widget",
63
+ "actions": {
64
+ "action": "hmw_widget_securitycheck"
65
+ },
66
+ "admin": "1",
67
+ "active": "1"
68
+ },
69
+ {
70
+ "name": "HMW_Controllers_Notice",
71
+ "actions": {
72
+ "action": [
73
+ "hmw_disable_notice",
74
+ "hmw_ignore_notice"
75
+ ]
76
+ },
77
+ "admin": "1",
78
+ "active": "1"
79
+ }
80
+ ]
81
+ }
82
+ }
config/config.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
3
+
4
+ /**
5
+ * The configuration file
6
+ */
7
+ defined('HMW_REQUEST_TIME') || define('HMW_REQUEST_TIME', microtime(true));
8
+ defined('_HMW_NONCE_ID_') || define('_HMW_NONCE_ID_', NONCE_KEY);
9
+
10
+ //force Hide My Wp to load right after initialization
11
+ defined('HMW_PRIORITY') || define('HMW_PRIORITY', false);
12
+ //Force not to write the rules in config file
13
+ defined('HMW_RULES_IN_CONFIG') || define('HMW_RULES_IN_CONFIG', true);
14
+ //add HMW Rules in WordPress rewrite definition in htaccess
15
+ defined('HMW_RULES_IN_WP_RULES') || define('HMW_RULES_IN_WP_RULES', true);
16
+
17
+ if (!defined('PHP_VERSION_ID')) {
18
+ $version = explode('.', PHP_VERSION);
19
+ define('PHP_VERSION_ID', ((int) @$version[0] * 1000 + (int) @$version[1] * 100 + ((isset($version[2])) ? ((int) $version[2] * 10) : 0)));
20
+ }
21
+ if (!defined('WP_VERSION_ID') && isset($wp_version)) {
22
+ $version = explode('.', $wp_version);
23
+ define('WP_VERSION_ID', ((int) @$version[0] * 1000 + (int) @$version[1] * 100 + ((isset($version[2])) ? ((int) $version[2] * 10) : 0)));
24
+ }else{
25
+ !defined('WP_VERSION_ID') && define('WP_VERSION_ID', '3000');
26
+ }
27
+
28
+ if (!defined('HMW_VERSION_ID')) {
29
+ $version = explode('.', HMW_VERSION);
30
+ define('HMW_VERSION_ID', ((int) @$version[0] * 10000 + (int) @$version[1] * 1000 + ((isset($version[2])) ? ((int) $version[2] * 1) : 0)));
31
+ }
32
+
33
+ /* No path file? error ... */
34
+ require_once(dirname(__FILE__) . '/paths.php');
35
+
36
+ /* Define the record name in the Option and UserMeta tables */
37
+ define('HMW_OPTION', 'hmw_options');
38
+ define('HMW_OPTION_SAFE', 'hmw_options_safe');
config/paths.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') || die('Cheatin\' uh?');
3
+
4
+ $currentDir = dirname(__FILE__);
5
+
6
+ define('_HMW_NAMESPACE_', 'HMW');
7
+ define('_HMW_VER_NAME_', 'Lite');
8
+ define('_HMW_PLUGIN_NAME_', 'hide-my-wp');
9
+ defined('_HMW_SUPPORT_SITE_') || define('_HMW_SUPPORT_SITE_', 'https://wpplugins.tips');
10
+ defined('_HMW_ACCOUNT_SITE_') || define('_HMW_ACCOUNT_SITE_', 'https://account.wpplugins.tips');
11
+ defined('_HMW_API_SITE_') || define('_HMW_API_SITE_', _HMW_ACCOUNT_SITE_);
12
+ define('_HMW_SUPPORT_EMAIL_', 'contact@wpplugins.tips');
13
+
14
+ /* Directories */
15
+ define('_HMW_ROOT_DIR_', realpath($currentDir . '/..'));
16
+ define('_HMW_CLASSES_DIR_', _HMW_ROOT_DIR_ . '/classes/');
17
+ define('_HMW_CONTROLLER_DIR_', _HMW_ROOT_DIR_ . '/controllers/');
18
+ define('_HMW_MODEL_DIR_', _HMW_ROOT_DIR_ . '/models/');
19
+ define('_HMW_TRANSLATIONS_DIR_', _HMW_ROOT_DIR_ . '/languages/');
20
+ define('_HMW_THEME_DIR_', _HMW_ROOT_DIR_ . '/view/');
21
+
22
+ /* URLS */
23
+ define('_HMW_URL_', plugins_url() . '/' . _HMW_PLUGIN_NAME_);
24
+ define('_HMW_THEME_URL_', _HMW_URL_ . '/view/');
controllers/Brute.php ADDED
@@ -0,0 +1,281 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') || die('Cheatin\' uh?');
3
+
4
+ class HMW_Controllers_Brute extends HMW_Classes_FrontController {
5
+
6
+ public function __construct() {
7
+ parent::__construct();
8
+
9
+ add_action('admin_init', array($this, 'hmw_update_trusted_headers'), 99);
10
+ add_filter('authenticate', array($this, 'hmw_check_preauth'), 99, 1);
11
+
12
+ if (HMW_Classes_Tools::getOption('brute_use_math')) {
13
+ add_action('wp_login_failed', array($this, 'hmw_failed_attempt'), 99);
14
+ add_action('login_form', array($this->model, 'brute_math_form'), 99);
15
+ add_filter('woocommerce_login_form', array($this->model, 'brute_math_form'), 99);
16
+ }
17
+ }
18
+
19
+ public function hookFrontinit() {
20
+ if (!is_user_logged_in()) {
21
+ //Load the Multilanguage
22
+ HMW_Classes_Tools::loadMultilanguage();
23
+
24
+ $this->bruteBlockCheck();
25
+ }
26
+ }
27
+
28
+ public function bruteBlockCheck() {
29
+ $response = $this->model->brute_call('check_ip');
30
+ if ($response['status'] == 'blocked') {
31
+ if (!$this->model->check_whitelisted_ip($this->model->brute_get_ip())) {
32
+ wp_ob_end_flush_all();
33
+ wp_die(HMW_Classes_Tools::getOption('hmw_brute_message'),
34
+ __('IP Blocked by Hide My WordPress Brute Force Protection', _HMW_PLUGIN_NAME_),
35
+ array('response' => 403)
36
+ );
37
+ }
38
+ }
39
+ }
40
+
41
+ /**
42
+ * Called when an action is triggered
43
+ *
44
+ * @return void
45
+ */
46
+ public function action() {
47
+ parent::action();
48
+
49
+ switch (HMW_Classes_Tools::getValue('action')) {
50
+
51
+ case 'hmw_brutesettings':
52
+ HMW_Classes_Tools::saveOptions('hmw_bruteforce', HMW_Classes_Tools::getValue('hmw_bruteforce'));
53
+
54
+ //whitelist_ip
55
+ $whitelist = HMW_Classes_Tools::getValue('whitelist_ip', '', true);
56
+ $ips = explode(PHP_EOL, $whitelist);
57
+ foreach ($ips as &$ip) {
58
+ $ip = $this->model->clean_ip($ip);
59
+
60
+ // If the IP is in a private or reserved range, keep looking
61
+ if ($ip == '127.0.0.1' || $ip == '::1') {
62
+ HMW_Classes_Error::setError(__("Add only real IPs. No local ips needed.", _HMW_PLUGIN_NAME_));
63
+ }
64
+ }
65
+ if (!empty($ips)) {
66
+ $ips = array_unique($ips);
67
+ HMW_Classes_Tools::saveOptions('whitelist_ip', json_encode($ips));
68
+ }
69
+
70
+ //banlist_ip
71
+ $banlist = HMW_Classes_Tools::getValue('banlist_ip', '', true);
72
+ $ips = explode(PHP_EOL, $banlist);
73
+ foreach ($ips as &$ip) {
74
+ $ip = $this->model->clean_ip($ip);
75
+
76
+ // If the IP is in a private or reserved range, keep looking
77
+ if ($ip == '127.0.0.1' || $ip == '::1') {
78
+ HMW_Classes_Error::setError(__("Add only real IPs. No local ips allowed.", _HMW_PLUGIN_NAME_));
79
+ }
80
+ }
81
+ if (!empty($ips)) {
82
+ $ips = array_unique($ips);
83
+ HMW_Classes_Tools::saveOptions('banlist_ip', json_encode($ips));
84
+ }
85
+
86
+ //Brute force math option
87
+ HMW_Classes_Tools::saveOptions('brute_use_math', HMW_Classes_Tools::getValue('brute_use_math', 0));
88
+ if (HMW_Classes_Tools::getValue('brute_use_math', 0)) {
89
+ $attempts = HMW_Classes_Tools::getValue('brute_max_attempts');
90
+ if ((int)$attempts <= 0) {
91
+ $attempts = 3;
92
+ HMW_Classes_Error::setError(__('You need to set a positive number of attempts ', _HMW_PLUGIN_NAME_));
93
+
94
+ }
95
+ HMW_Classes_Tools::saveOptions('brute_max_attempts', (int)$attempts);
96
+
97
+ $timeout = HMW_Classes_Tools::getValue('brute_max_timeout');
98
+ if ((int)$timeout <= 0) {
99
+ $timeout = 3600;
100
+ HMW_Classes_Error::setError(__('You need to set a positive waiting time', _HMW_PLUGIN_NAME_));
101
+
102
+ }
103
+ HMW_Classes_Tools::saveOptions('hmw_brute_message', HMW_Classes_Tools::getValue('hmw_brute_message', '', true));
104
+ HMW_Classes_Tools::saveOptions('brute_max_timeout', $timeout);
105
+ }
106
+
107
+ HMW_Classes_Error::setError(__('Saved'), 'success');
108
+
109
+ HMW_Classes_Tools::emptyCache();
110
+ break;
111
+ case 'hmw_deleteip':
112
+ $transient = HMW_Classes_Tools::getValue('transient', null);
113
+ if (isset($transient)) {
114
+ $this->model->delete_ip($transient);
115
+ }
116
+
117
+ break;
118
+ case 'hmw_deleteallips':
119
+ $this->clearBlockedIPs();
120
+ break;
121
+
122
+ case 'hmw_blockedips':
123
+ HMW_Classes_Tools::setHeader('json');
124
+ $data = $this->getBlockedIps();
125
+ echo json_encode(array('data' => $data));
126
+ exit();
127
+ }
128
+ }
129
+
130
+ public function getBlockedIps() {
131
+ $data = '<table class="table table-striped" >';
132
+ $ips = $this->model->get_blocked_ips();
133
+ $data .= "<tr>
134
+ <th>" . __('Cnt', _HMW_PLUGIN_NAME_) . "</th>
135
+ <th>" . __('IP', _HMW_PLUGIN_NAME_) . "</th>
136
+ <th>" . __('Fail Attempts', _HMW_PLUGIN_NAME_) . "</th>
137
+ <th>" . __('Hostname', _HMW_PLUGIN_NAME_) . "</th>
138
+ <th>" . __('Options', _HMW_PLUGIN_NAME_) . "</th>
139
+ </tr>";
140
+ if (!empty($ips)) {
141
+ $cnt = 1;
142
+ foreach ($ips as $transient => $ip) {
143
+ $data .= "<tr>
144
+ <td>" . $cnt . "</td>
145
+ <td>{$ip['ip']}</td>
146
+ <td>{$ip['attempts']}</td>
147
+ <td>{$ip['host']}</td>
148
+ <td class=\"col-md-2 \"> <form method=\"POST\">
149
+ " . wp_nonce_field('hmw_deleteip', 'hmw_nonce', true, false) . "
150
+ <input type=\"hidden\" name=\"action\" value=\"hmw_deleteip\" />
151
+ <input type=\"hidden\" name=\"transient\" value=\"" . $transient . "\" />
152
+ <input type=\"submit\" class=\"btn rounded-0 btn-default save no-p-v\" value=\"Unlock\" />
153
+ </form>
154
+ </td>
155
+ </tr>";
156
+ $cnt++;
157
+ }
158
+ } else {
159
+ $data .= "<tr>
160
+ <td colspan='5'>" . _('No blacklisted ips') . "</td>
161
+ </tr>";
162
+ }
163
+ $data .= '</table>';
164
+
165
+ return $data;
166
+ }
167
+
168
+
169
+ /**
170
+ * Checks for loginability BEFORE authentication so that bots don't get to go around the log in form.
171
+ *
172
+ * If we are using our math fallback, authenticate via math-fallback.php
173
+ *
174
+ * @param string $user Passed via WordPress action. Not used.
175
+ *
176
+ * @return bool True, if WP_Error. False, if not WP_Error., $user Containing the auth results
177
+ */
178
+ function hmw_check_preauth($user = '') {
179
+ if (is_wp_error($user)) {
180
+ if (method_exists($user, 'get_error_codes')) {
181
+ $errors = $user->get_error_codes();
182
+
183
+ if (!empty($errors)) {
184
+ foreach ($errors as $error) {
185
+ if ($error == 'empty_username' || $error == 'empty_password') {
186
+ return $user;
187
+ }
188
+ }
189
+ }
190
+ }
191
+ }
192
+
193
+ $response = $this->model->brute_check_loginability();
194
+
195
+ if (!HMW_Classes_Tools::getOption('brute_use_math')) {
196
+ if (is_wp_error($user)) {
197
+ if (!isset($response['attempts'])) {
198
+ $response['attempts'] = 0;
199
+ }
200
+ $left = max(((int)HMW_Classes_Tools::getOption('brute_max_attempts') - (int)$response['attempts']), 0);
201
+ $user = new WP_Error('authentication_failed',
202
+ sprintf(__('<strong>ERROR:</strong> Email or Password is incorrect. <br /> %d attempts left before lockout', _HMW_PLUGIN_NAME_), $left)
203
+ );
204
+ }
205
+ } elseif (HMW_Classes_Tools::getOption('brute_use_math')) {
206
+ $user = $this->model->brute_math_authenticate($user, $response);
207
+ }
208
+
209
+ if (!is_wp_error($user)) {
210
+ $this->model->brute_call('clear_ip');
211
+ }
212
+
213
+ return $user;
214
+ }
215
+
216
+ /**
217
+ * Called via WP action wp_login_failed to log failed attempt in db
218
+ *
219
+ * @return void
220
+ */
221
+ function hmw_failed_attempt() {
222
+ $this->model->brute_call('failed_attempt');
223
+ }
224
+
225
+ public function hmw_update_trusted_headers() {
226
+ $updated_recently = $this->model->get_transient('brute_headers_updated_recently');
227
+
228
+ // check that current user is admin so we prevent a lower level user from adding
229
+ // a trusted header, allowing them to brute force an admin account
230
+ if (!$updated_recently && current_user_can('update_plugins')) {
231
+
232
+ $this->model->set_transient('brute_headers_updated_recently', 1, DAY_IN_SECONDS);
233
+
234
+ $headers = $this->model->brute_get_headers();
235
+ $trusted_header = 'REMOTE_ADDR';
236
+
237
+ if (count($headers) == 1) {
238
+ $trusted_header = key($headers);
239
+ } elseif (count($headers) > 1) {
240
+ foreach ($headers as $header => $ips) {
241
+ //explode string into array
242
+ $ips = explode(', ', $ips);
243
+
244
+ $ip_list_has_nonprivate_ip = false;
245
+ foreach ($ips as $ip) {
246
+ //clean the ips
247
+ $ip = $this->model->clean_ip($ip);
248
+
249
+ // If the IP is in a private or reserved range, return REMOTE_ADDR to help prevent spoofing
250
+ if ($ip == '127.0.0.1' || $ip == '::1' || $this->model->ip_is_private($ip)) {
251
+ continue;
252
+ } else {
253
+ $ip_list_has_nonprivate_ip = true;
254
+ break;
255
+ }
256
+ }
257
+
258
+ if (!$ip_list_has_nonprivate_ip) {
259
+ continue;
260
+ }
261
+
262
+ // IP is not local, we'll trust this header
263
+ $trusted_header = $header;
264
+ break;
265
+ }
266
+ }
267
+ HMW_Classes_Tools::saveOptions('trusted_ip_header', $trusted_header);
268
+ }
269
+ }
270
+
271
+ public function clearBlockedIPs() {
272
+ $ips = $this->model->get_blocked_ips();
273
+ if (!empty($ips)) {
274
+ foreach ($ips as $transient => $ip) {
275
+ $this->model->delete_ip($transient);
276
+ }
277
+ }
278
+ }
279
+
280
+
281
+ }
controllers/Menu.php ADDED
@@ -0,0 +1,248 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') || die('Cheatin\' uh?');
3
+
4
+ class HMW_Controllers_Menu extends HMW_Classes_FrontController {
5
+
6
+ public $alert = '';
7
+
8
+ /**
9
+ * Hook the Admin load
10
+ */
11
+ public function hookInit() {
12
+ /* add the plugin menu in admin */
13
+ if (current_user_can('manage_options')) {
14
+ //check if activated
15
+ if (get_transient('hmw_activate') == 1) {
16
+ // Delete the redirect transient
17
+ delete_transient('hmw_activate');
18
+
19
+ //Make sure the plugin is loaded first
20
+ $plugin = _HMW_PLUGIN_NAME_ . '/index.php';
21
+ $active_plugins = get_option('active_plugins');
22
+ if(!empty($active_plugins)) {
23
+ $this_plugin_key = array_search($plugin, $active_plugins);
24
+ if($this_plugin_key <> '') {
25
+ array_splice($active_plugins, $this_plugin_key, 1);
26
+ array_unshift($active_plugins, $plugin);
27
+ update_option('active_plugins', $active_plugins);
28
+ }
29
+ }
30
+
31
+ //Check if there are expected upgrades
32
+ HMW_Classes_Tools::checkUpgrade();
33
+ }
34
+
35
+
36
+
37
+ //Load notice class in admin
38
+ HMW_Classes_ObjController::getClass('HMW_Controllers_Notice');
39
+
40
+ //Show Dashboard Box
41
+ add_action('wp_dashboard_setup', array($this, 'hookDashboardSetup'));
42
+
43
+
44
+ if (HMW_Classes_Tools::getValue('page', false) == 'hmw_settings') {
45
+ add_action('admin_enqueue_scripts', array($this->model, 'fixEnqueueErrors'), PHP_INT_MAX);
46
+ }
47
+ }
48
+
49
+ }
50
+
51
+ /**
52
+ * Creates the Setting menu in WordPress
53
+ */
54
+ public function hookMenu() {
55
+ if (!is_multisite() && current_user_can('manage_options')) {
56
+ $this->model->addMenu(array(ucfirst(_HMW_PLUGIN_NAME_),
57
+ 'Hide My WP' . $this->alert,
58
+ 'manage_options',
59
+ 'hmw_settings',
60
+ null,
61
+ _HMW_THEME_URL_ . 'img/logo_16.png'
62
+ ));
63
+
64
+ /* add the Hide My WP admin menu */
65
+ $this->model->addSubmenu(array('hmw_settings',
66
+ __('Hide My WP - Customize Permalinks', _HMW_PLUGIN_NAME_),
67
+ __('Change Paths', _HMW_PLUGIN_NAME_),
68
+ 'manage_options',
69
+ 'hmw_settings',
70
+ array(HMW_Classes_ObjController::getClass('HMW_Controllers_Settings'), 'init')
71
+ ));
72
+
73
+ $this->model->addSubmenu(array('hmw_settings',
74
+ __('Hide My WP - Mapping', _HMW_PLUGIN_NAME_),
75
+ __('Mapping', _HMW_PLUGIN_NAME_),
76
+ 'manage_options',
77
+ 'hmw_settings-hmw_mapping',
78
+ array(HMW_Classes_ObjController::getClass('HMW_Controllers_Settings'), 'init')
79
+ ));
80
+
81
+ $this->model->addSubmenu(array('hmw_settings',
82
+ __('Hide My WP - Tweaks', _HMW_PLUGIN_NAME_),
83
+ __('Tweaks', _HMW_PLUGIN_NAME_),
84
+ 'manage_options',
85
+ 'hmw_settings-hmw_tweaks',
86
+ array(HMW_Classes_ObjController::getClass('HMW_Controllers_Settings'), 'init')
87
+ ));
88
+
89
+
90
+ $this->model->addSubmenu(array('hmw_settings',
91
+ __('Hide My WP - Brute Force Protection', _HMW_PLUGIN_NAME_),
92
+ __('Brute Force Protection', _HMW_PLUGIN_NAME_),
93
+ 'manage_options',
94
+ 'hmw_settings-hmw_brute',
95
+ array(HMW_Classes_ObjController::getClass('HMW_Controllers_Settings'), 'init')
96
+ ));
97
+
98
+
99
+ $this->model->addSubmenu(array('hmw_settings',
100
+ __('Hide My WP - Log Events', _HMW_PLUGIN_NAME_),
101
+ __('Log Events', _HMW_PLUGIN_NAME_),
102
+ 'manage_options',
103
+ 'hmw_settings-hmw_log',
104
+ array(HMW_Classes_ObjController::getClass('HMW_Controllers_Settings'), 'init')
105
+ ));
106
+
107
+ /* add the security check in menu */
108
+ $this->model->addSubmenu(array('hmw_settings',
109
+ __('Hide My WP - Security Check', _HMW_PLUGIN_NAME_),
110
+ __('Security Check', _HMW_PLUGIN_NAME_) . $this->alert,
111
+ 'manage_options',
112
+ 'hmw_securitycheck',
113
+ array(HMW_Classes_ObjController::getClass('HMW_Controllers_SecurityCheck'), 'show')
114
+ ));
115
+
116
+ $this->model->addSubmenu(array('hmw_settings',
117
+ __('Hide My WP - Recommended Plugins', _HMW_PLUGIN_NAME_),
118
+ __('Install Plugins', _HMW_PLUGIN_NAME_),
119
+ 'manage_options',
120
+ 'hmw_settings-hmw_plugins',
121
+ array(HMW_Classes_ObjController::getClass('HMW_Controllers_Settings'), 'init')
122
+ ));
123
+
124
+ $this->model->addSubmenu(array('hmw_settings',
125
+ __('Hide My WP - Backup & Restore', _HMW_PLUGIN_NAME_),
126
+ __('Backup/Restore', _HMW_PLUGIN_NAME_),
127
+ 'manage_options',
128
+ 'hmw_settings-hmw_backup',
129
+ array(HMW_Classes_ObjController::getClass('HMW_Controllers_Settings'), 'init')
130
+ ));
131
+
132
+ $this->model->addSubmenu(array('hmw_settings',
133
+ __('Hide My WP - Advanced Settings', _HMW_PLUGIN_NAME_),
134
+ __('Advanced', _HMW_PLUGIN_NAME_),
135
+ 'manage_options',
136
+ 'hmw_settings-hmw_advanced',
137
+ array(HMW_Classes_ObjController::getClass('HMW_Controllers_Settings'), 'init')
138
+ ));
139
+
140
+
141
+ }
142
+ }
143
+
144
+ public function hookDashboardSetup(){
145
+ wp_add_dashboard_widget(
146
+ 'hmw_dashboard_widget',
147
+ __('Hide My WP',_HMW_PLUGIN_NAME_),
148
+ array(HMW_Classes_ObjController::getClass('HMW_Controllers_Widget'), 'dashboard')
149
+ );
150
+
151
+ // Move our widget to top.
152
+ global $wp_meta_boxes;
153
+
154
+ $dashboard = $wp_meta_boxes['dashboard']['normal']['core'];
155
+ $ours = array( 'hmw_dashboard_widget' => $dashboard['hmw_dashboard_widget'] );
156
+ $wp_meta_boxes['dashboard']['normal']['core'] = array_merge( $ours, $dashboard );
157
+ }
158
+
159
+
160
+ /**
161
+ * Creates the Setting menu in Multisite WordPress
162
+ */
163
+ public function hookMultisiteMenu() {
164
+
165
+ $this->model->addMenu(array(ucfirst(_HMW_PLUGIN_NAME_),
166
+ 'Hide My WP' . $this->alert,
167
+ 'manage_options',
168
+ 'hmw_settings',
169
+ null,
170
+ _HMW_THEME_URL_ . 'img/logo_16.png'
171
+ ));
172
+
173
+ /* add the Hide My WP admin menu */
174
+ $this->model->addSubmenu(array('hmw_settings',
175
+ __('Hide My WP - Customize Permalinks', _HMW_PLUGIN_NAME_),
176
+ __('Change Paths', _HMW_PLUGIN_NAME_),
177
+ 'manage_options',
178
+ 'hmw_settings',
179
+ array(HMW_Classes_ObjController::getClass('HMW_Controllers_Settings'), 'init')
180
+ ));
181
+
182
+ $this->model->addSubmenu(array('hmw_settings',
183
+ __('Hide My WP - Mapping', _HMW_PLUGIN_NAME_),
184
+ __('Mapping', _HMW_PLUGIN_NAME_),
185
+ 'manage_options',
186
+ 'hmw_settings-hmw_mapping',
187
+ array(HMW_Classes_ObjController::getClass('HMW_Controllers_Settings'), 'init')
188
+ ));
189
+
190
+ $this->model->addSubmenu(array('hmw_settings',
191
+ __('Hide My WP - Tweaks', _HMW_PLUGIN_NAME_),
192
+ __('Tweaks', _HMW_PLUGIN_NAME_),
193
+ 'manage_options',
194
+ 'hmw_settings-hmw_tweaks',
195
+ array(HMW_Classes_ObjController::getClass('HMW_Controllers_Settings'), 'init')
196
+ ));
197
+
198
+
199
+ $this->model->addSubmenu(array('hmw_settings',
200
+ __('Hide My WP - Brute Force Protection', _HMW_PLUGIN_NAME_),
201
+ __('Brute Force Protection', _HMW_PLUGIN_NAME_),
202
+ 'manage_options',
203
+ 'hmw_settings-hmw_brute',
204
+ array(HMW_Classes_ObjController::getClass('HMW_Controllers_Settings'), 'init')
205
+ ));
206
+
207
+ $this->model->addSubmenu(array('hmw_settings',
208
+ __('Hide My WP - Log Events', _HMW_PLUGIN_NAME_),
209
+ __('Log Events', _HMW_PLUGIN_NAME_),
210
+ 'manage_options',
211
+ 'hmw_settings-hmw_log',
212
+ array(HMW_Classes_ObjController::getClass('HMW_Controllers_Settings'), 'init')
213
+ ));
214
+
215
+ /* add the security check in menu */
216
+ $this->model->addSubmenu(array('hmw_settings',
217
+ __('Hide My WP - Security Check', _HMW_PLUGIN_NAME_),
218
+ __('Security Check', _HMW_PLUGIN_NAME_) . $this->alert,
219
+ 'manage_options',
220
+ 'hmw_securitycheck',
221
+ array(HMW_Classes_ObjController::getClass('HMW_Controllers_SecurityCheck'), 'show')
222
+ ));
223
+
224
+ $this->model->addSubmenu(array('hmw_settings',
225
+ __('Hide My WP - Recommended Plugins', _HMW_PLUGIN_NAME_),
226
+ __('Install Plugins', _HMW_PLUGIN_NAME_),
227
+ 'manage_options',
228
+ 'hmw_settings-hmw_plugins',
229
+ array(HMW_Classes_ObjController::getClass('HMW_Controllers_Settings'), 'init')
230
+ ));
231
+
232
+ $this->model->addSubmenu(array('hmw_settings',
233
+ __('Hide My WP - Backup & Restore', _HMW_PLUGIN_NAME_),
234
+ __('Backup/Restore', _HMW_PLUGIN_NAME_),
235
+ 'manage_options',
236
+ 'hmw_settings-hmw_backup',
237
+ array(HMW_Classes_ObjController::getClass('HMW_Controllers_Settings'), 'init')
238
+ ));
239
+
240
+ $this->model->addSubmenu(array('hmw_settings',
241
+ __('Hide My WP - Advanced Settings', _HMW_PLUGIN_NAME_),
242
+ __('Advanced', _HMW_PLUGIN_NAME_),
243
+ 'manage_options',
244
+ 'hmw_settings-hmw_advanced',
245
+ array(HMW_Classes_ObjController::getClass('HMW_Controllers_Settings'), 'init')
246
+ ));
247
+ }
248
+ }
controllers/Notice.php ADDED
@@ -0,0 +1,174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') || die('Cheatin\' uh?');
3
+
4
+ class HMW_Controllers_Notice extends HMW_Classes_FrontController {
5
+
6
+ protected $notice_spam = 0;
7
+
8
+ public function __construct() {
9
+ parent::__construct();
10
+ add_action('admin_notices', array($this, 'hmw_admin_notices'));
11
+
12
+ //check if notice is disabled
13
+ $this->action();
14
+
15
+ }
16
+
17
+ /**
18
+ * Show the notifications for review
19
+ * @param $notices
20
+ */
21
+ public function hmw_admin_notices($notices) {
22
+ global $wp;
23
+
24
+ if (!isset($notices) || !is_array($notices)) {
25
+ $notices = array();
26
+ }
27
+ $disable = '<form id="hmw_notice_form" method="POST">
28
+ ' . wp_nonce_field('hmw_disable_notice', 'hmw_nonce', true, false) . '
29
+ <input type="hidden" name="action" value="hmw_disable_notice" />
30
+ <input type="hidden" name="hmw_admin_notice" value="two_week_review">
31
+ <i type="submit" class="dashicons dashicons-no" style="cursor: pointer" title="'.__('Close notification', _HMW_PLUGIN_NAME_).'" onclick="jQuery(\'#hmw_notice_form\').submit();"></i>
32
+ </form>';
33
+ if (is_string($disable) && $disable <> '') {
34
+ $notices['two_week_review'] = array(
35
+ 'title' => __('Thank you for using Hide My WP?', _HMW_PLUGIN_NAME_),
36
+ 'msg' => sprintf(__("Add %sXML-RPC attack protection, SQL/Script firewall, reCaptcha login%s and more with Hide My WP Ghost premium features.", _HMW_PLUGIN_NAME_), '<strong style="color: red">', '</strong>', '<strong style="color: red">', '</strong>'),
37
+ 'link' => '<li><i class="dashicons dashicons-external" style="line-height: 25px;"></i><a href="https://hidemywpghost.com/hide-my-wp/" target="_blank" style="font-weight: normal">' . __("See all premium features", _HMW_PLUGIN_NAME_) . '</a></li>',
38
+
39
+ 'later_link' => $disable,
40
+ 'int' => 14
41
+ );
42
+ }
43
+ HMW_Classes_ObjController::getClass('HMW_Classes_Error')->hookNotices();
44
+ $this->showMessage($notices);
45
+
46
+ }
47
+
48
+ /**
49
+ * Primary notice function that can be called from an outside function sending necessary variables
50
+ *
51
+ * @param $notices
52
+ * @return bool|void
53
+ */
54
+ public function showMessage($notices) {
55
+ foreach ($notices as $slug => $notice) {
56
+ // Check for required fields
57
+ if (!$this->required_fields($notice)) {
58
+ // Call for spam protection
59
+ if ($this->anti_notice_spam()) {
60
+ return;
61
+ }
62
+
63
+ // Get the current date then set start date to either passed value or current date value and add interval
64
+ $current_date = current_time("n/j/Y");
65
+ $start = (isset($notice['start']) ? $notice['start'] : $current_date);
66
+ $interval = (isset($notice['int']) ? $notice['int'] : 0);
67
+ $start = date("n/j/Y", strtotime("+$interval DAY", strtotime($start)));
68
+
69
+ // This is the main notices storage option
70
+ $notices_option = HMW_Classes_Tools::getOption('admin_notice');
71
+
72
+ // Check if the message is already stored and if so just grab the key otherwise store the message and its associated date information
73
+ if (!is_array($notices_option)) {
74
+ $notices_option = array();
75
+ }
76
+ if (!array_key_exists($slug, $notices_option)) {
77
+
78
+ $notices_option[$slug]['start'] = $start;
79
+ $notices_option[$slug]['int'] = $interval;
80
+ HMW_Classes_Tools::saveOptions('admin_notice', $notices_option);
81
+ }
82
+
83
+
84
+ // Sanity check to ensure we have accurate information
85
+ // New date information will not overwrite old date information
86
+ $admin_display_check = (isset($notices_option[$slug]['dismissed']) ? $notices_option[$slug]['dismissed'] : 0);
87
+ $admin_display_start = (isset($notices_option[$slug]['start']) ? $notices_option[$slug]['start'] : $start);
88
+ $admin_display_msg = (isset($notice['msg']) ? $notice['msg'] : '');
89
+ $admin_display_link = (isset($notice['link']) ? $notice['link'] : '');
90
+ $output_css = false;
91
+
92
+
93
+ // Ensure the notice hasn't been hidden and that the current date is after the start date
94
+ if ($admin_display_check == 0 && strtotime($admin_display_start) <= strtotime($current_date)) {
95
+
96
+ // Get remaining query string
97
+ $query_str = (isset($notice['later_link']) ? $notice['later_link'] : '<a href="' . esc_url(add_query_arg('hmw_admin_notice', $slug)) . '" class="dashicons dashicons-dismiss"></a>');
98
+ // Admin notice display output
99
+ echo '<div class="update-nag hmw-admin-notice">
100
+ <div style="float: right; margin: 10px;">'.$query_str.'</div>
101
+ <div class="' . 'hmw-notice-logo"></div>
102
+ <p class="hmw-notice-body">' . $admin_display_msg . '</p>
103
+ <ul class="hmw-notice-body hmw-blue">' . $admin_display_link . '</ul>
104
+
105
+ </div>';
106
+
107
+ $this->notice_spam += 1;
108
+ $output_css = true;
109
+ }
110
+
111
+ if ($output_css) {
112
+ HMW_Classes_ObjController::getClass('HMW_Classes_DisplayController')->loadMedia('notice');
113
+ }
114
+ }
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Called when an action is triggered
120
+ *
121
+ * @return void
122
+ */
123
+ public function action() {
124
+ parent::action();
125
+
126
+
127
+ switch (HMW_Classes_Tools::getValue('action')) {
128
+
129
+ case 'hmw_disable_notice':
130
+ $notices_option = HMW_Classes_Tools::getOption('admin_notice');
131
+ if (is_array($notices_option)) {
132
+ $notices_option[HMW_Classes_Tools::getValue('hmw_admin_notice')]['dismissed'] = 1;
133
+ HMW_Classes_Tools::saveOptions('admin_notice', $notices_option);
134
+ }
135
+ break;
136
+ case 'hmw_ignore_notice':
137
+ $notices_option = HMW_Classes_Tools::getOption('admin_notice');
138
+ $new_start = date("n/j/Y", strtotime("+90 DAY"));
139
+
140
+ $notices_option[HMW_Classes_Tools::getValue('hmw_admin_notice')]['start'] = $new_start;
141
+ $notices_option[HMW_Classes_Tools::getValue('hmw_admin_notice')]['dismissed'] = 0;
142
+ HMW_Classes_Tools::saveOptions('admin_notice', $notices_option);
143
+ break;
144
+ }
145
+ }
146
+
147
+
148
+ /**
149
+ * Spam protection check
150
+ * @return bool
151
+ */
152
+ public function anti_notice_spam() {
153
+ if ($this->notice_spam >= 1) {
154
+ return true;
155
+ }
156
+ return false;
157
+ }
158
+
159
+ /**
160
+ * Required fields check
161
+ * @param $fields
162
+ * @return bool
163
+ */
164
+ public function required_fields($fields) {
165
+ if (!isset($fields['msg']) || (isset($fields['msg']) && empty($fields['msg']))) {
166
+ return true;
167
+ }
168
+ if (!isset($fields['title']) || (isset($fields['title']) && empty($fields['title']))) {
169
+ return true;
170
+ }
171
+ return false;
172
+ }
173
+
174
+ }
controllers/Plugins.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') || die('Cheatin\' uh?');
3
+
4
+ require_once(ABSPATH . 'wp-admin/includes/class-wp-upgrader.php');
5
+
6
+ class QuietSkin extends \WP_Upgrader_Skin {
7
+ public function feedback($string) { /* no output */ }
8
+ }
9
+
10
+ class HMW_Controllers_Plugins extends HMW_Classes_FrontController {
11
+
12
+ public function action() {
13
+ parent::action();
14
+
15
+ if (!current_user_can('manage_options')) {
16
+ return;
17
+ }
18
+
19
+ switch (HMW_Classes_Tools::getValue('action')) {
20
+ case 'hmw_plugin_install':
21
+ HMW_Classes_Tools::setHeader('json');
22
+
23
+ if (HMW_Classes_Tools::getValue('plugin', '') <> '') {
24
+ $plugins = HMW_Classes_ObjController::getClass('HMW_Models_Settings')->getPlugins();
25
+ $pluginPath = false;
26
+
27
+ foreach ($plugins as $plugin => $details) {
28
+ if ($plugin == HMW_Classes_Tools::getValue('plugin')) {
29
+ $pluginPath = WP_PLUGIN_DIR . '/' . $details['path'];
30
+ break;
31
+ }
32
+ }
33
+
34
+ if (!empty($plugin) && $pluginPath) {
35
+ if (!file_exists($pluginPath)) {
36
+
37
+ //includes necessary for Plugin_Upgrader and Plugin_Installer_Skin
38
+ require_once(ABSPATH . 'wp-admin/includes/plugin-install.php');
39
+ include_once(ABSPATH . 'wp-admin/includes/file.php');
40
+ include_once(ABSPATH . 'wp-admin/includes/misc.php');
41
+ include_once(ABSPATH . 'wp-admin/includes/class-wp-upgrader.php');
42
+
43
+ remove_all_actions('upgrader_process_complete');
44
+
45
+
46
+ $api = plugins_api('plugin_information', array(
47
+ 'slug' => $plugin,
48
+ 'fields' => array(
49
+ 'short_description' => false,
50
+ 'sections' => false,
51
+ 'requires' => false,
52
+ 'rating' => false,
53
+ 'ratings' => false,
54
+ 'downloaded' => false,
55
+ 'last_updated' => false,
56
+ 'added' => false,
57
+ 'tags' => false,
58
+ 'compatibility' => false,
59
+ 'homepage' => false,
60
+ 'donate_link' => false,
61
+ ),
62
+ ));
63
+
64
+ ob_start();
65
+ // Replace with new QuietSkin for no output
66
+ $upgrader = new Plugin_Upgrader(new QuietSkin(array('api' => $api)));
67
+ $upgrader->install($api->download_link);
68
+ ob_get_clean();
69
+ }
70
+
71
+ if (file_exists($pluginPath)) {
72
+ activate_plugin($pluginPath);
73
+ echo json_encode(array('success' => true));
74
+ } else {
75
+ echo json_encode(array('success' => false));
76
+ }
77
+ }
78
+
79
+ }
80
+ exit();
81
+ }
82
+ }
83
+ }
controllers/Rewrite.php ADDED
@@ -0,0 +1,318 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
3
+
4
+ class HMW_Controllers_Rewrite extends HMW_Classes_FrontController {
5
+
6
+ public function __construct() {
7
+ parent::__construct();
8
+
9
+ if ( defined( 'HMW_DISABLE' ) && HMW_DISABLE ) {
10
+ return;
11
+ }
12
+
13
+ //Start the buffer only if priority is set
14
+ if ( HMW_PRIORITY ) {
15
+ $this->model->startBuffer();
16
+ }
17
+
18
+ //Init the main hooks
19
+ $this->initHooks();
20
+ }
21
+
22
+ /**
23
+ * Init the hooks for hide my wp
24
+ */
25
+ public function initHooks() {
26
+ if ( HMW_Classes_Tools::isPermalinkStructure() ) {
27
+ if ( HMW_Classes_Tools::isApache() && ! HMW_Classes_Tools::isModeRewrite() ) {
28
+ return;
29
+ }
30
+
31
+ if ( ! HMW_Classes_Tools::getOption( 'error' ) && ! HMW_Classes_Tools::getOption( 'logout' ) ) {
32
+ //rename the author if set so
33
+ add_filter( 'author_rewrite_rules', array( $this->model, 'author_url' ), 99, 1 );
34
+ }
35
+
36
+ add_filter( 'query_vars', array( $this->model, 'addParams' ), 1, 1 );
37
+ add_action( 'login_init', array( $this->model, 'login_init' ), 1 );
38
+ add_filter( 'login_redirect', array( $this->model, 'sanitize_login_redirect' ), 9, 3 );
39
+ add_filter( 'wp_redirect', array( $this->model, 'sanitize_redirect' ), PHP_INT_MAX, 2 );
40
+
41
+ if ( HMW_Classes_Tools::isWpengine() ) {
42
+ add_filter( 'wp_redirect', array( $this->model, 'loopCheck' ), PHP_INT_MAX, 1 );
43
+ }
44
+
45
+ add_action( 'login_head', array( $this->model, 'login_head' ), PHP_INT_MAX );
46
+ add_action( 'wp_logout', array( $this->model, 'wp_logout' ), PHP_INT_MAX );
47
+
48
+ //change the admin url
49
+ add_filter( 'lostpassword_url', array( $this->model, 'lostpassword_url' ), PHP_INT_MAX, 1 );
50
+ add_filter( 'register', array( $this->model, 'register_url' ), PHP_INT_MAX, 1 );
51
+ add_filter( 'login_url', array( $this->model, 'login_url' ), PHP_INT_MAX, 1 );
52
+ add_filter( 'logout_url', array( $this->model, 'logout_url' ), PHP_INT_MAX, 2 );
53
+ add_filter( 'admin_url', array( $this->model, 'admin_url' ), PHP_INT_MAX, 3 );
54
+ add_filter( 'network_admin_url', array( $this->model, 'network_admin_url' ), PHP_INT_MAX, 3 );
55
+ add_filter( 'site_url', array( $this->model, 'site_url' ), PHP_INT_MAX, 2 );
56
+ add_filter( 'network_site_url', array( $this->model, 'site_url' ), PHP_INT_MAX, 3 );
57
+ add_filter( 'wp_php_error_message', array( $this->model, 'replace_error_message' ), PHP_INT_MAX, 2 );
58
+
59
+ //check and set the cookied for the modified urls
60
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Cookies' );
61
+ //load the compatibility class
62
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Compatibility' );
63
+ }
64
+
65
+ //Load the PluginLoaded Hook
66
+ add_action( 'plugins_loaded', array( $this, 'hookPreload' ), 1 );
67
+ //just to make sure it called in case plugins_loaded is not triggered
68
+ add_action( 'template_redirect', array( $this, 'hookPreload' ), 1 );
69
+
70
+ //in case of broken URL, try to load it
71
+ add_action( 'template_redirect', array(
72
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Files' ),
73
+ 'checkBrokenFile'
74
+ ), PHP_INT_MAX );
75
+
76
+ }
77
+
78
+
79
+ public function hookPreload() {
80
+ //if plugin_loaded then remove template_redirect
81
+ if ( ! did_action( 'template_redirect' ) ) {
82
+ remove_action( 'template_redirect', array( $this, 'hookPreload' ), 1 );
83
+ }
84
+
85
+ include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
86
+
87
+ //Make sure is permalink set up
88
+ if ( HMW_Classes_Tools::isPermalinkStructure() ) {
89
+ if ( HMW_Classes_Tools::isApache() && ! HMW_Classes_Tools::isModeRewrite() ) {
90
+ return;
91
+ }
92
+
93
+ //Don't go further if the safe parameter is set
94
+ if ( HMW_Classes_Tools::getIsset( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ) ) {
95
+ if ( HMW_Classes_Tools::getValue( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ) == HMW_Classes_Tools::getOption( 'hmw_disable' ) ) {
96
+ return;
97
+ }
98
+ }
99
+
100
+ //Build the find_replace list
101
+ $this->model->buildRedirect();
102
+
103
+ //don't let to rename and hide the current paths if logout is required
104
+ if ( HMW_Classes_Tools::getOption( 'error' ) || HMW_Classes_Tools::getOption( 'logout' ) ) {
105
+ return;
106
+ }
107
+
108
+ //stop here is the option is default.
109
+ //the prvious code is needed for settings change and validation
110
+ if ( HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'default' ) {
111
+ return;
112
+ }
113
+
114
+ //Hide the paths in ajax
115
+ if ( HMW_Classes_Tools::isAjax() ) {
116
+ $this->model->startBuffer();
117
+
118
+ //hide the URLs from admin and login
119
+ add_action( 'init', array( $this->model, 'hideUrls' ), 99 );
120
+
121
+ return;
122
+ }
123
+
124
+ //Check Compatibilities with ther plugins
125
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Compatibility' )->checkCompatibility();
126
+
127
+ //Start the Buffer if not late loading
128
+ $hmw_laterload = apply_filters( 'hmw_laterload', HMW_Classes_Tools::getOption( 'hmw_laterload' ) );
129
+
130
+ //check lateload
131
+ if ( $hmw_laterload && ! did_action( 'template_redirect' ) ) {
132
+ add_action( 'template_redirect', array( $this->model, 'startBuffer' ), PHP_INT_MAX );
133
+ } else {
134
+ //start the buffer now
135
+ $this->model->startBuffer();
136
+ }
137
+
138
+ //Check the buffer on shutdown
139
+ if ( HMW_Classes_Tools::getOption( 'hmw_shutdown_load' ) ) {
140
+ add_action( 'shutdown', array( $this->model, 'shutDownBuffer' ), 0 );
141
+ }
142
+
143
+ //hide the URLs from admin and login
144
+ add_action( 'init', array( $this->model, 'hideUrls' ), 99 );
145
+
146
+ //hide headers added by plugins
147
+ add_action( 'template_redirect', array( $this->model, 'hideHeaders' ), PHP_INT_MAX );
148
+
149
+ if ( ! is_admin() ) {
150
+ if ( HMW_Classes_Tools::getOption( 'hmw_hide_version' ) ) {
151
+ add_filter( 'the_generator', array( 'HMW_Classes_Tools', 'returnFalse' ), 99, 1 );
152
+ remove_action( 'wp_head', 'wp_generator' );
153
+ remove_action( 'wp_head', 'wp_resource_hints', 2 );
154
+ }
155
+
156
+ if ( HMW_Classes_Tools::getOption( 'hmw_disable_emojicons' ) ) {
157
+ //disable the emoji icons
158
+ $this->disable_emojicons();
159
+ }
160
+
161
+ if ( HMW_Classes_Tools::getOption( 'hmw_disable_rest_api' ) ) {
162
+ //disable the rest_api
163
+ if ( ! HMW_Classes_Tools::isPluginActive( 'contact-form-7/wp-contact-form-7.php' ) ) {
164
+ if ( ! function_exists( 'is_user_logged_in' ) || ( function_exists( 'is_user_logged_in' ) && ! is_user_logged_in() ) ) {
165
+ $this->disable_rest_api();
166
+ }
167
+ }
168
+ }
169
+
170
+ if ( HMW_Classes_Tools::getOption( 'hmw_disable_xmlrpc' ) ) {
171
+ add_filter( 'xmlrpc_enabled', array( 'HMW_Classes_Tools', 'returnFalse' ));
172
+ }
173
+
174
+ if ( HMW_Classes_Tools::getOption( 'hmw_disable_embeds' ) ) {
175
+ //disable the embeds
176
+ $this->disable_embeds();
177
+ }
178
+
179
+ //Windows Live Write
180
+ if ( HMW_Classes_Tools::getOption( 'hmw_disable_manifest' ) ) {
181
+ //disable the embeds
182
+ $this->disable_manifest();
183
+ }
184
+
185
+ //Really Simple Discovery
186
+ if ( HMW_Classes_Tools::getOption( 'hmw_hide_header' ) ) {
187
+ $this->disable_rds();
188
+ }
189
+
190
+ if ( HMW_Classes_Tools::getOption( 'hmw_hide_comments' ) ) {
191
+ $this->disable_comments();
192
+ }
193
+
194
+ //Disable Database Debug
195
+ if ( HMW_Classes_Tools::getOption( 'hmw_disable_debug' ) ) {
196
+ global $wpdb;
197
+ $wpdb->hide_errors();
198
+ }
199
+ }
200
+
201
+ }
202
+
203
+
204
+ }
205
+
206
+
207
+ /**
208
+ * On admin init
209
+ * Load the Menu
210
+ * If the user changes the Permalink to default ... prevent errors
211
+ */
212
+ public function hookInit() {
213
+ if ( HMW_Classes_Tools::getIsset( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ) ) {
214
+ if ( HMW_Classes_Tools::getValue( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ) == HMW_Classes_Tools::getOption( 'hmw_disable' ) ) {
215
+ return;
216
+ }
217
+ }
218
+
219
+ //If the user changes the Permalink to default ... prevent errors
220
+ if ( ! HMW_Classes_Tools::isPermalinkStructure() ) {
221
+ if ( current_user_can( 'manage_options' ) ) {
222
+ if ( HMW_Classes_Tools::$default['hmw_admin_url'] <> HMW_Classes_Tools::getOption( 'hmw_admin_url' ) ) {
223
+ $this->model->flushChanges();
224
+ }
225
+ }
226
+ }
227
+
228
+ //Show the menu for admins only
229
+ if ( current_user_can( 'manage_options' ) ) {
230
+ HMW_Classes_ObjController::getClass( 'HMW_Controllers_Menu' )->hookInit();
231
+ }
232
+
233
+
234
+ }
235
+
236
+
237
+ /**
238
+ * Disable the emoji icons
239
+ */
240
+ public function disable_emojicons() {
241
+
242
+ // all actions related to emojis
243
+ remove_action( 'admin_print_styles', 'print_emoji_styles' );
244
+ remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
245
+ remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
246
+ remove_action( 'wp_print_styles', 'print_emoji_styles' );
247
+ remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
248
+ remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
249
+ remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
250
+ add_filter( 'emoji_svg_url', array( 'HMW_Classes_Tools', 'returnFalse' ));
251
+
252
+ // filter to remove TinyMCE emojis
253
+ add_filter( 'tiny_mce_plugins', array( $this, 'disable_emojicons_tinymce' ) );
254
+ }
255
+
256
+ function disable_emojicons_tinymce( $plugins ) {
257
+ if ( is_array( $plugins ) ) {
258
+ return array_diff( $plugins, array( 'wpemoji' ) );
259
+ } else {
260
+ return array();
261
+ }
262
+ }
263
+
264
+ /**
265
+ * Disable the Rest Api access
266
+ */
267
+ public function disable_rest_api() {
268
+ remove_action( 'init', 'rest_api_init' );
269
+ remove_action( 'rest_api_init', 'rest_api_default_filters', 10 );
270
+ remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
271
+ remove_action( 'parse_request', 'rest_api_loaded' );
272
+ remove_action('template_redirect', 'rest_output_link_header', 11);
273
+ }
274
+
275
+ /**
276
+ * Disable the embeds
277
+ */
278
+ public function disable_embeds() {
279
+ // Remove the REST API endpoint.
280
+ remove_action( 'rest_api_init', 'wp_oembed_register_route' );
281
+
282
+ // Turn off oEmbed auto discovery.
283
+ // Don't filter oEmbed results.
284
+ remove_filter( 'oembed_dataparse', 'wp_filter_oembed_result', 10 );
285
+
286
+ // Remove oEmbed discovery links.
287
+ remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
288
+
289
+ // Remove oEmbed-specific JavaScript from the front-end and back-end.
290
+ remove_action( 'wp_head', 'wp_oembed_add_host_js' );
291
+ }
292
+
293
+ /**
294
+ * Disable Windows Live Write
295
+ */
296
+ public function disable_manifest() {
297
+ remove_action( 'wp_head', 'wlwmanifest_link' );
298
+ }
299
+
300
+ /**
301
+ * Disable Really Simple Discovery
302
+ */
303
+ public function disable_rds() {
304
+ remove_action( 'wp_head', 'rsd_link' );
305
+ remove_action( 'wp_head', 'wp_shortlink_wp_head' );
306
+ }
307
+
308
+
309
+ /**
310
+ * Disable the commend from W3 Total Cache
311
+ */
312
+ public function disable_comments() {
313
+ global $wp_super_cache_comments;
314
+ remove_all_filters( 'w3tc_footer_comment' );
315
+ $wp_super_cache_comments = false;
316
+ }
317
+
318
+ }
controllers/SecurityCheck.php ADDED
@@ -0,0 +1,1446 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
3
+
4
+ class HMW_Controllers_SecurityCheck extends HMW_Classes_FrontController {
5
+ /** @var bool Security check time */
6
+ public $securitycheck_time = false;
7
+ /** @var array Security Report */
8
+ public $report = array();
9
+ public $risktasks = array();
10
+ public $riskreport = array();
11
+
12
+ public function init() {
13
+ //Initiate security
14
+ $this->initSecurity();
15
+
16
+ //Add the Menu Tabs in variable
17
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_DisplayController' )->loadMedia( 'popper.min' );
18
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_DisplayController' )->loadMedia( 'bootstrap.min' );
19
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_DisplayController' )->loadMedia( 'font-awesome.min' );
20
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_DisplayController' )->loadMedia( 'settings' );
21
+
22
+ if ( $this->securitycheck_time = get_option( 'hmw_securitycheck_time' ) ) {
23
+ if ( time() - $this->securitycheck_time['timestamp'] > ( 3600 * 24 * 7 ) ) {
24
+ HMW_Classes_Error::setError( __( 'You should check your website every week to see if there are any security changes.', _HMW_PLUGIN_NAME_ ) );
25
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_Error' )->hookNotices();
26
+ }
27
+ }
28
+
29
+ $this->risktasks = $this->getRiskTasks();
30
+ $this->riskreport = $this->getRiskReport();
31
+
32
+ return parent::init();
33
+ }
34
+
35
+ /**
36
+ * Initiate Security List
37
+ * @return array|mixed
38
+ */
39
+ public function initSecurity() {
40
+ $this->report = get_option( 'hmw_securitycheck' );
41
+
42
+ if ( ! empty( $this->report ) ) {
43
+ if ( ! $tasks_ignored = get_option( 'hmw_securitycheck_ignore' ) ) {
44
+ $tasks_ignored = array();
45
+ }
46
+ $tasks = $this->getTasks();
47
+ foreach ( $this->report as $function => &$row ) {
48
+ if ( ! in_array( $function, $tasks_ignored ) ) {
49
+ if ( isset( $tasks[ $function ] ) ) {
50
+ if ( isset( $row['version'] ) && $function == 'checkWP' ) {
51
+ $tasks[ $function ]['solution'] = str_replace( '{version}', $row['version'], $tasks[ $function ]['solution'] );
52
+ }
53
+ $row = array_merge( $tasks[ $function ], $row );
54
+
55
+ if ( ! HMW_Classes_Tools::getOption( 'hmw_token' ) ) {
56
+ if ( isset( $row['javascript'] ) && $row['javascript'] <> '' ) {
57
+ $row['javascript'] = 'alert(\'' . __( 'First, you need to connect Hide My Wp with WPPlugins and switch from Default mode to Lite Mode.', _HMW_PLUGIN_NAME_ ) . '\')';
58
+ }
59
+ } elseif ( $function <> 'checkVersionDisplayed' ) {
60
+ if ( isset( $row['javascript'] ) && $row['javascript'] <> '' ) {
61
+ $row['pro'] = '<div class="btn btn-warning text-white" data-toggle="popover" data-html="true" data-placement="top" data-content="' . sprintf( __( 'This feature requires %sHide My WP Ghost%s.', _HMW_PLUGIN_NAME_ ), "<a href='https://hidemywpghost.com/hide-my-wp-pricing/' target='_blank'>", "</a>" ) . '">' . __( 'PRO', _HMW_PLUGIN_NAME_ ) . '</div>';
62
+ }
63
+ } elseif ( HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'default' ) {
64
+ if ( isset( $row['javascript'] ) && $row['javascript'] <> '' ) {
65
+ $row['javascript'] = 'alert(\'' . __( 'First, you need to switch Hide My Wp from Default mode to Lite Mode.', _HMW_PLUGIN_NAME_ ) . '\')';
66
+ }
67
+ }
68
+ }
69
+ } else {
70
+ unset( $this->report[ $function ] );
71
+ }
72
+ }
73
+ }
74
+
75
+ return $this->report;
76
+ }
77
+
78
+ /**
79
+ * Process the security check
80
+ */
81
+ public function doSecurityCheck() {
82
+ if ( ! $tasks_ignored = get_option( 'hmw_securitycheck_ignore' ) ) {
83
+ $tasks_ignored = array();
84
+ }
85
+ $tasks = $this->getTasks();
86
+ foreach ( $tasks as $function => $task ) {
87
+ if ( ! in_array( $function, $tasks_ignored ) ) {
88
+ if ( $result = @call_user_func( array( $this, $function ) ) ) {
89
+ $this->report[ $function ] = $result;
90
+ }
91
+ }
92
+ }
93
+
94
+
95
+ update_option( 'hmw_securitycheck', $this->report );
96
+ update_option( 'hmw_securitycheck_time', array( 'timestamp' => current_time( 'timestamp', 1 ) ) );
97
+ }
98
+
99
+ /**
100
+ * Get all the security tasks
101
+ * @return array
102
+ */
103
+ public function getTasks() {
104
+ return array(
105
+ 'checkPHP' => array(
106
+ 'name' => __( 'PHP Version', _HMW_PLUGIN_NAME_ ),
107
+ 'value' => false,
108
+ 'valid' => false,
109
+ 'warning' => false,
110
+ 'message' => __( "Using an old version of PHP makes your site slow and prone to hacker attacks due to known vulnerabilities that exist in versions of PHP that are no longer maintained. <br /><br />You need <strong>PHP 7.0</strong> or higher for your website.", _HMW_PLUGIN_NAME_ ),
111
+ 'solution' => __( "Email your hosting company and tell them you'd like to switch to a newer version of PHP or move your site to a better hosting company.", _HMW_PLUGIN_NAME_ ),
112
+ ),
113
+ 'checkMysql' => array(
114
+ 'name' => __( 'Mysql Version', _HMW_PLUGIN_NAME_ ),
115
+ 'value' => false,
116
+ 'valid' => false,
117
+ 'warning' => false,
118
+ 'message' => __( "Using an old version of MySQL makes your site slow and prone to hacker attacks due to known vulnerabilities that exist in versions of MySQL that are no longer maintained. <br /><br />You need <strong>Mysql 5.4</strong> or higher", _HMW_PLUGIN_NAME_ ),
119
+ 'solution' => __( "Email your hosting company and tell them you'd like to switch to a newer version of MySQL or move your site to a better hosting company", _HMW_PLUGIN_NAME_ ),
120
+ ),
121
+ 'checkWP' => array(
122
+ 'name' => __( 'WordPress Version', _HMW_PLUGIN_NAME_ ),
123
+ 'value' => false,
124
+ 'valid' => false,
125
+ 'warning' => false,
126
+ 'message' => sprintf( __( "You should always update WordPress to the %slatest versions%s. These usually include the latest security fixes, and don't alter WP in any significant way. These should be applied as soon as WP releases them. <br /><br />When a new version of WordPress is available, you will receive an update message on your WordPress Admin screens. To update WordPress, click the link in this message.", _HMW_PLUGIN_NAME_ ), '<a href="https://wordpress.org/download/" target="_blank">', '</a>' ),
127
+ 'solution' => __( "There is a newer version of WordPress available ({version}).", _HMW_PLUGIN_NAME_ ),
128
+ ),
129
+ 'checkWPDebug' => array(
130
+ 'name' => __( 'WP Debug Mode', _HMW_PLUGIN_NAME_ ),
131
+ 'value' => false,
132
+ 'valid' => false,
133
+ 'warning' => false,
134
+ 'message' => __( "Every good developer should turn on debugging before getting started on a new plugin or theme. In fact, the WordPress Codex 'highly recommends' that developers use WP_DEBUG. <br /><br />Unfortunately, many developers forget the debug mode, even when the website is live. Showing debug logs in the frontend will let hackers know a lot about your WordPress website.", _HMW_PLUGIN_NAME_ ),
135
+ 'solution' => __( "Disable WP_DEBUG for live websites in wp_config.php <code>define('WP_DEBUG', false);</code>", _HMW_PLUGIN_NAME_ ),
136
+ 'javascript' => "javascript::void(0);",
137
+ ),
138
+ 'checkDBDebug' => array(
139
+ 'name' => __( 'DB Debug Mode', _HMW_PLUGIN_NAME_ ),
140
+ 'value' => false,
141
+ 'valid' => false,
142
+ 'warning' => false,
143
+ 'message' => __( "It's not safe to have Database Debug turned on. Make sure you don't use Database debug on live websites.", _HMW_PLUGIN_NAME_ ),
144
+ 'solution' => sprintf( __( "Turn off the debug plugins if your website is live. You can also switch on %sHide My Wp > Tweaks > Disable DB Debug in Frontent%s", _HMW_PLUGIN_NAME_ ), '<strong>', '</strong>' ),
145
+ 'javascript' => "javascript::void(0);",
146
+ ),
147
+ 'checkScriptDebug' => array(
148
+ 'name' => __( 'Script Debug Mode', _HMW_PLUGIN_NAME_ ),
149
+ 'value' => false,
150
+ 'valid' => false,
151
+ 'warning' => false,
152
+ 'message' => __( "Every good developer should turn on debugging before getting started on a new plugin or theme. In fact, the WordPress Codex 'highly recommends' that developers use SCRIPT_DEBUG. Unfortunately, many developers forget the debug mode even when the website is live. Showing debug logs in the frontend will let hackers know a lot about your WordPress website.", _HMW_PLUGIN_NAME_ ),
153
+ 'solution' => __( "Disable SCRIPT_DEBUG for live websites in wp_config.php <code>define('SCRIPT_DEBUG', false);</code>", _HMW_PLUGIN_NAME_ ),
154
+ 'javascript' => "javascript::void(0);",
155
+ ),
156
+ 'checkDisplayErrors' => array(
157
+ 'name' => __( 'display_errors PHP directive', _HMW_PLUGIN_NAME_ ),
158
+ 'value' => false,
159
+ 'valid' => false,
160
+ 'warning' => false,
161
+ 'message' => __( "Displaying any kind of debug info in the frontend is extremely bad. If any PHP errors happen on your site they should be logged in a safe place and not displayed to visitors or potential attackers.", _HMW_PLUGIN_NAME_ ),
162
+ 'solution' => __( "Edit wp_config.php and add <code>ini_set('display_errors', 0);</code>", _HMW_PLUGIN_NAME_ ),
163
+ ),
164
+ 'checkSSL' => array(
165
+ 'name' => __( 'Backend under SSL', _HMW_PLUGIN_NAME_ ),
166
+ 'value' => false,
167
+ 'valid' => false,
168
+ 'warning' => false,
169
+ 'message' => __( "SSL is an abbreviation used for Secure Sockets Layers, which are encryption protocols used on the internet to secure information exchange and provide certificate information.<br /><br />These certificates provide an assurance to the user about the identity of the website they are communicating with. SSL may also be called TLS or Transport Layer Security protocol. <br /><br />It's important to have a secure connection for the Admin Dashboard in WordPress.", _HMW_PLUGIN_NAME_ ),
170
+ 'solution' => sprintf( __( "Learn how to set your website as %s. %sClick Here%s", _HMW_PLUGIN_NAME_ ), '<strong>' . str_replace( 'http:', 'https:', site_url() ) . '</strong>', '<a href="https://hidemywpghost.com/how-to-move-wordpress-from-http-to-https/" target="_blank">', '</a>' ),
171
+ ),
172
+ 'checkAdminUsers' => array(
173
+ 'name' => __( "User 'admin' as Administrator", _HMW_PLUGIN_NAME_ ),
174
+ 'value' => false,
175
+ 'valid' => false,
176
+ 'warning' => false,
177
+ 'message' => __( "In the old days, the default WordPress admin username was 'admin'. Since usernames make up half of the login credentials, this made it easier for hackers to launch brute-force attacks. <br /><br />Thankfully, WordPress has since changed this and now requires you to select a custom username at the time of installing WordPress.", _HMW_PLUGIN_NAME_ ),
178
+ 'solution' => __( "Change the user 'admin' with another name to improve security.", _HMW_PLUGIN_NAME_ ),
179
+ ),
180
+ 'checkUserRegistration' => array(
181
+ 'name' => __( "Spammers can easily signup", _HMW_PLUGIN_NAME_ ),
182
+ 'value' => false,
183
+ 'valid' => false,
184
+ 'warning' => false,
185
+ 'message' => __( "If you do not have an e-commerce, membership or guest posting website, you shouldn't let users subscribe to your blog. You will end up with spam registrations and your website will be filled with spammy content and comments.", _HMW_PLUGIN_NAME_ ),
186
+ 'solution' => sprintf( __( "Change the signup path from %sHide My Wp > Custom Register URL%s or uncheck the option %s > %s > %s", _HMW_PLUGIN_NAME_ ), '<strong>', '</strong>', '<strong>' . __( 'Settings' ), __( 'General' ), __( 'Membership' ) . '</strong>' )
187
+ ),
188
+ 'checkPluginsUpdates' => array(
189
+ 'name' => __( "Outdated Plugins", _HMW_PLUGIN_NAME_ ),
190
+ 'value' => false,
191
+ 'valid' => false,
192
+ 'warning' => false,
193
+ 'message' => __( "WordPress and its plugins and themes are like any other software installed on your computer, and like any other application on your devices. Periodically, developers release updates which provide new features, or fix known bugs. <br /><br />These new features may not necessarily be something that you want. In fact, you may be perfectly satisfied with the functionality you currently have. Nevertheless, you are still likely to be concerned about bugs.<br /><br />Software bugs can come in many shapes and sizes. A bug could be very serious, such as preventing users from using a plugin, or it could be minor and only affect a certain part of a theme, for example. In some cases, bugs can cause serious security holes. <br /><br />Keeping plugins up to date is one of the most important and easiest ways to keep your site secure.", _HMW_PLUGIN_NAME_ ),
194
+ 'solution' => __( "Go to the Updates page and update all the plugins to the last version.", _HMW_PLUGIN_NAME_ ),
195
+ ),
196
+ 'checkOldPlugins' => array(
197
+ 'name' => __( "Not Updated Plugins", _HMW_PLUGIN_NAME_ ),
198
+ 'value' => false,
199
+ 'valid' => false,
200
+ 'warning' => false,
201
+ 'message' => __( "Plugins that have not been updated in the last 12 months can have real security problems. Make sure you use updated plugins from WordPress Directory.", _HMW_PLUGIN_NAME_ ),
202
+ 'solution' => __( "Go to the Updates page and update all the plugins to the last version.", _HMW_PLUGIN_NAME_ ),
203
+ ),
204
+ 'checkIncompatiblePlugins' => array(
205
+ 'name' => __( "Version Incompatible Plugins", _HMW_PLUGIN_NAME_ ),
206
+ 'value' => false,
207
+ 'valid' => false,
208
+ 'warning' => false,
209
+ 'message' => __( "Plugins that are incompatible with your version of WordPress can have real security problems. Make sure you use tested plugins from WordPress Directory.", _HMW_PLUGIN_NAME_ ),
210
+ 'solution' => __( "Make sure you use tested plugins from WordPress Directory.", _HMW_PLUGIN_NAME_ ),
211
+ ),
212
+ 'checkThemesUpdates' => array(
213
+ 'name' => __( "Outdated Themes", _HMW_PLUGIN_NAME_ ),
214
+ 'value' => false,
215
+ 'valid' => false,
216
+ 'warning' => false,
217
+ 'message' => __( "WordPress and its plugins and themes are like any other software installed on your computer, and like any other application on your devices. Periodically developers release updates which provide new features or fix known bugs. <br /><br />New features may be something that you do not necessarily want. In fact, you may be perfectly satisfied with the functionality you currently have. Nevertheless, you may still be concerned about bugs.<br /><br />Software bugs can come in many shapes and sizes. A bug could be very serious, such as preventing users from using a plugin, or it could be a minor bug that only affects a certain part of a theme, for example. In some cases, bugs can even cause serious security holes.<br /><br />Keeping themes up to date is one of the most important and easiest ways to keep your site secure.", _HMW_PLUGIN_NAME_ ),
218
+ 'solution' => __( "Go to the Updates page and update all the themes to the last version.", _HMW_PLUGIN_NAME_ ),
219
+ ),
220
+ 'checkDBPrefix' => array(
221
+ 'name' => __( "Database Prefix", _HMW_PLUGIN_NAME_ ),
222
+ 'value' => false,
223
+ 'valid' => false,
224
+ 'warning' => false,
225
+ 'message' => __( "The WordPress database is like a brain for your entire WordPress site, because every single bit of information about your site is stored there, thus making it a hacker’s favorite target. <br /><br />Spammers and hackers run automated code for SQL injections.<br />Unfortunately, many people forget to change the database prefix when they install WordPress. <br />This makes it easier for hackers to plan a mass attack by targeting the default prefix <strong>wp_</strong>.", _HMW_PLUGIN_NAME_ ),
226
+ 'solution' => sprintf( __( "Hide My WP protects your website from most SQL injections but, if possible, use a custom prefix for database tables to avoid SQL injections. %sRead more%s", _HMW_PLUGIN_NAME_ ), '<a href="https://firstsiteguide.com/change-database-prefix/" target="_blank">', '</a>' ),
227
+ ),
228
+ 'checkVersionDisplayed' => array(
229
+ 'name' => __( "Versions in Source Code", _HMW_PLUGIN_NAME_ ),
230
+ 'value' => false,
231
+ 'valid' => false,
232
+ 'warning' => false,
233
+ 'message' => __( "WordPress, plugins and themes add their version info to the source code, so anyone can see it. <br /><br />Hackers can easily find a website with vulnerable version plugins or themes, and target these with Zero-Day Exploits.", _HMW_PLUGIN_NAME_ ),
234
+ 'solution' => sprintf( __( "Switch on %sHide My WP > Tweaks > %s %s", _HMW_PLUGIN_NAME_ ), '<strong>', __( 'Hide Versions and WordPress Tags', _HMW_PLUGIN_NAME_ ), '</strong>' ),
235
+ 'javascript' => "javascript::void(0);",
236
+ ),
237
+ 'checkSaltKeys' => array(
238
+ 'name' => __( "Salts and Security Keys valid", _HMW_PLUGIN_NAME_ ),
239
+ 'value' => false,
240
+ 'valid' => false,
241
+ 'warning' => false,
242
+ 'message' => __( "Security keys are used to ensure better encryption of information stored in the user's cookies and hashed passwords. <br /><br />These make your site more difficult to hack, access and crack by adding random elements to the password. You don't have to remember these keys. In fact, once you set them you'll never see them again. Therefore there's no excuse for not setting them properly.", _HMW_PLUGIN_NAME_ ),
243
+ 'solution' => __( "Security keys are defined in wp-config.php as constants on lines. They should be as unique and as long as possible. <code>AUTH_KEY,SECURE_AUTH_KEY,LOGGED_IN_KEY,NONCE_KEY,AUTH_SALT,SECURE_AUTH_SALT,LOGGED_IN_SALT,NONCE_SALT</code>", _HMW_PLUGIN_NAME_ ),
244
+ ),
245
+ 'checkSaltKeysAge' => array(
246
+ 'name' => __( "Security Keys Updated", _HMW_PLUGIN_NAME_ ),
247
+ 'value' => false,
248
+ 'valid' => false,
249
+ 'warning' => false,
250
+ 'message' => __( "The security keys in wp-config.php should be renewed as often as possible.", _HMW_PLUGIN_NAME_ ),
251
+ 'solution' => sprintf( __( "You can generate %snew Keys from here%s <code>AUTH_KEY,SECURE_AUTH_KEY,LOGGED_IN_KEY,NONCE_KEY,AUTH_SALT,SECURE_AUTH_SALT,LOGGED_IN_SALT,NONCE_SALT</code>", _HMW_PLUGIN_NAME_ ), '<a href="https://api.wordpress.org/secret-key/1.1/salt/" target="_blank">', '</a>' ),
252
+ ),
253
+ 'checkDbPassword' => array(
254
+ 'name' => __( "WordPress dDatabase Password", _HMW_PLUGIN_NAME_ ),
255
+ 'value' => false,
256
+ 'valid' => false,
257
+ 'warning' => false,
258
+ 'message' => __( "There is no such thing as an \"unimportant password\"! The same goes for your WordPress database password. <br />Although most servers are configured so that the database can't be accessed from other hosts (or from outside of the local network), that doesn't mean your database password should be \"12345\" or no password at all.", _HMW_PLUGIN_NAME_ ),
259
+ 'solution' => __( "Choose a proper database password, at least 8 characters long with a combination of letters, numbers and special characters. After you change it, set the new password in the wp_config.php file <code>define('DB_PASSWORD', 'NEW_DB_PASSWORD_GOES_HERE');</code>", _HMW_PLUGIN_NAME_ ),
260
+ ),
261
+ // 'checkBlogSiteURL' => array(
262
+ // 'name' => __("Same Backend and Frontend URLs", _HMW_PLUGIN_NAME_),
263
+ // 'value' => false,
264
+ // 'valid' => false,
265
+ // 'warning' => false,
266
+ // 'message' => __("Moving WP core files to any non-standard folder will make your site less vulnerable to automated attacks. This is ", _HMW_PLUGIN_NAME_),
267
+ // 'solution' => __("(Optional) If your blog is setup on www.site.com you can put WP files in ie: /site.com/www/my-app/ instead of the obvious /site.com/www/.", _HMW_PLUGIN_NAME_),
268
+ // ),
269
+ 'checkCommonPaths' => array(
270
+ 'name' => __( "/wp-content is visible in source code", _HMW_PLUGIN_NAME_ ),
271
+ 'value' => false,
272
+ 'valid' => false,
273
+ 'warning' => false,
274
+ 'message' => __( "It's important to rename common WordPress paths, such as wp-content and wp-includes to prevent hackers from knowing that you have a WordPress website.", _HMW_PLUGIN_NAME_ ),
275
+ 'solution' => sprintf( __( "Change the wp-content, wp-includes and other common paths with %sHide My Wp > Permalinks%s", _HMW_PLUGIN_NAME_ ), '<strong>', '</strong>' ),
276
+ ),
277
+ 'checkOldPaths' => array(
278
+ 'name' => __( "/wp-content path is accessible", _HMW_PLUGIN_NAME_ ),
279
+ 'value' => false,
280
+ 'valid' => false,
281
+ 'warning' => false,
282
+ 'message' => __( "It's important to hide the common WordPress paths to prevent attacks on vulnerable plugins and themes. <br /> Also, it's important to hide the names of plugins and themes to make it impossible for bots to detect them.", _HMW_PLUGIN_NAME_ ),
283
+ 'solution' => sprintf( __( "Switch on %sHide My Wp > Hide WordPress Common Paths%s to hide the old paths", _HMW_PLUGIN_NAME_ ), '<strong>', '</strong>' ),
284
+ 'javascript' => "javascript::void(0);",
285
+ ),
286
+ 'checkAdminPath' => array(
287
+ 'name' => sprintf( __( "%s is visible in source code", _HMW_PLUGIN_NAME_ ), '/' . HMW_Classes_Tools::getOption( 'hmw_admin_url' ) ),
288
+ 'value' => false,
289
+ 'valid' => false,
290
+ 'warning' => false,
291
+ 'message' => sprintf( __( "Having the admin URL visible in the source code it's really bad because hackers will immediately know your secret admin path and start a Brute Force attack. The custom admin path should not appear in the ajax URL. <br /><br />Find solutions for %show to hide the path from source code%s.", _HMW_PLUGIN_NAME_ ), '<a href="https://hidemywpghost.com/how-to-hide-wp-admin-and-wp-login-php-from-source-code/" target="_blank">', '</a>' ),
292
+ 'solution' => sprintf( __( "Switch on %sHide My WP > Permalinks > Hide wp-admin from ajax URL%s. Hide any reference to admin path from the installed plugins.", _HMW_PLUGIN_NAME_ ), '<strong>', '</strong>', '<strong>', '</strong>' ),
293
+ ),
294
+ 'checkLoginPath' => array(
295
+ 'name' => sprintf( __( "%s is visible in source code", _HMW_PLUGIN_NAME_ ), '/' . HMW_Classes_Tools::getOption( 'hmw_login_url' ) ),
296
+ 'value' => false,
297
+ 'valid' => false,
298
+ 'warning' => false,
299
+ 'message' => sprintf( __( "Having the login URL visible in the source code it's really bad because hackers will immediately know your secret login path and start a Brute Force attack. <br /><br />The custom login path should be kept secret and with the Brute Force Protection activated for it. <br ><br />Find solutions for %show to hide the path from source code%s.", _HMW_PLUGIN_NAME_ ), '<a href="https://hidemywpghost.com/how-to-hide-wp-admin-and-wp-login-php-from-source-code/" target="_blank">', '</a>' ),
300
+ 'solution' => sprintf( __( "%sHide the login path%s from theme menu or widget.", _HMW_PLUGIN_NAME_ ), '<strong>', '</strong>' ),
301
+ ),
302
+ 'checkOldLogin' => array(
303
+ 'name' => __( "/wp-login path is accessible", _HMW_PLUGIN_NAME_ ),
304
+ 'value' => false,
305
+ 'valid' => false,
306
+ 'warning' => false,
307
+ 'message' => __( "If your site allows user logins, you need your login page to be easy to find for your users. You also need to do other things to protect against malicious login attempts. <br /><br />However, obscurity is a valid security layer when used as part of a comprehensive security strategy, and if you want to cut down on the number of malicious login attempts. Making your login page difficult to find is one way to do that.", _HMW_PLUGIN_NAME_ ),
308
+ 'solution' => sprintf( __( "Change the wp-login from %sHide My Wp > Custom login URL%s and Switch on %sHide My Wp > Brute Force Protection%s", _HMW_PLUGIN_NAME_ ), '<strong>', '</strong>', '<strong>', '</strong>' ),
309
+ ),
310
+ 'checkConfigChmod' => array(
311
+ 'name' => __( "/wp_config.php file is writable", _HMW_PLUGIN_NAME_ ),
312
+ 'value' => false,
313
+ 'valid' => false,
314
+ 'warning' => false,
315
+ 'message' => __( "One of the most important files in your WordPress installation is the wp-config.php file. <br />This file is located in the root directory of your WordPress installation, and contains your website's base configuration details, such as database connection information.", _HMW_PLUGIN_NAME_ ),
316
+ 'solution' => sprintf( __( "Try setting chmod to %s0400%s or %s0440%s and if the website works normally that's the best one to use.", _HMW_PLUGIN_NAME_ ), '<a href="http://www.filepermissions.com/directory-permission/0400" target="_blank">', '</a>', '<a href="http://www.filepermissions.com/directory-permission/0440" target="_blank">', '</a>' ),
317
+ ),
318
+ 'checkConfig' => array(
319
+ 'name' => __( "wp-config.php & wp-config-sample.php files are accessible ", _HMW_PLUGIN_NAME_ ),
320
+ 'value' => false,
321
+ 'valid' => false,
322
+ 'warning' => false,
323
+ 'message' => __( "One of the most important files in your WordPress installation is the wp-config.php file. <br />This file is located in the root directory of your WordPress installation and contains your website's base configuration details, such as database connection information.", _HMW_PLUGIN_NAME_ ),
324
+ 'solution' => sprintf( __( "Switch on %sHide My Wp > Hide WordPress Common Files%s to hide wp-config.php & wp-config-sample.php files", _HMW_PLUGIN_NAME_ ), '<strong>', '</strong>' ),
325
+ 'javascript' => "javascript::void(0);",
326
+ ),
327
+ 'checkReadme' => array(
328
+ 'name' => __( "readme.html file is accessible ", _HMW_PLUGIN_NAME_ ),
329
+ 'value' => false,
330
+ 'valid' => false,
331
+ 'warning' => false,
332
+ 'message' => __( "It's important to hide or remove the readme.html file because it contains WP version details.", _HMW_PLUGIN_NAME_ ),
333
+ 'solution' => sprintf( __( "Rename readme.html file or switch on %sHide My Wp > Hide WordPress Common Files%s", _HMW_PLUGIN_NAME_ ), '<strong>', '</strong>' ),
334
+ 'javascript' => "javascript::void(0);",
335
+ ),
336
+ 'checkInstall' => array(
337
+ 'name' => __( "install.php & upgrade.php files are accessible ", _HMW_PLUGIN_NAME_ ),
338
+ 'value' => false,
339
+ 'valid' => false,
340
+ 'warning' => false,
341
+ 'message' => __( "WordPress is well-known for its ease of installation. <br/>It's important to hide the wp-admin/install.php and wp-admin/upgrade.php files because there have already been a couple of security issues regarding these files.", _HMW_PLUGIN_NAME_ ),
342
+ 'solution' => sprintf( __( "Switch on %sHide My Wp > Hide WordPress Common Files%s to hide wp-admin/install.php & wp-admin/upgrade.php files", _HMW_PLUGIN_NAME_ ), '<strong>', '</strong>' ),
343
+ 'javascript' => "javascript::void(0);",
344
+ ),
345
+ 'checkRegisterGlobals' => array(
346
+ 'name' => __( "PHP register_globals is on", _HMW_PLUGIN_NAME_ ),
347
+ 'value' => false,
348
+ 'valid' => false,
349
+ 'warning' => false,
350
+ 'message' => __( "This is one of the biggest security issues you can have on your site! If your hosting company has this directive enabled by default, switch to another company immediately!", _HMW_PLUGIN_NAME_ ),
351
+ 'solution' => __( "If you have access to php.ini file, set <code>register_globals = off</code> or contact the hosting company to set it off", _HMW_PLUGIN_NAME_ ),
352
+ ),
353
+ 'checkExposedPHP' => array(
354
+ 'name' => __( "PHP expose_php is on", _HMW_PLUGIN_NAME_ ),
355
+ 'value' => false,
356
+ 'valid' => false,
357
+ 'warning' => false,
358
+ 'message' => __( "Exposing the PHP version will make the job of attacking your site much easier.", _HMW_PLUGIN_NAME_ ),
359
+ 'solution' => __( "If you have access to php.ini file, set <code>expose_php = off</code> or contact the hosting company to set it off", _HMW_PLUGIN_NAME_ ),
360
+ ),
361
+ 'checkPHPSafe' => array(
362
+ 'name' => __( "PHP safe_mode is on", _HMW_PLUGIN_NAME_ ),
363
+ 'value' => false,
364
+ 'valid' => false,
365
+ 'warning' => false,
366
+ 'message' => __( "PHP safe mode was one of the attempts to solve security problems of shared web hosting servers. <br /><br />It is still being used by some web hosting providers, however, nowadays this is regarded as improper. A systematic approach proves that it’s architecturally incorrect to try solving complex security issues at the PHP level, rather than at the web server and OS levels.<br /><br />Technically, safe mode is a PHP directive that restricts the way some built-in PHP functions operate. The main problem here is inconsistency. When turned on, PHP safe mode may prevent many legitimate PHP functions from working correctly. At the same time there exists a variety of methods to override safe mode limitations using PHP functions that aren’t restricted, so if a hacker has already got in – safe mode is useless.", _HMW_PLUGIN_NAME_ ),
367
+ 'solution' => __( "If you have access to php.ini file, set <code>safe_mode = off</code> or contact the hosting company to set it off", _HMW_PLUGIN_NAME_ ),
368
+ ),
369
+ 'checkAllowUrlInclude' => array(
370
+ 'name' => __( "PHP allow_url_include is on", _HMW_PLUGIN_NAME_ ),
371
+ 'value' => false,
372
+ 'valid' => false,
373
+ 'warning' => false,
374
+ 'message' => __( "Having this PHP directive enabled will leave your site exposed to cross-site attacks (XSS). <br /><br />There's absolutely no valid reason to enable this directive, and using any PHP code that requires it is very risky.", _HMW_PLUGIN_NAME_ ),
375
+ 'solution' => __( "If you have access to php.ini file, set <code>allow_url_include = off</code> or contact the hosting company to set it off", _HMW_PLUGIN_NAME_ ),
376
+ ),
377
+ 'checkAdminEditor' => array(
378
+ 'name' => __( "Plugins/Themes editor disables", _HMW_PLUGIN_NAME_ ),
379
+ 'value' => false,
380
+ 'valid' => false,
381
+ 'warning' => false,
382
+ 'message' => __( "The plugins and themes file editor is a very convenient tool because it enables you to make quick changes without the need to use FTP. <br /><br />Unfortunately, it's also a security issue because it not only shows the PHP source code, it also enables attackers to inject malicious code into your site if they manage to gain access to admin.", _HMW_PLUGIN_NAME_ ),
383
+ 'solution' => __( "Disable DISALLOW_FILE_EDIT for live websites in wp_config.php <code>define('DISALLOW_FILE_EDIT', true);</code>", _HMW_PLUGIN_NAME_ ),
384
+ 'javascript' => "javascript::void(0);",
385
+ ),
386
+ 'checkUploadsBrowsable' => array(
387
+ 'name' => sprintf( __( "Folder %s is browsable ", _HMW_PLUGIN_NAME_ ), HMW_Classes_Tools::$default['hmw_upload_url'] ),
388
+ 'value' => false,
389
+ 'valid' => false,
390
+ 'warning' => false,
391
+ 'message' => __( "Allowing anyone to view all files in the Uploads folder with a browser will allow them to easily download all your uploaded files. It's a security and a copyright issue.", _HMW_PLUGIN_NAME_ ),
392
+ 'solution' => sprintf( __( "Learn how to disable %sDirectory Browsing%s", _HMW_PLUGIN_NAME_ ), '<a href="https://www.netsparker.com/blog/web-security/disable-directory-listing-web-servers/">', '</a>' ),
393
+ 'javascript' => "javascript::void(0);",
394
+ ),
395
+ 'checkWLW' => array(
396
+ 'name' => __( "Windows Live Writer is on ", _HMW_PLUGIN_NAME_ ),
397
+ 'value' => false,
398
+ 'valid' => false,
399
+ 'warning' => false,
400
+ 'message' => __( "If you're not using Windows Live Writer there's really no valid reason to have its link in the page header, because this tells the whole world you're using WordPress.", _HMW_PLUGIN_NAME_ ),
401
+ 'solution' => sprintf( __( "Switch on %sHide My Wp > Tweaks > Disable WLW Manifest scripts%s", _HMW_PLUGIN_NAME_ ), '<strong>', '</strong>' ),
402
+ 'javascript' => "javascript::void(0);",
403
+ ),
404
+ 'checkXmlrpc' => array(
405
+ 'name' => __( "XML-RPC access is on", _HMW_PLUGIN_NAME_ ),
406
+ 'value' => false,
407
+ 'valid' => false,
408
+ 'warning' => false,
409
+ 'message' => __( "WordPress XML-RPC is a specification that aims to standardize communications between different systems. It uses HTTP as the transport mechanism and XML as encoding mechanism to enable a wide range of data to be transmitted. <br /><br />The two biggest assets of the API are its extendibility and its security. XML-RPC authenticates using basic authentication. It sends the username and password with each request, which is a big no-no in security circles.", _HMW_PLUGIN_NAME_ ),
410
+ 'solution' => sprintf( __( "Switch on %sHide My Wp > Tweaks > Disable XML-RPC access%s", _HMW_PLUGIN_NAME_ ), '<strong>', '</strong>' ),
411
+ 'javascript' => "javascript::void(0);",
412
+ ),
413
+ 'checkRDS' => array(
414
+ 'name' => __( "RDS is visible", _HMW_PLUGIN_NAME_ ),
415
+ 'value' => false,
416
+ 'valid' => false,
417
+ 'warning' => false,
418
+ 'message' => __( "If you're not using any Really Simple Discovery services such as pingbacks, there's no need to advertise that endpoint (link) in the header. Please note that for most sites this is not a security issue because they \"want to be discovered\", but if you want to hide the fact that you're using WP, this is the way to go.", _HMW_PLUGIN_NAME_ ),
419
+ 'solution' => sprintf( __( "Switch on %sHide My Wp > Tweaks > Hide RSD header%s", _HMW_PLUGIN_NAME_ ), '<strong>', '</strong>' ),
420
+ 'javascript' => "javascript::void(0);",
421
+ ),
422
+ 'checkMysqlPermissions' => array(
423
+ 'name' => __( "MySql Grant All Permissions", _HMW_PLUGIN_NAME_ ),
424
+ 'value' => false,
425
+ 'valid' => false,
426
+ 'warning' => false,
427
+ 'message' => __( "If an attacker gains access to your wp-config.php file and gets the MySQL username and password, he'll be able to login to that database and do whatever that account allows. <br /><br />That's why it's important to keep the account's privileges to a bare minimum.<br /><br />For instance, if you're not installing any new plugins or updating WP, that account doesn't need the CREATE or DROP table privileges.<br /><br />For regular, day-to-day usage these are the recommended privileges: SELECT, INSERT, UPDATE and DELETE.", _HMW_PLUGIN_NAME_ ),
428
+ 'solution' => sprintf( __( "To learn how to revoke permissions from PhpMyAdmin %sClick here%s", _HMW_PLUGIN_NAME_ ), '<a href="https://hidemywpghost.com/article/how-to-grant-and-revoke-permissions-to-database-using-phpmyadmin/" target="_blank">', '</a>' ),
429
+ ),
430
+ 'checkUsersById' => array(
431
+ 'name' => __( "Author URL by ID access", _HMW_PLUGIN_NAME_ ),
432
+ 'value' => false,
433
+ 'valid' => false,
434
+ 'warning' => false,
435
+ 'message' => __( "Usernames (unlike passwords) are not secret. By knowing someone's username, you can't log in to their account. You also need the password. <br /><br />However, by knowing the username, you are one step closer to logging in using the username to brute-force the password, or to gain access in a similar way. <br /><br />That's why it's advisable to keep the list of usernames private, at least to some degree. By default, by accessing siteurl.com/?author={id} and looping through IDs from 1 you can get a list of usernames, because WP will redirect you to siteurl.com/author/user/ if the ID exists in the system.", _HMW_PLUGIN_NAME_ ),
436
+ 'solution' => sprintf( __( "Switch on %sHide My Wp > Hide Author ID URL%s", _HMW_PLUGIN_NAME_ ), '<strong>', '</strong>' ),
437
+ 'javascript' => "javascript::void(0);",
438
+ ),
439
+ 'checkBlogDescription' => array(
440
+ 'name' => __( "Default WordPress Tagline", _HMW_PLUGIN_NAME_ ),
441
+ 'value' => false,
442
+ 'valid' => false,
443
+ 'warning' => false,
444
+ 'message' => __( "The WordPress site tagline is a short phrase located under the site title, similar to a subtitle or advertising slogan. The goal of a tagline is to convey the essence of your site to visitors. <br /><br />If you don't change the default tagline it will be very easy to detect that your website was actually built with WordPress", _HMW_PLUGIN_NAME_ ),
445
+ 'solution' => sprintf( __( "Change the Tagline in %s > %s", _HMW_PLUGIN_NAME_ ), '<strong>' . __( 'General' ), __( 'Tagline' ) . '</strong>' ),
446
+ ),
447
+
448
+
449
+ );
450
+ }
451
+
452
+ /**
453
+ * Get the Risk Tasks for speedometer
454
+ * @return array
455
+ */
456
+ public function getRiskTasks() {
457
+ return array(
458
+ 'checkPHP',
459
+ 'checkXmlrpc',
460
+ 'checkUsersById',
461
+ 'checkRDS',
462
+ 'checkUploadsBrowsable',
463
+ 'checkConfig',
464
+ 'checkOldLogin',
465
+ 'checkLoginPath',
466
+ 'checkOldPaths',
467
+ 'checkCommonPaths',
468
+ 'checkVersionDisplayed',
469
+ 'checkSSL',
470
+ 'checkDBDebug',
471
+ 'checkLoginPath',
472
+ );
473
+ }
474
+
475
+ /**
476
+ * Get the Risk Report for Daskboard Widget and speedometer
477
+ * @return mixed
478
+ */
479
+ public function getRiskReport() {
480
+ $riskreport = array();
481
+ //get all the risk tasks
482
+ $risktasks = $this->getRiskTasks();
483
+ //initiate the security report
484
+ $report = $this->initSecurity();
485
+
486
+ if ( ! empty( $report ) ) {
487
+ foreach ( $report as $function => $row ) {
488
+ if ( in_array( $function, $risktasks ) ) {
489
+ if ( ! $row['valid'] ) {
490
+ //add the invalid tasks into risk report
491
+ $riskreport[ $function ] = $row;
492
+ }
493
+ }
494
+ }
495
+ }
496
+
497
+ //return the risk report
498
+ return $riskreport;
499
+ }
500
+
501
+ public function action() {
502
+ parent::action();
503
+
504
+ if ( ! current_user_can( 'manage_options' ) ) {
505
+ return;
506
+ }
507
+
508
+ switch ( HMW_Classes_Tools::getValue( 'action' ) ) {
509
+ case 'hmw_securitycheck':
510
+ $this->doSecurityCheck();
511
+
512
+ break;
513
+
514
+ case 'hmw_securityexclude':
515
+ $name = HMW_Classes_Tools::getValue( 'name', false );
516
+ if ( $name ) {
517
+ if ( ! $tasks_ignored = get_option( 'hmw_securitycheck_ignore' ) ) {
518
+ $tasks_ignored = array();
519
+ }
520
+
521
+ array_push( $tasks_ignored, $name );
522
+ $tasks_ignored = array_unique( $tasks_ignored );
523
+ update_option( 'hmw_securitycheck_ignore', $tasks_ignored );
524
+ }
525
+ HMW_Classes_Tools::setHeader( 'json' );
526
+ echo json_encode( array(
527
+ 'success' => true,
528
+ 'message' => __( 'Saved! This task will be ignored on future tests.', _HMW_PLUGIN_NAME_ )
529
+ ) );
530
+
531
+ exit();
532
+
533
+ case 'hmw_resetexclude':
534
+ update_option( 'hmw_securitycheck_ignore', array() );
535
+ HMW_Classes_Tools::setHeader( 'json' );
536
+ echo json_encode( array(
537
+ 'success' => true,
538
+ 'message' => __( 'Saved! You can run the test again.', _HMW_PLUGIN_NAME_ )
539
+ ) );
540
+
541
+ exit();
542
+
543
+ }
544
+
545
+
546
+ }
547
+
548
+ /**
549
+ * Check PHP version
550
+ * @return array
551
+ */
552
+ public function checkPHP() {
553
+ $phpversion = phpversion();
554
+ if ( strpos( $phpversion, '-' ) !== false ) {
555
+ $phpversion = substr( $phpversion, 0, strpos( $phpversion, '-' ) );
556
+ }
557
+
558
+ return array(
559
+ 'value' => $phpversion,
560
+ 'valid' => ( version_compare( $phpversion, '7.0', '>=' ) ),
561
+ );
562
+ }
563
+
564
+ /**
565
+ * Check if mysql is up-to-date
566
+ * @return array
567
+ */
568
+ public function checkMysql() {
569
+ global $wpdb;
570
+
571
+ $mysql_version = $wpdb->db_version();
572
+
573
+ return array(
574
+ 'value' => $mysql_version,
575
+ 'valid' => ( version_compare( $mysql_version, '5.0', '>' ) ),
576
+ );
577
+
578
+ }
579
+
580
+ /**
581
+ * Check is WP_DEBUG is true
582
+ * @return array|bool
583
+ */
584
+ public function checkWPDebug() {
585
+ if ( defined( 'WP_DEBUG' ) ) {
586
+ return array(
587
+ 'value' => ( WP_DEBUG ? __( 'Yes' ) : __( 'No' ) ),
588
+ 'valid' => ! WP_DEBUG,
589
+ );
590
+ }
591
+
592
+ return false;
593
+ }
594
+
595
+ /**
596
+ * Check if DB debugging is enabled
597
+ *
598
+ * @return array
599
+ */
600
+ static function checkDbDebug() {
601
+ global $wpdb;
602
+ $show_errors = ( $wpdb->show_errors && ! HMW_Classes_Tools::getOption( 'hmw_disable_debug' ) );
603
+
604
+ return array(
605
+ 'value' => ( $show_errors ? __( 'Yes' ) : __( 'No' ) ),
606
+ 'valid' => ! $show_errors,
607
+ );
608
+
609
+ }
610
+
611
+ /**
612
+ * Check if global WP JS debugging is enabled
613
+ *
614
+ * @return array|bool
615
+ */
616
+ static function checkScriptDebug() {
617
+ if ( defined( 'SCRIPT_DEBUG' ) ) {
618
+ return array(
619
+ 'value' => ( SCRIPT_DEBUG ? __( 'Yes' ) : __( 'No' ) ),
620
+ 'valid' => ! SCRIPT_DEBUG,
621
+ );
622
+ }
623
+
624
+ return false;
625
+ }
626
+
627
+ /**
628
+ * Check if the backend is SSL or not
629
+ * @return array
630
+ */
631
+ public function checkSSL() {
632
+ return array(
633
+ 'value' => ( is_ssl() ? __( 'Yes' ) : __( 'No' ) ),
634
+ 'valid' => ( is_ssl() ),
635
+ );
636
+ }
637
+
638
+ /**
639
+ * Check Admin User declared
640
+ * @return array
641
+ */
642
+ public function checkAdminUsers() {
643
+ $users = get_users( array( 'role' => 'administrator', 'login' => 'admin' ) );
644
+
645
+ return array(
646
+ 'value' => ( ! empty( $users ) ? __( 'Yes' ) : __( 'No' ) ),
647
+ 'valid' => ( empty( $users ) ),
648
+ );
649
+ }
650
+
651
+ /**
652
+ * Check WordPress version
653
+ * @return array|bool
654
+ */
655
+ public function checkWP() {
656
+ global $wp_version;
657
+ $wp_lastversion = $wpversion = false;
658
+ if ( isset( $wp_version ) ) {
659
+
660
+ $url = 'https://api.wordpress.org/core/version-check/1.7/';
661
+ $response = wp_remote_get( $url );
662
+ $obj = json_decode( $response['body'] );
663
+ if ( isset( $obj->offers[0] ) ) {
664
+ $upgrade = $obj->offers[0];
665
+ if ( isset( $upgrade->version ) ) {
666
+ $wp_lastversion = $upgrade->version;
667
+ }
668
+ }
669
+
670
+ if ( $wp_lastversion ) {
671
+ return array(
672
+ 'value' => $wp_version,
673
+ 'valid' => version_compare( $wp_version, $wp_lastversion, '==' ),
674
+ 'version' => $wp_lastversion,
675
+ );
676
+ }
677
+ }
678
+
679
+ return false;
680
+ }
681
+
682
+ /**
683
+ * Check if plugins are up to date
684
+ * @return array
685
+ */
686
+ public function checkPluginsUpdates() {
687
+ //Get the current update info
688
+ $current = get_site_transient( 'update_plugins' );
689
+
690
+ if ( ! is_object( $current ) ) {
691
+ $current = new stdClass;
692
+ }
693
+
694
+ set_site_transient( 'update_plugins', $current );
695
+
696
+ // run the internal plugin update check
697
+ wp_update_plugins();
698
+
699
+ $current = get_site_transient( 'update_plugins' );
700
+
701
+ if ( isset( $current->response ) && is_array( $current->response ) ) {
702
+ $plugin_update_cnt = count( $current->response );
703
+ } else {
704
+ $plugin_update_cnt = 0;
705
+ }
706
+
707
+ $plugins = array();
708
+ foreach ( $current->response as $plugin_path => $tmp ) {
709
+ if ( isset( $tmp->slug ) ) {
710
+ $plugins[] = $tmp->slug;
711
+ }
712
+ }
713
+
714
+ return array(
715
+ 'value' => ( $plugin_update_cnt > 0 ? sprintf( __( '%s plugin are outdated: %s', _HMW_PLUGIN_NAME_ ), $plugin_update_cnt, join( '<br />', $plugins ) ) : __( 'All plugins are up to date', _HMW_PLUGIN_NAME_ ) ),
716
+ 'valid' => ( ! $plugin_update_cnt ),
717
+ );
718
+
719
+ }
720
+
721
+ /**
722
+ * Check if themes are up to date
723
+ * @return array
724
+ */
725
+ public function checkThemesUpdates() {
726
+ $current = get_site_transient( 'update_themes' );
727
+
728
+ if ( ! is_object( $current ) ) {
729
+ $current = new stdClass;
730
+ }
731
+
732
+ set_site_transient( 'update_themes', $current );
733
+ wp_update_themes();
734
+
735
+ $current = get_site_transient( 'update_themes' );
736
+
737
+ if ( isset( $current->response ) && is_array( $current->response ) ) {
738
+ $theme_update_cnt = count( $current->response );
739
+ } else {
740
+ $theme_update_cnt = 0;
741
+ }
742
+
743
+ foreach ( $current->response as $theme_name => $tmp ) {
744
+ $themes[] = $theme_name;
745
+ }
746
+
747
+ return array(
748
+ 'value' => ( $theme_update_cnt > 0 ? sprintf( __( '%s theme(s) are outdated: %s', _HMW_PLUGIN_NAME_ ), $theme_update_cnt, '<br />' . join( "<br />", $themes ) ) : __( 'Themes are up to date', _HMW_PLUGIN_NAME_ ) ),
749
+ 'valid' => ( ! $theme_update_cnt ),
750
+ );
751
+
752
+ }
753
+
754
+ public function checkOldPlugins() {
755
+ //return false;
756
+ global $hmw_plugin_details;
757
+
758
+ $hmw_plugin_details = $return = array();
759
+ $bad = array();
760
+ $active_plugins = get_option( 'active_plugins', array() );
761
+
762
+ foreach ( $active_plugins as $plugin_path ) {
763
+ $plugin = explode( '/', $plugin_path );
764
+ $plugin = @$plugin[0];
765
+ if ( empty( $plugin ) || empty( $plugin_path ) ) {
766
+ continue;
767
+ }
768
+ $response = wp_remote_get( 'https://api.wordpress.org/plugins/info/1.1/?action=plugin_information&request%5Bslug%5D=' . $plugin, array( 'timeout' => 5 ) );
769
+ if ( ! is_wp_error( $response ) && wp_remote_retrieve_response_code( $response ) == 200 && wp_remote_retrieve_body( $response ) ) {
770
+ $details = wp_remote_retrieve_body( $response );
771
+ $details = json_decode( $details, true );
772
+ if ( empty( $details ) ) {
773
+ continue;
774
+ }
775
+ $hmw_plugin_details[ $plugin_path ] = $details;
776
+ $updated = strtotime( $details['last_updated'] );
777
+ if ( $updated + 365 * DAY_IN_SECONDS < time() ) {
778
+ $bad[ $plugin_path ] = true;
779
+ }
780
+ }
781
+ } // foreach active plugin
782
+
783
+ if ( ! empty( $bad ) ) {
784
+ $plugins = get_plugins();
785
+ foreach ( $bad as $plugin_path => $tmp ) {
786
+ $bad[ $plugin_path ] = $plugins[ $plugin_path ]['Name'];
787
+ }
788
+ }
789
+
790
+ return array(
791
+ 'value' => ( empty( $bad ) ? __( 'All plugins are up to date', _HMW_PLUGIN_NAME_ ) : implode( '<br />', $bad ) ),
792
+ 'valid' => empty( $bad ),
793
+ );
794
+
795
+ }
796
+
797
+ /**
798
+ * Check incompatible plugins
799
+ * @return array
800
+ */
801
+ public function checkIncompatiblePlugins() {
802
+ //return false;
803
+ global $hmw_plugin_details, $wp_version;
804
+
805
+ $good = $bad = array();
806
+
807
+ if ( empty( $hmw_plugin_details ) ) {
808
+ $this->checkOldPlugins();
809
+ }
810
+
811
+ foreach ( $hmw_plugin_details as $plugin_path => $plugin ) {
812
+ if ( version_compare( $wp_version, $plugin['tested'], '>' ) ) {
813
+ $bad[ $plugin_path ] = $plugin;
814
+ } else {
815
+ $good[ $plugin_path ] = $plugin;
816
+ }
817
+ } // foreach active plugins we have details on
818
+
819
+ HMW_Debug::dump( $bad );
820
+ if ( ! empty( $bad ) ) {
821
+ $plugins = get_plugins();
822
+ foreach ( $bad as $plugin_path => $tmp ) {
823
+ $bad[ $plugin_path ] = $plugins[ $plugin_path ]['Name'];
824
+ }
825
+ }
826
+
827
+ return array(
828
+ 'value' => ( empty( $bad ) ? __( 'All plugins are compatible', _HMW_PLUGIN_NAME_ ) : implode( '<br />', $bad ) ),
829
+ 'valid' => empty( $bad ),
830
+ );
831
+
832
+ }
833
+
834
+ /**
835
+ * Check if version is displayed in source code
836
+ * @return array
837
+ */
838
+ public function checkVersionDisplayed() {
839
+ $version = HMW_Classes_Tools::getOption( 'hmw_hide_version' );
840
+ if ( HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'default' ) {
841
+ $version = false;
842
+ }
843
+
844
+ return array(
845
+ 'value' => ( $version ? 'Removed' : 'Visible' ),
846
+ 'valid' => ( $version ),
847
+ );
848
+ }
849
+
850
+ /**
851
+ * Check if PHP is exposed
852
+ * @return array
853
+ */
854
+ public function checkExposedPHP() {
855
+ $check = (bool) ini_get( 'expose_php' );
856
+
857
+ return array(
858
+ 'value' => ( $check ? 'Yes' : 'No' ),
859
+ 'valid' => ( ! $check ),
860
+ );
861
+
862
+ }
863
+
864
+ /**
865
+ * Check Database Prefix
866
+ * @return array
867
+ */
868
+ public function checkDBPrefix() {
869
+ global $wpdb;
870
+
871
+ return array(
872
+ 'value' => $wpdb->prefix,
873
+ 'valid' => ! ( $wpdb->prefix == 'wp_' && $wpdb->prefix == 'wordpress_' && $wpdb->prefix == 'wp3_' ),
874
+ );
875
+ }
876
+
877
+ /**
878
+ * Check Salt Keys
879
+ * @return array
880
+ */
881
+ public function checkSaltKeys() {
882
+ $keys = array(
883
+ 'AUTH_KEY',
884
+ 'SECURE_AUTH_KEY',
885
+ 'LOGGED_IN_KEY',
886
+ 'NONCE_KEY',
887
+ 'AUTH_SALT',
888
+ 'SECURE_AUTH_SALT',
889
+ 'LOGGED_IN_SALT',
890
+ 'NONCE_SALT'
891
+ );
892
+
893
+ foreach ( $keys as $key ) {
894
+ $constant = @constant( $key );
895
+ if ( empty( $constant ) || trim( $constant ) == 'put your unique phrase here' || strlen( $constant ) < 50 ) {
896
+ $bad_keys[] = $key;
897
+ }
898
+ } // foreach
899
+
900
+ return array(
901
+ 'value' => ( ! empty( $bad_keys ) ? implode( ', ', $bad_keys ) : __( 'Yes', _HMW_PLUGIN_NAME_ ) ),
902
+ 'valid' => empty( $bad_keys ),
903
+ );
904
+
905
+ }
906
+
907
+ /**
908
+ * Check if wp-config.php has the right chmod
909
+ *
910
+ * @return array|false
911
+ */
912
+ public function checkSaltKeysAge() {
913
+ $old = 95;
914
+
915
+ if ( file_exists( HMW_Classes_Tools::getRootPath() . 'wp-config.php' ) ) {
916
+ $age = @filemtime( HMW_Classes_Tools::getRootPath() . 'wp-config.php' );
917
+
918
+ if ( ! empty( $age ) ) {
919
+ $diff = time() - $age;
920
+
921
+ return array(
922
+ 'value' => ( ( $diff > ( DAY_IN_SECONDS * $old ) ) ? sprintf( __( '%s days since last update', _HMW_PLUGIN_NAME_ ), $diff ) : __( 'Updated', _HMW_PLUGIN_NAME_ ) ),
923
+ 'valid' => ( $diff <= ( DAY_IN_SECONDS * $old ) ),
924
+ );
925
+ }
926
+ }
927
+
928
+ return false;
929
+ }
930
+
931
+ /**
932
+ * Check Database Password
933
+ * @return array
934
+ */
935
+ public function checkDbPassword() {
936
+ $password = DB_PASSWORD;
937
+
938
+ if ( empty( $password ) ) {
939
+ return array(
940
+ 'value' => __( 'Empty', _HMW_PLUGIN_NAME_ ),
941
+ 'valid' => false,
942
+ );
943
+ } elseif ( strlen( $password ) < 6 ) {
944
+ return array(
945
+ 'value' => __( 'only ' . strlen( $password ) . ' chars', _HMW_PLUGIN_NAME_ ),
946
+ 'valid' => false,
947
+ );
948
+ } elseif ( sizeof( count_chars( $password, 1 ) ) < 5 ) {
949
+ return array(
950
+ 'value' => __( 'too simple', _HMW_PLUGIN_NAME_ ),
951
+ 'valid' => false,
952
+ );
953
+ } else {
954
+ return array(
955
+ 'value' => __( 'Good', _HMW_PLUGIN_NAME_ ),
956
+ 'valid' => true,
957
+ );
958
+ }
959
+ }
960
+
961
+ /**
962
+ * Check if display_errors is off
963
+ * @return array
964
+ */
965
+ public function checkDisplayErrors() {
966
+ $check = ini_get( 'display_errors' );
967
+
968
+ return array(
969
+ 'value' => $check,
970
+ 'valid' => ! (bool) $check,
971
+ );
972
+ }
973
+
974
+ /**
975
+ * Compare WP Blog Url with WP Site Url
976
+ *
977
+ * @return array
978
+ */
979
+ public function checkBlogSiteURL() {
980
+ $siteurl = home_url();
981
+ $wpurl = site_url();
982
+
983
+ return array(
984
+ 'value' => ( ( $siteurl == $wpurl ) ? __( 'Yes' ) : __( 'No' ) ),
985
+ 'valid' => ( $siteurl <> $wpurl ),
986
+ );
987
+
988
+ }
989
+
990
+ /**
991
+ * Check if wp-config.php has the right chmod
992
+ * @return array|bool
993
+ */
994
+ public function checkConfigChmod() {
995
+ $wp_config = HMW_Classes_Tools::getRootPath() . 'wp-config.php';
996
+
997
+ if ( file_exists( $wp_config ) ) {
998
+ if ( HMW_Classes_Tools::isWindows() ) {
999
+ return array(
1000
+ 'value' => ( ( is_writeable( $wp_config ) ) ? __( 'Yes' ) : __( 'No' ) ),
1001
+ 'valid' => ( ! is_writeable( $wp_config ) ),
1002
+ 'solution' => sprintf( __( "Change the wp-config.php file permission to Read-Only using File Manager.", _HMW_PLUGIN_NAME_ ), '<a href="http://www.filepermissions.com/directory-permission/0400" target="_blank">', '</a>', '<a href="http://www.filepermissions.com/directory-permission/0440" target="_blank">', '</a>' ),
1003
+ );
1004
+ } else {
1005
+ $mode = substr( sprintf( '%o', @fileperms( $wp_config ) ), - 4 );
1006
+
1007
+ return array(
1008
+ 'value' => ( ( substr( $mode, - 1 ) != 0 ) ? __( 'Yes' ) : __( 'No' ) ),
1009
+ 'valid' => ( substr( $mode, - 1 ) == 0 ),
1010
+ );
1011
+ }
1012
+ }
1013
+
1014
+ return false;
1015
+ }
1016
+
1017
+ /**
1018
+ * Check wp-config.php file
1019
+ * @return array
1020
+ */
1021
+ public function checkConfig() {
1022
+ $url = home_url( 'wp-config.php?rnd=' . rand() );
1023
+ $response = wp_remote_get( $url, array( 'redirection' => 0 ) );
1024
+
1025
+ $visible = false;
1026
+ if ( ! is_wp_error( $response ) ) {
1027
+ if ( wp_remote_retrieve_response_code( $response ) == 200 ) {
1028
+ $visible = true;
1029
+ }
1030
+ }
1031
+
1032
+ $url = home_url( 'wp-config-sample.php?rnd=' . rand() );
1033
+ $response = wp_remote_get( $url, array( 'redirection' => 0 ) );
1034
+
1035
+ if ( ! is_wp_error( $response ) ) {
1036
+ if ( wp_remote_retrieve_response_code( $response ) == 200 ) {
1037
+ $visible = true;
1038
+ }
1039
+ }
1040
+
1041
+ return array(
1042
+ 'value' => ( $visible ? 'Yes' : 'No' ),
1043
+ 'valid' => ( ! $visible ),
1044
+ );
1045
+ }
1046
+
1047
+ /**
1048
+ * Check readme.html file
1049
+ * @return array
1050
+ */
1051
+ public function checkReadme() {
1052
+ $url = home_url( 'readme.html?rnd=' . rand() );
1053
+ $response = wp_remote_get( $url, array( 'redirection' => 0 ) );
1054
+
1055
+ $visible = false;
1056
+ if ( ! is_wp_error( $response ) ) {
1057
+ if ( wp_remote_retrieve_response_code( $response ) == 200 ) {
1058
+ $visible = true;
1059
+ }
1060
+ }
1061
+
1062
+ return array(
1063
+ 'value' => ( $visible ? 'Yes' : 'No' ),
1064
+ 'valid' => ( ! $visible ),
1065
+ );
1066
+ }
1067
+
1068
+
1069
+ /**
1070
+ * Does WP install.php file exist?
1071
+ * @return array
1072
+ */
1073
+ public function checkInstall() {
1074
+ $url = site_url() . '/wp-admin/install.php?rnd=' . rand();
1075
+ $response = wp_remote_get( $url, array( 'redirection' => 0 ) );
1076
+
1077
+ $visible = false;
1078
+ if ( ! is_wp_error( $response ) ) {
1079
+ if ( wp_remote_retrieve_response_code( $response ) == 200 ) {
1080
+ $visible = true;
1081
+ }
1082
+ }
1083
+
1084
+ return array(
1085
+ 'value' => ( $visible ? __( 'Yes' ) : __( 'No' ) ),
1086
+ 'valid' => ( ! $visible ),
1087
+ );
1088
+ }
1089
+
1090
+ /**
1091
+ * Check if register_globals is off
1092
+ *
1093
+ * @return array
1094
+ */
1095
+ public function checkRegisterGlobals() {
1096
+ $check = (bool) ini_get( 'register' . '_globals' );
1097
+
1098
+ return array(
1099
+ 'value' => ( $check ? __( 'Yes' ) : __( 'No' ) ),
1100
+ 'valid' => ( ! $check ),
1101
+ );
1102
+
1103
+ }
1104
+
1105
+ /**
1106
+ * Check if safe mode is off
1107
+ *
1108
+ * @return array
1109
+ */
1110
+ public function checkPHPSafe() {
1111
+ $check = (bool) ini_get( 'safe' . '_mode' );
1112
+
1113
+ return array(
1114
+ 'value' => ( $check ? __( 'Yes' ) : __( 'No' ) ),
1115
+ 'valid' => ( ! $check ),
1116
+ );
1117
+
1118
+ }
1119
+
1120
+ /**
1121
+ * Check if allow_url_include is off
1122
+ * @return array
1123
+ */
1124
+ public function checkAllowUrlInclude() {
1125
+ $check = (bool) ini_get( 'allow_url_include' );
1126
+
1127
+ return array(
1128
+ 'value' => ( $check ? __( 'Yes' ) : __( 'No' ) ),
1129
+ 'valid' => ( ! $check ),
1130
+ );
1131
+ }
1132
+
1133
+ /**
1134
+ * Is theme/plugin editor disabled?
1135
+ * @return array
1136
+ */
1137
+ public function checkAdminEditor() {
1138
+ if ( defined( 'DISALLOW_FILE_EDIT' ) ) {
1139
+ return array(
1140
+ 'value' => ( DISALLOW_FILE_EDIT ? __( 'Yes' ) : __( 'No' ) ),
1141
+ 'valid' => DISALLOW_FILE_EDIT,
1142
+ );
1143
+ } else {
1144
+ return array(
1145
+ 'value' => __( 'Yes' ),
1146
+ 'valid' => false,
1147
+ );
1148
+ }
1149
+ }
1150
+
1151
+
1152
+ /**
1153
+ * Check if Upload Folder is browsable
1154
+ * @return array|bool
1155
+ */
1156
+ public function checkUploadsBrowsable() {
1157
+ $upload_dir = wp_upload_dir();
1158
+
1159
+ $args = array(
1160
+ 'method' => 'GET',
1161
+ 'timeout' => 5,
1162
+ 'redirection' => 0,
1163
+ 'sslverify' => false,
1164
+ 'httpversion' => 1.0,
1165
+ 'blocking' => true,
1166
+ 'headers' => array(),
1167
+ 'body' => null,
1168
+ 'cookies' => array()
1169
+ );
1170
+ $response = wp_remote_get( rtrim( $upload_dir['baseurl'], '/' ) . '/?nocache=' . rand(), $args );
1171
+
1172
+ if ( is_wp_error( $response ) ) {
1173
+ $return = array(
1174
+ 'value' => __( 'No' ),
1175
+ 'valid' => true,
1176
+ );
1177
+ } elseif ( wp_remote_retrieve_response_code( $response ) == 200 && stripos( $response['body'], 'index' ) !== false ) {
1178
+ $return = array(
1179
+ 'value' => __( 'Yes' ),
1180
+ 'valid' => false,
1181
+ );
1182
+ } else {
1183
+ $return = array(
1184
+ 'value' => __( 'No' ),
1185
+ 'valid' => true,
1186
+ );
1187
+ }
1188
+
1189
+ if ( ! HMW_Classes_Tools::isApache() && ! HMW_Classes_Tools::isNginx() && ! HMW_Classes_Tools::isLitespeed() ) {
1190
+ $return['javascript'] = '';
1191
+ }
1192
+
1193
+ return $return;
1194
+ }
1195
+
1196
+ /**
1197
+ * Check if Wondows Live Writer is not disabled
1198
+ *
1199
+ * @return array
1200
+ */
1201
+ public function checkWLW() {
1202
+ $check = ( ! HMW_Classes_Tools::getOption( 'hmw_disable_manifest' ) );
1203
+
1204
+ return array(
1205
+ 'value' => ( $check ? __( 'Yes' ) : __( 'No' ) ),
1206
+ 'valid' => ( ! $check ),
1207
+ );
1208
+
1209
+ }
1210
+
1211
+ /**
1212
+ * Check if XML PRC
1213
+ *
1214
+ * @return array
1215
+ */
1216
+ public function checkXmlrpc() {
1217
+ $check = ( ! HMW_Classes_Tools::getOption( 'hmw_disable_xmlrpc' ) );
1218
+
1219
+ return array(
1220
+ 'value' => ( $check ? __( 'Yes' ) : __( 'No' ) ),
1221
+ 'valid' => ( ! $check ),
1222
+ );
1223
+
1224
+ }
1225
+
1226
+ /**
1227
+ * Check if XML PRC
1228
+ *
1229
+ * @return array
1230
+ */
1231
+ public function checkRDS() {
1232
+ $check = ( ! HMW_Classes_Tools::getOption( 'hmw_hide_header' ) );
1233
+
1234
+ return array(
1235
+ 'value' => ( $check ? __( 'Yes' ) : __( 'No' ) ),
1236
+ 'valid' => ( ! $check ),
1237
+ );
1238
+
1239
+ }
1240
+
1241
+ /**
1242
+ * Check if the WP MySQL user has too many permissions granted
1243
+ * @return array
1244
+ */
1245
+ static function checkMysqlPermissions() {
1246
+ global $wpdb;
1247
+
1248
+ $grants = $wpdb->get_results( 'SHOW GRANTS', ARRAY_N );
1249
+ foreach ( $grants as $grant ) {
1250
+ if ( stripos( $grant[0], 'GRANT ALL PRIVILEGES' ) !== false ) {
1251
+ return array(
1252
+ 'value' => __( 'Yes' ),
1253
+ 'valid' => false,
1254
+ );
1255
+ break;
1256
+ }
1257
+ }
1258
+
1259
+ return array(
1260
+ 'value' => __( 'no' ),
1261
+ 'valid' => true,
1262
+ );
1263
+ }
1264
+
1265
+ /**
1266
+ * Check if an user can be found by its ID
1267
+ * @return mixed
1268
+ */
1269
+ static function checkUsersById() {
1270
+ $users = get_users( 'number=5' );
1271
+ $success = false;
1272
+ $url = home_url() . '/?author=';
1273
+
1274
+ foreach ( $users as $user ) {
1275
+ $response = wp_remote_get( $url . $user->ID, array( 'redirection' => 0 ) );
1276
+ $response_code = wp_remote_retrieve_response_code( $response );
1277
+ if ( $response_code == 301 ) {
1278
+ $success = true;
1279
+ break;
1280
+ }
1281
+ } // foreach
1282
+
1283
+ return array(
1284
+ 'value' => ( $success ? __( 'Yes' ) : __( 'No' ) ),
1285
+ 'valid' => ( ! $success ),
1286
+ );
1287
+ }
1288
+
1289
+ /**
1290
+ * Check if XML PRC
1291
+ *
1292
+ * @return array|bool
1293
+ */
1294
+ public function checkOldPaths() {
1295
+ $url = site_url() . '/' . HMW_Classes_Tools::$default['hmw_wp-content_url'] . '/';
1296
+ $response = wp_remote_get( $url, array( 'redirection' => 0 ) );
1297
+
1298
+ $visible = false;
1299
+ if ( ! is_wp_error( $response ) ) {
1300
+ if ( wp_remote_retrieve_response_code( $response ) == 200 ) {
1301
+ $visible = true;
1302
+ }
1303
+ }
1304
+
1305
+ return array(
1306
+ 'value' => ( $visible ? __( 'Yes' ) : __( 'No' ) ),
1307
+ 'valid' => ( ! $visible ),
1308
+ );
1309
+
1310
+ }
1311
+
1312
+ /**
1313
+ * Check the Old paths in source code
1314
+ * @return array|bool
1315
+ */
1316
+ public function checkCommonPaths() {
1317
+ if ( ! isset( $this->html ) ) {
1318
+ if ( ! $this->getSourceCode() ) {
1319
+ return false;
1320
+ }
1321
+ }
1322
+
1323
+ if ( ! $found = strpos( $this->html, content_url() ) ) {
1324
+ $found = strpos( $this->html, plugins_url() );
1325
+ }
1326
+
1327
+ return array(
1328
+ 'value' => ( $found ? __( 'Yes' ) : __( 'No' ) ),
1329
+ 'valid' => ( ! $found ),
1330
+ );
1331
+
1332
+ }
1333
+
1334
+ /**
1335
+ * Check the Login path in source code
1336
+ * @return array|bool
1337
+ */
1338
+ public function checkLoginPath() {
1339
+ if ( ! isset( $this->html ) ) {
1340
+ if ( ! $this->getSourceCode() ) {
1341
+ return false;
1342
+ }
1343
+ }
1344
+
1345
+ if ( ! $found = strpos( $this->html, home_url( 'wp-login.php' ) ) ) {
1346
+ $found = strpos( $this->html, home_url( HMW_Classes_Tools::getOption( 'hmw_login_url' ) ) );
1347
+ }
1348
+
1349
+ return array(
1350
+ 'value' => ( $found ? __( 'Yes' ) : __( 'No' ) ),
1351
+ 'valid' => ( ! $found ),
1352
+ );
1353
+
1354
+ }
1355
+
1356
+ /**
1357
+ * Check the Admin path in source code
1358
+ * @return array|bool
1359
+ */
1360
+ public function checkAdminPath() {
1361
+ if ( ! isset( $this->html ) ) {
1362
+ if ( ! $this->getSourceCode() ) {
1363
+ return false;
1364
+ }
1365
+ }
1366
+
1367
+ $found = strpos( $this->html, home_url( HMW_Classes_Tools::getOption( 'hmw_admin_url' ) ) );
1368
+
1369
+ return array(
1370
+ 'value' => ( $found ? __( 'Yes' ) : __( 'No' ) ),
1371
+ 'valid' => ( ! $found ),
1372
+ );
1373
+
1374
+ }
1375
+
1376
+ /**
1377
+ * Check if wp-admin is accessible for visitors
1378
+ * @return array
1379
+ */
1380
+ public function checkOldLogin() {
1381
+ $url = site_url() . '/wp-login.php';
1382
+ $response = wp_remote_get( $url, array( 'redirection' => 0 ) );
1383
+
1384
+ $visible = false;
1385
+ if ( ! is_wp_error( $response ) ) {
1386
+ if ( wp_remote_retrieve_response_code( $response ) == 200 ) {
1387
+ $visible = true;
1388
+ }
1389
+ }
1390
+
1391
+ return array(
1392
+ 'value' => ( $visible ? __( 'Yes' ) : __( 'No' ) ),
1393
+ 'valid' => ( ! $visible ),
1394
+ );
1395
+ }
1396
+
1397
+ /**
1398
+ * Check if anyone can register easily
1399
+ * @return array
1400
+ */
1401
+ public function checkUserRegistration() {
1402
+ $check = ( get_option( 'users_can_register' ) );
1403
+ if ( $check ) {
1404
+ $check = ( HMW_Classes_Tools::getOption( 'hmw_register_url' ) == '' );
1405
+ }
1406
+
1407
+ return array(
1408
+ 'value' => ( $check ? __( 'Yes' ) : __( 'No' ) ),
1409
+ 'valid' => ( ! $check ),
1410
+ );
1411
+ }
1412
+
1413
+ public function checkBlogDescription() {
1414
+ $check = ( get_option( 'blogdescription' ) == __( 'Just another WordPress site' ) );
1415
+
1416
+ return array(
1417
+ 'value' => ( $check ? __( 'Yes' ) : __( 'No' ) ),
1418
+ 'valid' => ( ! $check ),
1419
+ );
1420
+ }
1421
+
1422
+ /**
1423
+ * Get the homepage source code
1424
+ * @return string
1425
+ */
1426
+ public function getSourceCode() {
1427
+ if ( ! isset( $this->html ) && ! isset( $this->htmlerror ) ) {
1428
+ $url = home_url( '?rnd=' . rand() );
1429
+ $response = wp_remote_get( $url, array( 'redirection' => 0 ) );
1430
+
1431
+ if ( ! is_wp_error( $response ) ) {
1432
+ if ( wp_remote_retrieve_response_code( $response ) == 200 ) {
1433
+ $this->html = wp_remote_retrieve_body( $response );
1434
+ } else {
1435
+ $this->htmlerror = true;
1436
+ $this->html = false;
1437
+ }
1438
+ } else {
1439
+ $this->htmlerror = true;
1440
+ $this->html = false;
1441
+ }
1442
+ }
1443
+
1444
+ return $this->html;
1445
+ }
1446
+ }
controllers/Settings.php ADDED
@@ -0,0 +1,603 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
3
+
4
+ class HMW_Controllers_Settings extends HMW_Classes_FrontController {
5
+
6
+ public $tabs;
7
+ public $logout = false;
8
+ public $show_token = false;
9
+ public $plugins;
10
+
11
+ public function __construct() {
12
+ parent::__construct();
13
+
14
+ //Show the errors when not on Hide My WP Settings
15
+ if ( HMW_Classes_Tools::getOption( 'logout' ) && ! HMW_Classes_Tools::getOption( 'error' ) ) {
16
+ if ( HMW_Classes_Tools::getValue( 'action' ) == '' && HMW_Classes_Tools::getValue( 'page' ) <> 'hmw_settings' ) {
17
+ add_action( 'admin_notices', array( $this, 'showReconnectError' ) );
18
+ }
19
+ }
20
+
21
+ //If save settings is required, show the alert
22
+ if ( HMW_Classes_Tools::getOption( 'changes' ) ) {
23
+ if ( HMW_Classes_Tools::getValue( 'page' ) <> 'hmw_settings' ) {
24
+ add_action( 'admin_notices', array( $this, 'showSaveRequires' ) );
25
+ }
26
+ }
27
+
28
+ }
29
+
30
+ public function init() {
31
+ //We need that function so make sure is loaded
32
+ if ( ! function_exists( 'is_plugin_active_for_network' ) ) {
33
+ require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
34
+ }
35
+
36
+ //Add the Plugin Paths in variable
37
+ $this->plugins = $this->model->getPlugins();
38
+
39
+ if ( HMW_Classes_Tools::getOption( 'changes' ) ) {
40
+ add_action( 'hmw_form_notices', array( $this, 'showSaveButton' ) );
41
+ }
42
+
43
+ if ( HMW_Classes_Tools::isNginx() && HMW_Classes_Tools::getOption( 'test_frontend' ) && HMW_Classes_Tools::getOption( 'hmw_mode' ) <> 'default' ) {
44
+ $config_file = HMW_Classes_ObjController::getClass( 'HMW_Models_Rules' )->getConfFile();
45
+ HMW_Classes_Error::setError( sprintf( __( "NGINX detected. In case you didn't add the code in the NGINX config already, please add the following line. %s", _HMW_PLUGIN_NAME_ ), '<strong><a href="https://hidemywpghost.com/how-to-setup-hide-my-wp-on-nginx-server/" target="_blank" style="color: red">' . __( "Learn How To Add the Code", _HMW_PLUGIN_NAME_ ) . '</a></strong> <br /><br /><code><strong>include ' . $config_file . ';</strong></code> <br /><br /><h4>' . __( "Don't forget to reload the Nginx service.", _HMW_PLUGIN_NAME_ ) . ' ' . '<strong><a href="http://hidemywp.co/article/how-to-setup-hide-my-wp-on-nginx-server/" target="_blank" style="color: red">' . __( "Learn How", _HMW_PLUGIN_NAME_ ) . '</a></strong>' ) );
46
+ }
47
+
48
+ //Settings Alerts based on Logout and Error statements
49
+ if ( get_transient( 'hmw_restore' ) == 1 ) {
50
+ $restoreForm = '
51
+ <form method="POST">
52
+ ' . wp_nonce_field( 'hmw_abort', 'hmw_nonce', true, false ) . '
53
+ <input type="hidden" name="action" value="hmw_abort" />
54
+ <input type="submit" class="hmw_btn hmw_btn-warning" value="' . __( "Restore Settings", _HMW_PLUGIN_NAME_ ) . '" />
55
+ </form>
56
+ ';
57
+ HMW_Classes_Error::setError( __( 'You want to restore the last saved settings? ', _HMW_PLUGIN_NAME_ ) . '<div class="hmw_abort" style="display: inline-block;">' . $restoreForm . '</div>' );
58
+ // Delete the redirect transient
59
+ delete_transient( 'hmw_restore' );
60
+
61
+ }
62
+
63
+ //Check compatibilities with other plugins
64
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Compatibility' )->getAlerts();
65
+
66
+ //Load the css for Settings
67
+ if(is_rtl()) {
68
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_DisplayController' )->loadMedia( 'popper.min' );
69
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_DisplayController' )->loadMedia( 'bootstrap.rtl.min' );
70
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_DisplayController' )->loadMedia( 'rtl' );
71
+ }else{
72
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_DisplayController' )->loadMedia( 'popper.min' );
73
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_DisplayController' )->loadMedia( 'bootstrap.min' );
74
+ }
75
+
76
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_DisplayController' )->loadMedia( 'font-awesome.min' );
77
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_DisplayController' )->loadMedia( 'switchery.min' );
78
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_DisplayController' )->loadMedia( 'settings' );
79
+
80
+ //Show Hide My WP Offer
81
+ if ( HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'lite' && date('d') >= 15 && date('d') <= 31) {
82
+ HMW_Classes_Error::setError( sprintf( __( '%sLimited Time Offer%s: Get %s65%% OFF%s today on Hide My WP Ghost 5 Websites License. %sHurry Up!%s', _HMW_PLUGIN_NAME_ ), '<a href="https://wpplugins.tips/buy/5_websites_special" target="_blank" style="font-weight: bold"><strong style="color: red">', '</strong></a>', '<a href="https://wpplugins.tips/buy/5_websites_special" target="_blank" style="font-weight: bold"><strong style="color: red">', '</strong></a>', '<a href="https://wpplugins.tips/buy/5_websites_special" target="_blank" style="font-weight: bold">', '</a>' ) );
83
+ }
84
+
85
+ //Show errors on top
86
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_Error' )->hookNotices();
87
+
88
+
89
+ //Show connect for activation
90
+ if ( ! HMW_Classes_Tools::getOption( 'hmw_token' ) ) {
91
+ echo $this->getView( 'Connect' );
92
+
93
+ return;
94
+ }
95
+
96
+ //Add the Menu Tabs in variable
97
+ $this->tabs = $this->model->getTabs();
98
+
99
+ //Check if it's a subpage
100
+ $page = HMW_Classes_Tools::getValue( 'page', 'hmw_settings' );
101
+ if ( strpos( $page, '-' ) !== false ) {
102
+ $_GET['tab'] = substr( $page, ( strpos( $page, '-' ) + 1 ) );
103
+ }
104
+
105
+ //Show the Tab Content
106
+ foreach ( $this->tabs as $slug => $value ) {
107
+ if ( HMW_Classes_Tools::getValue( 'tab', 'hmw_permalinks' ) == $slug ) {
108
+ if ( isset( $value['class'] ) && $value['class'] <> '' ) {
109
+ echo HMW_Classes_ObjController::getClass( $value['class'] )->init()->getView();
110
+ } else {
111
+ echo $this->getView( ucfirst( str_replace( 'hmw_', '', $slug ) ) );
112
+ }
113
+ }
114
+ }
115
+
116
+
117
+ }
118
+
119
+ /**
120
+ * Show this message to notify the user when to update th esettings
121
+ */
122
+ public function showSaveRequires() {
123
+ global $pagenow;
124
+ if ( $pagenow == 'plugins.php' ) {
125
+ ?>
126
+ <div class="hmw_notice error notice" style="margin-left: 0;">
127
+ <div style="display: inline-block;">
128
+ <p>
129
+ <?php echo sprintf( __( "New Plugin/Theme detected! You need to save the Hide My WP Setting again to include them all! %sClick here%s", _HMW_PLUGIN_NAME_ ), '<a href="' . HMW_Classes_Tools::getSettingsUrl() . '" >', '</a>' ); ?>
130
+ </p>
131
+ </div>
132
+ </div>
133
+ <?php
134
+ }
135
+ }
136
+
137
+ public function showSaveButton() {
138
+ ?>
139
+ <div class="col-sm-12 mx-0 hmw_notice error notice">
140
+ <div style="display: inline-block;">
141
+ <p>
142
+ <?php echo sprintf( __( "New Plugin/Theme detected! You need to save the Hide My WP Setting again to include them all! %sSave Settings%s", _HMW_PLUGIN_NAME_ ), '<button type="submit" class="btn btn-success btn-sm mx-2">', '</button>' ); ?>
143
+ </p>
144
+ </div>
145
+ </div>
146
+ <?php
147
+ }
148
+
149
+ /**
150
+ * Show the reconnect alert on all pages
151
+ */
152
+ public function showReconnectError() {
153
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_DisplayController' )->loadMedia( 'alert' );
154
+ ?>
155
+ <div class="hmw_notice error notice" style="margin-left: 0; padding: 5px;">
156
+ <div style="display: inline-block;">
157
+ <p>
158
+ <?php echo sprintf( __( "To activate the new %sHide My WP %s %s settings you need to confirm and re-login!", _HMW_PLUGIN_NAME_ ), '<strong>', _HMW_VER_NAME_, '</strong>' ); ?>
159
+ </p>
160
+ </div>
161
+
162
+ <div class="hmw_logout">
163
+ <form method="POST" action="<?php echo HMW_Classes_Tools::getSettingsUrl() ?>">
164
+ <?php wp_nonce_field( 'hmw_logout', 'hmw_nonce' ) ?>
165
+ <input type="hidden" name="action" value="hmw_logout"/>
166
+ <input type="submit" class="hmw_btn hmw_btn-success" value="<?php echo __( "Yes, I'm ready to re-login", _HMW_PLUGIN_NAME_ ) ?>"/>
167
+ </form>
168
+ </div>
169
+ <div class="hmw_abort" style="display: inline-block;">
170
+ <form method="POST" action="<?php echo HMW_Classes_Tools::getSettingsUrl() ?>">
171
+ <?php wp_nonce_field( 'hmw_abort', 'hmw_nonce' ) ?>
172
+ <input type="hidden" name="action" value="hmw_abort"/>
173
+ <input type="submit" class="hmw_btn hmw_btn-warning" value="<?php echo __( "No, abort", _HMW_PLUGIN_NAME_ ) ?>"/>
174
+ </form>
175
+ </div>
176
+
177
+ </div>
178
+ <?php
179
+ }
180
+
181
+
182
+ /**
183
+ * Get the Admin Toolbar
184
+ *
185
+ * @param null $current
186
+ *
187
+ * @return string
188
+ */
189
+ public function getAdminTabs( $current = null ) {
190
+ //Add the Menu Tabs in variable if not set before
191
+ if ( ! isset( $this->tabs ) ) {
192
+ $this->tabs = $this->model->getTabs();
193
+ }
194
+
195
+ $content = '';
196
+ $content .= '<div class="hmw_nav d-flex flex-column bd-highlight mb-3">';
197
+ $content .= '<div class="m-0 p-4 font-dark text-logo"><a href="https://hidemywpghost.com/" target="_blank"><img src="' . _HMW_THEME_URL_ . 'img/logo.png" class="ml-0 mr-2" style="width:30px;"></a>' . __( 'Hide My WP', _HMW_PLUGIN_NAME_ ) . ' <span style="color: #d6cdd1">' . _HMW_VER_NAME_ . '</span></div>';
198
+ foreach ( $this->tabs as $location => $tab ) {
199
+ if ( $current == $location ) {
200
+ $class = 'active';
201
+ } else {
202
+ $class = '';
203
+ }
204
+ if ( $location == 'hmw_securitycheck' ) {
205
+ $content .= '<a class="m-0 p-4 font-dark hmw_nav_item ' . $class . ' fa fa-' . $tab['icon'] . '" href="' . HMW_Classes_Tools::getSettingsUrl( $location ) . '">';
206
+ } else {
207
+ $content .= '<a class="m-0 p-4 font-dark hmw_nav_item ' . $class . ' fa fa-' . $tab['icon'] . '" href="' . HMW_Classes_Tools::getSettingsUrl() . ( $location <> 'hmw_permalinks' ? '-' . $location : '' ) . '">';
208
+ }
209
+ $content .= '<span>' . $tab['title'] . '</span>';
210
+ $content .= '<span class="hmw_nav_item_description">' . $tab['description'] . '</span>';
211
+ $content .= '</a>';
212
+ }
213
+ if ( HMW_Classes_Tools::getOption( 'api_token' ) <> '' ) {
214
+ $content .= '<div class="m-2 p-4 hmw_nav_button"><a href="' . _HMW_ACCOUNT_SITE_ . '/api/auth/' . HMW_Classes_Tools::getOption( 'api_token' ) . '" class="btn btn-warning btn-lg rounded-0 text-white" target="_blank">' . __( 'My Account', _HMW_PLUGIN_NAME_ ) . '</a></div>';
215
+ }
216
+ $content .= '</div>';
217
+
218
+ return $content;
219
+ }
220
+
221
+ /**
222
+ * Called when an action is triggered
223
+ *
224
+ * @return void
225
+ */
226
+ public function action() {
227
+ parent::action();
228
+
229
+ if ( ! current_user_can( 'manage_options' ) ) {
230
+ return;
231
+ }
232
+
233
+ switch ( HMW_Classes_Tools::getValue( 'action' ) ) {
234
+ case 'hmw_settings':
235
+
236
+ //Save the settings
237
+ if ( ! empty( $_POST ) ) {
238
+ $this->model->savePermalinks( $_POST );
239
+ }
240
+
241
+ if ( ! HMW_Classes_Tools::getOption( 'error' ) ) {
242
+ //Force the rechck security notification
243
+ delete_option( 'hmw_securitycheck_time' );
244
+ //Clear the cache if there are no errors
245
+ HMW_Classes_Tools::emptyCache();
246
+ //Flush the WordPress rewrites
247
+ HMW_Classes_Tools::flushWPRewrites();
248
+ }
249
+
250
+ //If no errors and no reconnect required
251
+ if ( ! HMW_Classes_Tools::getOption( 'error' ) ) {
252
+
253
+ if ( ! HMW_Classes_Tools::getOption( 'logout' ) || HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'default' ) {
254
+ //Save the working options into backup
255
+ $options = HMW_Classes_Tools::getOptions();
256
+ foreach ( $options as $key => $value ) {
257
+ HMW_Classes_Tools::saveOptions( $key, $value, true );
258
+ }
259
+ }
260
+
261
+
262
+ //Send email notification about the path changed
263
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' )->sendEmail();
264
+
265
+ //Flush the changes
266
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' )->flushChanges();
267
+
268
+ HMW_Classes_Error::setError( __( 'Saved' ), 'success' );
269
+
270
+ //Redirect to the new admin URL
271
+ if ( HMW_Classes_Tools::getOption( 'logout' ) ) {
272
+
273
+ //Set the cookies for the current path
274
+ $cookies = HMW_Classes_ObjController::newInstance( 'HMW_Models_Cookies' );
275
+
276
+ if ( $cookies->setCookiesCurrentPath() ) {
277
+ HMW_Classes_Tools::saveOptions( 'logout', false );
278
+ //activate frontend test
279
+ HMW_Classes_Tools::saveOptions( 'test_frontend', true );
280
+
281
+ remove_all_filters( 'wp_redirect' );
282
+ remove_all_filters( 'admin_url' );
283
+ wp_safe_redirect( HMW_Classes_Tools::getSettingsUrl() );
284
+ exit();
285
+ }
286
+ }
287
+ }
288
+
289
+ break;
290
+ case 'hmw_tweakssettings':
291
+ //Save the settings
292
+ if ( ! empty( $_POST ) ) {
293
+ $this->model->saveValues( $_POST );
294
+ }
295
+
296
+ if ( ! HMW_Classes_Tools::getOption( 'error' ) ) {
297
+ //Clear the cache if there are no errors
298
+ HMW_Classes_Tools::emptyCache();
299
+ HMW_Classes_Error::setError( __( 'Saved' ), 'success' );
300
+ }
301
+
302
+ break;
303
+ case 'hmw_mappsettings':
304
+
305
+ HMW_Classes_Tools::saveOptions( 'hmw_mapping_classes', HMW_Classes_Tools::getValue( 'hmw_mapping_classes' ) );
306
+
307
+ //Save the patterns as array
308
+ if ( $hmw_text_mapping_from = HMW_Classes_Tools::getValue( 'hmw_text_mapping_from', false ) ) {
309
+ if ( $hmw_text_mapping_to = HMW_Classes_Tools::getValue( 'hmw_text_mapping_to', false ) ) {
310
+ $hmw_text_mapping = array();
311
+
312
+ if ( HMW_Classes_Tools::getOption( 'hmw_hide_classes' ) ) {
313
+ $custom_classes = json_decode( HMW_Classes_Tools::getOption( 'hmw_hide_classes' ), true );
314
+ if ( ! empty( $custom_classes ) ) {
315
+ foreach ( $custom_classes as $custom_classe ) {
316
+ if ( ! in_array( $custom_classe, array( 'wp-image', 'wp-post', 'wp-caption' ) ) ) {
317
+ $hmw_text_mapping['from'][] = $custom_classe;
318
+ $hmw_text_mapping['to'][] = '';
319
+ }
320
+ }
321
+ HMW_Classes_Tools::saveOptions( 'hmw_hide_classes', json_encode( array() ) );
322
+ }
323
+ }
324
+ foreach ( $hmw_text_mapping_from as $index => $from ) {
325
+ if ( $hmw_text_mapping_from[ $index ] <> '' && $hmw_text_mapping_to[ $index ] <> '' ) {
326
+ $hmw_text_mapping_from[ $index ] = preg_replace( '/[^A-Za-z0-9-_\/\.]/', '', $hmw_text_mapping_from[ $index ] );
327
+ $hmw_text_mapping_to[ $index ] = preg_replace( '/[^A-Za-z0-9-_\/\.]/', '', $hmw_text_mapping_to[ $index ] );
328
+
329
+ if ( ! isset( $hmw_text_mapping['from'] ) || ! in_array( $hmw_text_mapping_from[ $index ], (array) $hmw_text_mapping['from'] ) ) {
330
+ //Don't save the wp-posts for Woodmart theme
331
+ if ( HMW_Classes_Tools::isPluginActive( 'woocommerce/woocommerce.php' ) ) {
332
+ if ( $hmw_text_mapping_from[ $index ] == 'wp-post' || $hmw_text_mapping_from[ $index ] == 'wp-post-image' ) {
333
+ continue;
334
+ }
335
+ }
336
+
337
+ if ( $hmw_text_mapping_from[ $index ] <> $hmw_text_mapping_to[ $index ] ) {
338
+ $hmw_text_mapping['from'][] = $hmw_text_mapping_from[ $index ];
339
+ $hmw_text_mapping['to'][] = $hmw_text_mapping_to[ $index ];
340
+ }
341
+ } else {
342
+ HMW_Classes_Error::setError( __( 'Error: You entered the same text twice in the Text Mapping. We removed the duplicates to prevent any redirect errors.' ) );
343
+ }
344
+ }
345
+ }
346
+ HMW_Classes_Tools::saveOptions( 'hmw_text_mapping', json_encode( $hmw_text_mapping ) );
347
+
348
+ }
349
+ }
350
+
351
+ //Clear the cache if there are no errors
352
+ if ( ! HMW_Classes_Tools::getOption( 'error' ) ) {
353
+ //Clear the cache if there are no errors
354
+ HMW_Classes_Tools::emptyCache();
355
+ HMW_Classes_Error::setError( __( 'Saved' ), 'success' );
356
+ }
357
+ break;
358
+ case 'hmw_advsettings':
359
+
360
+ if ( ! empty( $_POST ) ) {
361
+ $this->model->saveValues( $_POST );
362
+
363
+ //Clear the cache if there are no errors
364
+ if ( ! HMW_Classes_Tools::getOption( 'error' ) ) {
365
+ //Clear the cache if there are no errors
366
+ HMW_Classes_Tools::emptyCache();
367
+ HMW_Classes_Error::setError( __( 'Saved' ), 'success' );
368
+ }
369
+ }
370
+
371
+ break;
372
+ case 'hmw_abort':
373
+ //get the safe options from database
374
+ HMW_Classes_Tools::$options = HMW_Classes_Tools::getOptions( true );
375
+ //set th eprevious admin path
376
+ HMW_Classes_Tools::saveOptions( 'hmw_admin_url', HMW_Classes_Tools::getOption( 'hmw_admin_url' ) );
377
+ HMW_Classes_Tools::saveOptions( 'error', false );
378
+ HMW_Classes_Tools::saveOptions( 'logout', false );
379
+
380
+ //Clear the cache if there are no errors
381
+ HMW_Classes_Tools::emptyCache();
382
+ //Flush the WordPress rewrites
383
+ HMW_Classes_Tools::flushWPRewrites();
384
+
385
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' )->clearRedirect();
386
+
387
+ //Flush config to remove the rules
388
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' )->flushChanges();
389
+
390
+ //Set the cookies for the current path
391
+ $cookies = HMW_Classes_ObjController::newInstance( 'HMW_Models_Cookies' );
392
+ if ( $cookies->setCookiesCurrentPath() ) {
393
+ HMW_Classes_Tools::saveOptions( 'logout', false );
394
+ HMW_Classes_Tools::saveOptions( 'test_frontend', false );
395
+
396
+ remove_all_filters( 'wp_redirect' );
397
+ remove_all_filters( 'admin_url' );
398
+ wp_safe_redirect( HMW_Classes_Tools::getSettingsUrl() );
399
+ exit();
400
+ }
401
+
402
+ break;
403
+ case 'hmw_savedefault':
404
+ HMW_Classes_Tools::saveOptions( 'logout', false );
405
+
406
+ $options = HMW_Classes_Tools::getOptions();
407
+ foreach ( $options as $key => $value ) {
408
+ HMW_Classes_Tools::saveOptions( $key, $value, true );
409
+ }
410
+ break;
411
+ case 'hmw_confirm':
412
+ HMW_Classes_Tools::saveOptions( 'error', false );
413
+ HMW_Classes_Tools::saveOptions( 'logout', false );
414
+ HMW_Classes_Tools::saveOptions( 'test_frontend', false );
415
+
416
+ //save to safe mode in case of db
417
+ foreach ( HMW_Classes_Tools::$options as $key => $value ) {
418
+ HMW_Classes_Tools::saveOptions( $key, $value, true );
419
+ }
420
+
421
+ //Send email notification about the path changed
422
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' )->sendEmail();
423
+
424
+ //Force the rechck security notification
425
+ delete_option( 'hmw_securitycheck_time' );
426
+
427
+ break;
428
+ case 'hmw_logout':
429
+ HMW_Classes_Tools::saveOptions( 'error', false );
430
+ HMW_Classes_Tools::saveOptions( 'logout', false );
431
+ HMW_Classes_Tools::saveOptions( 'test_frontend', false );
432
+
433
+ //Send email notification about the path changed
434
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' )->sendEmail();
435
+
436
+ //save to safe mode in case of db
437
+ foreach ( HMW_Classes_Tools::$options as $key => $value ) {
438
+ HMW_Classes_Tools::saveOptions( $key, $value, true );
439
+ }
440
+
441
+ //Force the rechck security notification
442
+ delete_option( 'hmw_securitycheck_time' );
443
+ //Clear the cache if there are no errors
444
+ HMW_Classes_Tools::emptyCache();
445
+ //Flush the WordPress rewrites
446
+ HMW_Classes_Tools::flushWPRewrites();
447
+
448
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' )->flushChanges();
449
+
450
+ wp_logout();
451
+ wp_redirect( site_url( HMW_Classes_Tools::getOption( 'hmw_login_url' ) ) );
452
+ die();
453
+ break;
454
+ case 'hmw_manualrewrite':
455
+ HMW_Classes_Tools::saveOptions( 'error', false );
456
+ HMW_Classes_Tools::saveOptions( 'logout', false );
457
+ HMW_Classes_Tools::saveOptions( 'test_frontend', true );
458
+
459
+ //Clear the cache if there are no errors
460
+ HMW_Classes_Tools::emptyCache();
461
+
462
+ //Clear the cache if there are no errors
463
+ HMW_Classes_Tools::emptyCache();
464
+ if ( HMW_Classes_Tools::isNginx() || HMW_Classes_Tools::isWpengine() ) {
465
+ @shell_exec( 'nginx -s reload' );
466
+ }
467
+ break;
468
+ case 'hmw_connect':
469
+ //Connect to API with the Email
470
+ $email = sanitize_email( HMW_Classes_Tools::getValue( 'hmw_email', '' ) );
471
+ $token = HMW_Classes_Tools::getValue( 'hmw_token', '' );
472
+
473
+ $redirect_to = HMW_Classes_Tools::getSettingsUrl();
474
+ if ( $token <> '' ) {
475
+ if ( preg_match( '/^[a-z0-9\-]{32}$/i', $token ) ) {
476
+ HMW_Classes_Tools::saveOptions( 'hmw_token', $token );
477
+ HMW_Classes_Tools::saveOptions( 'error', false );
478
+ HMW_Classes_Tools::checkApi();
479
+
480
+ //Save the last safe data
481
+ foreach ( HMW_Classes_Tools::$options as $key => $value ) {
482
+ HMW_Classes_Tools::saveOptions( $key, $value, true );
483
+ }
484
+
485
+ } else {
486
+ HMW_Classes_Error::setError( __( 'ERROR! Please make sure you use a valid token to connect the plugin with WPPlugins', _HMW_PLUGIN_NAME_ ) . " <br /> " );
487
+ }
488
+ } elseif ( $email <> '' ) {
489
+ HMW_Classes_Tools::checkApi( $email, $redirect_to );
490
+ } else {
491
+ HMW_Classes_Error::setError( __( 'ERROR! Please make sure you use an email address to connect the plugin with WPPlugins', _HMW_PLUGIN_NAME_ ) . " <br /> " );
492
+ }
493
+ break;
494
+ case 'hmw_dont_connect':
495
+ $redirect_to = HMW_Classes_Tools::getSettingsUrl();
496
+
497
+ HMW_Classes_Tools::saveOptions( 'hmw_token', md5( home_url() ) );
498
+ HMW_Classes_Tools::saveOptions( 'error', false );
499
+
500
+ //Save the last safe data
501
+ foreach ( HMW_Classes_Tools::$options as $key => $value ) {
502
+ HMW_Classes_Tools::saveOptions( $key, $value, true );
503
+ }
504
+
505
+ wp_redirect( $redirect_to );
506
+ exit();
507
+ case 'hmw_backup':
508
+ //Save the Settings into backup
509
+ if ( ! current_user_can( 'manage_options' ) ) {
510
+ return;
511
+ }
512
+ HMW_Classes_Tools::getOptions();
513
+ HMW_Classes_Tools::setHeader( 'text' );
514
+ header( "Content-Disposition: attachment; filename=hidemywp_backup.txt" );
515
+
516
+ if ( function_exists( 'base64_encode' ) ) {
517
+ echo base64_encode( json_encode( HMW_Classes_Tools::$options ) );
518
+ } else {
519
+ echo json_encode( HMW_Classes_Tools::$options );
520
+ }
521
+ exit();
522
+ break;
523
+ case 'hmw_restore':
524
+ //Restore the backup
525
+ if ( ! current_user_can( 'manage_options' ) ) {
526
+ return;
527
+ }
528
+
529
+ if ( ! empty( $_FILES['hmw_options'] ) && $_FILES['hmw_options']['tmp_name'] <> '' ) {
530
+ $options = file_get_contents( $_FILES['hmw_options']['tmp_name'] );
531
+ try {
532
+ if ( function_exists( 'base64_encode' ) && base64_decode( $options ) <> '' ) {
533
+ $options = base64_decode( $options );
534
+ }
535
+ $options = json_decode( $options, true );
536
+ if ( is_array( $options ) && isset( $options['hmw_ver'] ) ) {
537
+ HMW_Classes_Tools::$options = $options;
538
+ HMW_Classes_Tools::saveOptions();
539
+ HMW_Classes_Error::setError( __( 'Great! The backup is restored.', _HMW_PLUGIN_NAME_ ) . " <br /> ", 'success' );
540
+
541
+ if ( ! HMW_Classes_Tools::getOption( 'error' ) ) {
542
+ //Clear the cache if there are no errors
543
+ HMW_Classes_Tools::emptyCache();
544
+ //Flush the WordPress rewrites
545
+ HMW_Classes_Tools::flushWPRewrites();
546
+ }
547
+
548
+ if ( ! HMW_Classes_Tools::getOption( 'error' ) && ! HMW_Classes_Tools::getOption( 'logout' ) ) {
549
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' )->flushChanges();
550
+ }
551
+
552
+ } else {
553
+ HMW_Classes_Error::setError( __( 'Error! The backup is not valid.', _HMW_PLUGIN_NAME_ ) . " <br /> " );
554
+ }
555
+ } catch ( Exception $e ) {
556
+ HMW_Classes_Error::setError( __( 'Error! The backup is not valid.', _HMW_PLUGIN_NAME_ ) . " <br /> " );
557
+ }
558
+ } else {
559
+ HMW_Classes_Error::setError( __( 'Error! You have to enter a previous saved backup file.', _HMW_PLUGIN_NAME_ ) . " <br /> " );
560
+ }
561
+
562
+ break;
563
+ case 'hmw_support':
564
+ global $current_user, $wp_version;
565
+ $return = array();
566
+
567
+
568
+ $line = "\n\n" . "______________________________________________________________________" . "\n";
569
+ $versions = 'URL:' . get_bloginfo( 'wpurl' ) . ", " . 'PV: ' . HMW_VERSION . ", " . 'WPV: ' . $wp_version;
570
+ $from = HMW_Classes_Tools::getValue( 'hmw_email' );
571
+ $subject = __( 'Hide My Wp > Question', _HMW_PLUGIN_NAME_ );
572
+ $message = HMW_Classes_Tools::getValue( 'hmw_message', '', true );
573
+
574
+ if ( $message <> '' ) {
575
+ $message .= $line;
576
+ $message .= $versions;
577
+
578
+ $headers[] = 'From: ' . $current_user->display_name . ' <' . $from . '>';
579
+ if ( $response = wp_mail( _HMW_SUPPORT_EMAIL_, $subject, $message, $headers ) ) {
580
+ $return['success'] = true;
581
+ } else {
582
+ $return['error'] = true;
583
+ }
584
+ } else {
585
+ $return['error'] = true;
586
+ }
587
+
588
+ HMW_Classes_Tools::setHeader( 'json' );
589
+ echo json_encode( $return );
590
+ exit();
591
+ }
592
+ }
593
+
594
+
595
+ /**
596
+ * Add Javascript in the page footer
597
+ */
598
+ public function hookFooter() {
599
+ HMW_Classes_Tools::saveOptions();
600
+ echo '<script>var hmwQuery = {"ajaxurl": "' . admin_url( 'admin-ajax.php' ) . '","nonce": "' . wp_create_nonce( _HMW_NONCE_ID_ ) . '"}</script>';
601
+ }
602
+
603
+ }
controllers/Widget.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') || die('Cheatin\' uh?');
3
+
4
+ class HMW_Controllers_Widget extends HMW_Classes_FrontController {
5
+
6
+ public $riskreport = array();
7
+ public $risktasks;
8
+
9
+ public function dashboard() {
10
+ $this->risktasks = HMW_Classes_ObjController::getClass('HMW_Controllers_SecurityCheck')->getRiskTasks();
11
+ $this->riskreport =HMW_Classes_ObjController::getClass('HMW_Controllers_SecurityCheck')->getRiskReport();
12
+
13
+ //Show Hide My WP Offer
14
+ if ( HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'lite' && date('d') >= 15 && date('d') <= 31) {
15
+ echo HMW_Classes_Error::showError( sprintf( __( '%sLimited Time Offer%s: Get %s65%% OFF%s today on Hide My WP Ghost 5 Websites License. %sHurry Up!%s', _HMW_PLUGIN_NAME_ ), '<a href="https://wpplugins.tips/buy/5_websites_special" target="_blank" style="font-weight: bold"><strong style="color: red">', '</strong></a>', '<a href="https://wpplugins.tips/buy/5_websites_special" target="_blank" style="font-weight: bold"><strong style="color: red">', '</strong></a>', '<a href="https://wpplugins.tips/buy/5_websites_special" target="_blank" style="font-weight: bold">', '</a>' ) );
16
+ }
17
+
18
+ echo '<script>var hmwQuery = {"ajaxurl": "' . admin_url( 'admin-ajax.php' ) . '","nonce": "' . wp_create_nonce( _HMW_NONCE_ID_ ) . '"}</script>';
19
+ echo $this->getView('Dashboard');
20
+ }
21
+
22
+ public function action() {
23
+ parent::action();
24
+
25
+ if (!current_user_can('manage_options')) {
26
+ return;
27
+ }
28
+
29
+ switch (HMW_Classes_Tools::getValue('action')) {
30
+ case 'hmw_widget_securitycheck':
31
+ HMW_Classes_ObjController::getClass('HMW_Controllers_SecurityCheck')->doSecurityCheck();
32
+
33
+ ob_start();
34
+ $this->dashboard();
35
+ $output = ob_get_clean();
36
+
37
+ HMW_Classes_Tools::setHeader('json');
38
+ echo json_encode(array('data' => $output));
39
+ exit;
40
+
41
+ }
42
+ }
43
+ }
debug/index.php ADDED
@@ -0,0 +1,238 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
3
+
4
+ class HMW_Debug {
5
+
6
+ /** @var array */
7
+ private static $debug;
8
+
9
+ public function __construct() {
10
+ }
11
+
12
+ public function logQueries($query) {
13
+ self::dump($query);
14
+ return $query;
15
+ }
16
+
17
+ public function _isAjax() {
18
+ if (defined('DOING_AJAX') && DOING_AJAX) {
19
+ return true;
20
+ }
21
+ return false;
22
+ }
23
+
24
+ /**
25
+ * Get a value from $_POST / $_GET
26
+ * if unavailable, take a default value
27
+ *
28
+ * @param string $key Value key
29
+ * @param mixed $defaultValue (optional)
30
+ * @return mixed Value
31
+ */
32
+ public static function getValue($key, $defaultValue = false) {
33
+ if (!isset($key) OR empty($key) OR !is_string($key))
34
+ return false;
35
+ $ret = (isset($_POST[$key]) ? $_POST[$key] : (isset($_GET[$key]) ? $_GET[$key] : $defaultValue));
36
+
37
+ if (is_string($ret) === true)
38
+ $ret = urldecode(preg_replace('/((\%5C0+)|(\%00+))/i', '', urlencode($ret)));
39
+ return !is_string($ret) ? $ret : stripslashes($ret);
40
+ }
41
+
42
+ public static function setValue($key, $value) {
43
+ $_POST[$key] = $value;
44
+ $_GET[$key] = $value;
45
+ }
46
+
47
+ /**
48
+ * Check if the parameter is set
49
+ *
50
+ * @param string $key
51
+ * @return boolean
52
+ */
53
+ public static function getIsset($key) {
54
+ if (!isset($key) OR empty($key) OR !is_string($key))
55
+ return false;
56
+ return isset($_POST[$key]) ? true : (isset($_GET[$key]) ? true : false);
57
+ }
58
+
59
+ /**
60
+ * Check if debug is called
61
+ */
62
+ public static function checkDebug() {
63
+ //if debug is called
64
+ if (self::getIsset('debug')) {
65
+ if (self::getValue('debug') === 'on' && HMW_DEBUG) {
66
+ error_reporting(E_ALL);
67
+ @ini_set('display_errors', true);
68
+ if (function_exists('register_shutdown_function')) {
69
+ register_shutdown_function(array(new HMW_Debug(), 'showDebug'));
70
+ }
71
+ }
72
+ }
73
+ // elseif (HMW_DEBUG) {
74
+ // register_shutdown_function(array(new HMW_Debug(), 'showLoadingTime'));
75
+ // }
76
+ }
77
+
78
+ /**
79
+ * Get the debug buffer
80
+ * @param $buffer
81
+ * @return mixed
82
+ */
83
+ public function getBuffer($buffer) {
84
+ if (!$this->_isAjax()) {
85
+ return $buffer;
86
+ }
87
+ if (!$this->getIsset('debug')) {
88
+ return $buffer;
89
+ }
90
+
91
+ return false;
92
+ }
93
+
94
+ /**
95
+ * Store the debug for a later view
96
+ *
97
+ * @return bool|void
98
+ */
99
+ public static function dump() {
100
+ if (HMW_DEBUG) {
101
+ if (self::getValue('debug') !== 'on') {
102
+ return;
103
+ }
104
+
105
+ $output = '';
106
+ $total_arguments = 0;
107
+ $callee = array('file' => '', 'line' => '');
108
+ $run_time = number_format(microtime(true) - HMW_REQUEST_TIME, 3);
109
+
110
+ if (function_exists('func_get_args')) {
111
+ $arguments = func_get_args();
112
+ $total_arguments = count($arguments);
113
+ } else
114
+ $arguments = array();
115
+
116
+
117
+ if (function_exists('debug_backtrace'))
118
+ list($callee) = debug_backtrace();
119
+
120
+ $output .= '<fieldset style="background: #FFFFFF; border: 1px #CCCCCC solid; padding: 5px; font-size: 9pt; margin: 0;">';
121
+ $output .= '<legend style="background: #EEEEEE; padding: 2px; font-size: 8pt;">' . $callee['file'] . ' Time: ' . $run_time . ' @ line: ' . $callee['line']
122
+ . '</legend><pre style="margin: 0; font-size: 8pt; text-align: left;">';
123
+
124
+ $i = 0;
125
+ foreach ($arguments as $argument) {
126
+ if (count($arguments) > 1)
127
+ $output .= "\n" . '<strong>#' . (++$i) . ' of ' . $total_arguments . '</strong>: ';
128
+
129
+ // if argument is boolean, false value does not display, so ...
130
+ if (is_bool($argument))
131
+ $argument = ($argument) ? 'TRUE' : 'FALSE';
132
+ else
133
+ if (is_object($argument) && function_exists('array_reverse') && function_exists('class_parents'))
134
+ $output .= implode("\n" . '|' . "\n", array_reverse(class_parents($argument))) . "\n" . '|' . "\n";
135
+
136
+ $output .= htmlspecialchars(json_encode($argument))
137
+ . ((is_object($argument) && function_exists('spl_object_hash')) ? spl_object_hash($argument) : '');
138
+ }
139
+ $output .= "</pre>";
140
+ $output .= "</fieldset>";
141
+
142
+ self::$debug[] = $output;
143
+ }
144
+ }
145
+
146
+ /**
147
+ * Show the debug dump
148
+ */
149
+ public static function showDebug() {
150
+ HMW_Classes_Tools::setHeader('html');
151
+ $errors = error_get_last();
152
+ HMW_Debug::dump($errors);
153
+ echo "Debug result: <br />" . '<div id="wpcontent">' . '<br />' . @implode('<br />', self::$debug) . '<div>';
154
+
155
+ $run_time = number_format(microtime(true) - HMW_REQUEST_TIME, 3);
156
+ $pps = number_format(1 / $run_time, 0);
157
+ $memory_avail = ini_get('memory_limit');
158
+ $memory_used = number_format(memory_get_usage(true) / (1024 * 1024), 2);
159
+ $memory_peak = number_format(memory_get_peak_usage(true) / (1024 * 1024), 2);
160
+
161
+ if (PHP_SAPI == 'cli') {
162
+ // if run for command line, display some info
163
+ $debug = PHP_EOL
164
+ . "======================================================================================"
165
+ . PHP_EOL
166
+ . " Config: php " . phpversion() . " " . php_sapi_name() . " / zend engine " . zend_version()
167
+ . PHP_EOL
168
+ . " Load: {$memory_avail} (avail) / {$memory_used}M (used) / {$memory_peak}M (peak)"
169
+ . " | Time: {$run_time}s | {$pps} req/sec"
170
+ . PHP_EOL
171
+ . " | Server Timezone: " . date_default_timezone_get()
172
+ . " | Agent: CLI"
173
+ . PHP_EOL
174
+ . "======================================================================================"
175
+ . PHP_EOL;
176
+ } else {
177
+ // if not run from command line, only display if debug is enabled
178
+ $debug = "" //<hr />"
179
+ . "<div style=\"text-align: left;\">"
180
+ . "<small><hr />"
181
+ . " Config: "
182
+ . "<br />"
183
+ . " &nbsp;&nbsp; | php " . phpversion() . " " . php_sapi_name() . " / zend engine " . zend_version()
184
+ . "<br />"
185
+ . " &nbsp;&nbsp; | Server Timezone: " . date_default_timezone_get()
186
+ . "<br />"
187
+ . " Load: "
188
+ . "<br />"
189
+ . " &nbsp;&nbsp; | Memory: {$memory_avail} (avail) / {$memory_used}M (used) / {$memory_peak}M (peak)"
190
+ . "<br />"
191
+ . " &nbsp;&nbsp; | Time: {$run_time}s &nbsp;&nbsp; | {$pps} req/sec"
192
+ . "<br />"
193
+ . "Url: "
194
+ . "<br />"
195
+ . " &nbsp;&nbsp; |"
196
+ . "<br />"
197
+ . " &nbsp;&nbsp; | Agent: " . (@$_SERVER["HTTP_USER_AGENT"])
198
+ . "<br />"
199
+ . "Version Control: "
200
+ . "<br />"
201
+ . "</small>"
202
+ . "</div>"
203
+ . "<br />";
204
+ }
205
+
206
+
207
+ echo '<pre><div id="wpcontent">' . $debug . '</div></pre>';
208
+ }
209
+
210
+ public static function showLoadingTime() {
211
+ $run_time = number_format(microtime(true) - HMW_REQUEST_TIME, 3);
212
+ $pps = number_format(1 / $run_time, 0);
213
+ $memory_avail = ini_get('memory_limit');
214
+ $memory_used = number_format(memory_get_usage(true) / (1024 * 1024), 2);
215
+ $memory_peak = number_format(memory_get_peak_usage(true) / (1024 * 1024), 2);
216
+
217
+ $debug = PHP_EOL
218
+ . "======================================================================================"
219
+ . PHP_EOL
220
+ . " Config: php " . phpversion() . " " . php_sapi_name() . " / zend engine " . zend_version()
221
+ . PHP_EOL
222
+ . " Load: {$memory_avail} (avail) / {$memory_used}M (used) / {$memory_peak}M (peak)"
223
+ . " | Time: {$run_time}s | {$pps} req/sec"
224
+ . PHP_EOL
225
+ . " | Server Timezone: " . date_default_timezone_get()
226
+ . " | Agent: CLI"
227
+ . PHP_EOL
228
+ . "======================================================================================"
229
+ . PHP_EOL;
230
+
231
+
232
+ echo '<pre><div id="wpcontent">' . $debug . '</div></pre>';
233
+ }
234
+
235
+ }
236
+
237
+ defined('HMW_DEBUG') || define('HMW_DEBUG', false);
238
+ HMW_Debug::checkDebug();
index.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Copyright (c) 2016 - 2020, WPPlugins.
4
+ The copyrights to the software code in this file are licensed under the (revised) BSD open source license.
5
+
6
+ Plugin Name: Hide My WP Ghost Lite
7
+ Plugin URI: https://wordpress.org/plugins/hide-my-wp/
8
+ Description: The best solution for WordPress Security. Hide wp-admin, wp-login, wp-content, plugins, themes etc. Add Firewall, Brute Force protection & more. <br /> <a href="https://hidemywpghost.com/wordpress" target="_blank"><strong>Unlock all features</strong></a>
9
+ Version: 4.0.10
10
+ Author: WPPlugins - WordPress Security Plugins
11
+ Author URI: https://wpplugins.tips
12
+ License: GPLv2 or later
13
+ License URI: http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
14
+ Text Domain: hide-my-wp
15
+ Domain Path: /languages
16
+ */
17
+
18
+ if (defined( 'NONCE_KEY' ) && defined( 'ABSPATH' ) && ! defined( 'HMW_VERSION' ) ) {
19
+ define( 'HMW_VERSION', '4.0.10' );
20
+ /* Call config files */
21
+ require( dirname( __FILE__ ) . '/debug/index.php' );
22
+ require( dirname( __FILE__ ) . '/config/config.php' );
23
+
24
+ /* important to check the PHP version */
25
+ try {
26
+ /* inport main classes */
27
+ require_once( _HMW_CLASSES_DIR_ . 'ObjController.php' );
28
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_FrontController' );
29
+
30
+ if ( defined( 'HMW_DISABLE' ) && HMW_DISABLE ) {
31
+ return;
32
+ }
33
+
34
+ //don't run cron hooks and update if there are installs
35
+ if ( ! is_multisite() && defined( 'WP_INSTALLING' ) && WP_INSTALLING ) {
36
+ return;
37
+ } elseif ( is_multisite() && defined( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK ) {
38
+ return;
39
+ }
40
+
41
+ //If Brute Force is activated
42
+ if ( HMW_Classes_Tools::getOption( 'hmw_bruteforce' ) ) {
43
+ HMW_Classes_ObjController::getClass( 'HMW_Controllers_Brute' );
44
+ }
45
+
46
+ //For auto updates
47
+ add_action( 'upgrader_process_complete', array(
48
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_Tools' ),
49
+ 'checkWpUpdates'
50
+ ), 1 );
51
+
52
+ //Make sure to write the rewrites with other plugins
53
+ add_action( 'rewrite_rules_array', array(
54
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_Tools' ),
55
+ 'checkRewriteUpdate'
56
+ ) );
57
+
58
+ if ( is_admin() || is_network_admin() ) {
59
+ register_activation_hook( __FILE__, array(
60
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_Tools' ),
61
+ 'hmw_activate'
62
+ ) );
63
+ register_deactivation_hook( __FILE__, array(
64
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_Tools' ),
65
+ 'hmw_deactivate'
66
+ ) );
67
+
68
+ //verify if there are updated and all plugins and themes are in the right list
69
+ add_action( 'activated_plugin', array(
70
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_Tools' ),
71
+ 'checkWpUpdates'
72
+ ) );
73
+ //When a theme is changed
74
+ add_action( 'after_switch_theme', array(
75
+ HMW_Classes_ObjController::getClass( 'HMW_Classes_Tools' ),
76
+ 'checkWpUpdates'
77
+ ) );
78
+
79
+ }
80
+ } catch(Exception $e) {
81
+ }
82
+
83
+ }
languages/hide-my-wp-en_US.mo ADDED
Binary file
languages/hide-my-wp-en_US.po ADDED
@@ -0,0 +1,2846 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Hide My WP Ghost\n"
4
+ "POT-Creation-Date: 2020-05-14 18:29+0300\n"
5
+ "PO-Revision-Date: 2020-05-14 18:30+0300\n"
6
+ "Last-Translator: John Darrel <john@wpplugins.tips>\n"
7
+ "Language-Team: WpPluginsTips <john@wpplugins.tips>\n"
8
+ "Language: en_US\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 2.3.1\n"
13
+ "X-Poedit-Basepath: ..\n"
14
+ "X-Poedit-WPHeader: index.php\n"
15
+ "X-Poedit-SourceCharset: UTF-8\n"
16
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;"
17
+ "esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;"
18
+ "_nx_noop:3c,1,2;__ngettext_noop:1,2\n"
19
+ "X-Poedit-SearchPath-0: .\n"
20
+ "X-Poedit-SearchPathExcluded-0: *.js\n"
21
+
22
+ #: classes/Error.php:17
23
+ msgid ""
24
+ "Function get_class does not exist! It's required for Hide My WP to work "
25
+ "properly."
26
+ msgstr ""
27
+
28
+ #: classes/Error.php:20
29
+ msgid ""
30
+ "Function file_exists does not exist! It's required for Hide My WP to work "
31
+ "properly."
32
+ msgstr ""
33
+
34
+ #: classes/Error.php:24
35
+ msgid "The home directory is not set!"
36
+ msgstr ""
37
+
38
+ #: classes/Error.php:28
39
+ msgid "The PHP version has to be greater than 5.1"
40
+ msgstr ""
41
+
42
+ #: classes/Error.php:36
43
+ msgid ""
44
+ "For Hide My WP to work, the PHP version has to be equal or greater than 5.1"
45
+ msgstr ""
46
+
47
+ #: classes/Tools.php:30 classes/Tools.php:34
48
+ #, php-format
49
+ msgid ""
50
+ "Your memory limit is %sM. You need at least %sM to prevent loading errors in "
51
+ "frontend. See: %sIncreasing memory allocated to PHP%s"
52
+ msgstr ""
53
+
54
+ #: classes/Tools.php:122
55
+ msgid ""
56
+ "Your IP has been flagged for potential security violations. Please try again "
57
+ "in a little while..."
58
+ msgstr ""
59
+
60
+ #: classes/Tools.php:333
61
+ msgid "Documentation"
62
+ msgstr ""
63
+
64
+ #: classes/Tools.php:334
65
+ msgid "Leave a review"
66
+ msgstr ""
67
+
68
+ #: classes/Tools.php:351
69
+ msgid "Upgrade to Premium"
70
+ msgstr ""
71
+
72
+ #: classes/Tools.php:353 controllers/SecurityCheck.php:185
73
+ msgid "Settings"
74
+ msgstr ""
75
+
76
+ #: classes/Tools.php:1129
77
+ #, php-format
78
+ msgid "CONNECTION ERROR! Make sure your website can access: %s"
79
+ msgstr ""
80
+
81
+ #: classes/Tools.php:1149
82
+ msgid "New Login Information"
83
+ msgstr ""
84
+
85
+ #: controllers/Brute.php:34
86
+ msgid "IP Blocked by Hide My WordPress Brute Force Protection"
87
+ msgstr ""
88
+
89
+ #: controllers/Brute.php:62
90
+ msgid "Add only real IPs. No local ips needed."
91
+ msgstr ""
92
+
93
+ #: controllers/Brute.php:78
94
+ msgid "Add only real IPs. No local ips allowed."
95
+ msgstr ""
96
+
97
+ #: controllers/Brute.php:92
98
+ msgid "You need to set a positive number of attempts "
99
+ msgstr ""
100
+
101
+ #: controllers/Brute.php:100
102
+ msgid "You need to set a positive waiting time"
103
+ msgstr ""
104
+
105
+ #: controllers/Brute.php:107 controllers/Settings.php:261
106
+ #: controllers/Settings.php:292 controllers/Settings.php:349
107
+ #: controllers/Settings.php:362
108
+ msgid "Saved"
109
+ msgstr ""
110
+
111
+ #: controllers/Brute.php:134
112
+ msgid "Cnt"
113
+ msgstr ""
114
+
115
+ #: controllers/Brute.php:135
116
+ msgid "IP"
117
+ msgstr ""
118
+
119
+ #: controllers/Brute.php:136
120
+ msgid "Fail Attempts"
121
+ msgstr ""
122
+
123
+ #: controllers/Brute.php:137
124
+ msgid "Hostname"
125
+ msgstr ""
126
+
127
+ #: controllers/Brute.php:138
128
+ msgid "Options"
129
+ msgstr ""
130
+
131
+ #: controllers/Brute.php:160
132
+ msgid "No blacklisted ips"
133
+ msgstr ""
134
+
135
+ #: controllers/Brute.php:202
136
+ #, php-format
137
+ msgid ""
138
+ "<strong>ERROR:</strong> Email or Password is incorrect. <br /> %d attempts "
139
+ "left before lockout"
140
+ msgstr ""
141
+
142
+ #: controllers/Menu.php:66 controllers/Menu.php:175
143
+ msgid "Hide My WP - Customize Permalinks"
144
+ msgstr ""
145
+
146
+ #: controllers/Menu.php:67 controllers/Menu.php:176
147
+ msgid "Change Paths"
148
+ msgstr ""
149
+
150
+ #: controllers/Menu.php:74 controllers/Menu.php:183
151
+ msgid "Hide My WP - Mapping"
152
+ msgstr ""
153
+
154
+ #: controllers/Menu.php:75 controllers/Menu.php:184 models/Settings.php:17
155
+ msgid "Mapping"
156
+ msgstr ""
157
+
158
+ #: controllers/Menu.php:82 controllers/Menu.php:191
159
+ msgid "Hide My WP - Tweaks"
160
+ msgstr ""
161
+
162
+ #: controllers/Menu.php:83 controllers/Menu.php:192 models/Settings.php:22
163
+ msgid "Tweaks"
164
+ msgstr ""
165
+
166
+ #: controllers/Menu.php:91 controllers/Menu.php:200
167
+ msgid "Hide My WP - Brute Force Protection"
168
+ msgstr ""
169
+
170
+ #: controllers/Menu.php:92 controllers/Menu.php:201
171
+ msgid "Brute Force Protection"
172
+ msgstr ""
173
+
174
+ #: controllers/Menu.php:100 controllers/Menu.php:208
175
+ msgid "Hide My WP - Log Events"
176
+ msgstr ""
177
+
178
+ #: controllers/Menu.php:101 controllers/Menu.php:209 models/Settings.php:32
179
+ #: view/Log.php:70
180
+ msgid "Log Events"
181
+ msgstr ""
182
+
183
+ #: controllers/Menu.php:109 controllers/Menu.php:217
184
+ msgid "Hide My WP - Security Check"
185
+ msgstr ""
186
+
187
+ #: controllers/Menu.php:110 controllers/Menu.php:218 models/Settings.php:37
188
+ #: view/Advanced.php:226 view/Mapping.php:229 view/Permalinks.php:549
189
+ #: view/Tweaks.php:178
190
+ msgid "Security Check"
191
+ msgstr ""
192
+
193
+ #: controllers/Menu.php:117 controllers/Menu.php:225
194
+ msgid "Hide My WP - Recommended Plugins"
195
+ msgstr ""
196
+
197
+ #: controllers/Menu.php:118 controllers/Menu.php:226
198
+ msgid "Install Plugins"
199
+ msgstr ""
200
+
201
+ #: controllers/Menu.php:125 controllers/Menu.php:233
202
+ msgid "Hide My WP - Backup & Restore"
203
+ msgstr ""
204
+
205
+ #: controllers/Menu.php:126 controllers/Menu.php:234 models/Settings.php:48
206
+ msgid "Backup/Restore"
207
+ msgstr ""
208
+
209
+ #: controllers/Menu.php:133 controllers/Menu.php:241
210
+ msgid "Hide My WP - Advanced Settings"
211
+ msgstr ""
212
+
213
+ #: controllers/Menu.php:134 controllers/Menu.php:242 models/Settings.php:53
214
+ msgid "Advanced"
215
+ msgstr ""
216
+
217
+ #: controllers/Menu.php:147 controllers/Settings.php:190
218
+ msgid "Hide My WP"
219
+ msgstr ""
220
+
221
+ #: controllers/Notice.php:31
222
+ msgid "Close notification"
223
+ msgstr ""
224
+
225
+ #: controllers/Notice.php:35
226
+ msgid "Thank you for using Hide My WP?"
227
+ msgstr ""
228
+
229
+ #: controllers/Notice.php:36
230
+ #, php-format
231
+ msgid ""
232
+ "Add %sXML-RPC attack protection, SQL/Script firewall, reCaptcha login%s and "
233
+ "more with Hide My WP Ghost premium features."
234
+ msgstr ""
235
+
236
+ #: controllers/Notice.php:37
237
+ msgid "See all premium features"
238
+ msgstr ""
239
+
240
+ #: controllers/SecurityCheck.php:23
241
+ msgid ""
242
+ "You should check your website every week to see if there are any security "
243
+ "changes."
244
+ msgstr ""
245
+
246
+ #: controllers/SecurityCheck.php:56
247
+ msgid ""
248
+ "First, you need to connect Hide My Wp with WPPlugins and switch from Default "
249
+ "mode to Lite Mode."
250
+ msgstr ""
251
+
252
+ #: controllers/SecurityCheck.php:60 view/Brute.php:30 view/Brute.php:31
253
+ #: view/Brute.php:81 view/Brute.php:94 view/Log.php:12 view/Mapping.php:88
254
+ #: view/Mapping.php:162 view/Permalinks.php:338 view/Permalinks.php:413
255
+ #: view/Permalinks.php:444 view/Tweaks.php:27
256
+ #, php-format
257
+ msgid "This feature requires %sHide My WP Ghost%s."
258
+ msgstr ""
259
+
260
+ #: controllers/SecurityCheck.php:60 view/Brute.php:32 view/Brute.php:82
261
+ #: view/Brute.php:95 view/Log.php:13 view/Mapping.php:89 view/Mapping.php:163
262
+ #: view/Permalinks.php:39 view/Permalinks.php:339 view/Permalinks.php:414
263
+ #: view/Permalinks.php:445 view/Tweaks.php:28
264
+ msgid "PRO"
265
+ msgstr ""
266
+
267
+ #: controllers/SecurityCheck.php:64
268
+ msgid "First, you need to switch Hide My Wp from Default mode to Lite Mode."
269
+ msgstr ""
270
+
271
+ #: controllers/SecurityCheck.php:105
272
+ msgid "PHP Version"
273
+ msgstr ""
274
+
275
+ #: controllers/SecurityCheck.php:109
276
+ msgid ""
277
+ "Using an old version of PHP makes your site slow and prone to hacker attacks "
278
+ "due to known vulnerabilities that exist in versions of PHP that are no "
279
+ "longer maintained. <br /><br />You need <strong>PHP 7.0</strong> or higher "
280
+ "for your website."
281
+ msgstr ""
282
+
283
+ #: controllers/SecurityCheck.php:110
284
+ msgid ""
285
+ "Email your hosting company and tell them you'd like to switch to a newer "
286
+ "version of PHP or move your site to a better hosting company."
287
+ msgstr ""
288
+
289
+ #: controllers/SecurityCheck.php:113
290
+ msgid "Mysql Version"
291
+ msgstr ""
292
+
293
+ #: controllers/SecurityCheck.php:117
294
+ msgid ""
295
+ "Using an old version of MySQL makes your site slow and prone to hacker "
296
+ "attacks due to known vulnerabilities that exist in versions of MySQL that "
297
+ "are no longer maintained. <br /><br />You need <strong>Mysql 5.4</strong> or "
298
+ "higher"
299
+ msgstr ""
300
+
301
+ #: controllers/SecurityCheck.php:118
302
+ msgid ""
303
+ "Email your hosting company and tell them you'd like to switch to a newer "
304
+ "version of MySQL or move your site to a better hosting company"
305
+ msgstr ""
306
+
307
+ #: controllers/SecurityCheck.php:121
308
+ msgid "WordPress Version"
309
+ msgstr ""
310
+
311
+ #: controllers/SecurityCheck.php:125
312
+ #, php-format
313
+ msgid ""
314
+ "You should always update WordPress to the %slatest versions%s. These usually "
315
+ "include the latest security fixes, and don't alter WP in any significant "
316
+ "way. These should be applied as soon as WP releases them. <br /><br />When a "
317
+ "new version of WordPress is available, you will receive an update message on "
318
+ "your WordPress Admin screens. To update WordPress, click the link in this "
319
+ "message."
320
+ msgstr ""
321
+
322
+ #: controllers/SecurityCheck.php:126
323
+ msgid "There is a newer version of WordPress available ({version})."
324
+ msgstr ""
325
+
326
+ #: controllers/SecurityCheck.php:129
327
+ msgid "WP Debug Mode"
328
+ msgstr ""
329
+
330
+ #: controllers/SecurityCheck.php:133
331
+ msgid ""
332
+ "Every good developer should turn on debugging before getting started on a "
333
+ "new plugin or theme. In fact, the WordPress Codex 'highly recommends' that "
334
+ "developers use WP_DEBUG. <br /><br />Unfortunately, many developers forget "
335
+ "the debug mode, even when the website is live. Showing debug logs in the "
336
+ "frontend will let hackers know a lot about your WordPress website."
337
+ msgstr ""
338
+
339
+ #: controllers/SecurityCheck.php:134
340
+ msgid ""
341
+ "Disable WP_DEBUG for live websites in wp_config.php <code>define('WP_DEBUG', "
342
+ "false);</code>"
343
+ msgstr ""
344
+
345
+ #: controllers/SecurityCheck.php:138
346
+ msgid "DB Debug Mode"
347
+ msgstr ""
348
+
349
+ #: controllers/SecurityCheck.php:142
350
+ msgid ""
351
+ "It's not safe to have Database Debug turned on. Make sure you don't use "
352
+ "Database debug on live websites."
353
+ msgstr ""
354
+
355
+ #: controllers/SecurityCheck.php:143
356
+ #, php-format
357
+ msgid ""
358
+ "Turn off the debug plugins if your website is live. You can also switch on "
359
+ "%sHide My Wp > Tweaks > Disable DB Debug in Frontent%s"
360
+ msgstr ""
361
+
362
+ #: controllers/SecurityCheck.php:147
363
+ msgid "Script Debug Mode"
364
+ msgstr ""
365
+
366
+ #: controllers/SecurityCheck.php:151
367
+ msgid ""
368
+ "Every good developer should turn on debugging before getting started on a "
369
+ "new plugin or theme. In fact, the WordPress Codex 'highly recommends' that "
370
+ "developers use SCRIPT_DEBUG. Unfortunately, many developers forget the debug "
371
+ "mode even when the website is live. Showing debug logs in the frontend will "
372
+ "let hackers know a lot about your WordPress website."
373
+ msgstr ""
374
+
375
+ #: controllers/SecurityCheck.php:152
376
+ msgid ""
377
+ "Disable SCRIPT_DEBUG for live websites in wp_config.php "
378
+ "<code>define('SCRIPT_DEBUG', false);</code>"
379
+ msgstr ""
380
+
381
+ #: controllers/SecurityCheck.php:156
382
+ msgid "display_errors PHP directive"
383
+ msgstr ""
384
+
385
+ #: controllers/SecurityCheck.php:160
386
+ msgid ""
387
+ "Displaying any kind of debug info in the frontend is extremely bad. If any "
388
+ "PHP errors happen on your site they should be logged in a safe place and not "
389
+ "displayed to visitors or potential attackers."
390
+ msgstr ""
391
+
392
+ #: controllers/SecurityCheck.php:161
393
+ msgid "Edit wp_config.php and add <code>ini_set('display_errors', 0);</code>"
394
+ msgstr ""
395
+
396
+ #: controllers/SecurityCheck.php:164
397
+ msgid "Backend under SSL"
398
+ msgstr ""
399
+
400
+ #: controllers/SecurityCheck.php:168
401
+ msgid ""
402
+ "SSL is an abbreviation used for Secure Sockets Layers, which are encryption "
403
+ "protocols used on the internet to secure information exchange and provide "
404
+ "certificate information.<br /><br />These certificates provide an assurance "
405
+ "to the user about the identity of the website they are communicating with. "
406
+ "SSL may also be called TLS or Transport Layer Security protocol. <br /><br /"
407
+ ">It's important to have a secure connection for the Admin Dashboard in "
408
+ "WordPress."
409
+ msgstr ""
410
+
411
+ #: controllers/SecurityCheck.php:169
412
+ #, php-format
413
+ msgid "Learn how to set your website as %s. %sClick Here%s"
414
+ msgstr ""
415
+
416
+ #: controllers/SecurityCheck.php:172
417
+ msgid "User 'admin' as Administrator"
418
+ msgstr ""
419
+
420
+ #: controllers/SecurityCheck.php:176
421
+ msgid ""
422
+ "In the old days, the default WordPress admin username was 'admin'. Since "
423
+ "usernames make up half of the login credentials, this made it easier for "
424
+ "hackers to launch brute-force attacks. <br /><br />Thankfully, WordPress has "
425
+ "since changed this and now requires you to select a custom username at the "
426
+ "time of installing WordPress."
427
+ msgstr ""
428
+
429
+ #: controllers/SecurityCheck.php:177
430
+ msgid "Change the user 'admin' with another name to improve security."
431
+ msgstr ""
432
+
433
+ #: controllers/SecurityCheck.php:180
434
+ msgid "Spammers can easily signup"
435
+ msgstr ""
436
+
437
+ #: controllers/SecurityCheck.php:184
438
+ msgid ""
439
+ "If you do not have an e-commerce, membership or guest posting website, you "
440
+ "shouldn't let users subscribe to your blog. You will end up with spam "
441
+ "registrations and your website will be filled with spammy content and "
442
+ "comments."
443
+ msgstr ""
444
+
445
+ #: controllers/SecurityCheck.php:185
446
+ #, php-format
447
+ msgid ""
448
+ "Change the signup path from %sHide My Wp > Custom Register URL%s or uncheck "
449
+ "the option %s > %s > %s"
450
+ msgstr ""
451
+
452
+ #: controllers/SecurityCheck.php:185 controllers/SecurityCheck.php:444
453
+ msgid "General"
454
+ msgstr ""
455
+
456
+ #: controllers/SecurityCheck.php:185
457
+ msgid "Membership"
458
+ msgstr ""
459
+
460
+ #: controllers/SecurityCheck.php:188
461
+ msgid "Outdated Plugins"
462
+ msgstr ""
463
+
464
+ #: controllers/SecurityCheck.php:192
465
+ msgid ""
466
+ "WordPress and its plugins and themes are like any other software installed "
467
+ "on your computer, and like any other application on your devices. "
468
+ "Periodically, developers release updates which provide new features, or fix "
469
+ "known bugs. <br /><br />These new features may not necessarily be something "
470
+ "that you want. In fact, you may be perfectly satisfied with the "
471
+ "functionality you currently have. Nevertheless, you are still likely to be "
472
+ "concerned about bugs.<br /><br />Software bugs can come in many shapes and "
473
+ "sizes. A bug could be very serious, such as preventing users from using a "
474
+ "plugin, or it could be minor and only affect a certain part of a theme, for "
475
+ "example. In some cases, bugs can cause serious security holes. <br /><br /"
476
+ ">Keeping plugins up to date is one of the most important and easiest ways to "
477
+ "keep your site secure."
478
+ msgstr ""
479
+
480
+ #: controllers/SecurityCheck.php:193 controllers/SecurityCheck.php:201
481
+ msgid "Go to the Updates page and update all the plugins to the last version."
482
+ msgstr ""
483
+
484
+ #: controllers/SecurityCheck.php:196
485
+ msgid "Not Updated Plugins"
486
+ msgstr ""
487
+
488
+ #: controllers/SecurityCheck.php:200
489
+ msgid ""
490
+ "Plugins that have not been updated in the last 12 months can have real "
491
+ "security problems. Make sure you use updated plugins from WordPress "
492
+ "Directory."
493
+ msgstr ""
494
+
495
+ #: controllers/SecurityCheck.php:204
496
+ msgid "Version Incompatible Plugins"
497
+ msgstr ""
498
+
499
+ #: controllers/SecurityCheck.php:208
500
+ msgid ""
501
+ "Plugins that are incompatible with your version of WordPress can have real "
502
+ "security problems. Make sure you use tested plugins from WordPress Directory."
503
+ msgstr ""
504
+
505
+ #: controllers/SecurityCheck.php:209
506
+ msgid "Make sure you use tested plugins from WordPress Directory."
507
+ msgstr ""
508
+
509
+ #: controllers/SecurityCheck.php:212
510
+ msgid "Outdated Themes"
511
+ msgstr ""
512
+
513
+ #: controllers/SecurityCheck.php:216
514
+ msgid ""
515
+ "WordPress and its plugins and themes are like any other software installed "
516
+ "on your computer, and like any other application on your devices. "
517
+ "Periodically developers release updates which provide new features or fix "
518
+ "known bugs. <br /><br />New features may be something that you do not "
519
+ "necessarily want. In fact, you may be perfectly satisfied with the "
520
+ "functionality you currently have. Nevertheless, you may still be concerned "
521
+ "about bugs.<br /><br />Software bugs can come in many shapes and sizes. A "
522
+ "bug could be very serious, such as preventing users from using a plugin, or "
523
+ "it could be a minor bug that only affects a certain part of a theme, for "
524
+ "example. In some cases, bugs can even cause serious security holes.<br /"
525
+ "><br />Keeping themes up to date is one of the most important and easiest "
526
+ "ways to keep your site secure."
527
+ msgstr ""
528
+
529
+ #: controllers/SecurityCheck.php:217
530
+ msgid "Go to the Updates page and update all the themes to the last version."
531
+ msgstr ""
532
+
533
+ #: controllers/SecurityCheck.php:220
534
+ msgid "Database Prefix"
535
+ msgstr ""
536
+
537
+ #: controllers/SecurityCheck.php:224
538
+ msgid ""
539
+ "The WordPress database is like a brain for your entire WordPress site, "
540
+ "because every single bit of information about your site is stored there, "
541
+ "thus making it a hacker’s favorite target. <br /><br />Spammers and hackers "
542
+ "run automated code for SQL injections.<br />Unfortunately, many people "
543
+ "forget to change the database prefix when they install WordPress. <br />This "
544
+ "makes it easier for hackers to plan a mass attack by targeting the default "
545
+ "prefix <strong>wp_</strong>."
546
+ msgstr ""
547
+
548
+ #: controllers/SecurityCheck.php:225
549
+ #, php-format
550
+ msgid ""
551
+ "Hide My WP protects your website from most SQL injections but, if possible, "
552
+ "use a custom prefix for database tables to avoid SQL injections. %sRead more"
553
+ "%s"
554
+ msgstr ""
555
+
556
+ #: controllers/SecurityCheck.php:228
557
+ msgid "Versions in Source Code"
558
+ msgstr ""
559
+
560
+ #: controllers/SecurityCheck.php:232
561
+ msgid ""
562
+ "WordPress, plugins and themes add their version info to the source code, so "
563
+ "anyone can see it. <br /><br />Hackers can easily find a website with "
564
+ "vulnerable version plugins or themes, and target these with Zero-Day "
565
+ "Exploits."
566
+ msgstr ""
567
+
568
+ #: controllers/SecurityCheck.php:233
569
+ #, php-format
570
+ msgid "Switch on %sHide My WP > Tweaks > %s %s"
571
+ msgstr ""
572
+
573
+ #: controllers/SecurityCheck.php:233 view/Tweaks.php:65
574
+ msgid "Hide Versions and WordPress Tags"
575
+ msgstr ""
576
+
577
+ #: controllers/SecurityCheck.php:237
578
+ msgid "Salts and Security Keys valid"
579
+ msgstr ""
580
+
581
+ #: controllers/SecurityCheck.php:241
582
+ msgid ""
583
+ "Security keys are used to ensure better encryption of information stored in "
584
+ "the user's cookies and hashed passwords. <br /><br />These make your site "
585
+ "more difficult to hack, access and crack by adding random elements to the "
586
+ "password. You don't have to remember these keys. In fact, once you set them "
587
+ "you'll never see them again. Therefore there's no excuse for not setting "
588
+ "them properly."
589
+ msgstr ""
590
+
591
+ #: controllers/SecurityCheck.php:242
592
+ msgid ""
593
+ "Security keys are defined in wp-config.php as constants on lines. They "
594
+ "should be as unique and as long as possible. <code>AUTH_KEY,SECURE_AUTH_KEY,"
595
+ "LOGGED_IN_KEY,NONCE_KEY,AUTH_SALT,SECURE_AUTH_SALT,LOGGED_IN_SALT,"
596
+ "NONCE_SALT</code>"
597
+ msgstr ""
598
+
599
+ #: controllers/SecurityCheck.php:245
600
+ msgid "Security Keys Updated"
601
+ msgstr ""
602
+
603
+ #: controllers/SecurityCheck.php:249
604
+ msgid ""
605
+ "The security keys in wp-config.php should be renewed as often as possible."
606
+ msgstr ""
607
+
608
+ #: controllers/SecurityCheck.php:250
609
+ #, php-format
610
+ msgid ""
611
+ "You can generate %snew Keys from here%s <code>AUTH_KEY,SECURE_AUTH_KEY,"
612
+ "LOGGED_IN_KEY,NONCE_KEY,AUTH_SALT,SECURE_AUTH_SALT,LOGGED_IN_SALT,"
613
+ "NONCE_SALT</code>"
614
+ msgstr ""
615
+
616
+ #: controllers/SecurityCheck.php:253
617
+ msgid "WordPress dDatabase Password"
618
+ msgstr ""
619
+
620
+ #: controllers/SecurityCheck.php:257
621
+ msgid ""
622
+ "There is no such thing as an \"unimportant password\"! The same goes for "
623
+ "your WordPress database password. <br />Although most servers are configured "
624
+ "so that the database can't be accessed from other hosts (or from outside of "
625
+ "the local network), that doesn't mean your database password should be "
626
+ "\"12345\" or no password at all."
627
+ msgstr ""
628
+
629
+ #: controllers/SecurityCheck.php:258
630
+ msgid ""
631
+ "Choose a proper database password, at least 8 characters long with a "
632
+ "combination of letters, numbers and special characters. After you change it, "
633
+ "set the new password in the wp_config.php file <code>define('DB_PASSWORD', "
634
+ "'NEW_DB_PASSWORD_GOES_HERE');</code>"
635
+ msgstr ""
636
+
637
+ #: controllers/SecurityCheck.php:269
638
+ msgid "/wp-content is visible in source code"
639
+ msgstr ""
640
+
641
+ #: controllers/SecurityCheck.php:273
642
+ msgid ""
643
+ "It's important to rename common WordPress paths, such as wp-content and wp-"
644
+ "includes to prevent hackers from knowing that you have a WordPress website."
645
+ msgstr ""
646
+
647
+ #: controllers/SecurityCheck.php:274
648
+ #, php-format
649
+ msgid ""
650
+ "Change the wp-content, wp-includes and other common paths with %sHide My Wp "
651
+ "> Permalinks%s"
652
+ msgstr ""
653
+
654
+ #: controllers/SecurityCheck.php:277
655
+ msgid "/wp-content path is accessible"
656
+ msgstr ""
657
+
658
+ #: controllers/SecurityCheck.php:281
659
+ msgid ""
660
+ "It's important to hide the common WordPress paths to prevent attacks on "
661
+ "vulnerable plugins and themes. <br /> Also, it's important to hide the names "
662
+ "of plugins and themes to make it impossible for bots to detect them."
663
+ msgstr ""
664
+
665
+ #: controllers/SecurityCheck.php:282
666
+ #, php-format
667
+ msgid ""
668
+ "Switch on %sHide My Wp > Hide WordPress Common Paths%s to hide the old paths"
669
+ msgstr ""
670
+
671
+ #: controllers/SecurityCheck.php:286 controllers/SecurityCheck.php:294
672
+ #, php-format
673
+ msgid "%s is visible in source code"
674
+ msgstr ""
675
+
676
+ #: controllers/SecurityCheck.php:290
677
+ #, php-format
678
+ msgid ""
679
+ "Having the admin URL visible in the source code it's really bad because "
680
+ "hackers will immediately know your secret admin path and start a Brute Force "
681
+ "attack. The custom admin path should not appear in the ajax URL. <br /><br /"
682
+ ">Find solutions for %show to hide the path from source code%s."
683
+ msgstr ""
684
+
685
+ #: controllers/SecurityCheck.php:291
686
+ #, php-format
687
+ msgid ""
688
+ "Switch on %sHide My WP > Permalinks > Hide wp-admin from ajax URL%s. Hide "
689
+ "any reference to admin path from the installed plugins."
690
+ msgstr ""
691
+
692
+ #: controllers/SecurityCheck.php:298
693
+ #, php-format
694
+ msgid ""
695
+ "Having the login URL visible in the source code it's really bad because "
696
+ "hackers will immediately know your secret login path and start a Brute Force "
697
+ "attack. <br /><br />The custom login path should be kept secret and with the "
698
+ "Brute Force Protection activated for it. <br ><br />Find solutions for %show "
699
+ "to hide the path from source code%s."
700
+ msgstr ""
701
+
702
+ #: controllers/SecurityCheck.php:299
703
+ #, php-format
704
+ msgid "%sHide the login path%s from theme menu or widget."
705
+ msgstr ""
706
+
707
+ #: controllers/SecurityCheck.php:302
708
+ msgid "/wp-login path is accessible"
709
+ msgstr ""
710
+
711
+ #: controllers/SecurityCheck.php:306
712
+ msgid ""
713
+ "If your site allows user logins, you need your login page to be easy to find "
714
+ "for your users. You also need to do other things to protect against "
715
+ "malicious login attempts. <br /><br />However, obscurity is a valid security "
716
+ "layer when used as part of a comprehensive security strategy, and if you "
717
+ "want to cut down on the number of malicious login attempts. Making your "
718
+ "login page difficult to find is one way to do that."
719
+ msgstr ""
720
+
721
+ #: controllers/SecurityCheck.php:307
722
+ #, php-format
723
+ msgid ""
724
+ "Change the wp-login from %sHide My Wp > Custom login URL%s and Switch on "
725
+ "%sHide My Wp > Brute Force Protection%s"
726
+ msgstr ""
727
+
728
+ #: controllers/SecurityCheck.php:310
729
+ msgid "/wp_config.php file is writable"
730
+ msgstr ""
731
+
732
+ #: controllers/SecurityCheck.php:314
733
+ msgid ""
734
+ "One of the most important files in your WordPress installation is the wp-"
735
+ "config.php file. <br />This file is located in the root directory of your "
736
+ "WordPress installation, and contains your website's base configuration "
737
+ "details, such as database connection information."
738
+ msgstr ""
739
+
740
+ #: controllers/SecurityCheck.php:315
741
+ #, php-format
742
+ msgid ""
743
+ "Try setting chmod to %s0400%s or %s0440%s and if the website works normally "
744
+ "that's the best one to use."
745
+ msgstr ""
746
+
747
+ #: controllers/SecurityCheck.php:318
748
+ msgid "wp-config.php & wp-config-sample.php files are accessible "
749
+ msgstr ""
750
+
751
+ #: controllers/SecurityCheck.php:322
752
+ msgid ""
753
+ "One of the most important files in your WordPress installation is the wp-"
754
+ "config.php file. <br />This file is located in the root directory of your "
755
+ "WordPress installation and contains your website's base configuration "
756
+ "details, such as database connection information."
757
+ msgstr ""
758
+
759
+ #: controllers/SecurityCheck.php:323
760
+ #, php-format
761
+ msgid ""
762
+ "Switch on %sHide My Wp > Hide WordPress Common Files%s to hide wp-config.php "
763
+ "& wp-config-sample.php files"
764
+ msgstr ""
765
+
766
+ #: controllers/SecurityCheck.php:327
767
+ msgid "readme.html file is accessible "
768
+ msgstr ""
769
+
770
+ #: controllers/SecurityCheck.php:331
771
+ msgid ""
772
+ "It's important to hide or remove the readme.html file because it contains WP "
773
+ "version details."
774
+ msgstr ""
775
+
776
+ #: controllers/SecurityCheck.php:332
777
+ #, php-format
778
+ msgid ""
779
+ "Rename readme.html file or switch on %sHide My Wp > Hide WordPress Common "
780
+ "Files%s"
781
+ msgstr ""
782
+
783
+ #: controllers/SecurityCheck.php:336
784
+ msgid "install.php & upgrade.php files are accessible "
785
+ msgstr ""
786
+
787
+ #: controllers/SecurityCheck.php:340
788
+ msgid ""
789
+ "WordPress is well-known for its ease of installation. <br/>It's important to "
790
+ "hide the wp-admin/install.php and wp-admin/upgrade.php files because there "
791
+ "have already been a couple of security issues regarding these files."
792
+ msgstr ""
793
+
794
+ #: controllers/SecurityCheck.php:341
795
+ #, php-format
796
+ msgid ""
797
+ "Switch on %sHide My Wp > Hide WordPress Common Files%s to hide wp-admin/"
798
+ "install.php & wp-admin/upgrade.php files"
799
+ msgstr ""
800
+
801
+ #: controllers/SecurityCheck.php:345
802
+ msgid "PHP register_globals is on"
803
+ msgstr ""
804
+
805
+ #: controllers/SecurityCheck.php:349
806
+ msgid ""
807
+ "This is one of the biggest security issues you can have on your site! If "
808
+ "your hosting company has this directive enabled by default, switch to "
809
+ "another company immediately!"
810
+ msgstr ""
811
+
812
+ #: controllers/SecurityCheck.php:350
813
+ msgid ""
814
+ "If you have access to php.ini file, set <code>register_globals = off</code> "
815
+ "or contact the hosting company to set it off"
816
+ msgstr ""
817
+
818
+ #: controllers/SecurityCheck.php:353
819
+ msgid "PHP expose_php is on"
820
+ msgstr ""
821
+
822
+ #: controllers/SecurityCheck.php:357
823
+ msgid ""
824
+ "Exposing the PHP version will make the job of attacking your site much "
825
+ "easier."
826
+ msgstr ""
827
+
828
+ #: controllers/SecurityCheck.php:358
829
+ msgid ""
830
+ "If you have access to php.ini file, set <code>expose_php = off</code> or "
831
+ "contact the hosting company to set it off"
832
+ msgstr ""
833
+
834
+ #: controllers/SecurityCheck.php:361
835
+ msgid "PHP safe_mode is on"
836
+ msgstr ""
837
+
838
+ #: controllers/SecurityCheck.php:365
839
+ msgid ""
840
+ "PHP safe mode was one of the attempts to solve security problems of shared "
841
+ "web hosting servers. <br /><br />It is still being used by some web hosting "
842
+ "providers, however, nowadays this is regarded as improper. A systematic "
843
+ "approach proves that it’s architecturally incorrect to try solving complex "
844
+ "security issues at the PHP level, rather than at the web server and OS "
845
+ "levels.<br /><br />Technically, safe mode is a PHP directive that restricts "
846
+ "the way some built-in PHP functions operate. The main problem here is "
847
+ "inconsistency. When turned on, PHP safe mode may prevent many legitimate PHP "
848
+ "functions from working correctly. At the same time there exists a variety of "
849
+ "methods to override safe mode limitations using PHP functions that aren’t "
850
+ "restricted, so if a hacker has already got in – safe mode is useless."
851
+ msgstr ""
852
+
853
+ #: controllers/SecurityCheck.php:366
854
+ msgid ""
855
+ "If you have access to php.ini file, set <code>safe_mode = off</code> or "
856
+ "contact the hosting company to set it off"
857
+ msgstr ""
858
+
859
+ #: controllers/SecurityCheck.php:369
860
+ msgid "PHP allow_url_include is on"
861
+ msgstr ""
862
+
863
+ #: controllers/SecurityCheck.php:373
864
+ msgid ""
865
+ "Having this PHP directive enabled will leave your site exposed to cross-site "
866
+ "attacks (XSS). <br /><br />There's absolutely no valid reason to enable this "
867
+ "directive, and using any PHP code that requires it is very risky."
868
+ msgstr ""
869
+
870
+ #: controllers/SecurityCheck.php:374
871
+ msgid ""
872
+ "If you have access to php.ini file, set <code>allow_url_include = off</code> "
873
+ "or contact the hosting company to set it off"
874
+ msgstr ""
875
+
876
+ #: controllers/SecurityCheck.php:377
877
+ msgid "Plugins/Themes editor enabled"
878
+ msgstr ""
879
+
880
+ #: controllers/SecurityCheck.php:381
881
+ msgid ""
882
+ "The plugins and themes file editor is a very convenient tool because it "
883
+ "enables you to make quick changes without the need to use FTP. <br /><br /"
884
+ ">Unfortunately, it's also a security issue because it not only shows the PHP "
885
+ "source code, it also enables attackers to inject malicious code into your "
886
+ "site if they manage to gain access to admin."
887
+ msgstr ""
888
+
889
+ #: controllers/SecurityCheck.php:382
890
+ msgid ""
891
+ "Disable DISALLOW_FILE_EDIT for live websites in wp_config.php "
892
+ "<code>define('DISALLOW_FILE_EDIT', true);</code>"
893
+ msgstr ""
894
+
895
+ #: controllers/SecurityCheck.php:386
896
+ #, php-format
897
+ msgid "Folder %s is browsable "
898
+ msgstr ""
899
+
900
+ #: controllers/SecurityCheck.php:390
901
+ msgid ""
902
+ "Allowing anyone to view all files in the Uploads folder with a browser will "
903
+ "allow them to easily download all your uploaded files. It's a security and a "
904
+ "copyright issue."
905
+ msgstr ""
906
+
907
+ #: controllers/SecurityCheck.php:391
908
+ #, php-format
909
+ msgid "Learn how to disable %sDirectory Browsing%s"
910
+ msgstr ""
911
+
912
+ #: controllers/SecurityCheck.php:395
913
+ msgid "Windows Live Writer is on "
914
+ msgstr ""
915
+
916
+ #: controllers/SecurityCheck.php:399
917
+ msgid ""
918
+ "If you're not using Windows Live Writer there's really no valid reason to "
919
+ "have its link in the page header, because this tells the whole world you're "
920
+ "using WordPress."
921
+ msgstr ""
922
+
923
+ #: controllers/SecurityCheck.php:400
924
+ #, php-format
925
+ msgid "Switch on %sHide My Wp > Tweaks > Disable WLW Manifest scripts%s"
926
+ msgstr ""
927
+
928
+ #: controllers/SecurityCheck.php:404
929
+ msgid "XML-RPC access is on"
930
+ msgstr ""
931
+
932
+ #: controllers/SecurityCheck.php:408
933
+ msgid ""
934
+ "WordPress XML-RPC is a specification that aims to standardize communications "
935
+ "between different systems. It uses HTTP as the transport mechanism and XML "
936
+ "as encoding mechanism to enable a wide range of data to be transmitted. <br /"
937
+ "><br />The two biggest assets of the API are its extendibility and its "
938
+ "security. XML-RPC authenticates using basic authentication. It sends the "
939
+ "username and password with each request, which is a big no-no in security "
940
+ "circles."
941
+ msgstr ""
942
+
943
+ #: controllers/SecurityCheck.php:409
944
+ #, php-format
945
+ msgid "Switch on %sHide My Wp > Tweaks > Disable XML-RPC access%s"
946
+ msgstr ""
947
+
948
+ #: controllers/SecurityCheck.php:413
949
+ msgid "RDS is visible"
950
+ msgstr ""
951
+
952
+ #: controllers/SecurityCheck.php:417
953
+ msgid ""
954
+ "If you're not using any Really Simple Discovery services such as pingbacks, "
955
+ "there's no need to advertise that endpoint (link) in the header. Please note "
956
+ "that for most sites this is not a security issue because they \"want to be "
957
+ "discovered\", but if you want to hide the fact that you're using WP, this is "
958
+ "the way to go."
959
+ msgstr ""
960
+
961
+ #: controllers/SecurityCheck.php:418
962
+ #, php-format
963
+ msgid "Switch on %sHide My Wp > Tweaks > Hide RSD header%s"
964
+ msgstr ""
965
+
966
+ #: controllers/SecurityCheck.php:422
967
+ msgid "MySql Grant All Permissions"
968
+ msgstr ""
969
+
970
+ #: controllers/SecurityCheck.php:426
971
+ msgid ""
972
+ "If an attacker gains access to your wp-config.php file and gets the MySQL "
973
+ "username and password, he'll be able to login to that database and do "
974
+ "whatever that account allows. <br /><br />That's why it's important to keep "
975
+ "the account's privileges to a bare minimum.<br /><br />For instance, if "
976
+ "you're not installing any new plugins or updating WP, that account doesn't "
977
+ "need the CREATE or DROP table privileges.<br /><br />For regular, day-to-day "
978
+ "usage these are the recommended privileges: SELECT, INSERT, UPDATE and "
979
+ "DELETE."
980
+ msgstr ""
981
+
982
+ #: controllers/SecurityCheck.php:427
983
+ #, php-format
984
+ msgid "To learn how to revoke permissions from PhpMyAdmin %sClick here%s"
985
+ msgstr ""
986
+
987
+ #: controllers/SecurityCheck.php:430
988
+ msgid "Author URL by ID access"
989
+ msgstr ""
990
+
991
+ #: controllers/SecurityCheck.php:434
992
+ msgid ""
993
+ "Usernames (unlike passwords) are not secret. By knowing someone's username, "
994
+ "you can't log in to their account. You also need the password. <br /><br /"
995
+ ">However, by knowing the username, you are one step closer to logging in "
996
+ "using the username to brute-force the password, or to gain access in a "
997
+ "similar way. <br /><br />That's why it's advisable to keep the list of "
998
+ "usernames private, at least to some degree. By default, by accessing siteurl."
999
+ "com/?author={id} and looping through IDs from 1 you can get a list of "
1000
+ "usernames, because WP will redirect you to siteurl.com/author/user/ if the "
1001
+ "ID exists in the system."
1002
+ msgstr ""
1003
+
1004
+ #: controllers/SecurityCheck.php:435
1005
+ #, php-format
1006
+ msgid "Switch on %sHide My Wp > Hide Author ID URL%s"
1007
+ msgstr ""
1008
+
1009
+ #: controllers/SecurityCheck.php:439
1010
+ msgid "Default WordPress Tagline"
1011
+ msgstr ""
1012
+
1013
+ #: controllers/SecurityCheck.php:443
1014
+ msgid ""
1015
+ "The WordPress site tagline is a short phrase located under the site title, "
1016
+ "similar to a subtitle or advertising slogan. The goal of a tagline is to "
1017
+ "convey the essence of your site to visitors. <br /><br />If you don't change "
1018
+ "the default tagline it will be very easy to detect that your website was "
1019
+ "actually built with WordPress"
1020
+ msgstr ""
1021
+
1022
+ #: controllers/SecurityCheck.php:444
1023
+ #, php-format
1024
+ msgid "Change the Tagline in %s > %s"
1025
+ msgstr ""
1026
+
1027
+ #: controllers/SecurityCheck.php:444
1028
+ msgid "Tagline"
1029
+ msgstr ""
1030
+
1031
+ #: controllers/SecurityCheck.php:521 controllers/SecurityCheck.php:549
1032
+ #: controllers/SecurityCheck.php:574
1033
+ msgid "Saved! You can run the test again."
1034
+ msgstr ""
1035
+
1036
+ #: controllers/SecurityCheck.php:526 controllers/SecurityCheck.php:553
1037
+ msgid "Could not fix it. You need to change it yourself."
1038
+ msgstr ""
1039
+
1040
+ #: controllers/SecurityCheck.php:567
1041
+ msgid "Saved! This task will be ignored on future tests."
1042
+ msgstr ""
1043
+
1044
+ #: controllers/SecurityCheck.php:621 controllers/SecurityCheck.php:639
1045
+ #: controllers/SecurityCheck.php:653 controllers/SecurityCheck.php:666
1046
+ #: controllers/SecurityCheck.php:678 controllers/SecurityCheck.php:923
1047
+ #: controllers/SecurityCheck.php:1005 controllers/SecurityCheck.php:1021
1048
+ #: controllers/SecurityCheck.php:1029 controllers/SecurityCheck.php:1105
1049
+ #: controllers/SecurityCheck.php:1118 controllers/SecurityCheck.php:1132
1050
+ #: controllers/SecurityCheck.php:1145 controllers/SecurityCheck.php:1157
1051
+ #: controllers/SecurityCheck.php:1162 controllers/SecurityCheck.php:1187
1052
+ #: controllers/SecurityCheck.php:1212 controllers/SecurityCheck.php:1226
1053
+ #: controllers/SecurityCheck.php:1240 controllers/SecurityCheck.php:1257
1054
+ #: controllers/SecurityCheck.php:1289 controllers/SecurityCheck.php:1311
1055
+ #: controllers/SecurityCheck.php:1333 controllers/SecurityCheck.php:1355
1056
+ #: controllers/SecurityCheck.php:1375 controllers/SecurityCheck.php:1397
1057
+ #: controllers/SecurityCheck.php:1411 controllers/SecurityCheck.php:1420
1058
+ msgid "Yes"
1059
+ msgstr ""
1060
+
1061
+ #: controllers/SecurityCheck.php:621 controllers/SecurityCheck.php:639
1062
+ #: controllers/SecurityCheck.php:653 controllers/SecurityCheck.php:666
1063
+ #: controllers/SecurityCheck.php:678 controllers/SecurityCheck.php:1005
1064
+ #: controllers/SecurityCheck.php:1021 controllers/SecurityCheck.php:1029
1065
+ #: controllers/SecurityCheck.php:1105 controllers/SecurityCheck.php:1118
1066
+ #: controllers/SecurityCheck.php:1132 controllers/SecurityCheck.php:1145
1067
+ #: controllers/SecurityCheck.php:1157 controllers/SecurityCheck.php:1182
1068
+ #: controllers/SecurityCheck.php:1192 controllers/SecurityCheck.php:1212
1069
+ #: controllers/SecurityCheck.php:1226 controllers/SecurityCheck.php:1240
1070
+ #: controllers/SecurityCheck.php:1289 controllers/SecurityCheck.php:1311
1071
+ #: controllers/SecurityCheck.php:1333 controllers/SecurityCheck.php:1355
1072
+ #: controllers/SecurityCheck.php:1375 controllers/SecurityCheck.php:1397
1073
+ #: controllers/SecurityCheck.php:1411 controllers/SecurityCheck.php:1420
1074
+ msgid "No"
1075
+ msgstr ""
1076
+
1077
+ #: controllers/SecurityCheck.php:747
1078
+ #, php-format
1079
+ msgid "%s plugin are outdated: %s"
1080
+ msgstr ""
1081
+
1082
+ #: controllers/SecurityCheck.php:747 controllers/SecurityCheck.php:823
1083
+ msgid "All plugins are up to date"
1084
+ msgstr ""
1085
+
1086
+ #: controllers/SecurityCheck.php:780
1087
+ #, php-format
1088
+ msgid "%s theme(s) are outdated: %s"
1089
+ msgstr ""
1090
+
1091
+ #: controllers/SecurityCheck.php:780
1092
+ msgid "Themes are up to date"
1093
+ msgstr ""
1094
+
1095
+ #: controllers/SecurityCheck.php:859
1096
+ msgid "All plugins are compatible"
1097
+ msgstr ""
1098
+
1099
+ #: controllers/SecurityCheck.php:944
1100
+ #, php-format
1101
+ msgid "%s days since last update"
1102
+ msgstr ""
1103
+
1104
+ #: controllers/SecurityCheck.php:944
1105
+ msgid "Updated"
1106
+ msgstr ""
1107
+
1108
+ #: controllers/SecurityCheck.php:961
1109
+ msgid "Empty"
1110
+ msgstr ""
1111
+
1112
+ #: controllers/SecurityCheck.php:966
1113
+ msgid "only "
1114
+ msgstr ""
1115
+
1116
+ #: controllers/SecurityCheck.php:971
1117
+ msgid "too simple"
1118
+ msgstr ""
1119
+
1120
+ #: controllers/SecurityCheck.php:976
1121
+ msgid "Good"
1122
+ msgstr ""
1123
+
1124
+ #: controllers/SecurityCheck.php:1023
1125
+ msgid ""
1126
+ "Change the wp-config.php file permission to Read-Only using File Manager."
1127
+ msgstr ""
1128
+
1129
+ #: controllers/SecurityCheck.php:1265
1130
+ msgid "no"
1131
+ msgstr ""
1132
+
1133
+ #: controllers/SecurityCheck.php:1417
1134
+ msgid "Just another WordPress site"
1135
+ msgstr ""
1136
+
1137
+ #: controllers/Settings.php:45
1138
+ #, php-format
1139
+ msgid ""
1140
+ "NGINX detected. In case you didn't add the code in the NGINX config already, "
1141
+ "please add the following line. %s"
1142
+ msgstr ""
1143
+
1144
+ #: controllers/Settings.php:45 models/Rewrite.php:684
1145
+ msgid "Learn How To Add the Code"
1146
+ msgstr ""
1147
+
1148
+ #: controllers/Settings.php:45
1149
+ msgid "Don't forget to reload the Nginx service."
1150
+ msgstr ""
1151
+
1152
+ #: controllers/Settings.php:45
1153
+ msgid "Learn How"
1154
+ msgstr ""
1155
+
1156
+ #: controllers/Settings.php:54 view/Backup.php:16
1157
+ msgid "Restore Settings"
1158
+ msgstr ""
1159
+
1160
+ #: controllers/Settings.php:57
1161
+ msgid "You want to restore the last saved settings? "
1162
+ msgstr ""
1163
+
1164
+ #: controllers/Settings.php:75
1165
+ #, php-format
1166
+ msgid ""
1167
+ "%sLimited Time Offer%s: Get %s65%% OFF%s today on Hide My WP Ghost 5 "
1168
+ "Websites License. %sHurry Up!%s"
1169
+ msgstr ""
1170
+
1171
+ #: controllers/Settings.php:122
1172
+ #, php-format
1173
+ msgid ""
1174
+ "New Plugin/Theme detected! You need to save the Hide My WP Setting again to "
1175
+ "include them all! %sClick here%s"
1176
+ msgstr ""
1177
+
1178
+ #: controllers/Settings.php:135
1179
+ #, php-format
1180
+ msgid ""
1181
+ "New Plugin/Theme detected! You need to save the Hide My WP Setting again to "
1182
+ "include them all! %sSave Settings%s"
1183
+ msgstr ""
1184
+
1185
+ #: controllers/Settings.php:151
1186
+ #, php-format
1187
+ msgid ""
1188
+ "To activate the new %sHide My WP %s %s settings you need to confirm and re-"
1189
+ "login!"
1190
+ msgstr ""
1191
+
1192
+ #: controllers/Settings.php:159
1193
+ msgid "Yes, I'm ready to re-login"
1194
+ msgstr ""
1195
+
1196
+ #: controllers/Settings.php:166 view/FrontendCheck.php:36
1197
+ msgid "No, abort"
1198
+ msgstr ""
1199
+
1200
+ #: controllers/Settings.php:207
1201
+ msgid "My Account"
1202
+ msgstr ""
1203
+
1204
+ #: controllers/Settings.php:336
1205
+ msgid ""
1206
+ "Error: You entered the same text twice in the Text Mapping. We removed the "
1207
+ "duplicates to prevent any redirect errors."
1208
+ msgstr ""
1209
+
1210
+ #: controllers/Settings.php:479
1211
+ msgid ""
1212
+ "ERROR! Please make sure you use a valid token to connect the plugin with "
1213
+ "WPPlugins"
1214
+ msgstr ""
1215
+
1216
+ #: controllers/Settings.php:484
1217
+ msgid ""
1218
+ "ERROR! Please make sure you use an email address to connect the plugin with "
1219
+ "WPPlugins"
1220
+ msgstr ""
1221
+
1222
+ #: controllers/Settings.php:533
1223
+ msgid "Great! The backup is restored."
1224
+ msgstr ""
1225
+
1226
+ #: controllers/Settings.php:547 controllers/Settings.php:550
1227
+ msgid "Error! The backup is not valid."
1228
+ msgstr ""
1229
+
1230
+ #: controllers/Settings.php:553
1231
+ msgid "Error! You have to enter a previous saved backup file."
1232
+ msgstr ""
1233
+
1234
+ #: controllers/Settings.php:566
1235
+ msgid "Hide My Wp > Question"
1236
+ msgstr ""
1237
+
1238
+ #: models/Brute.php:427
1239
+ #, php-format
1240
+ msgid "%sYou failed to correctly answer the math problem.%s Please try again"
1241
+ msgstr ""
1242
+
1243
+ #: models/Brute.php:435
1244
+ #, php-format
1245
+ msgid ""
1246
+ "%sERROR:%s Email or Password is incorrect. %s %d attempts left before lockout"
1247
+ msgstr ""
1248
+
1249
+ #: models/Brute.php:459
1250
+ msgid "Prove your humanity: "
1251
+ msgstr ""
1252
+
1253
+ #: models/Brute.php:472
1254
+ msgid "Login Blocked by Hide My WordPress"
1255
+ msgstr ""
1256
+
1257
+ #: models/Compatibility.php:211
1258
+ msgid ""
1259
+ "CDN Enabled detected. Please include the new wp-content and wp-includes "
1260
+ "paths in CDN Enabler Settings"
1261
+ msgstr ""
1262
+
1263
+ #: models/Compatibility.php:219
1264
+ #, php-format
1265
+ msgid ""
1266
+ "CDN Enabler detected! Learn how to configure it with Hide My WP %sClick here"
1267
+ "%s"
1268
+ msgstr ""
1269
+
1270
+ #: models/Compatibility.php:231
1271
+ #, php-format
1272
+ msgid ""
1273
+ "WP Super Cache CDN detected. Please include %s and %s paths in WP Super "
1274
+ "Cache > CDN > Include directories"
1275
+ msgstr ""
1276
+
1277
+ #: models/Compatibility.php:238
1278
+ #, php-format
1279
+ msgid ""
1280
+ "Hide My WP does not work without mode_rewrite. Please activate the rewrite "
1281
+ "module in Apache. %sMore details%s"
1282
+ msgstr ""
1283
+
1284
+ #: models/Compatibility.php:243
1285
+ #, php-format
1286
+ msgid ""
1287
+ "Hide My WP does not work with %s Permalinks. Change it to %s or other type "
1288
+ "in Settings > Permalinks in order to hide it"
1289
+ msgstr ""
1290
+
1291
+ #: models/Compatibility.php:243
1292
+ msgid "Plain"
1293
+ msgstr ""
1294
+
1295
+ #: models/Compatibility.php:243
1296
+ msgid "Post Name"
1297
+ msgstr ""
1298
+
1299
+ #: models/Compatibility.php:248
1300
+ #, php-format
1301
+ msgid ""
1302
+ "You need to activate the URL Rewrite for IIS to be able to change the "
1303
+ "permalink structure to friendly URL (without index.php). %sMore details%s"
1304
+ msgstr ""
1305
+
1306
+ #: models/Compatibility.php:250
1307
+ msgid ""
1308
+ "You need to set the permalink structure to friendly URL (without index.php)."
1309
+ msgstr ""
1310
+
1311
+ #: models/Compatibility.php:255
1312
+ msgid ""
1313
+ "The constant ADMIN_COOKIE_PATH is defined in wp-config.php by another "
1314
+ "plugin. Hide My WP will not work unless you remove the line "
1315
+ "define('ADMIN_COOKIE_PATH', ...);"
1316
+ msgstr ""
1317
+
1318
+ #: models/Compatibility.php:261
1319
+ #, php-format
1320
+ msgid ""
1321
+ "Inmotion detected. %sPlease read how to make the plugin compatible with "
1322
+ "Inmotion Nginx Cache%s"
1323
+ msgstr ""
1324
+
1325
+ #: models/Compatibility.php:273
1326
+ msgid ""
1327
+ "Hide My WP rules are not saved in the config file and this may affect the "
1328
+ "website loading speed."
1329
+ msgstr ""
1330
+
1331
+ #: models/Compatibility.php:283
1332
+ #, php-format
1333
+ msgid ""
1334
+ "Godaddy detected! To avoid CSS errors, make sure you switch off the CDN from "
1335
+ "%s"
1336
+ msgstr ""
1337
+
1338
+ #: models/Rewrite.php:643
1339
+ #, php-format
1340
+ msgid ""
1341
+ "IIS detected. You need to update your %s file by adding the following lines "
1342
+ "after &lt;rules&gt; tag: %s"
1343
+ msgstr ""
1344
+
1345
+ #: models/Rewrite.php:664 models/Rewrite.php:732
1346
+ #, php-format
1347
+ msgid ""
1348
+ "Config file is not writable. You need to update your %s file by adding the "
1349
+ "following lines at the beginning of the file: %s"
1350
+ msgstr ""
1351
+
1352
+ #: models/Rewrite.php:684
1353
+ #, php-format
1354
+ msgid ""
1355
+ "WpEngine detected. Add the redirects in the WpEngine Redirect rules panel %s"
1356
+ msgstr ""
1357
+
1358
+ #: models/Rewrite.php:764
1359
+ #, php-format
1360
+ msgid ""
1361
+ "Config file is not writable. You have to added it manually at the beginning "
1362
+ "of the %s file: %s"
1363
+ msgstr ""
1364
+
1365
+ #: models/Rewrite.php:2034
1366
+ msgid ""
1367
+ "There has been a critical error on your website. Please check your site "
1368
+ "admin email inbox for instructions."
1369
+ msgstr ""
1370
+
1371
+ #: models/Rewrite.php:2036
1372
+ msgid "There has been a critical error on your website."
1373
+ msgstr ""
1374
+
1375
+ #: models/Settings.php:12
1376
+ msgid "Permalinks"
1377
+ msgstr ""
1378
+
1379
+ #: models/Settings.php:13
1380
+ msgid "Change common paths"
1381
+ msgstr ""
1382
+
1383
+ #: models/Settings.php:18
1384
+ msgid "Text and URL mapping"
1385
+ msgstr ""
1386
+
1387
+ #: models/Settings.php:23
1388
+ msgid "Add WordPress Tweaks"
1389
+ msgstr ""
1390
+
1391
+ #: models/Settings.php:27
1392
+ msgid "Brute Force"
1393
+ msgstr ""
1394
+
1395
+ #: models/Settings.php:28
1396
+ msgid "Add Login Protection"
1397
+ msgstr ""
1398
+
1399
+ #: models/Settings.php:33
1400
+ msgid "Website Events Log"
1401
+ msgstr ""
1402
+
1403
+ #: models/Settings.php:38
1404
+ msgid "Test Your Website"
1405
+ msgstr ""
1406
+
1407
+ #: models/Settings.php:43 view/Plugins.php:29
1408
+ msgid "Plugins"
1409
+ msgstr ""
1410
+
1411
+ #: models/Settings.php:49
1412
+ msgid "Save your settings"
1413
+ msgstr ""
1414
+
1415
+ #: models/Settings.php:67
1416
+ msgid "WP Super Cache"
1417
+ msgstr ""
1418
+
1419
+ #: models/Settings.php:69
1420
+ msgid ""
1421
+ "A very fast caching engine for WordPress that produces static html files. "
1422
+ "Works well with Minify HTML plugin."
1423
+ msgstr ""
1424
+
1425
+ #: models/Settings.php:74
1426
+ msgid "Autoptimize"
1427
+ msgstr ""
1428
+
1429
+ #: models/Settings.php:76
1430
+ msgid ""
1431
+ "Autoptimize speeds up your website by optimizing JS, CSS and HTML, async-ing "
1432
+ "JavaScript, removing emoji cruft, optimizing Google Fonts and more."
1433
+ msgstr ""
1434
+
1435
+ #: models/Settings.php:81
1436
+ msgid "Minify HTML"
1437
+ msgstr ""
1438
+
1439
+ #: models/Settings.php:83
1440
+ msgid ""
1441
+ "Minify HTML output for clean looking markup and faster downloading. Minify "
1442
+ "HTML also has optional specialized minification for JS and internal CSS."
1443
+ msgstr ""
1444
+
1445
+ #: models/Settings.php:88
1446
+ msgid "iThemes Security"
1447
+ msgstr ""
1448
+
1449
+ #: models/Settings.php:90
1450
+ msgid ""
1451
+ "iThemes Security gives you over 30+ ways to secure and protect your WP site. "
1452
+ "WP sites can be an easy target for attacks because of plugin "
1453
+ "vulnerabilities, weak passwords and obsolete software."
1454
+ msgstr ""
1455
+
1456
+ #: models/Settings.php:95
1457
+ msgid "Sucuri Security"
1458
+ msgstr ""
1459
+
1460
+ #: models/Settings.php:97
1461
+ msgid ""
1462
+ "The Sucuri WordPress Security plugin is a security toolset for security "
1463
+ "integrity monitoring, malware detection and security hardening."
1464
+ msgstr ""
1465
+
1466
+ #: models/Settings.php:102
1467
+ msgid "Back Up WordPress"
1468
+ msgstr ""
1469
+
1470
+ #: models/Settings.php:104
1471
+ msgid ""
1472
+ "Simple automated backups of your WordPress-powered website. Back Up "
1473
+ "WordPress will back up your entire site including your database and all your "
1474
+ "files on a schedule that suits you."
1475
+ msgstr ""
1476
+
1477
+ #: models/Settings.php:109
1478
+ msgid "SEO SQUIRRLY"
1479
+ msgstr ""
1480
+
1481
+ #: models/Settings.php:111
1482
+ msgid ""
1483
+ "Welcome to Assisted WordPress SEO. Say Good-Bye to Search Engine "
1484
+ "Frustrations. Squirrly assists you in getting Excellent SEO for Humans and "
1485
+ "Search Engines."
1486
+ msgstr ""
1487
+
1488
+ #: models/Settings.php:116
1489
+ msgid "Elementor Page Builder"
1490
+ msgstr ""
1491
+
1492
+ #: models/Settings.php:118
1493
+ msgid ""
1494
+ "The most advanced frontend drag & drop page builder. Create high-end, pixel "
1495
+ "perfect websites at record speeds. Any theme, any page, any design."
1496
+ msgstr ""
1497
+
1498
+ #: models/Settings.php:123
1499
+ msgid "Weglot Translate"
1500
+ msgstr ""
1501
+
1502
+ #: models/Settings.php:125
1503
+ msgid ""
1504
+ "Translate your website into multiple languages without any code. Weglot "
1505
+ "Translate is fully SEO compatible and follows Google's best practices."
1506
+ msgstr ""
1507
+
1508
+ #: models/Settings.php:130
1509
+ msgid "AddToAny Share Btn"
1510
+ msgstr ""
1511
+
1512
+ #: models/Settings.php:132
1513
+ msgid ""
1514
+ "Share buttons for WordPress including the AddToAny sharing button, Facebook, "
1515
+ "Twitter, Google+, Pinterest, WhatsApp, many more, and follow icons too."
1516
+ msgstr ""
1517
+
1518
+ #: models/Settings.php:146
1519
+ msgid ""
1520
+ "You can't set both ADMIN and LOGIN with the same name. Please use different "
1521
+ "names"
1522
+ msgstr ""
1523
+
1524
+ #: models/Settings.php:295
1525
+ #, php-format
1526
+ msgid ""
1527
+ "Short name detected: %s. You need to use unique paths with more than 4 chars "
1528
+ "to avoid WordPress errors."
1529
+ msgstr ""
1530
+
1531
+ #: models/Settings.php:300
1532
+ #, php-format
1533
+ msgid ""
1534
+ "Invalid name detected: %s. You need to use another name to avoid WordPress "
1535
+ "errors."
1536
+ msgstr ""
1537
+
1538
+ #: models/Settings.php:305
1539
+ #, php-format
1540
+ msgid ""
1541
+ "Invalid name detected: %s. Add only the final path name to avoid WordPress "
1542
+ "errors."
1543
+ msgstr ""
1544
+
1545
+ #: models/Settings.php:309
1546
+ #, php-format
1547
+ msgid ""
1548
+ "Invalid name detected: %s. The name can't start with / to avoid WordPress "
1549
+ "errors."
1550
+ msgstr ""
1551
+
1552
+ #: models/Settings.php:316
1553
+ #, php-format
1554
+ msgid ""
1555
+ "Invalid name detected: %s. The paths can't end with . to avoid WordPress "
1556
+ "errors."
1557
+ msgstr ""
1558
+
1559
+ #: models/Settings.php:343
1560
+ #, php-format
1561
+ msgid ""
1562
+ "Weak name detected: %s. You need to use another name to increase your "
1563
+ "website security."
1564
+ msgstr ""
1565
+
1566
+ #: view/Advanced.php:11
1567
+ msgid "Redirect Settings"
1568
+ msgstr ""
1569
+
1570
+ #: view/Advanced.php:15
1571
+ msgid "Redirect hidden paths"
1572
+ msgstr ""
1573
+
1574
+ #: view/Advanced.php:19
1575
+ msgid "Front page"
1576
+ msgstr ""
1577
+
1578
+ #: view/Advanced.php:20
1579
+ msgid "404 page"
1580
+ msgstr ""
1581
+
1582
+ #: view/Advanced.php:32
1583
+ msgid ""
1584
+ "Redirect the protected paths /wp-admin, /wp-login to Front Page or 404 page."
1585
+ msgstr ""
1586
+
1587
+ #: view/Advanced.php:33
1588
+ msgid ""
1589
+ "You can create a new page and come back to choose to redirect to that page"
1590
+ msgstr ""
1591
+
1592
+ #: view/Advanced.php:39
1593
+ msgid "Custom Safe URL Param"
1594
+ msgstr ""
1595
+
1596
+ #: view/Advanced.php:40
1597
+ msgid "eg. disable_url, safe_url"
1598
+ msgstr ""
1599
+
1600
+ #: view/Advanced.php:46
1601
+ msgid ""
1602
+ "The Safe URL will set all the settings to default. Use it only if you're "
1603
+ "locked out"
1604
+ msgstr ""
1605
+
1606
+ #: view/Advanced.php:47
1607
+ msgid "Safe URL:"
1608
+ msgstr ""
1609
+
1610
+ #: view/Advanced.php:53
1611
+ msgid "Compatibility Settings"
1612
+ msgstr ""
1613
+
1614
+ #: view/Advanced.php:61
1615
+ msgid "Fix Relative URLs"
1616
+ msgstr ""
1617
+
1618
+ #: view/Advanced.php:63
1619
+ #, php-format
1620
+ msgid "Convert links like /wp-content/* into %s/wp-content/*."
1621
+ msgstr ""
1622
+
1623
+ #: view/Advanced.php:73
1624
+ msgid "Fix Sitemaps XML"
1625
+ msgstr ""
1626
+
1627
+ #: view/Advanced.php:75
1628
+ msgid "Double check the Sitemap XML files and make sure the paths are changed."
1629
+ msgstr ""
1630
+
1631
+ #: view/Advanced.php:85
1632
+ msgid "Fix Robots.txt"
1633
+ msgstr ""
1634
+
1635
+ #: view/Advanced.php:87
1636
+ msgid "Hide WordPress paths from robots.txt file"
1637
+ msgstr ""
1638
+
1639
+ #: view/Advanced.php:97
1640
+ msgid "Late Loading"
1641
+ msgstr ""
1642
+
1643
+ #: view/Advanced.php:99
1644
+ msgid ""
1645
+ "Load HMW after all plugins are loaded. Useful for CDN plugins (eg. CDN "
1646
+ "Enabler)."
1647
+ msgstr ""
1648
+
1649
+ #: view/Advanced.php:100
1650
+ msgid "(only if other cache plugins request this)"
1651
+ msgstr ""
1652
+
1653
+ #: view/Advanced.php:110
1654
+ msgid "Clean Login Page"
1655
+ msgstr ""
1656
+
1657
+ #: view/Advanced.php:112
1658
+ msgid ""
1659
+ "Cancel the login hooks from other plugins and themes to prevent them from "
1660
+ "changing the Hide My WordPress redirects."
1661
+ msgstr ""
1662
+
1663
+ #: view/Advanced.php:112
1664
+ msgid "(not recommended)"
1665
+ msgstr ""
1666
+
1667
+ #: view/Advanced.php:121
1668
+ msgid "Cache Settings"
1669
+ msgstr ""
1670
+
1671
+ #: view/Advanced.php:129
1672
+ msgid "Security Check Notification"
1673
+ msgstr ""
1674
+
1675
+ #: view/Advanced.php:131
1676
+ msgid "Show Security Check notification when it's not checked every week."
1677
+ msgstr ""
1678
+
1679
+ #: view/Advanced.php:147
1680
+ msgid "Optimize CSS and JS files"
1681
+ msgstr ""
1682
+
1683
+ #: view/Advanced.php:148
1684
+ msgid "Cache CSS, JS and Images to increase the frontend loading speed."
1685
+ msgstr ""
1686
+
1687
+ #: view/Advanced.php:149
1688
+ #, php-format
1689
+ msgid "Check the website loading speed with %sPingdom Tool%s"
1690
+ msgstr ""
1691
+
1692
+ #: view/Advanced.php:157
1693
+ msgid "Notification Settings"
1694
+ msgstr ""
1695
+
1696
+ #: view/Advanced.php:165
1697
+ msgid "Email notification"
1698
+ msgstr ""
1699
+
1700
+ #: view/Advanced.php:166
1701
+ msgid "Send me an email with the changed admin and login URLs"
1702
+ msgstr ""
1703
+
1704
+ #: view/Advanced.php:175 view/Connect.php:17
1705
+ msgid "Email Address"
1706
+ msgstr ""
1707
+
1708
+ #: view/Advanced.php:191 view/Brute.php:115 view/Mapping.php:210
1709
+ #: view/Mapping.php:215 view/Permalinks.php:530 view/Permalinks.php:535
1710
+ #: view/Tweaks.php:162
1711
+ msgid "Save"
1712
+ msgstr ""
1713
+
1714
+ #: view/Advanced.php:192 view/Brute.php:116 view/Mapping.php:211
1715
+ #: view/Mapping.php:216 view/Permalinks.php:531 view/Permalinks.php:536
1716
+ #: view/Tweaks.php:163
1717
+ #, php-format
1718
+ msgid "Love Hide My WP %s? Show us ;)"
1719
+ msgstr ""
1720
+
1721
+ #: view/Advanced.php:199 view/Mapping.php:243 view/Permalinks.php:563
1722
+ #: view/Tweaks.php:192
1723
+ msgid "Love Hide My WP?"
1724
+ msgstr ""
1725
+
1726
+ #: view/Advanced.php:204 view/Permalinks.php:568 view/Tweaks.php:197
1727
+ msgid "Please help us and support our plugin on WordPress.org"
1728
+ msgstr ""
1729
+
1730
+ #: view/Advanced.php:207 view/Mapping.php:249 view/Permalinks.php:571
1731
+ #: view/Tweaks.php:200
1732
+ msgid "Rate Hide My WP"
1733
+ msgstr ""
1734
+
1735
+ #: view/Advanced.php:210 view/Permalinks.php:574 view/Tweaks.php:203
1736
+ msgid "Contact us after you left the review cause we have a surprise for you."
1737
+ msgstr ""
1738
+
1739
+ #: view/Advanced.php:221 view/Mapping.php:224 view/Permalinks.php:544
1740
+ #: view/Tweaks.php:173
1741
+ msgid "Check Your Website"
1742
+ msgstr ""
1743
+
1744
+ #: view/Advanced.php:223 view/Mapping.php:226 view/Permalinks.php:546
1745
+ #: view/Tweaks.php:175
1746
+ msgid "Check if your website is secured with the current settings."
1747
+ msgstr ""
1748
+
1749
+ #: view/Advanced.php:229 view/Mapping.php:232 view/Permalinks.php:552
1750
+ #: view/Tweaks.php:181
1751
+ msgid ""
1752
+ "Make sure you save the settings and empty the cache before checking your "
1753
+ "website with our tool."
1754
+ msgstr ""
1755
+
1756
+ #: view/Advanced.php:233 view/Mapping.php:236 view/Permalinks.php:556
1757
+ #: view/Tweaks.php:185
1758
+ msgid "Learn more about Hide My WP"
1759
+ msgstr ""
1760
+
1761
+ #: view/Backup.php:7
1762
+ msgid "Backup/Restore Settings"
1763
+ msgstr ""
1764
+
1765
+ #: view/Backup.php:9
1766
+ msgid ""
1767
+ "Click Backup and the download will start automatically. You can use the "
1768
+ "Backup for all your websites."
1769
+ msgstr ""
1770
+
1771
+ #: view/Backup.php:15 view/Backup.php:55
1772
+ msgid "Backup Settings"
1773
+ msgstr ""
1774
+
1775
+ #: view/Backup.php:26
1776
+ msgid "Hide My Wp Restore"
1777
+ msgstr ""
1778
+
1779
+ #: view/Backup.php:32
1780
+ msgid "Upload the file with the saved Hide My Wp Settings"
1781
+ msgstr ""
1782
+
1783
+ #: view/Backup.php:40
1784
+ msgid "Restore Backup"
1785
+ msgstr ""
1786
+
1787
+ #: view/Backup.php:56
1788
+ msgid ""
1789
+ "It's important to <strong>save your settings every time you change them</"
1790
+ "strong>. You can use the backup to configure other websites you own."
1791
+ msgstr ""
1792
+
1793
+ #: view/Brute.php:15
1794
+ msgid "Use Brute Force Protection"
1795
+ msgstr ""
1796
+
1797
+ #: view/Brute.php:17
1798
+ msgid "Protects your website against brute force login attacks"
1799
+ msgstr ""
1800
+
1801
+ #: view/Brute.php:28
1802
+ msgid "Math Check protection"
1803
+ msgstr ""
1804
+
1805
+ #: view/Brute.php:53
1806
+ msgid "Max fail attempts"
1807
+ msgstr ""
1808
+
1809
+ #: view/Brute.php:54
1810
+ msgid "Block IP on login page"
1811
+ msgstr ""
1812
+
1813
+ #: view/Brute.php:62
1814
+ msgid "Ban duration"
1815
+ msgstr ""
1816
+
1817
+ #: view/Brute.php:63
1818
+ msgid "No. of seconds"
1819
+ msgstr ""
1820
+
1821
+ #: view/Brute.php:71
1822
+ msgid "Lockout Message"
1823
+ msgstr ""
1824
+
1825
+ #: view/Brute.php:72
1826
+ msgid "Show message instead of login form"
1827
+ msgstr ""
1828
+
1829
+ #: view/Brute.php:86
1830
+ msgid "Whitelist IPs"
1831
+ msgstr ""
1832
+
1833
+ #: view/Brute.php:87
1834
+ #, php-format
1835
+ msgid ""
1836
+ "You can white-list a single IP like 192.168.0.1 or a range of 245 IPs like "
1837
+ "192.168.0.*. Find your IP with %s"
1838
+ msgstr ""
1839
+
1840
+ #: view/Brute.php:100
1841
+ msgid "Ban IPs"
1842
+ msgstr ""
1843
+
1844
+ #: view/Brute.php:101
1845
+ msgid ""
1846
+ "You can ban a single IP like 192.168.0.1 or a range of 245 IPs like "
1847
+ "192.168.0.*. These IPs will not be able to access the login page."
1848
+ msgstr ""
1849
+
1850
+ #: view/Brute.php:122
1851
+ msgid "Blocked IPs"
1852
+ msgstr ""
1853
+
1854
+ #: view/Brute.php:128
1855
+ msgid "Unlock all"
1856
+ msgstr ""
1857
+
1858
+ #: view/Brute.php:139
1859
+ msgid "Brute Force Login Protection"
1860
+ msgstr ""
1861
+
1862
+ #: view/Brute.php:140
1863
+ msgid ""
1864
+ "Protects your website against brute force login attacks using Hide My "
1865
+ "WordPress <br /><br /> A common threat web developers face is a password-"
1866
+ "guessing attack known as a brute force attack. A brute-force attack is an "
1867
+ "attempt to discover a password by systematically trying every possible "
1868
+ "combination of letters, numbers, and symbols until you discover the one "
1869
+ "correct combination that works. "
1870
+ msgstr ""
1871
+
1872
+ #: view/Brute.php:146 view/Log.php:78
1873
+ msgid "Features"
1874
+ msgstr ""
1875
+
1876
+ #: view/Brute.php:148
1877
+ msgid "Limit the number of allowed login attempts using normal login form"
1878
+ msgstr ""
1879
+
1880
+ #: view/Brute.php:149
1881
+ msgid "Math problem verification while logging in"
1882
+ msgstr ""
1883
+
1884
+ #: view/Brute.php:150
1885
+ msgid "Manually block/unblock IP addresses"
1886
+ msgstr ""
1887
+
1888
+ #: view/Brute.php:151
1889
+ msgid "Manually whitelist trusted IP addresses"
1890
+ msgstr ""
1891
+
1892
+ #: view/Brute.php:152
1893
+ msgid "Option to inform user about remaining attempts on login page"
1894
+ msgstr ""
1895
+
1896
+ #: view/Brute.php:153
1897
+ msgid "Custom message to show to blocked users"
1898
+ msgstr ""
1899
+
1900
+ #: view/Connect.php:12
1901
+ msgid "Activate Free version"
1902
+ msgstr ""
1903
+
1904
+ #: view/Connect.php:18
1905
+ msgid "Enter your email address to get security alerts and How To Lessons"
1906
+ msgstr ""
1907
+
1908
+ #: view/Connect.php:37
1909
+ msgid "Monitor my website, send me security alerts and vulnerability reports"
1910
+ msgstr ""
1911
+
1912
+ #: view/Connect.php:47
1913
+ msgid "I want to receive How To lessons for Hide My WP Ghost by email"
1914
+ msgstr ""
1915
+
1916
+ #: view/Connect.php:58
1917
+ msgid "Activate"
1918
+ msgstr ""
1919
+
1920
+ #: view/Connect.php:64
1921
+ msgid "Skip Activation"
1922
+ msgstr ""
1923
+
1924
+ #: view/Connect.php:73
1925
+ msgid "Activate Hide My WP"
1926
+ msgstr ""
1927
+
1928
+ #: view/Connect.php:75
1929
+ #, php-format
1930
+ msgid ""
1931
+ "By activating the Free version of Hide My WP you agree with our %sTerms of "
1932
+ "Use%s and %sPrivacy Policy%s"
1933
+ msgstr ""
1934
+
1935
+ #: view/Connect.php:78
1936
+ msgid ""
1937
+ "Note! If you add your email you will receive a free token which will "
1938
+ "activate the plugin."
1939
+ msgstr ""
1940
+
1941
+ #: view/Connect.php:81
1942
+ #, php-format
1943
+ msgid ""
1944
+ "If you bought Hide My WP Ghost please remove this plugin and install the one "
1945
+ "from %sYour Account%s"
1946
+ msgstr ""
1947
+
1948
+ #: view/Dashboard.php:18
1949
+ msgid "Security Level"
1950
+ msgstr ""
1951
+
1952
+ #: view/Dashboard.php:23 view/SecurityCheck.php:22
1953
+ #, php-format
1954
+ msgid ""
1955
+ "Your website security %sis extremely weak%s. %sMany hacking doors are "
1956
+ "available."
1957
+ msgstr ""
1958
+
1959
+ #: view/Dashboard.php:26 view/SecurityCheck.php:25
1960
+ #, php-format
1961
+ msgid ""
1962
+ "Your website security %sis very weak%s. %sMany hacking doors are available."
1963
+ msgstr ""
1964
+
1965
+ #: view/Dashboard.php:29 view/SecurityCheck.php:28
1966
+ #, php-format
1967
+ msgid ""
1968
+ "Your website security is still weak. %sSome of the main hacking doors are "
1969
+ "still available."
1970
+ msgstr ""
1971
+
1972
+ #: view/Dashboard.php:32 view/SecurityCheck.php:31
1973
+ #, php-format
1974
+ msgid ""
1975
+ "Your website security is strong. %sKeep checking the security every week."
1976
+ msgstr ""
1977
+
1978
+ #: view/Dashboard.php:37
1979
+ msgid "Urgent Security Actions Required"
1980
+ msgstr ""
1981
+
1982
+ #: view/Dashboard.php:45
1983
+ msgid "Check All The Security Tasks"
1984
+ msgstr ""
1985
+
1986
+ #: view/Dashboard.php:47
1987
+ msgid "Upgrade Your Security"
1988
+ msgstr ""
1989
+
1990
+ #: view/Dashboard.php:55
1991
+ msgid "Recheck Security"
1992
+ msgstr ""
1993
+
1994
+ #: view/Dashboard.php:107
1995
+ msgid "Checking Website Security ..."
1996
+ msgstr ""
1997
+
1998
+ #: view/FrontendCheck.php:7
1999
+ msgid "Next Steps"
2000
+ msgstr ""
2001
+
2002
+ #: view/FrontendCheck.php:9
2003
+ msgid "Frontend Login Test"
2004
+ msgstr ""
2005
+
2006
+ #: view/FrontendCheck.php:13
2007
+ #, php-format
2008
+ msgid "Run %sFrontend Login Test%s and login inside the pupop. "
2009
+ msgstr ""
2010
+
2011
+ #: view/FrontendCheck.php:14
2012
+ msgid "If you're able to login, you've set the new paths correctly."
2013
+ msgstr ""
2014
+
2015
+ #: view/FrontendCheck.php:15
2016
+ msgid ""
2017
+ "If the Login Page displays any error, please make sure you follow the Hide "
2018
+ "My WP Ghost instructions before moving forward."
2019
+ msgstr ""
2020
+
2021
+ #: view/FrontendCheck.php:16
2022
+ msgid ""
2023
+ "Do not log out from this browser until you are confident that the Frontend "
2024
+ "is working and you will be able to log in again."
2025
+ msgstr ""
2026
+
2027
+ #: view/FrontendCheck.php:17
2028
+ #, php-format
2029
+ msgid ""
2030
+ "If you can't configure Hide My WP Ghost, switch to Default mode and "
2031
+ "%scontact us%s."
2032
+ msgstr ""
2033
+
2034
+ #: view/FrontendCheck.php:21
2035
+ #, php-format
2036
+ msgid "%sWARNING:%s Use the custom login URL to login to admin."
2037
+ msgstr ""
2038
+
2039
+ #: view/FrontendCheck.php:22
2040
+ #, php-format
2041
+ msgid ""
2042
+ "Your login URL will be: %s In case you can't re-login, use the safe URL: %s"
2043
+ msgstr ""
2044
+
2045
+ #: view/FrontendCheck.php:29
2046
+ msgid "Yes, it's working"
2047
+ msgstr ""
2048
+
2049
+ #: view/FrontendCheck.php:44
2050
+ msgid "Frontend login Test"
2051
+ msgstr ""
2052
+
2053
+ #: view/Log.php:10
2054
+ msgid "Events Settings"
2055
+ msgstr ""
2056
+
2057
+ #: view/Log.php:23
2058
+ msgid "Log Users Events"
2059
+ msgstr ""
2060
+
2061
+ #: view/Log.php:24
2062
+ msgid "Track and Log events that happens on your WordPress site!"
2063
+ msgstr ""
2064
+
2065
+ #: view/Log.php:37
2066
+ msgid "Log Brute Force Attempts"
2067
+ msgstr ""
2068
+
2069
+ #: view/Log.php:38
2070
+ msgid "Track and Log brute force attempts"
2071
+ msgstr ""
2072
+
2073
+ #: view/Log.php:46
2074
+ msgid "Log Use Roles"
2075
+ msgstr ""
2076
+
2077
+ #: view/Log.php:47
2078
+ msgid "Hold Control key to select multiple user roles"
2079
+ msgstr ""
2080
+
2081
+ #: view/Log.php:48
2082
+ msgid "Don't select any role if you want to log all user roles"
2083
+ msgstr ""
2084
+
2085
+ #: view/Log.php:71
2086
+ msgid "Monitor everything that happens on your WordPress site!"
2087
+ msgstr ""
2088
+
2089
+ #: view/Log.php:72
2090
+ msgid ""
2091
+ "It's safe to know what happened on your website at any time, in admin and on "
2092
+ "frontend."
2093
+ msgstr ""
2094
+
2095
+ #: view/Log.php:73
2096
+ msgid ""
2097
+ "All the logs are saved on our Cloud Servers and your data is safe in case "
2098
+ "you reinstall the plugin"
2099
+ msgstr ""
2100
+
2101
+ #: view/Log.php:80
2102
+ msgid "Monitor, track and log events on your website"
2103
+ msgstr ""
2104
+
2105
+ #: view/Log.php:81
2106
+ msgid "Know what the other users are doing on your website and when"
2107
+ msgstr ""
2108
+
2109
+ #: view/Log.php:82
2110
+ msgid "You can set to receive email with alerts for one or more actions"
2111
+ msgstr ""
2112
+
2113
+ #: view/Log.php:83
2114
+ msgid "Filter events and users"
2115
+ msgstr ""
2116
+
2117
+ #: view/Log.php:84
2118
+ msgid "Compatible with all themes and plugins"
2119
+ msgstr ""
2120
+
2121
+ #: view/Mapping.php:12
2122
+ msgid "Text Mapping"
2123
+ msgstr ""
2124
+
2125
+ #: view/Mapping.php:19 view/Mapping.php:95 view/Mapping.php:168
2126
+ msgid ""
2127
+ "First, you need to switch Hide My Wp from Default mode to Safe Mode or Ghost "
2128
+ "Mode."
2129
+ msgstr ""
2130
+
2131
+ #: view/Mapping.php:24
2132
+ msgid "Replace the text in tags and classes to hide any WordPress footprint."
2133
+ msgstr ""
2134
+
2135
+ #: view/Mapping.php:25
2136
+ msgid ""
2137
+ "Note! Your plugins and themes may use these and it will affect the design "
2138
+ "and functionality."
2139
+ msgstr ""
2140
+
2141
+ #: view/Mapping.php:37
2142
+ msgid "Text Mapping only Classes, IDs, JS variables"
2143
+ msgstr ""
2144
+
2145
+ #: view/Mapping.php:39
2146
+ msgid "Change the text only in classes, styles & scrips. (Recommended ON)"
2147
+ msgstr ""
2148
+
2149
+ #: view/Mapping.php:40
2150
+ msgid "If this option is switched off, the text is changed in all page"
2151
+ msgstr ""
2152
+
2153
+ #: view/Mapping.php:51 view/Mapping.php:64
2154
+ msgid "Remove Text Map"
2155
+ msgstr ""
2156
+
2157
+ #: view/Mapping.php:76
2158
+ msgid "Add another text"
2159
+ msgstr ""
2160
+
2161
+ #: view/Mapping.php:84
2162
+ msgid "URL Mapping"
2163
+ msgstr ""
2164
+
2165
+ #: view/Mapping.php:98
2166
+ msgid "You can add a list of URLs you want to change into new ones. "
2167
+ msgstr ""
2168
+
2169
+ #: view/Mapping.php:99
2170
+ msgid ""
2171
+ "It's important to include only internal URLs from Frontend source code after "
2172
+ "you activate the plugin in Safe Mode or Ghost Mode."
2173
+ msgstr ""
2174
+
2175
+ #: view/Mapping.php:100
2176
+ msgid "Example:"
2177
+ msgstr ""
2178
+
2179
+ #: view/Mapping.php:102 view/Mapping.php:111
2180
+ msgid "from"
2181
+ msgstr ""
2182
+
2183
+ #: view/Mapping.php:106 view/Mapping.php:115
2184
+ msgid "to"
2185
+ msgstr ""
2186
+
2187
+ #: view/Mapping.php:109
2188
+ msgid "or"
2189
+ msgstr ""
2190
+
2191
+ #: view/Mapping.php:125 view/Mapping.php:138
2192
+ msgid "Remove URL Map"
2193
+ msgstr ""
2194
+
2195
+ #: view/Mapping.php:150
2196
+ msgid "Add another URL"
2197
+ msgstr ""
2198
+
2199
+ #: view/Mapping.php:158
2200
+ msgid "CDN URLs"
2201
+ msgstr ""
2202
+
2203
+ #: view/Mapping.php:171
2204
+ msgid "You can add one or more CDN URLs you use."
2205
+ msgstr ""
2206
+
2207
+ #: view/Mapping.php:172
2208
+ msgid ""
2209
+ "This option will not activate the CDN option for your website but it will "
2210
+ "change the custom paths in case you already set a CDN URL with another "
2211
+ "plugin."
2212
+ msgstr ""
2213
+
2214
+ #: view/Mapping.php:181 view/Mapping.php:190
2215
+ msgid "Remove CDN"
2216
+ msgstr ""
2217
+
2218
+ #: view/Mapping.php:199
2219
+ msgid "Add another CDN URL"
2220
+ msgstr ""
2221
+
2222
+ #: view/Mapping.php:246
2223
+ msgid "Give us 5 stars on WordPress.org"
2224
+ msgstr ""
2225
+
2226
+ #: view/Permalinks.php:9
2227
+ msgid ""
2228
+ "Hide My WordPress requires to be activated on the entire network to prevent "
2229
+ "login issues!"
2230
+ msgstr ""
2231
+
2232
+ #: view/Permalinks.php:32
2233
+ msgid "Levels of security"
2234
+ msgstr ""
2235
+
2236
+ #: view/Permalinks.php:34
2237
+ msgid "Default (unsafe)"
2238
+ msgstr ""
2239
+
2240
+ #: view/Permalinks.php:35
2241
+ msgid "Lite mode"
2242
+ msgstr ""
2243
+
2244
+ #: view/Permalinks.php:38
2245
+ #, php-format
2246
+ msgid ""
2247
+ "Upgrade Your Website Security. Add Firewall, Hide WordPress Completely. "
2248
+ "%sUnlock this feature%s"
2249
+ msgstr ""
2250
+
2251
+ #: view/Permalinks.php:42
2252
+ msgid "Ghost mode"
2253
+ msgstr ""
2254
+
2255
+ #: view/Permalinks.php:46
2256
+ #, php-format
2257
+ msgid ""
2258
+ "%sWARNING:%s The admin path is hidden from visitors. Use the custom login "
2259
+ "URL to login to admin"
2260
+ msgstr ""
2261
+
2262
+ #: view/Permalinks.php:47
2263
+ #, php-format
2264
+ msgid ""
2265
+ "If you can't login, use this URL: %s and all your changes are roll back to "
2266
+ "default"
2267
+ msgstr ""
2268
+
2269
+ #: view/Permalinks.php:119
2270
+ msgid "Admin Settings"
2271
+ msgstr ""
2272
+
2273
+ #: view/Permalinks.php:122
2274
+ #, php-format
2275
+ msgid ""
2276
+ "Your admin URL is changed by another plugin/theme in %s. To prevent errors, "
2277
+ "deactivate the other plugin who changes the admin path."
2278
+ msgstr ""
2279
+
2280
+ #: view/Permalinks.php:126
2281
+ #, php-format
2282
+ msgid ""
2283
+ "Your admin URL can't be changed on %s hosting because of the %s security "
2284
+ "terms."
2285
+ msgstr ""
2286
+
2287
+ #: view/Permalinks.php:132
2288
+ msgid "Custom Admin Path"
2289
+ msgstr ""
2290
+
2291
+ #: view/Permalinks.php:133
2292
+ msgid "eg. adm, back"
2293
+ msgstr ""
2294
+
2295
+ #: view/Permalinks.php:147
2296
+ msgid "Hide \"wp-admin\""
2297
+ msgstr ""
2298
+
2299
+ #: view/Permalinks.php:148
2300
+ msgid "Show 404 Not Found Error when visitors access /wp-admin"
2301
+ msgstr ""
2302
+
2303
+ #: view/Permalinks.php:157
2304
+ msgid "Hide the new admin path"
2305
+ msgstr ""
2306
+
2307
+ #: view/Permalinks.php:158
2308
+ msgid ""
2309
+ "Let only the new login be accessible and redirect me to admin after logging "
2310
+ "in"
2311
+ msgstr ""
2312
+
2313
+ #: view/Permalinks.php:163
2314
+ msgid ""
2315
+ "Some Themes don't work with custom Admin and Ajax paths. In case of ajax "
2316
+ "errors, switch back to wp-admin and admin-ajax.php."
2317
+ msgstr ""
2318
+
2319
+ #: view/Permalinks.php:169
2320
+ msgid "Login Settings"
2321
+ msgstr ""
2322
+
2323
+ #: view/Permalinks.php:172
2324
+ #, php-format
2325
+ msgid ""
2326
+ "Your login URL is changed by another plugin/theme in %s. To prevent errors, "
2327
+ "deactivate the other plugin who changes the login path."
2328
+ msgstr ""
2329
+
2330
+ #: view/Permalinks.php:177
2331
+ msgid "Custom Login Path"
2332
+ msgstr ""
2333
+
2334
+ #: view/Permalinks.php:178
2335
+ msgid "eg. login or signin"
2336
+ msgstr ""
2337
+
2338
+ #: view/Permalinks.php:191
2339
+ msgid "Hide \"wp-login.php\""
2340
+ msgstr ""
2341
+
2342
+ #: view/Permalinks.php:192
2343
+ msgid "Show 404 Not Found Error when visitors access /wp-login.php"
2344
+ msgstr ""
2345
+
2346
+ #: view/Permalinks.php:201
2347
+ msgid "Custom Lost Password Path"
2348
+ msgstr ""
2349
+
2350
+ #: view/Permalinks.php:202
2351
+ msgid "eg. lostpass or forgotpass"
2352
+ msgstr ""
2353
+
2354
+ #: view/Permalinks.php:212
2355
+ msgid "Custom Register Path"
2356
+ msgstr ""
2357
+
2358
+ #: view/Permalinks.php:213
2359
+ msgid "eg. newuser or register"
2360
+ msgstr ""
2361
+
2362
+ #: view/Permalinks.php:223
2363
+ msgid "Custom Logout Path"
2364
+ msgstr ""
2365
+
2366
+ #: view/Permalinks.php:224
2367
+ msgid "eg. logout or disconnect"
2368
+ msgstr ""
2369
+
2370
+ #: view/Permalinks.php:234
2371
+ msgid "Custom Activation Path"
2372
+ msgstr ""
2373
+
2374
+ #: view/Permalinks.php:235
2375
+ msgid "eg. multisite activation link"
2376
+ msgstr ""
2377
+
2378
+ #: view/Permalinks.php:248
2379
+ msgid "Common Paths"
2380
+ msgstr ""
2381
+
2382
+ #: view/Permalinks.php:252
2383
+ msgid "Custom admin-ajax Path"
2384
+ msgstr ""
2385
+
2386
+ #: view/Permalinks.php:253
2387
+ msgid "eg. ajax, json"
2388
+ msgstr ""
2389
+
2390
+ #: view/Permalinks.php:266
2391
+ msgid "Hide wp-admin from ajax URL"
2392
+ msgstr ""
2393
+
2394
+ #: view/Permalinks.php:267
2395
+ #, php-format
2396
+ msgid "Show /%s instead of /%s"
2397
+ msgstr ""
2398
+
2399
+ #: view/Permalinks.php:268
2400
+ msgid "Works only with the custom admin-ajax path to avoid infinite loops."
2401
+ msgstr ""
2402
+
2403
+ #: view/Permalinks.php:275
2404
+ msgid "Custom wp-content Path"
2405
+ msgstr ""
2406
+
2407
+ #: view/Permalinks.php:276
2408
+ msgid "eg. core, inc, include"
2409
+ msgstr ""
2410
+
2411
+ #: view/Permalinks.php:286
2412
+ msgid "Custom wp-includes Path"
2413
+ msgstr ""
2414
+
2415
+ #: view/Permalinks.php:287
2416
+ msgid "eg. lib, library"
2417
+ msgstr ""
2418
+
2419
+ #: view/Permalinks.php:298
2420
+ msgid "Custom uploads Path"
2421
+ msgstr ""
2422
+
2423
+ #: view/Permalinks.php:299
2424
+ msgid "eg. images, files"
2425
+ msgstr ""
2426
+
2427
+ #: view/Permalinks.php:308
2428
+ #, php-format
2429
+ msgid ""
2430
+ "You already defined a different wp-content/uploads directory in wp-config."
2431
+ "php %s"
2432
+ msgstr ""
2433
+
2434
+ #: view/Permalinks.php:314
2435
+ msgid "Custom comment Path"
2436
+ msgstr ""
2437
+
2438
+ #: view/Permalinks.php:315
2439
+ msgid "eg. comments, discussion"
2440
+ msgstr ""
2441
+
2442
+ #: view/Permalinks.php:326
2443
+ msgid "Custom author Path"
2444
+ msgstr ""
2445
+
2446
+ #: view/Permalinks.php:327
2447
+ msgid "eg. profile, usr, writer"
2448
+ msgstr ""
2449
+
2450
+ #: view/Permalinks.php:345
2451
+ msgid "Hide Author ID URL"
2452
+ msgstr ""
2453
+
2454
+ #: view/Permalinks.php:346
2455
+ msgid "Don't let URLs like domain.com?author=1 show the user login name"
2456
+ msgstr ""
2457
+
2458
+ #: view/Permalinks.php:354
2459
+ msgid "Plugin Settings"
2460
+ msgstr ""
2461
+
2462
+ #: view/Permalinks.php:358
2463
+ msgid "Custom plugins Path"
2464
+ msgstr ""
2465
+
2466
+ #: view/Permalinks.php:359
2467
+ msgid "eg. modules"
2468
+ msgstr ""
2469
+
2470
+ #: view/Permalinks.php:371
2471
+ msgid "Hide plugin names"
2472
+ msgstr ""
2473
+
2474
+ #: view/Permalinks.php:372
2475
+ msgid "Give random names to each plugin"
2476
+ msgstr ""
2477
+
2478
+ #: view/Permalinks.php:379
2479
+ msgid "Theme Settings"
2480
+ msgstr ""
2481
+
2482
+ #: view/Permalinks.php:383
2483
+ msgid "Custom themes Path"
2484
+ msgstr ""
2485
+
2486
+ #: view/Permalinks.php:384
2487
+ msgid "eg. assets, templates, styles"
2488
+ msgstr ""
2489
+
2490
+ #: view/Permalinks.php:399
2491
+ msgid "Hide theme names"
2492
+ msgstr ""
2493
+
2494
+ #: view/Permalinks.php:400
2495
+ msgid "Give random names to each theme (works in WP multisite)"
2496
+ msgstr ""
2497
+
2498
+ #: view/Permalinks.php:411
2499
+ msgid "REST API Settings"
2500
+ msgstr ""
2501
+
2502
+ #: view/Permalinks.php:419
2503
+ msgid "Custom wp-json Path"
2504
+ msgstr ""
2505
+
2506
+ #: view/Permalinks.php:420
2507
+ msgid "eg. json, api, call"
2508
+ msgstr ""
2509
+
2510
+ #: view/Permalinks.php:433
2511
+ msgid "Disable Rest API access"
2512
+ msgstr ""
2513
+
2514
+ #: view/Permalinks.php:434
2515
+ msgid "Disable Rest API access if you don't use your website for API calls"
2516
+ msgstr ""
2517
+
2518
+ #: view/Permalinks.php:442
2519
+ msgid "Security Settings"
2520
+ msgstr ""
2521
+
2522
+ #: view/Permalinks.php:454
2523
+ msgid "Hide WordPress Common Paths"
2524
+ msgstr ""
2525
+
2526
+ #: view/Permalinks.php:455
2527
+ msgid "Hide /wp-content, /wp-include, /plugins, /themes paths"
2528
+ msgstr ""
2529
+
2530
+ #: view/Permalinks.php:456
2531
+ msgid "Hide upgrade.php and install.php for visitors"
2532
+ msgstr ""
2533
+
2534
+ #: view/Permalinks.php:457
2535
+ msgid "(this may affect the fonts and images loaded through CSS)"
2536
+ msgstr ""
2537
+
2538
+ #: view/Permalinks.php:467
2539
+ msgid "Hide WordPress Common Files"
2540
+ msgstr ""
2541
+
2542
+ #: view/Permalinks.php:468
2543
+ msgid ""
2544
+ "Hide wp-config.php , wp-config-sample.php, readme.html, license.txt files"
2545
+ msgstr ""
2546
+
2547
+ #: view/Permalinks.php:480
2548
+ msgid "Firewall Against Script Injection"
2549
+ msgstr ""
2550
+
2551
+ #: view/Permalinks.php:481
2552
+ msgid ""
2553
+ "Most WordPress installations are hosted on the popular Apache, Nginx and IIS "
2554
+ "web servers."
2555
+ msgstr ""
2556
+
2557
+ #: view/Permalinks.php:482
2558
+ msgid ""
2559
+ "A thorough set of rules can prevent many types of SQL Injection and URL "
2560
+ "hacks from being interpreted."
2561
+ msgstr ""
2562
+
2563
+ #: view/Permalinks.php:493
2564
+ msgid "Disable Directory Browsing"
2565
+ msgstr ""
2566
+
2567
+ #: view/Permalinks.php:494
2568
+ #, php-format
2569
+ msgid "Don't let hackers see any directory content. See %sUploads Directory%s"
2570
+ msgstr ""
2571
+
2572
+ #: view/Permalinks.php:507
2573
+ msgid "Custom category Path"
2574
+ msgstr ""
2575
+
2576
+ #: view/Permalinks.php:508
2577
+ msgid "eg. cat, dir, list"
2578
+ msgstr ""
2579
+
2580
+ #: view/Permalinks.php:517
2581
+ msgid "Custom tags Path"
2582
+ msgstr ""
2583
+
2584
+ #: view/Permalinks.php:518
2585
+ msgid "eg. keyword, topic"
2586
+ msgstr ""
2587
+
2588
+ #: view/Plugins.php:14
2589
+ msgid "More details"
2590
+ msgstr ""
2591
+
2592
+ #: view/Plugins.php:16
2593
+ msgid "Install Plugin"
2594
+ msgstr ""
2595
+
2596
+ #: view/Plugins.php:18
2597
+ msgid "Plugin Installed"
2598
+ msgstr ""
2599
+
2600
+ #: view/Plugins.php:30
2601
+ msgid ""
2602
+ "We are testing every week the latest version of these plugins and <strong>we "
2603
+ "make sure they are working with Hide My WP</strong> plugin.\n"
2604
+ " <br /><br />You don't need to install all these plugin "
2605
+ "in your website. If you're already using a cache plugin you don't need to "
2606
+ "install another one. <strong>We recommend using only one cache plugin</"
2607
+ "strong>.\n"
2608
+ " <br /><br />You can also install either <strong>iThemes "
2609
+ "Security</strong> plugin or <strong>Sucuri Security</strong> plugin to work "
2610
+ "with Hide My Wp plugin.\n"
2611
+ " <br /><br />If your plugins directory is not writable "
2612
+ "you will need to install the plugins manually."
2613
+ msgstr ""
2614
+
2615
+ #: view/SecurityCheck.php:6
2616
+ msgid "WordPress Security Check"
2617
+ msgstr ""
2618
+
2619
+ #: view/SecurityCheck.php:35 view/SecurityCheck.php:63
2620
+ msgid "Start Scan"
2621
+ msgstr ""
2622
+
2623
+ #: view/SecurityCheck.php:48
2624
+ msgid "Passed"
2625
+ msgstr ""
2626
+
2627
+ #: view/SecurityCheck.php:49
2628
+ msgid "Failed"
2629
+ msgstr ""
2630
+
2631
+ #: view/SecurityCheck.php:55
2632
+ msgid ""
2633
+ "Congratulations! You completed all the security tasks. Make sure you check "
2634
+ "your site once a week."
2635
+ msgstr ""
2636
+
2637
+ #: view/SecurityCheck.php:66
2638
+ #, php-format
2639
+ msgid ""
2640
+ "According to %sGoogle latest stats%s, over %s20k websites are hacked every "
2641
+ "week%s and over %s30&#37; of them are made in WordPress%s. <br />It's "
2642
+ "%sbetter to prevent an attack%s than to spend a lot of money and time to "
2643
+ "recover your data after an attack not to mention the situation when your "
2644
+ "clients' data are stollen."
2645
+ msgstr ""
2646
+
2647
+ #: view/SecurityCheck.php:69
2648
+ msgid "Last check:"
2649
+ msgstr ""
2650
+
2651
+ #: view/SecurityCheck.php:82
2652
+ msgid "Name"
2653
+ msgstr ""
2654
+
2655
+ #: view/SecurityCheck.php:83
2656
+ msgid "Value"
2657
+ msgstr ""
2658
+
2659
+ #: view/SecurityCheck.php:84
2660
+ msgid "Valid"
2661
+ msgstr ""
2662
+
2663
+ #: view/SecurityCheck.php:85
2664
+ msgid "Action"
2665
+ msgstr ""
2666
+
2667
+ #: view/SecurityCheck.php:110
2668
+ msgid "Info"
2669
+ msgstr ""
2670
+
2671
+ #: view/SecurityCheck.php:111
2672
+ msgid "Fix it"
2673
+ msgstr ""
2674
+
2675
+ #: view/SecurityCheck.php:112
2676
+ msgid "Are you sure you want to ignore this task in the future?"
2677
+ msgstr ""
2678
+
2679
+ #: view/SecurityCheck.php:125
2680
+ msgid "Reset all ingnored tasks"
2681
+ msgstr ""
2682
+
2683
+ #: view/Support.php:3
2684
+ msgid "Need Help?"
2685
+ msgstr ""
2686
+
2687
+ #: view/Support.php:6
2688
+ #, php-format
2689
+ msgid ""
2690
+ "Read the plugin tutorial and how to setup every feature %sRead Hide My WP "
2691
+ "Tutorial%s"
2692
+ msgstr ""
2693
+
2694
+ #: view/Support.php:8
2695
+ #, php-format
2696
+ msgid ""
2697
+ "You can also email us on %scontact@wpplugins.tips%s and we are happy to "
2698
+ "answer any question or suggestion you may have and we aim to respond within "
2699
+ "24 hours."
2700
+ msgstr ""
2701
+
2702
+ #: view/Tweaks.php:10
2703
+ msgid "Change Options"
2704
+ msgstr ""
2705
+
2706
+ #: view/Tweaks.php:18
2707
+ msgid "Change Paths for Logged Users"
2708
+ msgstr ""
2709
+
2710
+ #: view/Tweaks.php:20
2711
+ msgid "Change WordPress paths while you're logged in"
2712
+ msgstr ""
2713
+
2714
+ #: view/Tweaks.php:21
2715
+ msgid "(not recommended, may affect other plugins functionality in admin)"
2716
+ msgstr ""
2717
+
2718
+ #: view/Tweaks.php:35
2719
+ msgid "Change Paths in Cached Files"
2720
+ msgstr ""
2721
+
2722
+ #: view/Tweaks.php:36
2723
+ msgid ""
2724
+ "Change the WordPress common paths in the cached files from /wp-content/cache "
2725
+ "directory"
2726
+ msgstr ""
2727
+
2728
+ #: view/Tweaks.php:37
2729
+ msgid ""
2730
+ "(this feature runs in background and needs up to one minute after every "
2731
+ "cache purged)"
2732
+ msgstr ""
2733
+
2734
+ #: view/Tweaks.php:48
2735
+ msgid "Change Paths in Ajax Calls"
2736
+ msgstr ""
2737
+
2738
+ #: view/Tweaks.php:50
2739
+ msgid ""
2740
+ "This will prevent from showing the old paths when an image or font is called "
2741
+ "through ajax"
2742
+ msgstr ""
2743
+
2744
+ #: view/Tweaks.php:58
2745
+ msgid "Hide/Show Options"
2746
+ msgstr ""
2747
+
2748
+ #: view/Tweaks.php:67
2749
+ msgid ""
2750
+ "Hide WordPress and Plugin versions from the end of any image, css and js "
2751
+ "files"
2752
+ msgstr ""
2753
+
2754
+ #: view/Tweaks.php:68
2755
+ msgid "Hide the WP Generator META"
2756
+ msgstr ""
2757
+
2758
+ #: view/Tweaks.php:69
2759
+ msgid "Hide the WP DNS Prefetch META"
2760
+ msgstr ""
2761
+
2762
+ #: view/Tweaks.php:78
2763
+ msgid "Hide RSD (Really Simple Discovery) header"
2764
+ msgstr ""
2765
+
2766
+ #: view/Tweaks.php:80
2767
+ msgid "Don't show any WordPress information in HTTP header request"
2768
+ msgstr ""
2769
+
2770
+ #: view/Tweaks.php:90
2771
+ msgid "Hide WordPress HTML Comments"
2772
+ msgstr ""
2773
+
2774
+ #: view/Tweaks.php:92
2775
+ msgid "Hide the HTML Comments left by theme and plugins"
2776
+ msgstr ""
2777
+
2778
+ #: view/Tweaks.php:101
2779
+ msgid "Hide Emojicons"
2780
+ msgstr ""
2781
+
2782
+ #: view/Tweaks.php:103
2783
+ msgid "Don't load Emoji Icons if you don't use them"
2784
+ msgstr ""
2785
+
2786
+ #: view/Tweaks.php:110
2787
+ msgid "Other Settings"
2788
+ msgstr ""
2789
+
2790
+ #: view/Tweaks.php:117
2791
+ msgid "Disable XML-RPC authentication"
2792
+ msgstr ""
2793
+
2794
+ #: view/Tweaks.php:119
2795
+ #, php-format
2796
+ msgid "Don't load XML-RPC to prevent %sBrute force attacks via XML-RPC%s"
2797
+ msgstr ""
2798
+
2799
+ #: view/Tweaks.php:128
2800
+ msgid "Disable Embed scripts"
2801
+ msgstr ""
2802
+
2803
+ #: view/Tweaks.php:130
2804
+ msgid "Don't load oEmbed service if you don't use oEmbed videos"
2805
+ msgstr ""
2806
+
2807
+ #: view/Tweaks.php:140
2808
+ msgid "Disable WLW Manifest scripts"
2809
+ msgstr ""
2810
+
2811
+ #: view/Tweaks.php:142
2812
+ msgid ""
2813
+ "Don't load WLW if you didn't configure Windows Live Writer for your site"
2814
+ msgstr ""
2815
+
2816
+ #: view/Tweaks.php:152
2817
+ msgid "Disable DB Debug in Frontent"
2818
+ msgstr ""
2819
+
2820
+ #: view/Tweaks.php:154
2821
+ msgid "Don't load DB Debug if your website is live"
2822
+ msgstr ""
2823
+
2824
+ #. Plugin Name of the plugin/theme
2825
+ msgid "Hide My WP Ghost Lite"
2826
+ msgstr ""
2827
+
2828
+ #. Plugin URI of the plugin/theme
2829
+ msgid "https://wordpress.org/plugins/hide-my-wp/"
2830
+ msgstr ""
2831
+
2832
+ #. Description of the plugin/theme
2833
+ msgid ""
2834
+ "The best solution for WordPress Security. Hide wp-admin, wp-login, wp-"
2835
+ "content, plugins, themes etc. Add Firewall, Brute Force protection & more. "
2836
+ "<br /> <a href=\"http://hidemywpghost.com/wordpress\" target=\"_blank"
2837
+ "\"><strong>Unlock all features</strong></a>"
2838
+ msgstr ""
2839
+
2840
+ #. Author of the plugin/theme
2841
+ msgid "WPPlugins - WordPress Security Plugins"
2842
+ msgstr ""
2843
+
2844
+ #. Author URI of the plugin/theme
2845
+ msgid "https://wpplugins.tips"
2846
+ msgstr ""
languages/hide-my-wp-es_ES.mo ADDED
Binary file
languages/hide-my-wp-es_ES.po ADDED
@@ -0,0 +1,3580 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Hide My Wordpress PRO\n"
4
+ "POT-Creation-Date: 2020-05-14 19:48+0300\n"
5
+ "PO-Revision-Date: 2020-05-14 20:33+0300\n"
6
+ "Last-Translator: John Darrel <john@wpplugins.tips>\n"
7
+ "Language-Team: WpPluginsTips <john@wpplugins.tips>\n"
8
+ "Language: es_ES\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 2.3.1\n"
13
+ "X-Poedit-Basepath: ..\n"
14
+ "X-Poedit-WPHeader: index.php\n"
15
+ "X-Poedit-SourceCharset: UTF-8\n"
16
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;"
17
+ "esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;"
18
+ "_nx_noop:3c,1,2;__ngettext_noop:1,2\n"
19
+ "X-Poedit-SearchPath-0: .\n"
20
+ "X-Poedit-SearchPathExcluded-0: *.js\n"
21
+
22
+ #: classes/Error.php:17
23
+ msgid ""
24
+ "Function get_class does not exist! It's required for Hide My WP to work "
25
+ "properly."
26
+ msgstr ""
27
+ "¡La función get_class no existe! Es necesario para que Hide My WP funcione "
28
+ "correctamente."
29
+
30
+ #: classes/Error.php:20
31
+ msgid ""
32
+ "Function file_exists does not exist! It's required for Hide My WP to work "
33
+ "properly."
34
+ msgstr ""
35
+ "La función file_exists no existe! Es necesario para que Hide My WP funcione "
36
+ "correctamente."
37
+
38
+ #: classes/Error.php:24
39
+ msgid "The home directory is not set!"
40
+ msgstr "¡El directorio de inicio no está configurado!"
41
+
42
+ #: classes/Error.php:28
43
+ msgid "The PHP version has to be greater than 5.1"
44
+ msgstr "La versión de PHP tiene que ser mayor que 5.1"
45
+
46
+ #: classes/Error.php:36
47
+ msgid ""
48
+ "For Hide My WP to work, the PHP version has to be equal or greater than 5.1"
49
+ msgstr ""
50
+ "Para que Hide My WP funcione, la versión de PHP debe ser igual o mayor que "
51
+ "5.1"
52
+
53
+ #: classes/Tools.php:30 classes/Tools.php:34
54
+ #, php-format
55
+ msgid ""
56
+ "Your memory limit is %sM. You need at least %sM to prevent loading errors in "
57
+ "frontend. See: %sIncreasing memory allocated to PHP%s"
58
+ msgstr ""
59
+ "Su límite de memoria es %sM. Necesitas al menos %sM para evitar errores de "
60
+ "carga en el frontend. Mira..: %sIncrementar la memoria asignada a PHP%s"
61
+
62
+ #: classes/Tools.php:122
63
+ msgid ""
64
+ "Your IP has been flagged for potential security violations. Please try again "
65
+ "in a little while..."
66
+ msgstr ""
67
+ "Su IP se ha boqueado por posibles infracciones de seguridad. Inténtalo de "
68
+ "nuevo dentro de un rato ..."
69
+
70
+ #: classes/Tools.php:333
71
+ msgid "Documentation"
72
+ msgstr "Documentación"
73
+
74
+ #: classes/Tools.php:334
75
+ msgid "Leave a review"
76
+ msgstr "Dejar un comentario"
77
+
78
+ #: classes/Tools.php:351
79
+ msgid "Upgrade to Premium"
80
+ msgstr "Mejorar a Premium"
81
+
82
+ #: classes/Tools.php:353 controllers/SecurityCheck.php:185
83
+ msgid "Settings"
84
+ msgstr "Configuración"
85
+
86
+ #: classes/Tools.php:1129
87
+ #, php-format
88
+ msgid "CONNECTION ERROR! Make sure your website can access: %s"
89
+ msgstr "¡ERROR DE CONEXIÓN! Asegúrese de que su sitio web puede acceder a: %s"
90
+
91
+ #: classes/Tools.php:1149
92
+ msgid "New Login Information"
93
+ msgstr "Ocultar la nueva ruta de admin"
94
+
95
+ #: controllers/Brute.php:34
96
+ msgid "IP Blocked by Hide My WordPress Brute Force Protection"
97
+ msgstr "IP bloqueada por la protección de Brute Force de Hide My WP"
98
+
99
+ #: controllers/Brute.php:62
100
+ msgid "Add only real IPs. No local ips needed."
101
+ msgstr "Añadir sólo IPs reales. Las IPs locales no son necesarias."
102
+
103
+ #: controllers/Brute.php:78
104
+ msgid "Add only real IPs. No local ips allowed."
105
+ msgstr "Añadir sólo IPs reales. Las IPs locales no son necesarias."
106
+
107
+ #: controllers/Brute.php:92
108
+ msgid "You need to set a positive number of attempts "
109
+ msgstr "Es necesario establecer un número positivo de intentos"
110
+
111
+ #: controllers/Brute.php:100
112
+ msgid "You need to set a positive waiting time"
113
+ msgstr "Es necesario establecer un tiempo de espera positivo"
114
+
115
+ #: controllers/Brute.php:107 controllers/Settings.php:261
116
+ #: controllers/Settings.php:292 controllers/Settings.php:349
117
+ #: controllers/Settings.php:362
118
+ msgid "Saved"
119
+ msgstr "Guardado"
120
+
121
+ #: controllers/Brute.php:134
122
+ msgid "Cnt"
123
+ msgstr "Cnt"
124
+
125
+ #: controllers/Brute.php:135
126
+ msgid "IP"
127
+ msgstr "IP"
128
+
129
+ #: controllers/Brute.php:136
130
+ msgid "Fail Attempts"
131
+ msgstr "Intentos Fallidos"
132
+
133
+ #: controllers/Brute.php:137
134
+ msgid "Hostname"
135
+ msgstr "Nombre de host"
136
+
137
+ #: controllers/Brute.php:138
138
+ msgid "Options"
139
+ msgstr "Opciones"
140
+
141
+ #: controllers/Brute.php:160
142
+ msgid "No blacklisted ips"
143
+ msgstr "Lista negra de IPs vacía"
144
+
145
+ #: controllers/Brute.php:202
146
+ #, php-format
147
+ msgid ""
148
+ "<strong>ERROR:</strong> Email or Password is incorrect. <br /> %d attempts "
149
+ "left before lockout"
150
+ msgstr ""
151
+ "<strong>ERROR:</strong> Correo electrónico o contraseña incorrecta."
152
+ "<br>Quedan %d intentos antes de bloqueo"
153
+
154
+ #: controllers/Menu.php:66 controllers/Menu.php:175
155
+ msgid "Hide My WP - Customize Permalinks"
156
+ msgstr "Conozca más detalles acerca de Hide My WP"
157
+
158
+ #: controllers/Menu.php:67 controllers/Menu.php:176
159
+ msgid "Change Paths"
160
+ msgstr "Cambia los caminos"
161
+
162
+ #: controllers/Menu.php:74 controllers/Menu.php:183
163
+ msgid "Hide My WP - Mapping"
164
+ msgstr "Hide My WP - Mapeo"
165
+
166
+ #: controllers/Menu.php:75 controllers/Menu.php:184 models/Settings.php:17
167
+ msgid "Mapping"
168
+ msgstr "Mapeo"
169
+
170
+ #: controllers/Menu.php:82 controllers/Menu.php:191
171
+ msgid "Hide My WP - Tweaks"
172
+ msgstr "Hide My WP - Tweaks"
173
+
174
+ #: controllers/Menu.php:83 controllers/Menu.php:192 models/Settings.php:22
175
+ msgid "Tweaks"
176
+ msgstr "Ajustes rápidos"
177
+
178
+ #: controllers/Menu.php:91 controllers/Menu.php:200
179
+ msgid "Hide My WP - Brute Force Protection"
180
+ msgstr "Hide My WP - Protección de Brute Force"
181
+
182
+ #: controllers/Menu.php:92 controllers/Menu.php:201
183
+ msgid "Brute Force Protection"
184
+ msgstr "Seguridad contra ataque por Brute Force"
185
+
186
+ #: controllers/Menu.php:100 controllers/Menu.php:208
187
+ msgid "Hide My WP - Log Events"
188
+ msgstr "Hide My WP - Registro de eventos"
189
+
190
+ #: controllers/Menu.php:101 controllers/Menu.php:209 models/Settings.php:32
191
+ #: view/Log.php:70
192
+ msgid "Log Events"
193
+ msgstr "Registro de eventos"
194
+
195
+ #: controllers/Menu.php:109 controllers/Menu.php:217
196
+ msgid "Hide My WP - Security Check"
197
+ msgstr "Hide My WP - Control de seguridad"
198
+
199
+ #: controllers/Menu.php:110 controllers/Menu.php:218 models/Settings.php:37
200
+ #: view/Advanced.php:226 view/Mapping.php:229 view/Permalinks.php:549
201
+ #: view/Tweaks.php:178
202
+ msgid "Security Check"
203
+ msgstr "Control de seguridad"
204
+
205
+ #: controllers/Menu.php:117 controllers/Menu.php:225
206
+ msgid "Hide My WP - Recommended Plugins"
207
+ msgstr "Hide My WP - Instalar Plugins"
208
+
209
+ #: controllers/Menu.php:118 controllers/Menu.php:226
210
+ msgid "Install Plugins"
211
+ msgstr "Instalar Plugins"
212
+
213
+ #: controllers/Menu.php:125 controllers/Menu.php:233
214
+ msgid "Hide My WP - Backup & Restore"
215
+ msgstr "Hide My WP - Copia de seguridad/Restaurar"
216
+
217
+ #: controllers/Menu.php:126 controllers/Menu.php:234 models/Settings.php:48
218
+ msgid "Backup/Restore"
219
+ msgstr "Copia de seguridad/Restaurar"
220
+
221
+ #: controllers/Menu.php:133 controllers/Menu.php:241
222
+ msgid "Hide My WP - Advanced Settings"
223
+ msgstr "Hide My WP - Configuración Avanzada"
224
+
225
+ #: controllers/Menu.php:134 controllers/Menu.php:242 models/Settings.php:53
226
+ msgid "Advanced"
227
+ msgstr "Configuración Avanzada"
228
+
229
+ #: controllers/Menu.php:147 controllers/Settings.php:190
230
+ msgid "Hide My WP"
231
+ msgstr "Hide My WP"
232
+
233
+ #: controllers/Notice.php:31
234
+ msgid "Close notification"
235
+ msgstr "Cerar la Notificación"
236
+
237
+ #: controllers/Notice.php:35
238
+ msgid "Thank you for using Hide My WP?"
239
+ msgstr "Gracias por usar Hide My WP"
240
+
241
+ #: controllers/Notice.php:36
242
+ #, php-format
243
+ msgid ""
244
+ "Add %sXML-RPC attack protection, SQL/Script firewall, reCaptcha login%s and "
245
+ "more with Hide My WP Ghost premium features."
246
+ msgstr ""
247
+ "Añade protección contra ataques %sXML-RPC, cortafuegos SQL/Script, reCaptcha "
248
+ "login%s y más con las características premium de Hide My WP Ghost."
249
+
250
+ #: controllers/Notice.php:37
251
+ msgid "See all premium features"
252
+ msgstr "Ver todas las características premium"
253
+
254
+ #: controllers/SecurityCheck.php:23
255
+ msgid ""
256
+ "You should check your website every week to see if there are any security "
257
+ "changes."
258
+ msgstr ""
259
+ "Deberías revisar tu sitio web cada semana para ver si hay algún cambio de "
260
+ "seguridad."
261
+
262
+ #: controllers/SecurityCheck.php:56
263
+ msgid ""
264
+ "First, you need to connect Hide My Wp with WPPlugins and switch from Default "
265
+ "mode to Lite Mode."
266
+ msgstr ""
267
+ "Primero, debes conectar Hide My Wp con WPPlugins y cambiar del modo por "
268
+ "defecto al modo Lite."
269
+
270
+ #: controllers/SecurityCheck.php:60 view/Brute.php:30 view/Brute.php:31
271
+ #: view/Brute.php:81 view/Brute.php:94 view/Log.php:12 view/Mapping.php:88
272
+ #: view/Mapping.php:162 view/Permalinks.php:338 view/Permalinks.php:413
273
+ #: view/Permalinks.php:444 view/Tweaks.php:27
274
+ #, php-format
275
+ msgid "This feature requires %sHide My WP Ghost%s."
276
+ msgstr "Esta característica requiere %sHide My WP Ghost%s."
277
+
278
+ #: controllers/SecurityCheck.php:60 view/Brute.php:32 view/Brute.php:82
279
+ #: view/Brute.php:95 view/Log.php:13 view/Mapping.php:89 view/Mapping.php:163
280
+ #: view/Permalinks.php:39 view/Permalinks.php:339 view/Permalinks.php:414
281
+ #: view/Permalinks.php:445 view/Tweaks.php:28
282
+ msgid "PRO"
283
+ msgstr "PRO"
284
+
285
+ #: controllers/SecurityCheck.php:64
286
+ msgid "First, you need to switch Hide My Wp from Default mode to Lite Mode."
287
+ msgstr ""
288
+ "Primero, tienes que cambiar Hide My Wp del modo por defecto al modo Lite."
289
+
290
+ #: controllers/SecurityCheck.php:105
291
+ msgid "PHP Version"
292
+ msgstr "Versión de PHP"
293
+
294
+ #: controllers/SecurityCheck.php:109
295
+ msgid ""
296
+ "Using an old version of PHP makes your site slow and prone to hacker attacks "
297
+ "due to known vulnerabilities that exist in versions of PHP that are no "
298
+ "longer maintained. <br /><br />You need <strong>PHP 7.0</strong> or higher "
299
+ "for your website."
300
+ msgstr ""
301
+ "El uso de una versión antigua de PHP hace que su sitio sea lento y propenso "
302
+ "a ataques de hackers debido a las vulnerabilidades conocidas que existen en "
303
+ "las versiones de PHP que ya no se mantienen. <br /><br />Necesita "
304
+ "<strong>PHP 7.0</strong> o superior para su sitio web."
305
+
306
+ #: controllers/SecurityCheck.php:110
307
+ msgid ""
308
+ "Email your hosting company and tell them you'd like to switch to a newer "
309
+ "version of PHP or move your site to a better hosting company."
310
+ msgstr ""
311
+ "Envíe un correo electrónico a su compañía de hospedaje y dígales que le "
312
+ "gustaría cambiar a una nueva versión de PHP o mover su sitio a una compañía "
313
+ "de hospedaje mejor."
314
+
315
+ #: controllers/SecurityCheck.php:113
316
+ msgid "Mysql Version"
317
+ msgstr "Versión Mysql"
318
+
319
+ #: controllers/SecurityCheck.php:117
320
+ msgid ""
321
+ "Using an old version of MySQL makes your site slow and prone to hacker "
322
+ "attacks due to known vulnerabilities that exist in versions of MySQL that "
323
+ "are no longer maintained. <br /><br />You need <strong>Mysql 5.4</strong> or "
324
+ "higher"
325
+ msgstr ""
326
+ "El uso de una versión antigua de MySQL hace que su sitio sea lento y "
327
+ "propenso a ataques de hackers debido a las vulnerabilidades conocidas que "
328
+ "existen en las versiones de MySQL que ya no se mantienen. <br /><br />Usted "
329
+ "necesita <strong>Mysql 5.4</strong> o superior"
330
+
331
+ #: controllers/SecurityCheck.php:118
332
+ msgid ""
333
+ "Email your hosting company and tell them you'd like to switch to a newer "
334
+ "version of MySQL or move your site to a better hosting company"
335
+ msgstr ""
336
+ "Envíe un correo electrónico a su compañía de hospedaje y dígales que le "
337
+ "gustaría cambiar a una nueva versión de MySQL o mover su sitio a una "
338
+ "compañía de hospedaje mejor"
339
+
340
+ #: controllers/SecurityCheck.php:121
341
+ msgid "WordPress Version"
342
+ msgstr "Versión de WordPress"
343
+
344
+ #: controllers/SecurityCheck.php:125
345
+ #, php-format
346
+ msgid ""
347
+ "You should always update WordPress to the %slatest versions%s. These usually "
348
+ "include the latest security fixes, and don't alter WP in any significant "
349
+ "way. These should be applied as soon as WP releases them. <br /><br />When a "
350
+ "new version of WordPress is available, you will receive an update message on "
351
+ "your WordPress Admin screens. To update WordPress, click the link in this "
352
+ "message."
353
+ msgstr ""
354
+ "Siempre debes actualizar WordPress a las %sversiones más recientes%s. Estas "
355
+ "suelen incluir las últimas correcciones de seguridad, y no alteran WP de "
356
+ "manera significativa. Estos deberían ser aplicados tan pronto como WP los "
357
+ "publique. <br /><br />Cuando una nueva versión de WordPress esté disponible, "
358
+ "recibirás un mensaje de actualización en las pantallas de administración de "
359
+ "WordPress. Para actualizar WordPress, haz clic en el enlace de este mensaje."
360
+
361
+ #: controllers/SecurityCheck.php:126
362
+ msgid "There is a newer version of WordPress available ({version})."
363
+ msgstr "Hay una nueva versión de WordPress disponible ({versión})."
364
+
365
+ #: controllers/SecurityCheck.php:129
366
+ msgid "WP Debug Mode"
367
+ msgstr "Modo de depuración de WP"
368
+
369
+ #: controllers/SecurityCheck.php:133
370
+ msgid ""
371
+ "Every good developer should turn on debugging before getting started on a "
372
+ "new plugin or theme. In fact, the WordPress Codex 'highly recommends' that "
373
+ "developers use WP_DEBUG. <br /><br />Unfortunately, many developers forget "
374
+ "the debug mode, even when the website is live. Showing debug logs in the "
375
+ "frontend will let hackers know a lot about your WordPress website."
376
+ msgstr ""
377
+ "Todo buen desarrollador debería activar la depuración antes de empezar con "
378
+ "un nuevo plugin o tema. De hecho, el Codex de WordPress \"recomienda "
379
+ "encarecidamente\" que los desarrolladores usen WP_DEBUG. <br /><br /"
380
+ ">Desafortunadamente, muchos desarrolladores olvidan el modo de depuración, "
381
+ "incluso cuando el sitio web está en vivo. Mostrar registros de depuración en "
382
+ "el frontend le permitirá a los hackers saber mucho sobre tu sitio web de "
383
+ "WordPress."
384
+
385
+ #: controllers/SecurityCheck.php:134
386
+ msgid ""
387
+ "Disable WP_DEBUG for live websites in wp_config.php <code>define('WP_DEBUG', "
388
+ "false);</code>"
389
+ msgstr ""
390
+ "Deshabilitar WP_DEBUG para sitios web en vivo en wp_config.php "
391
+ "<code>define('WP_DEBUG', false);</code>"
392
+
393
+ #: controllers/SecurityCheck.php:138
394
+ msgid "DB Debug Mode"
395
+ msgstr "Modo de depuración DB"
396
+
397
+ #: controllers/SecurityCheck.php:142
398
+ msgid ""
399
+ "It's not safe to have Database Debug turned on. Make sure you don't use "
400
+ "Database debug on live websites."
401
+ msgstr ""
402
+ "No es seguro tener activado el depurador de la base de datos. Asegúrate de "
403
+ "no usar el depurador de la base de datos en sitios web en vivo."
404
+
405
+ #: controllers/SecurityCheck.php:143
406
+ #, php-format
407
+ msgid ""
408
+ "Turn off the debug plugins if your website is live. You can also switch on "
409
+ "%sHide My Wp > Tweaks > Disable DB Debug in Frontent%s"
410
+ msgstr ""
411
+ "Apague los plugins de depuración si su sitio web está en vivo. También "
412
+ "puedes activar %sHide My Wp > Tweaks > Disable DB Debug in Frontent%s"
413
+
414
+ #: controllers/SecurityCheck.php:147
415
+ msgid "Script Debug Mode"
416
+ msgstr "Modo de depuración de guiones"
417
+
418
+ #: controllers/SecurityCheck.php:151
419
+ msgid ""
420
+ "Every good developer should turn on debugging before getting started on a "
421
+ "new plugin or theme. In fact, the WordPress Codex 'highly recommends' that "
422
+ "developers use SCRIPT_DEBUG. Unfortunately, many developers forget the debug "
423
+ "mode even when the website is live. Showing debug logs in the frontend will "
424
+ "let hackers know a lot about your WordPress website."
425
+ msgstr ""
426
+ "Todo buen desarrollador debería activar la depuración antes de empezar con "
427
+ "un nuevo plugin o tema. De hecho, el Codex de WordPress \"recomienda "
428
+ "encarecidamente\" que los desarrolladores usen SCRIPT_DEBUG. "
429
+ "Desafortunadamente, muchos desarrolladores olvidan el modo de depuración "
430
+ "incluso cuando el sitio web está en vivo. Mostrar registros de depuración en "
431
+ "el frontend le permitirá a los hackers saber mucho sobre tu sitio web de "
432
+ "WordPress."
433
+
434
+ #: controllers/SecurityCheck.php:152
435
+ msgid ""
436
+ "Disable SCRIPT_DEBUG for live websites in wp_config.php "
437
+ "<code>define('SCRIPT_DEBUG', false);</code>"
438
+ msgstr ""
439
+ "Deshabilitar SCRIPT_DEBUG para sitios web en vivo en wp_config.php "
440
+ "<code>define('SCRIPT_DEBUG', false);</code>"
441
+
442
+ #: controllers/SecurityCheck.php:156
443
+ msgid "display_errors PHP directive"
444
+ msgstr "errores_de_visualización Directiva PHP"
445
+
446
+ #: controllers/SecurityCheck.php:160
447
+ msgid ""
448
+ "Displaying any kind of debug info in the frontend is extremely bad. If any "
449
+ "PHP errors happen on your site they should be logged in a safe place and not "
450
+ "displayed to visitors or potential attackers."
451
+ msgstr ""
452
+ "Mostrar cualquier tipo de información de depuración en el frontend es "
453
+ "extremadamente malo. Si cualquier error de PHP ocurre en su sitio, debe ser "
454
+ "registrado en un lugar seguro y no ser mostrado a los visitantes o "
455
+ "potenciales atacantes."
456
+
457
+ #: controllers/SecurityCheck.php:161
458
+ msgid "Edit wp_config.php and add <code>ini_set('display_errors', 0);</code>"
459
+ msgstr "Edita wp_config.php y añade <code>ini_set('display_errors', 0);</code>"
460
+
461
+ #: controllers/SecurityCheck.php:164
462
+ msgid "Backend under SSL"
463
+ msgstr "Backend bajo SSL"
464
+
465
+ #: controllers/SecurityCheck.php:168
466
+ msgid ""
467
+ "SSL is an abbreviation used for Secure Sockets Layers, which are encryption "
468
+ "protocols used on the internet to secure information exchange and provide "
469
+ "certificate information.<br /><br />These certificates provide an assurance "
470
+ "to the user about the identity of the website they are communicating with. "
471
+ "SSL may also be called TLS or Transport Layer Security protocol. <br /><br /"
472
+ ">It's important to have a secure connection for the Admin Dashboard in "
473
+ "WordPress."
474
+ msgstr ""
475
+ "SSL es la abreviatura de Secure Sockets Layers, que son protocolos de "
476
+ "cifrado utilizados en Internet para asegurar el intercambio de información y "
477
+ "proporcionar información de certificados.<br /><br />Estos certificados "
478
+ "proporcionan una garantía al usuario sobre la identidad del sitio web con el "
479
+ "que se está comunicando. El SSL también puede denominarse TLS o protocolo de "
480
+ "seguridad de la capa de transporte. <br /><br />Es importante tener una "
481
+ "conexión segura para el panel de administración en WordPress."
482
+
483
+ #: controllers/SecurityCheck.php:169
484
+ #, php-format
485
+ msgid "Learn how to set your website as %s. %sClick Here%s"
486
+ msgstr "Aprende a configurar tu sitio web como %s. %sHaz clic aquí%s"
487
+
488
+ #: controllers/SecurityCheck.php:172
489
+ msgid "User 'admin' as Administrator"
490
+ msgstr "Ocultar la nueva ruta de admin"
491
+
492
+ #: controllers/SecurityCheck.php:176
493
+ msgid ""
494
+ "In the old days, the default WordPress admin username was 'admin'. Since "
495
+ "usernames make up half of the login credentials, this made it easier for "
496
+ "hackers to launch brute-force attacks. <br /><br />Thankfully, WordPress has "
497
+ "since changed this and now requires you to select a custom username at the "
498
+ "time of installing WordPress."
499
+ msgstr ""
500
+ "En los viejos tiempos, el nombre de usuario predeterminado del administrador "
501
+ "de WordPress era 'admin'. Como los nombres de usuario constituyen la mitad "
502
+ "de las credenciales de inicio de sesión, esto facilitaba a los hackers el "
503
+ "lanzamiento de ataques de fuerza bruta. <br /><br />Afortunadamente, "
504
+ "WordPress ha cambiado esto y ahora requiere que selecciones un nombre de "
505
+ "usuario personalizado al momento de instalar WordPress."
506
+
507
+ #: controllers/SecurityCheck.php:177
508
+ msgid "Change the user 'admin' with another name to improve security."
509
+ msgstr "Cambiar el usuario 'admin' por otro nombre para mejorar la seguridad."
510
+
511
+ #: controllers/SecurityCheck.php:180
512
+ msgid "Spammers can easily signup"
513
+ msgstr "Los spammers pueden inscribirse fácilmente"
514
+
515
+ #: controllers/SecurityCheck.php:184
516
+ msgid ""
517
+ "If you do not have an e-commerce, membership or guest posting website, you "
518
+ "shouldn't let users subscribe to your blog. You will end up with spam "
519
+ "registrations and your website will be filled with spammy content and "
520
+ "comments."
521
+ msgstr ""
522
+ "Si no tiene un sitio web de comercio electrónico, de membresía o de "
523
+ "publicaciones de invitados, no debe permitir que los usuarios se suscriban a "
524
+ "su blog. Terminará con registros de spam y su sitio web se llenará de "
525
+ "contenido y comentarios de spam."
526
+
527
+ #: controllers/SecurityCheck.php:185
528
+ #, php-format
529
+ msgid ""
530
+ "Change the signup path from %sHide My Wp > Custom Register URL%s or uncheck "
531
+ "the option %s > %s > %s"
532
+ msgstr ""
533
+ "Cambie la ruta de registro desde %sHide My Wp > Custom Register URL%s o "
534
+ "desmarque la opción %s > %s > %s"
535
+
536
+ #: controllers/SecurityCheck.php:185 controllers/SecurityCheck.php:444
537
+ msgid "General"
538
+ msgstr "General"
539
+
540
+ #: controllers/SecurityCheck.php:185
541
+ msgid "Membership"
542
+ msgstr "Membresía"
543
+
544
+ #: controllers/SecurityCheck.php:188
545
+ msgid "Outdated Plugins"
546
+ msgstr "Plugins obsoletos"
547
+
548
+ #: controllers/SecurityCheck.php:192
549
+ msgid ""
550
+ "WordPress and its plugins and themes are like any other software installed "
551
+ "on your computer, and like any other application on your devices. "
552
+ "Periodically, developers release updates which provide new features, or fix "
553
+ "known bugs. <br /><br />These new features may not necessarily be something "
554
+ "that you want. In fact, you may be perfectly satisfied with the "
555
+ "functionality you currently have. Nevertheless, you are still likely to be "
556
+ "concerned about bugs.<br /><br />Software bugs can come in many shapes and "
557
+ "sizes. A bug could be very serious, such as preventing users from using a "
558
+ "plugin, or it could be minor and only affect a certain part of a theme, for "
559
+ "example. In some cases, bugs can cause serious security holes. <br /><br /"
560
+ ">Keeping plugins up to date is one of the most important and easiest ways to "
561
+ "keep your site secure."
562
+ msgstr ""
563
+ "WordPress y sus plugins y temas son como cualquier otro software instalado "
564
+ "en tu ordenador, y como cualquier otra aplicación en tus dispositivos. "
565
+ "Periódicamente, los desarrolladores publican actualizaciones que "
566
+ "proporcionan nuevas características o corrigen errores conocidos. <br /><br /"
567
+ ">Estas nuevas características pueden no ser necesariamente algo que tú "
568
+ "quieras. De hecho, es posible que estés perfectamente satisfecho con la "
569
+ "funcionalidad que tienes actualmente. Sin embargo, es probable que aún le "
570
+ "preocupen los errores.<br /><br />Los errores de software pueden tener "
571
+ "muchas formas y tamaños. Un error puede ser muy grave, como impedir que los "
572
+ "usuarios usen un plugin, o puede ser menor y afectar sólo a una cierta parte "
573
+ "de un tema, por ejemplo. En algunos casos, los bugs pueden causar serios "
574
+ "agujeros de seguridad. <br /><br />Mantener los plugins actualizados es una "
575
+ "de las formas más importantes y fáciles de mantener su sitio seguro."
576
+
577
+ #: controllers/SecurityCheck.php:193 controllers/SecurityCheck.php:201
578
+ msgid "Go to the Updates page and update all the plugins to the last version."
579
+ msgstr ""
580
+ "Ve a la página de actualizaciones y actualiza todos los plugins a la última "
581
+ "versión."
582
+
583
+ #: controllers/SecurityCheck.php:196
584
+ msgid "Not Updated Plugins"
585
+ msgstr "Plugins no actualizados"
586
+
587
+ #: controllers/SecurityCheck.php:200
588
+ msgid ""
589
+ "Plugins that have not been updated in the last 12 months can have real "
590
+ "security problems. Make sure you use updated plugins from WordPress "
591
+ "Directory."
592
+ msgstr ""
593
+ "Los plugins que no han sido actualizados en los últimos 12 meses pueden "
594
+ "tener verdaderos problemas de seguridad. Asegúrate de usar los plugins "
595
+ "actualizados del directorio de WordPress."
596
+
597
+ #: controllers/SecurityCheck.php:204
598
+ msgid "Version Incompatible Plugins"
599
+ msgstr "(sólo si otros plugins de cache lo requieren)"
600
+
601
+ #: controllers/SecurityCheck.php:208
602
+ msgid ""
603
+ "Plugins that are incompatible with your version of WordPress can have real "
604
+ "security problems. Make sure you use tested plugins from WordPress Directory."
605
+ msgstr ""
606
+ "Los plugins que son incompatibles con tu versión de WordPress pueden tener "
607
+ "verdaderos problemas de seguridad. Asegúrate de usar los plugins probados "
608
+ "del directorio de WordPress."
609
+
610
+ #: controllers/SecurityCheck.php:209
611
+ msgid "Make sure you use tested plugins from WordPress Directory."
612
+ msgstr "Asegúrate de usar los plugins probados del directorio de WordPress."
613
+
614
+ #: controllers/SecurityCheck.php:212
615
+ msgid "Outdated Themes"
616
+ msgstr "Temas obsoletos"
617
+
618
+ #: controllers/SecurityCheck.php:216
619
+ msgid ""
620
+ "WordPress and its plugins and themes are like any other software installed "
621
+ "on your computer, and like any other application on your devices. "
622
+ "Periodically developers release updates which provide new features or fix "
623
+ "known bugs. <br /><br />New features may be something that you do not "
624
+ "necessarily want. In fact, you may be perfectly satisfied with the "
625
+ "functionality you currently have. Nevertheless, you may still be concerned "
626
+ "about bugs.<br /><br />Software bugs can come in many shapes and sizes. A "
627
+ "bug could be very serious, such as preventing users from using a plugin, or "
628
+ "it could be a minor bug that only affects a certain part of a theme, for "
629
+ "example. In some cases, bugs can even cause serious security holes.<br /"
630
+ "><br />Keeping themes up to date is one of the most important and easiest "
631
+ "ways to keep your site secure."
632
+ msgstr ""
633
+ "WordPress y sus plugins y temas son como cualquier otro software instalado "
634
+ "en tu ordenador, y como cualquier otra aplicación en tus dispositivos. "
635
+ "Periódicamente los desarrolladores publican actualizaciones que proporcionan "
636
+ "nuevas características o corrigen errores conocidos. <br /><br />Las nuevas "
637
+ "características pueden ser algo que no necesariamente quieres. De hecho, es "
638
+ "posible que estés perfectamente satisfecho con la funcionalidad que tienes "
639
+ "actualmente. Sin embargo, puede que aún le preocupen los errores.<br /><br /"
640
+ ">Los errores de software pueden tener muchas formas y tamaños. Un error "
641
+ "puede ser muy grave, como impedir que los usuarios usen un plugin, o puede "
642
+ "ser un error menor que sólo afecta a una cierta parte de un tema, por "
643
+ "ejemplo. En algunos casos, los bugs pueden incluso causar serios agujeros de "
644
+ "seguridad.<br /><br />Mantener los temas actualizados es una de las formas "
645
+ "más importantes y sencillas de mantener su sitio seguro."
646
+
647
+ #: controllers/SecurityCheck.php:217
648
+ msgid "Go to the Updates page and update all the themes to the last version."
649
+ msgstr ""
650
+ "Ve a la página de actualizaciones y actualiza todos los temas a la última "
651
+ "versión."
652
+
653
+ #: controllers/SecurityCheck.php:220
654
+ msgid "Database Prefix"
655
+ msgstr "Prefijo de la base de datos"
656
+
657
+ #: controllers/SecurityCheck.php:224
658
+ msgid ""
659
+ "The WordPress database is like a brain for your entire WordPress site, "
660
+ "because every single bit of information about your site is stored there, "
661
+ "thus making it a hacker’s favorite target. <br /><br />Spammers and hackers "
662
+ "run automated code for SQL injections.<br />Unfortunately, many people "
663
+ "forget to change the database prefix when they install WordPress. <br />This "
664
+ "makes it easier for hackers to plan a mass attack by targeting the default "
665
+ "prefix <strong>wp_</strong>."
666
+ msgstr ""
667
+ "La base de datos de WordPress es como un cerebro para todo tu sitio de "
668
+ "WordPress, porque cada pedacito de información sobre tu sitio está "
669
+ "almacenado allí, convirtiéndolo así en el objetivo favorito de los hackers. "
670
+ "<br /><br />Los spammers y hackers ejecutan código automatizado para "
671
+ "inyecciones de SQL.<br />Desafortunadamente, mucha gente se olvida de "
672
+ "cambiar el prefijo de la base de datos cuando instala WordPress. <br />Esto "
673
+ "facilita a los hackers el planear un ataque masivo apuntando al prefijo "
674
+ "predeterminado <strong>wp_</strong>."
675
+
676
+ #: controllers/SecurityCheck.php:225
677
+ #, php-format
678
+ msgid ""
679
+ "Hide My WP protects your website from most SQL injections but, if possible, "
680
+ "use a custom prefix for database tables to avoid SQL injections. %sRead more"
681
+ "%s"
682
+ msgstr ""
683
+ "Hide My WP protege su sitio web de la mayoría de las inyecciones de SQL "
684
+ "pero, si es posible, utilice un prefijo personalizado para las tablas de la "
685
+ "base de datos para evitar las inyecciones de SQL. %sLeer más%s"
686
+
687
+ #: controllers/SecurityCheck.php:228
688
+ msgid "Versions in Source Code"
689
+ msgstr "Versiones en el código fuente"
690
+
691
+ #: controllers/SecurityCheck.php:232
692
+ msgid ""
693
+ "WordPress, plugins and themes add their version info to the source code, so "
694
+ "anyone can see it. <br /><br />Hackers can easily find a website with "
695
+ "vulnerable version plugins or themes, and target these with Zero-Day "
696
+ "Exploits."
697
+ msgstr ""
698
+ "WordPress, los plugins y los temas añaden la información de su versión al "
699
+ "código fuente, para que cualquiera pueda verla. <br /><br />Los hackers "
700
+ "pueden encontrar fácilmente un sitio web con plugins o temas de versiones "
701
+ "vulnerables, y apuntarlos con Exploits de Día Cero."
702
+
703
+ #: controllers/SecurityCheck.php:233
704
+ #, php-format
705
+ msgid "Switch on %sHide My WP > Tweaks > %s %s"
706
+ msgstr "Enciende %sHide My WP > Ajustes > %s %s"
707
+
708
+ #: controllers/SecurityCheck.php:233 view/Tweaks.php:65
709
+ msgid "Hide Versions and WordPress Tags"
710
+ msgstr "Ocultar versiones y etiquetas de WordPress"
711
+
712
+ #: controllers/SecurityCheck.php:237
713
+ msgid "Salts and Security Keys valid"
714
+ msgstr "Las sales y las llaves de seguridad son válidas"
715
+
716
+ #: controllers/SecurityCheck.php:241
717
+ msgid ""
718
+ "Security keys are used to ensure better encryption of information stored in "
719
+ "the user's cookies and hashed passwords. <br /><br />These make your site "
720
+ "more difficult to hack, access and crack by adding random elements to the "
721
+ "password. You don't have to remember these keys. In fact, once you set them "
722
+ "you'll never see them again. Therefore there's no excuse for not setting "
723
+ "them properly."
724
+ msgstr ""
725
+ "Las claves de seguridad se utilizan para asegurar una mejor codificación de "
726
+ "la información almacenada en las cookies y las contraseñas de los usuarios. "
727
+ "<br /><br />Esto hace que su sitio sea más difícil de hackear, acceder y "
728
+ "crackear añadiendo elementos aleatorios a la contraseña. No es necesario que "
729
+ "recuerde estas claves. De hecho, una vez que las configures, no las volverás "
730
+ "a ver. Por lo tanto, no hay excusa para no configurarlas correctamente."
731
+
732
+ #: controllers/SecurityCheck.php:242
733
+ msgid ""
734
+ "Security keys are defined in wp-config.php as constants on lines. They "
735
+ "should be as unique and as long as possible. <code>AUTH_KEY,SECURE_AUTH_KEY,"
736
+ "LOGGED_IN_KEY,NONCE_KEY,AUTH_SALT,SECURE_AUTH_SALT,LOGGED_IN_SALT,"
737
+ "NONCE_SALT</code>"
738
+ msgstr ""
739
+ "Las claves de seguridad se definen en wp-config.php como constantes en las "
740
+ "líneas. Deben ser tan únicas y largas como sea posible. <code>AUTH_KEY,"
741
+ "SECURE_AUTH_KEY,LOGGED_IN_KEY,NONCE_KEY,AUTH_SALT,SECURE_AUTH_SALT,"
742
+ "LOGGED_IN_SALT,NONCE_SALT</code>"
743
+
744
+ #: controllers/SecurityCheck.php:245
745
+ msgid "Security Keys Updated"
746
+ msgstr "Llaves de seguridad actualizadas"
747
+
748
+ #: controllers/SecurityCheck.php:249
749
+ msgid ""
750
+ "The security keys in wp-config.php should be renewed as often as possible."
751
+ msgstr ""
752
+ "Las claves de seguridad en wp-config.php deben ser renovadas tan a menudo "
753
+ "como sea posible."
754
+
755
+ #: controllers/SecurityCheck.php:250
756
+ #, php-format
757
+ msgid ""
758
+ "You can generate %snew Keys from here%s <code>AUTH_KEY,SECURE_AUTH_KEY,"
759
+ "LOGGED_IN_KEY,NONCE_KEY,AUTH_SALT,SECURE_AUTH_SALT,LOGGED_IN_SALT,"
760
+ "NONCE_SALT</code>"
761
+ msgstr ""
762
+ "Puedes generar %s nuevas claves desde aquí %s <code>AUTH_KEY,SECURE_AUTH_KEY,"
763
+ "LOGGED_IN_KEY,NONCE_KEY,AUTH_SALT,SECURE_AUTH_SALT,LOGGED_IN_SALT,"
764
+ "NONCE_SALT</code>"
765
+
766
+ #: controllers/SecurityCheck.php:253
767
+ msgid "WordPress dDatabase Password"
768
+ msgstr "Contraseña de la base de datos de WordPress dDatabase"
769
+
770
+ #: controllers/SecurityCheck.php:257
771
+ msgid ""
772
+ "There is no such thing as an \"unimportant password\"! The same goes for "
773
+ "your WordPress database password. <br />Although most servers are configured "
774
+ "so that the database can't be accessed from other hosts (or from outside of "
775
+ "the local network), that doesn't mean your database password should be "
776
+ "\"12345\" or no password at all."
777
+ msgstr ""
778
+ "¡No existe tal cosa como una \"contraseña sin importancia\"! Lo mismo ocurre "
779
+ "con la contraseña de la base de datos de WordPress. <br />Aunque la mayoría "
780
+ "de los servidores están configurados de manera que no se puede acceder a la "
781
+ "base de datos desde otros hosts (o desde fuera de la red local), eso no "
782
+ "significa que tu contraseña de la base de datos deba ser \"12345\" o ninguna "
783
+ "contraseña en absoluto."
784
+
785
+ #: controllers/SecurityCheck.php:258
786
+ msgid ""
787
+ "Choose a proper database password, at least 8 characters long with a "
788
+ "combination of letters, numbers and special characters. After you change it, "
789
+ "set the new password in the wp_config.php file <code>define('DB_PASSWORD', "
790
+ "'NEW_DB_PASSWORD_GOES_HERE');</code>"
791
+ msgstr ""
792
+ "Elija una contraseña adecuada para la base de datos, de al menos 8 "
793
+ "caracteres de longitud con una combinación de letras, números y caracteres "
794
+ "especiales. Después de cambiarla, establezca la nueva contraseña en el "
795
+ "archivo wp_config.php <code>define('DB_PASSWORD', "
796
+ "'NEW_DB_PASSWORD_GOES_HERE');</code>"
797
+
798
+ #: controllers/SecurityCheck.php:269
799
+ msgid "/wp-content is visible in source code"
800
+ msgstr "El contenido de /wp es visible en el código fuente"
801
+
802
+ #: controllers/SecurityCheck.php:273
803
+ msgid ""
804
+ "It's important to rename common WordPress paths, such as wp-content and wp-"
805
+ "includes to prevent hackers from knowing that you have a WordPress website."
806
+ msgstr ""
807
+ "Es importante renombrar las rutas comunes de WordPress, como wp-contenido y "
808
+ "wp-incluido para evitar que los hackers sepan que tienes un sitio web de "
809
+ "WordPress."
810
+
811
+ #: controllers/SecurityCheck.php:274
812
+ #, php-format
813
+ msgid ""
814
+ "Change the wp-content, wp-includes and other common paths with %sHide My Wp "
815
+ "> Permalinks%s"
816
+ msgstr ""
817
+ "Cambie el contenido del wp, wp-incluye y otros caminos comunes con %sHide My "
818
+ "Wp > Permalinks%s"
819
+
820
+ #: controllers/SecurityCheck.php:277
821
+ msgid "/wp-content path is accessible"
822
+ msgstr "/El camino del contenido de la página web es accesible.."
823
+
824
+ #: controllers/SecurityCheck.php:281
825
+ msgid ""
826
+ "It's important to hide the common WordPress paths to prevent attacks on "
827
+ "vulnerable plugins and themes. <br /> Also, it's important to hide the names "
828
+ "of plugins and themes to make it impossible for bots to detect them."
829
+ msgstr ""
830
+ "Es importante ocultar las rutas comunes de WordPress para prevenir ataques a "
831
+ "los plugins y temas vulnerables. <br /> También es importante ocultar los "
832
+ "nombres de los plugins y temas para hacer imposible que los bots los "
833
+ "detecten."
834
+
835
+ #: controllers/SecurityCheck.php:282
836
+ #, php-format
837
+ msgid ""
838
+ "Switch on %sHide My Wp > Hide WordPress Common Paths%s to hide the old paths"
839
+ msgstr ""
840
+ "Enciende %sHide My Wp > Hide WordPress Common Paths%s para ocultar los "
841
+ "viejos caminos"
842
+
843
+ #: controllers/SecurityCheck.php:286 controllers/SecurityCheck.php:294
844
+ #, php-format
845
+ msgid "%s is visible in source code"
846
+ msgstr "%s es visible en el código fuente"
847
+
848
+ #: controllers/SecurityCheck.php:290
849
+ #, php-format
850
+ msgid ""
851
+ "Having the admin URL visible in the source code it's really bad because "
852
+ "hackers will immediately know your secret admin path and start a Brute Force "
853
+ "attack. The custom admin path should not appear in the ajax URL. <br /><br /"
854
+ ">Find solutions for %show to hide the path from source code%s."
855
+ msgstr ""
856
+ "Tener la URL del administrador visible en el código fuente es realmente malo "
857
+ "porque los hackers sabrán inmediatamente la ruta secreta del administrador y "
858
+ "comenzarán un ataque de Fuerza Bruta. La ruta de administración "
859
+ "personalizada no debería aparecer en la URL de Ajax. <br /><br />Encuentra "
860
+ "soluciones para %show para ocultar la ruta del código fuente%s."
861
+
862
+ #: controllers/SecurityCheck.php:291
863
+ #, php-format
864
+ msgid ""
865
+ "Switch on %sHide My WP > Permalinks > Hide wp-admin from ajax URL%s. Hide "
866
+ "any reference to admin path from the installed plugins."
867
+ msgstr ""
868
+ "Enciende %sHide My WP > Enlaces permanentes > Ocultar wp-admin de ajax URL"
869
+ "%s. Ocultar cualquier referencia a la ruta del administrador de los plugins "
870
+ "instalados."
871
+
872
+ #: controllers/SecurityCheck.php:298
873
+ #, php-format
874
+ msgid ""
875
+ "Having the login URL visible in the source code it's really bad because "
876
+ "hackers will immediately know your secret login path and start a Brute Force "
877
+ "attack. <br /><br />The custom login path should be kept secret and with the "
878
+ "Brute Force Protection activated for it. <br ><br />Find solutions for %show "
879
+ "to hide the path from source code%s."
880
+ msgstr ""
881
+ "Tener la URL de inicio de sesión visible en el código fuente es realmente "
882
+ "malo porque los hackers sabrán inmediatamente su ruta de inicio de sesión "
883
+ "secreta y comenzarán un ataque de Fuerza Bruta. <br /><br />La ruta de "
884
+ "acceso personalizada debe mantenerse secreta y con la protección de Fuerza "
885
+ "Bruta activada para ello. <br ><br />Encuentra soluciones para %show para "
886
+ "ocultar la ruta del código fuente%s."
887
+
888
+ #: controllers/SecurityCheck.php:299
889
+ #, php-format
890
+ msgid "%sHide the login path%s from theme menu or widget."
891
+ msgstr "%sOculta la ruta de acceso%s del menú temático o del widget."
892
+
893
+ #: controllers/SecurityCheck.php:302
894
+ msgid "/wp-login path is accessible"
895
+ msgstr "/La ruta de acceso al wp es accesible"
896
+
897
+ #: controllers/SecurityCheck.php:306
898
+ msgid ""
899
+ "If your site allows user logins, you need your login page to be easy to find "
900
+ "for your users. You also need to do other things to protect against "
901
+ "malicious login attempts. <br /><br />However, obscurity is a valid security "
902
+ "layer when used as part of a comprehensive security strategy, and if you "
903
+ "want to cut down on the number of malicious login attempts. Making your "
904
+ "login page difficult to find is one way to do that."
905
+ msgstr ""
906
+ "Si su sitio permite el ingreso de usuarios, necesita que su página de "
907
+ "ingreso sea fácil de encontrar para sus usuarios. También necesita hacer "
908
+ "otras cosas para protegerse contra intentos de inicio de sesión maliciosos. "
909
+ "<br /><br />Sin embargo, la oscuridad es una capa de seguridad válida cuando "
910
+ "se utiliza como parte de una estrategia de seguridad integral, y si desea "
911
+ "reducir el número de intentos de inicio de sesión maliciosos. Una forma de "
912
+ "hacerlo es dificultando la búsqueda de su página de inicio de sesión."
913
+
914
+ #: controllers/SecurityCheck.php:307
915
+ #, php-format
916
+ msgid ""
917
+ "Change the wp-login from %sHide My Wp > Custom login URL%s and Switch on "
918
+ "%sHide My Wp > Brute Force Protection%s"
919
+ msgstr ""
920
+ "Cambie el wp-login de %sHide My Wp > Custom login URL%s y encienda %sHide My "
921
+ "Wp > Brute Force Protection%s"
922
+
923
+ #: controllers/SecurityCheck.php:310
924
+ msgid "/wp_config.php file is writable"
925
+ msgstr "El archivo /wp_config.php es escribible"
926
+
927
+ #: controllers/SecurityCheck.php:314
928
+ msgid ""
929
+ "One of the most important files in your WordPress installation is the wp-"
930
+ "config.php file. <br />This file is located in the root directory of your "
931
+ "WordPress installation, and contains your website's base configuration "
932
+ "details, such as database connection information."
933
+ msgstr ""
934
+ "Uno de los archivos más importantes de su instalación de WordPress es el "
935
+ "archivo wp-config.php. <br />Este archivo se encuentra en el directorio raíz "
936
+ "de la instalación de WordPress y contiene los detalles de la configuración "
937
+ "básica de su sitio web, como la información de conexión a la base de datos."
938
+
939
+ #: controllers/SecurityCheck.php:315
940
+ #, php-format
941
+ msgid ""
942
+ "Try setting chmod to %s0400%s or %s0440%s and if the website works normally "
943
+ "that's the best one to use."
944
+ msgstr ""
945
+ "Intenta poner chmod en %s0400%s o %s0440%s y si el sitio web funciona "
946
+ "normalmente es el mejor para usar."
947
+
948
+ #: controllers/SecurityCheck.php:318
949
+ msgid "wp-config.php & wp-config-sample.php files are accessible "
950
+ msgstr "se puede acceder a los archivos wp-config.php y wp-config-sample.php"
951
+
952
+ #: controllers/SecurityCheck.php:322
953
+ msgid ""
954
+ "One of the most important files in your WordPress installation is the wp-"
955
+ "config.php file. <br />This file is located in the root directory of your "
956
+ "WordPress installation and contains your website's base configuration "
957
+ "details, such as database connection information."
958
+ msgstr ""
959
+ "Uno de los archivos más importantes de su instalación de WordPress es el "
960
+ "archivo wp-config.php. <br />Este archivo se encuentra en el directorio raíz "
961
+ "de la instalación de WordPress y contiene los detalles de la configuración "
962
+ "básica de su sitio web, como la información de conexión a la base de datos."
963
+
964
+ #: controllers/SecurityCheck.php:323
965
+ #, php-format
966
+ msgid ""
967
+ "Switch on %sHide My Wp > Hide WordPress Common Files%s to hide wp-config.php "
968
+ "& wp-config-sample.php files"
969
+ msgstr ""
970
+ "Enciende %sHide My Wp > Hide WordPress Common Files%s para ocultar los "
971
+ "archivos wp-config.php & wp-config-sample.php"
972
+
973
+ #: controllers/SecurityCheck.php:327
974
+ msgid "readme.html file is accessible "
975
+ msgstr "el archivo readme.html es accesible"
976
+
977
+ #: controllers/SecurityCheck.php:331
978
+ msgid ""
979
+ "It's important to hide or remove the readme.html file because it contains WP "
980
+ "version details."
981
+ msgstr ""
982
+ "Es importante ocultar o eliminar el archivo readme.html porque contiene "
983
+ "detalles de la versión WP."
984
+
985
+ #: controllers/SecurityCheck.php:332
986
+ #, php-format
987
+ msgid ""
988
+ "Rename readme.html file or switch on %sHide My Wp > Hide WordPress Common "
989
+ "Files%s"
990
+ msgstr ""
991
+ "Renombra el archivo readme.html o enciende %sHide My Wp > Hide WordPress "
992
+ "Common Files%s"
993
+
994
+ #: controllers/SecurityCheck.php:336
995
+ msgid "install.php & upgrade.php files are accessible "
996
+ msgstr "se puede acceder a los archivos install.php y upgrade.php"
997
+
998
+ #: controllers/SecurityCheck.php:340
999
+ msgid ""
1000
+ "WordPress is well-known for its ease of installation. <br/>It's important to "
1001
+ "hide the wp-admin/install.php and wp-admin/upgrade.php files because there "
1002
+ "have already been a couple of security issues regarding these files."
1003
+ msgstr ""
1004
+ "WordPress es conocido por su facilidad de instalación. <br/>Es importante "
1005
+ "ocultar los archivos wp-admin/install.php y wp-admin/upgrade.php porque ya "
1006
+ "ha habido un par de problemas de seguridad con respecto a estos archivos."
1007
+
1008
+ #: controllers/SecurityCheck.php:341
1009
+ #, php-format
1010
+ msgid ""
1011
+ "Switch on %sHide My Wp > Hide WordPress Common Files%s to hide wp-admin/"
1012
+ "install.php & wp-admin/upgrade.php files"
1013
+ msgstr ""
1014
+ "Activar %sHide My Wp > Hide WordPress Common Files%s para ocultar los "
1015
+ "archivos wp-admin/install.php & wp-admin/upgrade.php"
1016
+
1017
+ #: controllers/SecurityCheck.php:345
1018
+ msgid "PHP register_globals is on"
1019
+ msgstr "ej. usuario-nuevo o registrar"
1020
+
1021
+ #: controllers/SecurityCheck.php:349
1022
+ msgid ""
1023
+ "This is one of the biggest security issues you can have on your site! If "
1024
+ "your hosting company has this directive enabled by default, switch to "
1025
+ "another company immediately!"
1026
+ msgstr ""
1027
+ "¡Este es uno de los mayores problemas de seguridad que puedes tener en tu "
1028
+ "sitio! Si su compañía de alojamiento tiene esta directiva activada por "
1029
+ "defecto, ¡cambie a otra compañía inmediatamente!"
1030
+
1031
+ #: controllers/SecurityCheck.php:350
1032
+ msgid ""
1033
+ "If you have access to php.ini file, set <code>register_globals = off</code> "
1034
+ "or contact the hosting company to set it off"
1035
+ msgstr ""
1036
+ "Si tienes acceso al archivo php.ini, activa <code>register_globals = off</"
1037
+ "code> o contacta con la compañía de alojamiento para activarlo"
1038
+
1039
+ #: controllers/SecurityCheck.php:353
1040
+ msgid "PHP expose_php is on"
1041
+ msgstr "PHP expose_php está en"
1042
+
1043
+ #: controllers/SecurityCheck.php:357
1044
+ msgid ""
1045
+ "Exposing the PHP version will make the job of attacking your site much "
1046
+ "easier."
1047
+ msgstr ""
1048
+ "Exponer la versión PHP hará el trabajo de atacar su sitio mucho más fácil."
1049
+
1050
+ #: controllers/SecurityCheck.php:358
1051
+ msgid ""
1052
+ "If you have access to php.ini file, set <code>expose_php = off</code> or "
1053
+ "contact the hosting company to set it off"
1054
+ msgstr ""
1055
+ "Si tiene acceso al archivo php.ini, configure <code>expose_php = off</code> "
1056
+ "o contacte con la compañía de alojamiento para configurarlo"
1057
+
1058
+ #: controllers/SecurityCheck.php:361
1059
+ msgid "PHP safe_mode is on"
1060
+ msgstr "PHP safe_mode está activado"
1061
+
1062
+ #: controllers/SecurityCheck.php:365
1063
+ msgid ""
1064
+ "PHP safe mode was one of the attempts to solve security problems of shared "
1065
+ "web hosting servers. <br /><br />It is still being used by some web hosting "
1066
+ "providers, however, nowadays this is regarded as improper. A systematic "
1067
+ "approach proves that it’s architecturally incorrect to try solving complex "
1068
+ "security issues at the PHP level, rather than at the web server and OS "
1069
+ "levels.<br /><br />Technically, safe mode is a PHP directive that restricts "
1070
+ "the way some built-in PHP functions operate. The main problem here is "
1071
+ "inconsistency. When turned on, PHP safe mode may prevent many legitimate PHP "
1072
+ "functions from working correctly. At the same time there exists a variety of "
1073
+ "methods to override safe mode limitations using PHP functions that aren’t "
1074
+ "restricted, so if a hacker has already got in – safe mode is useless."
1075
+ msgstr ""
1076
+ "El modo seguro de PHP fue uno de los intentos de resolver los problemas de "
1077
+ "seguridad de los servidores de alojamiento web compartidos. <br /><br /"
1078
+ ">Todavía es utilizado por algunos proveedores de alojamiento web, sin "
1079
+ "embargo, hoy en día esto se considera inadecuado. Un enfoque sistemático "
1080
+ "demuestra que es arquitectónicamente incorrecto tratar de resolver complejos "
1081
+ "problemas de seguridad a nivel de PHP, en lugar de a nivel de servidores web "
1082
+ "y sistemas operativos.<br /><br />Técnicamente, el modo seguro es una "
1083
+ "directiva de PHP que restringe la forma en que operan algunas funciones "
1084
+ "incorporadas de PHP. El principal problema aquí es la inconsistencia. Cuando "
1085
+ "se activa, el modo seguro de PHP puede impedir que muchas funciones "
1086
+ "legítimas de PHP funcionen correctamente. Al mismo tiempo, existe una "
1087
+ "variedad de métodos para anular las limitaciones del modo seguro usando "
1088
+ "funciones de PHP que no están restringidas, así que si un hacker ya ha "
1089
+ "entrado - el modo seguro es inútil."
1090
+
1091
+ #: controllers/SecurityCheck.php:366
1092
+ msgid ""
1093
+ "If you have access to php.ini file, set <code>safe_mode = off</code> or "
1094
+ "contact the hosting company to set it off"
1095
+ msgstr ""
1096
+ "Si tienes acceso al archivo php.ini, activa el <code>modo seguro = off</"
1097
+ "code> o contacta con la compañía de alojamiento para activarlo"
1098
+
1099
+ #: controllers/SecurityCheck.php:369
1100
+ msgid "PHP allow_url_include is on"
1101
+ msgstr "PHP allow_url_include está activado"
1102
+
1103
+ #: controllers/SecurityCheck.php:373
1104
+ msgid ""
1105
+ "Having this PHP directive enabled will leave your site exposed to cross-site "
1106
+ "attacks (XSS). <br /><br />There's absolutely no valid reason to enable this "
1107
+ "directive, and using any PHP code that requires it is very risky."
1108
+ msgstr ""
1109
+ "Tener esta directiva PHP activada dejará su sitio expuesto a ataques de "
1110
+ "sitios cruzados (XSS). <br /><br />No hay absolutamente ninguna razón válida "
1111
+ "para habilitar esta directiva, y usar cualquier código PHP que lo requiera "
1112
+ "es muy arriesgado."
1113
+
1114
+ #: controllers/SecurityCheck.php:374
1115
+ msgid ""
1116
+ "If you have access to php.ini file, set <code>allow_url_include = off</code> "
1117
+ "or contact the hosting company to set it off"
1118
+ msgstr ""
1119
+ "Si tienes acceso al archivo php.ini, establece <code>allow_url_include = "
1120
+ "off</code> o contacta con la compañía de alojamiento para activarlo"
1121
+
1122
+ #: controllers/SecurityCheck.php:377
1123
+ msgid "Plugins/Themes editor enabled"
1124
+ msgstr "Plugins/Editor de temas habilitado"
1125
+
1126
+ #: controllers/SecurityCheck.php:381
1127
+ msgid ""
1128
+ "The plugins and themes file editor is a very convenient tool because it "
1129
+ "enables you to make quick changes without the need to use FTP. <br /><br /"
1130
+ ">Unfortunately, it's also a security issue because it not only shows the PHP "
1131
+ "source code, it also enables attackers to inject malicious code into your "
1132
+ "site if they manage to gain access to admin."
1133
+ msgstr ""
1134
+ "El editor de archivos de plugins y temas es una herramienta muy conveniente "
1135
+ "porque permite hacer cambios rápidos sin necesidad de usar FTP. <br /><br /"
1136
+ ">Desafortunadamente, también es un problema de seguridad porque no sólo "
1137
+ "muestra el código fuente de PHP, sino que también permite a los atacantes "
1138
+ "inyectar código malicioso en su sitio si logran acceder al administrador."
1139
+
1140
+ #: controllers/SecurityCheck.php:382
1141
+ msgid ""
1142
+ "Disable DISALLOW_FILE_EDIT for live websites in wp_config.php "
1143
+ "<code>define('DISALLOW_FILE_EDIT', true);</code>"
1144
+ msgstr ""
1145
+ "Deshabilitar DISALLOW_FILE_EDIT para sitios web en vivo en wp_config.php "
1146
+ "<code>define('DISALLOW_FILE_EDIT', true);</code>"
1147
+
1148
+ #: controllers/SecurityCheck.php:386
1149
+ #, php-format
1150
+ msgid "Folder %s is browsable "
1151
+ msgstr "La carpeta %s es navegable"
1152
+
1153
+ #: controllers/SecurityCheck.php:390
1154
+ msgid ""
1155
+ "Allowing anyone to view all files in the Uploads folder with a browser will "
1156
+ "allow them to easily download all your uploaded files. It's a security and a "
1157
+ "copyright issue."
1158
+ msgstr ""
1159
+ "Permitir a cualquiera ver todos los archivos de la carpeta de subidas con un "
1160
+ "navegador les permitirá descargar fácilmente todos sus archivos subidos. Es "
1161
+ "una cuestión de seguridad y de derechos de autor."
1162
+
1163
+ #: controllers/SecurityCheck.php:391
1164
+ #, php-format
1165
+ msgid "Learn how to disable %sDirectory Browsing%s"
1166
+ msgstr "Aprende a deshabilitar la %sNavegación por el directorio%s"
1167
+
1168
+ #: controllers/SecurityCheck.php:395
1169
+ msgid "Windows Live Writer is on "
1170
+ msgstr "Windows Live Writer está encendido"
1171
+
1172
+ #: controllers/SecurityCheck.php:399
1173
+ msgid ""
1174
+ "If you're not using Windows Live Writer there's really no valid reason to "
1175
+ "have its link in the page header, because this tells the whole world you're "
1176
+ "using WordPress."
1177
+ msgstr ""
1178
+ "Si no usas Windows Live Writer no hay ninguna razón válida para tener su "
1179
+ "enlace en el encabezado de la página, porque esto le dice a todo el mundo "
1180
+ "que estás usando WordPress."
1181
+
1182
+ #: controllers/SecurityCheck.php:400
1183
+ #, php-format
1184
+ msgid "Switch on %sHide My Wp > Tweaks > Disable WLW Manifest scripts%s"
1185
+ msgstr ""
1186
+ "Enciende %sHide My Wp > Ajustes > Deshabilita los guiones del Manifiesto WLW"
1187
+ "%s"
1188
+
1189
+ #: controllers/SecurityCheck.php:404
1190
+ msgid "XML-RPC access is on"
1191
+ msgstr "Inhabilitar el acceso a la Rest API"
1192
+
1193
+ #: controllers/SecurityCheck.php:408
1194
+ msgid ""
1195
+ "WordPress XML-RPC is a specification that aims to standardize communications "
1196
+ "between different systems. It uses HTTP as the transport mechanism and XML "
1197
+ "as encoding mechanism to enable a wide range of data to be transmitted. <br /"
1198
+ "><br />The two biggest assets of the API are its extendibility and its "
1199
+ "security. XML-RPC authenticates using basic authentication. It sends the "
1200
+ "username and password with each request, which is a big no-no in security "
1201
+ "circles."
1202
+ msgstr ""
1203
+ "WordPress XML-RPC es una especificación que tiene por objeto estandarizar "
1204
+ "las comunicaciones entre los diferentes sistemas. Utiliza HTTP como "
1205
+ "mecanismo de transporte y XML como mecanismo de codificación para permitir "
1206
+ "la transmisión de una amplia gama de datos. <br /><br />Las dos mayores "
1207
+ "ventajas de la API son su extensibilidad y su seguridad. XML-RPC autentica "
1208
+ "utilizando una autenticación básica. Envía el nombre de usuario y la "
1209
+ "contraseña con cada solicitud, lo cual es un gran no-no en los círculos de "
1210
+ "seguridad."
1211
+
1212
+ #: controllers/SecurityCheck.php:409
1213
+ #, php-format
1214
+ msgid "Switch on %sHide My Wp > Tweaks > Disable XML-RPC access%s"
1215
+ msgstr "Enciende %sHide My Wp > Ajustes > Deshabilita el acceso XML-RPC%s"
1216
+
1217
+ #: controllers/SecurityCheck.php:413
1218
+ msgid "RDS is visible"
1219
+ msgstr "El RDS es visible"
1220
+
1221
+ #: controllers/SecurityCheck.php:417
1222
+ msgid ""
1223
+ "If you're not using any Really Simple Discovery services such as pingbacks, "
1224
+ "there's no need to advertise that endpoint (link) in the header. Please note "
1225
+ "that for most sites this is not a security issue because they \"want to be "
1226
+ "discovered\", but if you want to hide the fact that you're using WP, this is "
1227
+ "the way to go."
1228
+ msgstr ""
1229
+ "Si no estás usando ningún servicio de Really Simple Discovery como "
1230
+ "pingbacks, no hay necesidad de anunciar ese punto final (enlace) en el "
1231
+ "encabezado. Ten en cuenta que para la mayoría de los sitios esto no es un "
1232
+ "problema de seguridad porque \"quieren ser descubiertos\", pero si quieres "
1233
+ "ocultar el hecho de que estás usando WP, este es el camino a seguir."
1234
+
1235
+ #: controllers/SecurityCheck.php:418
1236
+ #, php-format
1237
+ msgid "Switch on %sHide My Wp > Tweaks > Hide RSD header%s"
1238
+ msgstr "Enciende %sHide My Wp > Ajustes > Ocultar encabezamiento RSD%s"
1239
+
1240
+ #: controllers/SecurityCheck.php:422
1241
+ msgid "MySql Grant All Permissions"
1242
+ msgstr "MySql otorga todos los permisos"
1243
+
1244
+ #: controllers/SecurityCheck.php:426
1245
+ msgid ""
1246
+ "If an attacker gains access to your wp-config.php file and gets the MySQL "
1247
+ "username and password, he'll be able to login to that database and do "
1248
+ "whatever that account allows. <br /><br />That's why it's important to keep "
1249
+ "the account's privileges to a bare minimum.<br /><br />For instance, if "
1250
+ "you're not installing any new plugins or updating WP, that account doesn't "
1251
+ "need the CREATE or DROP table privileges.<br /><br />For regular, day-to-day "
1252
+ "usage these are the recommended privileges: SELECT, INSERT, UPDATE and "
1253
+ "DELETE."
1254
+ msgstr ""
1255
+ "Si un atacante obtiene acceso a su archivo wp-config.php y obtiene el nombre "
1256
+ "de usuario y la contraseña de MySQL, podrá acceder a esa base de datos y "
1257
+ "hacer lo que esa cuenta le permita. <br /><br />Por eso es importante "
1258
+ "mantener los privilegios de la cuenta al mínimo.<br /><br />Por ejemplo, si "
1259
+ "no estás instalando ningún nuevo plugin o actualizando WP, esa cuenta no "
1260
+ "necesita los privilegios de la tabla CREATE o DROP.<br /><br />Para el uso "
1261
+ "diario y regular, estos son los privilegios recomendados: SELECCIONAR, "
1262
+ "INSERTAR, ACTUALIZAR y BORRAR."
1263
+
1264
+ #: controllers/SecurityCheck.php:427
1265
+ #, php-format
1266
+ msgid "To learn how to revoke permissions from PhpMyAdmin %sClick here%s"
1267
+ msgstr "Para aprender a revocar los permisos de PhpMyAdmin %sClick here%s"
1268
+
1269
+ #: controllers/SecurityCheck.php:430
1270
+ msgid "Author URL by ID access"
1271
+ msgstr "URL del autor por acceso de identificación"
1272
+
1273
+ #: controllers/SecurityCheck.php:434
1274
+ msgid ""
1275
+ "Usernames (unlike passwords) are not secret. By knowing someone's username, "
1276
+ "you can't log in to their account. You also need the password. <br /><br /"
1277
+ ">However, by knowing the username, you are one step closer to logging in "
1278
+ "using the username to brute-force the password, or to gain access in a "
1279
+ "similar way. <br /><br />That's why it's advisable to keep the list of "
1280
+ "usernames private, at least to some degree. By default, by accessing siteurl."
1281
+ "com/?author={id} and looping through IDs from 1 you can get a list of "
1282
+ "usernames, because WP will redirect you to siteurl.com/author/user/ if the "
1283
+ "ID exists in the system."
1284
+ msgstr ""
1285
+ "Los nombres de usuario (a diferencia de las contraseñas) no son secretos. Al "
1286
+ "conocer el nombre de usuario de alguien, no puedes acceder a su cuenta. "
1287
+ "También necesitas la contraseña. <br /><br />Sin embargo, al conocer el "
1288
+ "nombre de usuario, estás un paso más cerca de iniciar sesión usando el "
1289
+ "nombre de usuario para forzar la contraseña, o para obtener acceso de una "
1290
+ "manera similar. <br /><br />Por eso es aconsejable mantener la lista de "
1291
+ "nombres de usuario en privado, al menos hasta cierto punto. Por defecto, al "
1292
+ "acceder a siteurl.com/?author={id} y hacer un bucle a través de las "
1293
+ "identificaciones de 1 se puede obtener una lista de nombres de usuario, "
1294
+ "porque WP te redirigirá a siteurl.com/?author={id} si la identificación "
1295
+ "existe en el sistema."
1296
+
1297
+ #: controllers/SecurityCheck.php:435
1298
+ #, php-format
1299
+ msgid "Switch on %sHide My Wp > Hide Author ID URL%s"
1300
+ msgstr "Enciende %sHide My Wp > Ocultar ID de Autor URL%s"
1301
+
1302
+ #: controllers/SecurityCheck.php:439
1303
+ msgid "Default WordPress Tagline"
1304
+ msgstr "Línea de texto predeterminada de WordPress"
1305
+
1306
+ #: controllers/SecurityCheck.php:443
1307
+ msgid ""
1308
+ "The WordPress site tagline is a short phrase located under the site title, "
1309
+ "similar to a subtitle or advertising slogan. The goal of a tagline is to "
1310
+ "convey the essence of your site to visitors. <br /><br />If you don't change "
1311
+ "the default tagline it will be very easy to detect that your website was "
1312
+ "actually built with WordPress"
1313
+ msgstr ""
1314
+ "El eslogan del sitio WordPress es una frase corta ubicada bajo el título del "
1315
+ "sitio, similar a un subtítulo o un eslogan publicitario. El objetivo de un "
1316
+ "eslogan es transmitir la esencia de su sitio a los visitantes. <br /><br /"
1317
+ ">Si no cambias el eslogan predeterminado, será muy fácil detectar que tu "
1318
+ "sitio web fue realmente construido con WordPress"
1319
+
1320
+ #: controllers/SecurityCheck.php:444
1321
+ #, php-format
1322
+ msgid "Change the Tagline in %s > %s"
1323
+ msgstr "Cambie la línea de la etiqueta en %s > %s"
1324
+
1325
+ #: controllers/SecurityCheck.php:444
1326
+ msgid "Tagline"
1327
+ msgstr "Lema"
1328
+
1329
+ #: controllers/SecurityCheck.php:521 controllers/SecurityCheck.php:549
1330
+ #: controllers/SecurityCheck.php:574
1331
+ msgid "Saved! You can run the test again."
1332
+ msgstr "¡Salvado! Puedes hacer la prueba de nuevo."
1333
+
1334
+ #: controllers/SecurityCheck.php:526 controllers/SecurityCheck.php:553
1335
+ msgid "Could not fix it. You need to change it yourself."
1336
+ msgstr "No pude arreglarlo. Necesitas cambiarlo tú mismo."
1337
+
1338
+ #: controllers/SecurityCheck.php:567
1339
+ msgid "Saved! This task will be ignored on future tests."
1340
+ msgstr "¡Salvado! Esta tarea será ignorada en futuras pruebas."
1341
+
1342
+ #: controllers/SecurityCheck.php:621 controllers/SecurityCheck.php:639
1343
+ #: controllers/SecurityCheck.php:653 controllers/SecurityCheck.php:666
1344
+ #: controllers/SecurityCheck.php:678 controllers/SecurityCheck.php:923
1345
+ #: controllers/SecurityCheck.php:1005 controllers/SecurityCheck.php:1021
1346
+ #: controllers/SecurityCheck.php:1029 controllers/SecurityCheck.php:1105
1347
+ #: controllers/SecurityCheck.php:1118 controllers/SecurityCheck.php:1132
1348
+ #: controllers/SecurityCheck.php:1145 controllers/SecurityCheck.php:1157
1349
+ #: controllers/SecurityCheck.php:1162 controllers/SecurityCheck.php:1187
1350
+ #: controllers/SecurityCheck.php:1212 controllers/SecurityCheck.php:1226
1351
+ #: controllers/SecurityCheck.php:1240 controllers/SecurityCheck.php:1257
1352
+ #: controllers/SecurityCheck.php:1289 controllers/SecurityCheck.php:1311
1353
+ #: controllers/SecurityCheck.php:1333 controllers/SecurityCheck.php:1355
1354
+ #: controllers/SecurityCheck.php:1375 controllers/SecurityCheck.php:1397
1355
+ #: controllers/SecurityCheck.php:1411 controllers/SecurityCheck.php:1420
1356
+ msgid "Yes"
1357
+ msgstr "Sí"
1358
+
1359
+ #: controllers/SecurityCheck.php:621 controllers/SecurityCheck.php:639
1360
+ #: controllers/SecurityCheck.php:653 controllers/SecurityCheck.php:666
1361
+ #: controllers/SecurityCheck.php:678 controllers/SecurityCheck.php:1005
1362
+ #: controllers/SecurityCheck.php:1021 controllers/SecurityCheck.php:1029
1363
+ #: controllers/SecurityCheck.php:1105 controllers/SecurityCheck.php:1118
1364
+ #: controllers/SecurityCheck.php:1132 controllers/SecurityCheck.php:1145
1365
+ #: controllers/SecurityCheck.php:1157 controllers/SecurityCheck.php:1182
1366
+ #: controllers/SecurityCheck.php:1192 controllers/SecurityCheck.php:1212
1367
+ #: controllers/SecurityCheck.php:1226 controllers/SecurityCheck.php:1240
1368
+ #: controllers/SecurityCheck.php:1289 controllers/SecurityCheck.php:1311
1369
+ #: controllers/SecurityCheck.php:1333 controllers/SecurityCheck.php:1355
1370
+ #: controllers/SecurityCheck.php:1375 controllers/SecurityCheck.php:1397
1371
+ #: controllers/SecurityCheck.php:1411 controllers/SecurityCheck.php:1420
1372
+ msgid "No"
1373
+ msgstr "No"
1374
+
1375
+ #: controllers/SecurityCheck.php:747
1376
+ #, php-format
1377
+ msgid "%s plugin are outdated: %s"
1378
+ msgstr "%s Los plugins están obsoletos: %s"
1379
+
1380
+ #: controllers/SecurityCheck.php:747 controllers/SecurityCheck.php:823
1381
+ msgid "All plugins are up to date"
1382
+ msgstr "Todos los plugins están actualizados"
1383
+
1384
+ #: controllers/SecurityCheck.php:780
1385
+ #, php-format
1386
+ msgid "%s theme(s) are outdated: %s"
1387
+ msgstr "%s Los temas están obsoletos: %s"
1388
+
1389
+ #: controllers/SecurityCheck.php:780
1390
+ msgid "Themes are up to date"
1391
+ msgstr "Los temas están al día"
1392
+
1393
+ #: controllers/SecurityCheck.php:859
1394
+ msgid "All plugins are compatible"
1395
+ msgstr "Vaciar IPs"
1396
+
1397
+ #: controllers/SecurityCheck.php:944
1398
+ #, php-format
1399
+ msgid "%s days since last update"
1400
+ msgstr "%s días desde la última actualización"
1401
+
1402
+ #: controllers/SecurityCheck.php:944
1403
+ msgid "Updated"
1404
+ msgstr "Actualizado"
1405
+
1406
+ #: controllers/SecurityCheck.php:961
1407
+ msgid "Empty"
1408
+ msgstr "Vacío"
1409
+
1410
+ #: controllers/SecurityCheck.php:966
1411
+ msgid "only "
1412
+ msgstr "solamente"
1413
+
1414
+ #: controllers/SecurityCheck.php:971
1415
+ msgid "too simple"
1416
+ msgstr "demasiado simple"
1417
+
1418
+ #: controllers/SecurityCheck.php:976
1419
+ msgid "Good"
1420
+ msgstr "Bueno"
1421
+
1422
+ #: controllers/SecurityCheck.php:1023
1423
+ msgid ""
1424
+ "Change the wp-config.php file permission to Read-Only using File Manager."
1425
+ msgstr ""
1426
+ "Cambie el permiso del archivo wp-config.php a sólo lectura usando el "
1427
+ "Administrador de Archivos."
1428
+
1429
+ #: controllers/SecurityCheck.php:1265
1430
+ msgid "no"
1431
+ msgstr "no"
1432
+
1433
+ #: controllers/SecurityCheck.php:1417
1434
+ msgid "Just another WordPress site"
1435
+ msgstr "Otro sitio de AlmirallMed"
1436
+
1437
+ #: controllers/Settings.php:45
1438
+ #, php-format
1439
+ msgid ""
1440
+ "NGINX detected. In case you didn't add the code in the NGINX config already, "
1441
+ "please add the following line. %s"
1442
+ msgstr ""
1443
+ "NGINX detectado. En caso de que no haya añadido el código en la "
1444
+ "configuración del NGINX ya, por favor añada la siguiente línea. %s"
1445
+
1446
+ #: controllers/Settings.php:45 models/Rewrite.php:684
1447
+ msgid "Learn How To Add the Code"
1448
+ msgstr "Aprende a añadir el código"
1449
+
1450
+ #: controllers/Settings.php:45
1451
+ msgid "Don't forget to reload the Nginx service."
1452
+ msgstr "No olvides reiniciar el servicio de Nginx"
1453
+
1454
+ #: controllers/Settings.php:45
1455
+ msgid "Learn How"
1456
+ msgstr "Aprende cómo"
1457
+
1458
+ #: controllers/Settings.php:54 view/Backup.php:16
1459
+ msgid "Restore Settings"
1460
+ msgstr "Restaurar Configuración"
1461
+
1462
+ #: controllers/Settings.php:57
1463
+ msgid "You want to restore the last saved settings? "
1464
+ msgstr "¿Desea restaurar la última configuración guardada?"
1465
+
1466
+ #: controllers/Settings.php:75
1467
+ #, php-format
1468
+ msgid ""
1469
+ "%sLimited Time Offer%s: Get %s65%% OFF%s today on Hide My WP Ghost 5 "
1470
+ "Websites License. %sHurry Up!%s"
1471
+ msgstr ""
1472
+ "%s Oferta de tiempo limitado%s: Obtenga hoy %s65%% de descuento%s en la "
1473
+ "licencia de los sitios web de Hide My WP Ghost 5. %sHurry Up!%s"
1474
+
1475
+ #: controllers/Settings.php:122
1476
+ #, php-format
1477
+ msgid ""
1478
+ "New Plugin/Theme detected! You need to save the Hide My WP Setting again to "
1479
+ "include them all! %sClick here%s"
1480
+ msgstr ""
1481
+ "¡Nuevo plugin/tema detectado! ¡Necesitas guardar la configuración de Hide My "
1482
+ "WP de nuevo para incluirlos a todos! %s Haz clic aquí %s"
1483
+
1484
+ #: controllers/Settings.php:135
1485
+ #, php-format
1486
+ msgid ""
1487
+ "New Plugin/Theme detected! You need to save the Hide My WP Setting again to "
1488
+ "include them all! %sSave Settings%s"
1489
+ msgstr ""
1490
+ "¡Nuevo plugin/tema detectado! ¡Necesitas guardar la configuración de Hide My "
1491
+ "WP de nuevo para incluirlos a todos! %sGuardar ajustes%s"
1492
+
1493
+ #: controllers/Settings.php:151
1494
+ #, php-format
1495
+ msgid ""
1496
+ "To activate the new %sHide My WP %s %s settings you need to confirm and re-"
1497
+ "login!"
1498
+ msgstr ""
1499
+ "Para activar la nueva configuración de %sHide My WP %s %s necesitas "
1500
+ "confirmar y volver a iniciar sesión!"
1501
+
1502
+ #: controllers/Settings.php:159
1503
+ msgid "Yes, I'm ready to re-login"
1504
+ msgstr "Sí, estoy listo para volver a entrar"
1505
+
1506
+ #: controllers/Settings.php:166 view/FrontendCheck.php:36
1507
+ msgid "No, abort"
1508
+ msgstr "No, cancelar"
1509
+
1510
+ #: controllers/Settings.php:207
1511
+ msgid "My Account"
1512
+ msgstr "Mi cuenta"
1513
+
1514
+ #: controllers/Settings.php:336
1515
+ msgid ""
1516
+ "Error: You entered the same text twice in the Text Mapping. We removed the "
1517
+ "duplicates to prevent any redirect errors."
1518
+ msgstr ""
1519
+ "Error: Has introducido el mismo texto dos veces en el mapa de texto. "
1520
+ "Eliminamos los duplicados para evitar cualquier error de redireccionamiento."
1521
+
1522
+ #: controllers/Settings.php:479
1523
+ msgid ""
1524
+ "ERROR! Please make sure you use a valid token to connect the plugin with "
1525
+ "WPPlugins"
1526
+ msgstr ""
1527
+ "¡ERROR! Por favor, asegúrate de usar un token válido para conectar el plugin "
1528
+ "con WPPlugins"
1529
+
1530
+ #: controllers/Settings.php:484
1531
+ msgid ""
1532
+ "ERROR! Please make sure you use an email address to connect the plugin with "
1533
+ "WPPlugins"
1534
+ msgstr ""
1535
+ "¡ERROR! Por favor, asegúrate de usar una dirección de correo electrónico "
1536
+ "para conectar el plugin con WPPlugins"
1537
+
1538
+ #: controllers/Settings.php:533
1539
+ msgid "Great! The backup is restored."
1540
+ msgstr "La copia de seguridad se ha restaurado."
1541
+
1542
+ #: controllers/Settings.php:547 controllers/Settings.php:550
1543
+ msgid "Error! The backup is not valid."
1544
+ msgstr "¡Error! Copia de seguridad inválida."
1545
+
1546
+ #: controllers/Settings.php:553
1547
+ msgid "Error! You have to enter a previous saved backup file."
1548
+ msgstr ""
1549
+ "¡Error! Tiene que seleccionar una copia de seguridad guardada previamente."
1550
+
1551
+ #: controllers/Settings.php:566
1552
+ msgid "Hide My Wp > Question"
1553
+ msgstr "Hide My WP > Preguntas"
1554
+
1555
+ #: models/Brute.php:427
1556
+ #, php-format
1557
+ msgid "%sYou failed to correctly answer the math problem.%s Please try again"
1558
+ msgstr ""
1559
+ "%sNo respondiste correctamente al problema de matemáticas. %s Por favor, "
1560
+ "inténtalo de nuevo"
1561
+
1562
+ #: models/Brute.php:435
1563
+ #, php-format
1564
+ msgid ""
1565
+ "%sERROR:%s Email or Password is incorrect. %s %d attempts left before lockout"
1566
+ msgstr ""
1567
+ "%sERROR:%s El correo electrónico o la contraseña son incorrectos. %s %d "
1568
+ "intentos restantes antes del bloqueo"
1569
+
1570
+ #: models/Brute.php:459
1571
+ msgid "Prove your humanity: "
1572
+ msgstr "Responda a la pregunta:"
1573
+
1574
+ #: models/Brute.php:472
1575
+ msgid "Login Blocked by Hide My WordPress"
1576
+ msgstr "Inicio de sesión bloqueado por Ocultar mi WordPress"
1577
+
1578
+ #: models/Compatibility.php:211
1579
+ msgid ""
1580
+ "CDN Enabled detected. Please include the new wp-content and wp-includes "
1581
+ "paths in CDN Enabler Settings"
1582
+ msgstr ""
1583
+ "CDN Enabled detectado. Por favor, incluya en CDN Enabler Config las nuevas "
1584
+ "rutas de wp-content y wp-includes"
1585
+
1586
+ #: models/Compatibility.php:219
1587
+ #, php-format
1588
+ msgid ""
1589
+ "CDN Enabler detected! Learn how to configure it with Hide My WP %sClick here"
1590
+ "%s"
1591
+ msgstr ""
1592
+ "¡Habilitador CDN detectado! Aprende a configurarlo con Hide My WP %sClick "
1593
+ "here%s"
1594
+
1595
+ #: models/Compatibility.php:231
1596
+ #, php-format
1597
+ msgid ""
1598
+ "WP Super Cache CDN detected. Please include %s and %s paths in WP Super "
1599
+ "Cache > CDN > Include directories"
1600
+ msgstr ""
1601
+ "WP Super Cache CDN detectado. Por favor, incluye las rutas %s y %s en WP "
1602
+ "Super Cache > CDN > Incluir directorios"
1603
+
1604
+ #: models/Compatibility.php:238
1605
+ #, php-format
1606
+ msgid ""
1607
+ "Hide My WP does not work without mode_rewrite. Please activate the rewrite "
1608
+ "module in Apache. %sMore details%s"
1609
+ msgstr ""
1610
+ "Hide My WP no funciona sin mode_rewrite. Por favor, activa el módulo de "
1611
+ "reescritura en Apache. %sMás detalles%s"
1612
+
1613
+ #: models/Compatibility.php:243
1614
+ #, php-format
1615
+ msgid ""
1616
+ "Hide My WP does not work with %s Permalinks. Change it to %s or other type "
1617
+ "in Settings > Permalinks in order to hide it"
1618
+ msgstr ""
1619
+ "Hide My WP no funciona con %s Permalinks. Cámbialo a %s o a otro tipo en "
1620
+ "Configuración > Enlaces permanentes para ocultarlo"
1621
+
1622
+ #: models/Compatibility.php:243
1623
+ msgid "Plain"
1624
+ msgstr "Plano"
1625
+
1626
+ #: models/Compatibility.php:243
1627
+ msgid "Post Name"
1628
+ msgstr "Entrada"
1629
+
1630
+ #: models/Compatibility.php:248
1631
+ #, php-format
1632
+ msgid ""
1633
+ "You need to activate the URL Rewrite for IIS to be able to change the "
1634
+ "permalink structure to friendly URL (without index.php). %sMore details%s"
1635
+ msgstr ""
1636
+ "Es necesario activar URL Rewrite de IIS para poder cambiar la estructura de "
1637
+ "enlace permanente a URL amigables (sin index.php). %sMás detalles%s"
1638
+
1639
+ #: models/Compatibility.php:250
1640
+ msgid ""
1641
+ "You need to set the permalink structure to friendly URL (without index.php)."
1642
+ msgstr ""
1643
+ "Es necesario establecer la estructura de enlace permanente a URL amigables "
1644
+ "(sin index.php)."
1645
+
1646
+ #: models/Compatibility.php:255
1647
+ msgid ""
1648
+ "The constant ADMIN_COOKIE_PATH is defined in wp-config.php by another "
1649
+ "plugin. Hide My WP will not work unless you remove the line "
1650
+ "define('ADMIN_COOKIE_PATH', ...);"
1651
+ msgstr ""
1652
+ "La constante ADMIN_COOKIE_PATH está definida en wp-config.php por otro "
1653
+ "plugin. Hide My WP no funcionará a menos que elimine la línea "
1654
+ "define('ADMIN_COOKIE_PATH', ...);"
1655
+
1656
+ #: models/Compatibility.php:261
1657
+ #, php-format
1658
+ msgid ""
1659
+ "Inmotion detected. %sPlease read how to make the plugin compatible with "
1660
+ "Inmotion Nginx Cache%s"
1661
+ msgstr ""
1662
+ "Inmoción detectada. %sPor favor, lee cómo hacer el plugin compatible con "
1663
+ "Inmotion Nginx Cache%s"
1664
+
1665
+ #: models/Compatibility.php:273
1666
+ msgid ""
1667
+ "Hide My WP rules are not saved in the config file and this may affect the "
1668
+ "website loading speed."
1669
+ msgstr ""
1670
+ "Las reglas de Hide My WP no se guardan en el archivo de configuración y esto "
1671
+ "puede afectar a la velocidad de carga del sitio web."
1672
+
1673
+ #: models/Compatibility.php:283
1674
+ #, php-format
1675
+ msgid ""
1676
+ "Godaddy detected! To avoid CSS errors, make sure you switch off the CDN from "
1677
+ "%s"
1678
+ msgstr ""
1679
+ "¡Godaddy detectado! Para evitar errores de CSS, asegúrate de apagar el CDN "
1680
+ "de %s"
1681
+
1682
+ #: models/Rewrite.php:643
1683
+ #, php-format
1684
+ msgid ""
1685
+ "IIS detected. You need to update your %s file by adding the following lines "
1686
+ "after &lt;rules&gt; tag: %s"
1687
+ msgstr ""
1688
+ "IIS detectado. Necesitas actualizar tu archivo %s añadiendo las siguientes "
1689
+ "líneas después de la etiqueta %s"
1690
+
1691
+ #: models/Rewrite.php:664 models/Rewrite.php:732
1692
+ #, php-format
1693
+ msgid ""
1694
+ "Config file is not writable. You need to update your %s file by adding the "
1695
+ "following lines at the beginning of the file: %s"
1696
+ msgstr ""
1697
+ "El archivo de configuración no se puede escribir. Necesitas actualizar tu "
1698
+ "archivo %s añadiendo las siguientes líneas al principio del archivo: %s"
1699
+
1700
+ #: models/Rewrite.php:684
1701
+ #, php-format
1702
+ msgid ""
1703
+ "WpEngine detected. Add the redirects in the WpEngine Redirect rules panel %s"
1704
+ msgstr ""
1705
+ "Motor WpEngine detectado. Añade los redireccionamientos en el panel de "
1706
+ "reglas de WpEngine Redirect %s"
1707
+
1708
+ #: models/Rewrite.php:764
1709
+ #, php-format
1710
+ msgid ""
1711
+ "Config file is not writable. You have to added it manually at the beginning "
1712
+ "of the %s file: %s"
1713
+ msgstr ""
1714
+ "El archivo de configuración no se puede escribir. Tienes que añadirlo "
1715
+ "manualmente al principio del archivo %s: %s"
1716
+
1717
+ #: models/Rewrite.php:2034
1718
+ msgid ""
1719
+ "There has been a critical error on your website. Please check your site "
1720
+ "admin email inbox for instructions."
1721
+ msgstr ""
1722
+ "Ha habido un error crítico en su sitio web. Por favor, compruebe la bandeja "
1723
+ "de entrada del correo electrónico del administrador de su sitio para obtener "
1724
+ "instrucciones."
1725
+
1726
+ #: models/Rewrite.php:2036
1727
+ msgid "There has been a critical error on your website."
1728
+ msgstr "Ha habido un error crítico en su sitio web."
1729
+
1730
+ #: models/Settings.php:12
1731
+ msgid "Permalinks"
1732
+ msgstr "Permalinks"
1733
+
1734
+ #: models/Settings.php:13
1735
+ msgid "Change common paths"
1736
+ msgstr "Cambiar rutas comunes"
1737
+
1738
+ #: models/Settings.php:18
1739
+ msgid "Text and URL mapping"
1740
+ msgstr "Mapeo de texto y URL"
1741
+
1742
+ #: models/Settings.php:23
1743
+ msgid "Add WordPress Tweaks"
1744
+ msgstr "Agregar WordPress Tweaks"
1745
+
1746
+ #: models/Settings.php:27
1747
+ msgid "Brute Force"
1748
+ msgstr "Fuerza bruta"
1749
+
1750
+ #: models/Settings.php:28
1751
+ msgid "Add Login Protection"
1752
+ msgstr "Protección contra ataque por fuerza bruta"
1753
+
1754
+ #: models/Settings.php:33
1755
+ msgid "Website Events Log"
1756
+ msgstr "Registro de eventos del sitio web"
1757
+
1758
+ #: models/Settings.php:38
1759
+ msgid "Test Your Website"
1760
+ msgstr "Pruebe su sitio web"
1761
+
1762
+ #: models/Settings.php:43 view/Plugins.php:29
1763
+ msgid "Plugins"
1764
+ msgstr "Plugins"
1765
+
1766
+ #: models/Settings.php:49
1767
+ msgid "Save your settings"
1768
+ msgstr "Guardar tus ajustes"
1769
+
1770
+ #: models/Settings.php:67
1771
+ msgid "WP Super Cache"
1772
+ msgstr "WP Super cache"
1773
+
1774
+ #: models/Settings.php:69
1775
+ msgid ""
1776
+ "A very fast caching engine for WordPress that produces static html files. "
1777
+ "Works well with Minify HTML plugin."
1778
+ msgstr ""
1779
+ "Un motor de caché muy rápido para WordPress que produce archivos html "
1780
+ "estáticos. Funciona bien con el plugin Minify HTML."
1781
+
1782
+ #: models/Settings.php:74
1783
+ msgid "Autoptimize"
1784
+ msgstr "Autoptimizar"
1785
+
1786
+ #: models/Settings.php:76
1787
+ msgid ""
1788
+ "Autoptimize speeds up your website by optimizing JS, CSS and HTML, async-ing "
1789
+ "JavaScript, removing emoji cruft, optimizing Google Fonts and more."
1790
+ msgstr ""
1791
+ "Autoptimize acelera tu sitio web optimizando JS, CSS y HTML, sincronizando "
1792
+ "JavaScript, eliminando los emoji cruft, optimizando las fuentes de Google y "
1793
+ "más."
1794
+
1795
+ #: models/Settings.php:81
1796
+ msgid "Minify HTML"
1797
+ msgstr "Minify HTML"
1798
+
1799
+ #: models/Settings.php:83
1800
+ msgid ""
1801
+ "Minify HTML output for clean looking markup and faster downloading. Minify "
1802
+ "HTML also has optional specialized minification for JS and internal CSS."
1803
+ msgstr ""
1804
+ "Minimizar la salida HTML para un marcado de aspecto limpio y una descarga "
1805
+ "más rápida. Minify HTML también tiene una minificación especializada "
1806
+ "opcional para JS y CSS interno."
1807
+
1808
+ #: models/Settings.php:88
1809
+ msgid "iThemes Security"
1810
+ msgstr "iTemas Seguridad"
1811
+
1812
+ #: models/Settings.php:90
1813
+ msgid ""
1814
+ "iThemes Security gives you over 30+ ways to secure and protect your WP site. "
1815
+ "WP sites can be an easy target for attacks because of plugin "
1816
+ "vulnerabilities, weak passwords and obsolete software."
1817
+ msgstr ""
1818
+ "iThemes Security te ofrece más de 30 formas de asegurar y proteger tu sitio "
1819
+ "WP. Los sitios de WP pueden ser un blanco fácil para los ataques debido a "
1820
+ "las vulnerabilidades de los plugins, las contraseñas débiles y el software "
1821
+ "obsoleto."
1822
+
1823
+ #: models/Settings.php:95
1824
+ msgid "Sucuri Security"
1825
+ msgstr "Seguridad de Sucuri"
1826
+
1827
+ #: models/Settings.php:97
1828
+ msgid ""
1829
+ "The Sucuri WordPress Security plugin is a security toolset for security "
1830
+ "integrity monitoring, malware detection and security hardening."
1831
+ msgstr ""
1832
+ "El plugin de seguridad de Sucuri WordPress es un conjunto de herramientas de "
1833
+ "seguridad para el control de la integridad de la seguridad, la detección de "
1834
+ "malware y el endurecimiento de la seguridad."
1835
+
1836
+ #: models/Settings.php:102
1837
+ msgid "Back Up WordPress"
1838
+ msgstr "ej. adm, backend"
1839
+
1840
+ #: models/Settings.php:104
1841
+ msgid ""
1842
+ "Simple automated backups of your WordPress-powered website. Back Up "
1843
+ "WordPress will back up your entire site including your database and all your "
1844
+ "files on a schedule that suits you."
1845
+ msgstr ""
1846
+ "Simples copias de seguridad automatizadas de tu sitio web potenciado por "
1847
+ "WordPress. Copia de seguridad WordPress hará una copia de seguridad de todo "
1848
+ "tu sitio, incluyendo tu base de datos y todos tus archivos en un horario que "
1849
+ "te convenga."
1850
+
1851
+ #: models/Settings.php:109
1852
+ msgid "SEO SQUIRRLY"
1853
+ msgstr "SEO SQUIRRLY"
1854
+
1855
+ #: models/Settings.php:111
1856
+ msgid ""
1857
+ "Welcome to Assisted WordPress SEO. Say Good-Bye to Search Engine "
1858
+ "Frustrations. Squirrly assists you in getting Excellent SEO for Humans and "
1859
+ "Search Engines."
1860
+ msgstr ""
1861
+ "Bienvenido a Assisted WordPress SEO. Despídase de las frustraciones de los "
1862
+ "motores de búsqueda. Squirrly te ayuda a conseguir un excelente SEO para "
1863
+ "humanos y motores de búsqueda."
1864
+
1865
+ #: models/Settings.php:116
1866
+ msgid "Elementor Page Builder"
1867
+ msgstr "Elementor Page Builder"
1868
+
1869
+ #: models/Settings.php:118
1870
+ msgid ""
1871
+ "The most advanced frontend drag & drop page builder. Create high-end, pixel "
1872
+ "perfect websites at record speeds. Any theme, any page, any design."
1873
+ msgstr ""
1874
+ "El creador de páginas de arrastrar y soltar más avanzado de frontend. Cree "
1875
+ "sitios web de alta gama y píxeles perfectos a velocidades récord. Cualquier "
1876
+ "tema, cualquier página, cualquier diseño."
1877
+
1878
+ #: models/Settings.php:123
1879
+ msgid "Weglot Translate"
1880
+ msgstr "Weglot Traducir"
1881
+
1882
+ #: models/Settings.php:125
1883
+ msgid ""
1884
+ "Translate your website into multiple languages without any code. Weglot "
1885
+ "Translate is fully SEO compatible and follows Google's best practices."
1886
+ msgstr ""
1887
+ "Traduce tu sitio web a varios idiomas sin ningún código. Weglot Translate es "
1888
+ "totalmente compatible con el SEO y sigue las mejores prácticas de Google."
1889
+
1890
+ #: models/Settings.php:130
1891
+ msgid "AddToAny Share Btn"
1892
+ msgstr "AddToAny Share Btn"
1893
+
1894
+ #: models/Settings.php:132
1895
+ msgid ""
1896
+ "Share buttons for WordPress including the AddToAny sharing button, Facebook, "
1897
+ "Twitter, Google+, Pinterest, WhatsApp, many more, and follow icons too."
1898
+ msgstr ""
1899
+ "Botones de compartir para WordPress, incluyendo el botón de compartir "
1900
+ "AddToAny, Facebook, Twitter, Google+, Pinterest, WhatsApp, muchos más, y "
1901
+ "también iconos de seguimiento."
1902
+
1903
+ #: models/Settings.php:146
1904
+ msgid ""
1905
+ "You can't set both ADMIN and LOGIN with the same name. Please use different "
1906
+ "names"
1907
+ msgstr ""
1908
+ "No se pueden definir ADMIN y LOGIN con el mismo nombre. Utilice diferentes "
1909
+ "nombres"
1910
+
1911
+ #: models/Settings.php:295
1912
+ #, php-format
1913
+ msgid ""
1914
+ "Short name detected: %s. You need to use unique paths with more than 4 chars "
1915
+ "to avoid WordPress errors."
1916
+ msgstr ""
1917
+ "Nombre corto detectado: %s. Necesitas usar rutas únicas con más de 4 "
1918
+ "caracteres para evitar errores de WordPress."
1919
+
1920
+ #: models/Settings.php:300
1921
+ #, php-format
1922
+ msgid ""
1923
+ "Invalid name detected: %s. You need to use another name to avoid WordPress "
1924
+ "errors."
1925
+ msgstr ""
1926
+ "Nombre inválido detectado: %s. Necesitas usar otro nombre para evitar "
1927
+ "errores de WordPress."
1928
+
1929
+ #: models/Settings.php:305
1930
+ #, php-format
1931
+ msgid ""
1932
+ "Invalid name detected: %s. Add only the final path name to avoid WordPress "
1933
+ "errors."
1934
+ msgstr ""
1935
+ "Nombre inválido detectado: %s. Añade sólo el nombre de la ruta final para "
1936
+ "evitar errores de WordPress."
1937
+
1938
+ #: models/Settings.php:309
1939
+ #, php-format
1940
+ msgid ""
1941
+ "Invalid name detected: %s. The name can't start with / to avoid WordPress "
1942
+ "errors."
1943
+ msgstr ""
1944
+ "Nombre inválido detectado: %s. El nombre no puede comenzar con / para evitar "
1945
+ "errores de WordPress."
1946
+
1947
+ #: models/Settings.php:316
1948
+ #, php-format
1949
+ msgid ""
1950
+ "Invalid name detected: %s. The paths can't end with . to avoid WordPress "
1951
+ "errors."
1952
+ msgstr ""
1953
+ "Nombre inválido detectado: %s. Los caminos no pueden terminar con . para "
1954
+ "evitar errores de WordPress."
1955
+
1956
+ #: models/Settings.php:343
1957
+ #, php-format
1958
+ msgid ""
1959
+ "Weak name detected: %s. You need to use another name to increase your "
1960
+ "website security."
1961
+ msgstr ""
1962
+ "Nombre débil detectado: %s. Necesitas usar otro nombre para aumentar la "
1963
+ "seguridad de tu sitio web."
1964
+
1965
+ #: view/Advanced.php:11
1966
+ msgid "Redirect Settings"
1967
+ msgstr "Ajustes de Redireccionamiento"
1968
+
1969
+ #: view/Advanced.php:15
1970
+ msgid "Redirect hidden paths"
1971
+ msgstr "Redirigir los caminos ocultos"
1972
+
1973
+ #: view/Advanced.php:19
1974
+ msgid "Front page"
1975
+ msgstr "Página Principal"
1976
+
1977
+ #: view/Advanced.php:20
1978
+ msgid "404 page"
1979
+ msgstr "Página 404"
1980
+
1981
+ #: view/Advanced.php:32
1982
+ msgid ""
1983
+ "Redirect the protected paths /wp-admin, /wp-login to Front Page or 404 page."
1984
+ msgstr ""
1985
+ "Redirige las rutas protegidas /wp-admin, /wp-login a Front Page o 404 page."
1986
+
1987
+ #: view/Advanced.php:33
1988
+ msgid ""
1989
+ "You can create a new page and come back to choose to redirect to that page"
1990
+ msgstr ""
1991
+ "Puedes crear una nueva página y volver a elegir para redirigirte a esa página"
1992
+
1993
+ #: view/Advanced.php:39
1994
+ msgid "Custom Safe URL Param"
1995
+ msgstr "Parámetro de URL seguro personalizado"
1996
+
1997
+ #: view/Advanced.php:40
1998
+ msgid "eg. disable_url, safe_url"
1999
+ msgstr "por ejemplo, deshabilitar_url, seguro_url"
2000
+
2001
+ #: view/Advanced.php:46
2002
+ msgid ""
2003
+ "The Safe URL will set all the settings to default. Use it only if you're "
2004
+ "locked out"
2005
+ msgstr ""
2006
+ "La URL segura establecerá todos los ajustes como predeterminados. Utilízala "
2007
+ "sólo si estás bloqueado"
2008
+
2009
+ #: view/Advanced.php:47
2010
+ msgid "Safe URL:"
2011
+ msgstr "URL segura:"
2012
+
2013
+ #: view/Advanced.php:53
2014
+ msgid "Compatibility Settings"
2015
+ msgstr "Configuración"
2016
+
2017
+ #: view/Advanced.php:61
2018
+ msgid "Fix Relative URLs"
2019
+ msgstr "Arreglar las URLs relativas"
2020
+
2021
+ #: view/Advanced.php:63
2022
+ #, php-format
2023
+ msgid "Convert links like /wp-content/* into %s/wp-content/*."
2024
+ msgstr "Convierte los enlaces como /wp-content/* en %s/wp-content/*."
2025
+
2026
+ #: view/Advanced.php:73
2027
+ msgid "Fix Sitemaps XML"
2028
+ msgstr "Arreglar los Sitemaps XML"
2029
+
2030
+ #: view/Advanced.php:75
2031
+ msgid "Double check the Sitemap XML files and make sure the paths are changed."
2032
+ msgstr ""
2033
+ "Compruebe los archivos XML de Sitemap y asegúrese de que las rutas han sido "
2034
+ "cambiadas."
2035
+
2036
+ #: view/Advanced.php:85
2037
+ msgid "Fix Robots.txt"
2038
+ msgstr "Fix Robots.txt"
2039
+
2040
+ #: view/Advanced.php:87
2041
+ msgid "Hide WordPress paths from robots.txt file"
2042
+ msgstr "Ocultar las rutas de WordPress del archivo robots.txt"
2043
+
2044
+ #: view/Advanced.php:97
2045
+ msgid "Late Loading"
2046
+ msgstr "Carga Tardía"
2047
+
2048
+ #: view/Advanced.php:99
2049
+ msgid ""
2050
+ "Load HMW after all plugins are loaded. Useful for CDN plugins (eg. CDN "
2051
+ "Enabler)."
2052
+ msgstr ""
2053
+ "Cargar HMW después de que todos los plugins estén cargados. Es útil para los "
2054
+ "plugins CDN (por ejemplo, CDN Enabler)."
2055
+
2056
+ #: view/Advanced.php:100
2057
+ msgid "(only if other cache plugins request this)"
2058
+ msgstr "(sólo si otros plugins de cache lo requieren)"
2059
+
2060
+ #: view/Advanced.php:110
2061
+ msgid "Clean Login Page"
2062
+ msgstr "Página Principal"
2063
+
2064
+ #: view/Advanced.php:112
2065
+ msgid ""
2066
+ "Cancel the login hooks from other plugins and themes to prevent them from "
2067
+ "changing the Hide My WordPress redirects."
2068
+ msgstr ""
2069
+ "Cancelar los ganchos de inicio de sesión de otros plugins y temas para "
2070
+ "evitar que cambien las redirecciones de Hide My WordPress."
2071
+
2072
+ #: view/Advanced.php:112
2073
+ msgid "(not recommended)"
2074
+ msgstr "(no recomendado)"
2075
+
2076
+ #: view/Advanced.php:121
2077
+ msgid "Cache Settings"
2078
+ msgstr "Configuración de caché"
2079
+
2080
+ #: view/Advanced.php:129
2081
+ msgid "Security Check Notification"
2082
+ msgstr "Notificación por correo"
2083
+
2084
+ #: view/Advanced.php:131
2085
+ msgid "Show Security Check notification when it's not checked every week."
2086
+ msgstr ""
2087
+ "Mostrar la notificación de comprobación de seguridad cuando no se comprueba "
2088
+ "cada semana."
2089
+
2090
+ #: view/Advanced.php:147
2091
+ msgid "Optimize CSS and JS files"
2092
+ msgstr "Optimizar los archivos CSS y JS"
2093
+
2094
+ #: view/Advanced.php:148
2095
+ msgid "Cache CSS, JS and Images to increase the frontend loading speed."
2096
+ msgstr ""
2097
+ "Cachear CSS, JS e imágenes para aumentar la velocidad de carga del frontend."
2098
+
2099
+ #: view/Advanced.php:149
2100
+ #, php-format
2101
+ msgid "Check the website loading speed with %sPingdom Tool%s"
2102
+ msgstr "Compruebe la velocidad de carga de la página web con %sPingdom Tool%s"
2103
+
2104
+ #: view/Advanced.php:157
2105
+ msgid "Notification Settings"
2106
+ msgstr "Configuración de las notificaciones"
2107
+
2108
+ #: view/Advanced.php:165
2109
+ msgid "Email notification"
2110
+ msgstr "Notificación por correo"
2111
+
2112
+ #: view/Advanced.php:166
2113
+ msgid "Send me an email with the changed admin and login URLs"
2114
+ msgstr "Mándame un e-mail con las nuevas URLs de ADMIN y LOGIN"
2115
+
2116
+ #: view/Advanced.php:175 view/Connect.php:17
2117
+ msgid "Email Address"
2118
+ msgstr "Dirección de correo electrónico"
2119
+
2120
+ #: view/Advanced.php:191 view/Brute.php:115 view/Mapping.php:210
2121
+ #: view/Mapping.php:215 view/Permalinks.php:530 view/Permalinks.php:535
2122
+ #: view/Tweaks.php:162
2123
+ msgid "Save"
2124
+ msgstr "Guardar"
2125
+
2126
+ #: view/Advanced.php:192 view/Brute.php:116 view/Mapping.php:211
2127
+ #: view/Mapping.php:216 view/Permalinks.php:531 view/Permalinks.php:536
2128
+ #: view/Tweaks.php:163
2129
+ #, php-format
2130
+ msgid "Love Hide My WP %s? Show us ;)"
2131
+ msgstr "Ama Hide My WP %s? Muéstranos ;)"
2132
+
2133
+ #: view/Advanced.php:199 view/Mapping.php:243 view/Permalinks.php:563
2134
+ #: view/Tweaks.php:192
2135
+ msgid "Love Hide My WP?"
2136
+ msgstr "Ama Hide My WP?"
2137
+
2138
+ #: view/Advanced.php:204 view/Permalinks.php:568 view/Tweaks.php:197
2139
+ msgid "Please help us and support our plugin on WordPress.org"
2140
+ msgstr "Por favor, ayúdanos y apoya nuestro plugin en WordPress.org"
2141
+
2142
+ #: view/Advanced.php:207 view/Mapping.php:249 view/Permalinks.php:571
2143
+ #: view/Tweaks.php:200
2144
+ msgid "Rate Hide My WP"
2145
+ msgstr "Calificar Hide My WP"
2146
+
2147
+ #: view/Advanced.php:210 view/Permalinks.php:574 view/Tweaks.php:203
2148
+ msgid "Contact us after you left the review cause we have a surprise for you."
2149
+ msgstr ""
2150
+ "Contáctanos después de dejar la revista porque tenemos una sorpresa para ti."
2151
+
2152
+ #: view/Advanced.php:221 view/Mapping.php:224 view/Permalinks.php:544
2153
+ #: view/Tweaks.php:173
2154
+ msgid "Check Your Website"
2155
+ msgstr "Revise su sitio web"
2156
+
2157
+ #: view/Advanced.php:223 view/Mapping.php:226 view/Permalinks.php:546
2158
+ #: view/Tweaks.php:175
2159
+ msgid "Check if your website is secured with the current settings."
2160
+ msgstr "Compruebe si su sitio web está protegido con la configuración actual."
2161
+
2162
+ #: view/Advanced.php:229 view/Mapping.php:232 view/Permalinks.php:552
2163
+ #: view/Tweaks.php:181
2164
+ msgid ""
2165
+ "Make sure you save the settings and empty the cache before checking your "
2166
+ "website with our tool."
2167
+ msgstr ""
2168
+ "Asegúrese de guardar la configuración y vaciar la caché antes de revisar su "
2169
+ "sitio web con nuestra herramienta."
2170
+
2171
+ #: view/Advanced.php:233 view/Mapping.php:236 view/Permalinks.php:556
2172
+ #: view/Tweaks.php:185
2173
+ msgid "Learn more about Hide My WP"
2174
+ msgstr "Conozca más detalles acerca de Hide My WP"
2175
+
2176
+ #: view/Backup.php:7
2177
+ msgid "Backup/Restore Settings"
2178
+ msgstr "Respalda/Configurar Restauración"
2179
+
2180
+ #: view/Backup.php:9
2181
+ msgid ""
2182
+ "Click Backup and the download will start automatically. You can use the "
2183
+ "Backup for all your websites."
2184
+ msgstr ""
2185
+ "Haz clic en Copia de seguridad y la descarga comenzará automáticamente. "
2186
+ "Puedes usar la copia de seguridad para todos tus sitios web."
2187
+
2188
+ #: view/Backup.php:15 view/Backup.php:55
2189
+ msgid "Backup Settings"
2190
+ msgstr "Descargar Configuración"
2191
+
2192
+ #: view/Backup.php:26
2193
+ msgid "Hide My Wp Restore"
2194
+ msgstr "Restaurar Hide My WP"
2195
+
2196
+ #: view/Backup.php:32
2197
+ msgid "Upload the file with the saved Hide My Wp Settings"
2198
+ msgstr "Suba el archivo con la opciones de configuración de su Hide My WP"
2199
+
2200
+ #: view/Backup.php:40
2201
+ msgid "Restore Backup"
2202
+ msgstr "Restaurar Backup"
2203
+
2204
+ #: view/Backup.php:56
2205
+ msgid ""
2206
+ "It's important to <strong>save your settings every time you change them</"
2207
+ "strong>. You can use the backup to configure other websites you own."
2208
+ msgstr ""
2209
+ "Es importante que guardes <strong>tus ajustes cada vez que</strong> los "
2210
+ "cambies. Puedes usar la copia de seguridad para configurar otros sitios web "
2211
+ "de tu propiedad."
2212
+
2213
+ #: view/Brute.php:15
2214
+ msgid "Use Brute Force Protection"
2215
+ msgstr "Seguridad contra ataque por fuerza bruta"
2216
+
2217
+ #: view/Brute.php:17
2218
+ msgid "Protects your website against brute force login attacks"
2219
+ msgstr "Protege tu web contra ataques de fuerza bruta en la página de login"
2220
+
2221
+ #: view/Brute.php:28
2222
+ msgid "Math Check protection"
2223
+ msgstr "Protección de Verificación Matemática"
2224
+
2225
+ #: view/Brute.php:53
2226
+ msgid "Max fail attempts"
2227
+ msgstr "Nº Máximo de intentos fallidos"
2228
+
2229
+ #: view/Brute.php:54
2230
+ msgid "Block IP on login page"
2231
+ msgstr "Bloquear/desbloquear manualmente direcciones IP"
2232
+
2233
+ #: view/Brute.php:62
2234
+ msgid "Ban duration"
2235
+ msgstr "Duración del bloqueo (segundos)"
2236
+
2237
+ #: view/Brute.php:63
2238
+ msgid "No. of seconds"
2239
+ msgstr "No. de segundos"
2240
+
2241
+ #: view/Brute.php:71
2242
+ msgid "Lockout Message"
2243
+ msgstr "Mensaje de bloqueo"
2244
+
2245
+ #: view/Brute.php:72
2246
+ msgid "Show message instead of login form"
2247
+ msgstr "Mostrar mensaje en lugar de formulario de acceso"
2248
+
2249
+ #: view/Brute.php:86
2250
+ msgid "Whitelist IPs"
2251
+ msgstr "Lista blanca de IPs"
2252
+
2253
+ #: view/Brute.php:87
2254
+ #, php-format
2255
+ msgid ""
2256
+ "You can white-list a single IP like 192.168.0.1 or a range of 245 IPs like "
2257
+ "192.168.0.*. Find your IP with %s"
2258
+ msgstr ""
2259
+ "Puede incluir en la lista blanca una sola IP 192.168.0.1 o un rango de 245 "
2260
+ "IPs como 192.168.0.*. Conozca su IP en %s"
2261
+
2262
+ #: view/Brute.php:100
2263
+ msgid "Ban IPs"
2264
+ msgstr "Duración del bloqueo (segundos)"
2265
+
2266
+ #: view/Brute.php:101
2267
+ msgid ""
2268
+ "You can ban a single IP like 192.168.0.1 or a range of 245 IPs like "
2269
+ "192.168.0.*. These IPs will not be able to access the login page."
2270
+ msgstr ""
2271
+ "Puedes prohibir una sola IP como 192.168.0.1 o un rango de 245 IPs como "
2272
+ "192.168.0.*. Estas IPs no podrán acceder a la página de inicio de sesión."
2273
+
2274
+ #: view/Brute.php:122
2275
+ msgid "Blocked IPs"
2276
+ msgstr "IPs bloqueadas"
2277
+
2278
+ #: view/Brute.php:128
2279
+ msgid "Unlock all"
2280
+ msgstr "Vaciar IPs"
2281
+
2282
+ #: view/Brute.php:139
2283
+ msgid "Brute Force Login Protection"
2284
+ msgstr "Protección contra ataque por fuerza bruta"
2285
+
2286
+ #: view/Brute.php:140
2287
+ msgid ""
2288
+ "Protects your website against brute force login attacks using Hide My "
2289
+ "WordPress <br /><br /> A common threat web developers face is a password-"
2290
+ "guessing attack known as a brute force attack. A brute-force attack is an "
2291
+ "attempt to discover a password by systematically trying every possible "
2292
+ "combination of letters, numbers, and symbols until you discover the one "
2293
+ "correct combination that works. "
2294
+ msgstr ""
2295
+ "Protege su sitio web contra los ataques de inicio de sesión por fuerza bruta "
2296
+ "usando Hide My WordPress <br /><br />Una amenaza común a la que se enfrentan "
2297
+ "los desarrolladores web es un ataque de adivinación de contraseñas conocido "
2298
+ "como ataque por fuerza bruta. Un ataque de fuerza bruta es un intento de "
2299
+ "descubrir una contraseña probando sistemáticamente todas las combinaciones "
2300
+ "posibles de letras, números y símbolos hasta que se descubre la única "
2301
+ "combinación correcta que funciona "
2302
+
2303
+ #: view/Brute.php:146 view/Log.php:78
2304
+ msgid "Features"
2305
+ msgstr "Características"
2306
+
2307
+ #: view/Brute.php:148
2308
+ msgid "Limit the number of allowed login attempts using normal login form"
2309
+ msgstr ""
2310
+ "Limitar el número de intentos permitidos de login utilizando el formulario "
2311
+ "de inicio de sesión habitual"
2312
+
2313
+ #: view/Brute.php:149
2314
+ msgid "Math problem verification while logging in"
2315
+ msgstr "Verificación de problemas matemáticos al iniciar la sesión"
2316
+
2317
+ #: view/Brute.php:150
2318
+ msgid "Manually block/unblock IP addresses"
2319
+ msgstr "Bloquear/desbloquear manualmente direcciones IP"
2320
+
2321
+ #: view/Brute.php:151
2322
+ msgid "Manually whitelist trusted IP addresses"
2323
+ msgstr "Manualmente incluir en la lista blanca direcciones IP de confianza"
2324
+
2325
+ #: view/Brute.php:152
2326
+ msgid "Option to inform user about remaining attempts on login page"
2327
+ msgstr ""
2328
+ "Posibilidad de informar al usuario sobre los intentos restantes de login"
2329
+
2330
+ #: view/Brute.php:153
2331
+ msgid "Custom message to show to blocked users"
2332
+ msgstr "Mensaje personalizado a mostrar a los usuarios bloqueados"
2333
+
2334
+ #: view/Connect.php:12
2335
+ msgid "Activate Free version"
2336
+ msgstr "Activar la versión gratuita"
2337
+
2338
+ #: view/Connect.php:18
2339
+ msgid "Enter your email address to get security alerts and How To Lessons"
2340
+ msgstr ""
2341
+ "Ingrese su dirección de correo electrónico para obtener alertas de seguridad "
2342
+ "y lecciones de cómo hacerlo"
2343
+
2344
+ #: view/Connect.php:37
2345
+ msgid "Monitor my website, send me security alerts and vulnerability reports"
2346
+ msgstr ""
2347
+ "Supervisa mi sitio web, envíame alertas de seguridad e informes de "
2348
+ "vulnerabilidad"
2349
+
2350
+ #: view/Connect.php:47
2351
+ msgid "I want to receive How To lessons for Hide My WP Ghost by email"
2352
+ msgstr ""
2353
+ "Quiero recibir las lecciones de \"Cómo hacer para esconder mi fantasma WP\" "
2354
+ "por correo electrónico"
2355
+
2356
+ #: view/Connect.php:58
2357
+ msgid "Activate"
2358
+ msgstr "Activar"
2359
+
2360
+ #: view/Connect.php:64
2361
+ msgid "Skip Activation"
2362
+ msgstr "Saltar la activación"
2363
+
2364
+ #: view/Connect.php:73
2365
+ msgid "Activate Hide My WP"
2366
+ msgstr "Conozca más detalles acerca de Hide My WP"
2367
+
2368
+ #: view/Connect.php:75
2369
+ #, php-format
2370
+ msgid ""
2371
+ "By activating the Free version of Hide My WP you agree with our %sTerms of "
2372
+ "Use%s and %sPrivacy Policy%s"
2373
+ msgstr ""
2374
+ "Al activar la versión gratuita de Hide My WP usted está de acuerdo con "
2375
+ "nuestras %sTérminos de Uso%s y %sPolíticas de Privacidad%s"
2376
+
2377
+ #: view/Connect.php:78
2378
+ msgid ""
2379
+ "Note! If you add your email you will receive a free token which will "
2380
+ "activate the plugin."
2381
+ msgstr ""
2382
+ "¡Anótese! Si añades tu correo electrónico, recibirás un vale gratuito que "
2383
+ "activará el plugin."
2384
+
2385
+ #: view/Connect.php:81
2386
+ #, php-format
2387
+ msgid ""
2388
+ "If you bought Hide My WP Ghost please remove this plugin and install the one "
2389
+ "from %sYour Account%s"
2390
+ msgstr ""
2391
+ "Si usted compró Hide My WP Ghost por favor retire este plugin e instale el "
2392
+ "de %sYour Account%s"
2393
+
2394
+ #: view/Dashboard.php:18
2395
+ msgid "Security Level"
2396
+ msgstr "Nivel de seguridad"
2397
+
2398
+ #: view/Dashboard.php:23 view/SecurityCheck.php:22
2399
+ #, php-format
2400
+ msgid ""
2401
+ "Your website security %sis extremely weak%s. %sMany hacking doors are "
2402
+ "available."
2403
+ msgstr ""
2404
+ "La seguridad de su sitio web %s es extremadamente débil%s. %sMuchas puertas "
2405
+ "de hacking están disponibles."
2406
+
2407
+ #: view/Dashboard.php:26 view/SecurityCheck.php:25
2408
+ #, php-format
2409
+ msgid ""
2410
+ "Your website security %sis very weak%s. %sMany hacking doors are available."
2411
+ msgstr ""
2412
+ "La seguridad de su sitio web %ses muy débil%s. %sMuchas puertas de hacking "
2413
+ "están disponibles."
2414
+
2415
+ #: view/Dashboard.php:29 view/SecurityCheck.php:28
2416
+ #, php-format
2417
+ msgid ""
2418
+ "Your website security is still weak. %sSome of the main hacking doors are "
2419
+ "still available."
2420
+ msgstr ""
2421
+ "La seguridad de su sitio web %ses todavía débil. Algunas de las principales "
2422
+ "puertas de hacking todavía están disponibles."
2423
+
2424
+ #: view/Dashboard.php:32 view/SecurityCheck.php:31
2425
+ #, php-format
2426
+ msgid ""
2427
+ "Your website security is strong. %sKeep checking the security every week."
2428
+ msgstr ""
2429
+ "La seguridad de su sitio web es fuerte. %sSigue revisando la seguridad cada "
2430
+ "semana."
2431
+
2432
+ #: view/Dashboard.php:37
2433
+ msgid "Urgent Security Actions Required"
2434
+ msgstr "Se requieren medidas de seguridad urgentes"
2435
+
2436
+ #: view/Dashboard.php:45
2437
+ msgid "Check All The Security Tasks"
2438
+ msgstr "Revisa todas las tareas de seguridad"
2439
+
2440
+ #: view/Dashboard.php:47
2441
+ msgid "Upgrade Your Security"
2442
+ msgstr "Actualice su seguridad"
2443
+
2444
+ #: view/Dashboard.php:55
2445
+ msgid "Recheck Security"
2446
+ msgstr "Vuelva a comprobar la seguridad"
2447
+
2448
+ #: view/Dashboard.php:107
2449
+ msgid "Checking Website Security ..."
2450
+ msgstr "Comprobando la seguridad del sitio web..."
2451
+
2452
+ #: view/FrontendCheck.php:7
2453
+ msgid "Next Steps"
2454
+ msgstr "Siguientes pasos"
2455
+
2456
+ #: view/FrontendCheck.php:9
2457
+ msgid "Frontend Login Test"
2458
+ msgstr "ej. login o registrar"
2459
+
2460
+ #: view/FrontendCheck.php:13
2461
+ #, php-format
2462
+ msgid "Run %sFrontend Login Test%s and login inside the pupop. "
2463
+ msgstr "Ejecute %sFrontend Login Test%s e inicie sesión dentro de la pupila"
2464
+
2465
+ #: view/FrontendCheck.php:14
2466
+ msgid "If you're able to login, you've set the new paths correctly."
2467
+ msgstr "Si puedes entrar, has establecido correctamente las nuevas rutas."
2468
+
2469
+ #: view/FrontendCheck.php:15
2470
+ msgid ""
2471
+ "If the Login Page displays any error, please make sure you follow the Hide "
2472
+ "My WP Ghost instructions before moving forward."
2473
+ msgstr ""
2474
+ "Si la página de inicio de sesión muestra algún error, por favor, asegúrese "
2475
+ "de seguir las instrucciones de Ocultar mi fantasma WP antes de seguir "
2476
+ "adelante."
2477
+
2478
+ #: view/FrontendCheck.php:16
2479
+ msgid ""
2480
+ "Do not log out from this browser until you are confident that the Frontend "
2481
+ "is working and you will be able to log in again."
2482
+ msgstr ""
2483
+ "No cierre la sesión de este navegador hasta que esté seguro de que el "
2484
+ "Frontend funciona y pueda volver a entrar."
2485
+
2486
+ #: view/FrontendCheck.php:17
2487
+ #, php-format
2488
+ msgid ""
2489
+ "If you can't configure Hide My WP Ghost, switch to Default mode and "
2490
+ "%scontact us%s."
2491
+ msgstr ""
2492
+ "Si no puedes configurar Hide My WP Ghost, cambia al modo por defecto y "
2493
+ "%scontacta con nosotros%s."
2494
+
2495
+ #: view/FrontendCheck.php:21
2496
+ #, php-format
2497
+ msgid "%sWARNING:%s Use the custom login URL to login to admin."
2498
+ msgstr ""
2499
+ "%sAttention!%sUsa la URL de inicio de sesión personalizada para acceder a la "
2500
+ "administración."
2501
+
2502
+ #: view/FrontendCheck.php:22
2503
+ #, php-format
2504
+ msgid ""
2505
+ "Your login URL will be: %s In case you can't re-login, use the safe URL: %s"
2506
+ msgstr ""
2507
+ "Tu URL de acceso será: %sEn caso de que no puedas volver a iniciar sesión, "
2508
+ "usa la URL segura: %s"
2509
+
2510
+ #: view/FrontendCheck.php:29
2511
+ msgid "Yes, it's working"
2512
+ msgstr "Sí, está funcionando"
2513
+
2514
+ #: view/FrontendCheck.php:44
2515
+ msgid "Frontend login Test"
2516
+ msgstr "ej. login o registrar"
2517
+
2518
+ #: view/Log.php:10
2519
+ msgid "Events Settings"
2520
+ msgstr "Ajustes de eventos"
2521
+
2522
+ #: view/Log.php:23
2523
+ msgid "Log Users Events"
2524
+ msgstr "Mensaje personalizado a mostrar a los usuarios bloqueados"
2525
+
2526
+ #: view/Log.php:24
2527
+ msgid "Track and Log events that happens on your WordPress site!"
2528
+ msgstr "Rastrea y registra los eventos que ocurren en tu sitio de WordPress"
2529
+
2530
+ #: view/Log.php:37
2531
+ msgid "Log Brute Force Attempts"
2532
+ msgstr "Registro de intentos de fuerza bruta"
2533
+
2534
+ #: view/Log.php:38
2535
+ msgid "Track and Log brute force attempts"
2536
+ msgstr "Rastrear y registrar los intentos de fuerza bruta"
2537
+
2538
+ #: view/Log.php:46
2539
+ msgid "Log Use Roles"
2540
+ msgstr "Roles de uso de roles"
2541
+
2542
+ #: view/Log.php:47
2543
+ msgid "Hold Control key to select multiple user roles"
2544
+ msgstr ""
2545
+ "Mantenga pulsada la tecla Control para seleccionar varios roles de usuario"
2546
+
2547
+ #: view/Log.php:48
2548
+ msgid "Don't select any role if you want to log all user roles"
2549
+ msgstr ""
2550
+ "No seleccione ningún rol si quiere registrar todos los roles de usuario"
2551
+
2552
+ #: view/Log.php:71
2553
+ msgid "Monitor everything that happens on your WordPress site!"
2554
+ msgstr "Monitorea todo lo que pasa en tu sitio de WordPress!"
2555
+
2556
+ #: view/Log.php:72
2557
+ msgid ""
2558
+ "It's safe to know what happened on your website at any time, in admin and on "
2559
+ "frontend."
2560
+ msgstr ""
2561
+ "Es seguro saber lo que pasó en su sitio web en cualquier momento, en la "
2562
+ "administración y en el frontend."
2563
+
2564
+ #: view/Log.php:73
2565
+ msgid ""
2566
+ "All the logs are saved on our Cloud Servers and your data is safe in case "
2567
+ "you reinstall the plugin"
2568
+ msgstr ""
2569
+ "Todos los registros se guardan en nuestros servidores de nubes y sus datos "
2570
+ "están seguros en caso de reinstalar el plugin"
2571
+
2572
+ #: view/Log.php:80
2573
+ msgid "Monitor, track and log events on your website"
2574
+ msgstr "Monitorear, rastrear y registrar los eventos en su sitio web"
2575
+
2576
+ #: view/Log.php:81
2577
+ msgid "Know what the other users are doing on your website and when"
2578
+ msgstr ""
2579
+ "Saber lo que los otros usuarios están haciendo en su sitio web y cuando"
2580
+
2581
+ #: view/Log.php:82
2582
+ msgid "You can set to receive email with alerts for one or more actions"
2583
+ msgstr ""
2584
+ "Puedes configurar para recibir correo electrónico con alertas de una o más "
2585
+ "acciones"
2586
+
2587
+ #: view/Log.php:83
2588
+ msgid "Filter events and users"
2589
+ msgstr "Mensaje personalizado a mostrar a los usuarios bloqueados"
2590
+
2591
+ #: view/Log.php:84
2592
+ msgid "Compatible with all themes and plugins"
2593
+ msgstr "Compatible con todos los temas y plugins"
2594
+
2595
+ #: view/Mapping.php:12
2596
+ msgid "Text Mapping"
2597
+ msgstr "Mapeo de texto"
2598
+
2599
+ #: view/Mapping.php:19 view/Mapping.php:95 view/Mapping.php:168
2600
+ msgid ""
2601
+ "First, you need to switch Hide My Wp from Default mode to Safe Mode or Ghost "
2602
+ "Mode."
2603
+ msgstr ""
2604
+ "Primero, tienes que cambiar Hide My Wp del modo por defecto al modo seguro o "
2605
+ "al modo fantasma."
2606
+
2607
+ #: view/Mapping.php:24
2608
+ msgid "Replace the text in tags and classes to hide any WordPress footprint."
2609
+ msgstr ""
2610
+ "Reemplazar el texto en etiquetas y clases para ocultar cualquier huella de "
2611
+ "WordPress."
2612
+
2613
+ #: view/Mapping.php:25
2614
+ msgid ""
2615
+ "Note! Your plugins and themes may use these and it will affect the design "
2616
+ "and functionality."
2617
+ msgstr ""
2618
+ "Nota: Usar con precaución. Tus plugins y temas pueden utilizarlos y puede "
2619
+ "afectar el diseño y la funcionalidad de la web"
2620
+
2621
+ #: view/Mapping.php:37
2622
+ msgid "Text Mapping only Classes, IDs, JS variables"
2623
+ msgstr "Sólo mapeo de texto Clases, IDs, variables JS"
2624
+
2625
+ #: view/Mapping.php:39
2626
+ msgid "Change the text only in classes, styles & scrips. (Recommended ON)"
2627
+ msgstr "Cambie el texto sólo en clases, estilos y guiones. (Recomendado ON)"
2628
+
2629
+ #: view/Mapping.php:40
2630
+ msgid "If this option is switched off, the text is changed in all page"
2631
+ msgstr "Si esta opción está desactivada, el texto se cambia en toda la página"
2632
+
2633
+ #: view/Mapping.php:51 view/Mapping.php:64
2634
+ msgid "Remove Text Map"
2635
+ msgstr "Eliminar el mapa de texto"
2636
+
2637
+ #: view/Mapping.php:76
2638
+ msgid "Add another text"
2639
+ msgstr "Añade otro texto"
2640
+
2641
+ #: view/Mapping.php:84
2642
+ msgid "URL Mapping"
2643
+ msgstr "Mapeo de URL"
2644
+
2645
+ #: view/Mapping.php:98
2646
+ msgid "You can add a list of URLs you want to change into new ones. "
2647
+ msgstr "Puedes añadir una lista de URLs que quieras cambiar por otras nuevas"
2648
+
2649
+ #: view/Mapping.php:99
2650
+ msgid ""
2651
+ "It's important to include only internal URLs from Frontend source code after "
2652
+ "you activate the plugin in Safe Mode or Ghost Mode."
2653
+ msgstr ""
2654
+ "Es importante incluir sólo las URLs internas del código fuente de Frontend "
2655
+ "después de activar el plugin en modo seguro o en modo fantasma."
2656
+
2657
+ #: view/Mapping.php:100
2658
+ msgid "Example:"
2659
+ msgstr "Ejemplo:"
2660
+
2661
+ #: view/Mapping.php:102 view/Mapping.php:111
2662
+ msgid "from"
2663
+ msgstr "desde"
2664
+
2665
+ #: view/Mapping.php:106 view/Mapping.php:115
2666
+ msgid "to"
2667
+ msgstr "a"
2668
+
2669
+ #: view/Mapping.php:109
2670
+ msgid "or"
2671
+ msgstr "o"
2672
+
2673
+ #: view/Mapping.php:125 view/Mapping.php:138
2674
+ msgid "Remove URL Map"
2675
+ msgstr "Eliminar el mapa URL"
2676
+
2677
+ #: view/Mapping.php:150
2678
+ msgid "Add another URL"
2679
+ msgstr "Añadir otra URL"
2680
+
2681
+ #: view/Mapping.php:158
2682
+ msgid "CDN URLs"
2683
+ msgstr "CDN URLs"
2684
+
2685
+ #: view/Mapping.php:171
2686
+ msgid "You can add one or more CDN URLs you use."
2687
+ msgstr "Puedes añadir una o más de las URL de CDN que utilizas."
2688
+
2689
+ #: view/Mapping.php:172
2690
+ msgid ""
2691
+ "This option will not activate the CDN option for your website but it will "
2692
+ "change the custom paths in case you already set a CDN URL with another "
2693
+ "plugin."
2694
+ msgstr ""
2695
+ "Esta opción no activará la opción de CDN para tu sitio web pero cambiará las "
2696
+ "rutas personalizadas en caso de que ya hayas establecido una URL de CDN con "
2697
+ "otro plugin."
2698
+
2699
+ #: view/Mapping.php:181 view/Mapping.php:190
2700
+ msgid "Remove CDN"
2701
+ msgstr "Eliminar el CDN"
2702
+
2703
+ #: view/Mapping.php:199
2704
+ msgid "Add another CDN URL"
2705
+ msgstr "Agregar otro CDN URL"
2706
+
2707
+ #: view/Mapping.php:246
2708
+ msgid "Give us 5 stars on WordPress.org"
2709
+ msgstr "Danos 5 estrellas en WordPress.org"
2710
+
2711
+ #: view/Permalinks.php:9
2712
+ msgid ""
2713
+ "Hide My WordPress requires to be activated on the entire network to prevent "
2714
+ "login issues!"
2715
+ msgstr ""
2716
+ "Hide My WordPress requiere ser activado en toda la red para evitar problemas "
2717
+ "de acceso!"
2718
+
2719
+ #: view/Permalinks.php:32
2720
+ msgid "Levels of security"
2721
+ msgstr "Niveles de seguridad"
2722
+
2723
+ #: view/Permalinks.php:34
2724
+ msgid "Default (unsafe)"
2725
+ msgstr "Por defecto (inseguro)"
2726
+
2727
+ #: view/Permalinks.php:35
2728
+ msgid "Lite mode"
2729
+ msgstr "Modo Lite"
2730
+
2731
+ #: view/Permalinks.php:38
2732
+ #, php-format
2733
+ msgid ""
2734
+ "Upgrade Your Website Security. Add Firewall, Hide WordPress Completely. "
2735
+ "%sUnlock this feature%s"
2736
+ msgstr ""
2737
+ "Actualice la seguridad de su sitio web. Añade un cortafuegos, oculta "
2738
+ "WordPress completamente. %sDesbloquea esta función%s"
2739
+
2740
+ #: view/Permalinks.php:42
2741
+ msgid "Ghost mode"
2742
+ msgstr "Modo Ghost"
2743
+
2744
+ #: view/Permalinks.php:46
2745
+ #, php-format
2746
+ msgid ""
2747
+ "%sWARNING:%s The admin path is hidden from visitors. Use the custom login "
2748
+ "URL to login to admin"
2749
+ msgstr ""
2750
+ "%sAttention%s La ruta de administración está oculta a los visitantes. Usa la "
2751
+ "URL de inicio de sesión personalizada para acceder a admin"
2752
+
2753
+ #: view/Permalinks.php:47
2754
+ #, php-format
2755
+ msgid ""
2756
+ "If you can't login, use this URL: %s and all your changes are roll back to "
2757
+ "default"
2758
+ msgstr ""
2759
+ "Si no puedes acceder, utiliza esta URL: %s y todos tus cambios se volverán a "
2760
+ "poner por defecto"
2761
+
2762
+ #: view/Permalinks.php:119
2763
+ msgid "Admin Settings"
2764
+ msgstr "Configuración de administración"
2765
+
2766
+ #: view/Permalinks.php:122
2767
+ #, php-format
2768
+ msgid ""
2769
+ "Your admin URL is changed by another plugin/theme in %s. To prevent errors, "
2770
+ "deactivate the other plugin who changes the admin path."
2771
+ msgstr ""
2772
+ "La URL de tu administrador es cambiada por otro plugin/tema en %s. Para "
2773
+ "prevenir errores, desactiva el otro plugin que cambia la ruta de "
2774
+ "administración."
2775
+
2776
+ #: view/Permalinks.php:126
2777
+ #, php-format
2778
+ msgid ""
2779
+ "Your admin URL can't be changed on %s hosting because of the %s security "
2780
+ "terms."
2781
+ msgstr ""
2782
+ "Tu URL de administración no puede ser cambiada en el hosting de %s debido a "
2783
+ "los términos de seguridad de %s."
2784
+
2785
+ #: view/Permalinks.php:132
2786
+ msgid "Custom Admin Path"
2787
+ msgstr "Ocultar la nueva ruta de admin"
2788
+
2789
+ #: view/Permalinks.php:133
2790
+ msgid "eg. adm, back"
2791
+ msgstr "ej. adm, backend"
2792
+
2793
+ #: view/Permalinks.php:147
2794
+ msgid "Hide \"wp-admin\""
2795
+ msgstr "Ocultar \"wp-admin\""
2796
+
2797
+ #: view/Permalinks.php:148
2798
+ msgid "Show 404 Not Found Error when visitors access /wp-admin"
2799
+ msgstr "Mostrar Error 404 No encontrado para /wp-admin"
2800
+
2801
+ #: view/Permalinks.php:157
2802
+ msgid "Hide the new admin path"
2803
+ msgstr "Ocultar la nueva ruta de admin"
2804
+
2805
+ #: view/Permalinks.php:158
2806
+ msgid ""
2807
+ "Let only the new login be accessible and redirect me to admin after logging "
2808
+ "in"
2809
+ msgstr ""
2810
+ "Que sólo se pueda acceder a la nueva sesión y me redirija a la "
2811
+ "administración después de entrar"
2812
+
2813
+ #: view/Permalinks.php:163
2814
+ msgid ""
2815
+ "Some Themes don't work with custom Admin and Ajax paths. In case of ajax "
2816
+ "errors, switch back to wp-admin and admin-ajax.php."
2817
+ msgstr ""
2818
+ "Algunos temas no funcionan con los caminos personalizados de Admin y Ajax. "
2819
+ "En caso de errores de Ajax, vuelve a wp-admin y admin-ajax.php."
2820
+
2821
+ #: view/Permalinks.php:169
2822
+ msgid "Login Settings"
2823
+ msgstr "Configuración de inicio de sesión"
2824
+
2825
+ #: view/Permalinks.php:172
2826
+ #, php-format
2827
+ msgid ""
2828
+ "Your login URL is changed by another plugin/theme in %s. To prevent errors, "
2829
+ "deactivate the other plugin who changes the login path."
2830
+ msgstr ""
2831
+ "Tu URL de acceso se cambia por otro plugin/tema en %s. Para evitar errores, "
2832
+ "desactiva el otro plugin que cambia la ruta de acceso."
2833
+
2834
+ #: view/Permalinks.php:177
2835
+ msgid "Custom Login Path"
2836
+ msgstr "Mensaje personalizado a mostrar a los usuarios bloqueados"
2837
+
2838
+ #: view/Permalinks.php:178
2839
+ msgid "eg. login or signin"
2840
+ msgstr "ej. login o registrar"
2841
+
2842
+ #: view/Permalinks.php:191
2843
+ msgid "Hide \"wp-login.php\""
2844
+ msgstr "Ocultar \"wp-login.php\""
2845
+
2846
+ #: view/Permalinks.php:192
2847
+ msgid "Show 404 Not Found Error when visitors access /wp-login.php"
2848
+ msgstr ""
2849
+ "Mostrar el error 404 Not Found cuando los visitantes acceden a /wp-login.php"
2850
+
2851
+ #: view/Permalinks.php:201
2852
+ msgid "Custom Lost Password Path"
2853
+ msgstr "Ruta de la Contraseña Perdida Personalizada"
2854
+
2855
+ #: view/Permalinks.php:202
2856
+ msgid "eg. lostpass or forgotpass"
2857
+ msgstr "ej. contrasena-perdida o recordar-pass"
2858
+
2859
+ #: view/Permalinks.php:212
2860
+ msgid "Custom Register Path"
2861
+ msgstr "Ruta de la Registrar Personalizada"
2862
+
2863
+ #: view/Permalinks.php:213
2864
+ msgid "eg. newuser or register"
2865
+ msgstr "ej. usuario-nuevo o registrar"
2866
+
2867
+ #: view/Permalinks.php:223
2868
+ msgid "Custom Logout Path"
2869
+ msgstr "Ruta de Cerrar Session Personalizada"
2870
+
2871
+ #: view/Permalinks.php:224
2872
+ msgid "eg. logout or disconnect"
2873
+ msgstr "eg. cerrar o desconectar"
2874
+
2875
+ #: view/Permalinks.php:234
2876
+ msgid "Custom Activation Path"
2877
+ msgstr "Ocultar la nueva ruta de admin"
2878
+
2879
+ #: view/Permalinks.php:235
2880
+ msgid "eg. multisite activation link"
2881
+ msgstr "por ejemplo, el enlace de activación multisitio"
2882
+
2883
+ #: view/Permalinks.php:248
2884
+ msgid "Common Paths"
2885
+ msgstr "Caminos comunes"
2886
+
2887
+ #: view/Permalinks.php:252
2888
+ msgid "Custom admin-ajax Path"
2889
+ msgstr "Ocultar la ruta de admin-ajax"
2890
+
2891
+ #: view/Permalinks.php:253
2892
+ msgid "eg. ajax, json"
2893
+ msgstr "eg. Ajax, JSON"
2894
+
2895
+ #: view/Permalinks.php:266
2896
+ msgid "Hide wp-admin from ajax URL"
2897
+ msgstr "Ocultar wp-admin de la URL de ajax"
2898
+
2899
+ #: view/Permalinks.php:267
2900
+ #, php-format
2901
+ msgid "Show /%s instead of /%s"
2902
+ msgstr "Mostrar /%s en lugar de /%s"
2903
+
2904
+ #: view/Permalinks.php:268
2905
+ msgid "Works only with the custom admin-ajax path to avoid infinite loops."
2906
+ msgstr ""
2907
+ "Funciona sólo con el camino personalizado de admin-ajax para evitar bucles "
2908
+ "infinitos."
2909
+
2910
+ #: view/Permalinks.php:275
2911
+ msgid "Custom wp-content Path"
2912
+ msgstr "Ruta de wp-content Personalizada"
2913
+
2914
+ #: view/Permalinks.php:276
2915
+ msgid "eg. core, inc, include"
2916
+ msgstr "p.e. core, inc, incluye"
2917
+
2918
+ #: view/Permalinks.php:286
2919
+ msgid "Custom wp-includes Path"
2920
+ msgstr "Ruta de wp-includes Personalizada"
2921
+
2922
+ #: view/Permalinks.php:287
2923
+ msgid "eg. lib, library"
2924
+ msgstr "eg. lib, biblioteca"
2925
+
2926
+ #: view/Permalinks.php:298
2927
+ msgid "Custom uploads Path"
2928
+ msgstr "Ruta de uploads Personalizada"
2929
+
2930
+ #: view/Permalinks.php:299
2931
+ msgid "eg. images, files"
2932
+ msgstr "eg. imágenes, archivos"
2933
+
2934
+ #: view/Permalinks.php:308
2935
+ #, php-format
2936
+ msgid ""
2937
+ "You already defined a different wp-content/uploads directory in wp-config."
2938
+ "php %s"
2939
+ msgstr ""
2940
+ "Ya has definido un directorio wp-content/uploads diferente en wp-config.php "
2941
+ "%s"
2942
+
2943
+ #: view/Permalinks.php:314
2944
+ msgid "Custom comment Path"
2945
+ msgstr "Ruta de comment Personalizada"
2946
+
2947
+ #: view/Permalinks.php:315
2948
+ msgid "eg. comments, discussion"
2949
+ msgstr "eg. Comentarios, discusión"
2950
+
2951
+ #: view/Permalinks.php:326
2952
+ msgid "Custom author Path"
2953
+ msgstr "Ruta del autor Personalizada"
2954
+
2955
+ #: view/Permalinks.php:327
2956
+ msgid "eg. profile, usr, writer"
2957
+ msgstr "p.e. perfil, usr, escritor"
2958
+
2959
+ #: view/Permalinks.php:345
2960
+ msgid "Hide Author ID URL"
2961
+ msgstr "Ocultar el URL de ID del autor"
2962
+
2963
+ #: view/Permalinks.php:346
2964
+ msgid "Don't let URLs like domain.com?author=1 show the user login name"
2965
+ msgstr ""
2966
+ "No dejes que las URLs como domain.com?author=1 muestren el nombre de usuario"
2967
+
2968
+ #: view/Permalinks.php:354
2969
+ msgid "Plugin Settings"
2970
+ msgstr "Configuración de Plugin"
2971
+
2972
+ #: view/Permalinks.php:358
2973
+ msgid "Custom plugins Path"
2974
+ msgstr "Ruta del plugins Personalizada"
2975
+
2976
+ #: view/Permalinks.php:359
2977
+ msgid "eg. modules"
2978
+ msgstr "eg. modulos"
2979
+
2980
+ #: view/Permalinks.php:371
2981
+ msgid "Hide plugin names"
2982
+ msgstr "Ocultar las nombres del plugin"
2983
+
2984
+ #: view/Permalinks.php:372
2985
+ msgid "Give random names to each plugin"
2986
+ msgstr "Darle nombres al azar a cada plugin"
2987
+
2988
+ #: view/Permalinks.php:379
2989
+ msgid "Theme Settings"
2990
+ msgstr "Ajustes de tema"
2991
+
2992
+ #: view/Permalinks.php:383
2993
+ msgid "Custom themes Path"
2994
+ msgstr "Ruta de temas Personalizada"
2995
+
2996
+ #: view/Permalinks.php:384
2997
+ msgid "eg. assets, templates, styles"
2998
+ msgstr "por ejemplo, activos, plantillas, estilos"
2999
+
3000
+ #: view/Permalinks.php:399
3001
+ msgid "Hide theme names"
3002
+ msgstr "Ocultar los nombres de los temas"
3003
+
3004
+ #: view/Permalinks.php:400
3005
+ msgid "Give random names to each theme (works in WP multisite)"
3006
+ msgstr "Dar nombres al azar a cada tema (funciona en WP multisitio)"
3007
+
3008
+ #: view/Permalinks.php:411
3009
+ msgid "REST API Settings"
3010
+ msgstr "Inhabilitar el acceso a la Rest API"
3011
+
3012
+ #: view/Permalinks.php:419
3013
+ msgid "Custom wp-json Path"
3014
+ msgstr "URL personalizado para wp-json"
3015
+
3016
+ #: view/Permalinks.php:420
3017
+ msgid "eg. json, api, call"
3018
+ msgstr "por ejemplo, json, api, llama"
3019
+
3020
+ #: view/Permalinks.php:433
3021
+ msgid "Disable Rest API access"
3022
+ msgstr "Inhabilitar el acceso a la Rest API"
3023
+
3024
+ #: view/Permalinks.php:434
3025
+ msgid "Disable Rest API access if you don't use your website for API calls"
3026
+ msgstr ""
3027
+ "Deshabilita el acceso a la API de descanso si no utilizas tu sitio web para "
3028
+ "las llamadas a la API"
3029
+
3030
+ #: view/Permalinks.php:442
3031
+ msgid "Security Settings"
3032
+ msgstr "Ajustes de seguridad"
3033
+
3034
+ #: view/Permalinks.php:454
3035
+ msgid "Hide WordPress Common Paths"
3036
+ msgstr "Ocultar los caminos comunes de WordPress"
3037
+
3038
+ #: view/Permalinks.php:455
3039
+ msgid "Hide /wp-content, /wp-include, /plugins, /themes paths"
3040
+ msgstr ""
3041
+ "Ocultar el contenido de /wp-content, /wp-include, /plugins, /themes paths"
3042
+
3043
+ #: view/Permalinks.php:456
3044
+ msgid "Hide upgrade.php and install.php for visitors"
3045
+ msgstr "Esconder upgrade.php e instalar.php para los visitantes"
3046
+
3047
+ #: view/Permalinks.php:457
3048
+ msgid "(this may affect the fonts and images loaded through CSS)"
3049
+ msgstr "(esto puede afectar a las fuentes e imágenes cargadas a través de CSS)"
3050
+
3051
+ #: view/Permalinks.php:467
3052
+ msgid "Hide WordPress Common Files"
3053
+ msgstr "Ocultar archivos comunes de WordPress"
3054
+
3055
+ #: view/Permalinks.php:468
3056
+ msgid ""
3057
+ "Hide wp-config.php , wp-config-sample.php, readme.html, license.txt files"
3058
+ msgstr ""
3059
+ "Ocultar wp-config.php , wp-config-sample.php, readme.html, archivos license."
3060
+ "txt"
3061
+
3062
+ #: view/Permalinks.php:480
3063
+ msgid "Firewall Against Script Injection"
3064
+ msgstr "Cortafuegos contra la inyección de scripts"
3065
+
3066
+ #: view/Permalinks.php:481
3067
+ msgid ""
3068
+ "Most WordPress installations are hosted on the popular Apache, Nginx and IIS "
3069
+ "web servers."
3070
+ msgstr ""
3071
+ "La mayoría de las instalaciones de WordPress están alojadas en los populares "
3072
+ "servidores web Apache, Nginx e IIS."
3073
+
3074
+ #: view/Permalinks.php:482
3075
+ msgid ""
3076
+ "A thorough set of rules can prevent many types of SQL Injection and URL "
3077
+ "hacks from being interpreted."
3078
+ msgstr ""
3079
+ "Un conjunto completo de reglas puede evitar que se interpreten muchos tipos "
3080
+ "de Inyección SQL y hackeo de URL."
3081
+
3082
+ #: view/Permalinks.php:493
3083
+ msgid "Disable Directory Browsing"
3084
+ msgstr "Desactivar la navegación por el directorio"
3085
+
3086
+ #: view/Permalinks.php:494
3087
+ #, php-format
3088
+ msgid "Don't let hackers see any directory content. See %sUploads Directory%s"
3089
+ msgstr ""
3090
+ "No dejes que los hackers vean el contenido de ningún directorio. Ver %subir "
3091
+ "directorio%s"
3092
+
3093
+ #: view/Permalinks.php:507
3094
+ msgid "Custom category Path"
3095
+ msgstr "Ruta de categorías Personalizada"
3096
+
3097
+ #: view/Permalinks.php:508
3098
+ msgid "eg. cat, dir, list"
3099
+ msgstr "p.e. cat, dir, lista"
3100
+
3101
+ #: view/Permalinks.php:517
3102
+ msgid "Custom tags Path"
3103
+ msgstr "Ruta de etiquetas Personalizada"
3104
+
3105
+ #: view/Permalinks.php:518
3106
+ msgid "eg. keyword, topic"
3107
+ msgstr "ej. etiqueta, keyword, topic"
3108
+
3109
+ #: view/Plugins.php:14
3110
+ msgid "More details"
3111
+ msgstr "Más detalles"
3112
+
3113
+ #: view/Plugins.php:16
3114
+ msgid "Install Plugin"
3115
+ msgstr "Instalar Plugin"
3116
+
3117
+ #: view/Plugins.php:18
3118
+ msgid "Plugin Installed"
3119
+ msgstr "Plugin instalado"
3120
+
3121
+ #: view/Plugins.php:30
3122
+ msgid ""
3123
+ "We are testing every week the latest version of these plugins and <strong>we "
3124
+ "make sure they are working with Hide My WP</strong> plugin.\n"
3125
+ " <br /><br />You don't need to install all these plugin "
3126
+ "in your website. If you're already using a cache plugin you don't need to "
3127
+ "install another one. <strong>We recommend using only one cache plugin</"
3128
+ "strong>.\n"
3129
+ " <br /><br />You can also install either <strong>iThemes "
3130
+ "Security</strong> plugin or <strong>Sucuri Security</strong> plugin to work "
3131
+ "with Hide My Wp plugin.\n"
3132
+ " <br /><br />If your plugins directory is not writable "
3133
+ "you will need to install the plugins manually."
3134
+ msgstr ""
3135
+ "Estamos probando cada semana la última versión de estos plugins y nos "
3136
+ "aseguramos de que funcionan <strong>con</strong> el plugin <strong>Hide My "
3137
+ "WP</strong>.\n"
3138
+ " <br /><br /> No es necesario que instale todos estos "
3139
+ "plugins en su sitio web. Si ya usas un plugin de caché no necesitas instalar "
3140
+ "otro. Te recomendamos que utilices <strong>un</strong> solo plugin de "
3141
+ "caché.\n"
3142
+ " <br /><br /> También puedes instalar el plugin de "
3143
+ "seguridad de <strong>iThemes</strong> o el plugin de <strong>seguridad de "
3144
+ "Sucuri</strong> para que funcione con el plugin de Hide My Wp.\n"
3145
+ " <br /><br /> Si el directorio de plugins no es "
3146
+ "escribible, deberá instalar los plugins manualmente."
3147
+
3148
+ #: view/SecurityCheck.php:6
3149
+ msgid "WordPress Security Check"
3150
+ msgstr "Comprobación de seguridad de WordPress"
3151
+
3152
+ #: view/SecurityCheck.php:35 view/SecurityCheck.php:63
3153
+ msgid "Start Scan"
3154
+ msgstr "Empezar a rastrear"
3155
+
3156
+ #: view/SecurityCheck.php:48
3157
+ msgid "Passed"
3158
+ msgstr "Pasado"
3159
+
3160
+ #: view/SecurityCheck.php:49
3161
+ msgid "Failed"
3162
+ msgstr "Fallido"
3163
+
3164
+ #: view/SecurityCheck.php:55
3165
+ msgid ""
3166
+ "Congratulations! You completed all the security tasks. Make sure you check "
3167
+ "your site once a week."
3168
+ msgstr ""
3169
+ "¡Felicidades! Has completado todas las tareas de seguridad. Asegúrate de "
3170
+ "revisar tu sitio una vez a la semana."
3171
+
3172
+ #: view/SecurityCheck.php:66
3173
+ #, php-format
3174
+ msgid ""
3175
+ "According to %sGoogle latest stats%s, over %s20k websites are hacked every "
3176
+ "week%s and over %s30&#37; of them are made in WordPress%s. <br />It's "
3177
+ "%sbetter to prevent an attack%s than to spend a lot of money and time to "
3178
+ "recover your data after an attack not to mention the situation when your "
3179
+ "clients' data are stollen."
3180
+ msgstr ""
3181
+ "De acuerdo con las %súltimas estadísticas de Google%s, más de %s20.000 "
3182
+ "sitios web son hackeados cada semana%s y más del %s30&#37; de ellos son "
3183
+ "hechos en WordPress%s. <br />Es %smejor prevenir un ataque %sque gastar "
3184
+ "mucho dinero y tiempo en recuperar tus datos después de un ataque, sin "
3185
+ "mencionar la situación en la que los datos de tus clientes se quedan "
3186
+ "estancados."
3187
+
3188
+ #: view/SecurityCheck.php:69
3189
+ msgid "Last check:"
3190
+ msgstr "Última comprobación:"
3191
+
3192
+ #: view/SecurityCheck.php:82
3193
+ msgid "Name"
3194
+ msgstr "Nombre"
3195
+
3196
+ #: view/SecurityCheck.php:83
3197
+ msgid "Value"
3198
+ msgstr "Valor"
3199
+
3200
+ #: view/SecurityCheck.php:84
3201
+ msgid "Valid"
3202
+ msgstr "Válido"
3203
+
3204
+ #: view/SecurityCheck.php:85
3205
+ msgid "Action"
3206
+ msgstr "Acción"
3207
+
3208
+ #: view/SecurityCheck.php:110
3209
+ msgid "Info"
3210
+ msgstr "Información"
3211
+
3212
+ #: view/SecurityCheck.php:111
3213
+ msgid "Fix it"
3214
+ msgstr "Reparar"
3215
+
3216
+ #: view/SecurityCheck.php:112
3217
+ msgid "Are you sure you want to ignore this task in the future?"
3218
+ msgstr "¿Estás seguro de que quieres ignorar esta tarea en el futuro?"
3219
+
3220
+ #: view/SecurityCheck.php:125
3221
+ msgid "Reset all ingnored tasks"
3222
+ msgstr "Reajustar todas las tareas ignoradas"
3223
+
3224
+ #: view/Support.php:3
3225
+ msgid "Need Help?"
3226
+ msgstr "¿Necesitas ayuda?"
3227
+
3228
+ #: view/Support.php:6
3229
+ #, php-format
3230
+ msgid ""
3231
+ "Read the plugin tutorial and how to setup every feature %sRead Hide My WP "
3232
+ "Tutorial%s"
3233
+ msgstr ""
3234
+ "Lee el tutorial del plugin y cómo configurar cada función %sLee el tutorial "
3235
+ "de Hide My WP%s"
3236
+
3237
+ #: view/Support.php:8
3238
+ #, php-format
3239
+ msgid ""
3240
+ "You can also email us on %scontact@wpplugins.tips%s and we are happy to "
3241
+ "answer any question or suggestion you may have and we aim to respond within "
3242
+ "24 hours."
3243
+ msgstr ""
3244
+ "También puede enviarnos un correo electrónico a %scontact@wpplugins.tips%s y "
3245
+ "estaremos encantados de responder a cualquier pregunta o sugerencia que "
3246
+ "pueda tener y nuestro objetivo es responder en un plazo de 24 horas."
3247
+
3248
+ #: view/Tweaks.php:10
3249
+ msgid "Change Options"
3250
+ msgstr "Opciones"
3251
+
3252
+ #: view/Tweaks.php:18
3253
+ msgid "Change Paths for Logged Users"
3254
+ msgstr "Cambiar las rutas de los usuarios registrados"
3255
+
3256
+ #: view/Tweaks.php:20
3257
+ msgid "Change WordPress paths while you're logged in"
3258
+ msgstr "Cambia los caminos de WordPress mientras estás conectado"
3259
+
3260
+ #: view/Tweaks.php:21
3261
+ msgid "(not recommended, may affect other plugins functionality in admin)"
3262
+ msgstr ""
3263
+ "(no recomendado, puede afectar a la funcionalidad de otros plugins en admin)"
3264
+
3265
+ #: view/Tweaks.php:35
3266
+ msgid "Change Paths in Cached Files"
3267
+ msgstr "Cambiar los caminos en los archivos almacenados"
3268
+
3269
+ #: view/Tweaks.php:36
3270
+ msgid ""
3271
+ "Change the WordPress common paths in the cached files from /wp-content/cache "
3272
+ "directory"
3273
+ msgstr ""
3274
+ "Cambiar las rutas comunes de WordPress en los archivos almacenados en el "
3275
+ "directorio /wp-content/cache"
3276
+
3277
+ #: view/Tweaks.php:37
3278
+ msgid ""
3279
+ "(this feature runs in background and needs up to one minute after every "
3280
+ "cache purged)"
3281
+ msgstr ""
3282
+ "(esta característica funciona en segundo plano y necesita hasta un minuto "
3283
+ "después de cada caché purgado)"
3284
+
3285
+ #: view/Tweaks.php:48
3286
+ msgid "Change Paths in Ajax Calls"
3287
+ msgstr "Cambiar los caminos en las llamadas de Ajax"
3288
+
3289
+ #: view/Tweaks.php:50
3290
+ msgid ""
3291
+ "This will prevent from showing the old paths when an image or font is called "
3292
+ "through ajax"
3293
+ msgstr ""
3294
+ "Esto evitará que se muestren los viejos caminos cuando una imagen o fuente "
3295
+ "se llama a través de ajax"
3296
+
3297
+ #: view/Tweaks.php:58
3298
+ msgid "Hide/Show Options"
3299
+ msgstr "Opciones"
3300
+
3301
+ #: view/Tweaks.php:67
3302
+ msgid ""
3303
+ "Hide WordPress and Plugin versions from the end of any image, css and js "
3304
+ "files"
3305
+ msgstr ""
3306
+ "Ocultar las versiones de WordPress y Plugin al final de cualquier archivo de "
3307
+ "imagen, css y js"
3308
+
3309
+ #: view/Tweaks.php:68
3310
+ msgid "Hide the WP Generator META"
3311
+ msgstr "Ocultar \"wp-login.php\""
3312
+
3313
+ #: view/Tweaks.php:69
3314
+ msgid "Hide the WP DNS Prefetch META"
3315
+ msgstr "Ocultar el WP DNS Prefetch META"
3316
+
3317
+ #: view/Tweaks.php:78
3318
+ msgid "Hide RSD (Really Simple Discovery) header"
3319
+ msgstr "Ocultar el encabezado RSD (Really Simple Discovery)"
3320
+
3321
+ #: view/Tweaks.php:80
3322
+ msgid "Don't show any WordPress information in HTTP header request"
3323
+ msgstr ""
3324
+ "No muestres ninguna información de WordPress en la solicitud de encabezado "
3325
+ "HTTP"
3326
+
3327
+ #: view/Tweaks.php:90
3328
+ msgid "Hide WordPress HTML Comments"
3329
+ msgstr "Ocultar los Comentarios HTML pertenecientes a temas y plugins"
3330
+
3331
+ #: view/Tweaks.php:92
3332
+ msgid "Hide the HTML Comments left by theme and plugins"
3333
+ msgstr "Ocultar los Comentarios HTML pertenecientes a temas y plugins"
3334
+
3335
+ #: view/Tweaks.php:101
3336
+ msgid "Hide Emojicons"
3337
+ msgstr "Ocultar Emojiconos"
3338
+
3339
+ #: view/Tweaks.php:103
3340
+ msgid "Don't load Emoji Icons if you don't use them"
3341
+ msgstr "No cargar los iconos de Emoji si no los usa"
3342
+
3343
+ #: view/Tweaks.php:110
3344
+ msgid "Other Settings"
3345
+ msgstr "Otros ajustes"
3346
+
3347
+ #: view/Tweaks.php:117
3348
+ msgid "Disable XML-RPC authentication"
3349
+ msgstr "Deshabilitar la autenticación XML-RPC"
3350
+
3351
+ #: view/Tweaks.php:119
3352
+ #, php-format
3353
+ msgid "Don't load XML-RPC to prevent %sBrute force attacks via XML-RPC%s"
3354
+ msgstr ""
3355
+ "No cargue XML-RPC para prevenir ataques de %sfuerza bruta a través de XML-RPC"
3356
+ "%s"
3357
+
3358
+ #: view/Tweaks.php:128
3359
+ msgid "Disable Embed scripts"
3360
+ msgstr "Deshabilitar los scripts incrustadas"
3361
+
3362
+ #: view/Tweaks.php:130
3363
+ msgid "Don't load oEmbed service if you don't use oEmbed videos"
3364
+ msgstr "No cargar el servicio oEmbed si no utiliza videos oEmbed"
3365
+
3366
+ #: view/Tweaks.php:140
3367
+ msgid "Disable WLW Manifest scripts"
3368
+ msgstr "Deshabilitar los scripts de WLW Manifest"
3369
+
3370
+ #: view/Tweaks.php:142
3371
+ msgid ""
3372
+ "Don't load WLW if you didn't configure Windows Live Writer for your site"
3373
+ msgstr "No cargues WLW si no has configurado Windows Live Writer para tu sitio"
3374
+
3375
+ #: view/Tweaks.php:152
3376
+ msgid "Disable DB Debug in Frontent"
3377
+ msgstr "Deshabilitar la depuración de DB en Frontent"
3378
+
3379
+ #: view/Tweaks.php:154
3380
+ msgid "Don't load DB Debug if your website is live"
3381
+ msgstr "No cargue DB Debug si su sitio web está en vivo"
3382
+
3383
+ #. Plugin Name of the plugin/theme
3384
+ msgid "Hide My WP Ghost Lite"
3385
+ msgstr "Hide My WP Ghost Lite"
3386
+
3387
+ #. Plugin URI of the plugin/theme
3388
+ msgid "https://wordpress.org/plugins/hide-my-wp/"
3389
+ msgstr "https://wordpress.org/plugins/hide-my-wp/"
3390
+
3391
+ #. Description of the plugin/theme
3392
+ msgid ""
3393
+ "The best solution for WordPress Security. Hide wp-admin, wp-login, wp-"
3394
+ "content, plugins, themes etc. Add Firewall, Brute Force protection & more. "
3395
+ "<br /> <a href=\"http://hidemywpghost.com/wordpress\" target=\"_blank"
3396
+ "\"><strong>Unlock all features</strong></a>"
3397
+ msgstr ""
3398
+ "La mejor solución para la seguridad de WordPress. Ocultar wp-admin, wp-"
3399
+ "login, wp-content, plugins, temas, etc. Añade un cortafuegos, protección de "
3400
+ "fuerza bruta y más. <br /> <a href=\"http://hidemywpghost.com/wordpress\" "
3401
+ "target=\"_blank\"><strong>Desbloquea todas las características</strong></a>"
3402
+
3403
+ #. Author of the plugin/theme
3404
+ msgid "WPPlugins - WordPress Security Plugins"
3405
+ msgstr "WPPlugins - Plugins de seguridad de WordPress"
3406
+
3407
+ #. Author URI of the plugin/theme
3408
+ msgid "https://wpplugins.tips"
3409
+ msgstr "https://wpplugins.tips"
3410
+
3411
+ #~ msgid "Cancel the changes"
3412
+ #~ msgstr "Cancelar los cambios"
3413
+
3414
+ #~ msgid ""
3415
+ #~ "Action Required. Proceed with the instructions or cancel the changes "
3416
+ #~ msgstr ""
3417
+ #~ "Acción requerida. Continue con las instrucciones o cancele los cambios "
3418
+
3419
+ #, php-format
3420
+ #~ msgid ""
3421
+ #~ "You still see %s because you are logged in. To prevent errors, log-in "
3422
+ #~ "with the new admin url: %s"
3423
+ #~ msgstr ""
3424
+ #~ "Sigue viendo %s porque todavía está logueado. Para evitar errores, inicie "
3425
+ #~ "la sesión de nuevo usando la url del admin: %s"
3426
+
3427
+ #~ msgid "Custom theme style name"
3428
+ #~ msgstr "Cambiar el nombre del css de su tema"
3429
+
3430
+ #~ msgid "Hide IDs from Stylesheets"
3431
+ #~ msgstr "Ocultar ID de hojas de estilo"
3432
+
3433
+ #~ msgid "(may slow down the website)"
3434
+ #~ msgstr "(puede ralentizar el sitio web)"
3435
+
3436
+ #~ msgid "Custom admin URL"
3437
+ #~ msgstr "Definir la URL de Admin"
3438
+
3439
+ #~ msgid "Custom login URL"
3440
+ #~ msgstr "Definir URL de Login"
3441
+
3442
+ #~ msgid "Show 404 Not Found Error for /wp-login.php"
3443
+ #~ msgstr "Mostrar Error 404 No encontrado para /wp-login.php"
3444
+
3445
+ #~ msgid "Custom Lost Password URL"
3446
+ #~ msgstr "URL Recuperar Contraseña"
3447
+
3448
+ #~ msgid "Custom Register URL"
3449
+ #~ msgstr "URL de Registro Usuario"
3450
+
3451
+ #~ msgid "Custom wp-includes URL"
3452
+ #~ msgstr "URL personalizado para wp-includes"
3453
+
3454
+ #~ msgid "Custom uploads URL"
3455
+ #~ msgstr "URL de upload"
3456
+
3457
+ #~ msgid "Custom comment URL"
3458
+ #~ msgstr "URL de Comentario"
3459
+
3460
+ #~ msgid "Custom author URL"
3461
+ #~ msgstr "URL del Autor"
3462
+
3463
+ #~ msgid "Custom plugins path URL"
3464
+ #~ msgstr "URL de plugins"
3465
+
3466
+ #~ msgid "Custom themes path URL"
3467
+ #~ msgstr "Definir URL para temas"
3468
+
3469
+ #~ msgid "Custom category URL"
3470
+ #~ msgstr "URL de categorías"
3471
+
3472
+ #~ msgid "Custom tags URL"
3473
+ #~ msgstr "URL de etiquetas"
3474
+
3475
+ #~ msgid "I've already left a review"
3476
+ #~ msgstr "Ya he dejado una revisión"
3477
+
3478
+ #~ msgid "Never show again"
3479
+ #~ msgstr "No volver a mostrar"
3480
+
3481
+ #~ msgid "Advanced Settings"
3482
+ #~ msgstr "Configuración Avanzada"
3483
+
3484
+ #~ msgid "Fix relative URLs"
3485
+ #~ msgstr "Solucionar URLs relativas"
3486
+
3487
+ #~ msgid "Strict Login"
3488
+ #~ msgstr "Inicio de sesión estricto"
3489
+
3490
+ #~ msgid ""
3491
+ #~ "Load HMW after all plugins are loaded. Useful for CDN plugins (eg. CDN "
3492
+ #~ "Enabler)"
3493
+ #~ msgstr ""
3494
+ #~ "Load HMW after all plugins are loaded. Useful for CDN plugins (eg. CDN "
3495
+ #~ "Enabler)"
3496
+
3497
+ #~ msgid "Leave A Review?"
3498
+ #~ msgstr "Dejar una opinión"
3499
+
3500
+ #~ msgid "Sure! I'd love to!"
3501
+ #~ msgstr "¡Me encantaría!"
3502
+
3503
+ #~ msgid "Remove text by matching"
3504
+ #~ msgstr "Eliminar texto por coincidencia"
3505
+
3506
+ #~ msgid ""
3507
+ #~ "You can also enter text parts like wp- and it will remove all the text "
3508
+ #~ "containing wp- from your source code"
3509
+ #~ msgstr ""
3510
+ #~ "Puede incluso indicar parte de texto como wp- y se eliminarán todas las "
3511
+ #~ "coincidencias wp- desde su código fuente"
3512
+
3513
+ #~ msgid "Maybe Later"
3514
+ #~ msgstr "Quizá más tarde."
3515
+
3516
+ #~ msgid ""
3517
+ #~ "Your admin path is changed. To prevent errors, disable the other plugin "
3518
+ #~ "who changes the admin path."
3519
+ #~ msgstr ""
3520
+ #~ "La ruta de acceso cómo admin se cambió. Para evitar errores, desactive el "
3521
+ #~ "otro plugin que cambia esta ruta de acceso."
3522
+
3523
+ #~ msgid ""
3524
+ #~ "If you can't login, use this URL: %s and all changes are rollback to "
3525
+ #~ "default"
3526
+ #~ msgstr ""
3527
+ #~ "Si no puede loguearse, utiliza esta URL: %s y se cargará la configuración "
3528
+ #~ "predefinida."
3529
+
3530
+ #~ msgid ""
3531
+ #~ "Let only the new login to be accesible and redirect me to admin after I'm "
3532
+ #~ "logged in"
3533
+ #~ msgstr ""
3534
+ #~ "Dejar sólo el nuevo login que sea accesible y redireccióname a admin "
3535
+ #~ "después de loguearme"
3536
+
3537
+ #~ msgid "Hide Plugins name"
3538
+ #~ msgstr "Ocultar nombre Plugins"
3539
+
3540
+ #~ msgid "Hide Themes name"
3541
+ #~ msgstr "Ocultar nombre de temas"
3542
+
3543
+ #~ msgid ""
3544
+ #~ "Don't load it if you didn't configure Windows Live Writer for your site"
3545
+ #~ msgstr "No cargar si no tiene configurado Windows Live Writer para su web"
3546
+
3547
+ #~ msgid ""
3548
+ #~ "We hope you've enjoyed using Hide My WP PRO! Would you consider leaving "
3549
+ #~ "us a review on WordPress.org?"
3550
+ #~ msgstr ""
3551
+ #~ "¡Esperamos que ha disfrutado usando Hide My WP PRO! ¿Consideraría dejar "
3552
+ #~ "una valoración positiva en WordPress.org?"
3553
+
3554
+ #~ msgid ""
3555
+ #~ "CDN Enabler detected! Learn how to configure it with Hide My WP PRO "
3556
+ #~ "%sClick here%s"
3557
+ #~ msgstr ""
3558
+ #~ "¡CDN Enabler detectado! Aprenda a configurarlo con Hide My WP PRO %sClick "
3559
+ #~ "aquí%s"
3560
+
3561
+ #~ msgid "Check for updates"
3562
+ #~ msgstr "Comprobar actualizaciones."
3563
+
3564
+ #~ msgid "This plugin is up to date."
3565
+ #~ msgstr "Este plugin está actualizado."
3566
+
3567
+ #~ msgid "A new version of this plugin is available."
3568
+ #~ msgstr "Una nueva versión de este plugin está disponible."
3569
+
3570
+ #~ msgid "Unknown update checker status \"%s\""
3571
+ #~ msgstr "Status de actualización desconocido \"%s\""
3572
+
3573
+ #~ msgid "Custom ajax URL"
3574
+ #~ msgstr "URL para llamadas ajax"
3575
+
3576
+ #~ msgid "You can choose to hide all the URLs from hackers and spammers."
3577
+ #~ msgstr "Puede elegir ocultar todas las URL de hackers y spammers."
3578
+
3579
+ #~ msgid "WPPlugins"
3580
+ #~ msgstr "WPPlugins"
languages/hide-my-wp-ro_RO.mo ADDED
Binary file
languages/hide-my-wp-ro_RO.po ADDED
@@ -0,0 +1,3416 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Hide My WP Ghost\n"
4
+ "POT-Creation-Date: 2020-05-14 18:31+0300\n"
5
+ "PO-Revision-Date: 2020-05-14 19:45+0300\n"
6
+ "Last-Translator: John Darrel <john@wpplugins.tips>\n"
7
+ "Language-Team: WpPluginsTips <john@wpplugins.tips>\n"
8
+ "Language: ro_RO\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 2.3.1\n"
13
+ "X-Poedit-Basepath: ..\n"
14
+ "X-Poedit-WPHeader: index.php\n"
15
+ "X-Poedit-SourceCharset: UTF-8\n"
16
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;"
17
+ "esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;"
18
+ "_nx_noop:3c,1,2;__ngettext_noop:1,2\n"
19
+ "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n==0 || (n!=1 && n%100>=1 && n"
20
+ "%100<=19) ? 1 : 2);\n"
21
+ "X-Poedit-SearchPath-0: .\n"
22
+ "X-Poedit-SearchPathExcluded-0: *.js\n"
23
+
24
+ #: classes/Error.php:17
25
+ msgid ""
26
+ "Function get_class does not exist! It's required for Hide My WP to work "
27
+ "properly."
28
+ msgstr ""
29
+ "Funcția get_class nu există! Este necesar ca Hide My WP să funcționeze "
30
+ "corect."
31
+
32
+ #: classes/Error.php:20
33
+ msgid ""
34
+ "Function file_exists does not exist! It's required for Hide My WP to work "
35
+ "properly."
36
+ msgstr ""
37
+ "Funcția file_exists nu există! Este necesar ca Hide My WP să funcționeze "
38
+ "corect."
39
+
40
+ #: classes/Error.php:24
41
+ msgid "The home directory is not set!"
42
+ msgstr "Directorul de acasă nu este setat!"
43
+
44
+ #: classes/Error.php:28
45
+ msgid "The PHP version has to be greater than 5.1"
46
+ msgstr "Versiunea PHP trebuie să fie mai mare de 5.1"
47
+
48
+ #: classes/Error.php:36
49
+ msgid ""
50
+ "For Hide My WP to work, the PHP version has to be equal or greater than 5.1"
51
+ msgstr ""
52
+ "Pentru ca Hide My WP să funcționeze, versiunea PHP trebuie să fie egală sau "
53
+ "mai mare de 5.1"
54
+
55
+ #: classes/Tools.php:30 classes/Tools.php:34
56
+ #, php-format
57
+ msgid ""
58
+ "Your memory limit is %sM. You need at least %sM to prevent loading errors in "
59
+ "frontend. See: %sIncreasing memory allocated to PHP%s"
60
+ msgstr ""
61
+ "Limita dvs. de memorie este %sM. Aveți nevoie de cel puțin %sM pentru a "
62
+ "preveni erorile de încărcare în frontend. Vezi: %sCreșterea memoriei alocate "
63
+ "PHP %s"
64
+
65
+ #: classes/Tools.php:122
66
+ msgid ""
67
+ "Your IP has been flagged for potential security violations. Please try again "
68
+ "in a little while..."
69
+ msgstr ""
70
+ "IP-ul dvs. a fost marcat pentru eventuale încălcări de securitate. Încercați "
71
+ "din nou peste puțin timp ..."
72
+
73
+ #: classes/Tools.php:333
74
+ msgid "Documentation"
75
+ msgstr "Documentație"
76
+
77
+ #: classes/Tools.php:334
78
+ msgid "Leave a review"
79
+ msgstr "Lasă o evaluare"
80
+
81
+ #: classes/Tools.php:351
82
+ msgid "Upgrade to Premium"
83
+ msgstr "Treceți la Premium"
84
+
85
+ #: classes/Tools.php:353 controllers/SecurityCheck.php:185
86
+ msgid "Settings"
87
+ msgstr "Setări"
88
+
89
+ #: classes/Tools.php:1129
90
+ #, php-format
91
+ msgid "CONNECTION ERROR! Make sure your website can access: %s"
92
+ msgstr ""
93
+ "EROARE DE CONEXIUNE! Asigurați-vă că site-ul dvs. web poate avea acces: %s"
94
+
95
+ #: classes/Tools.php:1149
96
+ msgid "New Login Information"
97
+ msgstr "Informații de conectare noi"
98
+
99
+ #: controllers/Brute.php:34
100
+ msgid "IP Blocked by Hide My WordPress Brute Force Protection"
101
+ msgstr "IP Blocat de Hide My WordPress Brute Force Protection"
102
+
103
+ #: controllers/Brute.php:62
104
+ msgid "Add only real IPs. No local ips needed."
105
+ msgstr "Adăugați doar IP-uri reale. Nu este nevoie de IP local."
106
+
107
+ #: controllers/Brute.php:78
108
+ msgid "Add only real IPs. No local ips allowed."
109
+ msgstr "Adauga doar IP-uri reale. Nu sunt permise IP-uri locale."
110
+
111
+ #: controllers/Brute.php:92
112
+ msgid "You need to set a positive number of attempts "
113
+ msgstr "Trebuie să setați un număr pozitiv de încercări"
114
+
115
+ #: controllers/Brute.php:100
116
+ msgid "You need to set a positive waiting time"
117
+ msgstr "Trebuie să setați un timp de așteptare pozitiv"
118
+
119
+ #: controllers/Brute.php:107 controllers/Settings.php:261
120
+ #: controllers/Settings.php:292 controllers/Settings.php:349
121
+ #: controllers/Settings.php:362
122
+ msgid "Saved"
123
+ msgstr "Salvat"
124
+
125
+ #: controllers/Brute.php:134
126
+ msgid "Cnt"
127
+ msgstr "Cnt"
128
+
129
+ #: controllers/Brute.php:135
130
+ msgid "IP"
131
+ msgstr "IP"
132
+
133
+ #: controllers/Brute.php:136
134
+ msgid "Fail Attempts"
135
+ msgstr "Încercări cu eșec"
136
+
137
+ #: controllers/Brute.php:137
138
+ msgid "Hostname"
139
+ msgstr "Numele gazdei"
140
+
141
+ #: controllers/Brute.php:138
142
+ msgid "Options"
143
+ msgstr "Opțiuni"
144
+
145
+ #: controllers/Brute.php:160
146
+ msgid "No blacklisted ips"
147
+ msgstr "Nu există IP-uri listate negre"
148
+
149
+ #: controllers/Brute.php:202
150
+ #, php-format
151
+ msgid ""
152
+ "<strong>ERROR:</strong> Email or Password is incorrect. <br /> %d attempts "
153
+ "left before lockout"
154
+ msgstr ""
155
+ "<strong>EROARE:</strong> e-mailul sau parola sunt incorecte. <br /> % d "
156
+ "încercări rămase înainte de blocare"
157
+
158
+ #: controllers/Menu.php:66 controllers/Menu.php:175
159
+ msgid "Hide My WP - Customize Permalinks"
160
+ msgstr "Hide My WP - Personalizează legături permanente"
161
+
162
+ #: controllers/Menu.php:67 controllers/Menu.php:176
163
+ msgid "Change Paths"
164
+ msgstr "Schimbă căile"
165
+
166
+ #: controllers/Menu.php:74 controllers/Menu.php:183
167
+ msgid "Hide My WP - Mapping"
168
+ msgstr "Hide My WP - Mapping"
169
+
170
+ #: controllers/Menu.php:75 controllers/Menu.php:184 models/Settings.php:17
171
+ msgid "Mapping"
172
+ msgstr "Hartă"
173
+
174
+ #: controllers/Menu.php:82 controllers/Menu.php:191
175
+ msgid "Hide My WP - Tweaks"
176
+ msgstr "Hide My WP - Tweaks"
177
+
178
+ #: controllers/Menu.php:83 controllers/Menu.php:192 models/Settings.php:22
179
+ msgid "Tweaks"
180
+ msgstr "Alte setari"
181
+
182
+ #: controllers/Menu.php:91 controllers/Menu.php:200
183
+ msgid "Hide My WP - Brute Force Protection"
184
+ msgstr "Hide My WP - Brute Force Protection"
185
+
186
+ #: controllers/Menu.php:92 controllers/Menu.php:201
187
+ msgid "Brute Force Protection"
188
+ msgstr "Protecția cu Captcha Math"
189
+
190
+ #: controllers/Menu.php:100 controllers/Menu.php:208
191
+ msgid "Hide My WP - Log Events"
192
+ msgstr "Hide My WP - Log Evenimente"
193
+
194
+ #: controllers/Menu.php:101 controllers/Menu.php:209 models/Settings.php:32
195
+ #: view/Log.php:70
196
+ msgid "Log Events"
197
+ msgstr "Salveaza actiuni"
198
+
199
+ #: controllers/Menu.php:109 controllers/Menu.php:217
200
+ msgid "Hide My WP - Security Check"
201
+ msgstr "Hide My WP - Verificare de securitate"
202
+
203
+ #: controllers/Menu.php:110 controllers/Menu.php:218 models/Settings.php:37
204
+ #: view/Advanced.php:226 view/Mapping.php:229 view/Permalinks.php:549
205
+ #: view/Tweaks.php:178
206
+ msgid "Security Check"
207
+ msgstr "Verificare de securitate"
208
+
209
+ #: controllers/Menu.php:117 controllers/Menu.php:225
210
+ msgid "Hide My WP - Recommended Plugins"
211
+ msgstr "Hide My WP - plugin-uri recomandate"
212
+
213
+ #: controllers/Menu.php:118 controllers/Menu.php:226
214
+ msgid "Install Plugins"
215
+ msgstr "Instalați plugin-uri"
216
+
217
+ #: controllers/Menu.php:125 controllers/Menu.php:233
218
+ msgid "Hide My WP - Backup & Restore"
219
+ msgstr "Hide My WP - Backup & Restore"
220
+
221
+ #: controllers/Menu.php:126 controllers/Menu.php:234 models/Settings.php:48
222
+ msgid "Backup/Restore"
223
+ msgstr "Backup / Restore"
224
+
225
+ #: controllers/Menu.php:133 controllers/Menu.php:241
226
+ msgid "Hide My WP - Advanced Settings"
227
+ msgstr "Hide My WP - Setări avansate"
228
+
229
+ #: controllers/Menu.php:134 controllers/Menu.php:242 models/Settings.php:53
230
+ msgid "Advanced"
231
+ msgstr "Avansat"
232
+
233
+ #: controllers/Menu.php:147 controllers/Settings.php:190
234
+ msgid "Hide My WP"
235
+ msgstr "Hide My WP"
236
+
237
+ #: controllers/Notice.php:31
238
+ msgid "Close notification"
239
+ msgstr "Închide notificare"
240
+
241
+ #: controllers/Notice.php:35
242
+ msgid "Thank you for using Hide My WP?"
243
+ msgstr "Vă mulțumim că ați folosit Hide My WP"
244
+
245
+ #: controllers/Notice.php:36
246
+ #, php-format
247
+ msgid ""
248
+ "Add %sXML-RPC attack protection, SQL/Script firewall, reCaptcha login%s and "
249
+ "more with Hide My WP Ghost premium features."
250
+ msgstr ""
251
+ "Adăugați %s protecție XML-RPC împotriva atacurilor, firewall SQL / Script, "
252
+ "conectare reCaptcha %s și multe altele cu funcțiile premium Hide My WP Ghost."
253
+
254
+ #: controllers/Notice.php:37
255
+ msgid "See all premium features"
256
+ msgstr "Vedeți toate funcțiile premium"
257
+
258
+ #: controllers/SecurityCheck.php:23
259
+ msgid ""
260
+ "You should check your website every week to see if there are any security "
261
+ "changes."
262
+ msgstr ""
263
+ "Ar trebui să vă verificați site-ul web în fiecare săptămână pentru a vedea "
264
+ "dacă există modificări de securitate."
265
+
266
+ #: controllers/SecurityCheck.php:56
267
+ msgid ""
268
+ "First, you need to connect Hide My Wp with WPPlugins and switch from Default "
269
+ "mode to Lite Mode."
270
+ msgstr ""
271
+ "În primul rând, trebuie să conectați Hide My Wp cu WPPlugins și să comutați "
272
+ "din modul implicit în modul Lite."
273
+
274
+ #: controllers/SecurityCheck.php:60 view/Brute.php:30 view/Brute.php:31
275
+ #: view/Brute.php:81 view/Brute.php:94 view/Log.php:12 view/Mapping.php:88
276
+ #: view/Mapping.php:162 view/Permalinks.php:338 view/Permalinks.php:413
277
+ #: view/Permalinks.php:444 view/Tweaks.php:27
278
+ #, php-format
279
+ msgid "This feature requires %sHide My WP Ghost%s."
280
+ msgstr "Această caracteristică necesită %sHide My WP Ghost %s."
281
+
282
+ #: controllers/SecurityCheck.php:60 view/Brute.php:32 view/Brute.php:82
283
+ #: view/Brute.php:95 view/Log.php:13 view/Mapping.php:89 view/Mapping.php:163
284
+ #: view/Permalinks.php:39 view/Permalinks.php:339 view/Permalinks.php:414
285
+ #: view/Permalinks.php:445 view/Tweaks.php:28
286
+ msgid "PRO"
287
+ msgstr "PRO"
288
+
289
+ #: controllers/SecurityCheck.php:64
290
+ msgid "First, you need to switch Hide My Wp from Default mode to Lite Mode."
291
+ msgstr ""
292
+ "În primul rând, trebuie să comutați Hide My WP din modul implicit în modul "
293
+ "Lite."
294
+
295
+ #: controllers/SecurityCheck.php:105
296
+ msgid "PHP Version"
297
+ msgstr "Versiune PHP"
298
+
299
+ #: controllers/SecurityCheck.php:109
300
+ msgid ""
301
+ "Using an old version of PHP makes your site slow and prone to hacker attacks "
302
+ "due to known vulnerabilities that exist in versions of PHP that are no "
303
+ "longer maintained. <br /><br />You need <strong>PHP 7.0</strong> or higher "
304
+ "for your website."
305
+ msgstr ""
306
+ "Utilizarea unei versiuni vechi de PHP face ca site-ul dvs. să fie lent și "
307
+ "predispus la atacuri de hackeri din cauza vulnerabilităților cunoscute care "
308
+ "există în versiunile de PHP care nu mai sunt întreținute. <br /><br /> Aveți "
309
+ "nevoie de <strong>PHP 7.0</strong> sau o versiune superioară pentru site-ul "
310
+ "dvs."
311
+
312
+ #: controllers/SecurityCheck.php:110
313
+ msgid ""
314
+ "Email your hosting company and tell them you'd like to switch to a newer "
315
+ "version of PHP or move your site to a better hosting company."
316
+ msgstr ""
317
+ "Trimiteți prin e-mail companiei dvs. de găzduire și spuneți-le că doriți să "
318
+ "treceți la o versiune mai nouă de PHP sau să vă mutați site-ul către o "
319
+ "companie de găzduire mai bună."
320
+
321
+ #: controllers/SecurityCheck.php:113
322
+ msgid "Mysql Version"
323
+ msgstr "Versiunea Mysql"
324
+
325
+ #: controllers/SecurityCheck.php:117
326
+ msgid ""
327
+ "Using an old version of MySQL makes your site slow and prone to hacker "
328
+ "attacks due to known vulnerabilities that exist in versions of MySQL that "
329
+ "are no longer maintained. <br /><br />You need <strong>Mysql 5.4</strong> or "
330
+ "higher"
331
+ msgstr ""
332
+ "Utilizarea unei versiuni vechi de MySQL face ca site-ul dvs. să fie lent și "
333
+ "predispus la atacuri de hackeri din cauza vulnerabilităților cunoscute care "
334
+ "există în versiunile MySQL care nu mai sunt întreținute. <br /><br /> Aveți "
335
+ "nevoie de <strong>Mysql 5.4</strong> sau mai mare"
336
+
337
+ #: controllers/SecurityCheck.php:118
338
+ msgid ""
339
+ "Email your hosting company and tell them you'd like to switch to a newer "
340
+ "version of MySQL or move your site to a better hosting company"
341
+ msgstr ""
342
+ "Trimiteți prin e-mail companiei dvs. de găzduire și spuneți-le că doriți să "
343
+ "treceți la o versiune mai nouă de MySQL sau să vă mutați site-ul către o "
344
+ "companie de găzduire mai bună"
345
+
346
+ #: controllers/SecurityCheck.php:121
347
+ msgid "WordPress Version"
348
+ msgstr "Versiune WordPress"
349
+
350
+ #: controllers/SecurityCheck.php:125
351
+ #, php-format
352
+ msgid ""
353
+ "You should always update WordPress to the %slatest versions%s. These usually "
354
+ "include the latest security fixes, and don't alter WP in any significant "
355
+ "way. These should be applied as soon as WP releases them. <br /><br />When a "
356
+ "new version of WordPress is available, you will receive an update message on "
357
+ "your WordPress Admin screens. To update WordPress, click the link in this "
358
+ "message."
359
+ msgstr ""
360
+ "Ar trebui să actualizați WordPress întotdeauna la versiunile %slatest %s. "
361
+ "Acestea includ de obicei cele mai recente corecții de securitate și nu "
362
+ "modifică WP-ul într-un mod semnificativ. Acestea ar trebui aplicate imediat "
363
+ "ce WP le eliberează. <br /><br /> Când o nouă versiune a WordPress este "
364
+ "disponibilă, veți primi un mesaj de actualizare pe ecranele dvs. de "
365
+ "administrare WordPress. Pentru a actualiza WordPress, faceți clic pe linkul "
366
+ "din acest mesaj."
367
+
368
+ #: controllers/SecurityCheck.php:126
369
+ msgid "There is a newer version of WordPress available ({version})."
370
+ msgstr "Există o versiune mai nouă a WordPress ({versiunea})."
371
+
372
+ #: controllers/SecurityCheck.php:129
373
+ msgid "WP Debug Mode"
374
+ msgstr "Modul de depanare WP"
375
+
376
+ #: controllers/SecurityCheck.php:133
377
+ msgid ""
378
+ "Every good developer should turn on debugging before getting started on a "
379
+ "new plugin or theme. In fact, the WordPress Codex 'highly recommends' that "
380
+ "developers use WP_DEBUG. <br /><br />Unfortunately, many developers forget "
381
+ "the debug mode, even when the website is live. Showing debug logs in the "
382
+ "frontend will let hackers know a lot about your WordPress website."
383
+ msgstr ""
384
+ "Fiecare dezvoltator bun ar trebui să pornească depanarea înainte de a începe "
385
+ "un nou plugin sau o temă. De fapt, WordPress Codex „recomandă cu tărie” ca "
386
+ "dezvoltatorii să folosească WP_DEBUG. <br /><br /> Din păcate, mulți "
387
+ "dezvoltatori uită modul de debug, chiar și atunci când site-ul este live. "
388
+ "Afișarea jurnalelor de depanare în frontend va permite hackerilor să știe "
389
+ "multe despre site-ul dvs. WordPress."
390
+
391
+ #: controllers/SecurityCheck.php:134
392
+ msgid ""
393
+ "Disable WP_DEBUG for live websites in wp_config.php <code>define('WP_DEBUG', "
394
+ "false);</code>"
395
+ msgstr ""
396
+ "Dezactivați WP_DEBUG pentru site-urile web live din wp_config.php "
397
+ "<code>define('WP_DEBUG', false);</code>"
398
+
399
+ #: controllers/SecurityCheck.php:138
400
+ msgid "DB Debug Mode"
401
+ msgstr "Modul de Debug DB"
402
+
403
+ #: controllers/SecurityCheck.php:142
404
+ msgid ""
405
+ "It's not safe to have Database Debug turned on. Make sure you don't use "
406
+ "Database debug on live websites."
407
+ msgstr ""
408
+ "Nu este sigur să aveți Debug-ul de baze de date activat. Asigurați-vă că nu "
409
+ "utilizați debug-ul de baze de date pe site-urile web live."
410
+
411
+ #: controllers/SecurityCheck.php:143
412
+ #, php-format
413
+ msgid ""
414
+ "Turn off the debug plugins if your website is live. You can also switch on "
415
+ "%sHide My Wp > Tweaks > Disable DB Debug in Frontent%s"
416
+ msgstr ""
417
+ "Dezactivați plugin-urile de depanare dacă site-ul dvs. web este live. "
418
+ "Puteți, de asemenea, să activați %sHide My WP > Tweaks> Dezactivați debug-ul "
419
+ "DB în Frontent %s"
420
+
421
+ #: controllers/SecurityCheck.php:147
422
+ msgid "Script Debug Mode"
423
+ msgstr "Modul Debug Script"
424
+
425
+ #: controllers/SecurityCheck.php:151
426
+ msgid ""
427
+ "Every good developer should turn on debugging before getting started on a "
428
+ "new plugin or theme. In fact, the WordPress Codex 'highly recommends' that "
429
+ "developers use SCRIPT_DEBUG. Unfortunately, many developers forget the debug "
430
+ "mode even when the website is live. Showing debug logs in the frontend will "
431
+ "let hackers know a lot about your WordPress website."
432
+ msgstr ""
433
+ "Fiecare dezvoltator bun ar trebui să pornească depanarea înainte de a începe "
434
+ "un nou plugin sau o temă. De fapt, WordPress Codex „recomandă cu tărie” ca "
435
+ "dezvoltatorii să utilizeze SCRIPT_DEBUG. Din păcate, mulți dezvoltatori uită "
436
+ "modul de depanare chiar și atunci când site-ul este live. Afișarea "
437
+ "jurnalelor de depanare în frontend va permite hackerilor să știe multe "
438
+ "despre site-ul dvs. WordPress."
439
+
440
+ #: controllers/SecurityCheck.php:152
441
+ msgid ""
442
+ "Disable SCRIPT_DEBUG for live websites in wp_config.php "
443
+ "<code>define('SCRIPT_DEBUG', false);</code>"
444
+ msgstr ""
445
+ "Dezactivați SCRIPT_DEBUG pentru site-urile web live în wp_config.php "
446
+ "<code>define('SCRIPT_DEBUG', false);</code>"
447
+
448
+ #: controllers/SecurityCheck.php:156
449
+ msgid "display_errors PHP directive"
450
+ msgstr "display_errors Directiva PHP"
451
+
452
+ #: controllers/SecurityCheck.php:160
453
+ msgid ""
454
+ "Displaying any kind of debug info in the frontend is extremely bad. If any "
455
+ "PHP errors happen on your site they should be logged in a safe place and not "
456
+ "displayed to visitors or potential attackers."
457
+ msgstr ""
458
+ "Afișarea oricăror informații de depanare în frontend este extrem de proastă. "
459
+ "Dacă apar erori PHP pe site-ul dvs., acestea ar trebui să fie conectate într-"
460
+ "un loc sigur și să nu fie afișate vizitatorilor sau potențialilor atacatori."
461
+
462
+ #: controllers/SecurityCheck.php:161
463
+ msgid "Edit wp_config.php and add <code>ini_set('display_errors', 0);</code>"
464
+ msgstr ""
465
+ "Editați wp_config.php și adăugați <code>ini_set('display_errors', 0);</code>"
466
+
467
+ #: controllers/SecurityCheck.php:164
468
+ msgid "Backend under SSL"
469
+ msgstr "Backend sub SSL"
470
+
471
+ #: controllers/SecurityCheck.php:168
472
+ msgid ""
473
+ "SSL is an abbreviation used for Secure Sockets Layers, which are encryption "
474
+ "protocols used on the internet to secure information exchange and provide "
475
+ "certificate information.<br /><br />These certificates provide an assurance "
476
+ "to the user about the identity of the website they are communicating with. "
477
+ "SSL may also be called TLS or Transport Layer Security protocol. <br /><br /"
478
+ ">It's important to have a secure connection for the Admin Dashboard in "
479
+ "WordPress."
480
+ msgstr ""
481
+ "SSL este o prescurtare folosită pentru Secure Sockets Layers, care sunt "
482
+ "protocoale de criptare utilizate pe internet pentru securizarea schimbului "
483
+ "de informații și furnizarea informațiilor despre certificat. <br /><br /> "
484
+ "Aceste certificate oferă utilizatorului o asigurare despre identitatea site-"
485
+ "ului web cu care comunică. SSL mai poate fi denumit protocol TLS sau "
486
+ "Transport Layer Security. <br /><br /> Este important să aveți o conexiune "
487
+ "sigură pentru tabloul de bord administrat în WordPress."
488
+
489
+ #: controllers/SecurityCheck.php:169
490
+ #, php-format
491
+ msgid "Learn how to set your website as %s. %sClick Here%s"
492
+ msgstr "Aflați cum să setați site-ul dvs. ca %s. %s Faceți clic aici %s"
493
+
494
+ #: controllers/SecurityCheck.php:172
495
+ msgid "User 'admin' as Administrator"
496
+ msgstr "Utilizator 'admin' ca administrator"
497
+
498
+ #: controllers/SecurityCheck.php:176
499
+ msgid ""
500
+ "In the old days, the default WordPress admin username was 'admin'. Since "
501
+ "usernames make up half of the login credentials, this made it easier for "
502
+ "hackers to launch brute-force attacks. <br /><br />Thankfully, WordPress has "
503
+ "since changed this and now requires you to select a custom username at the "
504
+ "time of installing WordPress."
505
+ msgstr ""
506
+ "Pe vremuri, numele de utilizator WordPress admin era implicit 'admin'. "
507
+ "Întrucât numele de utilizator alcătuiesc jumătate din datele de "
508
+ "autentificare de conectare, acest lucru a făcut mai ușor pentru hackeri să "
509
+ "lanseze atacuri de forță brută. <br /><br /> Din fericire, WordPress a "
510
+ "schimbat de atunci și acum necesită să selectați un nume de utilizator "
511
+ "personalizat în momentul instalării WordPress."
512
+
513
+ #: controllers/SecurityCheck.php:177
514
+ msgid "Change the user 'admin' with another name to improve security."
515
+ msgstr ""
516
+ "Modificați utilizatorul 'admin' cu un alt nume pentru a îmbunătăți "
517
+ "securitatea."
518
+
519
+ #: controllers/SecurityCheck.php:180
520
+ msgid "Spammers can easily signup"
521
+ msgstr "Spammerii se pot înscrie cu ușurință"
522
+
523
+ #: controllers/SecurityCheck.php:184
524
+ msgid ""
525
+ "If you do not have an e-commerce, membership or guest posting website, you "
526
+ "shouldn't let users subscribe to your blog. You will end up with spam "
527
+ "registrations and your website will be filled with spammy content and "
528
+ "comments."
529
+ msgstr ""
530
+ "Dacă nu aveți un site de comerț electronic, membru sau postare de invitați, "
531
+ "nu ar trebui să lăsați utilizatorii să se aboneze la blogul dvs. Veți ajunge "
532
+ "la înregistrări spam și site-ul dvs. web va fi completat cu conținut spam și "
533
+ "comentarii."
534
+
535
+ #: controllers/SecurityCheck.php:185
536
+ #, php-format
537
+ msgid ""
538
+ "Change the signup path from %sHide My Wp > Custom Register URL%s or uncheck "
539
+ "the option %s > %s > %s"
540
+ msgstr ""
541
+ "Schimbați calea de înscriere din %sHide Wp My> Personalizează calea de "
542
+ "înregistrare %s sau debifați opțiunea %s> %s> %s"
543
+
544
+ #: controllers/SecurityCheck.php:185 controllers/SecurityCheck.php:444
545
+ msgid "General"
546
+ msgstr "General"
547
+
548
+ #: controllers/SecurityCheck.php:185
549
+ msgid "Membership"
550
+ msgstr "Abonament"
551
+
552
+ #: controllers/SecurityCheck.php:188
553
+ msgid "Outdated Plugins"
554
+ msgstr "Plugin-uri învechite"
555
+
556
+ #: controllers/SecurityCheck.php:192
557
+ msgid ""
558
+ "WordPress and its plugins and themes are like any other software installed "
559
+ "on your computer, and like any other application on your devices. "
560
+ "Periodically, developers release updates which provide new features, or fix "
561
+ "known bugs. <br /><br />These new features may not necessarily be something "
562
+ "that you want. In fact, you may be perfectly satisfied with the "
563
+ "functionality you currently have. Nevertheless, you are still likely to be "
564
+ "concerned about bugs.<br /><br />Software bugs can come in many shapes and "
565
+ "sizes. A bug could be very serious, such as preventing users from using a "
566
+ "plugin, or it could be minor and only affect a certain part of a theme, for "
567
+ "example. In some cases, bugs can cause serious security holes. <br /><br /"
568
+ ">Keeping plugins up to date is one of the most important and easiest ways to "
569
+ "keep your site secure."
570
+ msgstr ""
571
+ "WordPress și plugin-urile și temele sale sunt ca orice alt software instalat "
572
+ "pe computer și ca orice altă aplicație de pe dispozitivele tale. Periodic, "
573
+ "dezvoltatorii eliberează actualizări care furnizează noi funcții sau rezolvă "
574
+ "erorile cunoscute. <br /><br /> Aceste funcții noi pot să nu fie neapărat "
575
+ "ceva pe care îl doriți. De fapt, este posibil să fiți perfect satisfăcut de "
576
+ "funcționalitatea pe care o aveți în prezent. Cu toate acestea, sunteți încă "
577
+ "preocupat de erori. <br /><br /> Bug-urile software pot avea mai multe forme "
578
+ "și dimensiuni. Un bug ar putea fi foarte grav, cum ar fi împiedicarea "
579
+ "utilizatorilor de a utiliza un plugin sau poate fi minor și poate afecta "
580
+ "doar o anumită parte a unei teme, de exemplu. În unele cazuri, bug-urile pot "
581
+ "provoca grave găuri de securitate. <br /><br /> Menținerea plugin-urilor la "
582
+ "zi este una dintre cele mai importante și mai simple modalități de a vă "
583
+ "proteja site-ul."
584
+
585
+ #: controllers/SecurityCheck.php:193 controllers/SecurityCheck.php:201
586
+ msgid "Go to the Updates page and update all the plugins to the last version."
587
+ msgstr ""
588
+ "Accesați pagina Actualizări și actualizați toate plugin-urile la ultima "
589
+ "versiune."
590
+
591
+ #: controllers/SecurityCheck.php:196
592
+ msgid "Not Updated Plugins"
593
+ msgstr "Pluginuri neactualizate"
594
+
595
+ #: controllers/SecurityCheck.php:200
596
+ msgid ""
597
+ "Plugins that have not been updated in the last 12 months can have real "
598
+ "security problems. Make sure you use updated plugins from WordPress "
599
+ "Directory."
600
+ msgstr ""
601
+ "Pluginurile care nu au fost actualizate în ultimele 12 luni pot avea "
602
+ "probleme reale de securitate. Asigurați-vă că utilizați plugin-uri "
603
+ "actualizate din Directory WordPress."
604
+
605
+ #: controllers/SecurityCheck.php:204
606
+ msgid "Version Incompatible Plugins"
607
+ msgstr "Plugin-uri incompatibile cu versiunea"
608
+
609
+ #: controllers/SecurityCheck.php:208
610
+ msgid ""
611
+ "Plugins that are incompatible with your version of WordPress can have real "
612
+ "security problems. Make sure you use tested plugins from WordPress Directory."
613
+ msgstr ""
614
+ "Pluginurile care sunt incompatibile cu versiunea dvs. de WordPress pot avea "
615
+ "probleme reale de securitate. Asigurați-vă că utilizați plugin-uri testate "
616
+ "din Directory WordPress."
617
+
618
+ #: controllers/SecurityCheck.php:209
619
+ msgid "Make sure you use tested plugins from WordPress Directory."
620
+ msgstr "Asigurați-vă că utilizați plugin-uri testate din Directory WordPress."
621
+
622
+ #: controllers/SecurityCheck.php:212
623
+ msgid "Outdated Themes"
624
+ msgstr "Teme învechite"
625
+
626
+ #: controllers/SecurityCheck.php:216
627
+ msgid ""
628
+ "WordPress and its plugins and themes are like any other software installed "
629
+ "on your computer, and like any other application on your devices. "
630
+ "Periodically developers release updates which provide new features or fix "
631
+ "known bugs. <br /><br />New features may be something that you do not "
632
+ "necessarily want. In fact, you may be perfectly satisfied with the "
633
+ "functionality you currently have. Nevertheless, you may still be concerned "
634
+ "about bugs.<br /><br />Software bugs can come in many shapes and sizes. A "
635
+ "bug could be very serious, such as preventing users from using a plugin, or "
636
+ "it could be a minor bug that only affects a certain part of a theme, for "
637
+ "example. In some cases, bugs can even cause serious security holes.<br /"
638
+ "><br />Keeping themes up to date is one of the most important and easiest "
639
+ "ways to keep your site secure."
640
+ msgstr ""
641
+ "WordPress și plugin-urile și temele sale sunt ca orice alt software instalat "
642
+ "pe computer și ca orice altă aplicație de pe dispozitivele tale. Periodic, "
643
+ "dezvoltatorii eliberează actualizări care furnizează noi funcții sau rezolvă "
644
+ "erori cunoscute. <br /><br /> Funcțiile noi pot fi ceva ce nu doriți "
645
+ "neapărat. De fapt, este posibil să fiți perfect satisfăcut de "
646
+ "funcționalitatea pe care o aveți în prezent. Cu toate acestea, este posibil "
647
+ "să fiți încă preocupat de erori. <br /><br /> Bug-urile software pot avea "
648
+ "mai multe forme și dimensiuni. Un bug ar putea fi foarte grav, cum ar fi "
649
+ "împiedicarea utilizatorilor de a utiliza un plugin sau ar putea fi un bug "
650
+ "minor care afectează doar o anumită parte a unei teme, de exemplu. În unele "
651
+ "cazuri, bug-urile pot provoca chiar găuri de securitate grave. <br /><br /> "
652
+ "Menținerea temelor la zi este una dintre cele mai importante și mai simple "
653
+ "modalități de a vă proteja site-ul."
654
+
655
+ #: controllers/SecurityCheck.php:217
656
+ msgid "Go to the Updates page and update all the themes to the last version."
657
+ msgstr ""
658
+ "Accesați pagina Actualizări și actualizați toate temele la ultima versiune."
659
+
660
+ #: controllers/SecurityCheck.php:220
661
+ msgid "Database Prefix"
662
+ msgstr "Prefixul bazei de date"
663
+
664
+ #: controllers/SecurityCheck.php:224
665
+ msgid ""
666
+ "The WordPress database is like a brain for your entire WordPress site, "
667
+ "because every single bit of information about your site is stored there, "
668
+ "thus making it a hacker’s favorite target. <br /><br />Spammers and hackers "
669
+ "run automated code for SQL injections.<br />Unfortunately, many people "
670
+ "forget to change the database prefix when they install WordPress. <br />This "
671
+ "makes it easier for hackers to plan a mass attack by targeting the default "
672
+ "prefix <strong>wp_</strong>."
673
+ msgstr ""
674
+ "Baza de date WordPress este ca un creier pentru întregul dvs. site "
675
+ "WordPress, deoarece fiecare informație despre site-ul dvs. este stocată "
676
+ "acolo, devenind astfel o țintă preferată a hackerilor. <br /><br /> "
677
+ "Spammerii și hackerii rulează cod automat pentru injecții SQL. <br /> Din "
678
+ "păcate, mulți oameni uită să schimbe prefixul bazei de date atunci când "
679
+ "instalează WordPress. <br /> Acest lucru face mai ușor pentru hackeri să "
680
+ "planifice un atac de masă, vizând prefixul implicit <strong>wp_</strong> ."
681
+
682
+ #: controllers/SecurityCheck.php:225
683
+ #, php-format
684
+ msgid ""
685
+ "Hide My WP protects your website from most SQL injections but, if possible, "
686
+ "use a custom prefix for database tables to avoid SQL injections. %sRead more"
687
+ "%s"
688
+ msgstr ""
689
+ "Hide My WP protejează site-ul dvs. de majoritatea injecțiilor SQL, dar, dacă "
690
+ "este posibil, utilizați un prefix personalizat pentru tabelele bazei de date "
691
+ "pentru a evita injecțiile SQL. %sCitește mai mult %s"
692
+
693
+ #: controllers/SecurityCheck.php:228
694
+ msgid "Versions in Source Code"
695
+ msgstr "Versiuni în Codul Sursă"
696
+
697
+ #: controllers/SecurityCheck.php:232
698
+ msgid ""
699
+ "WordPress, plugins and themes add their version info to the source code, so "
700
+ "anyone can see it. <br /><br />Hackers can easily find a website with "
701
+ "vulnerable version plugins or themes, and target these with Zero-Day "
702
+ "Exploits."
703
+ msgstr ""
704
+ "WordPress, plugin-urile și temele adaugă informațiile versiunii lor la codul "
705
+ "sursă, astfel încât oricine să-l poată vedea. <br /><br /> Hackerii pot găsi "
706
+ "cu ușurință un site web cu plugin-uri sau teme pentru versiuni vulnerabile "
707
+ "și le pot viza cu Exploit-uri Zero-Day."
708
+
709
+ #: controllers/SecurityCheck.php:233
710
+ #, php-format
711
+ msgid "Switch on %sHide My WP > Tweaks > %s %s"
712
+ msgstr "Activați %sHide My WP> Tweaks> %s %s"
713
+
714
+ #: controllers/SecurityCheck.php:233 view/Tweaks.php:65
715
+ msgid "Hide Versions and WordPress Tags"
716
+ msgstr "Ascundeți versiunile și etichetele WordPress"
717
+
718
+ #: controllers/SecurityCheck.php:237
719
+ msgid "Salts and Security Keys valid"
720
+ msgstr "Sare și chei de securitate valabile"
721
+
722
+ #: controllers/SecurityCheck.php:241
723
+ msgid ""
724
+ "Security keys are used to ensure better encryption of information stored in "
725
+ "the user's cookies and hashed passwords. <br /><br />These make your site "
726
+ "more difficult to hack, access and crack by adding random elements to the "
727
+ "password. You don't have to remember these keys. In fact, once you set them "
728
+ "you'll never see them again. Therefore there's no excuse for not setting "
729
+ "them properly."
730
+ msgstr ""
731
+ "Cheile de securitate sunt utilizate pentru a asigura o mai bună criptare a "
732
+ "informațiilor stocate în cookie-urile utilizatorului și parolele hashed. "
733
+ "<br /><br /> Acestea fac site-ul dvs. mai dificil de hack, accesat și crack "
734
+ "prin adăugarea de elemente aleatorii la parola. Nu trebuie să vă amintiți "
735
+ "aceste chei. De fapt, odată ce le setați, nu le veți mai vedea niciodată. "
736
+ "Prin urmare, nu există nicio scuză pentru a nu le seta corect."
737
+
738
+ #: controllers/SecurityCheck.php:242
739
+ msgid ""
740
+ "Security keys are defined in wp-config.php as constants on lines. They "
741
+ "should be as unique and as long as possible. <code>AUTH_KEY,SECURE_AUTH_KEY,"
742
+ "LOGGED_IN_KEY,NONCE_KEY,AUTH_SALT,SECURE_AUTH_SALT,LOGGED_IN_SALT,"
743
+ "NONCE_SALT</code>"
744
+ msgstr ""
745
+ "Cheile de securitate sunt definite în wp-config.php ca constante pe linii. "
746
+ "Acestea ar trebui să fie cât mai unice și cât mai lungi. <code>AUTH_KEY,"
747
+ "SECURE_AUTH_KEY,LOGGED_IN_KEY,NONCE_KEY,AUTH_SALT,SECURE_AUTH_SALT,"
748
+ "LOGGED_IN_SALT,NONCE_SALT</code>"
749
+
750
+ #: controllers/SecurityCheck.php:245
751
+ msgid "Security Keys Updated"
752
+ msgstr "Cheile de securitate actualizate"
753
+
754
+ #: controllers/SecurityCheck.php:249
755
+ msgid ""
756
+ "The security keys in wp-config.php should be renewed as often as possible."
757
+ msgstr ""
758
+ "Cheile de securitate din wp-config.php ar trebui reînnoite cât mai des "
759
+ "posibil."
760
+
761
+ #: controllers/SecurityCheck.php:250
762
+ #, php-format
763
+ msgid ""
764
+ "You can generate %snew Keys from here%s <code>AUTH_KEY,SECURE_AUTH_KEY,"
765
+ "LOGGED_IN_KEY,NONCE_KEY,AUTH_SALT,SECURE_AUTH_SALT,LOGGED_IN_SALT,"
766
+ "NONCE_SALT</code>"
767
+ msgstr ""
768
+ "Puteți genera %s chei necunoscute de aici %s <code>AUTH_KEY,SECURE_AUTH_KEY,"
769
+ "LOGGED_IN_KEY,NONCE_KEY,AUTH_SALT,SECURE_AUTH_SALT,LOGGED_IN_SALT,"
770
+ "NONCE_SALT</code>"
771
+
772
+ #: controllers/SecurityCheck.php:253
773
+ msgid "WordPress dDatabase Password"
774
+ msgstr "Parolă WordPress dDatabase"
775
+
776
+ #: controllers/SecurityCheck.php:257
777
+ msgid ""
778
+ "There is no such thing as an \"unimportant password\"! The same goes for "
779
+ "your WordPress database password. <br />Although most servers are configured "
780
+ "so that the database can't be accessed from other hosts (or from outside of "
781
+ "the local network), that doesn't mean your database password should be "
782
+ "\"12345\" or no password at all."
783
+ msgstr ""
784
+ "Nu există o țparolă fără importanțăț! Același lucru este valabil și pentru "
785
+ "parola dvs. de bază de date WordPress. <br /> Deși majoritatea serverelor "
786
+ "sunt configurate astfel încât baza de date să nu poată fi accesată de la "
787
+ "alte gazde (sau din afara rețelei locale), asta nu înseamnă că parola bazei "
788
+ "dvs. de date ar trebui să fie „12345” sau deloc o parolă."
789
+
790
+ #: controllers/SecurityCheck.php:258
791
+ msgid ""
792
+ "Choose a proper database password, at least 8 characters long with a "
793
+ "combination of letters, numbers and special characters. After you change it, "
794
+ "set the new password in the wp_config.php file <code>define('DB_PASSWORD', "
795
+ "'NEW_DB_PASSWORD_GOES_HERE');</code>"
796
+ msgstr ""
797
+ "Alegeți o parolă adecvată a bazei de date, de cel puțin 8 caractere cu o "
798
+ "combinație de litere, numere și caractere speciale. După ce o schimbați, "
799
+ "setați noua parolă în fișierul wp_config.php <code>define('DB_PASSWORD', "
800
+ "'NEW_DB_PASSWORD_GOES_HERE');</code>"
801
+
802
+ #: controllers/SecurityCheck.php:269
803
+ msgid "/wp-content is visible in source code"
804
+ msgstr "/wp-content este vizibil în codul sursă"
805
+
806
+ #: controllers/SecurityCheck.php:273
807
+ msgid ""
808
+ "It's important to rename common WordPress paths, such as wp-content and wp-"
809
+ "includes to prevent hackers from knowing that you have a WordPress website."
810
+ msgstr ""
811
+ "Este important să redenumiți căile comune WordPress, cum ar fi wp-content și "
812
+ "wp-include pentru a împiedica hackerii să știe că aveți un site WordPress."
813
+
814
+ #: controllers/SecurityCheck.php:274
815
+ #, php-format
816
+ msgid ""
817
+ "Change the wp-content, wp-includes and other common paths with %sHide My Wp "
818
+ "> Permalinks%s"
819
+ msgstr ""
820
+ "Modificați wp-content, wp-include și alte căi comune cu %sHide My Wp> "
821
+ "Permalinking %s"
822
+
823
+ #: controllers/SecurityCheck.php:277
824
+ msgid "/wp-content path is accessible"
825
+ msgstr "/wp-content este accesibilă"
826
+
827
+ #: controllers/SecurityCheck.php:281
828
+ msgid ""
829
+ "It's important to hide the common WordPress paths to prevent attacks on "
830
+ "vulnerable plugins and themes. <br /> Also, it's important to hide the names "
831
+ "of plugins and themes to make it impossible for bots to detect them."
832
+ msgstr ""
833
+ "Este important să ascundeți căile comune WordPress pentru a preveni "
834
+ "atacurile asupra plugin-urilor și temelor vulnerabile. <br /> De asemenea, "
835
+ "este important să ascundeți numele de plugin-uri și teme pentru a face "
836
+ "imposibilă detectarea de către roboți."
837
+
838
+ #: controllers/SecurityCheck.php:282
839
+ #, php-format
840
+ msgid ""
841
+ "Switch on %sHide My Wp > Hide WordPress Common Paths%s to hide the old paths"
842
+ msgstr ""
843
+ "Activează %sHide My Wp> Ascunde căile comune WordPress %s pentru a ascunde "
844
+ "căile vechi"
845
+
846
+ #: controllers/SecurityCheck.php:286 controllers/SecurityCheck.php:294
847
+ #, php-format
848
+ msgid "%s is visible in source code"
849
+ msgstr "%s este vizibil în codul sursă"
850
+
851
+ #: controllers/SecurityCheck.php:290
852
+ #, php-format
853
+ msgid ""
854
+ "Having the admin URL visible in the source code it's really bad because "
855
+ "hackers will immediately know your secret admin path and start a Brute Force "
856
+ "attack. The custom admin path should not appear in the ajax URL. <br /><br /"
857
+ ">Find solutions for %show to hide the path from source code%s."
858
+ msgstr ""
859
+ "Dacă URL-ul admin este vizibil în codul sursă, este foarte rău, deoarece "
860
+ "hackerii vor cunoaște imediat calea ta secretă de administrare și vor începe "
861
+ "un atac al Forței Brute. Calea de administrare personalizată nu trebuie să "
862
+ "apară pe adresa URL ajax. <br /><br /> Găsiți soluții pentru %show pentru a "
863
+ "ascunde calea de codul sursă %s."
864
+
865
+ #: controllers/SecurityCheck.php:291
866
+ #, php-format
867
+ msgid ""
868
+ "Switch on %sHide My WP > Permalinks > Hide wp-admin from ajax URL%s. Hide "
869
+ "any reference to admin path from the installed plugins."
870
+ msgstr ""
871
+ "Activați %sHide My WP> Legături permanente> Ascunde wp-admin de la URL-ul "
872
+ "ajax %s. Ascundeți orice referință la calea admin din plugin-urile instalate."
873
+
874
+ #: controllers/SecurityCheck.php:298
875
+ #, php-format
876
+ msgid ""
877
+ "Having the login URL visible in the source code it's really bad because "
878
+ "hackers will immediately know your secret login path and start a Brute Force "
879
+ "attack. <br /><br />The custom login path should be kept secret and with the "
880
+ "Brute Force Protection activated for it. <br ><br />Find solutions for %show "
881
+ "to hide the path from source code%s."
882
+ msgstr ""
883
+ "Dacă adresa URL de conectare este vizibilă în codul sursă, este într-adevăr "
884
+ "rău, deoarece hackerii vor cunoaște imediat calea ta de conectare secretă și "
885
+ "vor începe un atac Brute Force. <br /><br /> Calea de conectare "
886
+ "personalizată ar trebui să fie ținută secretă și cu Brute Force Protection "
887
+ "activată pentru aceasta. <br ><br /> Găsiți soluții pentru %show pentru a "
888
+ "ascunde calea de codul sursă %s."
889
+
890
+ #: controllers/SecurityCheck.php:299
891
+ #, php-format
892
+ msgid "%sHide the login path%s from theme menu or widget."
893
+ msgstr "%s Ascunde login %s din meniul tematic sau widget."
894
+
895
+ #: controllers/SecurityCheck.php:302
896
+ msgid "/wp-login path is accessible"
897
+ msgstr "/wp-login este accesibilă"
898
+
899
+ #: controllers/SecurityCheck.php:306
900
+ msgid ""
901
+ "If your site allows user logins, you need your login page to be easy to find "
902
+ "for your users. You also need to do other things to protect against "
903
+ "malicious login attempts. <br /><br />However, obscurity is a valid security "
904
+ "layer when used as part of a comprehensive security strategy, and if you "
905
+ "want to cut down on the number of malicious login attempts. Making your "
906
+ "login page difficult to find is one way to do that."
907
+ msgstr ""
908
+ "Dacă site-ul dvs. permite conectarea utilizatorilor, aveți nevoie de pagina "
909
+ "dvs. de conectare pentru a fi ușor de găsit pentru utilizatorii dvs. De "
910
+ "asemenea, trebuie să faceți alte lucruri pentru a vă proteja împotriva "
911
+ "încercărilor de conectare rău intenționate. <br /><br /> Cu toate acestea, "
912
+ "obscuritatea este un strat de securitate valid atunci când este utilizată ca "
913
+ "parte a unei strategii de securitate cuprinzătoare și dacă doriți să "
914
+ "reduceți numărul de încercări de conectare rău intenționate. A face dificilă "
915
+ "găsirea paginii de conectare este o modalitate de a face acest lucru."
916
+
917
+ #: controllers/SecurityCheck.php:307
918
+ #, php-format
919
+ msgid ""
920
+ "Change the wp-login from %sHide My Wp > Custom login URL%s and Switch on "
921
+ "%sHide My Wp > Brute Force Protection%s"
922
+ msgstr ""
923
+ "Modificați wp-login din %sHide My Wp> Personalizează login URL %s și porniți "
924
+ "%sHide My Wp> Brute Force Protection %s"
925
+
926
+ #: controllers/SecurityCheck.php:310
927
+ msgid "/wp_config.php file is writable"
928
+ msgstr "Fișierul /wp_config.php este accesibil pentru scriere"
929
+
930
+ #: controllers/SecurityCheck.php:314
931
+ msgid ""
932
+ "One of the most important files in your WordPress installation is the wp-"
933
+ "config.php file. <br />This file is located in the root directory of your "
934
+ "WordPress installation, and contains your website's base configuration "
935
+ "details, such as database connection information."
936
+ msgstr ""
937
+ "Unul dintre cele mai importante fișiere din instalarea dvs. WordPress este "
938
+ "fișierul wp-config.php. <br /> Acest fișier este localizat în directorul "
939
+ "rădăcină al instalării WordPress și conține detaliile de configurare de bază "
940
+ "ale site-ului dvs., cum ar fi informațiile despre conexiunea bazei de date."
941
+
942
+ #: controllers/SecurityCheck.php:315
943
+ #, php-format
944
+ msgid ""
945
+ "Try setting chmod to %s0400%s or %s0440%s and if the website works normally "
946
+ "that's the best one to use."
947
+ msgstr ""
948
+ "Încercați să setați chmod la %s0400 %s sau %s0440 %s și dacă site-ul web "
949
+ "funcționează normal, acesta este cel mai bun de utilizat."
950
+
951
+ #: controllers/SecurityCheck.php:318
952
+ msgid "wp-config.php & wp-config-sample.php files are accessible "
953
+ msgstr "Fișierele wp-config.php și wp-config-sample.php sunt accesibile "
954
+
955
+ #: controllers/SecurityCheck.php:322
956
+ msgid ""
957
+ "One of the most important files in your WordPress installation is the wp-"
958
+ "config.php file. <br />This file is located in the root directory of your "
959
+ "WordPress installation and contains your website's base configuration "
960
+ "details, such as database connection information."
961
+ msgstr ""
962
+ "Unul dintre cele mai importante fișiere din instalarea dvs. WordPress este "
963
+ "fișierul wp-config.php. <br /> Acest fișier este localizat în directorul "
964
+ "rădăcină al instalării WordPress și conține detaliile de configurare de bază "
965
+ "ale site-ului dvs., cum ar fi informațiile despre conexiunea bazei de date."
966
+
967
+ #: controllers/SecurityCheck.php:323
968
+ #, php-format
969
+ msgid ""
970
+ "Switch on %sHide My Wp > Hide WordPress Common Files%s to hide wp-config.php "
971
+ "& wp-config-sample.php files"
972
+ msgstr ""
973
+ "Activează %sHide My Wp> Ascunde fișierele comune %s pentru a ascunde "
974
+ "fișierele wp-config.php & wp-config-sample.php"
975
+
976
+ #: controllers/SecurityCheck.php:327
977
+ msgid "readme.html file is accessible "
978
+ msgstr "fișierul readme.html este accesibil"
979
+
980
+ #: controllers/SecurityCheck.php:331
981
+ msgid ""
982
+ "It's important to hide or remove the readme.html file because it contains WP "
983
+ "version details."
984
+ msgstr ""
985
+ "Este important să ascundeți sau să eliminați fișierul readme.html, deoarece "
986
+ "conține detalii despre versiunea WP."
987
+
988
+ #: controllers/SecurityCheck.php:332
989
+ #, php-format
990
+ msgid ""
991
+ "Rename readme.html file or switch on %sHide My Wp > Hide WordPress Common "
992
+ "Files%s"
993
+ msgstr ""
994
+ "Redenumește fișierul readme.html sau pornește %sHide My Wp> Ascunde "
995
+ "fișierele comune WordPress %s"
996
+
997
+ #: controllers/SecurityCheck.php:336
998
+ msgid "install.php & upgrade.php files are accessible "
999
+ msgstr "Fișierele install.php & upgrade.php sunt accesibile"
1000
+
1001
+ #: controllers/SecurityCheck.php:340
1002
+ msgid ""
1003
+ "WordPress is well-known for its ease of installation. <br/>It's important to "
1004
+ "hide the wp-admin/install.php and wp-admin/upgrade.php files because there "
1005
+ "have already been a couple of security issues regarding these files."
1006
+ msgstr ""
1007
+ "WordPress este bine-cunoscut pentru ușurința sa de instalare. <br/> Este "
1008
+ "important să ascundeți fișierele wp-admin/install.php și wp-admin/upgrade."
1009
+ "php, deoarece au existat deja câteva probleme de securitate cu privire la "
1010
+ "aceste fișiere."
1011
+
1012
+ #: controllers/SecurityCheck.php:341
1013
+ #, php-format
1014
+ msgid ""
1015
+ "Switch on %sHide My Wp > Hide WordPress Common Files%s to hide wp-admin/"
1016
+ "install.php & wp-admin/upgrade.php files"
1017
+ msgstr ""
1018
+ "Activează %sHide My Wp> Ascunde fișierele comune %s pentru a ascunde "
1019
+ "fișierele wp-admin/install.php & wp-admin/upgrade.php"
1020
+
1021
+ #: controllers/SecurityCheck.php:345
1022
+ msgid "PHP register_globals is on"
1023
+ msgstr "PHP register_globals este activat"
1024
+
1025
+ #: controllers/SecurityCheck.php:349
1026
+ msgid ""
1027
+ "This is one of the biggest security issues you can have on your site! If "
1028
+ "your hosting company has this directive enabled by default, switch to "
1029
+ "another company immediately!"
1030
+ msgstr ""
1031
+ "Aceasta este una dintre cele mai mari probleme de securitate pe care le "
1032
+ "puteți avea pe site-ul dvs.! Dacă compania dvs. de găzduire are această "
1033
+ "directivă activată în mod implicit, treceți imediat la o altă companie!"
1034
+
1035
+ #: controllers/SecurityCheck.php:350
1036
+ msgid ""
1037
+ "If you have access to php.ini file, set <code>register_globals = off</code> "
1038
+ "or contact the hosting company to set it off"
1039
+ msgstr ""
1040
+ "Dacă aveți acces la fișierul php.ini, setați <code>register_globals = off</"
1041
+ "code> sau contactați compania gazdă pentru a-l opri"
1042
+
1043
+ #: controllers/SecurityCheck.php:353
1044
+ msgid "PHP expose_php is on"
1045
+ msgstr "PHP expose_php este activ"
1046
+
1047
+ #: controllers/SecurityCheck.php:357
1048
+ msgid ""
1049
+ "Exposing the PHP version will make the job of attacking your site much "
1050
+ "easier."
1051
+ msgstr "Expunerea versiunii PHP va facilita munca de a vă ataca site-ul."
1052
+
1053
+ #: controllers/SecurityCheck.php:358
1054
+ msgid ""
1055
+ "If you have access to php.ini file, set <code>expose_php = off</code> or "
1056
+ "contact the hosting company to set it off"
1057
+ msgstr ""
1058
+ "Dacă aveți acces la fișierul php.ini, setați <code>expose_php = off</code> "
1059
+ "sau contactați compania de găzduire pentru a-l opri"
1060
+
1061
+ #: controllers/SecurityCheck.php:361
1062
+ msgid "PHP safe_mode is on"
1063
+ msgstr "PHP safe_mode este activ"
1064
+
1065
+ #: controllers/SecurityCheck.php:365
1066
+ msgid ""
1067
+ "PHP safe mode was one of the attempts to solve security problems of shared "
1068
+ "web hosting servers. <br /><br />It is still being used by some web hosting "
1069
+ "providers, however, nowadays this is regarded as improper. A systematic "
1070
+ "approach proves that it’s architecturally incorrect to try solving complex "
1071
+ "security issues at the PHP level, rather than at the web server and OS "
1072
+ "levels.<br /><br />Technically, safe mode is a PHP directive that restricts "
1073
+ "the way some built-in PHP functions operate. The main problem here is "
1074
+ "inconsistency. When turned on, PHP safe mode may prevent many legitimate PHP "
1075
+ "functions from working correctly. At the same time there exists a variety of "
1076
+ "methods to override safe mode limitations using PHP functions that aren’t "
1077
+ "restricted, so if a hacker has already got in – safe mode is useless."
1078
+ msgstr ""
1079
+ "Modul sigur PHP a fost una dintre încercările de a rezolva problemele de "
1080
+ "securitate ale serverelor de găzduire web partajate. <br /><br /> Încă este "
1081
+ "folosit de unii furnizori de găzduire web, cu toate acestea, astăzi acest "
1082
+ "lucru este considerat ca fiind impropriu. O abordare sistematică dovedește "
1083
+ "că este incorect din punct de vedere arhitectural să încerci să rezolvi "
1084
+ "probleme complexe de securitate la nivelul PHP, mai degrabă decât la "
1085
+ "serverul web și nivelurile de sistem de operare. <br /><br /> Tehnic, modul "
1086
+ "sigur este o directivă PHP care restricționează modul în care funcționează "
1087
+ "unele funcții PHP încorporate. Problema principală aici este inconsistența. "
1088
+ "Când este pornit, modul PHP sigur poate împiedica multe funcții PHP legitime "
1089
+ "să funcționeze corect. În același timp, există o varietate de metode pentru "
1090
+ "a trece peste limitele modului sigur folosind funcțiile PHP care nu sunt "
1091
+ "restricționate, deci dacă un hacker a intrat deja - modul sigur nu este "
1092
+ "inutil."
1093
+
1094
+ #: controllers/SecurityCheck.php:366
1095
+ msgid ""
1096
+ "If you have access to php.ini file, set <code>safe_mode = off</code> or "
1097
+ "contact the hosting company to set it off"
1098
+ msgstr ""
1099
+ "Dacă aveți acces la fișierul php.ini, setați <code>safe_mode = off</code> "
1100
+ "sau contactați compania gazdă pentru a-l opri"
1101
+
1102
+ #: controllers/SecurityCheck.php:369
1103
+ msgid "PHP allow_url_include is on"
1104
+ msgstr "PHP allow_url_include este activat"
1105
+
1106
+ #: controllers/SecurityCheck.php:373
1107
+ msgid ""
1108
+ "Having this PHP directive enabled will leave your site exposed to cross-site "
1109
+ "attacks (XSS). <br /><br />There's absolutely no valid reason to enable this "
1110
+ "directive, and using any PHP code that requires it is very risky."
1111
+ msgstr ""
1112
+ "Dacă această directivă PHP este activată, vă va lăsa site-ul expus la "
1113
+ "atacuri cross-site (XSS). <br /><br /> Nu există absolut niciun motiv valid "
1114
+ "pentru a activa această directivă, iar utilizarea oricărui cod PHP care "
1115
+ "necesită este foarte riscantă."
1116
+
1117
+ #: controllers/SecurityCheck.php:374
1118
+ msgid ""
1119
+ "If you have access to php.ini file, set <code>allow_url_include = off</code> "
1120
+ "or contact the hosting company to set it off"
1121
+ msgstr ""
1122
+ "Dacă aveți acces la fișierul php.ini, setați <code>allow_url_include = off</"
1123
+ "code> sau contactați compania gazdă pentru a-l opri"
1124
+
1125
+ #: controllers/SecurityCheck.php:377
1126
+ msgid "Plugins/Themes editor enabled"
1127
+ msgstr "Editorul de plugin-uri / teme este activat"
1128
+
1129
+ #: controllers/SecurityCheck.php:381
1130
+ msgid ""
1131
+ "The plugins and themes file editor is a very convenient tool because it "
1132
+ "enables you to make quick changes without the need to use FTP. <br /><br /"
1133
+ ">Unfortunately, it's also a security issue because it not only shows the PHP "
1134
+ "source code, it also enables attackers to inject malicious code into your "
1135
+ "site if they manage to gain access to admin."
1136
+ msgstr ""
1137
+ "Editorul de fișiere cu plugin-uri și teme este un instrument foarte "
1138
+ "convenabil, deoarece vă permite să faceți modificări rapide, fără a fi "
1139
+ "nevoie să utilizați FTP. <br /><br /> Din păcate, este și o problemă de "
1140
+ "securitate, deoarece nu numai că afișează codul sursă PHP, ci permite și "
1141
+ "atacatorilor să injecteze cod rău intenționat pe site-ul dvs., dacă reușesc "
1142
+ "să obțină acces la administrator."
1143
+
1144
+ #: controllers/SecurityCheck.php:382
1145
+ msgid ""
1146
+ "Disable DISALLOW_FILE_EDIT for live websites in wp_config.php "
1147
+ "<code>define('DISALLOW_FILE_EDIT', true);</code>"
1148
+ msgstr ""
1149
+ "Dezactivează DISALLOW_FILE_EDIT pentru site-urile web live din wp_config.php "
1150
+ "<code>define('DISALLOW_FILE_EDIT', true);</code>"
1151
+
1152
+ #: controllers/SecurityCheck.php:386
1153
+ #, php-format
1154
+ msgid "Folder %s is browsable "
1155
+ msgstr "Dosarul %s este accesibil"
1156
+
1157
+ #: controllers/SecurityCheck.php:390
1158
+ msgid ""
1159
+ "Allowing anyone to view all files in the Uploads folder with a browser will "
1160
+ "allow them to easily download all your uploaded files. It's a security and a "
1161
+ "copyright issue."
1162
+ msgstr ""
1163
+ "Permiterea oricui să vizualizeze toate fișierele din folderul Uploads cu un "
1164
+ "browser le va permite să descarce cu ușurință toate fișierele încărcate. "
1165
+ "Este o problemă de securitate și de copyright."
1166
+
1167
+ #: controllers/SecurityCheck.php:391
1168
+ #, php-format
1169
+ msgid "Learn how to disable %sDirectory Browsing%s"
1170
+ msgstr "Aflați cum să dezactivați %s Navigarea directoare %s"
1171
+
1172
+ #: controllers/SecurityCheck.php:395
1173
+ msgid "Windows Live Writer is on "
1174
+ msgstr "Windows Live Writer este activ"
1175
+
1176
+ #: controllers/SecurityCheck.php:399
1177
+ msgid ""
1178
+ "If you're not using Windows Live Writer there's really no valid reason to "
1179
+ "have its link in the page header, because this tells the whole world you're "
1180
+ "using WordPress."
1181
+ msgstr ""
1182
+ "Dacă nu utilizați Windows Live Writer, nu există niciun motiv valid pentru a "
1183
+ "avea legătura sa în antetul paginii, deoarece acest lucru spune întreaga "
1184
+ "lume pe care o utilizați WordPress."
1185
+
1186
+ #: controllers/SecurityCheck.php:400
1187
+ #, php-format
1188
+ msgid "Switch on %sHide My Wp > Tweaks > Disable WLW Manifest scripts%s"
1189
+ msgstr "Activați %sHide My Wp> Tweaks> Dezactivați scripturile WLW Manifest %s"
1190
+
1191
+ #: controllers/SecurityCheck.php:404
1192
+ msgid "XML-RPC access is on"
1193
+ msgstr "Dezactivează accesul XML-RPC"
1194
+
1195
+ #: controllers/SecurityCheck.php:408
1196
+ msgid ""
1197
+ "WordPress XML-RPC is a specification that aims to standardize communications "
1198
+ "between different systems. It uses HTTP as the transport mechanism and XML "
1199
+ "as encoding mechanism to enable a wide range of data to be transmitted. <br /"
1200
+ "><br />The two biggest assets of the API are its extendibility and its "
1201
+ "security. XML-RPC authenticates using basic authentication. It sends the "
1202
+ "username and password with each request, which is a big no-no in security "
1203
+ "circles."
1204
+ msgstr ""
1205
+ "WordPress XML-RPC este o specificație care își propune să standardizeze "
1206
+ "comunicațiile între diferite sisteme. Utilizează HTTP ca mecanism de "
1207
+ "transport și XML ca mecanism de codificare pentru a permite o gamă largă de "
1208
+ "date să fie transmise. <br /><br /> Cele două mari active ale API sunt "
1209
+ "extensibilitatea și securitatea sa. XML-RPC se autentifică folosind "
1210
+ "autentificarea de bază. Acesta trimite numele de utilizator și parola cu "
1211
+ "fiecare cerere, care este un număr mare în cercurile de securitate."
1212
+
1213
+ #: controllers/SecurityCheck.php:409
1214
+ #, php-format
1215
+ msgid "Switch on %sHide My Wp > Tweaks > Disable XML-RPC access%s"
1216
+ msgstr "Activați %sHide My Wp> Tweaks> Dezactivați accesul XML-RPC %s"
1217
+
1218
+ #: controllers/SecurityCheck.php:413
1219
+ msgid "RDS is visible"
1220
+ msgstr "RDS este vizibil"
1221
+
1222
+ #: controllers/SecurityCheck.php:417
1223
+ msgid ""
1224
+ "If you're not using any Really Simple Discovery services such as pingbacks, "
1225
+ "there's no need to advertise that endpoint (link) in the header. Please note "
1226
+ "that for most sites this is not a security issue because they \"want to be "
1227
+ "discovered\", but if you want to hide the fact that you're using WP, this is "
1228
+ "the way to go."
1229
+ msgstr ""
1230
+ "Dacă nu utilizați niciun serviciu de descoperire într-adevăr simplă, cum ar "
1231
+ "fi pingbacks, nu este necesar să faceți publicitate acel punct (link) în "
1232
+ "antet. Vă rugăm să rețineți că pentru majoritatea site-urilor nu este o "
1233
+ "problemă de securitate, deoarece „vor să fie descoperite”, dar dacă doriți "
1234
+ "să ascundeți faptul că utilizați WP, acesta este calea de urmat."
1235
+
1236
+ #: controllers/SecurityCheck.php:418
1237
+ #, php-format
1238
+ msgid "Switch on %sHide My Wp > Tweaks > Hide RSD header%s"
1239
+ msgstr "Activați %sHide My Wp> Tweaks > Ascunde antetul RSD %s"
1240
+
1241
+ #: controllers/SecurityCheck.php:422
1242
+ msgid "MySql Grant All Permissions"
1243
+ msgstr "MySql Acordă toate permisiunile"
1244
+
1245
+ #: controllers/SecurityCheck.php:426
1246
+ msgid ""
1247
+ "If an attacker gains access to your wp-config.php file and gets the MySQL "
1248
+ "username and password, he'll be able to login to that database and do "
1249
+ "whatever that account allows. <br /><br />That's why it's important to keep "
1250
+ "the account's privileges to a bare minimum.<br /><br />For instance, if "
1251
+ "you're not installing any new plugins or updating WP, that account doesn't "
1252
+ "need the CREATE or DROP table privileges.<br /><br />For regular, day-to-day "
1253
+ "usage these are the recommended privileges: SELECT, INSERT, UPDATE and "
1254
+ "DELETE."
1255
+ msgstr ""
1256
+ "Dacă un atacator câștigă acces la fișierul dvs. wp-config.php și primește "
1257
+ "numele de utilizator și parola MySQL, va putea să se conecteze la acea bază "
1258
+ "de date și să facă tot ce permite acest cont. <br /><br /> De aceea, este "
1259
+ "important să păstrezi privilegiile contului la un nivel minim. <br /><br /> "
1260
+ "De exemplu, dacă nu instalați plugin-uri noi sau actualizați WP, acel cont "
1261
+ "nu are nevoie de privilegiile CREATE sau DROP. <br /><br /> Pentru "
1262
+ "utilizarea obișnuită zilnică, acestea sunt privilegiile recomandate: SELECT, "
1263
+ "INSERT, UPDATE și DELETE."
1264
+
1265
+ #: controllers/SecurityCheck.php:427
1266
+ #, php-format
1267
+ msgid "To learn how to revoke permissions from PhpMyAdmin %sClick here%s"
1268
+ msgstr ""
1269
+ "Pentru a afla cum să revocați permisiunile de la PhpMyAdmin %s Faceți clic "
1270
+ "aici %s"
1271
+
1272
+ #: controllers/SecurityCheck.php:430
1273
+ msgid "Author URL by ID access"
1274
+ msgstr "URL-ul autorului prin acces ID"
1275
+
1276
+ #: controllers/SecurityCheck.php:434
1277
+ msgid ""
1278
+ "Usernames (unlike passwords) are not secret. By knowing someone's username, "
1279
+ "you can't log in to their account. You also need the password. <br /><br /"
1280
+ ">However, by knowing the username, you are one step closer to logging in "
1281
+ "using the username to brute-force the password, or to gain access in a "
1282
+ "similar way. <br /><br />That's why it's advisable to keep the list of "
1283
+ "usernames private, at least to some degree. By default, by accessing siteurl."
1284
+ "com/?author={id} and looping through IDs from 1 you can get a list of "
1285
+ "usernames, because WP will redirect you to siteurl.com/author/user/ if the "
1286
+ "ID exists in the system."
1287
+ msgstr ""
1288
+ "Numele de utilizator (spre deosebire de parolele) nu sunt secrete. Cunoscând "
1289
+ "numele de utilizator al cuiva, nu vă puteți autentifica în contul său. De "
1290
+ "asemenea, aveți nevoie de parola. <br /><br /> Cu toate acestea, cunoscând "
1291
+ "numele de utilizator, sunteți cu un pas mai aproape de a vă autentifica "
1292
+ "folosind numele de utilizator pentru a forța parola brută sau pentru a "
1293
+ "obține acces într-un mod similar. <br /><br /> De aceea este recomandabil să "
1294
+ "păstrați lista de nume de utilizator private, cel puțin într-o oarecare "
1295
+ "măsură. În mod implicit, accesând siteurl.com/?author=obileid} și făcând o "
1296
+ "buclă de ID-uri de la 1 puteți obține o listă de nume de utilizator, "
1297
+ "deoarece WP vă va redirecționa către siteurl.com/author/user/ dacă ID-ul "
1298
+ "există în sistem ."
1299
+
1300
+ #: controllers/SecurityCheck.php:435
1301
+ #, php-format
1302
+ msgid "Switch on %sHide My Wp > Hide Author ID URL%s"
1303
+ msgstr "Activați %sHide My Wp> Ascundeți ID-ul autorului %s"
1304
+
1305
+ #: controllers/SecurityCheck.php:439
1306
+ msgid "Default WordPress Tagline"
1307
+ msgstr "Etichetă WordPress implicită"
1308
+
1309
+ #: controllers/SecurityCheck.php:443
1310
+ msgid ""
1311
+ "The WordPress site tagline is a short phrase located under the site title, "
1312
+ "similar to a subtitle or advertising slogan. The goal of a tagline is to "
1313
+ "convey the essence of your site to visitors. <br /><br />If you don't change "
1314
+ "the default tagline it will be very easy to detect that your website was "
1315
+ "actually built with WordPress"
1316
+ msgstr ""
1317
+ "Eticheta site-ului WordPress este o frază scurtă situată sub titlul site-"
1318
+ "ului, asemănătoare cu un subtitlu sau slogan publicitar. Scopul unei linii "
1319
+ "de etichete este de a transmite vizitatilor esența site-ului dvs. <br /><br /"
1320
+ "> Dacă nu schimbați marcajul implicit, va fi foarte ușor să detectați că "
1321
+ "site-ul dvs. web a fost de fapt creat cu WordPress"
1322
+
1323
+ #: controllers/SecurityCheck.php:444
1324
+ #, php-format
1325
+ msgid "Change the Tagline in %s > %s"
1326
+ msgstr "Modificați eticheta în %s> %s"
1327
+
1328
+ #: controllers/SecurityCheck.php:444
1329
+ msgid "Tagline"
1330
+ msgstr "Slogan"
1331
+
1332
+ #: controllers/SecurityCheck.php:521 controllers/SecurityCheck.php:549
1333
+ #: controllers/SecurityCheck.php:574
1334
+ msgid "Saved! You can run the test again."
1335
+ msgstr "Salvat! Puteți rula testul din nou."
1336
+
1337
+ #: controllers/SecurityCheck.php:526 controllers/SecurityCheck.php:553
1338
+ msgid "Could not fix it. You need to change it yourself."
1339
+ msgstr "Nu s-a putut rezolva. Trebuie să-l schimbi singur."
1340
+
1341
+ #: controllers/SecurityCheck.php:567
1342
+ msgid "Saved! This task will be ignored on future tests."
1343
+ msgstr "Salvat! Această sarcină va fi ignorată la testele viitoare."
1344
+
1345
+ #: controllers/SecurityCheck.php:621 controllers/SecurityCheck.php:639
1346
+ #: controllers/SecurityCheck.php:653 controllers/SecurityCheck.php:666
1347
+ #: controllers/SecurityCheck.php:678 controllers/SecurityCheck.php:923
1348
+ #: controllers/SecurityCheck.php:1005 controllers/SecurityCheck.php:1021
1349
+ #: controllers/SecurityCheck.php:1029 controllers/SecurityCheck.php:1105
1350
+ #: controllers/SecurityCheck.php:1118 controllers/SecurityCheck.php:1132
1351
+ #: controllers/SecurityCheck.php:1145 controllers/SecurityCheck.php:1157
1352
+ #: controllers/SecurityCheck.php:1162 controllers/SecurityCheck.php:1187
1353
+ #: controllers/SecurityCheck.php:1212 controllers/SecurityCheck.php:1226
1354
+ #: controllers/SecurityCheck.php:1240 controllers/SecurityCheck.php:1257
1355
+ #: controllers/SecurityCheck.php:1289 controllers/SecurityCheck.php:1311
1356
+ #: controllers/SecurityCheck.php:1333 controllers/SecurityCheck.php:1355
1357
+ #: controllers/SecurityCheck.php:1375 controllers/SecurityCheck.php:1397
1358
+ #: controllers/SecurityCheck.php:1411 controllers/SecurityCheck.php:1420
1359
+ msgid "Yes"
1360
+ msgstr "Da"
1361
+
1362
+ #: controllers/SecurityCheck.php:621 controllers/SecurityCheck.php:639
1363
+ #: controllers/SecurityCheck.php:653 controllers/SecurityCheck.php:666
1364
+ #: controllers/SecurityCheck.php:678 controllers/SecurityCheck.php:1005
1365
+ #: controllers/SecurityCheck.php:1021 controllers/SecurityCheck.php:1029
1366
+ #: controllers/SecurityCheck.php:1105 controllers/SecurityCheck.php:1118
1367
+ #: controllers/SecurityCheck.php:1132 controllers/SecurityCheck.php:1145
1368
+ #: controllers/SecurityCheck.php:1157 controllers/SecurityCheck.php:1182
1369
+ #: controllers/SecurityCheck.php:1192 controllers/SecurityCheck.php:1212
1370
+ #: controllers/SecurityCheck.php:1226 controllers/SecurityCheck.php:1240
1371
+ #: controllers/SecurityCheck.php:1289 controllers/SecurityCheck.php:1311
1372
+ #: controllers/SecurityCheck.php:1333 controllers/SecurityCheck.php:1355
1373
+ #: controllers/SecurityCheck.php:1375 controllers/SecurityCheck.php:1397
1374
+ #: controllers/SecurityCheck.php:1411 controllers/SecurityCheck.php:1420
1375
+ msgid "No"
1376
+ msgstr "Nu"
1377
+
1378
+ #: controllers/SecurityCheck.php:747
1379
+ #, php-format
1380
+ msgid "%s plugin are outdated: %s"
1381
+ msgstr "Pluginul %s este învechit: %s"
1382
+
1383
+ #: controllers/SecurityCheck.php:747 controllers/SecurityCheck.php:823
1384
+ msgid "All plugins are up to date"
1385
+ msgstr "Toate plugin-urile sunt la zi"
1386
+
1387
+ #: controllers/SecurityCheck.php:780
1388
+ #, php-format
1389
+ msgid "%s theme(s) are outdated: %s"
1390
+ msgstr "%s tema (temele) sunt depășite: %s"
1391
+
1392
+ #: controllers/SecurityCheck.php:780
1393
+ msgid "Themes are up to date"
1394
+ msgstr "Temele sunt la zi"
1395
+
1396
+ #: controllers/SecurityCheck.php:859
1397
+ msgid "All plugins are compatible"
1398
+ msgstr "Toate plugin-urile sunt compatibile"
1399
+
1400
+ #: controllers/SecurityCheck.php:944
1401
+ #, php-format
1402
+ msgid "%s days since last update"
1403
+ msgstr "%s zile de la ultima actualizare"
1404
+
1405
+ #: controllers/SecurityCheck.php:944
1406
+ msgid "Updated"
1407
+ msgstr "Actualizat"
1408
+
1409
+ #: controllers/SecurityCheck.php:961
1410
+ msgid "Empty"
1411
+ msgstr "Gol"
1412
+
1413
+ #: controllers/SecurityCheck.php:966
1414
+ msgid "only "
1415
+ msgstr "numai "
1416
+
1417
+ #: controllers/SecurityCheck.php:971
1418
+ msgid "too simple"
1419
+ msgstr "prea simplu"
1420
+
1421
+ #: controllers/SecurityCheck.php:976
1422
+ msgid "Good"
1423
+ msgstr "Bun"
1424
+
1425
+ #: controllers/SecurityCheck.php:1023
1426
+ msgid ""
1427
+ "Change the wp-config.php file permission to Read-Only using File Manager."
1428
+ msgstr ""
1429
+ "Modificați permisiunea fișierului wp-config.php în Read-Only numai cu File "
1430
+ "Manager."
1431
+
1432
+ #: controllers/SecurityCheck.php:1265
1433
+ msgid "no"
1434
+ msgstr "nu"
1435
+
1436
+ #: controllers/SecurityCheck.php:1417
1437
+ msgid "Just another WordPress site"
1438
+ msgstr "Doar un alt WordPress site"
1439
+
1440
+ #: controllers/Settings.php:45
1441
+ #, php-format
1442
+ msgid ""
1443
+ "NGINX detected. In case you didn't add the code in the NGINX config already, "
1444
+ "please add the following line. %s"
1445
+ msgstr ""
1446
+ "A fost detectat NGINX. În cazul în care nu ați adăugat deja codul în "
1447
+ "configurația NGINX, vă rugăm să adăugați următoarea linie. %s"
1448
+
1449
+ #: controllers/Settings.php:45 models/Rewrite.php:684
1450
+ msgid "Learn How To Add the Code"
1451
+ msgstr "Aflați cum să adăugați codul"
1452
+
1453
+ #: controllers/Settings.php:45
1454
+ msgid "Don't forget to reload the Nginx service."
1455
+ msgstr "Nu uitați să reîncărcați serviciul Nginx."
1456
+
1457
+ #: controllers/Settings.php:45
1458
+ msgid "Learn How"
1459
+ msgstr "Afla cum"
1460
+
1461
+ #: controllers/Settings.php:54 view/Backup.php:16
1462
+ msgid "Restore Settings"
1463
+ msgstr "Restaurați setările"
1464
+
1465
+ #: controllers/Settings.php:57
1466
+ msgid "You want to restore the last saved settings? "
1467
+ msgstr "Doriți să restaurați ultimele setări salvate? "
1468
+
1469
+ #: controllers/Settings.php:75
1470
+ #, php-format
1471
+ msgid ""
1472
+ "%sLimited Time Offer%s: Get %s65%% OFF%s today on Hide My WP Ghost 5 "
1473
+ "Websites License. %sHurry Up!%s"
1474
+ msgstr ""
1475
+ "%s Ofertă de timp limitată %s: Obțineți %s65 %% OFF %s azi pe Ascundeți "
1476
+ "licența mea WP Ghid 5 site-uri. %sHurry Up! %s"
1477
+
1478
+ #: controllers/Settings.php:122
1479
+ #, php-format
1480
+ msgid ""
1481
+ "New Plugin/Theme detected! You need to save the Hide My WP Setting again to "
1482
+ "include them all! %sClick here%s"
1483
+ msgstr ""
1484
+ "Nou detectat plugin / temă! Trebuie să salvați din nou Setarea Hide My WP "
1485
+ "pentru a le include pe toate! %s Faceți clic aici %s"
1486
+
1487
+ #: controllers/Settings.php:135
1488
+ #, php-format
1489
+ msgid ""
1490
+ "New Plugin/Theme detected! You need to save the Hide My WP Setting again to "
1491
+ "include them all! %sSave Settings%s"
1492
+ msgstr ""
1493
+ "Nou detectat plugin / temă! Trebuie să salvați din nou Setarea Hide My WP "
1494
+ "pentru a le include pe toate! %sSalvează setările %s"
1495
+
1496
+ #: controllers/Settings.php:151
1497
+ #, php-format
1498
+ msgid ""
1499
+ "To activate the new %sHide My WP %s %s settings you need to confirm and re-"
1500
+ "login!"
1501
+ msgstr ""
1502
+ "Pentru a activa noile setări %sHide My WP %s %s, trebuie să confirmați și să "
1503
+ "vă autentificați din nou!"
1504
+
1505
+ #: controllers/Settings.php:159
1506
+ msgid "Yes, I'm ready to re-login"
1507
+ msgstr "Da, sunt gata să mă re-autentific"
1508
+
1509
+ #: controllers/Settings.php:166 view/FrontendCheck.php:36
1510
+ msgid "No, abort"
1511
+ msgstr "Nu, avocați"
1512
+
1513
+ #: controllers/Settings.php:207
1514
+ msgid "My Account"
1515
+ msgstr "Contul meu"
1516
+
1517
+ #: controllers/Settings.php:336
1518
+ msgid ""
1519
+ "Error: You entered the same text twice in the Text Mapping. We removed the "
1520
+ "duplicates to prevent any redirect errors."
1521
+ msgstr ""
1522
+ "Eroare: ați introdus același text de două ori în Mapping Text. Am eliminat "
1523
+ "duplicatele pentru a preveni eventualele erori de redirecționare."
1524
+
1525
+ #: controllers/Settings.php:479
1526
+ msgid ""
1527
+ "ERROR! Please make sure you use a valid token to connect the plugin with "
1528
+ "WPPlugins"
1529
+ msgstr ""
1530
+ "EROARE! Vă rugăm să vă asigurați că utilizați un token valid pentru a "
1531
+ "conecta plugin-ul cu WPPlugins"
1532
+
1533
+ #: controllers/Settings.php:484
1534
+ msgid ""
1535
+ "ERROR! Please make sure you use an email address to connect the plugin with "
1536
+ "WPPlugins"
1537
+ msgstr ""
1538
+ "EROARE! Vă rugăm să vă asigurați că utilizați o adresă de e-mail pentru a "
1539
+ "conecta plugin-ul cu WPPlugins"
1540
+
1541
+ #: controllers/Settings.php:533
1542
+ msgid "Great! The backup is restored."
1543
+ msgstr "Grozav! Copia de rezervă este restabilită."
1544
+
1545
+ #: controllers/Settings.php:547 controllers/Settings.php:550
1546
+ msgid "Error! The backup is not valid."
1547
+ msgstr "Eroare! Copia de rezervă nu este validă."
1548
+
1549
+ #: controllers/Settings.php:553
1550
+ msgid "Error! You have to enter a previous saved backup file."
1551
+ msgstr "Eroare! Trebuie să introduceți un fișier salvat anterior salvat."
1552
+
1553
+ #: controllers/Settings.php:566
1554
+ msgid "Hide My Wp > Question"
1555
+ msgstr "Hide My WP > Întrebare"
1556
+
1557
+ #: models/Brute.php:427
1558
+ #, php-format
1559
+ msgid "%sYou failed to correctly answer the math problem.%s Please try again"
1560
+ msgstr ""
1561
+ "%s Nu ați reușit să răspundeți corect la problema matematică. %s Încercați "
1562
+ "din nou"
1563
+
1564
+ #: models/Brute.php:435
1565
+ #, php-format
1566
+ msgid ""
1567
+ "%sERROR:%s Email or Password is incorrect. %s %d attempts left before lockout"
1568
+ msgstr ""
1569
+ "%sERROR: %s E-mail sau parolă este incorectă. %s% d a încercat să rămână "
1570
+ "înainte de blocare"
1571
+
1572
+ #: models/Brute.php:459
1573
+ msgid "Prove your humanity: "
1574
+ msgstr "Dovedește-ți umanitatea: "
1575
+
1576
+ #: models/Brute.php:472
1577
+ msgid "Login Blocked by Hide My WordPress"
1578
+ msgstr "Logare Blocat de Hide My WP"
1579
+
1580
+ #: models/Compatibility.php:211
1581
+ msgid ""
1582
+ "CDN Enabled detected. Please include the new wp-content and wp-includes "
1583
+ "paths in CDN Enabler Settings"
1584
+ msgstr ""
1585
+ "CDN Activat detectat. Vă rugăm să includeți noile căi wp-content și wp-"
1586
+ "include în setările CDN Enabler"
1587
+
1588
+ #: models/Compatibility.php:219
1589
+ #, php-format
1590
+ msgid ""
1591
+ "CDN Enabler detected! Learn how to configure it with Hide My WP %sClick here"
1592
+ "%s"
1593
+ msgstr ""
1594
+ "CDN Enabler detectat! Aflați cum să-l configurați cu Hide My WP %s Faceți "
1595
+ "clic aici %s"
1596
+
1597
+ #: models/Compatibility.php:231
1598
+ #, php-format
1599
+ msgid ""
1600
+ "WP Super Cache CDN detected. Please include %s and %s paths in WP Super "
1601
+ "Cache > CDN > Include directories"
1602
+ msgstr ""
1603
+ "WP Super Cache CDN detectat. Vă rugăm să includeți %s și %s căi în WP Super "
1604
+ "Cache> CDN> Includere directoare"
1605
+
1606
+ #: models/Compatibility.php:238
1607
+ #, php-format
1608
+ msgid ""
1609
+ "Hide My WP does not work without mode_rewrite. Please activate the rewrite "
1610
+ "module in Apache. %sMore details%s"
1611
+ msgstr ""
1612
+ "Hide My WP nu funcționează fără mode_rewrite. Vă rugăm să activați modulul "
1613
+ "de rescriere în Apache. %sMai multe detalii %s"
1614
+
1615
+ #: models/Compatibility.php:243
1616
+ #, php-format
1617
+ msgid ""
1618
+ "Hide My WP does not work with %s Permalinks. Change it to %s or other type "
1619
+ "in Settings > Permalinks in order to hide it"
1620
+ msgstr ""
1621
+ "Hide My WP nu funcționează cu %s Permalink. Schimbă-l în %s sau alt tip în "
1622
+ "Setări> Legături permanente pentru a-l ascunde"
1623
+
1624
+ #: models/Compatibility.php:243
1625
+ msgid "Plain"
1626
+ msgstr "Șablon - format text simplu"
1627
+
1628
+ #: models/Compatibility.php:243
1629
+ msgid "Post Name"
1630
+ msgstr "Numele articolului"
1631
+
1632
+ #: models/Compatibility.php:248
1633
+ #, php-format
1634
+ msgid ""
1635
+ "You need to activate the URL Rewrite for IIS to be able to change the "
1636
+ "permalink structure to friendly URL (without index.php). %sMore details%s"
1637
+ msgstr ""
1638
+ "Trebuie să activați rescrierea URL-ului pentru IIS pentru a putea modifica "
1639
+ "structura de legături permanente în URL prietenoasă (fără index.php). %sMai "
1640
+ "multe detalii %s"
1641
+
1642
+ #: models/Compatibility.php:250
1643
+ msgid ""
1644
+ "You need to set the permalink structure to friendly URL (without index.php)."
1645
+ msgstr ""
1646
+ "Trebuie să setați structura de legături permanente pe o adresă URL "
1647
+ "prietenoasă (fără index.php)."
1648
+
1649
+ #: models/Compatibility.php:255
1650
+ msgid ""
1651
+ "The constant ADMIN_COOKIE_PATH is defined in wp-config.php by another "
1652
+ "plugin. Hide My WP will not work unless you remove the line "
1653
+ "define('ADMIN_COOKIE_PATH', ...);"
1654
+ msgstr ""
1655
+ "Constanta ADMIN_COOKIE_PATH este definită în wp-config.php de un alt plugin. "
1656
+ "Hide My WP nu va funcționa decât dacă eliminați definiția liniei "
1657
+ "(„ADMIN_COOKIE_PATH”, ...);"
1658
+
1659
+ #: models/Compatibility.php:261
1660
+ #, php-format
1661
+ msgid ""
1662
+ "Inmotion detected. %sPlease read how to make the plugin compatible with "
1663
+ "Inmotion Nginx Cache%s"
1664
+ msgstr ""
1665
+ "Detectarea mișcării. %s Vă rugăm să citiți cum să faceți plugin-ul "
1666
+ "compatibil cu Inmotion Nginx Cache %s"
1667
+
1668
+ #: models/Compatibility.php:273
1669
+ msgid ""
1670
+ "Hide My WP rules are not saved in the config file and this may affect the "
1671
+ "website loading speed."
1672
+ msgstr ""
1673
+ "Ascundeți regulile WP-ului meu nu sunt salvate în fișierul de configurare și "
1674
+ "acest lucru poate afecta viteza de încărcare a site-ului."
1675
+
1676
+ #: models/Compatibility.php:283
1677
+ #, php-format
1678
+ msgid ""
1679
+ "Godaddy detected! To avoid CSS errors, make sure you switch off the CDN from "
1680
+ "%s"
1681
+ msgstr ""
1682
+ "Godaddy a detectat! Pentru a evita erorile CSS, asigurați-vă că opriți CDN "
1683
+ "de la %s"
1684
+
1685
+ #: models/Rewrite.php:643
1686
+ #, php-format
1687
+ msgid ""
1688
+ "IIS detected. You need to update your %s file by adding the following lines "
1689
+ "after &lt;rules&gt; tag: %s"
1690
+ msgstr ""
1691
+ "IIS detectat. Trebuie să actualizați fișierul %s adăugând următoarele "
1692
+ "rânduri după &lt; reguli &gt; Etichete: %s"
1693
+
1694
+ #: models/Rewrite.php:664 models/Rewrite.php:732
1695
+ #, php-format
1696
+ msgid ""
1697
+ "Config file is not writable. You need to update your %s file by adding the "
1698
+ "following lines at the beginning of the file: %s"
1699
+ msgstr ""
1700
+ "Fișierul de configurare nu poate fi scris. Trebuie să actualizați fișierul "
1701
+ "%s adăugând următoarele linii la începutul fișierului: %s"
1702
+
1703
+ #: models/Rewrite.php:684
1704
+ #, php-format
1705
+ msgid ""
1706
+ "WpEngine detected. Add the redirects in the WpEngine Redirect rules panel %s"
1707
+ msgstr ""
1708
+ "WpEngine detectat. Adăugați redirectările în panoul de reguli WpEngine "
1709
+ "Redirect, %s"
1710
+
1711
+ #: models/Rewrite.php:764
1712
+ #, php-format
1713
+ msgid ""
1714
+ "Config file is not writable. You have to added it manually at the beginning "
1715
+ "of the %s file: %s"
1716
+ msgstr ""
1717
+ "Fișierul de configurare nu poate fi scris. Trebuie să îl adăugați manual la "
1718
+ "începutul fișierului %s: %s"
1719
+
1720
+ #: models/Rewrite.php:2034
1721
+ msgid ""
1722
+ "There has been a critical error on your website. Please check your site "
1723
+ "admin email inbox for instructions."
1724
+ msgstr ""
1725
+ "A apărut o eroare critică pe site-ul dvs. web. Vă rugăm să verificați "
1726
+ "instrucțiunile de pe adresa de e-mail a administratorului site-ului pentru "
1727
+ "instrucțiuni."
1728
+
1729
+ #: models/Rewrite.php:2036
1730
+ msgid "There has been a critical error on your website."
1731
+ msgstr "A apărut o eroare critică pe site-ul dvs. web."
1732
+
1733
+ #: models/Settings.php:12
1734
+ msgid "Permalinks"
1735
+ msgstr "Link-uri permanente"
1736
+
1737
+ #: models/Settings.php:13
1738
+ msgid "Change common paths"
1739
+ msgstr "Schimbați căile comune"
1740
+
1741
+ #: models/Settings.php:18
1742
+ msgid "Text and URL mapping"
1743
+ msgstr "Mapare text și URL"
1744
+
1745
+ #: models/Settings.php:23
1746
+ msgid "Add WordPress Tweaks"
1747
+ msgstr "Adăugați WordPress Tweaks"
1748
+
1749
+ #: models/Settings.php:27
1750
+ msgid "Brute Force"
1751
+ msgstr "Protecția Brute Force cu Captcha Math"
1752
+
1753
+ #: models/Settings.php:28
1754
+ msgid "Add Login Protection"
1755
+ msgstr "Adăugare Protecție autentificare"
1756
+
1757
+ #: models/Settings.php:33
1758
+ msgid "Website Events Log"
1759
+ msgstr "Jurnalul evenimentelor site-ului web"
1760
+
1761
+ #: models/Settings.php:38
1762
+ msgid "Test Your Website"
1763
+ msgstr "Testează-ți site-ul"
1764
+
1765
+ #: models/Settings.php:43 view/Plugins.php:29
1766
+ msgid "Plugins"
1767
+ msgstr "Plugin-uri"
1768
+
1769
+ #: models/Settings.php:49
1770
+ msgid "Save your settings"
1771
+ msgstr "Salvați setările"
1772
+
1773
+ #: models/Settings.php:67
1774
+ msgid "WP Super Cache"
1775
+ msgstr "WP Super Cache"
1776
+
1777
+ #: models/Settings.php:69
1778
+ msgid ""
1779
+ "A very fast caching engine for WordPress that produces static html files. "
1780
+ "Works well with Minify HTML plugin."
1781
+ msgstr ""
1782
+ "Un motor de memorie în cache foarte rapid pentru WordPress care produce "
1783
+ "fișiere statice html. Funcționează bine cu plugin-ul Minify HTML."
1784
+
1785
+ #: models/Settings.php:74
1786
+ msgid "Autoptimize"
1787
+ msgstr "Autoptimize"
1788
+
1789
+ #: models/Settings.php:76
1790
+ msgid ""
1791
+ "Autoptimize speeds up your website by optimizing JS, CSS and HTML, async-ing "
1792
+ "JavaScript, removing emoji cruft, optimizing Google Fonts and more."
1793
+ msgstr ""
1794
+ "Autoptimize accelerează site-ul dvs. prin optimizarea JS, CSS și HTML, "
1795
+ "asincronizare JavaScript, eliminarea cruft emoji, optimizarea fonturilor "
1796
+ "Google și altele."
1797
+
1798
+ #: models/Settings.php:81
1799
+ msgid "Minify HTML"
1800
+ msgstr "Minify HTML"
1801
+
1802
+ #: models/Settings.php:83
1803
+ msgid ""
1804
+ "Minify HTML output for clean looking markup and faster downloading. Minify "
1805
+ "HTML also has optional specialized minification for JS and internal CSS."
1806
+ msgstr ""
1807
+ "Minimizați ieșirea HTML pentru marcarea curată și mai rapidă descărcare. "
1808
+ "Minify HTML are, de asemenea, opțiuni de minificare specializate pentru JS "
1809
+ "și CSS interne."
1810
+
1811
+ #: models/Settings.php:88
1812
+ msgid "iThemes Security"
1813
+ msgstr "Securitatea iThemes"
1814
+
1815
+ #: models/Settings.php:90
1816
+ msgid ""
1817
+ "iThemes Security gives you over 30+ ways to secure and protect your WP site. "
1818
+ "WP sites can be an easy target for attacks because of plugin "
1819
+ "vulnerabilities, weak passwords and obsolete software."
1820
+ msgstr ""
1821
+ "iThemes Security vă oferă peste 30 de moduri de a vă proteja și proteja site-"
1822
+ "ul WP. Site-urile WP pot fi o țintă ușoară pentru atacuri din cauza "
1823
+ "vulnerabilităților plugin-ului, a parolelor slabe și a software-ului "
1824
+ "învechit."
1825
+
1826
+ #: models/Settings.php:95
1827
+ msgid "Sucuri Security"
1828
+ msgstr "Securitate Sucuri"
1829
+
1830
+ #: models/Settings.php:97
1831
+ msgid ""
1832
+ "The Sucuri WordPress Security plugin is a security toolset for security "
1833
+ "integrity monitoring, malware detection and security hardening."
1834
+ msgstr ""
1835
+ "Pluginul Sucuri WordPress Security este un set de instrumente de securitate "
1836
+ "pentru monitorizarea integrității securității, detectarea de malware și "
1837
+ "întărirea securității."
1838
+
1839
+ #: models/Settings.php:102
1840
+ msgid "Back Up WordPress"
1841
+ msgstr "Back Up WordPress"
1842
+
1843
+ #: models/Settings.php:104
1844
+ msgid ""
1845
+ "Simple automated backups of your WordPress-powered website. Back Up "
1846
+ "WordPress will back up your entire site including your database and all your "
1847
+ "files on a schedule that suits you."
1848
+ msgstr ""
1849
+ "Copii de rezervă simple automate ale site-ului dvs. web bazat pe WordPress. "
1850
+ "Back Up WordPress va face backup pentru întregul site, inclusiv baza de date "
1851
+ "și toate fișierele dvs. într-un program care vi se potrivește."
1852
+
1853
+ #: models/Settings.php:109
1854
+ msgid "SEO SQUIRRLY"
1855
+ msgstr "SQUIRRLY SEO"
1856
+
1857
+ #: models/Settings.php:111
1858
+ msgid ""
1859
+ "Welcome to Assisted WordPress SEO. Say Good-Bye to Search Engine "
1860
+ "Frustrations. Squirrly assists you in getting Excellent SEO for Humans and "
1861
+ "Search Engines."
1862
+ msgstr ""
1863
+ "Bine ați venit la asistat WordPress SEO. Spuneți-vă la revedere la "
1864
+ "frustrările motorului de căutare. Squirrly vă ajută să obțineți un SEO "
1865
+ "excelent pentru oameni și motoare de căutare."
1866
+
1867
+ #: models/Settings.php:116
1868
+ msgid "Elementor Page Builder"
1869
+ msgstr "Elementor Page Builder"
1870
+
1871
+ #: models/Settings.php:118
1872
+ msgid ""
1873
+ "The most advanced frontend drag & drop page builder. Create high-end, pixel "
1874
+ "perfect websites at record speeds. Any theme, any page, any design."
1875
+ msgstr ""
1876
+ "Cel mai avansat constructor de pagini drag and drop frontend. Creați site-"
1877
+ "uri web de înaltă performanță, cu pixeli, la viteze record. Orice temă, "
1878
+ "orice pagină, orice design."
1879
+
1880
+ #: models/Settings.php:123
1881
+ msgid "Weglot Translate"
1882
+ msgstr "Traducerea Weglot"
1883
+
1884
+ #: models/Settings.php:125
1885
+ msgid ""
1886
+ "Translate your website into multiple languages without any code. Weglot "
1887
+ "Translate is fully SEO compatible and follows Google's best practices."
1888
+ msgstr ""
1889
+ "Traduceți site-ul dvs. web în mai multe limbi fără niciun cod. Weglot "
1890
+ "Translate este pe deplin compatibil cu SEO și respectă cele mai bune "
1891
+ "practici Google."
1892
+
1893
+ #: models/Settings.php:130
1894
+ msgid "AddToAny Share Btn"
1895
+ msgstr "AddToAny Share Btn"
1896
+
1897
+ #: models/Settings.php:132
1898
+ msgid ""
1899
+ "Share buttons for WordPress including the AddToAny sharing button, Facebook, "
1900
+ "Twitter, Google+, Pinterest, WhatsApp, many more, and follow icons too."
1901
+ msgstr ""
1902
+ "Partajează butoane pentru WordPress, inclusiv butonul de partajare AddToAny, "
1903
+ "Facebook, Twitter, Google+, Pinterest, WhatsApp, multe altele și urmează și "
1904
+ "pictogramele."
1905
+
1906
+ #: models/Settings.php:146
1907
+ msgid ""
1908
+ "You can't set both ADMIN and LOGIN with the same name. Please use different "
1909
+ "names"
1910
+ msgstr ""
1911
+ "Nu puteți seta atât ADMIN, cât și LOGIN cu același nume. Vă rugăm să "
1912
+ "folosiți diferite nume"
1913
+
1914
+ #: models/Settings.php:295
1915
+ #, php-format
1916
+ msgid ""
1917
+ "Short name detected: %s. You need to use unique paths with more than 4 chars "
1918
+ "to avoid WordPress errors."
1919
+ msgstr ""
1920
+ "Nume scurt detectat: %s. Trebuie să utilizați căi unice cu mai mult de 4 "
1921
+ "caractere pentru a evita erorile WordPress."
1922
+
1923
+ #: models/Settings.php:300
1924
+ #, php-format
1925
+ msgid ""
1926
+ "Invalid name detected: %s. You need to use another name to avoid WordPress "
1927
+ "errors."
1928
+ msgstr ""
1929
+ "Numele nevalid este detectat: %s. Trebuie să folosiți un alt nume pentru a "
1930
+ "evita erorile WordPress."
1931
+
1932
+ #: models/Settings.php:305
1933
+ #, php-format
1934
+ msgid ""
1935
+ "Invalid name detected: %s. Add only the final path name to avoid WordPress "
1936
+ "errors."
1937
+ msgstr ""
1938
+ "Numele nevalid este detectat: %s. Adaugă doar numele final de cale pentru a "
1939
+ "evita erorile WordPress."
1940
+
1941
+ #: models/Settings.php:309
1942
+ #, php-format
1943
+ msgid ""
1944
+ "Invalid name detected: %s. The name can't start with / to avoid WordPress "
1945
+ "errors."
1946
+ msgstr ""
1947
+ "Numele nevalid este detectat: %s. Numele nu poate începe cu / pentru a evita "
1948
+ "erorile WordPress."
1949
+
1950
+ #: models/Settings.php:316
1951
+ #, php-format
1952
+ msgid ""
1953
+ "Invalid name detected: %s. The paths can't end with . to avoid WordPress "
1954
+ "errors."
1955
+ msgstr ""
1956
+ "Numele nevalid este detectat: %s. Căile nu se pot termina. pentru a evita "
1957
+ "erorile WordPress."
1958
+
1959
+ #: models/Settings.php:343
1960
+ #, php-format
1961
+ msgid ""
1962
+ "Weak name detected: %s. You need to use another name to increase your "
1963
+ "website security."
1964
+ msgstr ""
1965
+ "Numele slab detectat: %s. Trebuie să utilizați un alt nume pentru a crește "
1966
+ "securitatea site-ului."
1967
+
1968
+ #: view/Advanced.php:11
1969
+ msgid "Redirect Settings"
1970
+ msgstr "Setări redirecționare"
1971
+
1972
+ #: view/Advanced.php:15
1973
+ msgid "Redirect hidden paths"
1974
+ msgstr "Redirecționați căile ascunse"
1975
+
1976
+ #: view/Advanced.php:19
1977
+ msgid "Front page"
1978
+ msgstr "Înapoi la prima pagină"
1979
+
1980
+ #: view/Advanced.php:20
1981
+ msgid "404 page"
1982
+ msgstr "404 pag"
1983
+
1984
+ #: view/Advanced.php:32
1985
+ msgid ""
1986
+ "Redirect the protected paths /wp-admin, /wp-login to Front Page or 404 page."
1987
+ msgstr ""
1988
+ "Redirecționați căile protejate /wp-admin, /wp-login către prima pagină sau "
1989
+ "pagina 404."
1990
+
1991
+ #: view/Advanced.php:33
1992
+ msgid ""
1993
+ "You can create a new page and come back to choose to redirect to that page"
1994
+ msgstr ""
1995
+ "Puteți crea o pagină nouă și reveni pentru a alege să redirecționați către "
1996
+ "pagina respectivă"
1997
+
1998
+ #: view/Advanced.php:39
1999
+ msgid "Custom Safe URL Param"
2000
+ msgstr "Personalizează Parametrul de siguranță"
2001
+
2002
+ #: view/Advanced.php:40
2003
+ msgid "eg. disable_url, safe_url"
2004
+ msgstr "de exemplu. disable_url, safe_url"
2005
+
2006
+ #: view/Advanced.php:46
2007
+ msgid ""
2008
+ "The Safe URL will set all the settings to default. Use it only if you're "
2009
+ "locked out"
2010
+ msgstr ""
2011
+ "Adresa URL sigură va seta toate setările ca implicită. Folosiți-l doar dacă "
2012
+ "sunteți blocat"
2013
+
2014
+ #: view/Advanced.php:47
2015
+ msgid "Safe URL:"
2016
+ msgstr "URL de siguranță:"
2017
+
2018
+ #: view/Advanced.php:53
2019
+ msgid "Compatibility Settings"
2020
+ msgstr "Setări de compatibilitate"
2021
+
2022
+ #: view/Advanced.php:61
2023
+ msgid "Fix Relative URLs"
2024
+ msgstr "Remediază adresele URL relative"
2025
+
2026
+ #: view/Advanced.php:63
2027
+ #, php-format
2028
+ msgid "Convert links like /wp-content/* into %s/wp-content/*."
2029
+ msgstr "Convertiți legături precum /wp-content / * în %s /wp-content / *."
2030
+
2031
+ #: view/Advanced.php:73
2032
+ msgid "Fix Sitemaps XML"
2033
+ msgstr "Corectează Sitemaps XML"
2034
+
2035
+ #: view/Advanced.php:75
2036
+ msgid "Double check the Sitemap XML files and make sure the paths are changed."
2037
+ msgstr ""
2038
+ "Verificați dublu fișierele XML Sitemap și asigurați-vă că căile sunt "
2039
+ "schimbate."
2040
+
2041
+ #: view/Advanced.php:85
2042
+ msgid "Fix Robots.txt"
2043
+ msgstr "Corectează Robots.txt"
2044
+
2045
+ #: view/Advanced.php:87
2046
+ msgid "Hide WordPress paths from robots.txt file"
2047
+ msgstr "Ascundeți căile WordPress din fișierul robots.txt"
2048
+
2049
+ #: view/Advanced.php:97
2050
+ msgid "Late Loading"
2051
+ msgstr "Încărcare îmtârziată"
2052
+
2053
+ #: view/Advanced.php:99
2054
+ msgid ""
2055
+ "Load HMW after all plugins are loaded. Useful for CDN plugins (eg. CDN "
2056
+ "Enabler)."
2057
+ msgstr ""
2058
+ "Încărcați HMW după încărcarea tuturor plugin-urilor. Util pentru plugin-"
2059
+ "urile CDN (de ex. CDN Enabler)."
2060
+
2061
+ #: view/Advanced.php:100
2062
+ msgid "(only if other cache plugins request this)"
2063
+ msgstr "(numai dacă alte plugin-uri cache solicită acest lucru)"
2064
+
2065
+ #: view/Advanced.php:110
2066
+ msgid "Clean Login Page"
2067
+ msgstr "Curățați pagina de conectare"
2068
+
2069
+ #: view/Advanced.php:112
2070
+ msgid ""
2071
+ "Cancel the login hooks from other plugins and themes to prevent them from "
2072
+ "changing the Hide My WordPress redirects."
2073
+ msgstr ""
2074
+ "Anulați cârligele de conectare de la alte plugin-uri și teme pentru a le "
2075
+ "împiedica să schimbe ascunderea redirecțiilor WordPress."
2076
+
2077
+ #: view/Advanced.php:112
2078
+ msgid "(not recommended)"
2079
+ msgstr "(Nu se recomandă)"
2080
+
2081
+ #: view/Advanced.php:121
2082
+ msgid "Cache Settings"
2083
+ msgstr "Setări cache"
2084
+
2085
+ #: view/Advanced.php:129
2086
+ msgid "Security Check Notification"
2087
+ msgstr "Notificare verificare securitate"
2088
+
2089
+ #: view/Advanced.php:131
2090
+ msgid "Show Security Check notification when it's not checked every week."
2091
+ msgstr ""
2092
+ "Afișați notificarea de verificare a securității atunci când nu este "
2093
+ "verificată în fiecare săptămână."
2094
+
2095
+ #: view/Advanced.php:147
2096
+ msgid "Optimize CSS and JS files"
2097
+ msgstr "Optimizați fișierele CSS și JS"
2098
+
2099
+ #: view/Advanced.php:148
2100
+ msgid "Cache CSS, JS and Images to increase the frontend loading speed."
2101
+ msgstr "Cache CSS, JS și Imagini pentru a crește viteza de încărcare frontend."
2102
+
2103
+ #: view/Advanced.php:149
2104
+ #, php-format
2105
+ msgid "Check the website loading speed with %sPingdom Tool%s"
2106
+ msgstr "Verificați viteza de încărcare a site-ului web cu %sPingdom Tool %s"
2107
+
2108
+ #: view/Advanced.php:157
2109
+ msgid "Notification Settings"
2110
+ msgstr "Setări Notificări"
2111
+
2112
+ #: view/Advanced.php:165
2113
+ msgid "Email notification"
2114
+ msgstr "Permite închiderea curând e-mail notificare"
2115
+
2116
+ #: view/Advanced.php:166
2117
+ msgid "Send me an email with the changed admin and login URLs"
2118
+ msgstr "Trimite-mi un e-mail cu adresele modificate de admin și de conectare"
2119
+
2120
+ #: view/Advanced.php:175 view/Connect.php:17
2121
+ msgid "Email Address"
2122
+ msgstr "Adresa email"
2123
+
2124
+ #: view/Advanced.php:191 view/Brute.php:115 view/Mapping.php:210
2125
+ #: view/Mapping.php:215 view/Permalinks.php:530 view/Permalinks.php:535
2126
+ #: view/Tweaks.php:162
2127
+ msgid "Save"
2128
+ msgstr "Salvează"
2129
+
2130
+ #: view/Advanced.php:192 view/Brute.php:116 view/Mapping.php:211
2131
+ #: view/Mapping.php:216 view/Permalinks.php:531 view/Permalinks.php:536
2132
+ #: view/Tweaks.php:163
2133
+ #, php-format
2134
+ msgid "Love Hide My WP %s? Show us ;)"
2135
+ msgstr "Îți place ascunde WP %s? Arata-ne ;)"
2136
+
2137
+ #: view/Advanced.php:199 view/Mapping.php:243 view/Permalinks.php:563
2138
+ #: view/Tweaks.php:192
2139
+ msgid "Love Hide My WP?"
2140
+ msgstr "Îți place ascunde WP-ul meu?"
2141
+
2142
+ #: view/Advanced.php:204 view/Permalinks.php:568 view/Tweaks.php:197
2143
+ msgid "Please help us and support our plugin on WordPress.org"
2144
+ msgstr ""
2145
+ "Vă rugăm să ne ajutați și să susțineți plugin-ul nostru pe WordPress.org"
2146
+
2147
+ #: view/Advanced.php:207 view/Mapping.php:249 view/Permalinks.php:571
2148
+ #: view/Tweaks.php:200
2149
+ msgid "Rate Hide My WP"
2150
+ msgstr "Evaluează Hide My WP"
2151
+
2152
+ #: view/Advanced.php:210 view/Permalinks.php:574 view/Tweaks.php:203
2153
+ msgid "Contact us after you left the review cause we have a surprise for you."
2154
+ msgstr ""
2155
+ "Contactați-ne după ce ați părăsit cauza pentru examinare, avem o surpriză "
2156
+ "pentru dvs."
2157
+
2158
+ #: view/Advanced.php:221 view/Mapping.php:224 view/Permalinks.php:544
2159
+ #: view/Tweaks.php:173
2160
+ msgid "Check Your Website"
2161
+ msgstr "Verificați-vă site-ul"
2162
+
2163
+ #: view/Advanced.php:223 view/Mapping.php:226 view/Permalinks.php:546
2164
+ #: view/Tweaks.php:175
2165
+ msgid "Check if your website is secured with the current settings."
2166
+ msgstr "Verificați dacă site-ul dvs. web este securizat cu setările actuale."
2167
+
2168
+ #: view/Advanced.php:229 view/Mapping.php:232 view/Permalinks.php:552
2169
+ #: view/Tweaks.php:181
2170
+ msgid ""
2171
+ "Make sure you save the settings and empty the cache before checking your "
2172
+ "website with our tool."
2173
+ msgstr ""
2174
+ "Asigurați-vă că salvați setările și goliți memoria cache înainte de a "
2175
+ "verifica site-ul dvs. web cu instrumentul nostru."
2176
+
2177
+ #: view/Advanced.php:233 view/Mapping.php:236 view/Permalinks.php:556
2178
+ #: view/Tweaks.php:185
2179
+ msgid "Learn more about Hide My WP"
2180
+ msgstr "Aflați mai multe despre Ascundeți WP"
2181
+
2182
+ #: view/Backup.php:7
2183
+ msgid "Backup/Restore Settings"
2184
+ msgstr "Setări de Beckup/Restore"
2185
+
2186
+ #: view/Backup.php:9
2187
+ msgid ""
2188
+ "Click Backup and the download will start automatically. You can use the "
2189
+ "Backup for all your websites."
2190
+ msgstr ""
2191
+ "Faceți clic pe Backup și descărcarea va începe automat. Puteți utiliza "
2192
+ "Backup pentru toate site-urile dvs. web."
2193
+
2194
+ #: view/Backup.php:15 view/Backup.php:55
2195
+ msgid "Backup Settings"
2196
+ msgstr "Setări salvare"
2197
+
2198
+ #: view/Backup.php:26
2199
+ msgid "Hide My Wp Restore"
2200
+ msgstr "Restaurare setări Hide My WP"
2201
+
2202
+ #: view/Backup.php:32
2203
+ msgid "Upload the file with the saved Hide My Wp Settings"
2204
+ msgstr "Încărcați fișierul cu salvarea Hide My WP Settings"
2205
+
2206
+ #: view/Backup.php:40
2207
+ msgid "Restore Backup"
2208
+ msgstr "Restaurați backup"
2209
+
2210
+ #: view/Backup.php:56
2211
+ msgid ""
2212
+ "It's important to <strong>save your settings every time you change them</"
2213
+ "strong>. You can use the backup to configure other websites you own."
2214
+ msgstr ""
2215
+ "Este important să <strong>vă salvați setările de fiecare dată când le "
2216
+ "schimbați</strong> . Puteți utiliza backup pentru a configura alte site-uri "
2217
+ "web pe care le dețineți."
2218
+
2219
+ #: view/Brute.php:15
2220
+ msgid "Use Brute Force Protection"
2221
+ msgstr "Folosiți Brute Force Protection"
2222
+
2223
+ #: view/Brute.php:17
2224
+ msgid "Protects your website against brute force login attacks"
2225
+ msgstr ""
2226
+ "Protejează site-ul dvs. împotriva atacurilor de conectare cu forțe brute"
2227
+
2228
+ #: view/Brute.php:28
2229
+ msgid "Math Check protection"
2230
+ msgstr "Protecție cu Verificare Matematică"
2231
+
2232
+ #: view/Brute.php:53
2233
+ msgid "Max fail attempts"
2234
+ msgstr "Numărul de încercările eronate"
2235
+
2236
+ #: view/Brute.php:54
2237
+ msgid "Block IP on login page"
2238
+ msgstr "Blocați IP pe pagina de conectare"
2239
+
2240
+ #: view/Brute.php:62
2241
+ msgid "Ban duration"
2242
+ msgstr "Durata interdicției"
2243
+
2244
+ #: view/Brute.php:63
2245
+ msgid "No. of seconds"
2246
+ msgstr "Număr de secunde"
2247
+
2248
+ #: view/Brute.php:71
2249
+ msgid "Lockout Message"
2250
+ msgstr "Mesaj de blocare"
2251
+
2252
+ #: view/Brute.php:72
2253
+ msgid "Show message instead of login form"
2254
+ msgstr "Afișați mesajul în loc de formularul de autentificare"
2255
+
2256
+ #: view/Brute.php:86
2257
+ msgid "Whitelist IPs"
2258
+ msgstr "IP-uri cu lista albă"
2259
+
2260
+ #: view/Brute.php:87
2261
+ #, php-format
2262
+ msgid ""
2263
+ "You can white-list a single IP like 192.168.0.1 or a range of 245 IPs like "
2264
+ "192.168.0.*. Find your IP with %s"
2265
+ msgstr ""
2266
+ "Puteți lista alb un singur IP cum ar fi 192.168.0.1 sau o gamă de 245 de IP-"
2267
+ "uri precum 192.168.0. *. Găsiți IP-ul dvs. cu %s"
2268
+
2269
+ #: view/Brute.php:100
2270
+ msgid "Ban IPs"
2271
+ msgstr "Interzicerea IP-urilor"
2272
+
2273
+ #: view/Brute.php:101
2274
+ msgid ""
2275
+ "You can ban a single IP like 192.168.0.1 or a range of 245 IPs like "
2276
+ "192.168.0.*. These IPs will not be able to access the login page."
2277
+ msgstr ""
2278
+ "Puteți interzice un singur IP precum 192.168.0.1 sau o gamă de 245 de IP-uri "
2279
+ "precum 192.168.0. *. Aceste IP-uri nu vor putea accesa pagina de conectare."
2280
+
2281
+ #: view/Brute.php:122
2282
+ msgid "Blocked IPs"
2283
+ msgstr "IP-uri blocate"
2284
+
2285
+ #: view/Brute.php:128
2286
+ msgid "Unlock all"
2287
+ msgstr "Descuie tot"
2288
+
2289
+ #: view/Brute.php:139
2290
+ msgid "Brute Force Login Protection"
2291
+ msgstr "Protecția Brute Force pe login"
2292
+
2293
+ #: view/Brute.php:140
2294
+ msgid ""
2295
+ "Protects your website against brute force login attacks using Hide My "
2296
+ "WordPress <br /><br /> A common threat web developers face is a password-"
2297
+ "guessing attack known as a brute force attack. A brute-force attack is an "
2298
+ "attempt to discover a password by systematically trying every possible "
2299
+ "combination of letters, numbers, and symbols until you discover the one "
2300
+ "correct combination that works. "
2301
+ msgstr ""
2302
+ "Protejează site-ul dvs. împotriva atacurilor de conectare cu forțe brute, "
2303
+ "utilizând Hide My WordPress <br /><br /> O amenințare comună se confruntă cu "
2304
+ "dezvoltatorii web este un atac de ghicire a parolei cunoscut sub numele de "
2305
+ "atac de forță brută. Un atac de forță brută este o încercare de a descoperi "
2306
+ "o parolă încercând sistematic fiecare combinație posibilă de litere, numere "
2307
+ "și simboluri până când descoperi combinația corectă care funcționează."
2308
+
2309
+ #: view/Brute.php:146 view/Log.php:78
2310
+ msgid "Features"
2311
+ msgstr "Caracteristici"
2312
+
2313
+ #: view/Brute.php:148
2314
+ msgid "Limit the number of allowed login attempts using normal login form"
2315
+ msgstr ""
2316
+ "Limitați numărul de încercări de autentificare permise folosind formularul "
2317
+ "normal de autentificare"
2318
+
2319
+ #: view/Brute.php:149
2320
+ msgid "Math problem verification while logging in"
2321
+ msgstr "Verificarea problemelor matematice în momentul conectării"
2322
+
2323
+ #: view/Brute.php:150
2324
+ msgid "Manually block/unblock IP addresses"
2325
+ msgstr "Blocați / deblocați manual adresele IP"
2326
+
2327
+ #: view/Brute.php:151
2328
+ msgid "Manually whitelist trusted IP addresses"
2329
+ msgstr "Lista manuală de adrese IP de încredere"
2330
+
2331
+ #: view/Brute.php:152
2332
+ msgid "Option to inform user about remaining attempts on login page"
2333
+ msgstr ""
2334
+ "Opțiune de a informa utilizatorul despre încercările rămase pe pagina de "
2335
+ "conectare"
2336
+
2337
+ #: view/Brute.php:153
2338
+ msgid "Custom message to show to blocked users"
2339
+ msgstr "Mesaj personalizat pentru a fi afișat utilizatorilor blocați"
2340
+
2341
+ #: view/Connect.php:12
2342
+ msgid "Activate Free version"
2343
+ msgstr "Activați versiunea gratuită"
2344
+
2345
+ #: view/Connect.php:18
2346
+ msgid "Enter your email address to get security alerts and How To Lessons"
2347
+ msgstr ""
2348
+ "Introdu adresa de e-mail pentru a obține alerte de securitate și cum să "
2349
+ "lecții"
2350
+
2351
+ #: view/Connect.php:37
2352
+ msgid "Monitor my website, send me security alerts and vulnerability reports"
2353
+ msgstr ""
2354
+ "Monitorizează site-ul meu web, trimite-mi alerte de securitate și rapoarte "
2355
+ "de vulnerabilitate"
2356
+
2357
+ #: view/Connect.php:47
2358
+ msgid "I want to receive How To lessons for Hide My WP Ghost by email"
2359
+ msgstr ""
2360
+ "Vreau să primesc prin e-mail lecții despre cum să ascund fantoma mea WP"
2361
+
2362
+ #: view/Connect.php:58
2363
+ msgid "Activate"
2364
+ msgstr "Activează"
2365
+
2366
+ #: view/Connect.php:64
2367
+ msgid "Skip Activation"
2368
+ msgstr "Salt peste activare"
2369
+
2370
+ #: view/Connect.php:73
2371
+ msgid "Activate Hide My WP"
2372
+ msgstr "Activați Hide My WP"
2373
+
2374
+ #: view/Connect.php:75
2375
+ #, php-format
2376
+ msgid ""
2377
+ "By activating the Free version of Hide My WP you agree with our %sTerms of "
2378
+ "Use%s and %sPrivacy Policy%s"
2379
+ msgstr ""
2380
+ "Activând versiunea gratuită a Ascundeți WP-ul dvs. sunteți de acord cu "
2381
+ "%sTermenii noștri de utilizare %s și %s Politica de confidențialitate %s"
2382
+
2383
+ #: view/Connect.php:78
2384
+ msgid ""
2385
+ "Note! If you add your email you will receive a free token which will "
2386
+ "activate the plugin."
2387
+ msgstr ""
2388
+ "Notă! Dacă adăugați e-mailul dvs. veți primi un jeton gratuit care va activa "
2389
+ "plugin-ul."
2390
+
2391
+ #: view/Connect.php:81
2392
+ #, php-format
2393
+ msgid ""
2394
+ "If you bought Hide My WP Ghost please remove this plugin and install the one "
2395
+ "from %sYour Account%s"
2396
+ msgstr ""
2397
+ "Dacă ați cumpărat Hide My WP Ghost, vă rugăm să eliminați acest plugin și să-"
2398
+ "l instalați din %sYour Account %s"
2399
+
2400
+ #: view/Dashboard.php:18
2401
+ msgid "Security Level"
2402
+ msgstr "Nivel de securitate"
2403
+
2404
+ #: view/Dashboard.php:23 view/SecurityCheck.php:22
2405
+ #, php-format
2406
+ msgid ""
2407
+ "Your website security %sis extremely weak%s. %sMany hacking doors are "
2408
+ "available."
2409
+ msgstr ""
2410
+ "Securitatea site-ului dvs. %sis extrem de slab %s. %sMe multe uși de "
2411
+ "hacking sunt disponibile."
2412
+
2413
+ #: view/Dashboard.php:26 view/SecurityCheck.php:25
2414
+ #, php-format
2415
+ msgid ""
2416
+ "Your website security %sis very weak%s. %sMany hacking doors are available."
2417
+ msgstr ""
2418
+ "Securitatea site-ului dvs. %sis foarte slab %s. %sMe multe uși de hacking "
2419
+ "sunt disponibile."
2420
+
2421
+ #: view/Dashboard.php:29 view/SecurityCheck.php:28
2422
+ #, php-format
2423
+ msgid ""
2424
+ "Your website security is still weak. %sSome of the main hacking doors are "
2425
+ "still available."
2426
+ msgstr ""
2427
+ "Securitatea site-ului dvs. web este încă slabă. %s dintre unele dintre "
2428
+ "principalele uși de hacking sunt încă disponibile."
2429
+
2430
+ #: view/Dashboard.php:32 view/SecurityCheck.php:31
2431
+ #, php-format
2432
+ msgid ""
2433
+ "Your website security is strong. %sKeep checking the security every week."
2434
+ msgstr ""
2435
+ "Securitatea site-ului dvs. web este puternică. %s Vă rugăm să verificați "
2436
+ "securitatea în fiecare săptămână."
2437
+
2438
+ #: view/Dashboard.php:37
2439
+ msgid "Urgent Security Actions Required"
2440
+ msgstr "Acțiuni de securitate urgente necesare"
2441
+
2442
+ #: view/Dashboard.php:45
2443
+ msgid "Check All The Security Tasks"
2444
+ msgstr "Verificați toate sarcinile de securitate"
2445
+
2446
+ #: view/Dashboard.php:47
2447
+ msgid "Upgrade Your Security"
2448
+ msgstr "Îmbunătățiți-vă securitatea"
2449
+
2450
+ #: view/Dashboard.php:55
2451
+ msgid "Recheck Security"
2452
+ msgstr "Verificați securitatea"
2453
+
2454
+ #: view/Dashboard.php:107
2455
+ msgid "Checking Website Security ..."
2456
+ msgstr "Verificarea securității site-ului ..."
2457
+
2458
+ #: view/FrontendCheck.php:7
2459
+ msgid "Next Steps"
2460
+ msgstr "Pasul urmator"
2461
+
2462
+ #: view/FrontendCheck.php:9
2463
+ msgid "Frontend Login Test"
2464
+ msgstr "Test de conectare frontend"
2465
+
2466
+ #: view/FrontendCheck.php:13
2467
+ #, php-format
2468
+ msgid "Run %sFrontend Login Test%s and login inside the pupop. "
2469
+ msgstr ""
2470
+ "Rulați %sFrontend Login de testare %s și conectați-vă în interiorul "
2471
+ "cățelului."
2472
+
2473
+ #: view/FrontendCheck.php:14
2474
+ msgid "If you're able to login, you've set the new paths correctly."
2475
+ msgstr "Dacă vă puteți autentifica, ați setat corect noile căi."
2476
+
2477
+ #: view/FrontendCheck.php:15
2478
+ msgid ""
2479
+ "If the Login Page displays any error, please make sure you follow the Hide "
2480
+ "My WP Ghost instructions before moving forward."
2481
+ msgstr ""
2482
+ "Dacă pagina de conectare afișează vreo eroare, asigurați-vă că urmați "
2483
+ "instrucțiunile Hide My WP Ghost înainte de a merge mai departe."
2484
+
2485
+ #: view/FrontendCheck.php:16
2486
+ msgid ""
2487
+ "Do not log out from this browser until you are confident that the Frontend "
2488
+ "is working and you will be able to log in again."
2489
+ msgstr ""
2490
+ "Nu vă deconectați de pe acest browser până nu aveți încredere că Frontend "
2491
+ "funcționează și veți putea să vă autentificați din nou."
2492
+
2493
+ #: view/FrontendCheck.php:17
2494
+ #, php-format
2495
+ msgid ""
2496
+ "If you can't configure Hide My WP Ghost, switch to Default mode and "
2497
+ "%scontact us%s."
2498
+ msgstr ""
2499
+ "Dacă nu puteți configura Hide My WP Ghost, treceți la modul implicit și "
2500
+ "%scontact us %s."
2501
+
2502
+ #: view/FrontendCheck.php:21
2503
+ #, php-format
2504
+ msgid "%sWARNING:%s Use the custom login URL to login to admin."
2505
+ msgstr ""
2506
+ "%sWARNING: %s Utilizați URL-ul de conectare personalizat pentru a vă "
2507
+ "autentifica la administrator."
2508
+
2509
+ #: view/FrontendCheck.php:22
2510
+ #, php-format
2511
+ msgid ""
2512
+ "Your login URL will be: %s In case you can't re-login, use the safe URL: %s"
2513
+ msgstr ""
2514
+ "URL-ul dvs. de conectare va fi: %s În cazul în care nu vă puteți re-"
2515
+ "autentifica, utilizați adresa URL sigură: %s"
2516
+
2517
+ #: view/FrontendCheck.php:29
2518
+ msgid "Yes, it's working"
2519
+ msgstr "Da, funcționează"
2520
+
2521
+ #: view/FrontendCheck.php:44
2522
+ msgid "Frontend login Test"
2523
+ msgstr "Test de conectare frontend"
2524
+
2525
+ #: view/Log.php:10
2526
+ msgid "Events Settings"
2527
+ msgstr "Setări evenimente"
2528
+
2529
+ #: view/Log.php:23
2530
+ msgid "Log Users Events"
2531
+ msgstr "Jucați evenimente pentru utilizatori"
2532
+
2533
+ #: view/Log.php:24
2534
+ msgid "Track and Log events that happens on your WordPress site!"
2535
+ msgstr ""
2536
+ "Urmăriți și memorați evenimentele care se întâmplă pe site-ul dvs. WordPress!"
2537
+
2538
+ #: view/Log.php:37
2539
+ msgid "Log Brute Force Attempts"
2540
+ msgstr "Încercări Brute Force"
2541
+
2542
+ #: view/Log.php:38
2543
+ msgid "Track and Log brute force attempts"
2544
+ msgstr "Urmăriți și Memorați încercările Brute Force"
2545
+
2546
+ #: view/Log.php:46
2547
+ msgid "Log Use Roles"
2548
+ msgstr "Ce roluri să urmăriți"
2549
+
2550
+ #: view/Log.php:47
2551
+ msgid "Hold Control key to select multiple user roles"
2552
+ msgstr ""
2553
+ "Țineți apăsată tasta Control pentru a selecta mai multe roluri de utilizator"
2554
+
2555
+ #: view/Log.php:48
2556
+ msgid "Don't select any role if you want to log all user roles"
2557
+ msgstr ""
2558
+ "Nu selectați niciun rol dacă doriți să înregistrați toate rolurile "
2559
+ "utilizatorului"
2560
+
2561
+ #: view/Log.php:71
2562
+ msgid "Monitor everything that happens on your WordPress site!"
2563
+ msgstr "Monitorizați tot ce se întâmplă pe site-ul dvs. WordPress!"
2564
+
2565
+ #: view/Log.php:72
2566
+ msgid ""
2567
+ "It's safe to know what happened on your website at any time, in admin and on "
2568
+ "frontend."
2569
+ msgstr ""
2570
+ "Este sigur să știți ce s-a întâmplat pe site-ul dvs. web în orice moment, în "
2571
+ "admin și în frontend."
2572
+
2573
+ #: view/Log.php:73
2574
+ msgid ""
2575
+ "All the logs are saved on our Cloud Servers and your data is safe in case "
2576
+ "you reinstall the plugin"
2577
+ msgstr ""
2578
+ "Toate jurnalele sunt salvate pe serverele Cloud și datele dvs. sunt sigure "
2579
+ "în cazul în care reinstalați plugin-ul"
2580
+
2581
+ #: view/Log.php:80
2582
+ msgid "Monitor, track and log events on your website"
2583
+ msgstr ""
2584
+ "Monitorizați, urmăriți și înregistrați evenimentele de pe site-ul dvs. web"
2585
+
2586
+ #: view/Log.php:81
2587
+ msgid "Know what the other users are doing on your website and when"
2588
+ msgstr "Știți ce fac ceilalți utilizatori pe site-ul dvs. web și când"
2589
+
2590
+ #: view/Log.php:82
2591
+ msgid "You can set to receive email with alerts for one or more actions"
2592
+ msgstr ""
2593
+ "Puteți seta să primiți e-mail cu alerte pentru una sau mai multe acțiuni"
2594
+
2595
+ #: view/Log.php:83
2596
+ msgid "Filter events and users"
2597
+ msgstr "Filtrați evenimentele și utilizatorii"
2598
+
2599
+ #: view/Log.php:84
2600
+ msgid "Compatible with all themes and plugins"
2601
+ msgstr "Compatibil cu toate temele și plugin-urile"
2602
+
2603
+ #: view/Mapping.php:12
2604
+ msgid "Text Mapping"
2605
+ msgstr "Mapare text"
2606
+
2607
+ #: view/Mapping.php:19 view/Mapping.php:95 view/Mapping.php:168
2608
+ msgid ""
2609
+ "First, you need to switch Hide My Wp from Default mode to Safe Mode or Ghost "
2610
+ "Mode."
2611
+ msgstr ""
2612
+ "În primul rând, trebuie să comutați Hide My WP din modul implicit în modul "
2613
+ "Safe sau modul Ghost."
2614
+
2615
+ #: view/Mapping.php:24
2616
+ msgid "Replace the text in tags and classes to hide any WordPress footprint."
2617
+ msgstr ""
2618
+ "Înlocuiți textul în etichete și clase pentru a ascunde orice amprentă "
2619
+ "WordPress."
2620
+
2621
+ #: view/Mapping.php:25
2622
+ msgid ""
2623
+ "Note! Your plugins and themes may use these and it will affect the design "
2624
+ "and functionality."
2625
+ msgstr ""
2626
+ "Notă! Plugin-urile și temele dvs. le pot utiliza și acestea vor afecta "
2627
+ "designul și funcționalitatea."
2628
+
2629
+ #: view/Mapping.php:37
2630
+ msgid "Text Mapping only Classes, IDs, JS variables"
2631
+ msgstr "Modifică text-ul doar în clase, ID-uri, variabile JS"
2632
+
2633
+ #: view/Mapping.php:39
2634
+ msgid "Change the text only in classes, styles & scrips. (Recommended ON)"
2635
+ msgstr "Modificați textul doar în clase, stiluri și scrieri. (Recomandat ON)"
2636
+
2637
+ #: view/Mapping.php:40
2638
+ msgid "If this option is switched off, the text is changed in all page"
2639
+ msgstr ""
2640
+ "Dacă această opțiune este dezactivată, textul este schimbat în toate paginile"
2641
+
2642
+ #: view/Mapping.php:51 view/Mapping.php:64
2643
+ msgid "Remove Text Map"
2644
+ msgstr "Eliminați harta textului"
2645
+
2646
+ #: view/Mapping.php:76
2647
+ msgid "Add another text"
2648
+ msgstr "Adăugați un alt text"
2649
+
2650
+ #: view/Mapping.php:84
2651
+ msgid "URL Mapping"
2652
+ msgstr "Mapare URL"
2653
+
2654
+ #: view/Mapping.php:98
2655
+ msgid "You can add a list of URLs you want to change into new ones. "
2656
+ msgstr ""
2657
+ "Puteți adăuga o listă de adrese URL pe care doriți să le schimbați în altele "
2658
+ "noi."
2659
+
2660
+ #: view/Mapping.php:99
2661
+ msgid ""
2662
+ "It's important to include only internal URLs from Frontend source code after "
2663
+ "you activate the plugin in Safe Mode or Ghost Mode."
2664
+ msgstr ""
2665
+ "Este important să includeți doar adresele URL interne din codul sursă "
2666
+ "Frontend după activarea plugin-ului în modul Safe sau Ghost Mode."
2667
+
2668
+ #: view/Mapping.php:100
2669
+ msgid "Example:"
2670
+ msgstr "Exemplu:"
2671
+
2672
+ #: view/Mapping.php:102 view/Mapping.php:111
2673
+ msgid "from"
2674
+ msgstr "de la"
2675
+
2676
+ #: view/Mapping.php:106 view/Mapping.php:115
2677
+ msgid "to"
2678
+ msgstr "catre"
2679
+
2680
+ #: view/Mapping.php:109
2681
+ msgid "or"
2682
+ msgstr "sau"
2683
+
2684
+ #: view/Mapping.php:125 view/Mapping.php:138
2685
+ msgid "Remove URL Map"
2686
+ msgstr "Ștergeți Maparea URL"
2687
+
2688
+ #: view/Mapping.php:150
2689
+ msgid "Add another URL"
2690
+ msgstr "Adăugați o altă adresă URL"
2691
+
2692
+ #: view/Mapping.php:158
2693
+ msgid "CDN URLs"
2694
+ msgstr "URL-urile CDN"
2695
+
2696
+ #: view/Mapping.php:171
2697
+ msgid "You can add one or more CDN URLs you use."
2698
+ msgstr "Puteți adăuga unul sau mai multe URL-uri CDN pe care le utilizați."
2699
+
2700
+ #: view/Mapping.php:172
2701
+ msgid ""
2702
+ "This option will not activate the CDN option for your website but it will "
2703
+ "change the custom paths in case you already set a CDN URL with another "
2704
+ "plugin."
2705
+ msgstr ""
2706
+ "Această opțiune nu va activa opțiunea CDN pentru site-ul dvs. web, dar va "
2707
+ "schimba căile personalizate în cazul în care deja setați o adresă URL CDN cu "
2708
+ "un alt plugin."
2709
+
2710
+ #: view/Mapping.php:181 view/Mapping.php:190
2711
+ msgid "Remove CDN"
2712
+ msgstr "Eliminați CDN"
2713
+
2714
+ #: view/Mapping.php:199
2715
+ msgid "Add another CDN URL"
2716
+ msgstr "Adăugați o altă adresă URL CDN"
2717
+
2718
+ #: view/Mapping.php:246
2719
+ msgid "Give us 5 stars on WordPress.org"
2720
+ msgstr "Dă-ne 5 stele pe WordPress.org"
2721
+
2722
+ #: view/Permalinks.php:9
2723
+ msgid ""
2724
+ "Hide My WordPress requires to be activated on the entire network to prevent "
2725
+ "login issues!"
2726
+ msgstr ""
2727
+ "Ascunde WordPress-ul meu necesită să fie activat pe întreaga rețea pentru a "
2728
+ "preveni problemele de autentificare!"
2729
+
2730
+ #: view/Permalinks.php:32
2731
+ msgid "Levels of security"
2732
+ msgstr "Niveluri de securitate"
2733
+
2734
+ #: view/Permalinks.php:34
2735
+ msgid "Default (unsafe)"
2736
+ msgstr "Implicit (nesigur)"
2737
+
2738
+ #: view/Permalinks.php:35
2739
+ msgid "Lite mode"
2740
+ msgstr "Modul Lite"
2741
+
2742
+ #: view/Permalinks.php:38
2743
+ #, php-format
2744
+ msgid ""
2745
+ "Upgrade Your Website Security. Add Firewall, Hide WordPress Completely. "
2746
+ "%sUnlock this feature%s"
2747
+ msgstr ""
2748
+ "Upgrade-ți securitatea site-ului. Adăugați firewall, ascundeți complet "
2749
+ "WordPress. %sDeschideți această caracteristică %s"
2750
+
2751
+ #: view/Permalinks.php:42
2752
+ msgid "Ghost mode"
2753
+ msgstr "Mod Ghost"
2754
+
2755
+ #: view/Permalinks.php:46
2756
+ #, php-format
2757
+ msgid ""
2758
+ "%sWARNING:%s The admin path is hidden from visitors. Use the custom login "
2759
+ "URL to login to admin"
2760
+ msgstr ""
2761
+ "%sWARNING: %s Calea de administrare este ascunsă vizitatorilor. Utilizați "
2762
+ "URL-ul de conectare personalizat pentru a vă autentifica la admin"
2763
+
2764
+ #: view/Permalinks.php:47
2765
+ #, php-format
2766
+ msgid ""
2767
+ "If you can't login, use this URL: %s and all your changes are roll back to "
2768
+ "default"
2769
+ msgstr ""
2770
+ "Dacă nu vă puteți autentifica, utilizați această adresă URL: %s și toate "
2771
+ "modificările dvs. sunt redate în mod implicit"
2772
+
2773
+ #: view/Permalinks.php:119
2774
+ msgid "Admin Settings"
2775
+ msgstr "Setări Admin"
2776
+
2777
+ #: view/Permalinks.php:122
2778
+ #, php-format
2779
+ msgid ""
2780
+ "Your admin URL is changed by another plugin/theme in %s. To prevent errors, "
2781
+ "deactivate the other plugin who changes the admin path."
2782
+ msgstr ""
2783
+ "Adresa URL a dvs. este modificată cu un alt plugin / temă în %s. Pentru a "
2784
+ "preveni erorile, dezactivați celălalt plugin care modifică calea de "
2785
+ "administrare."
2786
+
2787
+ #: view/Permalinks.php:126
2788
+ #, php-format
2789
+ msgid ""
2790
+ "Your admin URL can't be changed on %s hosting because of the %s security "
2791
+ "terms."
2792
+ msgstr ""
2793
+ "URL-ul dvs. de admin nu poate fi modificat în %s hosting din cauza "
2794
+ "condițiilor de securitate %s."
2795
+
2796
+ #: view/Permalinks.php:132
2797
+ msgid "Custom Admin Path"
2798
+ msgstr "Personalizează Calea Admin"
2799
+
2800
+ #: view/Permalinks.php:133
2801
+ msgid "eg. adm, back"
2802
+ msgstr "de exemplu. adm, back"
2803
+
2804
+ #: view/Permalinks.php:147
2805
+ msgid "Hide \"wp-admin\""
2806
+ msgstr "Ascundeți 'wp-admin'"
2807
+
2808
+ #: view/Permalinks.php:148
2809
+ msgid "Show 404 Not Found Error when visitors access /wp-admin"
2810
+ msgstr ""
2811
+ "Afișare 404 Eroare nu a fost găsită când vizitatorii accesează /wp-admin"
2812
+
2813
+ #: view/Permalinks.php:157
2814
+ msgid "Hide the new admin path"
2815
+ msgstr "Ascundeți noua cale de admin"
2816
+
2817
+ #: view/Permalinks.php:158
2818
+ msgid ""
2819
+ "Let only the new login be accessible and redirect me to admin after logging "
2820
+ "in"
2821
+ msgstr ""
2822
+ "Permiteți accesul la noua conectare și să mă redirecționați către "
2823
+ "administrator după conectare"
2824
+
2825
+ #: view/Permalinks.php:163
2826
+ msgid ""
2827
+ "Some Themes don't work with custom Admin and Ajax paths. In case of ajax "
2828
+ "errors, switch back to wp-admin and admin-ajax.php."
2829
+ msgstr ""
2830
+ "Unele teme nu funcționează cu căi de administrare personalizate și Ajax. În "
2831
+ "cazul erorilor de ajax, treceți înapoi la wp-admin și admin-ajax.php."
2832
+
2833
+ #: view/Permalinks.php:169
2834
+ msgid "Login Settings"
2835
+ msgstr "Setări Login"
2836
+
2837
+ #: view/Permalinks.php:172
2838
+ #, php-format
2839
+ msgid ""
2840
+ "Your login URL is changed by another plugin/theme in %s. To prevent errors, "
2841
+ "deactivate the other plugin who changes the login path."
2842
+ msgstr ""
2843
+ "Adresa URL de conectare este modificată cu un alt plugin / temă din %s. "
2844
+ "Pentru a preveni erorile, dezactivați celălalt plugin care schimbă login."
2845
+
2846
+ #: view/Permalinks.php:177
2847
+ msgid "Custom Login Path"
2848
+ msgstr "Personalizează Calea Login"
2849
+
2850
+ #: view/Permalinks.php:178
2851
+ msgid "eg. login or signin"
2852
+ msgstr "de exemplu. login sau signin"
2853
+
2854
+ #: view/Permalinks.php:191
2855
+ msgid "Hide \"wp-login.php\""
2856
+ msgstr "Ascundeți \"wp-login.php\""
2857
+
2858
+ #: view/Permalinks.php:192
2859
+ msgid "Show 404 Not Found Error when visitors access /wp-login.php"
2860
+ msgstr "Afișare 404 Page Not Found când vizitatorii accesează /wp-login.php"
2861
+
2862
+ #: view/Permalinks.php:201
2863
+ msgid "Custom Lost Password Path"
2864
+ msgstr "Personalizează calea Lost Password"
2865
+
2866
+ #: view/Permalinks.php:202
2867
+ msgid "eg. lostpass or forgotpass"
2868
+ msgstr "de exemplu. lostpass sau forgotpass"
2869
+
2870
+ #: view/Permalinks.php:212
2871
+ msgid "Custom Register Path"
2872
+ msgstr "Personalizează calea de inregistrare"
2873
+
2874
+ #: view/Permalinks.php:213
2875
+ msgid "eg. newuser or register"
2876
+ msgstr "de exemplu. newuser sau register"
2877
+
2878
+ #: view/Permalinks.php:223
2879
+ msgid "Custom Logout Path"
2880
+ msgstr "Personalizează calea de deconectare"
2881
+
2882
+ #: view/Permalinks.php:224
2883
+ msgid "eg. logout or disconnect"
2884
+ msgstr "de exemplu. logout sau disconnect"
2885
+
2886
+ #: view/Permalinks.php:234
2887
+ msgid "Custom Activation Path"
2888
+ msgstr "Personalizează calea de activare"
2889
+
2890
+ #: view/Permalinks.php:235
2891
+ msgid "eg. multisite activation link"
2892
+ msgstr "de exemplu. multisite activation link"
2893
+
2894
+ #: view/Permalinks.php:248
2895
+ msgid "Common Paths"
2896
+ msgstr "Căile WordPress comunie"
2897
+
2898
+ #: view/Permalinks.php:252
2899
+ msgid "Custom admin-ajax Path"
2900
+ msgstr "Personalizează Calea admin-ajax"
2901
+
2902
+ #: view/Permalinks.php:253
2903
+ msgid "eg. ajax, json"
2904
+ msgstr "de exemplu. ajax, json"
2905
+
2906
+ #: view/Permalinks.php:266
2907
+ msgid "Hide wp-admin from ajax URL"
2908
+ msgstr "Ascundeți wp-admin de la adresa URL ajax"
2909
+
2910
+ #: view/Permalinks.php:267
2911
+ #, php-format
2912
+ msgid "Show /%s instead of /%s"
2913
+ msgstr "Afișați / %s în loc de / %s"
2914
+
2915
+ #: view/Permalinks.php:268
2916
+ msgid "Works only with the custom admin-ajax path to avoid infinite loops."
2917
+ msgstr ""
2918
+ "Funcționează numai cu calea personalizată admin-ajax pentru a evita bucle "
2919
+ "infinite."
2920
+
2921
+ #: view/Permalinks.php:275
2922
+ msgid "Custom wp-content Path"
2923
+ msgstr "Calea personalizată pentru wp-content"
2924
+
2925
+ #: view/Permalinks.php:276
2926
+ msgid "eg. core, inc, include"
2927
+ msgstr "de exemplu. nucleu, inc, include"
2928
+
2929
+ #: view/Permalinks.php:286
2930
+ msgid "Custom wp-includes Path"
2931
+ msgstr "Personalizează calea wp-include"
2932
+
2933
+ #: view/Permalinks.php:287
2934
+ msgid "eg. lib, library"
2935
+ msgstr "de exemplu. lib, library"
2936
+
2937
+ #: view/Permalinks.php:298
2938
+ msgid "Custom uploads Path"
2939
+ msgstr "Personalizează calea Uploads"
2940
+
2941
+ #: view/Permalinks.php:299
2942
+ msgid "eg. images, files"
2943
+ msgstr "de exemplu. imagini, files"
2944
+
2945
+ #: view/Permalinks.php:308
2946
+ #, php-format
2947
+ msgid ""
2948
+ "You already defined a different wp-content/uploads directory in wp-config."
2949
+ "php %s"
2950
+ msgstr ""
2951
+ "Ați definit deja un alt director wp-content/uploads în wp-config.php %s"
2952
+
2953
+ #: view/Permalinks.php:314
2954
+ msgid "Custom comment Path"
2955
+ msgstr "Personalizează calea de comentarii"
2956
+
2957
+ #: view/Permalinks.php:315
2958
+ msgid "eg. comments, discussion"
2959
+ msgstr "de exemplu. comentarii, dicussion"
2960
+
2961
+ #: view/Permalinks.php:326
2962
+ msgid "Custom author Path"
2963
+ msgstr "Personalizează calea autorului"
2964
+
2965
+ #: view/Permalinks.php:327
2966
+ msgid "eg. profile, usr, writer"
2967
+ msgstr "de exemplu. profil, usr, scriitor"
2968
+
2969
+ #: view/Permalinks.php:345
2970
+ msgid "Hide Author ID URL"
2971
+ msgstr "Ascundeți ID-ul autorului din adresa URL"
2972
+
2973
+ #: view/Permalinks.php:346
2974
+ msgid "Don't let URLs like domain.com?author=1 show the user login name"
2975
+ msgstr ""
2976
+ "Nu lăsați adresele URL precum domain.com?author=1 să arate numele de "
2977
+ "conectare al utilizatorului"
2978
+
2979
+ #: view/Permalinks.php:354
2980
+ msgid "Plugin Settings"
2981
+ msgstr "Setări Plugin"
2982
+
2983
+ #: view/Permalinks.php:358
2984
+ msgid "Custom plugins Path"
2985
+ msgstr "Plugin-uri personalizate"
2986
+
2987
+ #: view/Permalinks.php:359
2988
+ msgid "eg. modules"
2989
+ msgstr "de exemplu. module"
2990
+
2991
+ #: view/Permalinks.php:371
2992
+ msgid "Hide plugin names"
2993
+ msgstr "Ascundeți numele plugin-urilor"
2994
+
2995
+ #: view/Permalinks.php:372
2996
+ msgid "Give random names to each plugin"
2997
+ msgstr "Dați nume aleatorii fiecărui plugin"
2998
+
2999
+ #: view/Permalinks.php:379
3000
+ msgid "Theme Settings"
3001
+ msgstr "Setările temei"
3002
+
3003
+ #: view/Permalinks.php:383
3004
+ msgid "Custom themes Path"
3005
+ msgstr "Calea cu teme personalizate"
3006
+
3007
+ #: view/Permalinks.php:384
3008
+ msgid "eg. assets, templates, styles"
3009
+ msgstr "de exemplu. active, templates, style"
3010
+
3011
+ #: view/Permalinks.php:399
3012
+ msgid "Hide theme names"
3013
+ msgstr "Ascundeți numele temelor"
3014
+
3015
+ #: view/Permalinks.php:400
3016
+ msgid "Give random names to each theme (works in WP multisite)"
3017
+ msgstr "Dați nume aleatorii fiecărei teme (funcționează în WP multisite)"
3018
+
3019
+ #: view/Permalinks.php:411
3020
+ msgid "REST API Settings"
3021
+ msgstr "Setări REST API"
3022
+
3023
+ #: view/Permalinks.php:419
3024
+ msgid "Custom wp-json Path"
3025
+ msgstr "Personalizează Calea wp-json"
3026
+
3027
+ #: view/Permalinks.php:420
3028
+ msgid "eg. json, api, call"
3029
+ msgstr "de exemplu. json, api, call"
3030
+
3031
+ #: view/Permalinks.php:433
3032
+ msgid "Disable Rest API access"
3033
+ msgstr "Dezactivați accesul API"
3034
+
3035
+ #: view/Permalinks.php:434
3036
+ msgid "Disable Rest API access if you don't use your website for API calls"
3037
+ msgstr ""
3038
+ "Dezactivați accesului API dacă nu utilizați site-ul dvs. web pentru apeluri "
3039
+ "API"
3040
+
3041
+ #: view/Permalinks.php:442
3042
+ msgid "Security Settings"
3043
+ msgstr "Setări de Securitate"
3044
+
3045
+ #: view/Permalinks.php:454
3046
+ msgid "Hide WordPress Common Paths"
3047
+ msgstr "Ascundeți căile comune WordPress"
3048
+
3049
+ #: view/Permalinks.php:455
3050
+ msgid "Hide /wp-content, /wp-include, /plugins, /themes paths"
3051
+ msgstr "Ascunde /wp-content, /wp-include, /plugins, /themes"
3052
+
3053
+ #: view/Permalinks.php:456
3054
+ msgid "Hide upgrade.php and install.php for visitors"
3055
+ msgstr "Ascunde upgrade.php și install.php pentru vizitatori"
3056
+
3057
+ #: view/Permalinks.php:457
3058
+ msgid "(this may affect the fonts and images loaded through CSS)"
3059
+ msgstr "(acest lucru poate afecta fonturile și imaginile încărcate prin CSS)"
3060
+
3061
+ #: view/Permalinks.php:467
3062
+ msgid "Hide WordPress Common Files"
3063
+ msgstr "Ascundeți fișierele comune WordPress"
3064
+
3065
+ #: view/Permalinks.php:468
3066
+ msgid ""
3067
+ "Hide wp-config.php , wp-config-sample.php, readme.html, license.txt files"
3068
+ msgstr ""
3069
+ "Ascundeți fișierele wp-config.php, wp-config-sample.php, readme.html, "
3070
+ "license.txt"
3071
+
3072
+ #: view/Permalinks.php:480
3073
+ msgid "Firewall Against Script Injection"
3074
+ msgstr "Firewall împotriva injectării scriptului"
3075
+
3076
+ #: view/Permalinks.php:481
3077
+ msgid ""
3078
+ "Most WordPress installations are hosted on the popular Apache, Nginx and IIS "
3079
+ "web servers."
3080
+ msgstr ""
3081
+ "Majoritatea instalațiilor WordPress sunt găzduite pe celebrele servere web "
3082
+ "Apache, Nginx și IIS."
3083
+
3084
+ #: view/Permalinks.php:482
3085
+ msgid ""
3086
+ "A thorough set of rules can prevent many types of SQL Injection and URL "
3087
+ "hacks from being interpreted."
3088
+ msgstr ""
3089
+ "Un set complet de reguli poate împiedica interpretarea multor tipuri de SQL "
3090
+ "Injection și URL-urile URL."
3091
+
3092
+ #: view/Permalinks.php:493
3093
+ msgid "Disable Directory Browsing"
3094
+ msgstr "Dezactivați navigarea în directoare"
3095
+
3096
+ #: view/Permalinks.php:494
3097
+ #, php-format
3098
+ msgid "Don't let hackers see any directory content. See %sUploads Directory%s"
3099
+ msgstr ""
3100
+ "Nu lăsați hackerii să vadă niciun conținut de director. Consultați %sUploads "
3101
+ "Directory %s"
3102
+
3103
+ #: view/Permalinks.php:507
3104
+ msgid "Custom category Path"
3105
+ msgstr "Personalizează Calea de categorii"
3106
+
3107
+ #: view/Permalinks.php:508
3108
+ msgid "eg. cat, dir, list"
3109
+ msgstr "de exemplu. cat, dir, list"
3110
+
3111
+ #: view/Permalinks.php:517
3112
+ msgid "Custom tags Path"
3113
+ msgstr "Personalizează Calea Etichetă"
3114
+
3115
+ #: view/Permalinks.php:518
3116
+ msgid "eg. keyword, topic"
3117
+ msgstr "de exemplu. keyword, topic"
3118
+
3119
+ #: view/Plugins.php:14
3120
+ msgid "More details"
3121
+ msgstr "Mai multe detalii"
3122
+
3123
+ #: view/Plugins.php:16
3124
+ msgid "Install Plugin"
3125
+ msgstr "Instalare Plugin"
3126
+
3127
+ #: view/Plugins.php:18
3128
+ msgid "Plugin Installed"
3129
+ msgstr "Plugin instalat"
3130
+
3131
+ #: view/Plugins.php:30
3132
+ msgid ""
3133
+ "We are testing every week the latest version of these plugins and <strong>we "
3134
+ "make sure they are working with Hide My WP</strong> plugin.\n"
3135
+ " <br /><br />You don't need to install all these plugin "
3136
+ "in your website. If you're already using a cache plugin you don't need to "
3137
+ "install another one. <strong>We recommend using only one cache plugin</"
3138
+ "strong>.\n"
3139
+ " <br /><br />You can also install either <strong>iThemes "
3140
+ "Security</strong> plugin or <strong>Sucuri Security</strong> plugin to work "
3141
+ "with Hide My Wp plugin.\n"
3142
+ " <br /><br />If your plugins directory is not writable "
3143
+ "you will need to install the plugins manually."
3144
+ msgstr ""
3145
+ "În fiecare săptămână testăm cea mai recentă versiune a acestor plugin-uri și "
3146
+ "<strong>ne asigurăm că lucrează cu</strong> plugin-ul <strong>Hide My WP</"
3147
+ "strong> . <br /><br /> Nu trebuie să instalați toate aceste plugin-uri pe "
3148
+ "site-ul dvs. web. Dacă utilizați deja un plugin pentru cache nu trebuie să "
3149
+ "instalați altul. <strong>Vă recomandăm să utilizați un singur plugin de "
3150
+ "cache</strong> . <br /><br /> Puteți instala fie plugin-ul <strong>iThemes "
3151
+ "Security,</strong> fie plugin-ul <strong>Sucuri Security</strong> pentru a "
3152
+ "funcționa cu plugin-ul Hide My Wp. <br /><br /> Dacă directorul dvs. de "
3153
+ "plugin-uri nu este scris, va trebui să instalați manual plugin-urile."
3154
+
3155
+ #: view/SecurityCheck.php:6
3156
+ msgid "WordPress Security Check"
3157
+ msgstr "Verificare Securitate WordPress"
3158
+
3159
+ #: view/SecurityCheck.php:35 view/SecurityCheck.php:63
3160
+ msgid "Start Scan"
3161
+ msgstr "Incepe Scanarea"
3162
+
3163
+ #: view/SecurityCheck.php:48
3164
+ msgid "Passed"
3165
+ msgstr "Aprobat"
3166
+
3167
+ #: view/SecurityCheck.php:49
3168
+ msgid "Failed"
3169
+ msgstr "Eșuată"
3170
+
3171
+ #: view/SecurityCheck.php:55
3172
+ msgid ""
3173
+ "Congratulations! You completed all the security tasks. Make sure you check "
3174
+ "your site once a week."
3175
+ msgstr ""
3176
+ "Felicitări! Ați finalizat toate sarcinile de securitate. Asigurați-vă că "
3177
+ "verificați site-ul dvs. o dată pe săptămână."
3178
+
3179
+ #: view/SecurityCheck.php:66
3180
+ #, php-format
3181
+ msgid ""
3182
+ "According to %sGoogle latest stats%s, over %s20k websites are hacked every "
3183
+ "week%s and over %s30&#37; of them are made in WordPress%s. <br />It's "
3184
+ "%sbetter to prevent an attack%s than to spend a lot of money and time to "
3185
+ "recover your data after an attack not to mention the situation when your "
3186
+ "clients' data are stollen."
3187
+ msgstr ""
3188
+ "Conform ultimelor statistici %s Google %s, peste %s 20k site-uri web sunt "
3189
+ "hack-uite în fiecare săptămână %s, iar peste %s30&#37; dintre ele sunt "
3190
+ "realizate în WordPress %s. <br /> Este %smai bine să preveniți un atac %s "
3191
+ "decât să cheltuiți mulți bani și timp pentru a recupera datele dvs. după un "
3192
+ "atac pentru a nu menționa situația în care datele clienților dvs. sunt "
3193
+ "blocate."
3194
+
3195
+ #: view/SecurityCheck.php:69
3196
+ msgid "Last check:"
3197
+ msgstr "Ultima verificare:"
3198
+
3199
+ #: view/SecurityCheck.php:82
3200
+ msgid "Name"
3201
+ msgstr "Nume"
3202
+
3203
+ #: view/SecurityCheck.php:83
3204
+ msgid "Value"
3205
+ msgstr "Valoare"
3206
+
3207
+ #: view/SecurityCheck.php:84
3208
+ msgid "Valid"
3209
+ msgstr "Valabil"
3210
+
3211
+ #: view/SecurityCheck.php:85
3212
+ msgid "Action"
3213
+ msgstr "Actiune"
3214
+
3215
+ #: view/SecurityCheck.php:110
3216
+ msgid "Info"
3217
+ msgstr "Info"
3218
+
3219
+ #: view/SecurityCheck.php:111
3220
+ msgid "Fix it"
3221
+ msgstr "Repara-l"
3222
+
3223
+ #: view/SecurityCheck.php:112
3224
+ msgid "Are you sure you want to ignore this task in the future?"
3225
+ msgstr "Sigur doriți să ignorați această sarcină în viitor?"
3226
+
3227
+ #: view/SecurityCheck.php:125
3228
+ msgid "Reset all ingnored tasks"
3229
+ msgstr "Resetați toate sarcinile ignorate"
3230
+
3231
+ #: view/Support.php:3
3232
+ msgid "Need Help?"
3233
+ msgstr "Ai nevoie de ajutor?:"
3234
+
3235
+ #: view/Support.php:6
3236
+ #, php-format
3237
+ msgid ""
3238
+ "Read the plugin tutorial and how to setup every feature %sRead Hide My WP "
3239
+ "Tutorial%s"
3240
+ msgstr ""
3241
+ "Citiți tutorialul plugin-ului și modul de configurare a fiecărei funcții "
3242
+ "%sCitiți Hide My WP Tutorial %s"
3243
+
3244
+ #: view/Support.php:8
3245
+ #, php-format
3246
+ msgid ""
3247
+ "You can also email us on %scontact@wpplugins.tips%s and we are happy to "
3248
+ "answer any question or suggestion you may have and we aim to respond within "
3249
+ "24 hours."
3250
+ msgstr ""
3251
+ "Puteți, de asemenea, să ne trimiteți un e-mail pe %scontact@wpplugins.tips%s "
3252
+ "și suntem bucuroși să răspundem la orice întrebare sau sugestie pe care o "
3253
+ "puteți avea și ne propunem să răspundem în 24 de ore."
3254
+
3255
+ #: view/Tweaks.php:10
3256
+ msgid "Change Options"
3257
+ msgstr "Modificați opțiuni"
3258
+
3259
+ #: view/Tweaks.php:18
3260
+ msgid "Change Paths for Logged Users"
3261
+ msgstr "Modificați căile pentru utilizatorii conectați"
3262
+
3263
+ #: view/Tweaks.php:20
3264
+ msgid "Change WordPress paths while you're logged in"
3265
+ msgstr "Modificați căile WordPress în timp ce sunteți autentificat"
3266
+
3267
+ #: view/Tweaks.php:21
3268
+ msgid "(not recommended, may affect other plugins functionality in admin)"
3269
+ msgstr ""
3270
+ "(nerecomandat, poate afecta funcționalitatea altor plugin-uri în admin)"
3271
+
3272
+ #: view/Tweaks.php:35
3273
+ msgid "Change Paths in Cached Files"
3274
+ msgstr "Modificați căile în fișierele cache"
3275
+
3276
+ #: view/Tweaks.php:36
3277
+ msgid ""
3278
+ "Change the WordPress common paths in the cached files from /wp-content/cache "
3279
+ "directory"
3280
+ msgstr ""
3281
+ "Modificați căile comune WordPress din fișierele din cache din directorul /wp-"
3282
+ "content/cache"
3283
+
3284
+ #: view/Tweaks.php:37
3285
+ msgid ""
3286
+ "(this feature runs in background and needs up to one minute after every "
3287
+ "cache purged)"
3288
+ msgstr ""
3289
+ "(această caracteristică rulează în fundal și are nevoie de până la un minut "
3290
+ "după fiecare cache eliminată)"
3291
+
3292
+ #: view/Tweaks.php:48
3293
+ msgid "Change Paths in Ajax Calls"
3294
+ msgstr "Schimbă căile în apelurile Ajax"
3295
+
3296
+ #: view/Tweaks.php:50
3297
+ msgid ""
3298
+ "This will prevent from showing the old paths when an image or font is called "
3299
+ "through ajax"
3300
+ msgstr ""
3301
+ "Acest lucru va împiedica afișarea căilor vechi atunci când o imagine sau "
3302
+ "font este apelat prin ajax"
3303
+
3304
+ #: view/Tweaks.php:58
3305
+ msgid "Hide/Show Options"
3306
+ msgstr "Opțiuni Ascunde/Afișează"
3307
+
3308
+ #: view/Tweaks.php:67
3309
+ msgid ""
3310
+ "Hide WordPress and Plugin versions from the end of any image, css and js "
3311
+ "files"
3312
+ msgstr ""
3313
+ "Ascundeți versiunile WordPress și Plugin de la sfârșitul oricărei fișiere "
3314
+ "imagine, CSS și JS"
3315
+
3316
+ #: view/Tweaks.php:68
3317
+ msgid "Hide the WP Generator META"
3318
+ msgstr "Ascundeți META Generatorul WP"
3319
+
3320
+ #: view/Tweaks.php:69
3321
+ msgid "Hide the WP DNS Prefetch META"
3322
+ msgstr "Ascundeți META-ul WP DNS Prefetch"
3323
+
3324
+ #: view/Tweaks.php:78
3325
+ msgid "Hide RSD (Really Simple Discovery) header"
3326
+ msgstr "Ascundeți antetul RSD (Real Simple Discovery)"
3327
+
3328
+ #: view/Tweaks.php:80
3329
+ msgid "Don't show any WordPress information in HTTP header request"
3330
+ msgstr "Nu afișați informații WordPress în solicitarea antetului HTTP"
3331
+
3332
+ #: view/Tweaks.php:90
3333
+ msgid "Hide WordPress HTML Comments"
3334
+ msgstr "<strong>Ascunde comentariile HTML</strong>"
3335
+
3336
+ #: view/Tweaks.php:92
3337
+ msgid "Hide the HTML Comments left by theme and plugins"
3338
+ msgstr "Ascundeți comentariile HTML lăsate de temă și plugin-uri"
3339
+
3340
+ #: view/Tweaks.php:101
3341
+ msgid "Hide Emojicons"
3342
+ msgstr "Ascundeți Emojicons"
3343
+
3344
+ #: view/Tweaks.php:103
3345
+ msgid "Don't load Emoji Icons if you don't use them"
3346
+ msgstr "Nu încărcați pictogramele Emoji dacă nu le utilizați"
3347
+
3348
+ #: view/Tweaks.php:110
3349
+ msgid "Other Settings"
3350
+ msgstr "Alte setări"
3351
+
3352
+ #: view/Tweaks.php:117
3353
+ msgid "Disable XML-RPC authentication"
3354
+ msgstr "Dezactivează autentificarea XML-RPC"
3355
+
3356
+ #: view/Tweaks.php:119
3357
+ #, php-format
3358
+ msgid "Don't load XML-RPC to prevent %sBrute force attacks via XML-RPC%s"
3359
+ msgstr ""
3360
+ "Nu încărcați XML-RPC pentru a preveni atacurile de forță %sBrute Force prin "
3361
+ "XML-RPC %s"
3362
+
3363
+ #: view/Tweaks.php:128
3364
+ msgid "Disable Embed scripts"
3365
+ msgstr "Dezactivați scripturile Embed"
3366
+
3367
+ #: view/Tweaks.php:130
3368
+ msgid "Don't load oEmbed service if you don't use oEmbed videos"
3369
+ msgstr "Nu încărcați serviciul Ombed dacă nu utilizați videoclipuri oEmbed"
3370
+
3371
+ #: view/Tweaks.php:140
3372
+ msgid "Disable WLW Manifest scripts"
3373
+ msgstr "<strong>Dezactivează schiptul WLW Manifest</strong>"
3374
+
3375
+ #: view/Tweaks.php:142
3376
+ msgid ""
3377
+ "Don't load WLW if you didn't configure Windows Live Writer for your site"
3378
+ msgstr ""
3379
+ "Nu încărcați WLW dacă nu ați configurat Windows Live Writer pentru site-ul "
3380
+ "dvs."
3381
+
3382
+ #: view/Tweaks.php:152
3383
+ msgid "Disable DB Debug in Frontent"
3384
+ msgstr "Dezactivează debug-ul DB în Frontend"
3385
+
3386
+ #: view/Tweaks.php:154
3387
+ msgid "Don't load DB Debug if your website is live"
3388
+ msgstr "Nu încărcați DB Debug dacă site-ul dvs. web este live"
3389
+
3390
+ #. Plugin Name of the plugin/theme
3391
+ msgid "Hide My WP Ghost Lite"
3392
+ msgstr "Ascunde-mi WP Ghost Lite"
3393
+
3394
+ #. Plugin URI of the plugin/theme
3395
+ msgid "https://wordpress.org/plugins/hide-my-wp/"
3396
+ msgstr "https://wordpress.org/plugins/hide-my-wp/"
3397
+
3398
+ #. Description of the plugin/theme
3399
+ msgid ""
3400
+ "The best solution for WordPress Security. Hide wp-admin, wp-login, wp-"
3401
+ "content, plugins, themes etc. Add Firewall, Brute Force protection & more. "
3402
+ "<br /> <a href=\"http://hidemywpghost.com/wordpress\" target=\"_blank"
3403
+ "\"><strong>Unlock all features</strong></a>"
3404
+ msgstr ""
3405
+ "Cea mai bună soluție pentru securitatea WordPress. Ascunde wp-admin, wp-"
3406
+ "login, conținut wp, plugin-uri, teme etc. Adăugați firewall, protecție Brute "
3407
+ "Force și multe altele. <br /> <a href=\"http://hidemywpghost.com/wordpress\" "
3408
+ "target=\"_blank\"><strong>Deblocați toate funcțiile</strong></a>"
3409
+
3410
+ #. Author of the plugin/theme
3411
+ msgid "WPPlugins - WordPress Security Plugins"
3412
+ msgstr "WPPlugins - plugin-uri de securitate WordPress"
3413
+
3414
+ #. Author URI of the plugin/theme
3415
+ msgid "https://wpplugins.tips"
3416
+ msgstr "https://wpplugins.tips"
models/Brute.php ADDED
@@ -0,0 +1,477 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') || die('Cheatin\' uh?');
3
+
4
+ class HMW_Models_Brute {
5
+ protected $user_ip;
6
+ public $response;
7
+
8
+ /**
9
+ * Retrives and sets the ip address the person logging in
10
+ *
11
+ * @return string
12
+ */
13
+
14
+ public function brute_get_ip() {
15
+ if (isset($this->user_ip)) {
16
+ return $this->user_ip;
17
+ }
18
+
19
+ $ip = $_SERVER['REMOTE_ADDR'];
20
+ $trusted_header = HMW_Classes_Tools::getOption('trusted_ip_header');
21
+
22
+ if (is_string($trusted_header) && $trusted_header <> '') {
23
+ if (isset($_SERVER[$trusted_header])) {
24
+ $ip = $_SERVER[$trusted_header];
25
+ }
26
+ }
27
+
28
+ $ips = array_reverse(explode(', ', $ip));
29
+ foreach ($ips as $ip) {
30
+ $ip = $this->clean_ip($ip);
31
+
32
+ // If the IP is in a private or reserved range, keep looking
33
+ if ($ip == '127.0.0.1' || $ip == '::1' || $this->ip_is_private($ip)) {
34
+ continue;
35
+ } else {
36
+ $this->user_ip = $ip;
37
+ return $this->user_ip;
38
+ }
39
+ }
40
+
41
+ $this->user_ip = $this->clean_ip($_SERVER['REMOTE_ADDR']);
42
+ return $this->user_ip;
43
+ }
44
+
45
+
46
+ public function clean_ip($ip) {
47
+ $ip = trim($ip);
48
+
49
+ // Check for IPv4 IP cast as IPv6
50
+ if (preg_match('/^::ffff:(\d+\.\d+\.\d+\.\d+)$/', $ip, $matches)) {
51
+ $ip = $matches[1];
52
+ }
53
+
54
+ return $ip;
55
+ }
56
+
57
+
58
+ /**
59
+ * Checks an IP to see if it is within a private range
60
+ * @param string $ip
61
+ * @return bool
62
+ */
63
+ public function ip_is_private($ip) {
64
+ $pri_addrs = array(
65
+ '10.0.0.0|10.255.255.255', // single class A network
66
+ '172.16.0.0|172.31.255.255', // 16 contiguous class B network
67
+ '192.168.0.0|192.168.255.255', // 256 contiguous class C network
68
+ '169.254.0.0|169.254.255.255', // Link-local address also refered to as Automatic Private IP Addressing
69
+ '127.0.0.0|127.255.255.255' // localhost
70
+ );
71
+
72
+ $long_ip = ip2long($ip);
73
+ if ($long_ip != -1) {
74
+
75
+ foreach ($pri_addrs AS $pri_addr) {
76
+ list ($start, $end) = explode('|', $pri_addr);
77
+
78
+ // IF IS PRIVATE
79
+ if ($long_ip >= ip2long($start) && $long_ip <= ip2long($end)) {
80
+ return true;
81
+ }
82
+ }
83
+ }
84
+
85
+ return false;
86
+ }
87
+
88
+ public function get_privacy_key() {
89
+ // Privacy key generation uses the NONCE_SALT + admin email-- admin email is
90
+ // used to prevent identical privacy keys if NONCE_SALT is not customized
91
+ return substr(md5(NONCE_SALT . get_site_option('admin_email')), 5, 10);
92
+ }
93
+
94
+ /**
95
+ * Checks the status for a given IP. API results are cached as transients in the wp_options table
96
+ *
97
+ * @return array
98
+ */
99
+ public function brute_check_loginability() {
100
+
101
+ $ip = $this->brute_get_ip();
102
+ $headers = $this->brute_get_headers();
103
+ $header_hash = md5(json_encode($headers));
104
+
105
+ $transient_name = 'hmw_brute_' . $header_hash;
106
+ $transient_value = $this->get_transient($transient_name);
107
+ //Never block login from whitelisted IPs
108
+ if ($this->check_whitelisted_ip($ip)) {
109
+ return $transient_value;
110
+ }
111
+
112
+ //Check out our transients
113
+ if (isset($transient_value) && $transient_value['status'] == 'ok') {
114
+ return $transient_value;
115
+ }
116
+
117
+ if (isset($transient_value) && $transient_value['status'] == 'blocked') {
118
+ //there is a current block-- prevent login
119
+ $this->brute_kill_login();
120
+ }
121
+
122
+
123
+ //If we've reached this point, this means that the IP isn't cached.
124
+ //Now we check to see if we should allow login
125
+ $response = $this->brute_call('check_ip');
126
+
127
+ if ($response['status'] == 'blocked') {
128
+ $this->brute_kill_login();
129
+ }
130
+
131
+ return $response;
132
+ }
133
+
134
+ public function check_whitelisted_ip($ip) {
135
+ //Never block login from whitelisted IPs
136
+ $whitelist = HMW_Classes_Tools::getOption('whitelist_ip');
137
+ $wl_items = json_decode($whitelist, true);
138
+
139
+ if (isset($wl_items) && !empty($wl_items)) {
140
+ foreach ($wl_items as $item) {
141
+ $item = trim($item);
142
+ if ($ip == $item) {
143
+ return true;
144
+ }
145
+
146
+ if (strpos($item, '*') === false) { //no match, no wildcard
147
+ continue;
148
+ }
149
+
150
+ $iplong = ip2long($ip);
151
+ $ip_low = ip2long(str_replace('*', '0', $item));
152
+ $ip_high = ip2long(str_replace('*', '255', $item));
153
+
154
+ if ($iplong >= $ip_low && $iplong <= $ip_high) {//IP is within wildcard range
155
+ return true;
156
+ }
157
+
158
+ }
159
+ }
160
+ return false;
161
+ }
162
+
163
+ public function brute_get_local_host() {
164
+ if (isset($this->local_host)) {
165
+ return $this->local_host;
166
+ }
167
+
168
+ $uri = 'http://' . strtolower($_SERVER['HTTP_HOST']);
169
+
170
+ if (is_multisite()) {
171
+ $uri = network_home_url();
172
+ }
173
+
174
+ $uridata = parse_url($uri);
175
+
176
+ $domain = $uridata['host'];
177
+
178
+ //if we still don't have it, get the site_url
179
+ if (!$domain) {
180
+ $uri = get_site_url(1);
181
+ $uridata = parse_url($uri);
182
+ if (isset($uridata['host'])) {
183
+ $domain = $uridata['host'];
184
+ }
185
+ }
186
+
187
+ $this->local_host = $domain;
188
+
189
+ return $this->local_host;
190
+ }
191
+
192
+
193
+ public function brute_get_blocked_attempts() {
194
+ $blocked_count = get_site_option('bruteprotect_blocked_attempt_count');
195
+ if (!$blocked_count) {
196
+ $blocked_count = 0;
197
+ }
198
+
199
+ return $blocked_count;
200
+ }
201
+
202
+
203
+ /**
204
+ * Finds out if this site is using http or https
205
+ *
206
+ * @return string
207
+ */
208
+ public function brute_get_protocol() {
209
+ $protocol = (is_ssl()) ? "https://" : "http://";
210
+
211
+ return $protocol;
212
+ }
213
+
214
+ /**
215
+ * Get all IP headers so that we can process on our server...
216
+ *
217
+ * @return array
218
+ */
219
+ public function brute_get_headers() {
220
+ $o = array();
221
+
222
+ $ip_related_headers = array(
223
+ 'GD_PHP_HANDLER',
224
+ 'HTTP_AKAMAI_ORIGIN_HOP',
225
+ 'HTTP_CF_CONNECTING_IP',
226
+ 'HTTP_CLIENT_IP',
227
+ 'HTTP_FASTLY_CLIENT_IP',
228
+ 'HTTP_FORWARDED',
229
+ 'HTTP_FORWARDED_FOR',
230
+ 'HTTP_INCAP_CLIENT_IP',
231
+ 'HTTP_TRUE_CLIENT_IP',
232
+ 'HTTP_X_CLIENTIP',
233
+ 'HTTP_X_CLUSTER_CLIENT_IP',
234
+ 'HTTP_X_FORWARDED',
235
+ 'HTTP_X_FORWARDED_FOR',
236
+ 'HTTP_X_IP_TRAIL',
237
+ 'HTTP_X_REAL_IP',
238
+ 'HTTP_X_VARNISH',
239
+ 'REMOTE_ADDR'
240
+
241
+ );
242
+
243
+ foreach ($ip_related_headers as $header) {
244
+ if (isset($_SERVER[$header])) {
245
+ $o[$header] = $_SERVER[$header];
246
+ }
247
+ }
248
+
249
+ return $o;
250
+ }
251
+
252
+ /**
253
+ * process the brute call
254
+ *
255
+ * @param string $action 'check_ip', 'check_key', or 'failed_attempt'
256
+ * @param array $info Any custom data to post to the api
257
+ *
258
+ * @return array
259
+ */
260
+ public function brute_call($action = 'check_ip', $info = array()) {
261
+ $headers = $this->brute_get_headers();
262
+ $header_hash = md5(json_encode($headers));
263
+ $transient_name = 'hmw_brute_' . $header_hash;
264
+
265
+ $response = $this->get_transient($transient_name);
266
+ $attempts = (isset($response['attempts']) ? (int)$response['attempts'] : 0);
267
+
268
+ if ($action == 'failed_attempt') {
269
+ if ($this->check_whitelisted_ip($this->brute_get_ip())) {
270
+ $response['status'] = 'ok';
271
+ return $response;
272
+ }
273
+
274
+ $attempts = (int)$attempts + 1;
275
+
276
+ if ($attempts > HMW_Classes_Tools::getOption('brute_max_attempts')) {
277
+
278
+ $info['ip'] = $this->brute_get_ip();
279
+ $info['host'] = $this->brute_get_local_host();
280
+ $info['protocol'] = $this->brute_get_protocol();
281
+ $info['headers'] = json_encode($this->brute_get_headers());
282
+
283
+ $response = array_merge($response, $info);
284
+ $response['attempts'] = $attempts;
285
+ $response['status'] = 'blocked';
286
+
287
+ wp_redirect(site_url());
288
+ } else {
289
+ $response['attempts'] = $attempts;
290
+ $response['status'] = 'ok';
291
+ }
292
+ $this->set_transient($transient_name, $response, (int)HMW_Classes_Tools::getOption('brute_max_timeout'));
293
+ } elseif ($action == 'check_ip') {
294
+ $response['status'] = (isset($response['status']) ? $response['status'] : 'ok');
295
+
296
+ //Always block a banned IP
297
+ if ($this->check_banned_ip($this->brute_get_ip())) {
298
+ $response['status'] = 'blocked';
299
+
300
+ }
301
+
302
+ } elseif ($action == 'clear_ip') {
303
+ $this->delete_transient($transient_name);
304
+ }
305
+
306
+ return $response;
307
+ }
308
+
309
+ public function set_transient($transient, $value, $expiration) {
310
+ if (is_multisite() && !is_main_site()) {
311
+ switch_to_blog($this->get_main_blog_id());
312
+ $return = set_transient($transient, $value, $expiration);
313
+ restore_current_blog();
314
+ return $return;
315
+ }
316
+ return set_transient($transient, $value, $expiration);
317
+ }
318
+
319
+ public function delete_transient($transient) {
320
+ if (is_multisite() && !is_main_site()) {
321
+ switch_to_blog($this->get_main_blog_id());
322
+ $return = delete_transient($transient);
323
+ restore_current_blog();
324
+ return $return;
325
+ }
326
+ return delete_transient($transient);
327
+ }
328
+
329
+ public function get_transient($transient) {
330
+ if (is_multisite() && !is_main_site()) {
331
+ switch_to_blog($this->get_main_blog_id());
332
+ $return = get_transient($transient);
333
+ restore_current_blog();
334
+ return $return;
335
+ }
336
+ return get_transient($transient);
337
+ }
338
+
339
+ /**
340
+ * If we're in a multisite network, return the blog ID of the primary blog
341
+ *
342
+ * @return int
343
+ */
344
+ public function get_main_blog_id() {
345
+ if (defined('BLOG_ID_CURRENT_SITE')) {
346
+ return BLOG_ID_CURRENT_SITE;
347
+ }
348
+
349
+ return 1;
350
+ }
351
+
352
+
353
+ public function get_blocked_ips() {
354
+ global $wpdb;
355
+ $ips = array();
356
+ $pattern = '_transient_timeout_hmw_brute_';
357
+ //check 20 keyword at one time
358
+ $sql = "SELECT `option_name` FROM `" . $wpdb->options . "` WHERE (`option_name` like '$pattern%') ORDER BY `option_id` DESC";
359
+
360
+ if ($rows = $wpdb->get_results($sql)) {
361
+ foreach ($rows as $row) {
362
+ if (!$transient_value = $this->get_transient(str_replace($pattern, 'hmw_brute_', $row->option_name))) {
363
+ $this->delete_transient(str_replace($pattern, '', $row->option_name));
364
+ }
365
+ if ($transient_value['status'] == 'blocked') {
366
+ $ips[str_replace($pattern, 'hmw_brute_', $row->option_name)] = $transient_value;
367
+ }
368
+ }
369
+ }
370
+
371
+
372
+ return $ips;
373
+ }
374
+
375
+ public function check_banned_ip($ip) {
376
+ //Never block login from whitelisted IPs
377
+ $banlist = HMW_Classes_Tools::getOption('banlist_ip');
378
+ $wl_items = @json_decode($banlist, true);
379
+
380
+ if (isset($wl_items) && !empty($wl_items)) {
381
+ foreach ($wl_items as $item) {
382
+ $item = trim($item);
383
+ if ($ip == $item) {
384
+ return true;
385
+ }
386
+
387
+ if (strpos($item, '*') === false) { //no match, no wildcard
388
+ continue;
389
+ }
390
+
391
+ $iplong = ip2long($ip);
392
+ $ip_low = ip2long(str_replace('*', '0', $item));
393
+ $ip_high = ip2long(str_replace('*', '255', $item));
394
+
395
+ if ($iplong >= $ip_low && $iplong <= $ip_high) {//IP is within wildcard range
396
+ return true;
397
+ }
398
+
399
+ }
400
+ }
401
+ return false;
402
+ }
403
+
404
+ public function delete_ip($transient) {
405
+ $this->delete_transient($transient);
406
+ }
407
+
408
+
409
+ /**
410
+ * Verifies that a user answered the math problem correctly while logging in.
411
+ *
412
+ * @param mixed $user
413
+ * @param mixed $response
414
+ * @return mixed $user Returns the user if the math is correct
415
+ */
416
+ public function brute_math_authenticate($user, $response) {
417
+
418
+ if (isset($_POST['brute_num']) && isset($_POST['brute_ck'])) {
419
+ $salt = HMW_Classes_Tools::getOption('hmw_disable') . get_site_option('admin_email');
420
+ $ans = (int)$_POST['brute_num'];
421
+ $salted_ans = sha1($salt . $ans);
422
+ $correct_ans = $_POST['brute_ck'];
423
+
424
+ if (!$correct_ans && !isset($_POST['brute_ck'])) {
425
+ } elseif ($salted_ans != $correct_ans) {
426
+ $user = new WP_Error('authentication_failed',
427
+ sprintf(__('%sYou failed to correctly answer the math problem.%s Please try again', _HMW_PLUGIN_NAME_), '<strong>', '</strong>')
428
+ );
429
+ } elseif (is_wp_error($user)) {
430
+ if (!isset($response['attempts'])) {
431
+ $response['attempts'] = 0;
432
+ }
433
+ $left = max(((int)HMW_Classes_Tools::getOption('brute_max_attempts') - (int)$response['attempts']), 0);
434
+ $user = new WP_Error('authentication_failed',
435
+ sprintf(__('%sERROR:%s Email or Password is incorrect. %s %d attempts left before lockout', _HMW_PLUGIN_NAME_), '<strong>', '</strong>', '<br />', $left)
436
+ );
437
+ }
438
+ }
439
+
440
+ return $user;
441
+ }
442
+
443
+ /**
444
+ * Requires a user to solve a simple equation. Added to any WordPress login form.
445
+ *
446
+ * @return void outputs html
447
+ */
448
+ public function brute_math_form() {
449
+ if (!HMW_Classes_Tools::getOption('brute_use_math')) {
450
+ return;
451
+ }
452
+ $salt = HMW_Classes_Tools::getOption('hmw_disable') . get_site_option('admin_email');
453
+ $num1 = rand(0, 10);
454
+ $num2 = rand(1, 10);
455
+ $sum = $num1 + $num2;
456
+ $ans = sha1($salt . $sum);
457
+ ?>
458
+ <div style="margin: 5px 0 20px;">
459
+ <strong><?php echo __('Prove your humanity: ', _HMW_PLUGIN_NAME_) ?></strong>
460
+ <?php echo $num1 ?> &nbsp; + &nbsp; <?php echo $num2 ?> &nbsp; = &nbsp;
461
+ <input type="input" name="brute_num" value="" size="2"/>
462
+ <input type="hidden" name="brute_ck" value="<?php echo $ans; ?>" id="brute_ck"/>
463
+ </div>
464
+ <?php
465
+ }
466
+
467
+
468
+ public function brute_kill_login() {
469
+ do_action('hmw_kill_login', $this->brute_get_ip());
470
+ wp_ob_end_flush_all();
471
+ wp_die(HMW_Classes_Tools::getOption('hmw_brute_message'),
472
+ __('Login Blocked by Hide My WordPress', _HMW_PLUGIN_NAME_),
473
+ array('response' => 403)
474
+ );
475
+ }
476
+
477
+ }
models/Compatibility.php ADDED
@@ -0,0 +1,470 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
3
+
4
+ class HMW_Models_Compatibility {
5
+
6
+ public function __construct() {
7
+ if ( is_admin() ) {
8
+ add_filter( 'rocket_cache_reject_uri', array( $this, 'rocket_reject_url' ), PHP_INT_MAX );
9
+ } else {
10
+ defined( 'WPFC_REMOVE_FOOTER_COMMENT' ) || define( 'WPFC_REMOVE_FOOTER_COMMENT', true );
11
+ defined( 'WP_ROCKET_WHITE_LABEL_FOOTPRINT' ) || define( 'WP_ROCKET_WHITE_LABEL_FOOTPRINT', true );
12
+
13
+ if ( HMW_Classes_Tools::isPluginActive( 'wp-fastest-cache/wpFastestCache.php' ) ) {
14
+ global $wp_fastest_cache_options;
15
+ $wp_fastest_cache_options = json_decode( get_option( "WpFastestCache" ) );
16
+ if ( isset( $wp_fastest_cache_options->wpFastestCacheStatus ) ) {
17
+ $wp_fastest_cache_options->wpFastestCacheStatus = false;
18
+ }
19
+ }
20
+ }
21
+
22
+ //Check boot compatibility for some plugins and functionalities
23
+ $this->checkCompatibilityOnLoad();
24
+ }
25
+
26
+ public function alreadyCached() {
27
+ if ( did_action( 'wpsupercache_buffer' ) || did_action( 'autoptimize_html_after_minify' ) || did_action( 'rocket_buffer' ) || did_action( 'hmw_buffer' ) ) {
28
+ return true;
29
+ }
30
+
31
+ return false;
32
+ }
33
+
34
+ /**
35
+ * Check some compatibility on page load
36
+ *
37
+ */
38
+ public function checkCompatibilityOnLoad() {
39
+
40
+ if ( HMW_Classes_Tools::isPluginActive( 'ithemes-security-pro/ithemes-security-pro.php' ) ||
41
+ HMW_Classes_Tools::isPluginActive( 'better-wp-security/better-wp-security.php' )) {
42
+ $settings = get_option('itsec-storage');
43
+ if(isset($settings['hide-backend']['enabled']) && $settings['hide-backend']['enabled']) {
44
+ if ( isset( $settings['hide-backend']['slug'] ) && $settings['hide-backend']['slug'] <> '' ) {
45
+ defined( 'HMW_DEFAULT_LOGIN' ) || define( 'HMW_DEFAULT_LOGIN', $settings['hide-backend']['slug'] );
46
+ HMW_Classes_Tools::$options['hmw_login_url'] = HMW_Classes_Tools::$default['hmw_login_url'];
47
+ }
48
+ }
49
+ }
50
+
51
+ if ( ! is_admin() ) {
52
+
53
+ try {
54
+ if ( HMW_Classes_Tools::getOption( 'hmw_robots' ) ) {
55
+ if ( HMW_Classes_ObjController::getClass( 'HMW_Models_Files' )->isFile( $_SERVER['REQUEST_URI'] ) ) {
56
+ //Compatibility with Squirrly SEOx-cf-powered-by
57
+ if ( HMW_Classes_Tools::isPluginActive( 'squirrly-seo/squirrly.php' ) ) {
58
+ add_filter( 'sq_robots', array(
59
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' ),
60
+ 'replace_robots'
61
+ ), 11 );
62
+ } else {
63
+ if ( strpos( $_SERVER['REQUEST_URI'], 'robots.txt' ) ) {
64
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' )->replace_robots( false );
65
+ }
66
+ }
67
+ }
68
+ }
69
+ } catch ( Exception $e ) {
70
+ }
71
+ }
72
+
73
+ }
74
+
75
+ /**
76
+ * Check other plugins and set compatibility settings
77
+ */
78
+ public function checkCompatibility() {
79
+ //don't let to rename and hide the current paths if logout is required
80
+ if ( HMW_Classes_Tools::getOption( 'error' ) || HMW_Classes_Tools::getOption( 'logout' ) ) {
81
+ return;
82
+ }
83
+
84
+ if ( ! is_admin() ) {
85
+
86
+ //compatibility with Wp Maintenance plugin
87
+ if ( HMW_Classes_Tools::isPluginActive( 'wp-maintenance-mode/wp-maintenance-mode.php' ) ) {
88
+ add_filter( 'wpmm_footer', array(
89
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' ),
90
+ 'getTempBuffer'
91
+ ) );
92
+ }
93
+
94
+ //Chech if the users set to change for logged users users
95
+ //don't let cache plugins to change the paths is not needed
96
+ if ( ! HMW_Classes_Tools::doChangesAdmin() ) {
97
+ add_filter( 'hmw_laterload', array( 'HMW_Classes_Tools', 'returnFalse' ) );
98
+ add_filter( 'hmw_process_buffer', array( 'HMW_Classes_Tools', 'returnFalse' ) );
99
+
100
+ return;
101
+ }
102
+
103
+ //Change the template directory URL in themes
104
+ if ( HMW_Classes_Tools::isThemeActive( 'Avada' ) ) {
105
+ add_filter( 'template_directory_uri', array(
106
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' ),
107
+ 'find_replace_url'
108
+ ), PHP_INT_MAX );
109
+ }
110
+
111
+ //Compatibility with Squirrly SEO
112
+ if ( HMW_Classes_Tools::isPluginActive( 'squirrly-seo/squirrly.php' ) ) {
113
+ add_filter( 'sq_buffer', array(
114
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' ),
115
+ 'find_replace'
116
+ ), PHP_INT_MAX );
117
+ }
118
+
119
+ //Compatibility with WP-rocket plugin
120
+ if ( HMW_Classes_Tools::isPluginActive( 'wp-rocket/wp-rocket.php' ) ) {
121
+ add_filter( 'hmw_process_buffer', array( 'HMW_Classes_Tools', 'returnFalse' ) );
122
+
123
+ add_filter( 'rocket_buffer', array(
124
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' ),
125
+ 'find_replace'
126
+ ), PHP_INT_MAX );
127
+
128
+ add_filter( 'rocket_cache_busting_filename', array(
129
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' ),
130
+ 'find_replace_url'
131
+ ), PHP_INT_MAX );
132
+ add_filter( 'rocket_iframe_lazyload_placeholder', array(
133
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' ),
134
+ 'find_replace_url'
135
+ ), PHP_INT_MAX );
136
+
137
+ return;
138
+ }
139
+
140
+
141
+ //Compatibility with CDN Enabler
142
+ if ( HMW_Classes_Tools::isPluginActive( 'hummingbird-performance/wp-hummingbird.php' ) ) {
143
+ add_filter( 'hmw_laterload', array( 'HMW_Classes_Tools', 'returnTrue' ) );
144
+ add_filter( 'hmw_process_buffer', array( 'HMW_Classes_Tools', 'returnTrue' ) );
145
+
146
+ return;
147
+ }
148
+
149
+ //Compatibility with Wp Super Cache Plugin
150
+ if ( HMW_Classes_Tools::isPluginActive( 'wp-super-cache/wp-cache.php' ) ) {
151
+ //add_filter('hmw_laterload', array('HMW_Classes_Tools', 'returnFalse'));
152
+ add_filter( 'hmw_process_buffer', array( 'HMW_Classes_Tools', 'returnTrue' ) );
153
+
154
+ add_filter( 'wpsupercache_buffer', array(
155
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' ),
156
+ 'find_replace'
157
+ ), PHP_INT_MAX );
158
+
159
+ return;
160
+ }
161
+
162
+ //Compatibility with CDN Enabler
163
+ if ( HMW_Classes_Tools::isPluginActive( 'cdn-enabler/cdn-enabler.php' ) ) {
164
+ add_filter( 'hmw_laterload', array( 'HMW_Classes_Tools', 'returnTrue' ) );
165
+ add_filter( 'hmw_process_buffer', array( 'HMW_Classes_Tools', 'returnTrue' ) );
166
+
167
+ return;
168
+ }
169
+
170
+
171
+ //Compatibility with Autoptimize plugin
172
+ if ( HMW_Classes_Tools::isPluginActive( 'autoptimize/autoptimize.php' ) ) {
173
+ add_filter( 'hmw_laterload', array( 'HMW_Classes_Tools', 'returnFalse' ) );
174
+ add_filter( 'hmw_process_buffer', array( 'HMW_Classes_Tools', 'returnTrue' ) );
175
+
176
+ return;
177
+ }
178
+
179
+ if ( HMW_Classes_Tools::isPluginActive( 'wp-asset-clean-up/wpacu.php' ) || HMW_Classes_Tools::isPluginActive( 'wp-asset-clean-up-pro/wpacu.php' ) ) {
180
+ add_filter( 'hmw_process_buffer', array( 'HMW_Classes_Tools', 'returnFalse' ) );
181
+ add_filter( 'hmw_laterload', array( 'HMW_Classes_Tools', 'returnFalse' ) );
182
+
183
+ add_filter( 'wpacu_html_source', array(
184
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' ),
185
+ 'find_replace'
186
+ ), PHP_INT_MAX );
187
+
188
+ return;
189
+ }
190
+
191
+ //Patch for WOT Cache plugin
192
+ if ( defined( 'WOT_VERSION' ) ) {
193
+ add_filter( 'hmw_laterload', array( 'HMW_Classes_Tools', 'returnTrue' ) );
194
+ add_filter( 'hmw_process_buffer', array( 'HMW_Classes_Tools', 'returnTrue' ) );
195
+
196
+ add_filter( 'wot_cache', array(
197
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' ),
198
+ 'find_replace'
199
+ ), PHP_INT_MAX );
200
+
201
+ return;
202
+ }
203
+
204
+ //For woo-global-cart plugin
205
+ if ( defined( 'WOOGC_VERSION' ) ) {
206
+ remove_all_actions( 'shutdown', 1 );
207
+ add_filter( 'hmw_buffer', array( $this, 'fix_woogc_shutdown' ) );
208
+
209
+ return;
210
+ }
211
+
212
+ if ( HMW_Classes_Tools::isPluginActive( 'cache-enabler/cache-enabler.php' ) ) {
213
+ add_filter( 'hmw_laterload', array( 'HMW_Classes_Tools', 'returnFalse' ) );
214
+ add_filter( 'hmw_process_buffer', array( 'HMW_Classes_Tools', 'returnTrue' ) );
215
+
216
+ return;
217
+ }
218
+
219
+ //Compatibility with Wp Fastest Cache
220
+ if ( HMW_Classes_Tools::isPluginActive( 'wp-fastest-cache/wpFastestCache.php' ) ) {
221
+ add_filter( 'hmw_laterload', array( 'HMW_Classes_Tools', 'returnTrue' ) );
222
+ add_filter( 'hmw_process_buffer', array( 'HMW_Classes_Tools', 'returnTrue' ) );
223
+
224
+ return;
225
+ }
226
+
227
+ //Compatibility with Powered Cache
228
+ if ( HMW_Classes_Tools::isPluginActive( 'powered-cache/powered-cache.php' ) ) {
229
+ global $powered_cache_options;
230
+
231
+ if ( apply_filters( 'powered_cache_lazy_load_enabled', true ) ) {
232
+ add_filter( 'hmw_process_buffer', array( 'HMW_Classes_Tools', 'returnTrue' ) );
233
+ }
234
+
235
+ add_filter( 'powered_cache_page_caching_buffer', array(
236
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' ),
237
+ 'find_replace'
238
+ ), PHP_INT_MAX );
239
+ if ( isset( $powered_cache_options ) ) {
240
+ $powered_cache_options['show_cache_message'] = false;
241
+ }
242
+
243
+ return;
244
+ }
245
+
246
+ //Compatibility with W3 Total cache
247
+ if ( HMW_Classes_Tools::isPluginActive( 'w3-total-cache/w3-total-cache.php' ) ) {
248
+ //Don't show comments
249
+ add_filter( 'w3tc_can_print_comment', array( 'HMW_Classes_Tools', 'returnFalse' ), PHP_INT_MAX );
250
+
251
+ return;
252
+ }
253
+
254
+ }
255
+ }
256
+
257
+ public static function getAlerts() {
258
+ //is CDN plugin installed
259
+ if ( is_admin() || is_network_admin() ) {
260
+ if ( HMW_Classes_Tools::isPluginActive( 'cdn-enabler/cdn-enabler.php' ) ) {
261
+ if ( HMW_Classes_Tools::getOption( 'hmw_mode' ) <> 'default' ) {
262
+ if ( $cdn_enabler = get_option( 'cdn_enabler' ) ) {
263
+ if ( isset( $cdn_enabler['dirs'] ) ) {
264
+ $dirs = explode( ',', $cdn_enabler['dirs'] );
265
+ if ( ! empty( $dirs ) &&
266
+ ! in_array( HMW_Classes_Tools::getOption( 'hmw_wp-content_url' ), $dirs ) &&
267
+ ! in_array( HMW_Classes_Tools::getOption( 'hmw_wp-includes_url' ), $dirs )
268
+ ) {
269
+ HMW_Classes_Error::setError( __( 'CDN Enabled detected. Please include the new wp-content and wp-includes paths in CDN Enabler Settings', _HMW_PLUGIN_NAME_ ), 'default' );
270
+ }
271
+ }
272
+ }
273
+ }
274
+
275
+ if ( isset( $_SERVER["REQUEST_URI"] ) ) {
276
+ if ( admin_url( 'options-general.php?page=cdn_enabler', 'relative' ) == $_SERVER['REQUEST_URI'] ) {
277
+ HMW_Classes_Error::setError( sprintf( __( "CDN Enabler detected! Learn how to configure it with Hide My WP %sClick here%s", _HMW_PLUGIN_NAME_ ), '<a href="https://hidemywpghost.com/hide-my-wp-and-cdn-enabler/" target="_blank">', '</a>' ), 'error' );
278
+ }
279
+ }
280
+ }
281
+
282
+ if ( HMW_Classes_Tools::isPluginActive( 'wp-super-cache/wp-cache.php' ) ) {
283
+ if ( get_option( 'ossdl_off_cdn_url' ) <> '' && get_option( 'ossdl_off_cdn_url' ) <> home_url() ) {
284
+ $dirs = explode( ',', get_option( 'ossdl_off_include_dirs' ) );
285
+ if ( ! empty( $dirs ) &&
286
+ ! in_array( HMW_Classes_Tools::getOption( 'hmw_wp-content_url' ), $dirs ) &&
287
+ ! in_array( HMW_Classes_Tools::getOption( 'hmw_wp-includes_url' ), $dirs )
288
+ ) {
289
+ HMW_Classes_Error::setError( sprintf( __( 'WP Super Cache CDN detected. Please include %s and %s paths in WP Super Cache > CDN > Include directories', _HMW_PLUGIN_NAME_ ), '<strong>' . HMW_Classes_Tools::getOption( 'hmw_wp-content_url' ) . '</strong>', '<strong>' . HMW_Classes_Tools::getOption( 'hmw_wp-includes_url' ) . '</strong>' ), 'default' );
290
+ }
291
+ }
292
+ }
293
+
294
+ //Mor Rewrite is not installed
295
+ if ( HMW_Classes_Tools::isApache() && ! HMW_Classes_Tools::isModeRewrite() ) {
296
+ HMW_Classes_Error::setError( sprintf( __( 'Hide My WP does not work without mode_rewrite. Please activate the rewrite module in Apache. %sMore details%s', _HMW_PLUGIN_NAME_ ), '<a href="https://tecadmin.net/enable-apache-mod-rewrite-module-in-ubuntu-linuxmint/" target="_blank">', '</a>' ) );
297
+ }
298
+
299
+ //No permalink structure
300
+ if ( ! HMW_Classes_Tools::isPermalinkStructure() ) {
301
+ HMW_Classes_Error::setError( sprintf( __( 'Hide My WP does not work with %s Permalinks. Change it to %s or other type in Settings > Permalinks in order to hide it', _HMW_PLUGIN_NAME_ ), __( 'Plain' ), __( 'Post Name' ) ) );
302
+ defined( 'HMW_DISABLE' ) || define( 'HMW_DISABLE', true );
303
+ } else {
304
+ //IIS server and no Rewrite Permalinks installed
305
+ if ( HMW_Classes_Tools::isIIS() && HMW_Classes_Tools::isPHPPermalink() ) {
306
+ HMW_Classes_Error::setError( sprintf( __( 'You need to activate the URL Rewrite for IIS to be able to change the permalink structure to friendly URL (without index.php). %sMore details%s', _HMW_PLUGIN_NAME_ ), '<a href="https://www.iis.net/downloads/microsoft/url-rewrite" target="_blank">', '</a>' ) );
307
+ } elseif ( HMW_Classes_Tools::isPHPPermalink() ) {
308
+ HMW_Classes_Error::setError( __( 'You need to set the permalink structure to friendly URL (without index.php).', _HMW_PLUGIN_NAME_ ) );
309
+ }
310
+ }
311
+
312
+ if ( HMW_Classes_ObjController::getClass( 'HMW_Models_Rules' )->isConfigAdminCookie() ) {
313
+ HMW_Classes_Error::setError( __( 'The constant ADMIN_COOKIE_PATH is defined in wp-config.php by another plugin. Hide My WP will not work unless you remove the line define(\'ADMIN_COOKIE_PATH\', ...);', _HMW_PLUGIN_NAME_ ) );
314
+ defined( 'HMW_DISABLE' ) || define( 'HMW_DISABLE', true );
315
+ }
316
+
317
+ //Inmotion server detected
318
+ if ( HMW_Classes_Tools::isInmotion() ) {
319
+ HMW_Classes_Error::setError( sprintf( __( 'Inmotion detected. %sPlease read how to make the plugin compatible with Inmotion Nginx Cache%s', _HMW_PLUGIN_NAME_ ), '<a href="https://hidemywpghost.com/hide-my-wp-pro-compatible-with-inmotion-wordpress-hosting/" target="_blank">', '</a>' ) );
320
+ }
321
+
322
+ //The login path is changed by other plugins and may affect the functionality
323
+ if ( HMW_Classes_Tools::$default['hmw_login_url'] == HMW_Classes_Tools::getOption( 'hmw_login_url' ) ) {
324
+ if ( strpos( site_url( 'wp-login.php' ), HMW_Classes_Tools::$default['hmw_login_url'] ) === false ) {
325
+ defined( 'HMW_DEFAULT_LOGIN' ) || define( 'HMW_DEFAULT_LOGIN', site_url( 'wp-login.php' ) );
326
+ }
327
+ }
328
+
329
+ //The admin URL is already changed by other plugins and may affect the functionality
330
+ if ( ! HMW_RULES_IN_CONFIG ) {
331
+ HMW_Classes_Error::setError( __( 'Hide My WP rules are not saved in the config file and this may affect the website loading speed.', _HMW_PLUGIN_NAME_ ) );
332
+ defined( 'HMW_DEFAULT_ADMIN' ) || define( 'HMW_DEFAULT_ADMIN', HMW_Classes_Tools::$default['hmw_admin_url'] );
333
+ } elseif ( HMW_Classes_Tools::$default['hmw_admin_url'] == HMW_Classes_Tools::getOption( 'hmw_admin_url' ) ) {
334
+ if ( strpos( admin_url(), HMW_Classes_Tools::$default['hmw_admin_url'] ) === false ) {
335
+ defined( 'HMW_DEFAULT_ADMIN' ) || define( 'HMW_DEFAULT_ADMIN', admin_url() );
336
+ }
337
+ }
338
+
339
+
340
+ if ( HMW_Classes_Tools::isGodaddy() ) {
341
+ HMW_Classes_Error::setError( sprintf( __( "Godaddy detected! To avoid CSS errors, make sure you switch off the CDN from %s", _HMW_PLUGIN_NAME_ ), '<strong>' . '<a href="https://hidemywpghost.com/how-to-use-hide-my-wp-with-godaddy/" target="_blank"> Godaddy > Managed WordPress > Overview</a>' . '</strong>' ) );
342
+ }
343
+
344
+ //Check if the rules are working as expected
345
+ if ( HMW_Classes_Tools::getOption( 'rewrites' ) ) {
346
+ HMW_Classes_Error::setError( __( 'Some URLs passed through the config file rules and loaded through WordPress which may slow down your website.', _HMW_PLUGIN_NAME_ ) );
347
+ if ( HMW_Classes_Tools::isApache() || HMW_Classes_Tools::isLitespeed() ) {
348
+ HMW_Classes_Error::setError( sprintf( __( 'Save the settings and check the rules in .htaccess file. %sMake sure you activated AllowOverride All for your domain%s.', _HMW_PLUGIN_NAME_ ), '<a href="https://hidemywpghost.com/how-to-enable-allowoverwrite-on-google-cloud-platform/" target="_blank">', '</a>' ) );
349
+ } elseif ( HMW_Classes_Tools::isNginx() ) {
350
+ HMW_Classes_Error::setError( sprintf( __( 'Save the settings and add the config file in Nginx. Follow %sSetup Hide My WP Ghost on Nginx Server%s.', _HMW_PLUGIN_NAME_ ), '<a href="https://hidemywpghost.com/how-to-setup-hide-my-wp-on-nginx-server/" target="_blank">', '</a>' ) );
351
+ } elseif ( HMW_Classes_Tools::isWpengine() ) {
352
+ HMW_Classes_Error::setError( sprintf( __( 'Save the settings and add the rewrite rules in WPEngine and .htaccess. Follow %sSetup Hide My WP Ghost on Nginx Server%s.', _HMW_PLUGIN_NAME_ ), '<a href="https://hidemywpghost.com/hide-my-wp-pro-compatible-with-wp-engine/" target="_blank">', '</a>' ) );
353
+ } elseif ( HMW_Classes_Tools::isWindows() ) {
354
+ HMW_Classes_Error::setError( sprintf( __( 'Save the settings and add the rewrite rules in web.config file. Follow %sSetup Hide My WP on Windows IIS server%s tutorial.', _HMW_PLUGIN_NAME_ ), '<a href="https://hidemywpghost.com/kb/setup-hide-my-wp-on-windows-iis-server/" target="_blank">', '</a>' ) );
355
+ }
356
+ }
357
+
358
+ }
359
+
360
+
361
+ }
362
+
363
+ public function rocket_reject_url( $uri ) {
364
+ if ( HMW_Classes_Tools::$default['hmw_login_url'] <> HMW_Classes_Tools::getOption( 'hmw_login_url' ) ) {
365
+ $path = parse_url( home_url(), PHP_URL_PATH );
366
+ $uri[] = ( $path <> '/' ? $path . '/' : $path ) . HMW_Classes_Tools::getOption( 'hmw_login_url' );
367
+ }
368
+
369
+ return $uri;
370
+ }
371
+
372
+
373
+ /**
374
+ * Include CDNs if found
375
+ * @return array|false
376
+ */
377
+ public function findCDNServers() {
378
+ $domains = array();
379
+
380
+ HMW_Debug::dump( "findCDNServers", HMW_Classes_Tools::isPluginActive( 'wp-rocket/wp-rocket.php' ) );
381
+
382
+ if ( HMW_Classes_Tools::isPluginActive( 'wp-rocket/wp-rocket.php' ) && function_exists( 'get_rocket_option' ) ) {
383
+ HMW_Debug::dump( "wp rocket installed" );
384
+ $cnames = get_rocket_option( 'cdn_cnames', array() );
385
+ foreach ( $cnames as $k => $_urls ) {
386
+ HMW_Debug::dump( $_urls );
387
+ $_urls = explode( ',', $_urls );
388
+ $_urls = array_map( 'trim', $_urls );
389
+
390
+ foreach ( $_urls as $url ) {
391
+ $domains[] = $url;
392
+ }
393
+ }
394
+ }
395
+
396
+ if ( HMW_Classes_Tools::isPluginActive( 'cdn-enabler/cdn-enabler.php' ) ) {
397
+ if ( $cd_enabler = get_option( 'cdn_enabler' ) ) {
398
+ if ( isset( $cd_enabler['url'] ) ) {
399
+ $domains[] = $cd_enabler['url'];
400
+ }
401
+ }
402
+ }
403
+
404
+ if ( HMW_Classes_Tools::isPluginActive( 'powered-cache/powered-cache.php' ) ) {
405
+ global $powered_cache_options;
406
+ if ( isset( $powered_cache_options['cdn_hostname'] ) ) {
407
+ $hostnames = $powered_cache_options['cdn_hostname'];
408
+ if ( ! empty( $hostnames ) ) {
409
+ foreach ( $hostnames as $host ) {
410
+ if ( ! empty( $host ) ) {
411
+ $domains[] = $host;
412
+ }
413
+ }
414
+ }
415
+ }
416
+ }
417
+
418
+ if ( HMW_Classes_Tools::isPluginActive( 'wp-super-cache/wp-cache.php' ) ) {
419
+ if ( get_option( 'ossdl_off_cdn_url' ) <> '' && get_option( 'ossdl_off_cdn_url' ) <> home_url() ) {
420
+ $domains[] = get_option( 'ossdl_off_cdn_url' );
421
+ }
422
+ }
423
+
424
+ if ( ! empty( $domains ) ) {
425
+ return $domains;
426
+ }
427
+
428
+ return false;
429
+ }
430
+
431
+ /**
432
+ * Fix compatibility with WooGC plugin
433
+ *
434
+ * @param $buffer
435
+ *
436
+ * @return mixed
437
+ */
438
+ public function fix_woogc_shutdown( $buffer ) {
439
+ global $blog_id, $woocommerce, $WooGC;;
440
+
441
+ if ( ! class_exists( 'WooGC' ) ) {
442
+ return $buffer;
443
+ }
444
+
445
+ if ( ! is_object( $woocommerce->cart ) ) {
446
+ return $buffer;
447
+ }
448
+
449
+
450
+ if ( ! $WooGC instanceof WooGC ) {
451
+ return $buffer;
452
+ }
453
+
454
+ $options = $WooGC->functions->get_options();
455
+ $blog_details = get_blog_details( $blog_id );
456
+
457
+ //replace any checkout links
458
+ if ( ! empty( $options['cart_checkout_location'] ) && $options['cart_checkout_location'] != $blog_id ) {
459
+ $checkout_url = $woocommerce->cart->get_checkout_url();
460
+ $checkout_url = str_replace( array( 'http:', 'https:' ), "", $checkout_url );
461
+ $checkout_url = trailingslashit( $checkout_url );
462
+
463
+ $buffer = str_replace( $blog_details->domain . "/checkout/", $checkout_url, $buffer );
464
+
465
+ }
466
+
467
+ return $buffer;
468
+ }
469
+
470
+ }
models/Cookies.php ADDED
@@ -0,0 +1,185 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') || die('Cheatin\' uh?');
3
+
4
+ class HMW_Models_Cookies {
5
+
6
+ public function __construct() {
7
+ if (HMW_Classes_Tools::$default['hmw_admin_url'] <> HMW_Classes_Tools::getOption('hmw_admin_url')) {
8
+ $this->setCookieContants();
9
+
10
+ add_filter('redirect_post_location', array($this, 'setPostCookie'), PHP_INT_MAX, 2);
11
+ add_action('set_auth_cookie', array($this, 'setAuthCookie'), PHP_INT_MAX, 2);
12
+ add_action('clear_auth_cookie', array($this, 'setCleanCookie'), PHP_INT_MAX);
13
+ add_action('set_logged_in_cookie', array($this, 'setLoginCookie'), PHP_INT_MAX, 2);
14
+ }
15
+ }
16
+
17
+ /**
18
+ * Set the cookie constants in case of admin change
19
+ */
20
+ public function setCookieContants() {
21
+ if (!defined('HMW_ADMIN_COOKIE_PATH')) {
22
+ if (is_multisite()) {
23
+ global $blog_id;
24
+ switch_to_blog($blog_id);
25
+
26
+ ms_cookie_constants();
27
+ if (!is_subdomain_install() || trim(parse_url(get_option('siteurl'), PHP_URL_PATH), '/')) {
28
+ define('HMW_ADMIN_COOKIE_PATH', SITECOOKIEPATH);
29
+ } else {
30
+ define('HMW_ADMIN_COOKIE_PATH', SITECOOKIEPATH . HMW_Classes_Tools::getOption('hmw_admin_url'));
31
+ }
32
+ restore_current_blog();
33
+ } else {
34
+ wp_cookie_constants();
35
+ define('HMW_ADMIN_COOKIE_PATH', SITECOOKIEPATH . HMW_Classes_Tools::getOption('hmw_admin_url'));
36
+ }
37
+ }
38
+ if (!defined('HMW_PLUGINS_COOKIE_PATH')) {
39
+ define('HMW_PLUGINS_COOKIE_PATH', preg_replace('|https?://[^/]+|i', '', get_option('siteurl') . '/' . HMW_Classes_Tools::getOption('hmw_plugin_url')));
40
+ }
41
+ }
42
+
43
+
44
+ public function setPostCookie($location, $post_id) {
45
+ if (defined('HMW_ADMIN_COOKIE_PATH')) {
46
+ if ($post_id > 0) {
47
+ if (isset($_COOKIE['wp-saving-post']) && $_COOKIE['wp-saving-post'] === $post_id . '-check') {
48
+ setcookie('wp-saving-post', $post_id . '-saved', time() + DAY_IN_SECONDS, HMW_ADMIN_COOKIE_PATH, COOKIE_DOMAIN, is_ssl());
49
+ }
50
+ }
51
+ }
52
+ return $location;
53
+ }
54
+
55
+ public function setTestCookie() {
56
+ if (!defined('TEST_COOKIE'))
57
+ define('TEST_COOKIE', 'test_cookie');
58
+
59
+ $secure = is_ssl() && 'https' === parse_url(get_option('home'), PHP_URL_SCHEME);
60
+ setcookie(TEST_COOKIE, 'WP Cookie check', 0, COOKIEPATH, $this->getCookieDomain(), $secure);
61
+ if (SITECOOKIEPATH != COOKIEPATH) {
62
+ setcookie(TEST_COOKIE, 'WP Cookie check', 0, SITECOOKIEPATH, COOKIE_DOMAIN, $secure);
63
+ }
64
+ }
65
+
66
+ public function testCookies() {
67
+ $secure = is_ssl();
68
+ if ( $secure ) {
69
+ $auth_cookie_name = SECURE_AUTH_COOKIE;
70
+ } else {
71
+ $auth_cookie_name = AUTH_COOKIE;
72
+ }
73
+
74
+ return ( isset( $_COOKIE[ $auth_cookie_name ] ) && $_COOKIE[ $auth_cookie_name ] );
75
+ }
76
+
77
+ public function setCookiesCurrentPath() {
78
+ global $current_user;
79
+
80
+ if ( $current_user->ID ) {
81
+ wp_set_auth_cookie( $current_user->ID );
82
+
83
+ if ( $this->testCookies() ) {
84
+ return true;
85
+ }
86
+ }
87
+
88
+ return false;
89
+ }
90
+
91
+ public function setAuthCookie($auth_cookie, $expire) {
92
+ if (defined('HMW_ADMIN_COOKIE_PATH')) {
93
+ $secure = is_ssl();
94
+ if ($secure) {
95
+ $auth_cookie_name = SECURE_AUTH_COOKIE;
96
+ } else {
97
+ $auth_cookie_name = AUTH_COOKIE;
98
+ }
99
+
100
+ if (defined('HMW_PLUGINS_COOKIE_PATH')) {
101
+ setcookie($auth_cookie_name, $auth_cookie, $expire, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN, $secure, true);
102
+ setcookie($auth_cookie_name, $auth_cookie, $expire, HMW_PLUGINS_COOKIE_PATH, $this->getCookieDomain(), $secure, true);
103
+ }
104
+
105
+ setcookie($auth_cookie_name, $auth_cookie, $expire, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN, $secure, true);
106
+ setcookie($auth_cookie_name, $auth_cookie, $expire, ADMIN_COOKIE_PATH, COOKIE_DOMAIN, $secure, true);
107
+
108
+ setcookie($auth_cookie_name, $auth_cookie, $expire, HMW_ADMIN_COOKIE_PATH, $this->getCookieDomain(), $secure, true);
109
+ }
110
+ }
111
+
112
+ public function setLoginCookie($logged_in_cookie, $expire) {
113
+ // Front-end cookie is secure when the auth cookie is secure and the site's home URL is forced HTTPS.
114
+ $secure_logged_in_cookie = is_ssl() && 'https' === parse_url(get_option('home'), PHP_URL_SCHEME);
115
+
116
+ setcookie(LOGGED_IN_COOKIE, $logged_in_cookie, $expire, COOKIEPATH, $this->getCookieDomain(), $secure_logged_in_cookie, true);
117
+ if (COOKIEPATH != SITECOOKIEPATH) {
118
+ setcookie(LOGGED_IN_COOKIE, $logged_in_cookie, $expire, SITECOOKIEPATH, $this->getCookieDomain(), $secure_logged_in_cookie, true);
119
+ }
120
+
121
+ setcookie(LOGGED_IN_COOKIE, $logged_in_cookie, $expire, COOKIEPATH, COOKIE_DOMAIN, $secure_logged_in_cookie, true);
122
+ if (COOKIEPATH != SITECOOKIEPATH)
123
+ setcookie(LOGGED_IN_COOKIE, $logged_in_cookie, $expire, SITECOOKIEPATH, COOKIE_DOMAIN, $secure_logged_in_cookie, true);
124
+
125
+ }
126
+
127
+ /**
128
+ * Check if the current user IP is always the same
129
+ * If not, request a relogin
130
+ * @param $response
131
+ * @return mixed
132
+ */
133
+ public function checkLoggedIP($response) {
134
+ if (isset($_SERVER['REMOTE_ADDR']) && isset($_COOKIE['wordpress_logged_address'])) {
135
+ if (md5($_SERVER['REMOTE_ADDR']) <> $_COOKIE['wordpress_logged_address']) {
136
+ global $current_user;
137
+ $current_user->ID = null;
138
+ $response['wp-auth-check'] = false;
139
+ }
140
+ }
141
+
142
+ return $response;
143
+ }
144
+ /**
145
+ * Clean the user cookies on logout
146
+ */
147
+ /**
148
+ * Clean the user cookies on logout
149
+ */
150
+ public function setCleanCookie() {
151
+ if (defined('HMW_ADMIN_COOKIE_PATH') && defined('PLUGINS_COOKIE_PATH')) {
152
+ setcookie(AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, HMW_ADMIN_COOKIE_PATH, $this->getCookieDomain());
153
+ setcookie(SECURE_AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, HMW_ADMIN_COOKIE_PATH, $this->getCookieDomain());
154
+ setcookie('wordpress_logged_address', ' ', time() - YEAR_IN_SECONDS, HMW_ADMIN_COOKIE_PATH, $this->getCookieDomain());
155
+
156
+ setcookie(AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, HMW_PLUGINS_COOKIE_PATH, $this->getCookieDomain());
157
+ setcookie(SECURE_AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, HMW_PLUGINS_COOKIE_PATH, $this->getCookieDomain());
158
+ setcookie('wordpress_logged_address', ' ', time() - YEAR_IN_SECONDS, HMW_PLUGINS_COOKIE_PATH, $this->getCookieDomain());
159
+ }
160
+ }
161
+
162
+ public function getCookieDomain() {
163
+ $domain = COOKIE_DOMAIN;
164
+
165
+ if (is_multisite()) {
166
+ global $blog_id;
167
+ switch_to_blog($blog_id);
168
+ $current_network = get_network();
169
+
170
+ $domain = preg_replace('|^www\.|', '', parse_url(get_option('siteurl'), PHP_URL_HOST));
171
+
172
+ if (!empty($current_network->cookie_domain)) {
173
+ if (strpos($current_network->cookie_domain, $domain) === false) {
174
+ $domain = '.' . $domain;
175
+ }
176
+ } elseif (strpos($current_network->domain, $domain) === false) {
177
+ $domain = '.' . $domain;
178
+ }
179
+ restore_current_blog();
180
+ }
181
+
182
+ return $domain;
183
+ }
184
+
185
+ }
models/Files.php ADDED
@@ -0,0 +1,400 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') || die('Cheatin\' uh?');
3
+
4
+ class HMW_Models_Files {
5
+
6
+ protected $_files = array();
7
+ protected $_replace = array();
8
+ protected $_rewrites = array();
9
+
10
+ public function __construct() {
11
+ $this->_files = array(
12
+ 'jpg',
13
+ 'jpeg',
14
+ 'png',
15
+ 'bmp',
16
+ 'gif',
17
+ 'jp2',
18
+ 'webp',
19
+ 'css',
20
+ 'scss',
21
+ 'js',
22
+ 'woff',
23
+ 'woff2',
24
+ 'ttf',
25
+ 'otf',
26
+ 'pfb',
27
+ 'pfm',
28
+ 'tfil',
29
+ 'eot',
30
+ 'svg',
31
+ 'pdf',
32
+ 'doc',
33
+ 'docx',
34
+ 'csv',
35
+ 'xls',
36
+ 'xslx',
37
+ 'mp2',
38
+ 'mp3',
39
+ 'mp4',
40
+ 'mpeg',
41
+ 'zip',
42
+ 'rar',
43
+ 'txt'
44
+ );
45
+
46
+ //init the replace array
47
+ $this->_replace = array('from' => [], 'to' => []);
48
+ }
49
+
50
+ /**
51
+ * Check if the current URL is a file
52
+ */
53
+ public function checkBrokenFile() {
54
+ //don't let to rename and hide the current paths if logout is required
55
+ if (HMW_Classes_Tools::getOption('error') || HMW_Classes_Tools::getOption('logout')) {
56
+ return;
57
+ }
58
+
59
+ //stop here is the option is default.
60
+ //the prvious code is needed for settings change and validation
61
+ if (HMW_Classes_Tools::getOption('hmw_mode') == 'default') {
62
+ return;
63
+ }
64
+
65
+ if (is_404()) {
66
+ $this->showFile($this->getCurrentURL());
67
+ }
68
+ }
69
+
70
+ /**
71
+ *
72
+ * If the rewrite config is not set
73
+ * If there is a new file path, change it back to real path and show the file
74
+ * Prevents errors when the paths are chnged but the rewrite config is not set up correctly
75
+ * @param $url
76
+ * @return bool|string
77
+ */
78
+ public function isFile($url) {
79
+ if ($url <> '') {
80
+ if (strpos($url, '?') !== false) $url = substr($url, 0, strpos($url, '?'));
81
+ if (strrpos($url, '.') !== false) {
82
+ $ext = substr($url, strrpos($url, '.') + 1);
83
+ if (in_array($ext, $this->_files)) {
84
+ return $ext;
85
+ }
86
+ }
87
+ }
88
+
89
+ return false;
90
+ }
91
+
92
+ /**
93
+ * Get the current URL
94
+ * @return string
95
+ */
96
+ public function getCurrentURL() {
97
+ $url = '';
98
+
99
+ if (isset($_SERVER['HTTP_HOST'])) {
100
+ // build the URL in the address bar
101
+ $url = is_ssl() ? 'https://' : 'http://';
102
+ $url .= $_SERVER['HTTP_HOST'];
103
+ $url .= $_SERVER['REQUEST_URI'];
104
+ }
105
+
106
+ return $url;
107
+ }
108
+
109
+ /**
110
+ * Build the redirects array
111
+ * @throws Exception
112
+ */
113
+ public function buildRedirect() {
114
+ $rewriteModel = HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' );
115
+
116
+ //build the rules paths to change back the hidden paths
117
+ if ( !isset( $rewriteModel->_replace['from'] ) && !isset( $rewriteModel->_replace['to'] ) ) {
118
+ $rewriteModel->buildRedirect();
119
+ }
120
+
121
+ foreach ( $rewriteModel->_replace['from'] as $key => $row ) {
122
+ if ( $rewriteModel->_replace['rewrite'][$key] ) {
123
+ $this->_rewrites['from'][] = '#^/' . $rewriteModel->_replace['to'][$key] . (substr( $rewriteModel->_replace['to'][$key], -1 ) == '/' ? "(.*)" : "") . '#i';
124
+ $this->_rewrites['to'][] = '/' . $rewriteModel->_replace['from'][$key] . (substr( $rewriteModel->_replace['to'][$key], -1 ) == '/' ? "$1" : "");
125
+ }
126
+ }
127
+ }
128
+
129
+ /**
130
+ * Show the file when the server rewrite is not added
131
+ *
132
+ * @param string $url broken URL
133
+ *
134
+ * @throws Exception
135
+ */
136
+ public function showFile( $url ) {
137
+ if ( !defined( 'ABSPATH' ) ) {
138
+ return;
139
+ }
140
+
141
+ //remove the redirect hook
142
+ remove_filter( 'wp_redirect', array(HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' ), 'sanitize_redirect'), PHP_INT_MAX );
143
+
144
+ //Buid the rewrite rules
145
+ $this->buildRedirect();
146
+
147
+ //Get the original URL based on rewrite rules
148
+ $parse_url = parse_url( $url );
149
+
150
+ //Get the home root path
151
+ $home_root = parse_url( home_url() );
152
+ if ( isset( $home_root['path'] ) ) {
153
+ $home_root = $home_root['path'];
154
+ $parse_url['path'] = str_replace( $home_root, '', $parse_url['path'] );
155
+ } else {
156
+ $home_root = '';
157
+ }
158
+
159
+ $parse_url['query'] = ((isset($parse_url['query']) && $parse_url['query']) ? '?' . $parse_url['query'] : '');
160
+ $parse_url['path'] = preg_replace( $this->_rewrites['from'], $this->_rewrites['to'], $parse_url['path'] );
161
+ $new_url = $parse_url['scheme'] . '://' . $parse_url['host'] . $home_root . $parse_url['path'] . $parse_url['query'];
162
+ $new_url = str_replace( '/wp-admin/wp-admin/', '/wp-admin/', $new_url ); //remove duplicates
163
+
164
+ $ctype = false;
165
+ if ( $ext = $this->isFile( $new_url ) ) {
166
+
167
+ $new_path = HMW_Classes_Tools::getRootPath() . $parse_url['path'];
168
+ if ( file_exists( $new_path ) ) {
169
+
170
+ //if file is loaded through WordPress rewrites and not through config file
171
+ if ( strpos( $url, HMW_Classes_Tools::getOption( 'hmw_wp-content_url' ) ) && $url <> $new_url ) {
172
+ $redirects = (int)HMW_Classes_Tools::getOption( 'rewrites' );
173
+ HMW_Classes_Tools::saveOptions( 'rewrites', ($redirects + 1) );
174
+ }
175
+ //////////////////////////////////////////////////////////////////////////
176
+ switch ( $ext ) {
177
+ case "scss":
178
+ case "css":
179
+ $ctype = "text/css";
180
+ break;
181
+ case "js":
182
+ $ctype = "application/javascript";
183
+ break;
184
+ case "svg":
185
+ $ctype = "image/svg+xml";
186
+ break;
187
+ default:
188
+ if ( function_exists( 'mime_content_type' ) ) {
189
+ $ctype = @mime_content_type( $new_path );
190
+ }
191
+ }
192
+
193
+ ob_clean(); //clear the buffer
194
+ $content = @file_get_contents( $new_path );
195
+
196
+ header( "HTTP/1.1 200 OK" );
197
+ header( "Cache-Control: max-age=2592000" );
198
+ header( "Expires: " . gmdate( 'r', strtotime( "+1 month" ) ) );
199
+ header( 'Vary: Accept-Encoding' );
200
+
201
+ if ( $ctype ) {
202
+ header( 'Content-Type: ' . $ctype . '; charset: UTF-8' );
203
+ }
204
+
205
+ if ( strpos( $new_url, '.js' ) || strpos( $new_url, '.css' ) || strpos( $new_url, '.scss' ) ) {
206
+ //remove comments
207
+ $content = preg_replace( '/\*\*\*+/s', '', $content, 1 );
208
+ $content = preg_replace( '/(\/\*[^\*]+\*\/)/s', '', $content, 1 );
209
+
210
+ //Text Mapping for all css and js files
211
+ if ( HMW_Classes_Tools::getOption( 'hmw_mapping_classes' ) ) {
212
+ $hmw_text_mapping = json_decode( HMW_Classes_Tools::getOption( 'hmw_text_mapping' ), true );
213
+ if ( isset( $hmw_text_mapping['from'] ) && !empty( $hmw_text_mapping['from'] ) &&
214
+ isset( $hmw_text_mapping['to'] ) && !empty( $hmw_text_mapping['to'] ) ) {
215
+
216
+ if ( HMW_Classes_Tools::getOption( 'hmw_mapping_classes' ) ) {
217
+
218
+ foreach ( $hmw_text_mapping['from'] as $index => $from ) {
219
+ $content = preg_replace( "'(?:([^/])" . addslashes( $from ) . "([^/]))'is", '$1' . $hmw_text_mapping['to'][$index] . '$2', $content );
220
+ }
221
+
222
+ } else {
223
+ $content = str_ireplace( $hmw_text_mapping['from'], $hmw_text_mapping['to'], $content );
224
+ }
225
+
226
+ }
227
+ }
228
+ }
229
+
230
+ //gzip the CSS
231
+ if ( function_exists( 'gzencode' ) ) {
232
+ header( "Content-Encoding: gzip" ); //HTTP 1.1
233
+ $content = gzencode( $content );
234
+ }
235
+
236
+ //Show the content
237
+ header( 'Content-Length: ' . strlen( $content ) );
238
+ echo $content;
239
+ exit();
240
+ }
241
+
242
+ } elseif ( strpos( $new_url, 'wp-login.php' ) || strpos( $new_url, HMW_Classes_Tools::getOption( 'hmw_login_url' ) ) ) {
243
+
244
+ $actions = array(
245
+ 'postpass',
246
+ 'logout',
247
+ 'lostpassword',
248
+ 'retrievepassword',
249
+ 'resetpass',
250
+ 'rp',
251
+ 'register',
252
+ 'login',
253
+ 'confirmaction'
254
+ );
255
+ $_REQUEST['action'] = $this->strposa( $new_url, $actions );
256
+
257
+ ob_start();
258
+ include(ABSPATH . '/wp-login.php');
259
+ $content = ob_get_clean();
260
+
261
+ header( "HTTP/1.1 200 OK" );
262
+ echo $content;
263
+ exit();
264
+
265
+ } elseif ( strpos( $new_url, '/wp-activate.php' ) ) {
266
+
267
+ ob_start();
268
+ include(ABSPATH . '/wp-activate.php');
269
+ $content = ob_get_clean();
270
+
271
+ header( "HTTP/1.1 200 OK" );
272
+ echo $content;
273
+ exit();
274
+
275
+ } elseif ( strpos( $new_url, '/wp-signup.php' ) ) {
276
+
277
+ ob_start();
278
+ include(ABSPATH . '/wp-signup.php');
279
+ $content = ob_get_clean();
280
+
281
+ header( "HTTP/1.1 200 OK" );
282
+ echo $content;
283
+ exit();
284
+
285
+ } elseif ( strpos( $new_url, '/' . HMW_Classes_Tools::$default['hmw_wp-json'] ) && isset( $_SERVER['REQUEST_METHOD'] ) && $_SERVER['REQUEST_METHOD'] === 'POST' ) {
286
+ $response = $this->postRequest( $url );
287
+
288
+ header( "HTTP/1.1 200 OK" );
289
+ if ( !empty( $response['headers'] ) ) {
290
+ foreach ( $response['headers'] as $header ) {
291
+ header( $header );
292
+ }
293
+ }
294
+ echo $response['body'];
295
+
296
+ exit();
297
+
298
+ } elseif ( isset( $_SERVER['REQUEST_METHOD'] ) && $_SERVER['REQUEST_METHOD'] === 'POST' ) {
299
+ $response = $this->postRequest( $new_url );
300
+
301
+ header( "HTTP/1.1 200 OK" );
302
+ if ( !empty( $response['headers'] ) ) {
303
+ foreach ( $response['headers'] as $header ) {
304
+ header( $header );
305
+ }
306
+ }
307
+ echo $response['body'];
308
+
309
+ exit();
310
+
311
+ } elseif ( $url <> $new_url ) {
312
+ wp_safe_redirect( $new_url, 301 );
313
+ exit();
314
+ }
315
+ }
316
+
317
+ /**
318
+ * Do a Post request
319
+ * @param $url
320
+ * @return array
321
+ */
322
+ public function postRequest( $url ) {
323
+ $return = array();
324
+
325
+ $headers = getallheaders();
326
+ $options = array(
327
+ 'method' => 'POST',
328
+ 'headers' => $headers,
329
+ 'body' => $_POST,
330
+ 'timeout' => 60,
331
+ 'sslverify' => false,
332
+ );
333
+
334
+
335
+ $response = wp_remote_post( $url, $options );
336
+
337
+ $return['body'] = wp_remote_retrieve_body( $response );
338
+ foreach ( wp_remote_retrieve_headers( $response ) as $key => $value ) {
339
+ if ( !is_array( $value ) ) {
340
+ $return['headers'][] = "$key: $value";
341
+ } else {
342
+ foreach ( $value as $v )
343
+ $return['headers'][] = "$key: $v";
344
+ }
345
+ }
346
+
347
+ return $return;
348
+ }
349
+
350
+ /**
351
+ * Do a Get request
352
+ * @param $url
353
+ * @return array
354
+ */
355
+ public function getRequest( $url ) {
356
+ $return = array();
357
+
358
+ $headers = getallheaders();
359
+ $options = array(
360
+ 'method' => 'GET',
361
+ 'headers' => $headers,
362
+ 'timeout' => 60,
363
+ 'sslverify' => false,
364
+ );
365
+
366
+
367
+ $response = wp_remote_get( $url, $options );
368
+
369
+ $return['body'] = wp_remote_retrieve_body( $response );
370
+ foreach ( wp_remote_retrieve_headers( $response ) as $key => $value ) {
371
+ if ( !is_array( $value ) ) {
372
+ $return['headers'][] = "$key: $value";
373
+ } else {
374
+ foreach ( $value as $v )
375
+ $return['headers'][] = "$key: $v";
376
+ }
377
+ }
378
+
379
+ return $return;
380
+ }
381
+
382
+ /**
383
+ * Look into array of actions
384
+ *
385
+ * @param $haystack
386
+ * @param array $needles
387
+ * @param int $offset
388
+ *
389
+ * @return bool|mixed
390
+ */
391
+ function strposa($haystack, $needles = array(), $offset = 0) {
392
+ foreach ($needles as $needle) {
393
+ if (strpos($haystack, $needle, $offset) !== false) {
394
+ return $needle;
395
+ }
396
+ }
397
+ return false;
398
+ }
399
+
400
+ }
models/Menu.php ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') || die('Cheatin\' uh?');
3
+
4
+ class HMW_Models_Menu {
5
+
6
+ /** @var array with the menu content
7
+ *
8
+ * $page_title (string) (required) The text to be displayed in the title tags of the page when the menu is selected
9
+ * $menu_title (string) (required) The on-screen name text for the menu
10
+ * $capability (string) (required) The capability required for this menu to be displayed to the user. User levels are deprecated and should not be used here!
11
+ * $menu_slug (string) (required) The slug name to refer to this menu by (should be unique for this menu). Prior to Version 3.0 this was called the file (or handle) parameter. If the function parameter is omitted, the menu_slug should be the PHP file that handles the display of the menu page content.
12
+ * $function The function that displays the page content for the menu page. Technically, the function parameter is optional, but if it is not supplied, then WordPress will basically assume that including the PHP file will generate the administration screen, without calling a function. Most plugin authors choose to put the page-generating code in a function within their main plugin file.:In the event that the function parameter is specified, it is possible to use any string for the file parameter. This allows usage of pages such as ?page=my_super_plugin_page instead of ?page=my-super-plugin/admin-options.php.
13
+ * $icon_url (string) (optional) The url to the icon to be used for this menu. This parameter is optional. Icons should be fairly small, around 16 x 16 pixels for best results. You can use the plugin_dir_url( __FILE__ ) function to get the URL of your plugin directory and then add the image filename to it. You can set $icon_url to "div" to have wordpress generate <br> tag instead of <img>. This can be used for more advanced formating via CSS, such as changing icon on hover.
14
+ * $position (integer) (optional) The position in the menu order this menu should appear. By default, if this parameter is omitted, the menu will appear at the bottom of the menu structure. The higher the number, the lower its position in the menu. WARNING: if 2 menu items use the same position attribute, one of the items may be overwritten so that only one item displays!
15
+ *
16
+ * */
17
+ public $menu = array();
18
+ public $meta = array();
19
+
20
+ /**
21
+ * Add a menu in WP admin page
22
+ *
23
+ * @param array $param
24
+ *
25
+ * @return void
26
+ */
27
+ public function addMenu($param = null) {
28
+ if ($param)
29
+ $this->menu = $param;
30
+
31
+ if (is_array($this->menu)) {
32
+
33
+ if ($this->menu[0] <> '' && $this->menu[1] <> '') {
34
+ /* add the translation */
35
+ $this->menu[0] = __($this->menu[0], _HMW_PLUGIN_NAME_);
36
+ $this->menu[1] = __($this->menu[1], _HMW_PLUGIN_NAME_);
37
+
38
+ if (!isset($this->menu[5]))
39
+ $this->menu[5] = null;
40
+ if (!isset($this->menu[6]))
41
+ $this->menu[6] = null;
42
+
43
+ /* add the menu with WP */
44
+ add_menu_page($this->menu[0], $this->menu[1], $this->menu[2], $this->menu[3], $this->menu[4], $this->menu[5], $this->menu[6]);
45
+ }
46
+ }
47
+ }
48
+
49
+ /**
50
+ * Add a submenumenu in WP admin page
51
+ *
52
+ * @param array $param
53
+ *
54
+ * @return void
55
+ */
56
+ public function addSubmenu($param = null) {
57
+ if ($param)
58
+ $this->menu = $param;
59
+
60
+ if (is_array($this->menu)) {
61
+
62
+ if ($this->menu[0] <> '' && $this->menu[1] <> '') {
63
+ /* add the translation */
64
+ $this->menu[0] = __($this->menu[0], _HMW_PLUGIN_NAME_);
65
+ $this->menu[1] = __($this->menu[1], _HMW_PLUGIN_NAME_);
66
+
67
+ if (!isset($this->menu[5]))
68
+ $this->menu[5] = null;
69
+
70
+ /* add the menu with WP */
71
+ add_submenu_page($this->menu[0], $this->menu[1], $this->menu[2], $this->menu[3], $this->menu[4], $this->menu[5]);
72
+ }
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Add a box Meta in WP
78
+ *
79
+ * @param array $param
80
+ *
81
+ * @return void
82
+ */
83
+ public function addOption($param = null) {
84
+ if ($param) {
85
+ $this->meta = $param;
86
+ }
87
+
88
+ if (is_array($this->meta)) {
89
+
90
+ if ($this->meta[0] <> '' && $this->meta[1] <> '') {
91
+ /* add the translation */
92
+ $this->meta[1] = __($this->meta[1], _HMW_PLUGIN_NAME_);
93
+
94
+ if (!isset($this->meta[5]))
95
+ $this->meta[5] = null;
96
+
97
+ /* add the box content with WP */
98
+ add_options_page($this->meta[0], $this->meta[1], $this->meta[2], $this->meta[3], $this->meta[4]);
99
+ }
100
+ }
101
+ }
102
+
103
+ /**
104
+ * Prevent other plugins to load CSS into HMW
105
+ */
106
+ public function fixEnqueueErrors() {
107
+ global $wp_styles, $wp_scripts;
108
+ $corelib = array('admin-bar', 'colors', 'ie', 'common', 'utils', 'wp-auth-check','dismissible-notices',
109
+ 'media-editor', 'media-audiovideo', 'media-views', 'imgareaselect', 'mce-view', 'image-edit',
110
+ 'wordfence-global-style','ip2location_country_blocker_admin_menu_styles','wf-adminbar','autoptimize-toolbar',
111
+ 'yoast-seo-adminbar','bbp-admin-css','bp-admin-common-css','bp-admin-bar','elementor-common','ithemes-icon-font',
112
+ 'wordfence-ls-admin-global','woocommerce_admin_menu_styles','besclwp_cpt_admin_style','uabb-notice-settings',
113
+ 'besclwp_cpt_admin_script','itsec-core-admin-notices','flatsome-panel-css','wordfence-global-style','ame-custom-menu-colors',
114
+ 'wordfence-ls-admin-global', 'wordfenceAJAXcss', 'wpf_admin_style', 'wf-adminbar', 'wpf-graphics-admin-style', 'wpr-admin-common'
115
+ );
116
+
117
+ foreach ($wp_styles->queue as $key => $queue) {
118
+ if (!in_array($queue, $corelib)) {
119
+ unset($wp_styles->queue[$key]);
120
+ }
121
+ }
122
+
123
+ foreach ($wp_scripts->queue as $key => $queue) {
124
+ if (!in_array($queue, $corelib)) {
125
+ unset($wp_scripts->queue[$key]);
126
+ }
127
+ }
128
+ }
129
+
130
+ }
models/Rewrite.php ADDED
@@ -0,0 +1,2070 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
3
+
4
+ class HMW_Models_Rewrite {
5
+
6
+ public $_replace = array();
7
+ public $paths;
8
+ //
9
+ protected $_rewrites;
10
+ protected $_replaced;
11
+ protected $_blogurl;
12
+ protected $_pass;
13
+ //
14
+ protected $_findtextmapping = array();
15
+ protected $_replacetextmapping = array();
16
+
17
+ public function __construct() {
18
+ $this->_blogurl = str_replace( 'www.', '', parse_url( site_url(), PHP_URL_HOST ) . parse_url( site_url(), PHP_URL_PATH ) );
19
+ }
20
+
21
+ /**
22
+ * Avoid loading the same buffer 2 times in a row
23
+ * Used if a cache plugin is installed
24
+ *
25
+ * @param $hook
26
+ *
27
+ * @return bool
28
+ */
29
+ public function obLoaded( $hook = false ) {
30
+ if ( $hook && function_exists( 'ob_list_handlers' ) ) {
31
+ $buffers = @ob_list_handlers();
32
+
33
+ if ( ! empty( $buffers ) ) {
34
+ if ( in_array( $hook, $buffers ) ) {
35
+ return true;
36
+ }
37
+ }
38
+ }
39
+
40
+ return false;
41
+ }
42
+
43
+ /**
44
+ * Start the buffer listener
45
+ */
46
+ public function startBuffer() {
47
+ //If the content is HTML
48
+ $fileModel = HMW_Classes_ObjController::getClass( 'HMW_Models_Files' );
49
+
50
+ if ( ! $fileModel->isFile( $fileModel->getCurrentURL() ) ) {
51
+ ob_start( array( $this, 'getBuffer' ) );
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Load on Shutdown and get the buffer for sitemaps
57
+ * @throws Exception
58
+ */
59
+ public function shutDownBuffer() {
60
+ //Force to change the URL for xml content types
61
+ if ( HMW_Classes_Tools::isContentHeader( array( 'text/xml' ) ) ) {
62
+ $buffer = $this->find_replace( ob_get_contents() );
63
+ ob_end_clean();
64
+ echo $buffer;
65
+ }
66
+ }
67
+
68
+ /**
69
+ * Get the buffer by hook for compatibility with other plugins
70
+ * @throws Exception
71
+ */
72
+ public function getTempBuffer() {
73
+ //Force to change the URL for xml content types
74
+ $buffer = $this->find_replace( ob_get_contents() );
75
+
76
+ ob_end_clean();
77
+ echo $buffer;
78
+ }
79
+
80
+ /**
81
+ * Get the output buffer
82
+ *
83
+ * @param $buffer
84
+ *
85
+ * @return mixed
86
+ */
87
+ public function getBuffer( $buffer ) {
88
+ if ( HMW_Classes_Tools::isAjax() && HMW_Classes_Tools::getOption( 'hmw_hideajax_paths' ) ) {
89
+ //replace the URLs in Ajax
90
+ if ( function_exists( 'is_user_logged_in' ) && ! is_user_logged_in() ) {
91
+ $buffer = $this->find_replace( $buffer );
92
+ }
93
+ } else {
94
+ $hmw_process_buffer = apply_filters( 'hmw_process_buffer', true );
95
+
96
+ if ( HMW_Classes_Tools::isPluginActive( 'wp-rocket/wp-rocket.php' ) ) {
97
+
98
+ $rocket_cache_search = apply_filters( 'rocket_cache_search', false );
99
+ $rocket_override_donotcachepage = apply_filters( 'rocket_override_donotcachepage', false );
100
+ if ( ( function_exists( 'is_404' ) && is_404() )
101
+ || ( ( function_exists( 'is_search' ) && is_search() ) && ! $rocket_cache_search ) // Don't cache search results.
102
+ || ( ( defined( 'DONOTCACHEPAGE' ) && DONOTCACHEPAGE ) && ! $rocket_override_donotcachepage )
103
+ || ( defined( 'DONOTROCKETOPTIMIZE' ) && DONOTROCKETOPTIMIZE )
104
+ ) {
105
+ $hmw_process_buffer = true;
106
+ }
107
+ }
108
+
109
+ if ( $hmw_process_buffer ) {
110
+ //Make sure is permalink set up
111
+ if ( HMW_Classes_Tools::getIsset( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ) ) {
112
+ if ( HMW_Classes_Tools::getValue( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ) == HMW_Classes_Tools::getOption( 'hmw_disable' ) ) {
113
+ return $buffer;
114
+ }
115
+ }
116
+
117
+ if ( HMW_Classes_Tools::getOption( 'hmw_mode' ) <> 'default' ) {//If not in default mode
118
+
119
+ //Don't run Hide My WP in these cases
120
+ if ( strlen( $buffer ) < 255 || HMW_Classes_Tools::getOption( 'error' ) || HMW_Classes_Tools::getOption( 'logout' ) ) {
121
+ return $buffer;
122
+ }
123
+
124
+ //Check if other plugins already did the cache
125
+ if ( HMW_Classes_ObjController::getClass( 'HMW_Models_Compatibility' )->alreadyCached() ) {
126
+ return $buffer;
127
+ }
128
+
129
+ if ( HMW_Classes_Tools::isContentHeader( array( 'text/html', 'text/xml' ) ) ) {
130
+ //if it's not in admin dashboar or is in admin dashboard but it's not the adminitrator
131
+ //If the user set to change the paths for logged users
132
+ if ( HMW_Classes_Tools::doChangesAdmin() ) {
133
+ $buffer = $this->find_replace( $buffer );
134
+ }
135
+ }
136
+ }
137
+
138
+ }
139
+ }
140
+
141
+ //Return the buffer to HTML
142
+ return apply_filters( 'hmw_buffer', $buffer );
143
+ }
144
+
145
+ /************************************ BUID & FLUSH REWRITES****************************************/
146
+ /**
147
+ * Prepare redirect build
148
+ * @return $this
149
+ */
150
+ public function clearRedirect() {
151
+ HMW_Classes_Tools::$options = HMW_Classes_Tools::getOptions();
152
+ $this->_replace = array();
153
+
154
+ return $this;
155
+ }
156
+
157
+ /**
158
+ * Build the array with find and replace
159
+ * Decide what goes to htaccess and not
160
+ * @return $this
161
+ */
162
+ public function buildRedirect() {
163
+ add_action( 'home_url', array( $this, 'home_url' ), PHP_INT_MAX, 1 );
164
+
165
+ if ( ! empty( $this->_replace ) ) {
166
+ return $this;
167
+ }
168
+
169
+ if ( HMW_Classes_Tools::getOption( 'hmw_mode' ) <> 'default' ) {
170
+ if ( HMW_Classes_Tools::isMultisites() ) {
171
+ //get all blogs
172
+ global $wpdb;
173
+ $this->paths = array();
174
+
175
+ $blogs = $wpdb->get_results( "SELECT path FROM " . $wpdb->blogs . " where blog_id > 1" );
176
+ foreach ( $blogs as $blog ) {
177
+ $this->paths[] = HMW_Classes_Tools::getRelativePath( $blog->path );
178
+ }
179
+ }
180
+
181
+ //Redirect the AJAX
182
+ if ( HMW_Classes_Tools::$default['hmw_admin_url'] . '/' . HMW_Classes_Tools::$default['hmw_admin-ajax_url'] <> HMW_Classes_Tools::getOption( 'hmw_admin-ajax_url' ) &&
183
+ HMW_Classes_Tools::$default['hmw_admin-ajax_url'] <> HMW_Classes_Tools::getOption( 'hmw_admin-ajax_url' ) ) {
184
+ $this->_replace['from'][] = HMW_Classes_Tools::$default['hmw_admin_url'] . '/' . HMW_Classes_Tools::$default['hmw_admin-ajax_url'];
185
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_admin-ajax_url' );
186
+ $this->_replace['rewrite'][] = true;
187
+
188
+ $this->_replace['from'][] = HMW_Classes_Tools::getOption( 'hmw_admin_url' ) . '/' . HMW_Classes_Tools::$default['hmw_admin-ajax_url'];
189
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_admin-ajax_url' );
190
+ $this->_replace['rewrite'][] = false;
191
+ }
192
+
193
+ //Redirect the ADMIN
194
+ if ( HMW_Classes_Tools::$default['hmw_admin_url'] <> HMW_Classes_Tools::getOption( 'hmw_admin_url' ) ) {
195
+ $safeoptions = HMW_Classes_Tools::getOptions( true );
196
+ if ( HMW_Classes_Tools::$default['hmw_admin_url'] <> $safeoptions['hmw_admin_url'] ) {
197
+ $this->_replace['from'][] = "wp-admin" . '/';
198
+ $this->_replace['to'][] = $safeoptions['hmw_admin_url'] . '/';
199
+ $this->_replace['rewrite'][] = true;
200
+ }
201
+ if ( HMW_Classes_Tools::getOption( 'hmw_admin_url' ) <> $safeoptions['hmw_admin_url'] ) {
202
+ $this->_replace['from'][] = "wp-admin" . '/';
203
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_admin_url' ) . '/';
204
+ $this->_replace['rewrite'][] = true;
205
+ }
206
+ }
207
+
208
+
209
+ //Redirect the LOGIN
210
+ if ( HMW_Classes_Tools::$default['hmw_login_url'] <> HMW_Classes_Tools::getOption( 'hmw_login_url' ) ) {
211
+ $this->_replace['from'][] = "wp-login.php";
212
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_login_url' );
213
+ $this->_replace['rewrite'][] = true;
214
+
215
+ $this->_replace['from'][] = "wp-login.php";
216
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_login_url' ) . '/';
217
+ $this->_replace['rewrite'][] = true;
218
+ }
219
+
220
+ if ( HMW_Classes_Tools::getOption( 'hmw_lostpassword_url' ) <> '' ) {
221
+ $this->_replace['from'][] = HMW_Classes_Tools::getOption( 'hmw_login_url' ) . "?action=lostpassword";
222
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_lostpassword_url' );
223
+ $this->_replace['rewrite'][] = false;
224
+
225
+ $this->_replace['from'][] = HMW_Classes_Tools::$default['hmw_login_url'] . "?action=lostpassword";
226
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_lostpassword_url' );
227
+ $this->_replace['rewrite'][] = true;
228
+ }
229
+
230
+ if ( HMW_Classes_Tools::$default['hmw_activate_url'] <> HMW_Classes_Tools::getOption( 'hmw_activate_url' ) ) {
231
+ if ( HMW_Classes_Tools::getOption( 'hmw_activate_url' ) <> '' ) {
232
+ $this->_replace['from'][] = HMW_Classes_Tools::$default['hmw_activate_url'];
233
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_activate_url' );
234
+ $this->_replace['rewrite'][] = true;
235
+ }
236
+ }
237
+
238
+
239
+ if ( HMW_Classes_Tools::getOption( 'hmw_register_url' ) <> '' ) {
240
+ $this->_replace['from'][] = HMW_Classes_Tools::getOption( 'hmw_login_url' ) . "?action=register";
241
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_register_url' );
242
+ $this->_replace['rewrite'][] = false;
243
+
244
+ $this->_replace['from'][] = HMW_Classes_Tools::$default['hmw_login_url'] . "?action=register";
245
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_register_url' );
246
+ $this->_replace['rewrite'][] = true;
247
+ }
248
+
249
+ if ( HMW_Classes_Tools::getOption( 'hmw_logout_url' ) <> '' ) {
250
+ $this->_replace['from'][] = HMW_Classes_Tools::getOption( 'hmw_login_url' ) . "?action=logout";
251
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_logout_url' );
252
+ $this->_replace['rewrite'][] = false;
253
+
254
+ $this->_replace['from'][] = HMW_Classes_Tools::$default['hmw_login_url'] . "?action=logout";
255
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_logout_url' );
256
+ $this->_replace['rewrite'][] = true;
257
+ }
258
+
259
+ //Modify plugins urls
260
+ if ( HMW_Classes_Tools::getOption( 'hmw_hide_plugins' ) ) {
261
+ $all_plugins = HMW_Classes_Tools::getOption( 'hmw_plugins' );
262
+
263
+ if ( ! empty( $all_plugins['to'] ) ) {
264
+ foreach ( $all_plugins['to'] as $index => $plugin_path ) {
265
+ if ( HMW_Classes_Tools::isMultisites() ) {
266
+ foreach ( $this->paths as $path ) {
267
+ //hmw_Debug::dump($path);
268
+ $this->_replace['from'][] = $path . HMW_Classes_Tools::$default['hmw_plugin_url'] . '/' . $all_plugins['from'][ $index ];
269
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_plugin_url' ) . '/' . $plugin_path . '/';
270
+ $this->_replace['rewrite'][] = false;
271
+ }
272
+ }
273
+
274
+ $this->_replace['from'][] = HMW_Classes_Tools::$default['hmw_plugin_url'] . '/' . $all_plugins['from'][ $index ];
275
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_plugin_url' ) . '/' . $plugin_path . '/';
276
+ $this->_replace['rewrite'][] = true;
277
+ }
278
+ }
279
+ }
280
+
281
+ //Modify plugins
282
+ if ( HMW_Classes_Tools::$default['hmw_plugin_url'] <> HMW_Classes_Tools::getOption( 'hmw_plugin_url' ) ) {
283
+ if ( HMW_Classes_Tools::isMultisites() ) {
284
+ foreach ( $this->paths as $path ) {
285
+ $this->_replace['from'][] = $path . HMW_Classes_Tools::$default['hmw_plugin_url'] . '/';
286
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_plugin_url' ) . '/';
287
+ $this->_replace['rewrite'][] = false;
288
+ }
289
+ }
290
+ $this->_replace['from'][] = HMW_Classes_Tools::$default['hmw_plugin_url'] . '/';
291
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_plugin_url' ) . '/';
292
+ $this->_replace['rewrite'][] = true;
293
+
294
+
295
+ //HMW_Debug::dump($this->_replace['from']);
296
+
297
+ }
298
+
299
+ //Modify themes urls
300
+ if ( HMW_Classes_Tools::getOption( 'hmw_hide_themes' ) ) {
301
+ $all_themes = HMW_Classes_Tools::getOption( 'hmw_themes' );
302
+
303
+ if ( ! empty( $all_themes['to'] ) ) {
304
+ foreach ( $all_themes['to'] as $index => $theme_path ) {
305
+ if ( HMW_Classes_Tools::isMultisites() ) {
306
+ foreach ( $this->paths as $path ) {
307
+ $this->_replace['from'][] = $path . HMW_Classes_Tools::$default['hmw_wp-content_url'] . '/' . HMW_Classes_Tools::$default['hmw_themes_url'] . '/' . $all_themes['from'][ $index ];
308
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_themes_url' ) . '/' . $theme_path . '/';
309
+ $this->_replace['rewrite'][] = false;
310
+
311
+ $this->_replace['from'][] = $path . HMW_Classes_Tools::$default['hmw_wp-content_url'] . '/' . HMW_Classes_Tools::$default['hmw_themes_url'] . '/' . $all_themes['from'][ $index ] . HMW_Classes_Tools::$default['hmw_themes_style'];
312
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_themes_url' ) . '/' . $theme_path . '/' . HMW_Classes_Tools::getOption( 'hmw_themes_style' );
313
+ $this->_replace['rewrite'][] = false;
314
+ }
315
+ }
316
+
317
+
318
+ if ( HMW_Classes_Tools::$default['hmw_themes_style'] <> HMW_Classes_Tools::getOption( 'hmw_themes_style' ) ) {
319
+ $this->_replace['from'][] = HMW_Classes_Tools::$default['hmw_wp-content_url'] . '/' . HMW_Classes_Tools::$default['hmw_themes_url'] . '/' . $all_themes['from'][ $index ] . HMW_Classes_Tools::$default['hmw_themes_style'];
320
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_themes_url' ) . '/' . $theme_path . '/' . HMW_Classes_Tools::getOption( 'hmw_themes_style' );
321
+ $this->_replace['rewrite'][] = true;
322
+
323
+ $this->_replace['from'][] = HMW_Classes_Tools::getOption( 'hmw_themes_url' ) . '/' . $theme_path . '/' . HMW_Classes_Tools::$default['hmw_themes_style'];
324
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_themes_url' ) . '/' . $theme_path . '/' . HMW_Classes_Tools::getOption( 'hmw_themes_style' );
325
+ $this->_replace['rewrite'][] = false;
326
+ }
327
+
328
+ $this->_replace['from'][] = HMW_Classes_Tools::$default['hmw_wp-content_url'] . '/' . HMW_Classes_Tools::$default['hmw_themes_url'] . '/' . $all_themes['from'][ $index ];
329
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_themes_url' ) . '/' . $theme_path . '/';
330
+ $this->_replace['rewrite'][] = true;
331
+ }
332
+
333
+ }
334
+ }
335
+
336
+ //Modify theme URL
337
+ if ( HMW_Classes_Tools::$default['hmw_themes_url'] <> HMW_Classes_Tools::getOption( 'hmw_themes_url' ) ) {
338
+ if ( HMW_Classes_Tools::isMultisites() ) {
339
+ foreach ( $this->paths as $path ) {
340
+ $this->_replace['from'][] = $path . HMW_Classes_Tools::$default['hmw_wp-content_url'] . '/' . HMW_Classes_Tools::$default['hmw_themes_url'] . '/';
341
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_themes_url' ) . '/';
342
+ $this->_replace['rewrite'][] = false;
343
+ }
344
+ }
345
+
346
+ $this->_replace['from'][] = HMW_Classes_Tools::$default['hmw_wp-content_url'] . '/' . HMW_Classes_Tools::$default['hmw_themes_url'] . '/';
347
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_themes_url' ) . '/';
348
+ $this->_replace['rewrite'][] = true;
349
+
350
+ }
351
+
352
+ //Modify uploads
353
+ if ( ! defined( 'UPLOADS' ) ) {
354
+ if ( HMW_Classes_Tools::$default['hmw_upload_url'] <> HMW_Classes_Tools::getOption( 'hmw_upload_url' ) ) {
355
+ if ( HMW_Classes_Tools::isMultisites() ) {
356
+ foreach ( $this->paths as $path ) {
357
+ $this->_replace['from'][] = $path . HMW_Classes_Tools::$default['hmw_wp-content_url'] . '/' . HMW_Classes_Tools::$default['hmw_upload_url'] . '/';
358
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_upload_url' ) . '/';
359
+ $this->_replace['rewrite'][] = false;
360
+ }
361
+ }
362
+
363
+ $this->_replace['from'][] = HMW_Classes_Tools::$default['hmw_wp-content_url'] . '/' . HMW_Classes_Tools::$default['hmw_upload_url'] . '/';
364
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_upload_url' ) . '/';
365
+ $this->_replace['rewrite'][] = true;
366
+
367
+ }
368
+ }
369
+
370
+ //Modify wp-content
371
+ if ( HMW_Classes_Tools::$default['hmw_wp-content_url'] <> HMW_Classes_Tools::getOption( 'hmw_wp-content_url' ) ) {
372
+ if ( HMW_Classes_Tools::isMultisites() ) {
373
+ foreach ( $this->paths as $path ) {
374
+ $this->_replace['from'][] = $path . HMW_Classes_Tools::$default['hmw_wp-content_url'] . '/';
375
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_wp-content_url' ) . '/';
376
+ $this->_replace['rewrite'][] = false;
377
+ }
378
+ }
379
+
380
+ $this->_replace['from'][] = HMW_Classes_Tools::$default['hmw_wp-content_url'] . '/';
381
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_wp-content_url' ) . '/';
382
+ $this->_replace['rewrite'][] = true;
383
+ }
384
+
385
+ //Modify wp-includes
386
+ if ( HMW_Classes_Tools::$default['hmw_wp-includes_url'] <> HMW_Classes_Tools::getOption( 'hmw_wp-includes_url' ) ) {
387
+ if ( HMW_Classes_Tools::isMultisites() ) {
388
+ foreach ( $this->paths as $path ) {
389
+ $this->_replace['from'][] = $path . HMW_Classes_Tools::$default['hmw_wp-includes_url'] . '/';
390
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_wp-includes_url' ) . '/';
391
+ $this->_replace['rewrite'][] = false;
392
+ }
393
+ }
394
+
395
+ $this->_replace['from'][] = HMW_Classes_Tools::$default['hmw_wp-includes_url'] . '/';
396
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_wp-includes_url' ) . '/';
397
+ $this->_replace['rewrite'][] = true;
398
+
399
+ }
400
+
401
+ //Modify wp-comments-post
402
+ if ( HMW_Classes_Tools::$default['hmw_wp-comments-post'] <> HMW_Classes_Tools::getOption( 'hmw_wp-comments-post' ) ) {
403
+ $this->_replace['from'][] = HMW_Classes_Tools::$default['hmw_wp-comments-post'];
404
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_wp-comments-post' ) . '/';
405
+ $this->_replace['rewrite'][] = true;
406
+ }
407
+
408
+ //Modify the author link
409
+ if ( HMW_Classes_Tools::$default['hmw_author_url'] <> HMW_Classes_Tools::getOption( 'hmw_author_url' ) ) {
410
+ $this->_replace['from'][] = HMW_Classes_Tools::$default['hmw_author_url'] . '/';
411
+ $this->_replace['to'][] = HMW_Classes_Tools::getOption( 'hmw_author_url' ) . '/';
412
+ $this->_replace['rewrite'][] = true;
413
+ }
414
+
415
+ }
416
+
417
+ return $this;
418
+
419
+ }
420
+
421
+ /**
422
+ * Rename all the plugin names with a hash
423
+ */
424
+ public function hidePluginNames() {
425
+ $dbplugins = array();
426
+
427
+ $all_plugins = HMW_Classes_Tools::getAllPlugins();
428
+
429
+ foreach ( $all_plugins as $plugin ) {
430
+ if ( is_plugin_active( $plugin ) ) {
431
+ $dbplugins['to'][] = substr( md5( $plugin ), 0, 10 );
432
+ $dbplugins['from'][] = str_replace( ' ', '+', plugin_dir_path( $plugin ) );
433
+ }
434
+ }
435
+
436
+ HMW_Classes_Tools::saveOptions( 'hmw_plugins', $dbplugins );
437
+ }
438
+
439
+ /**
440
+ * Rename all the themes name with a hash
441
+ */
442
+ public function hideThemeNames() {
443
+ $dbthemes = array();
444
+
445
+ $all_themes = HMW_Classes_Tools::getAllThemes();
446
+
447
+ foreach ( $all_themes as $theme => $value ) {
448
+ if ( is_dir( $value['theme_root'] ) ) {
449
+ $dbthemes['to'][] = substr( md5( $theme ), 0, 10 );
450
+ $dbthemes['from'][] = str_replace( ' ', '+', $theme ) . '/';
451
+ }
452
+ }
453
+
454
+ HMW_Classes_Tools::saveOptions( 'hmw_themes', $dbthemes );
455
+ }
456
+
457
+ /**
458
+ * ADMIN_PATH is the new path and set in /config.php
459
+ * @return $this
460
+ */
461
+ public function setRewriteRules() {
462
+ $this->_rewrites = array();
463
+ require_once ABSPATH . 'wp-admin/includes/misc.php';
464
+ require_once ABSPATH . 'wp-admin/includes/file.php';
465
+
466
+ //Build the redirects
467
+ $this->buildRedirect();
468
+
469
+ if ( ! empty( $this->_replace ) ) {
470
+ //form the IIS rewrite
471
+ if ( HMW_Classes_Tools::isIIS() ) {
472
+ foreach ( $this->_replace['to'] as $key => $row ) {
473
+ if ( $this->_replace['rewrite'][ $key ] ) {
474
+ $this->_rewrites[] = array(
475
+ 'from' => '([_0-9a-zA-Z-]+/)?' . $this->_replace['to'][ $key ] . ( substr( $this->_replace['to'][ $key ], - 1 ) == '/' ? "(.*)" : "$" ),
476
+ 'to' => $this->_replace['from'][ $key ] . "{R:" . ( substr_count( $this->_replace['to'][ $key ], '(' ) + 2 ) . '}',
477
+ );
478
+ }
479
+ }
480
+
481
+ add_filter( 'iis7_url_rewrite_rules', array( $this, 'getIISRules' ) );
482
+ } else {
483
+
484
+ if ( HMW_RULES_IN_CONFIG ) { //if the user uses the rules to rewrite the paths
485
+ foreach ( $this->_replace['to'] as $key => $row ) {
486
+ if ( $this->_replace['rewrite'][ $key ] ) {
487
+ $this->_rewrites[] = array(
488
+ 'from' => '([_0-9a-zA-Z-]+/)?' . $this->_replace['to'][ $key ] . ( substr( $this->_replace['to'][ $key ], - 1 ) == '/' ? "(.*)" : "$" ),
489
+ 'to' => $this->_replace['from'][ $key ] . ( substr( $this->_replace['to'][ $key ], - 1 ) == '/' ? "$" . ( substr_count( $this->_replace['to'][ $key ], '(' ) + 2 ) : "" ),
490
+ );
491
+ }
492
+ }
493
+ }
494
+
495
+ if ( HMW_RULES_IN_WP_RULES ) { //if set to add the HMW rules into WP rules area
496
+ foreach ( $this->_rewrites as $rewrite ) {
497
+ add_rewrite_rule( $rewrite['from'], $rewrite['to'], 'top' );
498
+ }
499
+ }
500
+ }
501
+ }
502
+
503
+
504
+ return $this;
505
+ }
506
+
507
+ /******** IIS **********/
508
+ /**
509
+ * @param string $wrules
510
+ *
511
+ * @return string
512
+ */
513
+ public function getIISRules( $wrules ) {
514
+ $rules = '';
515
+ $path = parse_url( site_url(), PHP_URL_PATH );
516
+ if ( $path ) {
517
+ $home_root = trailingslashit( $path );
518
+ } else {
519
+ $home_root = '/';
520
+ }
521
+
522
+ $rewrites = array();
523
+
524
+
525
+ if ( ! empty( $this->_replace ) ) {
526
+ foreach ( $this->_replace['to'] as $key => $row ) {
527
+ if ( $this->_replace['rewrite'][ $key ] ) {
528
+ $rewrites[] = array(
529
+ 'from' => '([_0-9a-zA-Z-]+/)?' . $this->_replace['to'][ $key ] . ( substr( $this->_replace['to'][ $key ], - 1 ) == '/' ? "(.*)" : "$" ),
530
+ 'to' => $this->_replace['from'][ $key ] . ( substr( $this->_replace['to'][ $key ], - 1 ) == '/' ? "{R:" . ( substr_count( $this->_replace['to'][ $key ], '(' ) + 2 ) . '}' : "" ),
531
+ );
532
+ }
533
+ }
534
+ }
535
+
536
+ if ( ! empty( $rewrites ) ) {
537
+ foreach ( $rewrites as $rewrite ) {
538
+ if ( strpos( $rewrite['to'], 'index.php' ) === false ) {
539
+ $rules .= '
540
+ <rule name="HideMyWp: ' . md5( $home_root . $rewrite['from'] ) . '" stopProcessing="true">
541
+ <match url="^' . $rewrite['from'] . '" ignoreCase="false" />
542
+ <action type="Rewrite" url="' . $home_root . $rewrite['to'] . '" />
543
+ </rule>';
544
+
545
+
546
+ }
547
+ }
548
+ }
549
+
550
+ return $rules . $wrules;
551
+ }
552
+
553
+ /**
554
+ * @param $config_file
555
+ *
556
+ * @return bool
557
+ */
558
+ public function deleteIISRules( $config_file ) {
559
+ // If configuration file does not exist then rules also do not exist so there is nothing to delete
560
+ if ( ! file_exists( $config_file ) ) {
561
+ return true;
562
+ }
563
+
564
+ if ( ! class_exists( 'DOMDocument', false ) ) {
565
+ return false;
566
+ }
567
+
568
+ if ( ! HMW_Classes_ObjController::getClass( 'HMW_Models_Rules' )->isConfigWritable() ) {
569
+ return false;
570
+ }
571
+
572
+ $doc = new DOMDocument();
573
+ $doc->preserveWhiteSpace = false;
574
+
575
+ if ( $doc->load( $config_file ) === false ) {
576
+ return false;
577
+ }
578
+
579
+ $xpath = new DOMXPath( $doc );
580
+ $rules = $xpath->query( '/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'HideMyWp\')]' );
581
+
582
+ if ( $rules->length > 0 ) {
583
+ foreach ( $rules as $item ) {
584
+ $parent = $item->parentNode;
585
+ if ( method_exists( $parent, 'removeChild' ) ) {
586
+ $parent->removeChild( $item );
587
+ }
588
+ }
589
+ }
590
+
591
+ if ( ! is_multisite() ) {
592
+ $rules = $xpath->query( '/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'wordpress\')] | /configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'WordPress\')]' );
593
+
594
+ if ( $rules->length > 0 ) {
595
+ foreach ( $rules as $item ) {
596
+
597
+ $parent = $item->parentNode;
598
+ if ( method_exists( $parent, 'removeChild' ) ) {
599
+ $parent->removeChild( $item );
600
+ }
601
+ }
602
+ }
603
+ }
604
+
605
+ $doc->formatOutput = true;
606
+ saveDomDocument( $doc, $config_file );
607
+
608
+ return true;
609
+ }
610
+ /***************************/
611
+
612
+ /**
613
+ * Flush the Rules and write in htaccess or web.config
614
+ * @return bool
615
+ */
616
+ public function flushRewrites() {
617
+ $rewritecode = '';
618
+ $config_file = HMW_Classes_ObjController::getClass( 'HMW_Models_Rules' )->getConfFile();
619
+
620
+ $form = '<br />
621
+ <form method="POST" style="margin: 8px 0;">
622
+ ' . wp_nonce_field( 'hmw_manualrewrite', 'hmw_nonce', true, false ) . '
623
+ <input type="hidden" name="action" value="hmw_manualrewrite" />
624
+ <input type="submit" class="btn rounded-0 btn-success save" value="Okay, I set it up" />
625
+ </form>
626
+ ';
627
+
628
+
629
+ $path = parse_url( site_url(), PHP_URL_PATH );
630
+ if ( $path ) {
631
+ $home_root = trailingslashit( $path );
632
+ } else {
633
+ $home_root = '/';
634
+ }
635
+
636
+ //If Windows Server
637
+ if ( HMW_Classes_Tools::isIIS() ) {
638
+ $this->deleteIISRules( $config_file );
639
+ if ( ! iis7_save_url_rewrite_rules() ) {
640
+ $rewritecode .= $this->getIISRules( '' );
641
+ if ( $rewritecode <> '' ) {
642
+ HMW_Classes_Error::setError( sprintf( __( 'IIS detected. You need to update your %s file by adding the following lines after &lt;rules&gt; tag: %s', _HMW_PLUGIN_NAME_ ), '<strong>' . $config_file . '</strong>', '<br /><br /><pre><strong>' . htmlentities( str_replace( ' ', ' ', $rewritecode ) ) . '</strong></pre>' . $form ) );
643
+
644
+ return false;
645
+ }
646
+
647
+ }
648
+ } elseif ( HMW_Classes_Tools::isWpengine() ) {
649
+ $success = true;
650
+ if ( ! empty( $this->_rewrites ) ) {
651
+ $rewritecode .= "<IfModule mod_rewrite.c>\n\n";
652
+ $rewritecode .= "RewriteEngine On\n";
653
+ $rewritecode .= "RewriteBase $home_root\n";
654
+ foreach ( $this->_rewrites as $rewrite ) {
655
+ if ( strpos( $rewrite['to'], 'index.php' ) === false ) {
656
+ $rewritecode .= 'RewriteRule ^' . $rewrite['from'] . ' ' . $home_root . $rewrite['to'] . " [QSA,L]" . "\n";
657
+ }
658
+ }
659
+ $rewritecode .= "</IfModule>\n\n";
660
+ }
661
+ if ( $rewritecode <> '' ) {
662
+ if ( ! HMW_Classes_ObjController::getClass( 'HMW_Models_Rules' )->writeInHtaccess( $rewritecode, 'HMWP_RULES' ) ) {
663
+ HMW_Classes_Error::setError( sprintf( __( 'Config file is not writable. You need to update your %s file by adding the following lines at the beginning of the file: %s', _HMW_PLUGIN_NAME_ ), '<strong>' . $config_file . '</strong>', '<br /><br /><pre><strong>' . htmlentities( str_replace( ' ', ' ', $rewritecode ) ) . '</strong></pre>' . $form ) );
664
+ $success = false;
665
+ }
666
+ } else {
667
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rules' )->writeInHtaccess( '', 'HMWP_RULES' );
668
+ }
669
+
670
+ $rewritecode = '';
671
+ if ( ! empty( $this->_rewrites ) ) {
672
+ foreach ( $this->_rewrites as $rewrite ) {
673
+ if ( PHP_VERSION_ID >= 70400 || ( strpos( $rewrite['to'], 'index.php' ) === false && ( strpos( $rewrite['to'], HMW_Classes_Tools::$default['hmw_wp-content_url'] ) !== false || strpos( $rewrite['to'], HMW_Classes_Tools::$default['hmw_wp-includes_url'] ) !== false ) ) ) {
674
+ if ( strpos( $rewrite['to'], HMW_Classes_Tools::$default['hmw_login_url'] ) === false && strpos( $rewrite['to'], HMW_Classes_Tools::$default['hmw_admin_url'] ) === false ) {
675
+ $rewritecode .= 'Source: <strong>^/' . str_replace( array( '.css', '.js' ), array(
676
+ '\.css',
677
+ '\.js'
678
+ ), $rewrite['from'] ) . '</strong> Destination: <strong>' . $home_root . $rewrite['to'] . "</strong> Redirect type: Break;<br />";
679
+ }
680
+ }
681
+ }
682
+ }
683
+
684
+ if ( $rewritecode <> '' ) {
685
+ HMW_Classes_Error::setError( sprintf( __( 'WpEngine detected. Add the redirects in the WpEngine Redirect rules panel %s', _HMW_PLUGIN_NAME_ ), '<strong><a href="https://wpengine.com/support/redirect/" target="_blank" style="color: red">' . __( "Learn How To Add the Code", _HMW_PLUGIN_NAME_ ) . '</a></strong> <br /><br /><pre>' . $rewritecode . '</pre>' . $form . '<br />' ) );
686
+ $success = false;
687
+ }
688
+
689
+ return $success;
690
+ } elseif ( ( HMW_Classes_Tools::isApache() || HMW_Classes_Tools::isLitespeed() ) ) {
691
+ if ( ! empty( $this->_rewrites ) ) {
692
+ if ( HMW_Classes_Tools::getOption( 'hmw_file_cache' ) ) {
693
+ $rewritecode .= '<IfModule mod_headers.c>' . "\n";
694
+ $rewritecode .= '<FilesMatch ".(js|css|xml|gz|html)$">' . "\n";
695
+ $rewritecode .= 'Header append Vary: Accept-Encoding' . "\n";
696
+ $rewritecode .= '</FilesMatch>' . "\n";
697
+ $rewritecode .= '</IfModule>' . "\n";
698
+
699
+ $rewritecode .= '<IfModule mod_expires.c>' . "\n";
700
+ $rewritecode .= 'ExpiresActive On' . "\n";
701
+ $rewritecode .= '# CSS, JavaScript' . "\n";
702
+ $rewritecode .= 'ExpiresByType text/css "access plus 1 month"' . "\n";
703
+ $rewritecode .= 'ExpiresByType text/javascript "access plus 1 month"' . "\n";
704
+ $rewritecode .= 'ExpiresByType application/javascript "access plus 1 month"' . "\n\n";
705
+ $rewritecode .= '# Images' . "\n";
706
+ $rewritecode .= 'ExpiresByType image/jpeg "access plus 1 year"' . "\n";
707
+ $rewritecode .= 'ExpiresByType image/gif "access plus 1 year"' . "\n";
708
+ $rewritecode .= 'ExpiresByType image/png "access plus 1 year"' . "\n";
709
+ $rewritecode .= 'ExpiresByType image/webp "access plus 1 year"' . "\n";
710
+ $rewritecode .= 'ExpiresByType image/svg+xml "access plus 1 year"' . "\n";
711
+ $rewritecode .= 'ExpiresByType image/x-icon "access plus 1 year"' . "\n\n";
712
+ $rewritecode .= '# Video' . "\n";
713
+ $rewritecode .= 'ExpiresByType video/mp4 "access plus 1 year"' . "\n";
714
+ $rewritecode .= 'ExpiresByType video/mpeg "access plus 1 year"' . "\n";
715
+ $rewritecode .= "</IfModule>\n\n";
716
+ }
717
+
718
+ $rewritecode .= "<IfModule mod_rewrite.c>\n";
719
+ $rewritecode .= "RewriteEngine On\n";
720
+ $rewritecode .= "RewriteBase $home_root\n";
721
+ foreach ( $this->_rewrites as $rewrite ) {
722
+ if ( strpos( $rewrite['to'], 'index.php' ) === false ) {
723
+ $rewritecode .= 'RewriteRule ^' . $rewrite['from'] . ' ' . $home_root . $rewrite['to'] . " [QSA,L]" . "\n";
724
+ }
725
+ }
726
+ $rewritecode .= "</IfModule>\n\n";
727
+ }
728
+
729
+ if ( $rewritecode <> '' ) {
730
+ if ( HMW_Classes_ObjController::getClass( 'HMW_Models_Rules' )->writeInHtaccess( $rewritecode, 'HMWP_RULES' ) ) {
731
+ return true;
732
+ } else {
733
+ HMW_Classes_Error::setError( sprintf( __( 'Config file is not writable. You need to update your %s file by adding the following lines at the beginning of the file: %s', _HMW_PLUGIN_NAME_ ), '<strong>' . $config_file . '</strong>', '<br /><br /><pre><strong>' . htmlentities( str_replace( ' ', ' ', $rewritecode ) ) . '</strong></pre>' . $form ) );
734
+
735
+ return false;
736
+ }
737
+ } else {
738
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rules' )->writeInHtaccess( '', 'HMWP_RULES' );
739
+ }
740
+
741
+ } elseif ( HMW_Classes_Tools::isNginx() ) {
742
+ $cachecode = '';
743
+ if ( ! empty( $this->_rewrites ) ) {
744
+ if ( HMW_Classes_Tools::getOption( 'hmw_file_cache' ) ) {
745
+ $cachecode .= 'location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {' . "\n";
746
+ $cachecode .= 'expires 365d;' . "\n";
747
+ $cachecode .= 'add_header Pragma public;' . "\n";
748
+ $cachecode .= 'add_header Cache-Control "public";' . "\n";
749
+ $cachecode .= '}' . "\n\n";
750
+ }
751
+
752
+ foreach ( $this->_rewrites as $rewrite ) {
753
+ if ( strpos( $rewrite['to'], 'index.php' ) === false ) {
754
+ $rewritecode .= 'rewrite ^/' . $rewrite['from'] . ' ' . $home_root . $rewrite['to'] . " last;<br />";
755
+ }
756
+ }
757
+ if ( $rewritecode <> '' ) {
758
+ $rewritecode = str_replace( '<br />', "\n", $rewritecode );
759
+ $rewritecode = $cachecode . 'if (!-e $request_filename) {' . "\n" . $rewritecode . '}';
760
+ }
761
+ }
762
+
763
+ if ( $rewritecode <> '' ) {
764
+ if ( ! HMW_Classes_ObjController::getClass( 'HMW_Models_Rules' )->writeInNginx( $rewritecode, 'HMWP_RULES' ) ) {
765
+ HMW_Classes_Error::setError( sprintf( __( 'Config file is not writable. You have to added it manually at the beginning of the %s file: %s', _HMW_PLUGIN_NAME_ ), '<strong>' . $config_file . '</strong>', '<br /><br /><pre><strong># BEGIN HMWP_RULES<br />' . htmlentities( str_replace( ' ', ' ', $rewritecode ) ) . '# END HMW_RULES</strong></pre>' ) );
766
+ }
767
+ } else {
768
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Rules' )->writeInNginx( '', 'HMWP_RULES' );
769
+ }
770
+
771
+ return false;
772
+
773
+ }
774
+
775
+ return true;
776
+ }
777
+
778
+ /**
779
+ * Not used yet
780
+ *
781
+ * @param $wp_rewrite
782
+ *
783
+ * @return mixed
784
+ */
785
+ public function setRewriteIndexRules( $wp_rewrite ) {
786
+ return $wp_rewrite;
787
+ }
788
+
789
+ /**
790
+ * Flush the changes in htaccess
791
+ */
792
+ public function flushChanges() {
793
+
794
+ if ( ! did_action( 'wp_loaded' ) ) {
795
+ add_action( 'wp_loaded', array( $this, 'flushChanges' ) );
796
+ }
797
+
798
+ //Build the redirect table
799
+ $this->clearRedirect()->buildRedirect()->setRewriteRules()->flushRewrites();
800
+
801
+ flush_rewrite_rules( true );
802
+ }
803
+
804
+ /**
805
+ * Send the email notification
806
+ */
807
+ public function sendEmail() {
808
+ if ( HMW_Classes_Tools::getOption( 'hmw_send_email' ) ) {
809
+ $options = HMW_Classes_Tools::getOptions();
810
+ $lastsafeoptions = HMW_Classes_Tools::getOptions( true );
811
+
812
+ if ( $lastsafeoptions['hmw_admin_url'] <> $options['hmw_admin_url'] ||
813
+ $lastsafeoptions['hmw_login_url'] <> $options['hmw_login_url']
814
+ ) {
815
+ HMW_Classes_Tools::sendEmail();
816
+ }
817
+ }
818
+ }
819
+
820
+
821
+ /**
822
+ * Add the custom param vars for: disable hide my wp and admin tabs
823
+ *
824
+ * @param $vars
825
+ *
826
+ * @return array
827
+ */
828
+ public function addParams( $vars ) {
829
+ $vars[] = HMW_Classes_Tools::getOption( 'hmw_disable_name' );
830
+ $vars[] = 'tab';
831
+
832
+ return $vars;
833
+ }
834
+
835
+ /******************************* RENAME URLS **************************************************/
836
+
837
+ public function home_url( $url ) {
838
+ $scheme = ( ( ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] == "on" ) || ( defined( 'FORCE_SSL_ADMIN' ) && FORCE_SSL_ADMIN ) || ( function_exists( 'is_ssl' ) && is_ssl() ) ) ? 'https' : 'http' );
839
+ $url = set_url_scheme( $url, $scheme );
840
+
841
+ return $url;
842
+ }
843
+
844
+ /**
845
+ * Get the new admin URL
846
+ *
847
+ * @param string $url
848
+ * @param string $path
849
+ * @param integer | null $blog_id
850
+ *
851
+ * @return mixed|string
852
+ */
853
+ public function admin_url( $url, $path = '', $blog_id = null ) {
854
+ $find = $replace = array();
855
+
856
+ if ( HMW_Classes_Tools::getOption( 'error' ) || HMW_Classes_Tools::getOption( 'logout' ) ) {
857
+ return $url;
858
+ }
859
+
860
+ if ( ! defined( 'ADMIN_COOKIE_PATH' ) ) {
861
+ return $url;
862
+ }
863
+
864
+
865
+ if ( HMW_Classes_Tools::getIsset( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ) ) {
866
+ if ( HMW_Classes_Tools::getValue( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ) == HMW_Classes_Tools::getOption( 'hmw_disable' ) ) {
867
+ return add_query_arg( array( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) => HMW_Classes_Tools::getOption( 'hmw_disable' ) ), $url );
868
+ }
869
+ }
870
+
871
+ if ( HMW_Classes_Tools::getOption( 'hmw_hide_loggedusers' ) || ( function_exists( 'is_user_logged_in' ) && ! is_user_logged_in() ) ) {
872
+ if ( HMW_Classes_Tools::$default['hmw_admin-ajax_url'] <> HMW_Classes_Tools::getOption( 'hmw_admin-ajax_url' ) ) {
873
+ if ( HMW_Classes_Tools::getOption( 'hmw_hideajax_admin' ) ) {
874
+ $find[] = '/' . HMW_Classes_Tools::$default['hmw_admin_url'] . '/' . HMW_Classes_Tools::$default['hmw_admin-ajax_url'];
875
+ } else {
876
+ $find[] = '/' . HMW_Classes_Tools::$default['hmw_admin-ajax_url'];
877
+ }
878
+ $replace[] = '/' . HMW_Classes_Tools::getOption( 'hmw_admin-ajax_url' );
879
+ }
880
+ }
881
+
882
+
883
+ if ( HMW_Classes_Tools::$default['hmw_admin_url'] <> HMW_Classes_Tools::getOption( 'hmw_admin_url' ) ) {
884
+ $find[] = '/' . HMW_Classes_Tools::$default['hmw_admin_url'] . '/';
885
+ $replace[] = '/' . HMW_Classes_Tools::getOption( 'hmw_admin_url' ) . '/';
886
+ }
887
+
888
+ $url = str_replace( $find, $replace, $url );
889
+
890
+ return $url;
891
+ }
892
+
893
+ /**
894
+ * Change the admin URL for multisites
895
+ *
896
+ * @param string $url
897
+ * @param string $path
898
+ *
899
+ * @return mixed|string
900
+ */
901
+ public function network_admin_url( $url, $path = '' ) {
902
+ $find = $replace = array();
903
+ if ( HMW_Classes_Tools::getOption( 'error' ) || HMW_Classes_Tools::getOption( 'logout' ) ) {
904
+ return $url;
905
+ }
906
+
907
+ if ( ! defined( 'ADMIN_COOKIE_PATH' ) ) {
908
+ return $url;
909
+ }
910
+
911
+
912
+ if ( HMW_Classes_Tools::getOption( 'hmw_admin_url' ) == 'wp-admin' ) {
913
+ return $url;
914
+ }
915
+
916
+ if ( HMW_Classes_Tools::getIsset( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ) ) {
917
+ if ( HMW_Classes_Tools::getValue( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ) == HMW_Classes_Tools::getOption( 'hmw_disable' ) ) {
918
+ return add_query_arg( array( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) => HMW_Classes_Tools::getOption( 'hmw_disable' ) ), $url );
919
+ }
920
+ }
921
+
922
+
923
+ $from = HMW_Classes_Tools::$default['hmw_admin_url'];
924
+ $to = HMW_Classes_Tools::getOption( 'hmw_admin_url' );
925
+
926
+ $find[] = network_site_url( $from . '/', $to );
927
+ $replace[] = network_site_url( '/' . HMW_Classes_Tools::getOption( 'hmw_admin_url' ) . '/', $to );
928
+
929
+ if ( HMW_Classes_Tools::getOption( 'hmw_hide_loggedusers' ) || ( function_exists( 'is_user_logged_in' ) && ! is_user_logged_in() ) ) {
930
+ if ( HMW_Classes_Tools::$default['hmw_admin-ajax_url'] <> HMW_Classes_Tools::getOption( 'hmw_admin-ajax_url' ) ) {
931
+ if ( HMW_Classes_Tools::getOption( 'hmw_hideajax_admin' ) ) {
932
+ $find[] = '/' . HMW_Classes_Tools::$default['hmw_admin_url'] . '/' . HMW_Classes_Tools::$default['hmw_admin-ajax_url'];
933
+ } else {
934
+ $find[] = '/' . HMW_Classes_Tools::$default['hmw_admin-ajax_url'];
935
+ }
936
+ $replace[] = '/' . HMW_Classes_Tools::getOption( 'hmw_admin-ajax_url' );
937
+ }
938
+ }
939
+
940
+ $url = str_replace( $find, $replace, $url );
941
+
942
+ return $url;
943
+ }
944
+
945
+ /**
946
+ * Get the new Site URL
947
+ *
948
+ * @param string $url
949
+ * @param string $path
950
+ *
951
+ * @return string
952
+ */
953
+ public function site_url( $url, $path = '' ) {
954
+ if ( HMW_Classes_Tools::getOption( 'error' ) || HMW_Classes_Tools::getOption( 'logout' ) || $url == '' ) {
955
+ return $url;
956
+ }
957
+
958
+ if ( HMW_Classes_Tools::$default['hmw_login_url'] <> HMW_Classes_Tools::getOption( 'hmw_login_url' ) ) {
959
+ //echo $url . '<br />';
960
+ if ( strpos( $url, 'wp-login' ) !== false ) {
961
+ //check if disable and do not redirect to login
962
+ if ( HMW_Classes_Tools::getIsset( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ) ) {
963
+ if ( HMW_Classes_Tools::getValue( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ) == HMW_Classes_Tools::getOption( 'hmw_disable' ) ) {
964
+ //add the disabled param in order to work without issues
965
+ return add_query_arg( array( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) => HMW_Classes_Tools::getOption( 'hmw_disable' ) ), $url );
966
+ }
967
+ }
968
+
969
+ $query = '';
970
+ if ( $path <> '' ) {
971
+ $parsed = @parse_url( $path );
972
+ if ( isset( $parsed['query'] ) && $parsed['query'] <> '' ) {
973
+ $query = '?' . $parsed['query'];
974
+ }
975
+ }
976
+
977
+ if ( $query == '?action=lostpassword' && HMW_Classes_Tools::getOption( 'hmw_lostpassword_url' ) <> '' ) {
978
+ $url = site_url( HMW_Classes_Tools::getOption( 'hmw_lostpassword_url' ) );
979
+ } elseif ( $query == '?action=register' && HMW_Classes_Tools::getOption( 'hmw_register_url' ) <> '' ) {
980
+ $url = site_url( HMW_Classes_Tools::getOption( 'hmw_register_url' ) );
981
+ } else {
982
+ $url = site_url() . '/' . HMW_Classes_Tools::getOption( 'hmw_login_url' ) . $query;
983
+
984
+ if ( HMW_Classes_Tools::getValue( 'noredirect', false ) ) {
985
+ $url = add_query_arg( array( 'noredirect' => true ), $url );
986
+ }
987
+ }
988
+ }
989
+ }
990
+
991
+ if ( HMW_Classes_Tools::$default['hmw_activate_url'] <> HMW_Classes_Tools::getOption( 'hmw_activate_url' ) ) {
992
+ if ( strpos( $url, 'wp-activate.php' ) !== false ) {
993
+ $query = '';
994
+ if ( $path <> '' ) {
995
+ $parsed = @parse_url( $path );
996
+ if ( isset( $parsed['query'] ) && $parsed['query'] <> '' ) {
997
+ $query = '?' . $parsed['query'];
998
+ }
999
+ }
1000
+ $url = site_url() . '/' . HMW_Classes_Tools::getOption( 'hmw_activate_url' ) . $query;
1001
+ }
1002
+ }
1003
+
1004
+
1005
+ return $url;
1006
+ }
1007
+
1008
+ /**
1009
+ * Login Header Hook
1010
+ */
1011
+ public function login_head() {
1012
+ add_filter( 'login_headerurl', array( $this, 'login_url' ), 99, 1 );
1013
+ }
1014
+
1015
+ /**
1016
+ * Get the new Login URL
1017
+ *
1018
+ * @param $url
1019
+ *
1020
+ * @return string
1021
+ */
1022
+ public function login_url( $url ) {
1023
+ if ( HMW_Classes_Tools::getOption( 'error' ) || HMW_Classes_Tools::getOption( 'logout' ) ) {
1024
+ return $url;
1025
+ }
1026
+
1027
+ if ( HMW_Classes_Tools::$default['hmw_login_url'] <> HMW_Classes_Tools::getOption( 'hmw_login_url' ) ) {
1028
+ //check if disable and do not redirect to login
1029
+ if ( HMW_Classes_Tools::getIsset( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ) ) {
1030
+ if ( HMW_Classes_Tools::getValue( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ) == HMW_Classes_Tools::getOption( 'hmw_disable' ) ) {
1031
+ //add the disabled param in order to work without issues
1032
+ return add_query_arg( array( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) => HMW_Classes_Tools::getOption( 'hmw_disable' ) ), $url );
1033
+ }
1034
+ }
1035
+
1036
+ $url = site_url( HMW_Classes_Tools::getOption( 'hmw_login_url' ) );
1037
+
1038
+ }
1039
+
1040
+
1041
+ return $url;
1042
+ }
1043
+
1044
+ /**
1045
+ * Hook the Login Init from wp-login.php
1046
+ */
1047
+ public function login_init() {
1048
+ add_filter( 'wp_safe_redirect_fallback', array( $this, 'loopCheck' ), 99, 1 );
1049
+ add_filter( 'wp_redirect', array( $this, 'loopCheck' ), 99, 1 );
1050
+
1051
+
1052
+ //////////////////////////////// Rewrite the login style
1053
+ wp_deregister_script( 'password-strength-meter' );
1054
+ wp_deregister_script( 'user-profile' );
1055
+ wp_deregister_style( 'forms' );
1056
+ wp_deregister_style( 'l10n' );
1057
+ wp_deregister_style( 'login' );
1058
+
1059
+ wp_register_style( 'login', _HMW_THEME_URL_ . 'wplogin/css/login.min.css', array(
1060
+ 'dashicons',
1061
+ 'buttons',
1062
+ 'forms',
1063
+ 'l10n'
1064
+ ), HMW_VERSION_ID, false );
1065
+ wp_register_style( 'forms', _HMW_THEME_URL_ . 'wplogin/css/forms.min.css', null, HMW_VERSION_ID, false );
1066
+ wp_register_style( 'l10n', _HMW_THEME_URL_ . 'wplogin/css/l10n.min.css', null, HMW_VERSION_ID, false );
1067
+ wp_register_script( 'password-strength-meter', _HMW_THEME_URL_ . 'wplogin/js/password-strength-meter.min.js', array(
1068
+ 'jquery',
1069
+ 'zxcvbn-async'
1070
+ ), HMW_VERSION_ID, true );
1071
+ wp_register_script( 'user-profile', _HMW_THEME_URL_ . 'wplogin/js/user-profile.min.js', array(
1072
+ 'jquery',
1073
+ 'password-strength-meter',
1074
+ 'wp-util'
1075
+ ), HMW_VERSION_ID, true );
1076
+ /////////////////////////////////////////////////////////
1077
+
1078
+
1079
+ //remove clasiera theme loop
1080
+ remove_action( 'login_init', 'classiera_cubiq_login_init' );
1081
+ remove_filter( 'login_redirect', 'buddyboss_redirect_previous_page' );
1082
+ remove_filter( "login_redirect", "loginstyle_login_redirect" );
1083
+
1084
+ if ( HMW_Classes_Tools::getValue( 'noredirect', false ) || HMW_Classes_Tools::getOption( 'hmw_remove_third_hooks' ) ) {
1085
+ remove_all_actions( 'login_init' );
1086
+ remove_all_actions( 'login_redirect' );
1087
+ add_filter( 'login_headerurl', array( $this, 'login_url' ) );
1088
+ add_filter( 'login_redirect', array( $this, 'sanitize_login_redirect' ), 1, 3 );
1089
+ }
1090
+
1091
+
1092
+ if ( HMW_Classes_Tools::getOption( 'error' ) || HMW_Classes_Tools::getOption( 'logout' ) ) {
1093
+ return;
1094
+ }
1095
+
1096
+ if ( HMW_Classes_Tools::$default['hmw_login_url'] <> HMW_Classes_Tools::getOption( 'hmw_login_url' ) ) {
1097
+ add_filter( 'lostpassword_redirect', array( $this, 'lostpassword_redirect' ), 1 );
1098
+ add_filter( 'registration_redirect', array( $this, 'registration_redirect' ), 1 );
1099
+
1100
+ HMW_Classes_ObjController::getClass( 'HMW_Models_Cookies' )->setTestCookie();
1101
+ }
1102
+ }
1103
+
1104
+ /**
1105
+ * Change the password confirm URL with the new URL
1106
+ * @return string
1107
+ */
1108
+ public function lostpassword_redirect() {
1109
+ return site_url( 'wp-login.php?checkemail=confirm' );
1110
+ }
1111
+
1112
+ /**
1113
+ * Change the register confirmation URL with the new URL
1114
+ * @return string
1115
+ */
1116
+ public function registration_redirect() {
1117
+ return site_url( 'wp-login.php?checkemail=registered' );
1118
+ }
1119
+
1120
+ /**
1121
+ * Called from WP hook to change the lost password URL
1122
+ *
1123
+ * @param $url
1124
+ *
1125
+ * @return mixed
1126
+ */
1127
+ public function lostpassword_url( $url ) {
1128
+ if ( HMW_Classes_Tools::getOption( 'hmw_lostpassword_url' ) <> '' ) {
1129
+ $url = str_ireplace( $this->_replace['from'], $this->_replace['to'], $url );
1130
+ }
1131
+
1132
+ return $url;
1133
+ }
1134
+
1135
+ /**
1136
+ * Called from WP hook to change the register URL
1137
+ *
1138
+ * @param $url
1139
+ *
1140
+ * @return mixed
1141
+ */
1142
+ public function register_url( $url ) {
1143
+ if ( HMW_Classes_Tools::getOption( 'hmw_register_url' ) <> '' ) {
1144
+ $url = str_ireplace( $this->_replace['from'], $this->_replace['to'], $url );
1145
+ }
1146
+
1147
+ return $url;
1148
+ }
1149
+
1150
+ /**
1151
+ * Get the new Logout URL
1152
+ *
1153
+ * @param string $url
1154
+ * @param string $redirect
1155
+ *
1156
+ * @return string
1157
+ */
1158
+ public function logout_url( $url, $redirect = '' ) {
1159
+ $args = array();
1160
+ if ( $url <> '' ) {
1161
+ $parsed = @parse_url( $url );
1162
+ if ( $parsed['query'] <> '' ) {
1163
+ @parse_str( html_entity_decode( $parsed['query'] ), $args );
1164
+ }
1165
+ }
1166
+
1167
+ if ( isset( $args['_wpnonce'] ) && HMW_Classes_Tools::getOption( 'hmw_logout_url' ) <> '' ) {
1168
+ $url = site_url() . '/' . add_query_arg( array( '_wpnonce' => $args['_wpnonce'] ), HMW_Classes_Tools::getOption( 'hmw_logout_url' ) );
1169
+ }
1170
+
1171
+ return $url;
1172
+ }
1173
+
1174
+ /**
1175
+ * Get the new Author URL
1176
+ *
1177
+ * @param array $rewrite
1178
+ *
1179
+ * @return mixed
1180
+ */
1181
+ public function author_url( $rewrite ) {
1182
+ if ( HMW_Classes_Tools::getOption( 'error' ) || HMW_Classes_Tools::getOption( 'logout' ) ) {
1183
+ return $rewrite;
1184
+ }
1185
+
1186
+ if ( HMW_Classes_Tools::$default['hmw_author_url'] <> HMW_Classes_Tools::getOption( 'hmw_author_url' ) ) {
1187
+ foreach ( $rewrite as $from => $to ) {
1188
+ $newfrom = str_replace( HMW_Classes_Tools::$default['hmw_author_url'], HMW_Classes_Tools::getOption( 'hmw_author_url' ), $from );
1189
+ $rewrite[ $newfrom ] = $to;
1190
+ }
1191
+ }
1192
+
1193
+ return $rewrite;
1194
+ }
1195
+
1196
+ /******************************** HOOK REDIRECTS *************************************************/
1197
+
1198
+ /**
1199
+ * Hook the logout to flush the changes set in admin
1200
+ */
1201
+ public function wp_logout() {
1202
+ $_REQUEST['redirect_to'] = $redirect_to = site_url();
1203
+
1204
+ if ( HMW_Classes_Tools::getOption( 'hmw_logout_redirect' ) ) {
1205
+ $_REQUEST['redirect_to'] = HMW_Classes_Tools::getOption( 'hmw_logout_redirect' );
1206
+ }
1207
+ }
1208
+
1209
+ /**
1210
+ * In case of redirects, correct the redirect links
1211
+ *
1212
+ * @param string $redirect The path or URL to redirect to.
1213
+ * @param string $status The HTTP response status code to use
1214
+ *
1215
+ * @return string
1216
+ * @throws Exception
1217
+ */
1218
+ public function sanitize_redirect( $redirect, $status = '' ) {
1219
+
1220
+ if ( HMW_Classes_Tools::getOption( 'error' ) || HMW_Classes_Tools::getOption( 'logout' ) ) {
1221
+ return $redirect;
1222
+ }
1223
+
1224
+ $parsed = parse_url( $redirect );
1225
+ //Check if there is the safe parameter in the url
1226
+ if ( isset( $parsed['query'] ) && ! empty( $parsed['query'] ) ) {
1227
+ @parse_str( $parsed['query'] );
1228
+ if ( isset( $hmw_disable ) ) {
1229
+ if ( $hmw_disable == HMW_Classes_Tools::getOption( 'hmw_disable' ) ) {
1230
+ $_GET[ HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ] = HMW_Classes_Tools::getOption( 'hmw_disable' );
1231
+ }
1232
+ }
1233
+ }
1234
+
1235
+ if ( HMW_Classes_Tools::$default['hmw_admin_url'] <> HMW_Classes_Tools::getOption( 'hmw_admin_url' ) ) {
1236
+ if ( strpos( $redirect, 'wp-admin' ) !== false ) {
1237
+ $redirect = $this->admin_url( $redirect );
1238
+ }
1239
+
1240
+ }
1241
+
1242
+ return $redirect;
1243
+
1244
+ }
1245
+
1246
+ /**
1247
+ * In case of login redirects, correct the redirect links
1248
+ *
1249
+ * @param string $redirect The path or URL to redirect to.
1250
+ * @param string $path
1251
+ * @param string $user
1252
+ *
1253
+ * @return string
1254
+ * @throws Exception
1255
+ */
1256
+ public function sanitize_login_redirect( $redirect, $path = '', $user ) {
1257
+
1258
+ if ( HMW_Classes_Tools::getOption( 'error' ) || HMW_Classes_Tools::getOption( 'logout' ) ) {
1259
+ return $redirect;
1260
+ }
1261
+
1262
+ $parsed = parse_url( $redirect );
1263
+ //Check if there is the safe parameter in the url
1264
+ if ( isset( $parsed['query'] ) && ! empty( $parsed['query'] ) ) {
1265
+ @parse_str( $parsed['query'] );
1266
+ if ( isset( $hmw_disable ) ) {
1267
+ if ( $hmw_disable == HMW_Classes_Tools::getOption( 'hmw_disable' ) ) {
1268
+ $_GET[ HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ] = HMW_Classes_Tools::getOption( 'hmw_disable' );
1269
+ }
1270
+ }
1271
+ }
1272
+
1273
+ //check if disable and do not redirect to login
1274
+ if ( HMW_Classes_Tools::getIsset( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ) ) {
1275
+ if ( HMW_Classes_Tools::getValue( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ) == HMW_Classes_Tools::getOption( 'hmw_disable' ) ) {
1276
+ HMW_Classes_Tools::$options = array_merge( HMW_Classes_Tools::$options, HMW_Classes_Tools::$default );
1277
+ HMW_Classes_Tools::saveOptions();
1278
+ delete_option( HMW_OPTION_SAFE );
1279
+ HMW_Classes_ObjController::getClass( 'HMW_Controllers_Brute' )->clearBlockedIPs();
1280
+ HMW_Classes_Tools::saveOptions( 'banlist_ip', json_encode( array() ) );
1281
+
1282
+ return site_url( HMW_Classes_Tools::$default['hmw_admin_url'] );
1283
+ }
1284
+ }
1285
+
1286
+ if ( HMW_Classes_Tools::$default['hmw_login_url'] <> HMW_Classes_Tools::getOption( 'hmw_login_url' ) ) {
1287
+ if ( strpos( $redirect, 'wp-login' ) !== false ) {
1288
+ $redirect = site_url( HMW_Classes_Tools::getOption( 'hmw_login_url' ) );
1289
+ }
1290
+ }
1291
+
1292
+ if ( HMW_Classes_Tools::$default['hmw_admin_url'] <> HMW_Classes_Tools::getOption( 'hmw_admin_url' ) ) {
1293
+ if ( strpos( $redirect, 'wp-admin' ) !== false ) {
1294
+ $redirect = $this->admin_url( $redirect );
1295
+ }
1296
+ }
1297
+
1298
+ if ( HMW_Classes_Tools::getValue( 'noredirect', false ) || HMW_Classes_Tools::getOption( 'hmw_remove_third_hooks' ) ) {
1299
+ remove_all_actions( 'login_redirect' );
1300
+
1301
+ if ( isset( $user ) && isset( $user->ID ) ) {
1302
+ if ( ! is_wp_error( $user ) && empty( $_REQUEST['reauth'] ) ) {
1303
+ if ( ( empty( $redirect ) || $redirect == 'wp-admin/' || $redirect == admin_url() ) ) {
1304
+ // If the user doesn't belong to a blog, send them to user admin. If the user can't edit posts, send them to their profile.
1305
+ if ( is_multisite() && ! get_active_blog_for_user( $user->ID ) && ! is_super_admin( $user->ID ) ) {
1306
+ $redirect = user_admin_url();
1307
+ } elseif ( method_exists( $user, 'has_cap' ) ) {
1308
+ if ( is_multisite() && ! $user->has_cap( 'read' ) ) {
1309
+ $redirect = get_dashboard_url( $user->ID );
1310
+ } elseif ( ! $user->has_cap( 'edit_posts' ) ) {
1311
+ $redirect = $user->has_cap( 'read' ) ? admin_url( 'profile.php' ) : site_url();
1312
+ }
1313
+ }
1314
+
1315
+ remove_all_actions( 'wp_redirect' );
1316
+
1317
+ wp_validate_redirect( $redirect );
1318
+ wp_redirect( $redirect );
1319
+ exit();
1320
+ }
1321
+
1322
+ remove_all_actions( 'wp_redirect' );
1323
+
1324
+ wp_validate_redirect( $redirect );
1325
+ wp_safe_redirect( $redirect );
1326
+ exit();
1327
+ }
1328
+ }
1329
+ }
1330
+
1331
+ return $redirect;
1332
+ }
1333
+
1334
+ /**
1335
+ * Check if the current URL is the same with the redirect URL
1336
+ *
1337
+ * @param $url
1338
+ *
1339
+ * @return string
1340
+ */
1341
+ public function loopCheck( $url ) {
1342
+ if ( isset( $_SERVER['HTTP_HOST'] ) && isset( $_SERVER['REQUEST_URI'] ) && $url <> '' ) {
1343
+ $current_url = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
1344
+ $redirect_url = parse_url( $url, PHP_URL_HOST ) . parse_url( $url, PHP_URL_PATH );
1345
+ if ( $current_url <> '' && $redirect_url <> '' ) {
1346
+ if ( $current_url == $redirect_url ) {
1347
+ return add_query_arg( array( 'noredirect' => true ), $url );
1348
+ }
1349
+ }
1350
+
1351
+ }
1352
+
1353
+ if ( HMW_Classes_Tools::getOption( 'hmw_hide_wplogin' ) || HMW_Classes_Tools::getOption( 'hmw_hide_login' ) ) {
1354
+ if ( HMW_Classes_Tools::$default['hmw_login_url'] <> HMW_Classes_Tools::getOption( 'hmw_login_url' ) ) {
1355
+ if ( is_user_logged_in() ) {
1356
+ $paths = array(
1357
+ site_url( 'wp-login.php', 'relative' ),
1358
+ site_url( 'wp-login', 'relative' ),
1359
+ );
1360
+ } else {
1361
+ $paths = array(
1362
+ home_url( 'wp-login.php', 'relative' ),
1363
+ home_url( 'wp-login', 'relative' ),
1364
+ site_url( 'wp-login.php', 'relative' ),
1365
+ site_url( 'wp-login', 'relative' ),
1366
+ );
1367
+
1368
+ if ( HMW_Classes_Tools::getOption( 'hmw_hide_login' ) ) {
1369
+
1370
+ array_push( $paths, home_url( 'login', 'relative' ) );
1371
+ array_push( $paths, site_url( 'login', 'relative' ) );
1372
+
1373
+ }
1374
+
1375
+ $paths = array_unique( $paths );
1376
+ }
1377
+
1378
+ if ( $this->searchInString( $url, $paths ) ) {
1379
+ if ( site_url( HMW_Classes_Tools::getOption( 'hmw_login_url' ), 'relative' ) <> $url) {
1380
+ return add_query_arg( array( 'noredirect' => true ), site_url( HMW_Classes_Tools::getOption( 'hmw_login_url' ) ) );
1381
+ }
1382
+ }
1383
+ }
1384
+ }
1385
+
1386
+ return $url;
1387
+ }
1388
+
1389
+ /**
1390
+ * Check Hidden pages and return 404 if needed
1391
+ */
1392
+ public function hideUrls() {
1393
+ if ( HMW_Classes_Tools::getOption( 'error' ) || HMW_Classes_Tools::getOption( 'logout' ) ) {
1394
+ return;
1395
+ }
1396
+
1397
+ if ( HMW_Classes_Tools::getIsset( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ) ) {
1398
+ if ( HMW_Classes_Tools::getValue( HMW_Classes_Tools::getOption( 'hmw_disable_name' ) ) == HMW_Classes_Tools::getOption( 'hmw_disable' ) ) {
1399
+ return;
1400
+ }
1401
+ }
1402
+
1403
+ if ( isset( $_SERVER['SERVER_NAME'] ) && isset( $_SERVER["REQUEST_URI"] ) ) {
1404
+ $url = untrailingslashit( strtok( $_SERVER["REQUEST_URI"], '?' ) );
1405
+ $http_post = ( 'POST' == $_SERVER['REQUEST_METHOD'] );
1406
+
1407
+ //if user is logged in and is not set to hide the admin urls
1408
+ if ( is_user_logged_in() ) {
1409
+ //redirect if no final slash is added
1410
+ if ( $_SERVER['REQUEST_URI'] == site_url( HMW_Classes_Tools::getOption( 'hmw_admin_url' ), 'relative' ) ) {
1411
+ wp_safe_redirect( $url . '/' );
1412
+ exit();
1413
+ }
1414
+ } else if ( HMW_Classes_Tools::getValue( 'action' ) == 'itsec-check-loopback' ) { //IThemes Security check
1415
+ $exp = HMW_Classes_Tools::getValue( 'exp', false );
1416
+ $action = 'itsec-check-loopback';
1417
+ $hash = hash_hmac( 'sha1', "{$action}|{$exp}", wp_salt() );
1418
+
1419
+ if ( $hash <> HMW_Classes_Tools::getValue( 'hash', '' ) ) {
1420
+ wp_safe_redirect( $url . '/' );
1421
+ exit();
1422
+ }
1423
+ } else {
1424
+ //if is set to hide the urls or not logged in
1425
+ if ( $url <> '' ) {
1426
+ /////////////////////////////////////////////////////
1427
+ //Hide Admin URL when changed
1428
+ if ( HMW_Classes_Tools::$default['hmw_admin_url'] <> HMW_Classes_Tools::getOption( 'hmw_admin_url' ) ) {
1429
+ if ( is_user_logged_in() ) { //if user is logged in
1430
+ $paths = array(
1431
+ home_url( 'wp-admin', 'relative' ),
1432
+ site_url( 'wp-admin', 'relative' )
1433
+ );
1434
+ } else { //if not logged in
1435
+ if ( HMW_Classes_Tools::getOption( 'hmw_hide_newadmin' ) ) {
1436
+ if ( strpos( $url . '/', '/' . HMW_Classes_Tools::getOption( 'hmw_admin_url' ) . '/' ) !== false && HMW_Classes_Tools::getOption( 'hmw_hide_admin' ) ) {
1437
+ if ( strpos( $url . '/', '/' . HMW_Classes_Tools::getOption( 'hmw_admin-ajax_url' ) . '/' ) === false ) {
1438
+ $this->getNotFound( $url );
1439
+ }
1440
+ }
1441
+ } else {
1442
+ if ( $_SERVER['REQUEST_URI'] == site_url( HMW_Classes_Tools::getOption( 'hmw_admin_url' ), 'relative' ) ) {
1443
+ wp_safe_redirect( $url . '/' );
1444
+ exit();
1445
+ }
1446
+ }
1447
+
1448
+ $paths = array(
1449
+ home_url( 'wp-admin', 'relative' ),
1450
+ home_url( 'dashboard', 'relative' ),
1451
+ home_url( 'admin', 'relative' ),
1452
+ site_url( 'wp-admin', 'relative' ),
1453
+ site_url( 'dashboard', 'relative' ),
1454
+ site_url( 'admin', 'relative' ),
1455
+ );
1456
+ $paths = array_unique( $paths );
1457
+ }
1458
+
1459
+ if ( $this->searchInString( $url, $paths ) ) {
1460
+ if ( site_url( HMW_Classes_Tools::getOption( 'hmw_admin_url' ), 'relative' ) <> $url && HMW_Classes_Tools::getOption( 'hmw_hide_admin' ) ) {
1461
+ $this->getNotFound( $url );
1462
+ }
1463
+ }
1464
+ } elseif ( ! is_user_logged_in() ) {
1465
+ if ( strpos( $url, '/wp-admin' ) !== false && strpos( $url, admin_url( 'admin-ajax.php', 'relative' ) ) === false && HMW_Classes_Tools::getOption( 'hmw_hide_admin' ) ) {
1466
+ $this->getNotFound( $url );
1467
+ }
1468
+ }
1469
+
1470
+ if ( $http_post ) {
1471
+ if ( HMW_Classes_Tools::getOption( 'hmw_lostpassword_url' ) <> '' ) {
1472
+ if ( strpos( $url, '/' . HMW_Classes_Tools::getOption( 'hmw_lostpassword_url' ) ) !== false ) {
1473
+ $_REQUEST['action'] = 'lostpassword';
1474
+ }
1475
+ }
1476
+
1477
+ if ( HMW_Classes_Tools::getOption( 'hmw_register_url' ) <> '' ) {
1478
+ if ( strpos( $url, '/' . HMW_Classes_Tools::getOption( 'hmw_register_url' ) ) !== false ) {
1479
+ $_REQUEST['action'] = 'register';
1480
+ }
1481
+ }
1482
+ }
1483
+
1484
+ /////////////////////////////////////////////////////
1485
+ //Hide Login URL when changed
1486
+ if ( HMW_Classes_Tools::getOption( 'hmw_hide_wplogin' ) || HMW_Classes_Tools::getOption( 'hmw_hide_login' ) ) {
1487
+ if ( HMW_Classes_Tools::$default['hmw_login_url'] <> HMW_Classes_Tools::getOption( 'hmw_login_url' ) ) {
1488
+ if ( is_user_logged_in() ) {
1489
+ $paths = array(
1490
+ site_url( 'wp-login.php', 'relative' ),
1491
+ site_url( 'wp-login', 'relative' ),
1492
+ );
1493
+ } else {
1494
+ $paths = array(
1495
+ home_url( 'wp-login.php', 'relative' ),
1496
+ home_url( 'wp-login', 'relative' ),
1497
+ site_url( 'wp-login.php', 'relative' ),
1498
+ site_url( 'wp-login', 'relative' ),
1499
+ );
1500
+
1501
+ if ( HMW_Classes_Tools::getOption( 'hmw_hide_login' ) ) {
1502
+
1503
+ array_push( $paths, home_url( 'login', 'relative' ) );
1504
+ array_push( $paths, site_url( 'login', 'relative' ) );
1505
+
1506
+ }
1507
+
1508
+ $paths = array_unique( $paths );
1509
+
1510
+ }
1511
+
1512
+ if ( $this->searchInString( $url, $paths ) ) {
1513
+
1514
+ if ( site_url( HMW_Classes_Tools::getOption( 'hmw_login_url' ), 'relative' ) <> $url) {
1515
+ $this->getNotFound( $url );
1516
+ }
1517
+ }
1518
+ }
1519
+ }
1520
+
1521
+ /////////////////////////////////////////////////////
1522
+ //Hide the author url when changed
1523
+ if ( HMW_Classes_Tools::$default['hmw_author_url'] <> HMW_Classes_Tools::getOption( 'hmw_author_url' ) ) {
1524
+ $paths = array(
1525
+ home_url( 'author', 'relative' ),
1526
+ site_url( 'author', 'relative' ),
1527
+ );
1528
+ if ( $this->searchInString( $url, $paths ) ) {
1529
+ $this->getNotFound( $url );
1530
+ }
1531
+ }
1532
+
1533
+ /////////////////////////////////////////////////////
1534
+ //Hide the common php file in case of other servers
1535
+ $paths = array(
1536
+ home_url( 'install.php', 'relative' ),
1537
+ home_url( 'upgrade.php', 'relative' ),
1538
+ home_url( 'wp-signup.php', 'relative' ),
1539
+ home_url( 'wp-config.php', 'relative' ),
1540
+ home_url( 'bb-config.php', 'relative' ),
1541
+ site_url( 'install.php', 'relative' ),
1542
+ site_url( 'upgrade.php', 'relative' ),
1543
+ site_url( 'wp-signup.php', 'relative' ),
1544
+ site_url( 'wp-config.php', 'relative' ),
1545
+ site_url( 'bb-config.php', 'relative' ),
1546
+ );
1547
+ if ( $this->searchInString( $url, $paths ) ) {
1548
+ $this->getNotFound( $url );
1549
+ }
1550
+ /////////////////////////////////////////////////////
1551
+
1552
+ }
1553
+ }
1554
+ }
1555
+
1556
+ }
1557
+
1558
+ /**
1559
+ * Search part of string in array
1560
+ *
1561
+ * @param $needle
1562
+ * @param $haystack
1563
+ *
1564
+ * @return bool
1565
+ */
1566
+ public function searchInString( $needle, $haystack ) {
1567
+ foreach ( $haystack as $value ) {
1568
+ if ( stripos( $needle . '/', $value . '/' ) !== false ) {
1569
+ return true;
1570
+ }
1571
+ }
1572
+
1573
+ return false;
1574
+ }
1575
+
1576
+ /**
1577
+ * Return 404 page or redirect
1578
+ *
1579
+ * @param string $url
1580
+ */
1581
+ public function getNotFound( $url ) {
1582
+ HMW_Debug::dump( $url );
1583
+
1584
+ if ( HMW_Classes_Tools::getOption( 'hmw_url_redirect' ) == '404' ) {
1585
+ global $wp_query;
1586
+ $wp_query->is_404 = true;
1587
+
1588
+ wp_validate_redirect( site_url( '404' ) );
1589
+ wp_safe_redirect( site_url( '404' ) );
1590
+ } elseif ( HMW_Classes_Tools::getOption( 'hmw_url_redirect' ) == '.' ) {
1591
+ //redirect to front page
1592
+ wp_redirect( site_url() );
1593
+ } else {
1594
+ //redirect to custom page
1595
+ wp_validate_redirect( HMW_Classes_Tools::getOption( 'hmw_url_redirect' ) );
1596
+ wp_redirect( site_url( HMW_Classes_Tools::getOption( 'hmw_url_redirect' ) ) );
1597
+ }
1598
+
1599
+ die();
1600
+ }
1601
+
1602
+ /************************************* FIND AND REPLACE *****************************************/
1603
+ /**
1604
+ * Prepare the replace function
1605
+ *
1606
+ * @param string $content
1607
+ */
1608
+ public function prepareFindReplace( $content = '' ) {
1609
+ $findencoded = $findencodedfinal = $replaceencoded = $replaceencodedfinal = $findcdns = $replacecdns = array();
1610
+
1611
+ if ( $cdns = HMW_Classes_ObjController::getClass( 'HMW_Models_Compatibility' )->findCDNServers() ) {
1612
+ foreach ( $cdns as $cdn ) {
1613
+ $cdn = parse_url( $cdn, PHP_URL_HOST ) . parse_url( site_url(), PHP_URL_PATH ) . '/';
1614
+
1615
+ $findcdn = preg_replace( '/^/', $cdn, (array) $this->_replace['from'] );
1616
+ $replacecdn = preg_replace( '/^/', $cdn, (array) $this->_replace['to'] );
1617
+
1618
+ //merge the urls
1619
+ $findcdns = array_merge( $findcdns, $findcdn );
1620
+ $replacecdns = array_merge( $replacecdns, $replacecdn );
1621
+
1622
+ //HMW_Debug::dump($cdn, $findcdns, $replacecdns);
1623
+ }
1624
+ }
1625
+
1626
+ if ( isset( $this->_replace['from'] ) && isset( $this->_replace['to'] ) && ! empty( $this->_replace['from'] ) && ! empty( $this->_replace['to'] ) ) {
1627
+ //make sure the paths are without schema
1628
+ $find = array_map( array( $this, 'addDomainUrl' ), (array) $this->_replace['from'] );
1629
+ $replace = array_map( array( $this, 'addDomainUrl' ), (array) $this->_replace['to'] );
1630
+
1631
+ //change the javascript urls
1632
+ $findencoded = array_map( array( $this, 'changeEncodedURL' ), (array) $this->_replace['from'] );
1633
+ $replaceencoded = array_map( array( $this, 'changeEncodedURL' ), (array) $this->_replace['to'] );
1634
+ //change the javascript urls
1635
+ $findencodedfinal = array_map( array(
1636
+ $this,
1637
+ 'changeEncodedURLFinal'
1638
+ ), (array) $this->_replace['from'] );
1639
+ $replaceencodedfinal = array_map( array( $this, 'changeEncodedURLFinal' ), (array) $this->_replace['to'] );
1640
+ }
1641
+
1642
+ //merge the urls
1643
+ $this->_replace['from'] = array_merge( $findcdns, $find, $findencoded, $findencodedfinal );
1644
+ $this->_replace['to'] = array_merge( $replacecdns, $replace, $replaceencoded, $replaceencodedfinal );
1645
+
1646
+
1647
+ }
1648
+
1649
+ /**
1650
+ * Remove the Schema from url
1651
+ *
1652
+ * @param $url
1653
+ *
1654
+ * @return string
1655
+ */
1656
+ public function addDomainUrl( $url ) {
1657
+ if ( strpos( $url, $this->_blogurl ) === false ) {
1658
+ return $this->_blogurl . '/' . $url;
1659
+ }
1660
+ }
1661
+
1662
+ /**
1663
+ * Remove the Schema from url
1664
+ * Return slashed urls for javascript urls
1665
+ *
1666
+ * @param $url
1667
+ *
1668
+ * @return string
1669
+ */
1670
+ public function changeEncodedURL( $url ) {
1671
+ if ( strpos( $url, $this->_blogurl ) === false ) {
1672
+ return str_replace( '/', '\/', $this->_blogurl . '/' . $url );
1673
+ }
1674
+ }
1675
+
1676
+ /**
1677
+ * @param $url
1678
+ *
1679
+ * @return mixed
1680
+ */
1681
+ public function changeEncodedURLFinal( $url ) {
1682
+ if ( strpos( $url, $this->_blogurl ) === false ) {
1683
+ return str_replace( '/', '\/', rtrim( $this->_blogurl . '/' . $url, '/' ) );
1684
+ }
1685
+ }
1686
+
1687
+ /**
1688
+ * Change content
1689
+ *
1690
+ * @param string $content
1691
+ *
1692
+ * @return mixed
1693
+ */
1694
+ public function find_replace( $content ) {
1695
+ if ( HMW_Classes_Tools::getOption( 'error' ) ) {
1696
+ return $content;
1697
+ }
1698
+
1699
+ if ( is_string( $content ) ) {
1700
+
1701
+ //if the changes were made already, return
1702
+ if ( strpos( $content, HMW_Classes_Tools::$default['hmw_wp-content_url'] ) === false && $this->_replaced ) {
1703
+ return $content;
1704
+ }
1705
+
1706
+ //remove source commets
1707
+ if ( HMW_Classes_Tools::getOption( 'hmw_hide_comments' ) ) {
1708
+ $content = preg_replace_callback( '/<!--([\\s\\S]*?)-->/', array( $this, '_commentRemove' ), $content );
1709
+ }
1710
+
1711
+ //remove versions
1712
+ if ( HMW_Classes_Tools::getOption( 'hmw_hide_version' ) ) {
1713
+ $content = preg_replace( array(
1714
+ '/[\?|&]ver=[0-9a-zA-Z._-]+/',
1715
+ '/<meta[^>]*name=[\'"]generator[\'"][^>]*>/i',
1716
+ '/<link[^>]*rel=[\'"]dns-prefetch[\'"][^>]*>/i'
1717
+ ), '', $content );
1718
+ if ( defined( 'JETPACK__VERSION' ) ) {
1719
+ $content = preg_replace( '/<script[^>]*src=[\'"]https:\/\/s0.wp.com\/wp-content\/js\/devicepx-jetpack.js[\'"][^>]*><\/script>/i', '<script type="text/javascript" src="' . _HMW_THEME_URL_ . 'js/jptraffic.js' . '"></script>', $content );
1720
+ }
1721
+ }
1722
+
1723
+ //if it wasn't replaced before
1724
+ if ( ! $this->_replaced ) {
1725
+ if ( ! isset( $this->_replace['from'] ) && ! isset( $this->_replace['to'] ) ) {
1726
+ $this->buildRedirect();
1727
+ }
1728
+
1729
+ //fix the relative links if not in safe mode
1730
+ if ( HMW_Classes_Tools::getOption( 'hmw_fix_relative' ) ) {
1731
+ $content = $this->fixRelativeLinks( $content );
1732
+ }
1733
+
1734
+ //make sure to include the blog url
1735
+ $this->prepareFindReplace( $content );
1736
+ }
1737
+
1738
+ if ( isset( $this->_replace['from'] ) && isset( $this->_replace['to'] ) && ! empty( $this->_replace['from'] ) && ! empty( $this->_replace['to'] ) ) {
1739
+ $content = str_ireplace( $this->_replace['from'], $this->_replace['to'], $content );
1740
+ }
1741
+
1742
+ //Replace custom classes
1743
+ $content = $this->replaceTextMapping( $content );
1744
+
1745
+ }
1746
+
1747
+ //Remove Powered-By header and link
1748
+ if ( function_exists( 'header_remove' ) ) {
1749
+ @header_remove( "X-Powered-By" );
1750
+ @header_remove( "x-cf-powered-by" );
1751
+ @header_remove( "Server" );
1752
+ }
1753
+
1754
+ $this->_replaced = true;
1755
+
1756
+ return $content;
1757
+ }
1758
+
1759
+ /**
1760
+ * Rename the paths in URL with the new ones
1761
+ *
1762
+ * @param $url
1763
+ *
1764
+ * @return string
1765
+ */
1766
+ public function find_replace_url( $url ) {
1767
+ if ( strpos( $url, '/' . HMW_Classes_Tools::$default['hmw_wp-content_url'] . '/' ) !== false || strpos( $url, '/' . HMW_Classes_Tools::$default['hmw_wp-includes_url'] . '/' ) !== false ) {
1768
+ //change and replace paths
1769
+ if ( ! isset( $this->_replace['from'] ) && ! isset( $this->_replace['to'] ) ) {
1770
+ $this->buildRedirect();
1771
+ }
1772
+
1773
+ if ( isset( $this->_replace['from'] ) && isset( $this->_replace['to'] ) && ! empty( $this->_replace['from'] ) && ! empty( $this->_replace['to'] ) ) {
1774
+ $rewrite = $this->_replace['rewrite'];
1775
+ $rewrite_from = $this->_replace['from'];
1776
+ $rewrite_to = $this->_replace['to'];
1777
+ foreach ( $rewrite as $index => $value ) {
1778
+ //add only the paths or the design path
1779
+ if ( ( $index && isset( $rewrite_to[ $index ] ) && substr( $rewrite_to[ $index ], - 1 ) == '/' ) ||
1780
+ strpos( $rewrite_to[ $index ], '/' . HMW_Classes_Tools::getOption( 'hmw_themes_style' ) ) ) {
1781
+ $this->_replace['from'][] = $rewrite_from[ $index ];
1782
+ $this->_replace['to'][] = $rewrite_to[ $index ];
1783
+ }
1784
+ }
1785
+
1786
+ unset( $rewrite );
1787
+ unset( $rewrite_from );
1788
+ unset( $rewrite_to );
1789
+
1790
+ //Don't replace include if content was already replaced
1791
+ $url = str_ireplace( $this->_replace['from'], $this->_replace['to'], $url );
1792
+ }
1793
+ }
1794
+
1795
+ return $url;
1796
+ }
1797
+
1798
+ /**
1799
+ * Find the text from Text Mapping in the source code
1800
+ *
1801
+ * @param $content
1802
+ *
1803
+ * @return mixed|string|string[]|null
1804
+ */
1805
+ public function replaceTextMapping( $content ) {
1806
+ $findtextmapping = array();
1807
+
1808
+ //Replace custom classes
1809
+ $hmw_text_mapping = json_decode( HMW_Classes_Tools::getOption( 'hmw_text_mapping' ), true );
1810
+ if ( isset( $hmw_text_mapping['from'] ) && ! empty( $hmw_text_mapping['from'] ) &&
1811
+ isset( $hmw_text_mapping['to'] ) && ! empty( $hmw_text_mapping['to'] ) ) {
1812
+ $this->_findtextmapping = $hmw_text_mapping['from'];
1813
+ $this->_replacetextmapping = $hmw_text_mapping['to'];
1814
+
1815
+ if ( HMW_Classes_Tools::getOption( 'hmw_mapping_classes' ) ) {
1816
+ foreach ( $this->_findtextmapping as $index => $from ) {
1817
+ $findtextmapping[] = '/\s(class|id|aria-labelledby|aria-controls)=[\'"][^\'"]*(' . addslashes( $from ) . ')[^\'"]*[\'"]/';
1818
+ $findtextmapping[] = "'<(style|script)((?!src|>).)*>.*?</(style|script)>'is";
1819
+ $findtextmapping[] = "'<(a|div)[^>]*data-" . addslashes( $from ) . "[^>]*[^/]>'is";
1820
+ }
1821
+
1822
+ if ( ! empty( $findtextmapping ) ) {
1823
+ $content = preg_replace_callback( $findtextmapping, array(
1824
+ $this,
1825
+ 'replaceText'
1826
+ ), $content );
1827
+ }
1828
+
1829
+
1830
+ } else {
1831
+ $content = str_ireplace( $this->_findtextmapping, $this->_replacetextmapping, $content );
1832
+ }
1833
+
1834
+ unset( $hmw_text_mapping );
1835
+ }
1836
+
1837
+ return $content;
1838
+ }
1839
+
1840
+ /**
1841
+ * Callback for Text Mapping
1842
+ *
1843
+ * @param $found
1844
+ *
1845
+ * @return mixed
1846
+ */
1847
+ public function replaceText( $found ) {
1848
+ $content = $found[0];
1849
+ if ( $content <> '' ) {
1850
+ $content = str_ireplace( $this->_findtextmapping, $this->_replacetextmapping, $content );
1851
+ }
1852
+
1853
+ return $content;
1854
+ }
1855
+
1856
+ /**
1857
+ * Replace the author URL is changed
1858
+ *
1859
+ * @param $url
1860
+ *
1861
+ * @return mixed
1862
+ */
1863
+ public function replace_author_url( $url ) {
1864
+ //Modify rest-api wp-json
1865
+ if ( HMW_Classes_Tools::$default['hmw_author_url'] <> HMW_Classes_Tools::getOption( 'hmw_author_url' ) ) {
1866
+ return str_replace( HMW_Classes_Tools::$default['hmw_author_url'], HMW_Classes_Tools::getOption( 'hmw_author_url' ), $url );
1867
+ }
1868
+
1869
+ return $url;
1870
+ }
1871
+
1872
+ /**
1873
+ * Fix for Wp-Rocket plugin. Remove deferred option from Jquery
1874
+ *
1875
+ * @param $content
1876
+ *
1877
+ * @return null|string|string[]
1878
+ */
1879
+ public function remove_jquery_deferred( $content ) {
1880
+ $content = preg_replace( '/<script[^>]*src=[\'"]([^\'"]*jquery.js)[\'"][^>]*defer[^>]*><\/script>/i', '<script type="text/javascript" src="$1"></script>', $content );
1881
+
1882
+ return $content;
1883
+ }
1884
+
1885
+ /**
1886
+ * Change the image path to absolute when in feed
1887
+ *
1888
+ * @param string $content
1889
+ *
1890
+ * @return string
1891
+ */
1892
+ public function fixRelativeLinks( $content ) {
1893
+ $content = preg_replace_callback(
1894
+ '~(\s(href|src)\s*[=|:]\s*[\"\'])([^\"\']+)([\"\'])~i',
1895
+ array( $this, 'replaceLinks' ),
1896
+ $content );
1897
+ $content = preg_replace_callback(
1898
+ '~(\W(url\s*)[\(\"\']+)([^\)\"\']+)([\)\"\']+)~i',
1899
+ array( $this, 'replaceLinks' ),
1900
+ $content );
1901
+ $content = preg_replace_callback(
1902
+ '~(([\"\']url[\"\']\s*\:)\s*[\"\'])([^\"\']+)([\"\'])~i',
1903
+ array( $this, 'replaceLinks' ),
1904
+ $content );
1905
+
1906
+ return $content;
1907
+ }
1908
+
1909
+ /**
1910
+ * If relative links then transform them to absolute
1911
+ *
1912
+ * @param $found
1913
+ *
1914
+ * @return string
1915
+ */
1916
+ public function replaceLinks( $found ) {
1917
+ $url = $found[3];
1918
+
1919
+ if ( strpos( $url, '//' ) === false && strpos( $url, '\/\/' ) === false ) {
1920
+ if ( strpos( $url, '/' . HMW_Classes_Tools::$default['hmw_wp-content_url'] . '/' ) !== false
1921
+ || strpos( $url, '/' . HMW_Classes_Tools::$default['hmw_wp-includes_url'] . '/' ) !== false
1922
+ || strpos( $url, '/' . HMW_Classes_Tools::$default['hmw_admin_url'] ) !== false
1923
+ || strpos( $url, '/' . HMW_Classes_Tools::$default['hmw_login_url'] ) !== false
1924
+ ) {
1925
+ HMW_Debug::dump( $url );
1926
+
1927
+ return $found[1] . $this->_rel2abs( $url ) . $found[4];
1928
+ }
1929
+ }
1930
+
1931
+
1932
+ return $found[0];
1933
+ }
1934
+
1935
+ /**
1936
+ * Change Relative links to Absolute links
1937
+ *
1938
+ * @param $rel
1939
+ *
1940
+ * @return string
1941
+ */
1942
+ protected function _rel2abs( $rel ) {
1943
+ $scheme = $host = $path = '';
1944
+ $backslash = false;
1945
+
1946
+ // parse base URL and convert to local variables: $scheme, $host, $path
1947
+ extract( parse_url( site_url() ) );
1948
+
1949
+ if ( strpos( $rel, "//" ) === 0 ) {
1950
+ return $scheme . ':' . $rel;
1951
+ }
1952
+
1953
+ if ( strpos( $rel, '\/' ) !== false ) {
1954
+ //if backslashes then change the URLs to normal
1955
+ $backslash = true;
1956
+ $rel = str_replace( '\/', '/', $rel );
1957
+ }
1958
+
1959
+ // return if already absolute URL
1960
+ if ( parse_url( $rel, PHP_URL_SCHEME ) != '' ) {
1961
+ return $rel;
1962
+ }
1963
+
1964
+ // queries and anchors
1965
+ if ( $rel[0] == '#' || $rel[0] == '?' ) {
1966
+ return site_url() . $rel;
1967
+ }
1968
+
1969
+ // dirty absolute URL
1970
+ if ( $path <> '' && ( strpos( $rel, $path . '/' ) === false || strpos( $rel, $path . '/' ) > 0 ) ) {
1971
+ $abs = $host . $path . "/" . $rel;
1972
+ } else {
1973
+ $abs = $host . "/" . $rel;
1974
+ }
1975
+
1976
+ // replace '//' or '/./' or '/foo/../' with '/'
1977
+ $abs = preg_replace( "/(\/\.?\/)/", "/", $abs );
1978
+ $abs = preg_replace( "/\/(?!\.\.)[^\/]+\/\.\.\//", "/", $abs );
1979
+
1980
+ // absolute URL is ready!
1981
+ if ( $backslash ) {
1982
+ return str_replace( '/', '\/', $scheme . '://' . $abs );
1983
+ } else {
1984
+ return $scheme . '://' . $abs;
1985
+
1986
+ }
1987
+ }
1988
+
1989
+ /**
1990
+ * Remove the comments from source code
1991
+ *
1992
+ * @param $m
1993
+ *
1994
+ * @return string
1995
+ */
1996
+ protected function _commentRemove( $m ) {
1997
+ return ( 0 === strpos( $m[1], '[' ) || false !== strpos( $m[1], '<![' ) )
1998
+ ? $m[0]
1999
+ : '';
2000
+ }
2001
+
2002
+ /**
2003
+ * Remove the page headers
2004
+ */
2005
+ public function hideHeaders() {
2006
+ //Remove the Link from HTTP Header
2007
+ if ( HMW_Classes_Tools::getOption( 'hmw_hide_header' ) ) {
2008
+ header( sprintf( '%s: %s', 'Link', '<' . site_url() . '>; rel=shortlink' ) );
2009
+
2010
+ if ( function_exists( 'header_remove' ) ) {
2011
+ @header_remove( 'x-cf-powered-by' );
2012
+ @header_remove( "x-powered-by" );
2013
+ @header_remove( "server" );
2014
+ }
2015
+ }
2016
+ }
2017
+
2018
+ /**
2019
+ * Replace the robotx file fo rsecurity
2020
+ *
2021
+ * @param string $content
2022
+ */
2023
+ public function replace_robots( $content ) {
2024
+ $robots = '';
2025
+ if ( $content && $content <> '' ) {
2026
+ $rows = preg_split( '/\n/', $content );
2027
+
2028
+ foreach ( $rows as $row ) {
2029
+ if ( strpos( $row, 'Sitemap:' ) !== false ) {
2030
+ $robots .= $row . "\n";
2031
+
2032
+ }
2033
+ }
2034
+ }
2035
+
2036
+ $robots .= "\n" . 'User-agent: *' . "\n";
2037
+
2038
+ if ( HMW_Classes_Tools::getOption( 'hmw_upload_url' ) <> HMW_Classes_Tools::$default['hmw_upload_url'] ) {
2039
+ $robots .= 'Allow: */' . HMW_Classes_Tools::getOption( 'hmw_upload_url' ) . '/';
2040
+ } else {
2041
+ $robots .= 'Allow: */' . HMW_Classes_Tools::getOption( 'hmw_wp-content_url' ) . '/' . HMW_Classes_Tools::$default['hmw_upload_url'] . '/';
2042
+ }
2043
+
2044
+ header( 'Status: 200 OK', true, 200 );
2045
+ header( 'Content-type: text/plain; charset=' . get_bloginfo( 'charset' ) );
2046
+
2047
+ echo $robots;
2048
+ exit();
2049
+
2050
+ }
2051
+
2052
+ /**
2053
+ * Replace the Error Message that contains WordPress
2054
+ *
2055
+ * @param $message
2056
+ * @param $error
2057
+ *
2058
+ * @return string|void
2059
+ */
2060
+ public function replace_error_message( $message, $error ) {
2061
+ if ( is_protected_endpoint() ) {
2062
+ $message = __( 'There has been a critical error on your website. Please check your site admin email inbox for instructions.' );
2063
+ } else {
2064
+ $message = __( 'There has been a critical error on your website.' );
2065
+ }
2066
+
2067
+ return $message;
2068
+ }
2069
+
2070
+ }
models/Rules.php ADDED
@@ -0,0 +1,263 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') || die('Cheatin\' uh?');
3
+
4
+ class HMW_Models_Rules {
5
+ public $root_path;
6
+ public $config_file;
7
+
8
+ public function __construct() {
9
+ $this->root_path = HMW_Classes_Tools::getRootPath();
10
+
11
+ if (HMW_Classes_Tools::isNginx()) {
12
+ $this->config_file = $this->root_path . 'hidemywpghost.conf';
13
+ } elseif (HMW_Classes_Tools::isIIS()) {
14
+ $this->config_file = $this->root_path . 'web.config';
15
+ } elseif (HMW_Classes_Tools::isApache() || HMW_Classes_Tools::isLitespeed()) {
16
+ $this->config_file = $this->root_path . '.htaccess';
17
+ } else {
18
+ $this->config_file = false;
19
+ }
20
+ }
21
+
22
+ public function getConfFile() {
23
+ return $this->config_file;
24
+ }
25
+
26
+ /**
27
+ * Check if the config file is writable
28
+ * @param string $config_file
29
+ * @return bool
30
+ */
31
+ public function isConfigWritable($config_file = null) {
32
+ //get the global config file if not specified
33
+ if (!isset($config_file)) {
34
+ $config_file = $this->getConfFile();
35
+ }
36
+
37
+ if ($config_file) {
38
+ if (!file_exists($config_file)) {
39
+ if (!is_writable(dirname($config_file))) {
40
+ return false;
41
+ }
42
+ if (!touch($config_file)) {
43
+ return false;
44
+ }
45
+ } elseif (!is_writeable($config_file)) {
46
+ return false;
47
+ }
48
+ }
49
+ return true;
50
+ }
51
+
52
+ public function writeToFile($rules, $header = 'HMWP_RULES') {
53
+ if ($this->getConfFile()) {
54
+ if (HMW_Classes_Tools::isNginx()) {
55
+ return $this->writeInNginx($rules, $header);
56
+ } elseif (HMW_Classes_Tools::isIIS() && !HMW_Classes_Tools::getOption('logout')) {
57
+ return HMW_Classes_ObjController::getClass('HMW_Models_Rewrite')->flushRewrites();
58
+ } elseif (HMW_Classes_Tools::isApache() || HMW_Classes_Tools::isLitespeed()) {
59
+ return $this->writeInHtaccess($rules, $header);
60
+ }
61
+ }
62
+ return false;
63
+ }
64
+
65
+ public function replaceToFile($old, $new, $file) {
66
+ if (!$this->isConfigWritable($file)) {
67
+ return false;
68
+ }
69
+
70
+ $found = false;
71
+ $lines = file($file);
72
+
73
+ foreach ((array)$lines as $line) {
74
+ if (preg_match("/$old/", $line)) {
75
+ $found = true;
76
+ break;
77
+ }
78
+ }
79
+
80
+
81
+ if ($found) {
82
+ $fd = fopen($file, 'w');
83
+ foreach ((array)$lines as $line) {
84
+ if (!preg_match("/$old/", $line)) {
85
+ fputs($fd, $line);
86
+ } elseif ($new <> '') {
87
+ fputs($fd, $new);
88
+ }
89
+ }
90
+ fclose($fd);
91
+ }
92
+
93
+ return $found;
94
+ }
95
+
96
+ public function writeInNginx($rules, $header = 'HMWP_RULES') {
97
+ return $this->insertWithMarkers($header, $rules);
98
+ }
99
+
100
+ public function writeInHtaccess($rules, $header = 'HMWP_RULES') {
101
+ if (HMW_Classes_Tools::isModeRewrite()) {
102
+ return $this->insertWithMarkers($header, $rules);
103
+ }
104
+ return false;
105
+ }
106
+
107
+ /**
108
+ * Inserts an array of strings into a file (.htaccess ), placing it between
109
+ * BEGIN and END markers.
110
+ *
111
+ * Replaces existing marked info. Retains surrounding
112
+ * data. Creates file if none exists.
113
+ *
114
+ * @param string $marker The marker to alter.
115
+ * @param array|string $insertion The new content to insert.
116
+ * @return bool True on write success, false on failure.
117
+ */
118
+ public function insertWithMarkers($marker, $insertion) {
119
+
120
+ if (!$this->isConfigWritable()) {
121
+ return false;
122
+ }
123
+
124
+ if (!is_array($insertion)) {
125
+ $insertion = explode("\n", $insertion);
126
+ }
127
+
128
+ $start_marker = "# BEGIN {$marker}";
129
+ $end_marker = "# END {$marker}";
130
+
131
+ $fp = fopen($this->getConfFile(), 'r+');
132
+ if (!$fp) {
133
+ return false;
134
+ }
135
+
136
+ // Attempt to get a lock. If the filesystem supports locking, this will block until the lock is acquired.
137
+ flock($fp, LOCK_EX);
138
+
139
+ $lines = array();
140
+ while (!feof($fp)) {
141
+ $lines[] = rtrim(fgets($fp), "\r\n");
142
+ }
143
+
144
+ // Split out the existing file into the preceding lines, and those that appear after the marker
145
+ $pre_lines = $post_lines = $existing_lines = array();
146
+ $found_marker = $found_end_marker = false;
147
+ foreach ($lines as $line) {
148
+ if (!$found_marker && false !== strpos($line, $start_marker)) {
149
+ $found_marker = true;
150
+ continue;
151
+ } elseif (!$found_end_marker && false !== strpos($line, $end_marker)) {
152
+ $found_end_marker = true;
153
+ continue;
154
+ }
155
+ if (!$found_marker) {
156
+ $pre_lines[] = $line;
157
+ } elseif ($found_marker && $found_end_marker) {
158
+ $post_lines[] = $line;
159
+ } else {
160
+ $existing_lines[] = $line;
161
+ }
162
+ }
163
+
164
+ // Check to see if there was a change
165
+ if ($existing_lines === $insertion) {
166
+ flock($fp, LOCK_UN);
167
+ fclose($fp);
168
+
169
+ return true;
170
+ }
171
+
172
+ // Generate the new file data
173
+ if (!$found_marker) {
174
+ $new_file_data = implode("\n", array_merge(
175
+ array($start_marker),
176
+ $insertion,
177
+ array($end_marker),
178
+ $pre_lines
179
+ ));
180
+ } else {
181
+ $new_file_data = implode("\n", array_merge(
182
+ $pre_lines,
183
+ array($start_marker),
184
+ $insertion,
185
+ array($end_marker),
186
+ $post_lines
187
+ ));
188
+ }
189
+
190
+ // Write to the start of the file, and truncate it to that length
191
+ fseek($fp, 0);
192
+ $bytes = fwrite($fp, $new_file_data);
193
+ if ($bytes) {
194
+ ftruncate($fp, ftell($fp));
195
+ }
196
+ fflush($fp);
197
+ flock($fp, LOCK_UN);
198
+ fclose($fp);
199
+
200
+ return (bool)$bytes;
201
+ }
202
+
203
+ /**
204
+ * Hide the Old Paths like /wp-content, /wp-includes
205
+ * Requires Hide My WP Ghost
206
+ */
207
+ public function getHideOldPathRewrite() {
208
+
209
+ return '';
210
+ }
211
+
212
+ /**
213
+ * Add rules to protect the website from sql injection
214
+ * Requires Hide My WP Ghost
215
+ * @return string
216
+ */
217
+ public function getInjectionRewrite() {
218
+ return '';
219
+ }
220
+
221
+ /**
222
+ * Check if the ADMIN_COOKIE_PATH is present in wp-config.php
223
+ * @return bool
224
+ */
225
+ public function isConfigAdminCookie() {
226
+ if (file_exists(ABSPATH . 'wp-config.php')) {
227
+ $global_config_file = ABSPATH . 'wp-config.php';
228
+ } else {
229
+ $global_config_file = dirname(ABSPATH) . '/wp-config.php';
230
+ }
231
+
232
+ $lines = file($global_config_file);
233
+
234
+ foreach ((array)$lines as $line) {
235
+ if (preg_match("/ADMIN_COOKIE_PATH/", $line)) {
236
+ return true;
237
+ }
238
+ }
239
+
240
+ return false;
241
+ }
242
+
243
+
244
+
245
+ /**
246
+ * Remove the config cookie in case another plugin add this
247
+ * @return bool
248
+ */
249
+ public function removeConfigCookie() {
250
+ if (file_exists(ABSPATH . 'wp-config.php')) {
251
+ $global_config_file = ABSPATH . 'wp-config.php';
252
+ } else {
253
+ $global_config_file = dirname(ABSPATH) . '/wp-config.php';
254
+ }
255
+
256
+ if (!$this->replaceToFile('define *\( *[\'|\"]ADMIN_COOKIE_PATH[\'|\"]', '', $global_config_file)) {
257
+ return false;
258
+ }
259
+
260
+ return true;
261
+ }
262
+
263
+ }
models/Settings.php ADDED
@@ -0,0 +1,347 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') || die('Cheatin\' uh?');
3
+
4
+ class HMW_Models_Settings {
5
+ /**
6
+ * Get the admin Menu Tabs
7
+ * @return array
8
+ */
9
+ public function getTabs() {
10
+ return array(
11
+ 'hmw_permalinks' => array(
12
+ 'title' => __("Permalinks", _HMW_PLUGIN_NAME_),
13
+ 'description' => __("Change common paths", _HMW_PLUGIN_NAME_),
14
+ 'icon' => 'link'
15
+ ),
16
+ 'hmw_mapping' => array(
17
+ 'title' => __("Mapping", _HMW_PLUGIN_NAME_),
18
+ 'description' => __("Text and URL mapping", _HMW_PLUGIN_NAME_),
19
+ 'icon' => 'arrows-h'
20
+ ),
21
+ 'hmw_tweaks' => array(
22
+ 'title' => __("Tweaks", _HMW_PLUGIN_NAME_),
23
+ 'description' => __("Add WordPress Tweaks", _HMW_PLUGIN_NAME_),
24
+ 'icon' => 'puzzle-piece'
25
+ ),
26
+ 'hmw_brute' => array(
27
+ 'title' => __("Brute Force", _HMW_PLUGIN_NAME_),
28
+ 'description' => __("Add Login Protection", _HMW_PLUGIN_NAME_),
29
+ 'icon' => 'user-secret'
30
+ ),
31
+ 'hmw_log' => array(
32
+ 'title' => __("Log Events", _HMW_PLUGIN_NAME_),
33
+ 'description' => __("Website Events Log", _HMW_PLUGIN_NAME_),
34
+ 'icon' => 'database'
35
+ ),
36
+ 'hmw_securitycheck' => array(
37
+ 'title' => __("Security Check", _HMW_PLUGIN_NAME_),
38
+ 'description' => __('Test Your Website', _HMW_PLUGIN_NAME_),
39
+ 'icon' => ' fa fa-search',
40
+ 'class' => 'HMW_Controllers_SecurityCheck'
41
+ ),
42
+ 'hmw_plugins' => array(
43
+ 'title' => __("Plugins", _HMW_PLUGIN_NAME_),
44
+ 'description' => 'Compatible Free Plugins',
45
+ 'icon' => 'plug'
46
+ ),
47
+ 'hmw_backup' => array(
48
+ 'title' => __("Backup/Restore", _HMW_PLUGIN_NAME_),
49
+ 'description' => __('Save your settings', _HMW_PLUGIN_NAME_),
50
+ 'icon' => 'save'
51
+ ),
52
+ 'hmw_advanced' => array(
53
+ 'title' => __("Advanced", _HMW_PLUGIN_NAME_),
54
+ 'description' => '',
55
+ 'icon' => 'cogs'
56
+ ),
57
+ );
58
+ }
59
+
60
+ /**
61
+ * Get the known plugins and themes
62
+ * @return array
63
+ */
64
+ public function getPlugins() {
65
+ return array(
66
+ 'squirrly-seo' => array(
67
+ 'title' => __("SEO SQUIRRLY"),
68
+ 'banner' => '//ps.w.org/squirrly-seo/assets/banner-772x250.png?rev=2302934',
69
+ 'description' => __("A.I.-based Private SEO Consultant. In a Plugin. Powered by Machine Learning and Cloud Services. Over 300 functionalities for SEO now available when you need them.") . '<div class="text-success my-2">' . 'SEO Plugin' . '</div>',
70
+ 'path' => 'squirrly-seo/squirrly.php',
71
+ 'url' => 'https://wpplugins.tips/plugin/squirrly-seo'
72
+ ),
73
+ 'wp-rocket' => array(
74
+ 'title' => __("WP-Rocket"),
75
+ 'banner' => _HMW_THEME_URL_ . 'img/wp-rocket-banner.jpg',
76
+ 'description' => __("WP Rocket is in fact the only cache plugin which integrates more than 80% of web performance best practices even without any options activated. ") . '<div class="text-success my-2">' . 'SEO Plugin' . '</div>',
77
+ 'path' => 'wp-rocket/wp-rocket.php',
78
+ 'url' => 'https://wpplugins.tips/plugin/wp-rocket'
79
+ ),
80
+ 'autoptimize' => array(
81
+ 'title' => __("Autoptimize"),
82
+ 'banner' => '//ps.w.org/autoptimize/assets/banner-772x250.jpg?rev=1315920',
83
+ 'description' => __("Autoptimize speeds up your website by optimizing JS, CSS and HTML, async-ing JavaScript, removing emoji cruft, optimizing Google Fonts and more.") . '<div class="text-success my-2">' . 'Cache plugin' . '</div>',
84
+ 'path' => 'autoptimize/autoptimize.php',
85
+ 'url' => 'https://wordpress.org/plugins/autoptimize/'
86
+ ),
87
+ 'minify-html-markup' => array(
88
+ 'title' => __("Minify HTML"),
89
+ 'banner' => '//ps.w.org/minify-html-markup/assets/banner-772x250.png?rev=1354339',
90
+ 'description' => __("Minify HTML output for clean looking markup and faster downloading. Minify HTML also has optional specialized minification for JS and internal CSS.") . '<div class="text-success my-2">' . 'Minify content (works with other cache plugins)' . '</div>',
91
+ 'path' => 'minify-html-markup/minify-html.php',
92
+ 'url' => 'https://wordpress.org/plugins/minify-html-markup/'
93
+ ),
94
+ 'better-wp-security' => array(
95
+ 'title' => __("iThemes Security"),
96
+ 'banner' => '//ps.w.org/better-wp-security/assets/banner-772x250.png?rev=881897',
97
+ 'description' => __("iThemes Security gives you over 30+ ways to secure and protect your WP site. WP sites can be an easy target for attacks because of plugin vulnerabilities, weak passwords and obsolete software.") . '<div class="text-success my-2">' . 'Security Plugin' . '</div>',
98
+ 'path' => 'better-wp-security/better-wp-security.php',
99
+ 'url' => 'https://wordpress.org/plugins/better-wp-security/'
100
+ ),
101
+ 'sucuri-scanner' => array(
102
+ 'title' => __("Sucuri Security"),
103
+ 'banner' => '//ps.w.org/sucuri-scanner/assets/banner-772x250.png?rev=1235419',
104
+ 'description' => __("The Sucuri WordPress Security plugin is a security toolset for security integrity monitoring, malware detection and security hardening.") . '<div class="text-success my-2">' . 'Security Plugin' . '</div>',
105
+ 'path' => 'sucuri-scanner/sucuri.php',
106
+ 'url' => 'https://wordpress.org/plugins/sucuri-scanner/'
107
+ ),
108
+ 'backupwordpress' => array(
109
+ 'title' => __("Back Up WordPress"),
110
+ 'banner' => '//ps.w.org/backupwordpress/assets/banner-772x250.jpg?rev=904756',
111
+ 'description' => __("Simple automated backups of your WordPress-powered website. Back Up WordPress will back up your entire site including your database and all your files on a schedule that suits you.") . '<div class="text-success my-2">' . 'Backup Plugin' . '</div>',
112
+ 'path' => 'backupwordpress/backupwordpress.php',
113
+ 'url' => 'https://wordpress.org/plugins/backupwordpress/'
114
+ ),
115
+
116
+ 'elementor' => array(
117
+ 'title' => __("Elementor Builder"),
118
+ 'banner' => '//ps.w.org/elementor/assets/banner-772x250.png?rev=1475479',
119
+ 'description' => __("The most advanced frontend drag & drop page builder. Create high-end, pixel perfect websites at record speeds. Any theme, any page, any design.") . '<div class="text-success my-2">' . 'Page Builder' . '</div>',
120
+ 'path' => 'elementor/elementor.php',
121
+ 'url' => 'https://wordpress.org/plugins/elementor/'
122
+ ),
123
+ 'weglot' => array(
124
+ 'title' => __("Weglot Translate"),
125
+ 'banner' => '//ps.w.org/weglot/assets/banner-772x250.png?rev=2186774',
126
+ 'description' => __("Translate your website into multiple languages without any code. Weglot Translate is fully SEO compatible and follows Google's best practices.") . '<div class="text-success my-2">' . 'Multilingual' . '</div>',
127
+ 'path' => 'weglot/weglot.php',
128
+ 'url' => 'https://wordpress.org/plugins/weglot/'
129
+ ),
130
+ 'add-to-any' => array(
131
+ 'title' => __("AddToAny Share Btn"),
132
+ 'banner' => '//ps.w.org/add-to-any/assets/banner-772x250.png?rev=1629680',
133
+ 'description' => __("Share buttons for WordPress including the AddToAny sharing button, Facebook, Twitter, Google+, Pinterest, WhatsApp, many more, and follow icons too.") . '<div class="text-success my-2">' . 'Share Buttons' . '</div>',
134
+ 'path' => 'add-to-any/add-to-any.php',
135
+ 'url' => 'https://wordpress.org/plugins/add-to-any/'
136
+ ),
137
+ );
138
+ }
139
+
140
+
141
+ public function savePermalinks($params) {
142
+ HMW_Classes_Tools::saveOptions('error', false);
143
+ HMW_Classes_Tools::saveOptions('changes', false);
144
+
145
+ if ($params['hmw_admin_url'] == $params['hmw_login_url'] && $params['hmw_admin_url'] <> '') {
146
+ HMW_Classes_Tools::saveOptions('error', true);
147
+ HMW_Classes_Error::setError(__("You can't set both ADMIN and LOGIN with the same name. Please use different names", _HMW_PLUGIN_NAME_));
148
+ return;
149
+ }
150
+
151
+ //send email when the admin is changed
152
+ if (isset($params['hmw_send_email'])) {
153
+ HMW_Classes_Tools::$default['hmw_send_email'] = $params['hmw_send_email'];
154
+ }
155
+
156
+ if ($params['hmw_mode'] == 'default') {
157
+ $params = HMW_Classes_Tools::$default;
158
+ //remove the custom rules
159
+ HMW_Classes_ObjController::getClass('HMW_Models_Rules')->writeToFile('');
160
+ HMW_Classes_ObjController::getClass('HMW_Models_Rules')->writeToFile('', 'HMWP_RULES');
161
+ }
162
+
163
+ ////////////////////////////////////////////
164
+ //Set the Category and Tags dirs
165
+ global $wp_rewrite;
166
+ $blog_prefix = '';
167
+ if (is_multisite() && !is_subdomain_install() && is_main_site() && 0 === strpos(get_option('permalink_structure'), '/blog/')) {
168
+ $blog_prefix = '/blog';
169
+ }
170
+
171
+ if (isset($params['hmw_category_base']) && method_exists($wp_rewrite, 'set_category_base')) {
172
+ $category_base = $params['hmw_category_base'];
173
+ if (!empty($category_base))
174
+ $category_base = $blog_prefix . preg_replace('#/+#', '/', '/' . str_replace('#', '', $category_base));
175
+ $wp_rewrite->set_category_base($category_base);
176
+ }
177
+
178
+ if (isset($params['hmw_tag_base']) && method_exists($wp_rewrite, 'set_tag_base')) {
179
+ $tag_base = $params['hmw_tag_base'];
180
+ if (!empty($tag_base))
181
+ $tag_base = $blog_prefix . preg_replace('#/+#', '/', '/' . str_replace('#', '', $tag_base));
182
+ $wp_rewrite->set_tag_base($tag_base);
183
+ }
184
+ ////////////////////////////////////////////
185
+
186
+ //If the admin is changed, require a logout
187
+ $lastsafeoptions = HMW_Classes_Tools::getOptions(true);
188
+ if ($lastsafeoptions['hmw_admin_url'] <> $params['hmw_admin_url']) {
189
+ HMW_Classes_Tools::saveOptions('logout', true);
190
+ } elseif ($lastsafeoptions['hmw_login_url'] <> $params['hmw_login_url']) {
191
+ HMW_Classes_Tools::saveOptions('logout', true);
192
+ }
193
+
194
+ //Save all values
195
+ $this->saveValues($params, true);
196
+
197
+ //Some values need to be save as blank is case no data is received
198
+ //Set them to blank or value
199
+ HMW_Classes_Tools::saveOptions('hmw_lostpassword_url', HMW_Classes_Tools::getValue('hmw_lostpassword_url', ''));
200
+ HMW_Classes_Tools::saveOptions('hmw_register_url', HMW_Classes_Tools::getValue('hmw_register_url', ''));
201
+ HMW_Classes_Tools::saveOptions('hmw_logout_url', HMW_Classes_Tools::getValue('hmw_logout_url', ''));
202
+
203
+ //generate unique names for plugins if needed
204
+ if (HMW_Classes_Tools::getOption('hmw_hide_plugins')) {
205
+ HMW_Classes_ObjController::getClass('HMW_Models_Rewrite')->hidePluginNames();
206
+ }
207
+ if (HMW_Classes_Tools::getOption('hmw_hide_themes')) {
208
+ HMW_Classes_ObjController::getClass('HMW_Models_Rewrite')->hideThemeNames();
209
+ }
210
+
211
+ //check if the config file is writable
212
+ if (!HMW_Classes_ObjController::getClass('HMW_Models_Rules')->isConfigWritable() || HMW_Classes_Tools::isWpengine()) {
213
+ //if not writeable, call the rules to show manually changes
214
+ if (!HMW_Classes_ObjController::getClass('HMW_Models_Rewrite')->clearRedirect()
215
+ ->setRewriteRules()
216
+ ->flushRewrites() //show rules to be added manually
217
+ ) {
218
+ HMW_Classes_Tools::saveOptions('error', true);
219
+ }
220
+ }
221
+
222
+ }
223
+
224
+ /**
225
+ * Save the Values in database
226
+ * @param $params
227
+ * @param bool $validate
228
+ */
229
+ public function saveValues($params, $validate = false) {
230
+ //Save the option values
231
+ foreach ($params as $key => $value) {
232
+ if (in_array($key, array_keys(HMW_Classes_Tools::$options))) {
233
+ //Make sure is set in POST
234
+ if (HMW_Classes_Tools::getIsset($key)) {
235
+ //sanitize the value first
236
+ $value = HMW_Classes_Tools::getValue($key);
237
+
238
+ //set the default value in case of nothing to prevent empty paths and errors
239
+ if ($value == '') {
240
+ if (isset(HMW_Classes_Tools::$default[$key])) {
241
+ $value = HMW_Classes_Tools::$default[$key];
242
+ } elseif (isset(HMW_Classes_Tools::$init[$key])) {
243
+ $value = HMW_Classes_Tools::$init[$key];
244
+ }
245
+ }
246
+
247
+ //Detect Invalid Names
248
+ if ($validate) {
249
+ if (!$this->invalidName($value)) { //if the name is valid
250
+ //Detect Weak Names
251
+ $this->weakName($value); //show weak names
252
+ HMW_Classes_Tools::saveOptions($key, $value);
253
+ }
254
+ } else {
255
+ HMW_Classes_Tools::saveOptions($key, $value);
256
+ }
257
+ }
258
+ }
259
+ }
260
+ }
261
+
262
+ /**
263
+ * Check invalid name and avoid errors
264
+ * @param $name
265
+ * @return bool
266
+ */
267
+ public function invalidName($name) {
268
+ $invalid_paths = array(
269
+ 'index.php',
270
+ 'readme.html',
271
+ 'sitemap.xml',
272
+ '.htaccess',
273
+ 'license.txt',
274
+ 'wp-blog-header.php',
275
+ 'wp-config.php',
276
+ 'wp-config-sample.php',
277
+ 'wp-activate.php',
278
+ 'wp-cron.php',
279
+ 'wp-mail.php',
280
+ 'wp-load.php',
281
+ 'wp-links-opml.php',
282
+ 'wp-settings.php',
283
+ 'wp-signup.php',
284
+ 'wp-trackback.php',
285
+ 'xmlrpc.php',
286
+ 'content',
287
+ 'includes',
288
+ 'plugins',
289
+ 'themes',
290
+ 'css',
291
+ 'js',
292
+ 'font',
293
+ 'assets',
294
+ );
295
+ if (is_string($name) && strlen($name) > 1 && strlen($name) < 3) {
296
+ HMW_Classes_Error::setError(sprintf(__("Short name detected: %s. You need to use unique paths with more than 4 chars to avoid WordPress errors.", _HMW_PLUGIN_NAME_), '<strong>' . $name . '</strong>'));
297
+ return true;
298
+ }
299
+
300
+ if (in_array($name, $invalid_paths)) {
301
+ HMW_Classes_Error::setError(sprintf(__("Invalid name detected: %s. You need to use another name to avoid WordPress errors.", _HMW_PLUGIN_NAME_), '<strong>' . $name . '</strong>'));
302
+ return true;
303
+ }
304
+
305
+ if (strpos($name, '//') !== false) {
306
+ HMW_Classes_Error::setError(sprintf(__("Invalid name detected: %s. Add only the final path name to avoid WordPress errors.", _HMW_PLUGIN_NAME_), '<strong>' . $name . '</strong>'));
307
+ return true;
308
+ }
309
+ if (strpos($name, '/') !== false && strpos($name, '/') == 0) {
310
+ HMW_Classes_Error::setError(sprintf(__("Invalid name detected: %s. The name can't start with / to avoid WordPress errors.", _HMW_PLUGIN_NAME_), '<strong>' . $name . '</strong>'));
311
+ return true;
312
+ }
313
+ $array = explode('/', $name);
314
+ if (!empty($array)) {
315
+ foreach ($array as $row) {
316
+ if (substr($row, -1) == '.') {
317
+ HMW_Classes_Error::setError(sprintf(__("Invalid name detected: %s. The paths can't end with . to avoid WordPress errors.", _HMW_PLUGIN_NAME_), '<strong>' . $name . '</strong>'));
318
+ return true;
319
+ }
320
+ }
321
+ }
322
+ return false;
323
+ }
324
+
325
+ /**
326
+ * Check if the name is week for security
327
+ * @param $name
328
+ */
329
+ public function weakName($name) {
330
+ $invalit_paths = array(
331
+ 'login',
332
+ 'mylogin',
333
+ 'wp-login',
334
+ 'admin',
335
+ 'wp-mail.php',
336
+ 'wp-settings.php',
337
+ 'wp-signup.php',
338
+ 'wp-trackback.php',
339
+ 'xmlrpc.php',
340
+ 'wp-include',
341
+ );
342
+
343
+ if (in_array($name, $invalit_paths)) {
344
+ HMW_Classes_Error::setError(sprintf(__("Weak name detected: %s. You need to use another name to increase your website security.", _HMW_PLUGIN_NAME_), '<strong>' . $name . '</strong>'));
345
+ }
346
+ }
347
+ }
models/Woocommerce.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') || die('Cheatin\' uh?');
3
+
4
+ class HMW_Models_Woocommerce {
5
+
6
+ public function __construct() {
7
+ add_action('wp_default_scripts', array($this, 'remove_password_strength_meter'));
8
+ }
9
+
10
+ public function remove_password_strength_meter($scripts) {
11
+ if (!is_user_logged_in()) {
12
+ if (method_exists($scripts, 'remove')) {
13
+ $scripts->remove('password-strength-meter');
14
+ }
15
+ }
16
+ return $scripts;
17
+ }
18
+
19
+
20
+ }
readme.txt ADDED
@@ -0,0 +1,745 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === Hide My WP Ghost - Security Plugin ===
2
+ Contributors: johndarrel
3
+ Tags: security, firewall, hide my wp, hide wp-admin, hide wp-login, hide wordpress, admin, ocultar mi wp, hide my site, hide my wordpress
4
+ Requires at least: 4.3
5
+ Tested up to: 5.5
6
+ Requires PHP: 5.6
7
+ Stable tag: trunk
8
+ Donate link: https://wpplugins.tips/wordpress
9
+ License: GPLv2 or later
10
+ License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
+
12
+ Hide all common paths, wp-admin, wp-login, wp-content, plugins, themes, authors, comments, xml-rpc, etc. Add Firewall, Brute Force protection & more.
13
+
14
+ == Description ==
15
+
16
+ **Hide My WP Ghost** is a **WordPress Security plugin**. It **changes and hides** WP common paths for the Best WP Security against hacker bots.
17
+
18
+ All the WordPress common paths can be changed together with the plugins and themes names.
19
+
20
+ **No file or directory is physically changed**. All the changes are made by WordPress redirects. All the actions are done automatically by the plugin.
21
+
22
+ After the common paths are changed, **all the common paths are hidden from hackers** to protect all the plugins and themes.
23
+
24
+ [youtube https://www.youtube.com/watch?v=gwRKHQTNkh0]
25
+
26
+ > Check the Demo Website source code:
27
+ > <a href="https://demo.wpplugins.tips/">https://demo.wpplugins.tips/</a>
28
+ > (the elementor is changed in files and classes using the PRO version)
29
+
30
+
31
+ > Check the Redirected URLs in Demo Website (all are redirected to Front Page):
32
+ > <a href="https://demo.wpplugins.tips/wp-admin/">https://demo.wpplugins.tips/wp-admin</a>
33
+ > <a href="https://demo.wpplugins.tips/wp-login/">https://demo.wpplugins.tips/wp-login</a>
34
+
35
+
36
+ > Check the Hidden Common Paths in Demo Website (all show 404 Page Not Found):
37
+ > <a href="https://demo.wpplugins.tips/wp-content/">https://demo.wpplugins.tips/wp-content</a>
38
+ > <a href="https://demo.wpplugins.tips/wp-content/plugins/">https://demo.wpplugins.tips/wp-content/plugins</a>
39
+ > <a href="https://demo.wpplugins.tips/wp-content/themes/">https://demo.wpplugins.tips/wp-content/themes</a>
40
+
41
+
42
+ The plugin works as security through obscurity solution for WordPress websites.
43
+
44
+ Security through obscurity is one of the best solutions against hacker bots and one of the best ways to protect vulnerable plugins and themes.
45
+
46
+ Over 90,000 hacking attacks per minute strike WordPress sites and WordPress hosting around the world, hitting not only large corporate websites packed with sensitive data, but also sites belonging to small businesses, independent entrepreneurs, and individuals running personal blogs.
47
+
48
+ Security of WordPress sites typically tops the list of concerns for new and experienced website owners alike.
49
+
50
+ For owners of WordPress sites, statistics like that one raises particular worries about the security not just of individual WordPress sites, but of WordPress itself.
51
+
52
+ **Is your website secure?** Check your website with <a href="https://wpplugins.tips/wordpress-vulnerability-detector/" >Free Website Security Check</a>
53
+
54
+ Protect your WordPress website by hiding the authentication paths like wp-admin, wp-login.php and wp-login and change the common WordPress paths like wp-content, wp-includes, uploads and more.
55
+
56
+ Please support us and **translate the plugin in your language**:
57
+ <a href="https://translate.wordpress.org/projects/wp-plugins/hide-my-wp">https://translate.wordpress.org/projects/wp-plugins/hide-my-wp</a>
58
+
59
+ Thank you all for your trust, support and positive reviews!
60
+
61
+ > **Hide My WP Ghost Lite Security Features**:
62
+ >
63
+ > * <strong>Hide WordPress wp-admin</strong> URL and redirect it to 404 page or a custom page
64
+ > * <strong>Hide WordPress wp-login.php</strong> and redirect it to 404 page or a custom page
65
+ > * <strong>Change the wp-admin and wp-login</strong> URLs
66
+ > * <strong>Change lost password</strong> URL
67
+ > * <strong>Change register</strong> URL
68
+ > * <strong>Change logout</strong> URL
69
+ > * <strong>Change admin-ajax</strong> URL
70
+ > * <strong>Change wp-content</strong> URL
71
+ > * <strong>Change wp-includes</strong> URL
72
+ > * <strong>Change comments</strong> URL
73
+ > * <strong>Change author</strong> URL
74
+ > * <strong>Change plugins name</strong> URL
75
+ > * <strong>Change themes name</strong> URL
76
+ > * <strong>Change category</strong> URL
77
+ > * <strong>Change tags</strong> URL
78
+ >
79
+ > **Hidden Paths: **
80
+ >
81
+ > * <strong>Hide WordPress HTML comments</strong>
82
+ > * <strong>Hide Version and WordPress Tags</strong>
83
+ > * <strong>Hide DNS Prefetch WordPress link</strong>
84
+ > * <strong>Hide WordPress Generator Meta</strong>
85
+ > * <strong>Hide RSD (Really Simple Directory) header</strong>
86
+ > * <strong>Hide Emojicons if you don't use them</strong>
87
+ >
88
+ > **Disable Paths: **
89
+ >
90
+ > * <strong>Disable XML-RPC access</strong>
91
+ > * <strong>Disable Embed scripts</strong>
92
+ > * <strong>Disable DB-Debug in Frontend</strong>
93
+ > * <strong>Disable WLW Manifest scripts</strong>
94
+ >
95
+ > **Brute Force Protection: **
96
+ >
97
+ > * <strong>Brute Force</strong> with Math Captcha
98
+ >
99
+ > **Extra Features: **
100
+ >
101
+ > * <strong>Backup and Restore</strong> settings
102
+ > * <strong>Fix relative URLs</strong>
103
+ > * <strong>Change classes using Text Mapping</strong> from HTML code
104
+ > * <strong>Cache CSS, JS and Images</strong> to optimize the loading speed
105
+ > * <strong>Weekly security check and reports</strong>
106
+ >
107
+
108
+ Compatible with: <strong>WP Multisite, Apache, Litespeed, Nginx and IIS</strong>.
109
+
110
+ Plugins Compatibility updates: **WPML, W3 Total Cache, WP Super Cache, WP Fastest Cache, Hummingbird Cache, Cachify Cache, Litespeed Cache,
111
+ Cache Enabler, CDN Enabler, WOT Cache, Autoptimize, Jetpack by WordPress, Contact Form 7, bbPress,
112
+ All In One SEO, Yoast SEO, Squirrly SEO, WP-Rocket, Minify HTML, iThemes Security, Sucuri Security,
113
+ Back-Up WordPress, Elementor Page Builder, Weglot Translate, AddToAny Share Btn, WordFence Security, Sucuri Security, Asset CleanUp**
114
+
115
+ Hosting Compatibility checked: **WP Engine, Inmotion Hosting, Hostgator Hosting, Godaddy Hosting, Host1plus,
116
+ Payperhost, Fastcomet, Dreamhost, Bitnami Apache, Bitnami Nginx, Google Cloud Hosting, Litespeed Hosting**
117
+
118
+
119
+ To **hide all the common WordPress paths** you need Hide My WP Ghost version. Check all the Ghost security features below.
120
+
121
+ The admin URL is the most common path that hackers use to break your WordPress site.
122
+
123
+ Being able to cover up the common paths is critical because you get to keep intruders away from sensitive website data.
124
+
125
+ This is crucial, and it will provide you with a great experience and really good results in the long term.
126
+
127
+ It will surely be worth it, not to mention that hiding the common paths will make hacking a lot harder as well.
128
+
129
+ If you don't protect yourself, you will end up having a hacked website sooner or later.
130
+
131
+
132
+ **This is a free version of the plugin so you can use it for all your blogs without any restrictions.**
133
+
134
+ No theme or other plugins functionality will be blocked, everything will function the same
135
+
136
+ Note: The plugin requires custom permalinks. Make sure you have it activated at Settings > Permalinks
137
+
138
+ <hr />
139
+
140
+ > **Hide My WP Ghost Premium security features**:
141
+ >
142
+ > * Hide WordPress /wp-admin
143
+ > * Hide WordPress /wp-login.php
144
+ > * Hide WordPress /wp-login/
145
+ > * Hide WordPress /login URL
146
+ > * Custom wp-admin and wp-login URLs
147
+ > * Custom admin-ajax.php URLs
148
+ > * Custom lost password URL
149
+ > * Custom register URL
150
+ > * Custom activate URL
151
+ > * Custom logout URL
152
+ > * Custom wp-includes path
153
+ > * Custom wp-content path
154
+ > * Custom wp-json API path
155
+ > * Custom plugins name
156
+ > * Custom themes name
157
+ > * Custom themes style name
158
+ > * Custom plugins path
159
+ > * Custom uploads path
160
+ > * Custom authors path
161
+ > * Custom comment URL
162
+ > * Custom category path
163
+ > * Custom tags path
164
+ >
165
+ > **Hidden Paths: **
166
+ >
167
+ > * Hide plugins name
168
+ > * Hide themes name
169
+ > * Hide style IDs and META IDs
170
+ > * Hide author by ID URL
171
+ > * Hide WordPress common paths like: wp-content, wp-includes, /plugins, /themes,upgrade.php
172
+ > * Hide WordPress common files like: upgrade.php, install.php, activate.php, wp-config.php, etc.
173
+ > * Hide RSD (Really Simple Directory) header
174
+ > * Hide DNS Prefetch WordPress link
175
+ > * Hide WordPress Generator Meta
176
+ > * Add Firewall against SQL/Script injection
177
+ > * Hide wp-image and wp-post classes
178
+ > * Hide Emojicons if you don't use them
179
+ > * Change URLs in ajax calls
180
+ > * Change URLs in all caches files
181
+ >
182
+ > **Mapping Text and URLs: **
183
+ >
184
+ > * Change URLs using URL Mapping
185
+ > * Change classes using Text Mapping
186
+ > * Change text in CSS and JS files
187
+ > * Change CDN URLs using CDN Mapping
188
+ > * Change paths in the cache files
189
+ > * Change paths in the Sitemap XML
190
+ > * Change paths in the Robots.txt
191
+ >
192
+ > **Disable Paths: **
193
+ >
194
+ > * Disable XML-RPC access
195
+ > * Disable Rest API access
196
+ > * Disable Embed scripts
197
+ > * Disable DB-Debug in Frontend
198
+ > * Disable WLW Manifest scripts
199
+ > * Disable directory browsing
200
+ >
201
+ > **Brute Force Protection: **
202
+ >
203
+ > * Brute Force Protection with Math Captcha
204
+ > * Brute Force Protection with Google reCaptcha
205
+ > * Custom attempts, timeout, message
206
+ > * Manage Blacklist and Whitelist IPs
207
+ >
208
+ > **Log Activity: **
209
+ >
210
+ > * Log user activity
211
+ > * Set security alerts by email if users login from different IPs
212
+ > * Set security alerts by email on Brute Force attacks
213
+ > * Set security alerts by email if users delete articles
214
+ > * Set security alerts by email if users delete articles
215
+ > * Security Check with over 30 check points
216
+ >
217
+ > **Integrations: **
218
+ >
219
+ > * Support for WP Multisite
220
+ > * Support for Nginx
221
+ > * Support for IIS
222
+ > * Support for LiteSpeed
223
+ > * Support for Apache
224
+ > * Support for Bitnami Servers
225
+ > * Support for Inmotion Servers
226
+ >
227
+ > * Recommended by Wp Rocket plugin
228
+ > https://goo.gl/VTPYWV
229
+ >
230
+ > **Protection against: **
231
+ >
232
+ > * Brute Force Attacks,
233
+ > * SQL Injection Attacks
234
+ > * Script Injection Attacks
235
+ > * Cross Site Scripting (XSS)
236
+ > * and more
237
+ >
238
+ > See all the **Ghost features**:
239
+ > <a href="https://hidemywpghost.com/wordpress">https://hidemywpghost.com/wordpress</a>
240
+ >
241
+ > Hide My WP Ghost **Knowledge Base**:
242
+ > <a href="https://hidemywpghost.com/knowledge-base/">https://hidemywpghost.com</a>
243
+ >
244
+ > Check the Demo Website:
245
+ > <a href="https://demo.wpplugins.tips/">https://demo.wpplugins.tips/</a>
246
+ >
247
+ > Other websites:
248
+ > <a href="https://hidemywp.app">https://hidemywp.app</a>
249
+
250
+
251
+ Once you use the Hide My WP Ghost plugin you will get custom upload paths, author paths, plugin paths and so on.
252
+
253
+ You will also have the ability to remove unwanted classes, hide content, disable scripts and so on.
254
+
255
+ Hide My WP Ghost does an exceptional job at helping you get support for WP Multisite, for Bitnami Servers, Apache, LiteSpeed, Nginx, IIS, WP Rocket Plugin and many others.
256
+
257
+ It is worth it, so you may want to check it out.
258
+
259
+
260
+ Also, just because you want to add a WordPress Security plugin that hides the common paths, doesn't mean the plugin has to be slow.
261
+
262
+ Hide my WP Ghost is very fast, and it won't impact your website in any negative way.
263
+
264
+ On the contrary, it will hide the common paths, deliver all the WordPress Security features above and much more while also keeping the site faster at all times!
265
+
266
+ <strong>Important!</strong> This is not the Hide My WP Nulled version of the Hide My Wp Codecanyon plugin.
267
+
268
+ <strong>Ready To Protect Your Website From Hackers With The Most USER-FRIENDLY WordPress Security Plugin?</strong>
269
+
270
+ == Installation ==
271
+ Manually install the Hide My WP Ghost Lite plugin:
272
+ Step 1. Log In as an Administrator on your WordPress site.
273
+ Step 2. In the menu displayed on the left, there is a “Plugins” tab. Click it.
274
+ Step 3. Now click “Add New”.
275
+ Step 4. There, you have the “Upload” button. Click the "Upload" button
276
+ Step 5. Upload the hide-my-wp.zip file.
277
+ Step 6. After the upload it’s finished, click Activate Plugin.
278
+ Step 7. Connect the plugin using your email to get a free access token
279
+ Step 8. Follow the setup guide from: https://hidemywpghost.com/article/how-to-install-hide-my-wp-ghost-lite/
280
+ Enjoy!
281
+
282
+ Install Hide My WP Ghost Lite directly from WordPress directory:
283
+ Step 1. Log In as an Administrator on your WordPress site.
284
+ Step 2. In the menu displayed on the left, there is a “Plugins” tab. Click it.
285
+ Step 3. Search for "Hide My WP".
286
+ Step 4. After the plugin is shown, click Activate Hide My WP Ghost
287
+ Step 5. Connect the plugin using your email to get a free access token
288
+ Step 6. Follow the setup guide from: https://hidemywpghost.com/article/how-to-install-hide-my-wp-ghost-lite/
289
+ Enjoy!
290
+
291
+ [youtube https://youtu.be/zhvRGHMjKic]
292
+
293
+ > Hide My WP Ghost **Knowledge Base**:
294
+ > <a href="https://hidemywpghost.com/knowledge-base/">https://hidemywpghost.com</a>
295
+
296
+
297
+ == Screenshots ==
298
+ 1. Choose the desired level of Security for your site
299
+ 2. Change the URLs wp-admin and wp-login.php to different URLs. This is a very important WordPress Security step.
300
+ 3. Choose to hide the wp-admin and wp-login.php to increase the WordPress Security and hackers will get 404 errors
301
+ 4. Login to your site with the new Hide My WP login URL
302
+ 5. You'll be redirected to the new Hide My WP admin URL
303
+ 6. Activate the Brute Force Protection with Math reCaptcha
304
+ 7. Add custom paths for wp-content, wp-includes, plugins, themes and more
305
+ 8. Run a security check for your website and see all the vulnerabilities
306
+
307
+ == Changelog ==
308
+ = 4.0.10 (31 Aug 2020 ) =
309
+ * Fixed some errors cause by the last version
310
+
311
+ = 4.0.09 (27 Aug 2020 ) =
312
+ * Update - Added the version hook to remove the versions from CSS and JS
313
+ * Update - Load the login on WPEngine server with PHP7.4 when the login is set as /login
314
+ * Update - Detect Flywheel server and add the rules accordingly
315
+ * Update - Compatibility with IThemes Security on custom login
316
+
317
+ = 4.0.08 (13 Aug 2020 ) =
318
+ * Update - WordPress Security Updates for WP 5.5
319
+ * Update - Compatibility with WPML
320
+ * Update - Compatibility with the last versions of the popular plugins
321
+
322
+ = 4.0.07 (06 Aug 2020 ) =
323
+ * Update - Added the option to hide /login and /wp-login individually
324
+ * Update - Added the option to redirect to a custom URL on logout
325
+ * Small Bugs Fix
326
+
327
+ = 4.0.06 (09 July 2020 ) =
328
+ * Update - Compatibility with WPEngine + PHP 7
329
+ * Update - Compatibility with Absolutely Glamorous Custom Admin plugin
330
+ * Update - Compatibility with Admin Menu Editor Pro plugin
331
+ * Fix - Small CSS & Warning issues
332
+
333
+ = 4.0.05 (30 June 2020 ) =
334
+ * Update - Compatibility with WPEngine with PHP 7.4
335
+ * Update - Compatibility with the cache plugins (tested the latest versions)
336
+ * Update - The Security Check report task
337
+ * Update - Plugin security on Security Check
338
+ * Update - The plugins list in Hide My WP
339
+ * Fixed - Removed the map URL from bootstrap css and js
340
+ * Fixed - CSS in Hide My WP Settings
341
+
342
+ = 4.0.04 (16 June 2020 ) =
343
+ * Update - Added HMW_RULES_IN_CONFIG and HMW_RULES_IN_WP_RULES to control the rules in the config file
344
+ * HMW_RULES_IN_CONFIG will add the rules in the top of the config file (default true)
345
+ * HMW_RULES_IN_WP_RULES will add the ruls in the WordPress config area (default true)
346
+ * Update - Change the rewrite hook to make sure the rules are added in the WordPress rewrites before flushing them
347
+ * Update - Compatibility with IThemes Security plugin
348
+
349
+
350
+ = 4.0.03 (04 June 2020) =
351
+ * Update - RTL Support
352
+ * Update - Brute Force Protection Filter
353
+ * Update - Compatibility with more cache plugins like Hummingbird and Cachify
354
+ * Update - Alert when the rewrites are not added correctly in the config file
355
+ * Update - WordPress Security Updates for WP 5.4.1
356
+ * Fixed - Small CSS fixes
357
+
358
+ = 4.0.02 (04 May 2020) =
359
+ * Fix - login redirect for nginx server
360
+ * Fix - constant warning NONCE_KEY in confi.php
361
+ * Update - Compatibility with WordFence
362
+
363
+ = 4.0.01 (29 April 2020) =
364
+ * Update - Show the Hide My WP menu only on Network if WP Multisite
365
+ * Update - Prevent from loading the style from wp-admin in the custom login page
366
+ * Update - WPEngine 2020 rewrites compatibility
367
+ * Update - Added option to hide only the IDs and Classes in Hide My WP > Text Mapping
368
+ * Update - Added the option to remove the WordPress common paths in /robots.txt file
369
+ * Update - Added the option to remove the WordPress common paths in /sitemap.xml
370
+ * Update - Compatibility with the most populat plugins and WordPress 5.4.1
371
+ * Fix - Show 404 files in case the rewrites are not working or Allowoverride is OFF
372
+ * Fix - Detect correct https or http sheme for Login Preview and validation
373
+ * Fix - Save the Hide My WP rewrites when other plugin are updating the config file to prevent rewrite errors
374
+
375
+ = 3.5.03 (12 March 2020) =
376
+ * Update - WordPress Security Updates for WP 5.4
377
+ * Update - Compatibility with Asset CleanUp PRO: Page Speed Booster
378
+
379
+ = 3.5.02 (20 Feb 2020) =
380
+ * Update - Compatibility with more plugins
381
+ * Update - Compatibility with Asset CleanUp: Page Speed Booster
382
+
383
+ = 3.5.01 (20 Ian 2020) =
384
+ * Update - Remove the toolbar Security Check text - The test is made every when Dashboard
385
+ * Update - Settings style update
386
+ * Update - Compatibility with more plugins for Webp compression
387
+
388
+ = 3.5.00 (02 Dec 2019) =
389
+ * Happy New Year! We are happy to present you many new great features.
390
+ * Update - Compatibility with Flatsome theme
391
+ * Update - Compatibility with WP Maintenance Mode plugin
392
+ * Update - WordPress Security Updates for WP 5.3.2
393
+ * Update - Checked and Updated compatibility with other plugins
394
+ * Update - Added the Mapping feature in the menu
395
+ * Update - Added Hide RSD (Really Simple Directory) header
396
+ * Update - Hide Emojicons
397
+ * Update - Disable authentification for XML-RPC
398
+ * Update - Disable Embed Script WP library
399
+ * Update - Disable WLW Manifest scripts
400
+ * Update - Disable DB Debug in Frontend
401
+
402
+ = 3.4.03 (12 Dec 2019) =
403
+ * Update - WordPress Security Updates for WP 5.3.1
404
+ * Fix - Login redirect issue for themes line Classipress, Maxplore
405
+ * Fix - Restore backup popup visibility
406
+
407
+ = 3.4.02 (06 Nov 2019) =
408
+ * Update - WordPress Security Updates for WP 5.2.4
409
+ * Update - Checked and Updated compatibility with other plugins
410
+ * Fix - Fixed the IIS rewrites for login page and ajax
411
+
412
+ = 3.4.01 (15 Oct 2019) =
413
+ * Fix - Update the extension list of files while in Safe Mode
414
+ * Fix - Fix the Brute Force login with Woocommerce paths
415
+ * Updated compatibility with the lastest version of the other plugins
416
+
417
+ = 3.4.00 (24 Sept 2019) =
418
+ * Update - Skip activation option
419
+ * Update - Add monitor option for registered websites
420
+ * Updated compatibility with more hosting servers
421
+ * Updated compatibility with more cache plugins
422
+ * Updated/Fixed compatibility with other security plugins
423
+
424
+ = 3.3.10 (09 Sept 2019) =
425
+ * Update - WordPress Security Updates for WP 5.2.3
426
+ * Update - Working with custom wordpress cookie names
427
+ * Update - Checked and Updated compatibility with other plugins
428
+ * Fix - Add the hmwp cookie in the config to work with custom cookies on hidden paths
429
+
430
+ = 3.3.05 (16 Aug 2019) =
431
+ * Update - Remove Power By header from cache plugins
432
+ * Update - Compatibility with more themes and plugins
433
+ * Update - Update the notification bar
434
+ * Fixed - Hide My WP Menu for WP Mutlisite when it's configured from network
435
+
436
+ = 3.3.04 (07 Aug 2019) =
437
+ * Update - Change active plugins order to change admin_url and login_url before other plugins use it
438
+ * Update - Fix initial settings for Safe and Ghost modes
439
+ * Update - Compatibility with Google Cloud Hosting
440
+
441
+ = 3.3.03 (31 July 2019) =
442
+ * Update - compatibility style with Autoptimizer
443
+ * Update - compatibility with Godaddy Hosting
444
+ * Update - Added support for webp files
445
+ * Fixed - wp-admin issue on Godaddy hostin plan
446
+ * Fixed - cache issue with Autoptimizer plugin
447
+
448
+ = 3.3.02 (05 July 2019) =
449
+ * Update - added new paths into the restricted list to avoid rewrite errors
450
+ * Update - compatibility style with Wordfence
451
+ * Update - compatibility style with IP2Location Country Blocker
452
+ * Update - compatibility style with Autoptimizer
453
+ * Update - compatibility style with Squirrly SEO
454
+ * Update - compatibility style with Yoast SEO
455
+ * Update - add login URL check in Security Checking tool
456
+ * Update - add admin URL check in Security Checking tool
457
+
458
+ = 3.3.01 (15 Jun 2019) =
459
+ * Update - Added the define('HMW_RULES_IN_WP_RULES', false); if you want to remove HMW Rules from WordPress rewrit definition in htaccess
460
+ * Don't show HMW update when new plugins and themes are added if the themes names and plugins names are not changed
461
+ * Show 100% security status if all the security tasks are completed
462
+ * Don't show the speedometer if the security check didn't run yet
463
+
464
+ = 3.3.00 (14 Jun 2019) =
465
+ * Update - Added the option to change all the plugins name
466
+ * Update - Added the option to change all the themes name
467
+ * Update - Added Dashboard Security Widget
468
+ * Update - Show the security level and the list of tasks to fix the security issues
469
+ * Update - Added the option to check the security after the settings are saved
470
+ * Update - Added help link for each plugin section
471
+ * Update - Prevent other plugins to load the style in Hide My Wp
472
+
473
+ = 3.2.02 (06 Jun 2019) =
474
+ * Update - Empty the wordpress_logged_address cookie on user logout
475
+
476
+ = 3.2.01 (24 May 2019) =
477
+ * Update - WordPress Security Updates for WP 5.2.1
478
+ * Fixed small bugs
479
+
480
+ = 3.2.00 (10 May 2019) =
481
+ * Update - Updated Hide My WP Advanced options
482
+ * Update - Added Fix XML files in Advanced Options
483
+ * Update - Compatible with Gutenberg
484
+ * Update - Compatible with All In One WP Security & Firewall
485
+ * Update - Compatible with iThemes Security
486
+ * Update - Compatible with Sucuri Security
487
+ * Update - Compatible with Wordfence Security
488
+ * Update - Compatible with BulletProof Security
489
+ * Update - Compatible with BruteProtect
490
+ * Update - Compatible with Beaver Builder
491
+ * Update - Compatible with Elementor Editor
492
+ * Update - Compatible with Thrive Architect
493
+ * Update - Compatible with Woocommerce
494
+ * Update - Compatible with Yoast SEO
495
+ * Update - Compatible with Squirrly SEO
496
+ * Fix - Don't load the buffer for files
497
+ * Fix - Relative to Absolute URL fix in CSS style
498
+
499
+ = 3.1.01 (03 May 2019) =
500
+ * Update - Added the option to change the paths in ajax calls in Hide My WP > Permalinks
501
+ * Update - WordPress Security Updates for WP 5.2
502
+ * Fix - Remove comments from source code without affecting the IE and CDATA
503
+
504
+ = 3.1.00 (24 Apr 2019) =
505
+ * Fix - Rewrite paths in ajax when custom wp-content set
506
+ * Fix - htaccess rules fix when use set custom wp-content outside Hide My WP
507
+
508
+ = 3.0.08 (08 Apr 2019) =
509
+ * Update - Hide the custom wp-content set with WP_CONTENT_DIR constant in wp-config.php
510
+ * Update - Hide the custom uploads directory set with UPLOADS constant in wp-config.php
511
+ * Update - Set Stict Login for the custom login path by default to prevent unusual redirects
512
+ * Fix - Hide the old admin ajax after customization
513
+
514
+ = 3.0.07 (28 Mar 2019) =
515
+ * Update - WordPress Security Updates for WP 5.1.1
516
+ * Update - Checked/Updated compatibility check with more plugins and themes
517
+
518
+ = 3.0.06 (23 Feb 2019) =
519
+ * Update - WordPress Security Updates for WP 5.1
520
+ * Fix - Config file for Nginx servers
521
+
522
+ = 3.0.05 (07 Feb 2019) =
523
+ * Update - Security Updates
524
+ * Update - Compatibility check with other plugins and themes
525
+ * Fix - Compatibility with Wp-Rocket last version
526
+ * Fix - Compatibility with Avada Theme last version
527
+
528
+ = 3.0.04 (18 Jan 2019) =
529
+ * Update - Security updates for 2019 Jan
530
+ * Fix - Remove the wp-image from Mapping feature to prevent breaking the banner for some WP Themes
531
+ * Fix - Update rewrite rules when settings are saved
532
+
533
+ = 3.0.03 (12 Jan 2019) =
534
+ * Fix - Hide My WP Hidden Notifications
535
+
536
+ = 3.0.02 (10 Jan 2019) =
537
+ * Update - WordPress Security Updates for WP 5.0.3
538
+ * Fix - Prevent adding cache options when a cache plugin is already installed
539
+
540
+ = 3.0.01 (29 Dec 2018) =
541
+ * Update - WordPress Security Updates for WP 5.0.2
542
+ * Fix - Loading the theme style for Nginx serves when the rules can't be set
543
+ * Fix - Compatibility with the last version of WP-Rocket
544
+ * Fix - Compatibility with Avada theme
545
+ * Fix - When defining the UPLOADS constant in wp-config.php
546
+
547
+ = 3.0.00 (08 Dec 2018) =
548
+ * Update - WordPress Security Updates for WP 5.0
549
+ * Update - Hide My WP is compatible with WordPress 5.0
550
+
551
+ = 2.0.16 (04 Dec 2018) =
552
+ * Fix - Warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'return false;'
553
+ * Fix - Woocommerce frontpage login
554
+ * Fix - Multiple subfolders install issue
555
+ * Fix - Replacing the paths in javascript and styles
556
+ * Fix - Optimizing the rewrite rules when going in safe mode
557
+
558
+ = 2.0.15 (25 Nov 2018) =
559
+ * Update - Added FORCEPATH option to rename the images paths in post editor and builders
560
+ * Fix - Font loading problem while in safe mode rewrite
561
+ * Fix - Prevent removing the Woocommerce rules on setting save proccess
562
+ * Fix - Broken URLs when the paths are similar and can create confusion
563
+ * Fix - Prevent adding short paths and braking the website frontend
564
+
565
+ = 2.0.14 (12 Nov 2018) =
566
+ * Update - Compatible with the last version of WP-Rocket
567
+ * Update - Tested and Fixed compatibility with WP Engine hosting server
568
+ * Update - Compatible with Woodmart theme
569
+
570
+ = 2.0.12 (10 Nov 2018) =
571
+ * Update - Reload the Nginx config on settings save if possible
572
+ * Update - Compatible with more themes and plugins
573
+ * Fix - small bugs
574
+
575
+ = 2.0.11 (02 Nov 2018) =
576
+ * Update - Rewrite option for Nginx, Apache and IIS without config
577
+ * Update - Added the Safe Mode option on rewrite errors
578
+ * Update - Text Mapping to change texts in source code
579
+ * Update - Security updates for WP 5
580
+
581
+ = 2.0.10 (30 Oct 2018) =
582
+ * Update - Compatible with Gutenberg 4
583
+ * Fix - jQuery Deferrer on WP-Rocket
584
+ * Fix - Email signup validation
585
+
586
+ = 2.0.09 (20 Oct 2018) =
587
+ * Fix - Corrected the Tools loading
588
+ * Fix - Add decoded trail slash on plugin rewrites
589
+
590
+ = 2.0.08 (15 Oct 2018) =
591
+ * Fix - Compatibility with WP Fastest Cache
592
+ * Fix - Add decoded trail slash on plugin rewrites
593
+
594
+ = 2.0.07 (9 Oct 2018) =
595
+ * Fix - Memory check error when the memory is over 1G
596
+ * Fix - Htaccess error when the plugin has spaces in the name
597
+
598
+ = 2.0.06 (1 Oct 2018) =
599
+ * Update - Compatibility with top WordPress cache plugins
600
+ * Update - Compatibility with top WordPress themes
601
+ * Update - Compatibility with other WordPress security plugins
602
+ * Fix - Minor bugs
603
+
604
+ = 2.0.05 (25 Sept 2018) =
605
+ * Fix - Memory limit error wne the memory is under 64MB
606
+ * Fix - Setting other paths when the admin or login paths are already set by other plugins or theme
607
+ * Update - Security Check table
608
+ * Update - Compatibility check with top WordPress plugins
609
+
610
+ = 2.0.04 (21 Sept 2018) =
611
+ * Update - Compatible with Gutenberg 3.8
612
+ * Update - Compatible with WP Super Cache 1.6
613
+ * Update - Compatible with All In One WP Security & Firewall 4.3
614
+ * Update - Compatible with iThemes Security 7.1
615
+ * Update - Compatible with Beaver Builder 2.1
616
+ * Update - Compatible with Elementor Editor 2.2
617
+ * Update - Compatible with Thrive Architect 2
618
+ * Update - Compatible with Woocommerce 3.4
619
+ * Fix - Compatibility with WP-Rocket
620
+ * Fix - Compatibility with Autoptimize
621
+ * Fix - Rewrite paths when moving from Lite mode to Default in Apache, Nginx and IIS
622
+ * Fix - Restore settings didn't save the config rewrites
623
+
624
+ = 2.0.03 (15 Sept 2018) =
625
+ * Update - Compatibility with WP Super Cache CDN
626
+ * Update - Checked and fixed the compatibility with Woocommerce
627
+ * Update - Cookie Test for WP Multisite
628
+ * Update - Security updates for SQL Injection and Script Injection
629
+
630
+
631
+ = 2.0.02 (03 Sept 2018) =
632
+ * Update - Made Security Check Notification optional
633
+ * Fixed - Don't change the paths on update from version 1 to 2
634
+ * Fixed - remove wp-config.php admin cookie line if it remains from other plugins
635
+
636
+ = 2.0.01 (10 Aug 2018) =
637
+ * Update - New Settings design
638
+ * Update - Works with WP Multisite
639
+ * Update - Works with Apache, Nginx, IIS, and Litespeed
640
+ * Update - Firewall Against Script Injection
641
+ * Update - Customize the Hide My Wp safe link
642
+ * Update - Security Check and options to fix the issues
643
+ * Update - Install and Activate recommended plugins
644
+
645
+ Security
646
+ Ocultar Mi WP - Plugin de seguridad de WordPress
647
+ Ocultar meu WP - Segurança do WordPress
648
+ Cacher mon WordPress - Plugin de sécurité WordPress
649
+ Verstecken Sie mein WordPress - WordPress Sicherheits-Plugin
650
+ Hide My WP - WordPress Security Plugin
651
+ Security Plugin
652
+ Hide my wp free download
653
+ Hide my wp login url
654
+
655
+ == Frequently Asked Questions ==
656
+ = Does this plugin work on WP Multisite? =
657
+
658
+ Yes, the plugin works on WP Multisite and you will configure it for the entire network.
659
+
660
+ The plugin also works with Apache, Nginx, IIS and LiteSpeed servers
661
+
662
+ = Is Hide My WP Ghost working on Nginx Server? =
663
+
664
+ Yes, the plugin works on Nginx Server and you will be guided for the redirects and nginx.conf settings.
665
+
666
+ The plugin also works with Apache, IIS and LiteSpeed servers
667
+
668
+ = My website theme is not loading correctly after I change the paths. What should I do? =
669
+
670
+ This issue is most likely from setting the rewrite rules.
671
+
672
+ 1. Make sure you purge the cache if you have cache plugins after you save the Hide My WP Ghost settings.
673
+ 2. In case the .htaccess (for apache) or nginx.conf (for Nginx) or web.config (for IIS) are not writable you need to add the rewrites manually.
674
+ 3. If you have Nginx server make sure you reload the Nginx after you save the settings.
675
+ 4. If the theme is still not loading okay, contact us and we can set up the plugin for you for free.
676
+
677
+ You can find useful information here: https://hidemywpghost.com/knowledge-base/
678
+
679
+ = I forgot the custom login and admin URLs. What now? =
680
+
681
+ Don't panic.
682
+
683
+ You can still access your site with the secure parameter
684
+ http://domainname/wp-login.php?hmw_disable=[your_code]
685
+
686
+ = Locked out of my site! I set the plugin, and after I logged out I couldn't get back in =
687
+
688
+ Rename the plugin directory /wp-content/plugins/hide-my-wp so that the plugins won't hide the wp-login.php path anymore
689
+
690
+ Login using http://domainname/wp-login.php and activate the plugin again.
691
+
692
+ Make sure you remember the secure parameter and it will be much easier.
693
+
694
+ = Does Hide My WP Ghost work for WordPress.com website? =
695
+
696
+ Because of the Jetpack security in WordPress.com website, Hide My WP Ghost can't change the admin and login paths.
697
+
698
+ If you already activated Hide My Wp on WordPress.com, remove the directory /wp-content/plugins/hide-my-wp to disable the plugin.
699
+
700
+ = Will this plugin work if I don't have custom permalinks on my site? =
701
+
702
+ No. You need to have custom permalinks set to 'on' in Settings > Permalinks.
703
+
704
+ You will get a notification in the Settings page if something is not setup right.
705
+
706
+
707
+ = What do I need to do before I deactivate the plugin? =
708
+
709
+ It's better to switch to Default Mode in Settings > Hide My WP.
710
+
711
+ If you don't, the plugin will automatically change your site back to the safe URLs and it will tell you what to do if you don't have write permission for the config files
712
+
713
+ _______________________________________________________________________
714
+
715
+ = Is this Plugin free of charge? =
716
+
717
+ Yes. The Lite features of Hide My WP Ghost plugin will always be free.
718
+
719
+ We will include all the required WordPress Security updates.
720
+
721
+ To unlock all the features, please visit: <a href="https://wpplugins.tips/wordpress">https://wpplugins.tips/wordpress</a>
722
+
723
+ = How to set the plugin on Nginx server? =
724
+
725
+ Please follow this tutorial step by step to set up the Hide My WP Ghost for Nginx server:
726
+
727
+ <a href="https://hidemywpghost.com/how-to-setup-hide-my-wp-on-nginx-server/" target="_blank">Setup Hide My WP Ghost on Nginx Server</a>
728
+ <a href="https://hidemywpghost.com/how-to-configure-hide-my-wp-on-nginx-web-server-with-virtual-private-server/" target="_blank">Configure Hide My Wp Ghost On Nginx Web Server With Virtual Private Server</a>
729
+
730
+ = How to Hide Your Site From WordPress Theme Detectors? =
731
+
732
+ Changing the common WordPress paths will not guarantee that the WordPress CMS is completely hidden.
733
+
734
+ The old paths are still accessible and hackers are still able to inject SQL and Javascript into vulnerable installed plugins and themes.
735
+
736
+ Read more: <a href="https://hidemywpghost.com/how-to-hide-from-wordpress-theme-detectors/" target="_blank">How to Hide Your Site From WordPress Theme Detectors</a>
737
+
738
+ = Is this plugin enough to protect my website from all hackers? =
739
+
740
+ The Free version of Hide My WP Ghost hides the wp-admin and wp-login as described but will not protect you from all hacker attacks.
741
+
742
+
743
+ Hide My WP Ghost hides all the common paths and patterns used but bots to detect that you are using WordPress.
744
+
745
+ We also recommend you to install Premium Themes and Plugins and not just any WordPress plugin because the free plugins are usually made by beginners and they don't have security knowledge.
uninstall.php ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Called on plugin uninstall
5
+ */
6
+ if (!defined('ABSPATH') && !defined('WP_UNINSTALL_PLUGIN')) {
7
+ exit();
8
+ }
9
+
10
+ /* Call config files */
11
+ require(dirname(__FILE__) . '/config/config.php');
12
+
13
+ /* Delete the record from database */
14
+ delete_option(HMW_OPTION);
15
+ delete_option(HMW_OPTION_SAFE);
view/Advanced.php ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if (HMW_Classes_Tools::isPermalinkStructure()) { ?>
2
+ <div id="hmw_wrap" class="d-flex flex-row my-3 bg-light">
3
+ <?php echo $view->getAdminTabs(HMW_Classes_Tools::getValue('tab', 'hmw_permalinks')); ?>
4
+ <div class="hmw_row d-flex flex-row bg-white px-3">
5
+ <div class="hmw_col flex-grow-1 mr-3">
6
+ <form method="POST">
7
+ <?php wp_nonce_field('hmw_advsettings', 'hmw_nonce') ?>
8
+ <input type="hidden" name="action" value="hmw_advsettings"/>
9
+
10
+ <div class="card p-0 col-sm-12 tab-panel">
11
+ <h3 class="card-title bg-brown text-white p-2"><?php _e('Redirect Settings', _HMW_PLUGIN_NAME_); ?>:</h3>
12
+ <div class="card-body">
13
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-0 my-3">
14
+ <div class="col-sm-4 p-1">
15
+ <div class="font-weight-bold"><?php _e('Redirect hidden paths', _HMW_PLUGIN_NAME_); ?>:</div>
16
+ </div>
17
+ <div class="col-sm-8 p-0 input-group">
18
+ <select name="hmw_url_redirect" class="form-control bg-input mb-1">
19
+ <option value="." <?php selected('.', HMW_Classes_Tools::getOption('hmw_url_redirect'), true) ?>><?php _e("Front page", _HMW_PLUGIN_NAME_) ?></option>
20
+ <option value="404" <?php selected('404', HMW_Classes_Tools::getOption('hmw_url_redirect'), true) ?> ><?php _e("404 page", _HMW_PLUGIN_NAME_) ?></option>
21
+ <?php
22
+ $pages = get_pages();
23
+ foreach ($pages as $page) {
24
+ $option = '<option value="' . $page->post_name . '" ' . selected($page->post_name, HMW_Classes_Tools::getOption('hmw_url_redirect'), true) . '>';
25
+ $option .= $page->post_title;
26
+ $option .= '</option>';
27
+ echo $option;
28
+ } ?>
29
+ </select>
30
+ </div>
31
+ <div class="p-1">
32
+ <div class="text-black-50"><?php echo __('Redirect the protected paths /wp-admin, /wp-login to Front Page or 404 page.', _HMW_PLUGIN_NAME_); ?></div>
33
+ <div class="text-black-50"><?php echo __('You can create a new page and come back to choose to redirect to that page', _HMW_PLUGIN_NAME_); ?></div>
34
+ </div>
35
+ </div>
36
+
37
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-0 my-3">
38
+ <div class="col-sm-4 p-0 font-weight-bold">
39
+ <?php _e('Custom Safe URL Param', _HMW_PLUGIN_NAME_); ?>:
40
+ <div class="small text-black-50"><?php _e("eg. disable_url, safe_url", _HMW_PLUGIN_NAME_); ?></div>
41
+ </div>
42
+ <div class="col-sm-8 p-0 input-group">
43
+ <input type="text" class="form-control bg-input" name="hmw_disable_name" value="<?php echo HMW_Classes_Tools::getOption('hmw_disable_name') ?>" placeholder="<?php echo HMW_Classes_Tools::getOption('hmw_disable_name') ?>"/>
44
+ </div>
45
+ <div class="col-sm-12 pt-4">
46
+ <div class="small text-black-50 text-center"><?php _e("The Safe URL will set all the settings to default. Use it only if you're locked out", _HMW_PLUGIN_NAME_); ?></div>
47
+ <div class="text-danger text-center"><?php echo '<strong>' . __("Safe URL:", _HMW_PLUGIN_NAME_) . '</strong>' . ' ' . site_url() . "/wp-login.php?" . HMW_Classes_Tools::getOption('hmw_disable_name') . "=" . HMW_Classes_Tools::getOption('hmw_disable') ?></div>
48
+ </div>
49
+ </div>
50
+ </div>
51
+ </div>
52
+ <div class="card p-0 col-sm-12 tab-panel">
53
+ <h3 class="card-title bg-brown text-white p-2"><?php _e('Compatibility Settings', _HMW_PLUGIN_NAME_); ?>:</h3>
54
+ <div class="card-body">
55
+
56
+ <div class="col-sm-12 row mb-1 ml-2">
57
+ <div class="checker col-sm-12 row my-2 py-1">
58
+ <div class="col-sm-12 p-0 switch switch-sm">
59
+ <input type="hidden" name="hmw_fix_relative" value="0"/>
60
+ <input type="checkbox" id="hmw_fix_relative" name="hmw_fix_relative" class="switch" <?php echo(HMW_Classes_Tools::getOption('hmw_fix_relative') ? 'checked="checked"' : '') ?> value="1"/>
61
+ <label for="hmw_fix_relative"><?php _e('Fix Relative URLs', _HMW_PLUGIN_NAME_); ?></label>
62
+ <a href="https://hidemywpghost.com/kb/advanced-wp-security/#fix_relative_urls" target="_blank" class="d-inline-block ml-2" ><i class="fa fa-question-circle"></i></a>
63
+ <div class="offset-1 text-black-50"><?php echo sprintf(__('Convert links like /wp-content/* into %s/wp-content/*.', _HMW_PLUGIN_NAME_), site_url()); ?></div>
64
+ </div>
65
+ </div>
66
+ </div>
67
+
68
+ <div class="col-sm-12 row mb-1 ml-2">
69
+ <div class="checker col-sm-12 row my-2 py-1">
70
+ <div class="col-sm-12 p-0 switch switch-sm">
71
+ <input type="hidden" name="hmw_shutdown_load" value="0"/>
72
+ <input type="checkbox" id="hmw_shutdown_load" name="hmw_shutdown_load" class="switch" <?php echo(HMW_Classes_Tools::getOption('hmw_shutdown_load') ? 'checked="checked"' : '') ?> value="1"/>
73
+ <label for="hmw_shutdown_load"><?php _e('Fix Sitemaps XML', _HMW_PLUGIN_NAME_); ?></label>
74
+ <a href="https://hidemywpghost.com/kb/advanced-wp-security/#fix_sitemap_xml" target="_blank" class="d-inline-block ml-2" ><i class="fa fa-question-circle"></i></a>
75
+ <div class="offset-1 text-black-50"><?php echo sprintf(__('Double check the Sitemap XML files and make sure the paths are changed.', _HMW_PLUGIN_NAME_), site_url()); ?></div>
76
+ </div>
77
+ </div>
78
+ </div>
79
+
80
+ <div class="col-sm-12 row mb-1 ml-2">
81
+ <div class="checker col-sm-12 row my-2 py-1">
82
+ <div class="col-sm-12 p-0 switch switch-sm">
83
+ <input type="hidden" name="hmw_robots" value="0"/>
84
+ <input type="checkbox" id="hmw_robots" name="hmw_robots" class="switch" <?php echo( HMW_Classes_Tools::getOption( 'hmw_robots' ) ? 'checked="checked"' : '' ) ?> value="1"/>
85
+ <label for="hmw_robots"><?php _e( 'Fix Robots.txt', _HMW_PLUGIN_NAME_ ); ?></label>
86
+ <a href="https://hidemywpghost.com/kb/advanced-wp-security/#fix_robots_txt" target="_blank" class="d-inline-block ml-2"><i class="fa fa-question-circle"></i></a>
87
+ <div class="offset-1 text-black-50"><?php echo __( 'Hide WordPress paths from robots.txt file', _HMW_PLUGIN_NAME_ ); ?></div>
88
+ </div>
89
+ </div>
90
+ </div>
91
+
92
+ <div class="col-sm-12 row mb-1 ml-2">
93
+ <div class="checker col-sm-12 row my-2 py-1">
94
+ <div class="col-sm-12 p-0 switch switch-sm">
95
+ <input type="hidden" name="hmw_laterload" value="0"/>
96
+ <input type="checkbox" id="hmw_laterload" name="hmw_laterload" class="switch" <?php echo(HMW_Classes_Tools::getOption('hmw_laterload') ? 'checked="checked"' : '') ?> value="1"/>
97
+ <label for="hmw_laterload"><?php _e('Late Loading', _HMW_PLUGIN_NAME_); ?></label>
98
+ <a href="https://hidemywpghost.com/kb/advanced-wp-security/#late_loading" target="_blank" class="d-inline-block ml-2" ><i class="fa fa-question-circle"></i></a>
99
+ <div class="offset-1 text-black-50"><?php echo __('Load HMW after all plugins are loaded. Useful for CDN plugins (eg. CDN Enabler).', _HMW_PLUGIN_NAME_); ?></div>
100
+ <div class="offset-1 text-black-50"><?php echo __('(only if other cache plugins request this)', _HMW_PLUGIN_NAME_); ?></div>
101
+ </div>
102
+ </div>
103
+ </div>
104
+
105
+ <div class="col-sm-12 row mb-1 ml-2">
106
+ <div class="checker col-sm-12 row my-2 py-1">
107
+ <div class="col-sm-12 p-0 switch switch-sm">
108
+ <input type="hidden" name="hmw_remove_third_hooks" value="0"/>
109
+ <input type="checkbox" id="hmw_remove_third_hooks" name="hmw_remove_third_hooks" class="switch" <?php echo(HMW_Classes_Tools::getOption('hmw_remove_third_hooks') ? 'checked="checked"' : '') ?> value="1"/>
110
+ <label for="hmw_remove_third_hooks"><?php _e('Clean Login Page', _HMW_PLUGIN_NAME_); ?></label>
111
+ <a href="https://hidemywpghost.com/kb/advanced-wp-security/#clean_login_page" target="_blank" class="d-inline-block ml-2" ><i class="fa fa-question-circle"></i></a>
112
+ <div class="offset-1 text-black-50"><?php _e('Cancel the login hooks from other plugins and themes to prevent them from changing the Hide My WordPress redirects.', _HMW_PLUGIN_NAME_); ?><?php _e('(not recommended)', _HMW_PLUGIN_NAME_); ?></div>
113
+ </div>
114
+ </div>
115
+ </div>
116
+
117
+
118
+ </div>
119
+ </div>
120
+ <div class="card p-0 col-sm-12 tab-panel">
121
+ <h3 class="card-title bg-brown text-white p-2"><?php _e('Cache Settings', _HMW_PLUGIN_NAME_); ?>:</h3>
122
+ <div class="card-body">
123
+
124
+ <div class="col-sm-12 row mb-1 ml-1">
125
+ <div class="checker col-sm-12 row my-2 py-1">
126
+ <div class="col-sm-12 p-0 switch switch-sm">
127
+ <input type="hidden" name="hmw_security_alert" value="0"/>
128
+ <input type="checkbox" id="hmw_security_alert" name="hmw_security_alert" class="switch" <?php echo(HMW_Classes_Tools::getOption('hmw_security_alert') ? 'checked="checked"' : '') ?> value="1"/>
129
+ <label for="hmw_security_alert"><?php _e('Security Check Notification', _HMW_PLUGIN_NAME_); ?></label>
130
+ <a href="https://hidemywpghost.com/kb/advanced-wp-security/#email_notification" target="_blank" class="d-inline-block ml-2" ><i class="fa fa-question-circle"></i></a>
131
+ <div class="offset-1 text-black-50"><?php echo __("Show Security Check notification when it's not checked every week.", _HMW_PLUGIN_NAME_); ?></div>
132
+ </div>
133
+ </div>
134
+ </div>
135
+
136
+ <?php if (!HMW_Classes_Tools::isPluginActive('wp-rocket/wp-rocket.php') &&
137
+ !HMW_Classes_Tools::isPluginActive('wp-super-cache/wp-cache.php') &&
138
+ !HMW_Classes_Tools::isPluginActive('wp-fastest-cache/wpFastestCache.php') &&
139
+ !HMW_Classes_Tools::isPluginActive('powered-cache/powered-cache.php') &&
140
+ !HMW_Classes_Tools::isPluginActive('w3-total-cache/w3-total-cache.php') &&
141
+ !HMW_Classes_Tools::isPluginActive('autoptimize/autoptimize.php')) { ?>
142
+ <div class="col-sm-12 row mb-1 ml-1">
143
+ <div class="checker col-sm-12 row my-2 py-1">
144
+ <div class="col-sm-12 p-0 switch switch-sm">
145
+ <input type="hidden" name="hmw_file_cache" value="0"/>
146
+ <input type="checkbox" id="hmw_file_cache" name="hmw_file_cache" class="switch" <?php echo(HMW_Classes_Tools::getOption('hmw_file_cache') ? 'checked="checked"' : '') ?> value="1"/>
147
+ <label for="hmw_file_cache"><?php _e('Optimize CSS and JS files', _HMW_PLUGIN_NAME_); ?></label>
148
+ <div class="offset-1 text-black-50"><?php echo __('Cache CSS, JS and Images to increase the frontend loading speed.', _HMW_PLUGIN_NAME_); ?></div>
149
+ <div class="offset-1 text-black-50"><?php echo sprintf(__('Check the website loading speed with %sPingdom Tool%s', _HMW_PLUGIN_NAME_), '<a href="https://tools.pingdom.com/" target="_blank">', '</a>'); ?></div>
150
+ </div>
151
+ </div>
152
+ </div>
153
+ <?php } ?>
154
+ </div>
155
+ </div>
156
+ <div class="card p-0 col-sm-12 tab-panel">
157
+ <h3 class="card-title bg-brown text-white p-2"><?php _e('Notification Settings', _HMW_PLUGIN_NAME_); ?>:</h3>
158
+ <div class="card-body">
159
+
160
+ <div class="col-sm-12 row mb-1 ml-2">
161
+ <div class="checker col-sm-12 row my-2 py-1">
162
+ <div class="col-sm-12 p-0 switch switch-sm">
163
+ <input type="hidden" name="hmw_send_email" value="0"/>
164
+ <input type="checkbox" id="hmw_send_email" name="hmw_send_email" class="switch" <?php echo(HMW_Classes_Tools::getOption('hmw_send_email') ? 'checked="checked"' : '') ?> value="1"/>
165
+ <label for="hmw_send_email"><?php _e('Email notification', _HMW_PLUGIN_NAME_); ?></label>
166
+ <div class="offset-1 text-black-50"><?php _e('Send me an email with the changed admin and login URLs', _HMW_PLUGIN_NAME_); ?></div>
167
+ </div>
168
+ </div>
169
+
170
+
171
+ </div>
172
+
173
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-0 my-3">
174
+ <div class="col-sm-4 p-1 font-weight-bold">
175
+ <?php _e('Email Address', _HMW_PLUGIN_NAME_); ?>:
176
+ </div>
177
+ <div class="col-sm-8 p-0 input-group input-group">
178
+ <?php
179
+ $email = HMW_Classes_Tools::getOption('hmw_email_address');
180
+ if ($email == '') {
181
+ global $current_user;
182
+ $email = $current_user->user_email;
183
+ }
184
+ ?>
185
+ <input type="text" class="form-control bg-input" name="hmw_email_address" value="<?php echo $email ?>" placeholder="Email address ..."/>
186
+ </div>
187
+ </div>
188
+ </div>
189
+ </div>
190
+ <div class="col-sm-12 m-0 p-2 bg-light text-center" style="position: fixed; bottom: 0; right: 0; z-index: 100; box-shadow: 0px 0px 8px -3px #444;">
191
+ <button type="submit" class="btn rounded-0 btn-success btn-lg px-5 mr-5 save"><?php _e('Save', _HMW_PLUGIN_NAME_); ?></button>
192
+ <a href="https://wordpress.org/support/plugin/hide-my-wp/reviews/?rate=5#new-post" target="_blank" style="color: #ff005e;"><?php echo sprintf( __( 'Love Hide My WP %s? Show us ;)', _HMW_PLUGIN_NAME_ ), _HMW_VER_NAME_ ); ?></a>
193
+ </div>
194
+ </form>
195
+ </div>
196
+ <div class="hmw_col hmw_col_side">
197
+ <div class="card col-sm-12 p-0">
198
+ <div class="card-body f-gray-dark text-center">
199
+ <h3 class="card-title"><?php echo __('Love Hide My WP?', _HMW_PLUGIN_NAME_); ?></h3>
200
+ <div class="card-text text-muted">
201
+ <h1>
202
+ <a href="https://wordpress.org/support/plugin/hide-my-wp/reviews/?rate=5#new-post" target="_blank" style="font-size: 80px"><i class="fa fa-heart text-danger"></i></a>
203
+ </h1>
204
+ <?php echo __('Please help us and support our plugin on WordPress.org', _HMW_PLUGIN_NAME_) ?>
205
+ </div>
206
+ <div class="card-text text-info m-3">
207
+ <a href="https://wordpress.org/support/plugin/hide-my-wp/reviews/?rate=5#new-post" target="_blank" class="btn rounded-0 btn-success btn-lg px-4"><?php echo __('Rate Hide My WP', _HMW_PLUGIN_NAME_); ?></a>
208
+ </div>
209
+ <div class="card-text text-muted">
210
+ <?php echo __('Contact us after you left the review cause we have a surprise for you.', _HMW_PLUGIN_NAME_) ?>
211
+ <h1>
212
+ <a href="https://hidemywpghost.com/contact/" target="_blank" style="font-size: 80px"><i class="fa fa-gift text-info"></i></a>
213
+ </h1>
214
+ </div>
215
+ </div>
216
+ </div>
217
+
218
+ <div class="hmw_col hmw_col_side">
219
+ <div class="card col-sm-12 p-0">
220
+ <div class="card-body f-gray-dark text-center">
221
+ <h3 class="card-title"><?php _e('Check Your Website', _HMW_PLUGIN_NAME_); ?></h3>
222
+ <div class="card-text text-muted">
223
+ <?php echo __('Check if your website is secured with the current settings.', _HMW_PLUGIN_NAME_) ?>
224
+ </div>
225
+ <div class="card-text text-info m-3">
226
+ <a href="<?php echo HMW_Classes_Tools::getSettingsUrl('hmw_securitycheck') ?>" class="btn rounded-0 btn-warning btn-lg text-white px-5 securitycheck"><?php _e('Security Check', _HMW_PLUGIN_NAME_); ?></a>
227
+ </div>
228
+ <div class="card-text text-muted small">
229
+ <?php echo __('Make sure you save the settings and empty the cache before checking your website with our tool.', _HMW_PLUGIN_NAME_) ?>
230
+ </div>
231
+
232
+ <div class="card-text m-3 ">
233
+ <a class="bigbutton text-center" href="https://hidemywpghost.com/knowledge-base/" target="_blank"><?php echo __("Learn more about Hide My WP", _HMW_PLUGIN_NAME_); ?></a>
234
+ </div>
235
+ </div>
236
+ </div>
237
+
238
+
239
+ <?php echo $view->getView('Support') ?>
240
+
241
+ </div>
242
+ </div>
243
+ </div>
244
+ </div>
245
+ <?php }
view/Backup.php ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="hmw_wrap" class="d-flex flex-row my-3 bg-light">
2
+ <?php echo $view->getAdminTabs(HMW_Classes_Tools::getValue('tab', 'hmw_permalinks')); ?>
3
+ <div class="hmw_row d-flex flex-row bg-white px-3">
4
+ <div class="hmw_col flex-grow-1 mr-3">
5
+
6
+ <div class="card p-0 col-sm-12 tab-panel">
7
+ <h3 class="card-title bg-brown text-white p-2"><?php _e('Backup/Restore Settings', _HMW_PLUGIN_NAME_); ?>:</h3>
8
+ <div class="card-body">
9
+ <div class="text-black-50 mb-2"><?php _e('Click Backup and the download will start automatically. You can use the Backup for all your websites.', _HMW_PLUGIN_NAME_); ?></div>
10
+
11
+ <div class="hmw_settings_backup">
12
+ <form action="" target="_blank" method="POST">
13
+ <?php wp_nonce_field('hmw_backup', 'hmw_nonce'); ?>
14
+ <input type="hidden" name="action" value="hmw_backup"/>
15
+ <input type="submit" class="btn rounded-0 btn-default" name="hmw_backup" value="<?php _e('Backup Settings', _HMW_PLUGIN_NAME_) ?>"/>
16
+ <input type="button" class="btn rounded-0 btn-default hmw_restore" onclick="jQuery('.hmw_settings_restore').modal()" name="hmw_restore" value="<?php _e('Restore Settings', _HMW_PLUGIN_NAME_) ?>"/>
17
+ </form>
18
+ </div>
19
+
20
+
21
+ <!-- Modal -->
22
+ <div class="modal hmw_settings_restore" tabindex="-1" role="dialog" aria-hidden="true">
23
+ <div class="modal-dialog modal-dialog-centered" role="document">
24
+ <div class="modal-content">
25
+ <div class="modal-header">
26
+ <h5 class="modal-title" ><?php _e('Hide My Wp Restore', _HMW_PLUGIN_NAME_) ?></h5>
27
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
28
+ <span aria-hidden="true">&times;</span>
29
+ </button>
30
+ </div>
31
+ <div class="modal-body">
32
+ <div><?php _e('Upload the file with the saved Hide My Wp Settings', _HMW_PLUGIN_NAME_) ?></div>
33
+ <form action="" method="POST" enctype="multipart/form-data">
34
+ <?php wp_nonce_field('hmw_restore', 'hmw_nonce'); ?>
35
+ <input type="hidden" name="action" value="hmw_restore"/>
36
+ <div class="py-2">
37
+ <input type="file" name="hmw_options" id="favicon"/>
38
+ </div>
39
+
40
+ <input type="submit" style="margin-top: 10px;" class="btn rounded-0 btn-success" name="hmw_restore" value="<?php _e('Restore Backup', _HMW_PLUGIN_NAME_) ?>"/>
41
+ </form>
42
+ </div>
43
+
44
+ </div>
45
+ </div>
46
+ </div>
47
+
48
+
49
+ </div>
50
+ </div>
51
+ </div>
52
+ <div class="hmw_col hmw_col_side">
53
+ <div class="card col-sm-12 p-0">
54
+ <div class="card-body f-gray-dark text-left">
55
+ <h3 class="panel-title"><?php _e('Backup Settings', _HMW_PLUGIN_NAME_); ?></h3>
56
+ <div class="text-info mt-3"><?php echo sprintf(__("It's important to <strong>save your settings every time you change them</strong>. You can use the backup to configure other websites you own.", _HMW_PLUGIN_NAME_), site_url()); ?>
57
+ </div>
58
+ </div>
59
+ </div>
60
+
61
+ <?php echo $view->getView('Support') ?>
62
+
63
+ </div>
64
+ </div>
65
+ </div>
view/Brute.php ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="hmw_wrap" class="d-flex flex-row my-3 bg-light">
2
+ <?php echo $view->getAdminTabs(HMW_Classes_Tools::getValue('tab', 'hmw_permalinks')); ?>
3
+ <div class="hmw_row d-flex flex-row bg-white px-3">
4
+ <div class="hmw_col flex-grow-1 mr-3">
5
+ <form method="POST">
6
+ <?php wp_nonce_field('hmw_brutesettings', 'hmw_nonce') ?>
7
+ <input type="hidden" name="action" value="hmw_brutesettings"/>
8
+
9
+ <div class="card p-0 col-sm-12 tab-panel">
10
+ <div class="card-body">
11
+ <div class="col-sm-12 row mb-1 py-3 mx-2 ">
12
+ <div class="checker col-sm-12 row my-2 py-1">
13
+ <div class="col-sm-12 p-0 switch switch-sm">
14
+ <input type="checkbox" id="hmw_bruteforce" name="hmw_bruteforce" class="switch" <?php echo(HMW_Classes_Tools::getOption('hmw_bruteforce') ? 'checked="checked"' : '') ?> value="1"/>
15
+ <label for="hmw_bruteforce"><?php _e('Use Brute Force Protection', _HMW_PLUGIN_NAME_); ?></label>
16
+ <a href="https://hidemywpghost.com/kb/brute-force-attack-protection/#activate_brute_force" target="_blank" class="d-inline-block ml-2" ><i class="fa fa-question-circle"></i></a>
17
+ <div class="offset-1 text-black-50"><?php _e('Protects your website against brute force login attacks', _HMW_PLUGIN_NAME_); ?></div>
18
+ </div>
19
+ </div>
20
+ </div>
21
+
22
+ <div class="hmw_brute_enabled" <?php echo(!HMW_Classes_Tools::getOption('hmw_bruteforce') ? 'style="display:none"' : '') ?> >
23
+
24
+ <div class="border-top"></div>
25
+ <input type="hidden" value="1" name="brute_use_math">
26
+
27
+ <div class="group_autoload col-sm-12 d-flex justify-content-center btn-group mt-3" role="group" data-toggle="button">
28
+ <button type="button" class="btn btn-lg btn-outline-info brute_use_math m-1 py-3 px-4 active"><?php _e('Math Check protection', _HMW_PLUGIN_NAME_); ?></button>
29
+
30
+ <div class="hmw_pro mt-1" style="position: relative" data-toggle="popover" data-html="true" data-placement="top" data-content="<?php echo sprintf(__('This feature requires %sHide My WP Ghost%s.', _HMW_PLUGIN_NAME_), "<a href='https://hidemywpghost.com/hide-my-wp-pricing/' target='_blank'>", "</a>") ?>">
31
+ <div class="box" data-toggle="popover" data-html="true" data-placement="top" data-content="<?php echo sprintf(__('This feature requires %sHide My WP Ghost%s.', _HMW_PLUGIN_NAME_), "<a href='https://hidemywpghost.com/hide-my-wp-pricing/' target='_blank'>", "</a>") ?>">
32
+ <div class="ribbon"><span><?php echo __('PRO', _HMW_PLUGIN_NAME_) ?></span>
33
+ </div>
34
+ </div>
35
+ <img src="<?php echo _HMW_THEME_URL_ . 'img/pro_captcha.png' ?>">
36
+ </div>
37
+ </div>
38
+
39
+ <script>
40
+ (function ($) {
41
+ $(document).ready(function () {
42
+ $("button.brute_use_math").on('click', function () {
43
+ $('input[name=brute_use_math]').val(1);
44
+ $('.group_autoload button').removeClass('active');
45
+ $('.tab-panel.brute_use_math').show();
46
+ });
47
+ });
48
+ })(jQuery);
49
+ </script>
50
+ <div class="tab-panel brute_use_math">
51
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-0 my-3">
52
+ <div class="col-md-4 p-0 font-weight-bold">
53
+ <?php _e('Max fail attempts', _HMW_PLUGIN_NAME_); ?>:
54
+ <div class="small text-black-50"><?php _e('Block IP on login page', _HMW_PLUGIN_NAME_); ?></div>
55
+ </div>
56
+ <div class="col-md-2 p-0 input-group">
57
+ <input type="text" class="form-control bg-input" name="brute_max_attempts" value="<?php echo HMW_Classes_Tools::getOption('brute_max_attempts') ?>"/>
58
+ </div>
59
+ </div>
60
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-0 my-3">
61
+ <div class="col-md-4 p-0 font-weight-bold">
62
+ <?php _e('Ban duration', _HMW_PLUGIN_NAME_); ?>:
63
+ <div class="small text-black-50"><?php _e('No. of seconds', _HMW_PLUGIN_NAME_); ?></div>
64
+ </div>
65
+ <div class="col-md-2 p-0 input-group input-group">
66
+ <input type="text" class="form-control bg-input" name="brute_max_timeout" value="<?php echo HMW_Classes_Tools::getOption('brute_max_timeout') ?>"/>
67
+ </div>
68
+ </div>
69
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-0 my-3">
70
+ <div class="col-md-4 p-0 font-weight-bold">
71
+ <?php _e('Lockout Message', _HMW_PLUGIN_NAME_); ?>:
72
+ <div class="small text-black-50"><?php _e('Show message instead of login form', _HMW_PLUGIN_NAME_); ?></div>
73
+ </div>
74
+ <div class="col-md-8 p-0 input-group input-group">
75
+ <textarea type="text" class="form-control bg-input" name="hmw_brute_message" style="height: 80px"><?php echo HMW_Classes_Tools::getOption('hmw_brute_message') ?></textarea>
76
+ </div>
77
+ </div>
78
+ </div>
79
+ <div class="border-top">
80
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-0 my-3">
81
+ <div class="box" data-toggle="popover" data-html="true" data-placement="top" data-content="<?php echo sprintf(__('This feature requires %sHide My WP Ghost%s.', _HMW_PLUGIN_NAME_), "<a href='https://hidemywpghost.com/hide-my-wp-pricing/' target='_blank'>", "</a>") ?>">
82
+ <div class="ribbon"><span><?php echo __('PRO', _HMW_PLUGIN_NAME_) ?></span>
83
+ </div>
84
+ </div>
85
+ <div class="col-md-4 p-0 font-weight-bold" style="opacity: 0.3;">
86
+ <?php _e('Whitelist IPs', _HMW_PLUGIN_NAME_); ?>:
87
+ <div class="small text-black-50"><?php echo sprintf(__('You can white-list a single IP like 192.168.0.1 or a range of 245 IPs like 192.168.0.*. Find your IP with %s', _HMW_PLUGIN_NAME_), '<a href="https://whatismyipaddress.com/" target="_blank">https://whatismyipaddress.com/</a>') ?></div>
88
+ </div>
89
+ <div class="col-md-8 p-0 input-group input-group" style="opacity: 0.3;">
90
+ <textarea type="text" class="form-control bg-input" name="whitelist_ip" style="height: 100px"></textarea>
91
+ </div>
92
+ </div>
93
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-0 my-3">
94
+ <div class="box" data-toggle="popover" data-html="true" data-placement="top" data-content="<?php echo sprintf(__('This feature requires %sHide My WP Ghost%s.', _HMW_PLUGIN_NAME_), "<a href='https://hidemywpghost.com/hide-my-wp-pricing/' target='_blank'>", "</a>") ?>">
95
+ <div class="ribbon"><span><?php echo __('PRO', _HMW_PLUGIN_NAME_) ?></span>
96
+ </div>
97
+ </div>
98
+
99
+ <div class="col-md-4 p-0 font-weight-bold" style="opacity: 0.3;">
100
+ <?php _e('Ban IPs', _HMW_PLUGIN_NAME_); ?>:
101
+ <div class="small text-black-50"><?php echo __('You can ban a single IP like 192.168.0.1 or a range of 245 IPs like 192.168.0.*. These IPs will not be able to access the login page.', _HMW_PLUGIN_NAME_) ?></div>
102
+ </div>
103
+ <div class="col-md-8 p-0 input-group input-group" style="opacity: 0.3;">
104
+ <textarea type="text" class="form-control bg-input" name="banlist_ip" style="height: 100px"></textarea>
105
+ </div>
106
+ </div>
107
+ </div>
108
+ </div>
109
+
110
+ </div>
111
+
112
+ </div>
113
+
114
+ <div class="col-sm-12 m-0 p-2 bg-light text-center" style="position: fixed; bottom: 0; right: 0; z-index: 100; box-shadow: 0px 0px 8px -3px #444;">
115
+ <button type="submit" class="btn rounded-0 btn-success btn-lg px-5 mr-5 save"><?php _e('Save', _HMW_PLUGIN_NAME_); ?></button>
116
+ <a href="https://wordpress.org/support/plugin/hide-my-wp/reviews/?rate=5#new-post" target="_blank" style="color: #ff005e;"><?php echo sprintf( __( 'Love Hide My WP %s? Show us ;)', _HMW_PLUGIN_NAME_ ), _HMW_VER_NAME_ ); ?></a>
117
+ </div>
118
+ </form>
119
+
120
+ <div class="card p-0 col-sm-12 tab-panel">
121
+ <div class="card-body">
122
+ <h3 class="card-title"><?php _e('Blocked IPs', _HMW_PLUGIN_NAME_); ?>:</h3>
123
+ <div class="mt-3 mb-1" style="display: block;">
124
+ <div class="offset-10 col-md-2 py-1">
125
+ <form method="POST">
126
+ <?php wp_nonce_field('hmw_deleteallips', 'hmw_nonce') ?>
127
+ <input type="hidden" name="action" value="hmw_deleteallips"/>
128
+ <button type="submit" class="btn rounded-0 btn-default save py-0"><?php _e('Unlock all', _HMW_PLUGIN_NAME_); ?></button>
129
+ </form>
130
+ </div>
131
+ <div id="hmw_blockedips" class="col-sm-12 p-0"></div>
132
+ </div>
133
+ </div>
134
+ </div>
135
+ </div>
136
+ <div class="hmw_col hmw_col_side">
137
+ <div class="card col-sm-12 p-0">
138
+ <div class="card-body f-gray-dark text-left border-bottom">
139
+ <h3 class="card-title"><?php _e('Brute Force Login Protection', _HMW_PLUGIN_NAME_); ?></h3>
140
+ <div class="text-info"><?php echo __("Protects your website against brute force login attacks using Hide My WordPress <br /><br /> A common threat web developers face is a password-guessing attack known as a brute force attack. A brute-force attack is an attempt to discover a password by systematically trying every possible combination of letters, numbers, and symbols until you discover the one correct combination that works. ", _HMW_PLUGIN_NAME_); ?>
141
+ </div>
142
+ </div>
143
+ </div>
144
+ <div class="card col-sm-12 p-0">
145
+ <div class="card-body f-gray-dark text-left border-bottom">
146
+ <h3 class="card-title"><?php _e('Features', _HMW_PLUGIN_NAME_); ?></h3>
147
+ <ul class="text-info" style="margin-left: 16px; list-style: circle;">
148
+ <li><?php echo __("Limit the number of allowed login attempts using normal login form", _HMW_PLUGIN_NAME_); ?></li>
149
+ <li><?php echo __("Math problem verification while logging in", _HMW_PLUGIN_NAME_); ?></li>
150
+ <li><?php echo __("Manually block/unblock IP addresses", _HMW_PLUGIN_NAME_); ?></li>
151
+ <li><?php echo __("Manually whitelist trusted IP addresses", _HMW_PLUGIN_NAME_); ?></li>
152
+ <li><?php echo __("Option to inform user about remaining attempts on login page", _HMW_PLUGIN_NAME_); ?></li>
153
+ <li><?php echo __("Custom message to show to blocked users", _HMW_PLUGIN_NAME_); ?></li>
154
+ </ul>
155
+ </div>
156
+ </div>
157
+
158
+ </div>
159
+ </div>
160
+ </div>
view/Connect.php ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="hmw_wrap" class="d-flex flex-row my-3 bg-light">
2
+ <?php echo $view->getAdminTabs( HMW_Classes_Tools::getValue( 'tab', 'hmw_permalinks' ) ); ?>
3
+ <div class="hmw_row d-flex flex-row bg-white px-3">
4
+ <?php do_action( 'hmw_notices' ); ?>
5
+ <div class="hmw_col flex-grow-1 mr-3">
6
+ <form method="POST">
7
+ <?php wp_nonce_field( 'hmw_connect', 'hmw_nonce' ) ?>
8
+ <input type="hidden" name="action" value="hmw_connect"/>
9
+
10
+ <?php do_action( 'hmw_form_notices' ); ?>
11
+ <div class="card p-0 col-sm-12 tab-panel">
12
+ <h3 class="card-title bg-brown text-white p-2"><?php _e( 'Activate Free version', _HMW_PLUGIN_NAME_ ); ?></h3>
13
+ <div class="card-body">
14
+
15
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-0 my-3">
16
+ <div class="col-sm-4 p-1 font-weight-bold">
17
+ <?php _e( 'Email Address', _HMW_PLUGIN_NAME_ ); ?>:
18
+ <div class="small text-black-50"><?php echo __( 'Enter your email address to get security alerts and How To Lessons', _HMW_PLUGIN_NAME_ ); ?></div>
19
+ </div>
20
+ <div class="col-sm-8 p-0 input-group ">
21
+ <?php
22
+ $email = HMW_Classes_Tools::getOption( 'hmw_email_address' );
23
+ if ( $email == '' ) {
24
+ global $current_user;
25
+ $email = $current_user->user_email;
26
+ }
27
+ ?>
28
+ <input type="text" class="form-control" name="hmw_email" value="<?php echo $email ?>" placeholder="<?php echo $email ?>"/>
29
+ </div>
30
+ </div>
31
+
32
+ <div class="col-sm-12 row mb-1 ml-1 hmw_howtolessons_div">
33
+ <div class="checker col-sm-12 row my-2 py-1">
34
+ <div class="col-sm-12 p-0 switch switch-sm">
35
+ <input type="hidden" name="hmw_monitor" value="0"/>
36
+ <input type="checkbox" id="hmw_monitor" name="hmw_monitor" class="switch" checked="checked" value="1"/>
37
+ <label for="hmw_monitor"><?php _e( 'Monitor my website, send me security alerts and vulnerability reports', _HMW_PLUGIN_NAME_ ); ?></label>
38
+ </div>
39
+ </div>
40
+ </div>
41
+
42
+ <div class="col-sm-12 row mb-1 ml-1 hmw_howtolessons_div">
43
+ <div class="checker col-sm-12 row my-2 py-1">
44
+ <div class="col-sm-12 p-0 switch switch-sm">
45
+ <input type="hidden" name="hmw_howtolessons" value="0"/>
46
+ <input type="checkbox" id="hmw_howtolessons" name="hmw_howtolessons" class="switch" value="1"/>
47
+ <label for="hmw_howtolessons"><?php _e( 'I want to receive How To lessons for Hide My WP Ghost by email', _HMW_PLUGIN_NAME_ ); ?></label>
48
+ </div>
49
+ </div>
50
+ </div>
51
+
52
+
53
+
54
+ </div>
55
+ </div>
56
+
57
+ <div class="col-sm-12 my-3 p-0">
58
+ <button type="submit" class="btn rounded-0 btn-success btn-lg px-5 save"><?php _e( 'Activate', _HMW_PLUGIN_NAME_ ); ?></button>
59
+ </div>
60
+ </form>
61
+ <form method="POST">
62
+ <?php wp_nonce_field( 'hmw_dont_connect', 'hmw_nonce' ) ?>
63
+ <input type="hidden" name="action" value="hmw_dont_connect"/>
64
+ <button type="submit" class="btn rounded-0 float-left btn-link btn-lg px-5" style="position: relative;margin-top: -65px;margin-left: 164px;"><?php _e( 'Skip Activation', _HMW_PLUGIN_NAME_ ); ?></button>
65
+ </form>
66
+ <div class="card col-sm-12 p-3 tab-panel_tutorial embed-responsive embed-responsive-16by9 text-center">
67
+ <iframe width="853" height="480" style="max-width: 100%" src="https://www.youtube.com/embed/zhvRGHMjKic" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
68
+ </div>
69
+ </div>
70
+ <div class="hmw_col hmw_col_side">
71
+ <div class="card col-sm-12 p-0">
72
+ <div class="card-body f-gray-dark text-left border-bottom">
73
+ <h3 class="card-title"><?php _e( 'Activate Hide My WP', _HMW_PLUGIN_NAME_ ); ?></h3>
74
+ <div class="text-info">
75
+ <?php echo sprintf( __( "By activating the Free version of Hide My WP you agree with our %sTerms of Use%s and %sPrivacy Policy%s", _HMW_PLUGIN_NAME_ ), '<a href="https://wpplugins.tips/terms-of-use/" target="_blank">', '</a>', '<a href="https://wpplugins.tips/privacy-policy/" target="_blank">', '</a>' ); ?>
76
+ </div>
77
+ <div class="text-info mt-3">
78
+ <?php echo __( 'Note! If you add your email you will receive a free token which will activate the plugin.', _HMW_PLUGIN_NAME_ ); ?>
79
+ </div>
80
+ <div class="text-danger mt-2">
81
+ <?php echo sprintf( __( "If you bought Hide My WP Ghost please remove this plugin and install the one from %sYour Account%s", _HMW_PLUGIN_NAME_ ), '<a href="https://account.wpplugins.tips/user/" target="_blank">', '</a>' ); ?>
82
+ </div>
83
+ </div>
84
+ </div>
85
+
86
+ <?php echo $view->getView( 'Support' ) ?>
87
+
88
+ </div>
89
+ </div>
90
+
91
+ </div>
view/Dashboard.php ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $do_check = false;
3
+ //Set the alert if security wasn't check
4
+ if (HMW_Classes_Tools::getOption('hmw_security_alert')) {
5
+ if (!get_option('hmw_securitycheck')) {
6
+ $do_check = true;
7
+ } elseif ($securitycheck_time = get_option('hmw_securitycheck_time')) {
8
+ if ((isset($securitycheck_time['timestamp']) && time() - $securitycheck_time['timestamp'] > (3600 * 24 * 7))) {
9
+ $do_check = true;
10
+ }
11
+ } else {
12
+ $do_check = true;
13
+ }
14
+ }
15
+
16
+ ?>
17
+ <div class="hmw_widget_content" style="position: relative;">
18
+ <div style="font-size: 18px; text-align: center; font-weight: bold"><?php echo __('Security Level', _HMW_PLUGIN_NAME_) ?></div>
19
+ <?php if (!$do_check) { ?>
20
+ <div style="text-align: center">
21
+ <?php if (((count($view->riskreport) * 100) / count($view->risktasks)) > 90) { ?>
22
+ <a href="<?php echo HMW_Classes_Tools::getSettingsUrl('hmw_securitycheck') ?>"><img src="<?php echo _HMW_THEME_URL_ . 'img/speedometer_danger.png' ?>" style="max-width: 60%; margin: 10px auto;"/></a>
23
+ <div style="font-size: 14px; font-style: italic; text-align: center; color: red;"><?php echo sprintf(__("Your website security %sis extremely weak%s. %sMany hacking doors are available.", _HMW_PLUGIN_NAME_), '<strong>', '</strong>', '<br />') ?></div>
24
+ <?php } elseif (((count($view->riskreport) * 100) / count($view->risktasks)) > 50) { ?>
25
+ <a href="<?php echo HMW_Classes_Tools::getSettingsUrl('hmw_securitycheck') ?>"><img src="<?php echo _HMW_THEME_URL_ . 'img/speedometer_low.png' ?>" style="max-width: 60%; margin: 10px auto;"/></a>
26
+ <div style="font-size: 14px; font-style: italic; text-align: center; color: red;"><?php echo sprintf(__("Your website security %sis very weak%s. %sMany hacking doors are available.", _HMW_PLUGIN_NAME_), '<strong>', '</strong>', '<br />') ?></div>
27
+ <?php } elseif (((count($view->riskreport) * 100) / count($view->risktasks)) > 0) { ?>
28
+ <a href="<?php echo HMW_Classes_Tools::getSettingsUrl('hmw_securitycheck') ?>"><img src="<?php echo _HMW_THEME_URL_ . 'img/speedometer_medium.png' ?>" style="max-width: 60%; margin: 10px auto;"/></a>
29
+ <div style="font-size: 14px; font-style: italic; text-align: center; color: orangered;"><?php echo sprintf(__("Your website security is still weak. %sSome of the main hacking doors are still available.", _HMW_PLUGIN_NAME_), '<br />') ?></div>
30
+ <?php } else { ?>
31
+ <a href="<?php echo HMW_Classes_Tools::getSettingsUrl('hmw_securitycheck') ?>"><img src="<?php echo _HMW_THEME_URL_ . 'img/speedometer_high.png' ?>" style="max-width: 60%; margin: 10px auto;"/></a>
32
+ <div style="font-size: 14px; font-style: italic; text-align: center; color: green;"><?php echo sprintf(__("Your website security is strong. %sKeep checking the security every week.", _HMW_PLUGIN_NAME_), '<br />') ?></div>
33
+ <?php } ?>
34
+ </div>
35
+ <?php if (((count($view->riskreport) * 100) / count($view->risktasks)) > 0) { ?>
36
+ <div style="margin: 20px 0;">
37
+ <div style="font-size: 18px; text-align: left;"><?php echo __('Urgent Security Actions Required', _HMW_PLUGIN_NAME_) ?>:</div>
38
+ <ul style="margin: 10px 0 10px 20px; list-style: initial;">
39
+ <?php foreach ($view->riskreport as $function => $row) { ?>
40
+ <li style="margin: 10px 0; line-height: 20px"> <?php echo $row['solution'] ?></li>
41
+ <?php } ?>
42
+ </ul>
43
+
44
+ <div style="margin-top: 20px; text-align: center; font-weight: bold;">
45
+ <a href="<?php echo HMW_Classes_Tools::getSettingsUrl('hmw_securitycheck') ?>" style="color: orangered; font-size: 16px; margin-right: 10px;"><?php echo __('Check Security Report', _HMW_PLUGIN_NAME_) ?></a>
46
+ | <a href="https://hidemywpghost.com/hide-my-wp-pricing/" target="_blank" style="color: green; font-size: 16px; margin-left: 10px;">
47
+ <?php _e('Upgrade Your Security', _HMW_PLUGIN_NAME_); ?>
48
+ </a>
49
+ </div>
50
+
51
+ </div>
52
+ <?php } ?>
53
+ <?php } ?>
54
+
55
+
56
+ </div>
57
+
58
+ <style>
59
+ .wp_loading {
60
+ border: 16px solid #f3f3f3;
61
+ border-top: 16px solid #b0794a;
62
+ border-radius: 50%;
63
+ width: 80px;
64
+ height: 80px;
65
+ animation: spin 2s linear infinite;
66
+ margin: 20px auto 0 auto;
67
+ }
68
+
69
+ .wp_button {
70
+ display: block;
71
+ font-weight: 400;
72
+ text-align: center;
73
+ white-space: nowrap;
74
+ vertical-align: middle;
75
+ -webkit-user-select: none;
76
+ -moz-user-select: none;
77
+ -ms-user-select: none;
78
+ user-select: none;
79
+ border: 1px solid transparent;
80
+ border-radius: .25rem;
81
+ transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
82
+ padding: .5rem 1rem;
83
+ font-size: 1.25rem;
84
+ line-height: 1;
85
+ color: #fff !important;
86
+ background-color: #ddaa00;
87
+ border-color: #ddaa00;
88
+ margin: 7px auto;
89
+ }
90
+
91
+ @keyframes spin {
92
+ 0% {
93
+ transform: rotate(0deg);
94
+ }
95
+ 100% {
96
+ transform: rotate(360deg);
97
+ }
98
+ }
99
+ </style>
100
+ <script>
101
+ (function ($) {
102
+ $.fn.hmw_widget_recheck = function () {
103
+ var $this = this;
104
+ var $div = $this.find('.inside');
105
+
106
+ $div.find('.hmw_widget_content').html('<div style="font-size: 18px; text-align: center; font-weight: bold"><?php echo __("Checking Website Security ...", _HMW_PLUGIN_NAME_) ?></div><div class="wp_loading"></div>');
107
+ $.post(
108
+ hmwQuery.ajaxurl,
109
+ {
110
+ action: 'hmw_widget_securitycheck',
111
+ hmw_nonce: hmwQuery.nonce
112
+ }
113
+ ).done(function (response) {
114
+ if (typeof response.data !== 'undefined') {
115
+ $div.html(response.data);
116
+ }
117
+ }).error(function () {
118
+ $div.html('');
119
+ });
120
+ };
121
+
122
+ $(document).ready(function () {
123
+ $('#hmw_dashboard_widget').find('.recheck_security').on('click', function () {
124
+ $('#hmw_dashboard_widget').hmw_widget_recheck();
125
+ });
126
+
127
+ <?php if($do_check){ ?>
128
+ $('#hmw_dashboard_widget').hmw_widget_recheck();
129
+ <?php }?>
130
+ });
131
+ })(jQuery);
132
+
133
+ </script>
view/FrontendCheck.php ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if ( HMW_Classes_Tools::getOption( 'test_frontend' ) && HMW_Classes_Tools::getOption( 'hmw_mode' ) <> 'default' ) {
2
+ add_action( 'home_url', array(HMW_Classes_ObjController::getClass( 'HMW_Models_Rewrite' ), 'home_url'), PHP_INT_MAX, 1 );
3
+ ?>
4
+ <div class="col-sm-12 border-bottom border-light py-3 mx-0 my-3">
5
+
6
+ <div class="col-sm-12 border-warning bg-light border py-3 mx-0 my-0">
7
+ <h4><?php _e( 'Next Steps', _HMW_PLUGIN_NAME_ ); ?></h4>
8
+ <div class="col-sm-12 text-center my-2">
9
+ <button type="button" class="btn btn-lg btn-success frontend_test" data-remote="<?php echo home_url() . '/' . HMW_Classes_Tools::getOption( 'hmw_login_url' ) ?>" data-target="#frontend_test_modal" data-toggle="modal"><?php _e( 'Frontend Login Test', _HMW_PLUGIN_NAME_ ); ?></button>
10
+ </div>
11
+
12
+ <ol>
13
+ <li><?php echo sprintf( __( "Run %sFrontend Login Test%s and login inside the pupop. ", _HMW_PLUGIN_NAME_ ), '<strong>', '</strong>' ); ?></li>
14
+ <li><?php _e( "If you're able to login, you've set the new paths correctly.", _HMW_PLUGIN_NAME_ ); ?></li>
15
+ <li><?php _e( 'If the Login Page displays any error, please make sure you follow the Hide My WP Ghost instructions before moving forward.', _HMW_PLUGIN_NAME_ ); ?></li>
16
+ <li><?php _e( 'Do not log out from this browser until you are confident that the Frontend is working and you will be able to log in again.', _HMW_PLUGIN_NAME_ ); ?></li>
17
+ <li><?php echo sprintf( __( "If you can't configure Hide My WP Ghost, switch to Default mode and %scontact us%s.", _HMW_PLUGIN_NAME_ ), '<a href="https://hidemywpghost.com/contact/" target="_blank" >', '</a>' ); ?></li>
18
+ </ol>
19
+
20
+ <div class="wp-admin_warning col-sm-12 my-2 mt-4 text-danger p-0 text-center">
21
+ <div class="my-1"><?php echo sprintf( __( "%sWARNING:%s Use the custom login URL to login to admin.", _HMW_PLUGIN_NAME_ ), '<span class="font-weight-bold">', '</span>' ); ?></div>
22
+ <div class="mb-3"><?php echo sprintf( __( "Your login URL will be: %s In case you can't re-login, use the safe URL: %s", _HMW_PLUGIN_NAME_ ), '<strong>' . home_url() . '/' . HMW_Classes_Tools::getOption( 'hmw_login_url' ) . '</strong><br /><br />', "<strong><br />" . site_url() . "/wp-login.php?" . HMW_Classes_Tools::getOption( 'hmw_disable_name' ) . "=" . HMW_Classes_Tools::getOption( 'hmw_disable' ) . "</strong>" ); ?></div>
23
+ </div>
24
+
25
+ <div class="hmw_logout">
26
+ <form method="POST">
27
+ <?php wp_nonce_field( 'hmw_confirm', 'hmw_nonce' ); ?>
28
+ <input type="hidden" name="action" value="hmw_confirm"/>
29
+ <input type="submit" class="hmw_btn hmw_btn-success" value="<?php echo __( "Yes, it's working", _HMW_PLUGIN_NAME_ ) ?>"/>
30
+ </form>
31
+ </div>
32
+ <div class="hmw_abort" style="display: inline-block; margin-left: 5px;">
33
+ <form method="POST">
34
+ <?php wp_nonce_field( 'hmw_abort', 'hmw_nonce' ); ?>
35
+ <input type="hidden" name="action" value="hmw_abort"/>
36
+ <input type="submit" class="hmw_btn hmw_btn-warning" value="<?php echo __( "No, abort", _HMW_PLUGIN_NAME_ ) ?>"/>
37
+ </form>
38
+ </div>
39
+ </div>
40
+ <div class="modal fade" id="frontend_test_modal" tabindex="-1" role="dialog" aria-hidden="true">
41
+ <div class="modal-dialog modal-lg" role="document">
42
+ <div class="modal-content">
43
+ <div class="modal-header">
44
+ <h5 class="modal-title" id="exampleModalLabel"><?php _e( 'Frontend login Test', _HMW_PLUGIN_NAME_ ); ?></h5>
45
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
46
+ <span aria-hidden="true">&times;</span>
47
+ </button>
48
+ </div>
49
+ <iframe class="modal-body" style="min-height: 500px;"></iframe>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ <script>
54
+ (function ($) {
55
+ $('button.frontend_test').on('click', function () {
56
+ $($(this).data("target") + ' .modal-body').attr('src', $(this).data("remote"));
57
+ });
58
+ })(jQuery);
59
+
60
+ </script>
61
+
62
+ </div>
63
+ <?php } ?>
view/Log.php ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="hmw_wrap" class="d-flex flex-row my-3 bg-light">
2
+ <?php echo $view->getAdminTabs(HMW_Classes_Tools::getValue('tab', 'hmw_permalinks')); ?>
3
+ <div class="hmw_row d-flex flex-row bg-white px-3">
4
+ <div class="hmw_col flex-grow-1 mr-3">
5
+ <form method="POST">
6
+ <?php wp_nonce_field('hmw_logsettings', 'hmw_nonce') ?>
7
+ <input type="hidden" name="action" value="hmw_logsettings"/>
8
+
9
+ <div class="card p-0 col-sm-12 tab-panel">
10
+ <h3 class="card-title bg-brown text-white p-2"><?php _e('Events Settings', _HMW_PLUGIN_NAME_); ?>:</h3>
11
+ <div class="card-body">
12
+ <div class="box" data-toggle="popover" data-html="true" data-placement="top" data-content="<?php echo sprintf(__('This feature requires %sHide My WP Ghost%s.', _HMW_PLUGIN_NAME_), "<a href='https://hidemywpghost.com/hide-my-wp-pricing/' target='_blank'>", "</a>") ?>">
13
+ <div class="ribbon"><span><?php echo __('PRO', _HMW_PLUGIN_NAME_) ?></span></div>
14
+ </div>
15
+
16
+ <div style="opacity: 0.3">
17
+ <div class="col-sm-12 row mb-1 py-3 mx-2 ">
18
+ <div class="checker col-md-12 row my-2 py-1">
19
+ <div class="col-md-12 p-0 switch switch-sm">
20
+ <div class="hmw_pro">
21
+ <img src="<?php echo _HMW_THEME_URL_ . 'img/pro.png' ?>">
22
+ </div>
23
+ <label for="hmw_activity_log"><?php _e('Log Users Events', _HMW_PLUGIN_NAME_); ?></label>
24
+ <div class="offset-1 text-black-50"><?php _e('Track and Log events that happens on your WordPress site!', _HMW_PLUGIN_NAME_); ?></div>
25
+ </div>
26
+ </div>
27
+ </div>
28
+
29
+
30
+ <?php if (HMW_Classes_Tools::getOption('hmw_bruteforce')) { ?>
31
+ <div class="col-sm-12 row mb-1 py-3 mx-2 ">
32
+ <div class="checker col-md-12 row my-2 py-1">
33
+ <div class="col-md-12 p-0 switch switch-sm">
34
+ <div class="hmw_pro">
35
+ <img src="<?php echo _HMW_THEME_URL_ . 'img/pro.png' ?>">
36
+ </div>
37
+ <label for="hmw_bruteforce_log"><?php _e('Log Brute Force Attempts', _HMW_PLUGIN_NAME_); ?></label>
38
+ <div class="offset-1 text-black-50"><?php _e('Track and Log brute force attempts', _HMW_PLUGIN_NAME_); ?></div>
39
+ </div>
40
+ </div>
41
+ </div>
42
+ <?php } ?>
43
+
44
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-0 my-3">
45
+ <div class="col-sm-4 p-1">
46
+ <div class="font-weight-bold"><?php _e('Log Use Roles', _HMW_PLUGIN_NAME_); ?>:</div>
47
+ <div class="text-black-50"><?php _e('Hold Control key to select multiple user roles', _HMW_PLUGIN_NAME_); ?></div>
48
+ <div class="text-black-50"><?php _e("Don't select any role if you want to log all user roles", _HMW_PLUGIN_NAME_); ?></div>
49
+ </div>
50
+ <div class="col-sm-8 p-0 input-group" style="opacity: 0.3;">
51
+ <select multiple name="hmw_activity_log_roles[]" class="form-control bg-input mb-1">
52
+ <?php
53
+ global $wp_roles;
54
+ $roles = $wp_roles->get_names();
55
+ foreach ($roles as $key => $role) {
56
+ echo '<option value="' . $key . '" ' . (in_array($key, (array)HMW_Classes_Tools::getOption('hmw_activity_log_roles')) ? 'selected="selected"' : '') . '>' . $role . '</option>';
57
+ } ?>
58
+ </select>
59
+ </div>
60
+
61
+ </div>
62
+ </div>
63
+ </div>
64
+ </div>
65
+ </form>
66
+ </div>
67
+ <div class="hmw_col hmw_col_side">
68
+ <div class="card col-md-12 p-0">
69
+ <div class="card-body f-gray-dark text-left border-bottom">
70
+ <h3 class="card-title"><?php _e('Log Events', _HMW_PLUGIN_NAME_); ?></h3>
71
+ <div class="text-info mb-3"><?php echo __("Monitor everything that happens on your WordPress site!", _HMW_PLUGIN_NAME_); ?></div>
72
+ <div class="text-info mb-3"><?php echo __("It's safe to know what happened on your website at any time, in admin and on frontend.", _HMW_PLUGIN_NAME_); ?></div>
73
+ <div class="text-info mb-3"><?php echo __("All the logs are saved on our Cloud Servers and your data is safe in case you reinstall the plugin", _HMW_PLUGIN_NAME_); ?></div>
74
+ </div>
75
+ </div>
76
+ <div class="card col-md-12 p-0">
77
+ <div class="card-body f-gray-dark text-left border-bottom">
78
+ <h3 class="card-title"><?php _e('Features', _HMW_PLUGIN_NAME_); ?></h3>
79
+ <ul class="text-info" style="margin-left: 16px; list-style: circle;">
80
+ <li class="mb-2"><?php echo __("Monitor, track and log events on your website", _HMW_PLUGIN_NAME_); ?></li>
81
+ <li class="mb-2"><?php echo __("Know what the other users are doing on your website and when", _HMW_PLUGIN_NAME_); ?></li>
82
+ <li class="mb-2"><?php echo __("You can set to receive email with alerts for one or more actions", _HMW_PLUGIN_NAME_); ?></li>
83
+ <li class="mb-2"><?php echo __("Filter events and users", _HMW_PLUGIN_NAME_); ?></li>
84
+ <li><?php echo __("Compatible with all themes and plugins", _HMW_PLUGIN_NAME_); ?></li>
85
+ </ul>
86
+ </div>
87
+ </div>
88
+
89
+ <?php echo $view->getView('Support') ?>
90
+
91
+ </div>
92
+ </div>
93
+ </div>
view/Mapping.php ADDED
@@ -0,0 +1,257 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="hmw_wrap" class="d-flex flex-row my-3 bg-light">
2
+ <?php echo $view->getAdminTabs( HMW_Classes_Tools::getValue( 'tab', 'hmw_permalinks' ) ); ?>
3
+ <div class="hmw_row d-flex flex-row bg-white px-3">
4
+ <div class="hmw_col flex-grow-1 mr-3">
5
+ <?php echo $view->getView( 'FrontendCheck' ); ?>
6
+
7
+ <form method="POST">
8
+ <?php wp_nonce_field( 'hmw_mappsettings', 'hmw_nonce' ) ?>
9
+ <input type="hidden" name="action" value="hmw_mappsettings"/>
10
+
11
+ <div class="card p-0 col-sm-12 tab-panel">
12
+ <h3 class="card-title bg-brown text-white p-2"><?php _e( 'Text Mapping', _HMW_PLUGIN_NAME_ ); ?>:
13
+ <a href="https://hidemywpghost.com/kb/url-mapping-text-mapping/#text_mapping" target="_blank" class="d-inline-block ml-2" style="color: white"><i class="fa fa-question-circle"></i></a>
14
+ </h3>
15
+ <div class="card-body">
16
+
17
+ <?php if ( HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'default' ) { ?>
18
+ <div class="col-sm-12 border-bottom border-light py-3 mx-0 my-3 text-black-50 text-center">
19
+ <?php echo __( 'First, you need to switch Hide My Wp from Default mode to Safe Mode or Ghost Mode.', _HMW_PLUGIN_NAME_ ) ?>
20
+ </div>
21
+ <?php } else { ?>
22
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-0 ">
23
+ <div class="p-0">
24
+ <div class="text-black-50"><?php _e( 'Replace the text in tags and classes to hide any WordPress footprint.', _HMW_PLUGIN_NAME_ ); ?>:</div>
25
+ <div class="text-black-50"><?php _e( "Note! Your plugins and themes may use these and it will affect the design and functionality.", _HMW_PLUGIN_NAME_ ); ?></div>
26
+ </div>
27
+
28
+ </div>
29
+
30
+
31
+ <div class="hmw_text_mapping_group py-3">
32
+ <div class="col-sm-12 row mb-1 ml-1">
33
+ <div class="checker col-sm-12 row my-2 py-1">
34
+ <div class="col-sm-12 p-0 switch switch-sm">
35
+ <input type="hidden" name="hmw_mapping_classes" value="0"/>
36
+ <input type="checkbox" id="hmw_mapping_classes" name="hmw_mapping_classes" class="switch" <?php echo(HMW_Classes_Tools::getOption( 'hmw_mapping_classes' ) ? 'checked="checked"' : '') ?> value="1"/>
37
+ <label for="hmw_mapping_classes"><?php _e( 'Text Mapping only Classes, IDs, JS variables', _HMW_PLUGIN_NAME_ ); ?></label>
38
+ <a href="https://hidemywpghost.com/kb/url-mapping-text-mapping/#text_mapping_style" target="_blank" class="d-inline-block ml-2"><i class="fa fa-question-circle"></i></a>
39
+ <div class="offset-1 text-black-50"><?php _e( "Change the text only in classes, styles & scrips. (Recommended ON)", _HMW_PLUGIN_NAME_ ); ?></div>
40
+ <div class="offset-1 text-black-50"><?php _e( "If this option is switched off, the text is changed in all page", _HMW_PLUGIN_NAME_ ); ?></div>
41
+ </div>
42
+ </div>
43
+ </div>
44
+
45
+ <?php
46
+ $hmw_text_mapping = json_decode( HMW_Classes_Tools::getOption( 'hmw_text_mapping' ), true );
47
+ if ( isset( $hmw_text_mapping['from'] ) && ! empty( $hmw_text_mapping['from'] ) ) {
48
+ foreach ( $hmw_text_mapping['from'] as $index => $row ) {
49
+ ?>
50
+ <div class="col-sm-12 hmw_text_mapping row border-bottom border-light py-1 px-0 mx-0 my-0">
51
+ <div class="hmw_text_mapping_remove" onclick="jQuery(this).parent().remove()" title="<?php echo __( 'Remove Text Map', _HMW_PLUGIN_NAME_ ) ?>">x</div>
52
+ <div class="col-sm-6 py-1 px-0 input-group input-group">
53
+ <input type="text" class="form-control bg-input" name="hmw_text_mapping_from[]" value="<?php echo $hmw_text_mapping['from'][ $index ] ?>" placeholder="Current Text ..."/>
54
+ <div class="col-sm-1 py-2 px-0 text-center text-black-50" style="max-width: 30px"><?php echo '=>' ?></div>
55
+ </div>
56
+ <div class="col-sm-6 py-1 px-0 input-group input-group">
57
+ <input type="text" class="form-control bg-input" name="hmw_text_mapping_to[]" value="<?php echo $hmw_text_mapping['to'][ $index ] ?>" placeholder="New Text ..."/>
58
+ </div>
59
+ </div>
60
+ <?php
61
+ }
62
+ } ?>
63
+ <div class="col-sm-12 hmw_text_mapping row border-bottom border-light py-1 px-0 mx-0 my-0">
64
+ <div class="hmw_text_mapping_remove" style="display: none" onclick="jQuery(this).parent().remove()" title="<?php echo __( 'Remove Text Map', _HMW_PLUGIN_NAME_ ) ?>">x</div>
65
+ <div class="col-sm-6 py-1 px-0 input-group input-group">
66
+ <input type="text" class="form-control bg-input" name="hmw_text_mapping_from[]" value="" placeholder="Current Text ..."/>
67
+ <div class="col-sm-1 py-2 px-0 text-center text-black-50" style="max-width: 30px"><?php echo '=>' ?></div>
68
+ </div>
69
+ <div class="col-sm-6 py-1 px-0 input-group input-group">
70
+ <input type="text" class="form-control bg-input" name="hmw_text_mapping_to[]" value="" placeholder="New Text ..."/>
71
+ </div>
72
+ </div>
73
+ </div>
74
+ <div class="col-sm-12 row border-bottom border-light p-0 m-0">
75
+ <div class="col-sm-4 p-0 offset-4">
76
+ <button type="button" class="col-sm-12 btn btn-sm btn-warning text-white" onclick="jQuery('div.hmw_text_mapping:last').clone().appendTo('div.hmw_text_mapping_group'); jQuery('div.hmw_text_mapping_remove').show(); jQuery('div.hmw_text_mapping:last').find('div.hmw_text_mapping_remove').hide()"><?php echo __( 'Add another text', _HMW_PLUGIN_NAME_ ) ?></button>
77
+ </div>
78
+ </div>
79
+
80
+ <?php } ?>
81
+ </div>
82
+ </div>
83
+ <div class="card p-0 col-sm-12 tab-panel">
84
+ <h3 class="card-title bg-brown text-white p-2"><?php _e( 'URL Mapping', _HMW_PLUGIN_NAME_ ); ?>:
85
+ <a href="https://hidemywpghost.com/kb/url-mapping-text-mapping/#url_mapping" target="_blank" class="d-inline-block ml-2" style="color: white"><i class="fa fa-question-circle"></i></a>
86
+ </h3>
87
+ <div class="card-body">
88
+ <div class="box" data-toggle="popover" data-html="true" data-placement="top" data-content="<?php echo sprintf( __( 'This feature requires %sHide My WP Ghost%s.', _HMW_PLUGIN_NAME_ ), "<a href='https://hidemywpghost.com/hide-my-wp-pricing/' target='_blank'>", "</a>" ) ?>">
89
+ <div class="ribbon"><span><?php echo __( 'PRO', _HMW_PLUGIN_NAME_ ) ?></span></div>
90
+ </div>
91
+ <div style="opacity: 0.3">
92
+
93
+ <?php if ( HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'default' ) { ?>
94
+ <div class="col-sm-12 border-bottom border-light py-3 mx-0 my-3 text-black-50 text-center">
95
+ <?php echo __( 'First, you need to switch Hide My Wp from Default mode to Safe Mode or Ghost Mode.', _HMW_PLUGIN_NAME_ ) ?>
96
+ </div>
97
+ <?php } else { ?>
98
+ <div class="text-black-50"><?php echo __( "You can add a list of URLs you want to change into new ones. ", _HMW_PLUGIN_NAME_ ); ?></div>
99
+ <div class="text-black-50"><?php echo __( "It's important to include only internal URLs from Frontend source code after you activate the plugin in Safe Mode or Ghost Mode.", _HMW_PLUGIN_NAME_ ); ?></div>
100
+ <div class="text-black-50 mt-4 font-weight-bold"><?php echo __( "Example:", _HMW_PLUGIN_NAME_ ); ?></div>
101
+ <div class="text-black-50 row">
102
+ <div class="col-sm-1 font-weight-bold mr-0 pr-0" style="min-width: 70px;"><?php echo __( 'from', _HMW_PLUGIN_NAME_ ) ?>:</div>
103
+ <div class="col-sm-10 m-0 p-0"><?php echo home_url() . '/' . HMW_Classes_Tools::getOption( 'hmw_themes_url' ) . '/' . substr( md5( str_replace( '%2F', '/', rawurlencode( get_template() ) ) ), 0, 10 ) . '/' . HMW_Classes_Tools::getOption( 'hmw_themes_style' ); ?></div>
104
+ </div>
105
+ <div class="text-black-50 row">
106
+ <div class="col-sm-1 font-weight-bold mr-0 pr-0" style="min-width: 70px;"><?php echo __( 'to', _HMW_PLUGIN_NAME_ ) ?>:</div>
107
+ <div class="col-sm-10 m-0 p-0"><?php echo home_url( 'mystyle.css' ); ?></div>
108
+ </div>
109
+ <div class="text-black-50 my-2"><?php echo __( "or", _HMW_PLUGIN_NAME_ ); ?></div>
110
+ <div class="text-black-50 row">
111
+ <div class="col-sm-1 font-weight-bold mr-0 pr-0" style="min-width: 70px;"><?php echo __( 'from', _HMW_PLUGIN_NAME_ ) ?>:</div>
112
+ <div class="col-sm-10 m-0 p-0"><?php echo home_url() . '/' . HMW_Classes_Tools::getOption( 'hmw_themes_url' ) . '/'; ?></div>
113
+ </div>
114
+ <div class="text-black-50 row">
115
+ <div class="col-sm-1 font-weight-bold mr-0 pr-0" style="min-width: 70px;"><?php echo __( 'to', _HMW_PLUGIN_NAME_ ) ?>:</div>
116
+ <div class="col-sm-10 m-0 p-0"><?php echo home_url( 'myassets/' ); ?></div>
117
+ </div>
118
+ <div class="hmw_url_mapping_group py-3">
119
+ <?php
120
+ $hmw_url_mapping = json_decode( HMW_Classes_Tools::getOption( 'hmw_url_mapping' ), true );
121
+ if ( isset( $hmw_url_mapping['from'] ) && ! empty( $hmw_url_mapping['from'] ) ) {
122
+ foreach ( $hmw_url_mapping['from'] as $index => $row ) {
123
+ ?>
124
+ <div class="col-sm-12 hmw_url_mapping row border-bottom border-light py-1 px-0 mx-0 my-0">
125
+ <div class="hmw_url_mapping_remove" onclick="jQuery(this).parent().remove()" title="<?php echo __( 'Remove URL Map', _HMW_PLUGIN_NAME_ ) ?>">x</div>
126
+ <div class="col-sm-6 py-1 px-0 input-group input-group">
127
+ <input type="text" class="form-control bg-input" name="hmw_url_mapping_from[]" value="<?php echo $hmw_url_mapping['from'][ $index ] ?>" placeholder="Current URL ..."/>
128
+ <div class="col-sm-1 py-2 px-0 text-center text-black-50" style="max-width: 30px"><?php echo '=>' ?></div>
129
+ </div>
130
+ <div class="col-sm-6 py-1 px-0 input-group input-group">
131
+ <input type="text" class="form-control bg-input" name="hmw_url_mapping_to[]" value="<?php echo $hmw_url_mapping['to'][ $index ] ?>" placeholder="New URL ..."/>
132
+ </div>
133
+ </div>
134
+ <?php
135
+ }
136
+ } ?>
137
+ <div class="col-sm-12 hmw_url_mapping row border-bottom border-light py-1 px-0 mx-0 my-0">
138
+ <div class="hmw_url_mapping_remove" style="display: none" onclick="jQuery(this).parent().remove()" title="<?php echo __( 'Remove URL Map', _HMW_PLUGIN_NAME_ ) ?>">x</div>
139
+ <div class="col-sm-6 py-1 px-0 input-group input-group">
140
+ <input type="text" class="form-control bg-input" name="hmw_url_mapping_from[]" value="" placeholder="Current URL ..."/>
141
+ <div class="col-sm-1 py-2 px-0 text-center text-black-50" style="max-width: 30px"><?php echo '=>' ?></div>
142
+ </div>
143
+ <div class="col-sm-6 py-1 px-0 input-group input-group">
144
+ <input type="text" class="form-control bg-input" name="hmw_url_mapping_to[]" value="" placeholder="New URL ..."/>
145
+ </div>
146
+ </div>
147
+ </div>
148
+ <div class="col-sm-12 row border-bottom border-light p-0 m-0">
149
+ <div class="col-sm-4 p-0 offset-4">
150
+ <button type="button" class="col-sm-12 btn btn-sm btn-warning text-white" onclick="jQuery('div.hmw_url_mapping:last').clone().appendTo('div.hmw_url_mapping_group'); jQuery('div.hmw_url_mapping_remove').show(); jQuery('div.hmw_url_mapping:last').find('div.hmw_url_mapping_remove').hide()"><?php echo __( 'Add another URL', _HMW_PLUGIN_NAME_ ) ?></button>
151
+ </div>
152
+ </div>
153
+ <?php } ?>
154
+ </div>
155
+ </div>
156
+ </div>
157
+ <div class="card p-0 col-sm-12 tab-panel">
158
+ <h3 class="card-title bg-brown text-white p-2"><?php _e( 'CDN URLs', _HMW_PLUGIN_NAME_ ); ?>:
159
+ <a href="https://hidemywpghost.com/kb/url-mapping-text-mapping/#cdn_urls" target="_blank" class="d-inline-block ml-2" style="color: white"><i class="fa fa-question-circle"></i></a>
160
+ </h3>
161
+ <div class="card-body">
162
+ <div class="box" data-toggle="popover" data-html="true" data-placement="top" data-content="<?php echo sprintf( __( 'This feature requires %sHide My WP Ghost%s.', _HMW_PLUGIN_NAME_ ), "<a href='https://hidemywpghost.com/hide-my-wp-pricing/' target='_blank'>", "</a>" ) ?>">
163
+ <div class="ribbon"><span><?php echo __( 'PRO', _HMW_PLUGIN_NAME_ ) ?></span></div>
164
+ </div>
165
+ <div style="opacity: 0.3">
166
+ <?php if ( HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'default' ) { ?>
167
+ <div class="col-sm-12 border-bottom border-light py-3 mx-0 my-3 text-black-50 text-center">
168
+ <?php echo __( 'First, you need to switch Hide My Wp from Default mode to Safe Mode or Ghost Mode.', _HMW_PLUGIN_NAME_ ) ?>
169
+ </div>
170
+ <?php } else { ?>
171
+ <div class="text-black-50"><?php echo __( "You can add one or more CDN URLs you use.", _HMW_PLUGIN_NAME_ ); ?></div>
172
+ <div class="text-black-50"><?php echo __( "This option will not activate the CDN option for your website but it will change the custom paths in case you already set a CDN URL with another plugin.", _HMW_PLUGIN_NAME_ ); ?></div>
173
+
174
+ <div class="hmw_cdn_mapping_group py-3">
175
+ <?php
176
+ $hmw_cdn_urls = json_decode( HMW_Classes_Tools::getOption( 'hmw_cdn_urls' ), true );
177
+ if ( ! empty( $hmw_cdn_urls ) ) {
178
+ foreach ( $hmw_cdn_urls as $index => $row ) {
179
+ ?>
180
+ <div class="col-sm-12 hmw_cdn_mapping row border-bottom border-light py-1 px-0 mx-0 my-0">
181
+ <div class="hmw_cdn_mapping_remove" onclick="jQuery(this).parent().remove()" title="<?php echo __( 'Remove CDN', _HMW_PLUGIN_NAME_ ) ?>">x</div>
182
+ <div class="col-sm-12 py-1 px-0 input-group input-group">
183
+ <input type="text" class="form-control bg-input" name="hmw_cdn_urls[]" value="<?php echo $row ?>" placeholder="CDN URL ..."/>
184
+ </div>
185
+ </div>
186
+ <?php
187
+ }
188
+ } ?>
189
+ <div class="col-sm-12 hmw_cdn_mapping row border-bottom border-light py-1 px-0 mx-0 my-0">
190
+ <div class="hmw_cdn_mapping_remove" style="display: none" onclick="jQuery(this).parent().remove()" title="<?php echo __( 'Remove CDN', _HMW_PLUGIN_NAME_ ) ?>">x</div>
191
+ <div class="col-sm-12 py-1 px-0 input-group input-group">
192
+ <input type="text" class="form-control bg-input" name="hmw_cdn_urls[]" value="" placeholder="CDN URL ..."/>
193
+ </div>
194
+
195
+ </div>
196
+ </div>
197
+ <div class="col-sm-12 row border-bottom border-light p-0 m-0">
198
+ <div class="col-sm-4 p-0 offset-4">
199
+ <button type="button" class="col-sm-12 btn btn-sm btn-warning text-white" onclick="jQuery('div.hmw_cdn_mapping:last').clone().appendTo('div.hmw_cdn_mapping_group'); jQuery('div.hmw_cdn_mapping_remove').show(); jQuery('div.hmw_cdn_mapping:last').find('div.hmw_cdn_mapping_remove').hide()"><?php echo __( 'Add another CDN URL', _HMW_PLUGIN_NAME_ ) ?></button>
200
+ </div>
201
+ </div>
202
+ <?php } ?>
203
+ </div>
204
+ </div>
205
+ </div>
206
+
207
+
208
+ <?php if ( HMW_Classes_Tools::getOption( 'test_frontend' ) || HMW_Classes_Tools::getOption( 'logout' ) || HMW_Classes_Tools::getOption( 'error' ) ) { ?>
209
+ <div class="col-sm-12 m-0 p-2">
210
+ <button type="submit" class="btn rounded-0 btn-success btn-lg px-5 mr-5 save"><?php _e( 'Save', _HMW_PLUGIN_NAME_ ); ?></button>
211
+ <a href="https://wordpress.org/support/plugin/hide-my-wp/reviews/?rate=5#new-post" target="_blank" style="color: #ff005e;"><?php echo sprintf( __( 'Love Hide My WP %s? Show us ;)', _HMW_PLUGIN_NAME_ ), _HMW_VER_NAME_ ); ?></a>
212
+ </div>
213
+ <?php } else { ?>
214
+ <div class="col-sm-12 m-0 p-2 bg-light text-center" style="position: fixed; bottom: 0; right: 0; z-index: 100; box-shadow: 0px 0px 8px -3px #444;">
215
+ <button type="submit" class="btn rounded-0 btn-success btn-lg px-5 mr-5 save"><?php _e('Save', _HMW_PLUGIN_NAME_); ?></button>
216
+ <a href="https://wordpress.org/support/plugin/hide-my-wp/reviews/?rate=5#new-post" target="_blank" style="color: #ff005e;"><?php echo sprintf( __( 'Love Hide My WP %s? Show us ;)', _HMW_PLUGIN_NAME_ ), _HMW_VER_NAME_ ); ?></a>
217
+ </div>
218
+ <?php } ?>
219
+ </form>
220
+ </div>
221
+ <div class="hmw_col hmw_col_side">
222
+ <div class="card col-sm-12 p-0">
223
+ <div class="card-body f-gray-dark text-center">
224
+ <h3 class="card-title"><?php _e( 'Check Your Website', _HMW_PLUGIN_NAME_ ); ?></h3>
225
+ <div class="card-text text-muted">
226
+ <?php echo __( 'Check if your website is secured with the current settings.', _HMW_PLUGIN_NAME_ ) ?>
227
+ </div>
228
+ <div class="card-text text-info m-3">
229
+ <a href="<?php echo HMW_Classes_Tools::getSettingsUrl( 'hmw_securitycheck' ) ?>" class="btn rounded-0 btn-warning btn-lg text-white px-5 securitycheck"><?php _e( 'Security Check', _HMW_PLUGIN_NAME_ ); ?></a>
230
+ </div>
231
+ <div class="card-text text-muted small">
232
+ <?php echo __( 'Make sure you save the settings and empty the cache before checking your website with our tool.', _HMW_PLUGIN_NAME_ ) ?>
233
+ </div>
234
+
235
+ <div class="card-text m-3 ">
236
+ <a class="bigbutton text-center" href="https://hidemywpghost.com/" target="_blank"><?php echo __( "Learn more about Hide My WP", _HMW_PLUGIN_NAME_ ); ?></a>
237
+ </div>
238
+ </div>
239
+ </div>
240
+
241
+ <div class="card col-sm-12 p-0">
242
+ <div class="card-body f-gray-dark text-center">
243
+ <h3 class="card-title"><?php echo __( 'Love Hide My WP?', _HMW_PLUGIN_NAME_ ); ?></h3>
244
+ <div class="card-text text-muted">
245
+ <h1><i class="fa fa-heart text-danger"></i></h1>
246
+ <?php echo __( 'Give us 5 stars on WordPress.org', _HMW_PLUGIN_NAME_ ) ?>
247
+ </div>
248
+ <div class="card-text text-info m-3">
249
+ <a href="https://wordpress.org/support/plugin/hide-my-wp/reviews/?rate=5#new-post" target="_blank" class="btn rounded-0 btn-success btn-lg px-4"><?php echo __( 'Rate Hide My WP', _HMW_PLUGIN_NAME_ ); ?></a>
250
+ </div>
251
+
252
+ </div>
253
+ </div>
254
+ </div>
255
+
256
+ </div>
257
+ </div>
view/Notices.php ADDED
@@ -0,0 +1,2 @@
 
 
1
+ <div class="hmw_notice <?php echo $type ?>"><?php echo $message ?></div>
2
+
view/Permalinks.php ADDED
@@ -0,0 +1,611 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( defined( 'HMW_DISABLE' ) && HMW_DISABLE ) {
4
+ //don't run if disable
5
+ } elseif ( HMW_Classes_Tools::isPermalinkStructure() && ! HMW_Classes_Tools::isPHPPermalink() ) {
6
+ if ( is_multisite() && ! is_plugin_active_for_network( _HMW_PLUGIN_NAME_ . '/index.php' ) ) {
7
+ ?>
8
+ <div class="error notice">
9
+ <p><?php echo __( "Hide My WordPress requires to be activated on the entire network to prevent login issues!", _HMW_PLUGIN_NAME_ ); ?></p>
10
+ </div>
11
+ <?php
12
+ return;
13
+ }
14
+ ?>
15
+
16
+ <div id="hmw_wrap" class="d-flex flex-row my-3 bg-light">
17
+ <?php echo $view->getAdminTabs( HMW_Classes_Tools::getValue( 'tab', 'hmw_permalinks' ) ); ?>
18
+ <div class="hmw_row d-flex flex-row bg-white px-3">
19
+ <?php do_action( 'hmw_notices' ); ?>
20
+ <div class="hmw_col flex-grow-1 mr-3">
21
+ <?php echo $view->getView( 'FrontendCheck' ); ?>
22
+
23
+ <form method="POST">
24
+ <?php wp_nonce_field( 'hmw_settings', 'hmw_nonce' ); ?>
25
+ <input type="hidden" name="action" value="hmw_settings"/>
26
+ <input type="hidden" name="hmw_mode" value="<?php echo HMW_Classes_Tools::getOption( 'hmw_mode' ) ?>"/>
27
+
28
+ <?php do_action( 'hmw_form_notices' ); ?>
29
+
30
+ <div class="card col-sm-12">
31
+ <div class="card-body py-2 px-0">
32
+ <h3 class="card-title"><?php _e( 'Levels of security', _HMW_PLUGIN_NAME_ ); ?>:</h3>
33
+ <div class="group_autoload d-flex justify-content-center btn-group mt-3" role="group" data-toggle="button">
34
+ <button type="button" class="btn btn-lg btn-outline-info default_autoload m-1 py-3 px-4 <?php echo( ( HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'default' ) ? 'active' : '' ) ?>"><?php echo __( "Default (unsafe)", _HMW_PLUGIN_NAME_ ) ?></button>
35
+ <button type="button" class="btn btn-lg btn-outline-info lite_autoload m-1 py-3 px-4 <?php echo( ( HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'lite' ) ? 'active' : '' ) ?>"><?php echo __( "Lite mode", _HMW_PLUGIN_NAME_ ) ?></button>
36
+
37
+ <div style="position: relative; margin: .23rem!important;">
38
+ <div class="box" style="border: none" data-toggle="popover" data-html="true" data-placement="top" data-content="<?php echo sprintf( __( 'Upgrade Your Website Security. Add Firewall, Hide WordPress Completely. %sUnlock this feature%s', _HMW_PLUGIN_NAME_ ), "<br /><a href='https://hidemywpghost.com/wordpress_update' target='_blank'>", "</a>" ) ?>">
39
+ <div class="ribbon"><span><?php echo __( 'PRO', _HMW_PLUGIN_NAME_ ) ?></span>
40
+ </div>
41
+ </div>
42
+ <button type="button" class="btn btn-lg btn-outline-info m-1 py-3 px-4" style="opacity: 0.7;"><?php echo __( "Ghost mode", _HMW_PLUGIN_NAME_ ) ?></button>
43
+ </div>
44
+ </div>
45
+ <div class="wp-admin_warning col-sm-12 my-2 text-danger p-0 text-center" <?php echo( ( HMW_Classes_Tools::getOption( 'hmw_hide_admin' ) ) ? '' : 'style="display: none;"' ) ?> >
46
+ <div class="my-2 small"><?php echo sprintf( __( "%sWARNING:%s The admin path is hidden from visitors. Use the custom login URL to login to admin", _HMW_PLUGIN_NAME_ ), '<span class="font-weight-bold">', '</span>' ); ?></div>
47
+ <div class="my-3 small"><?php echo sprintf( __( "If you can't login, use this URL: %s and all your changes are roll back to default", _HMW_PLUGIN_NAME_ ), "<strong>" . site_url() . "/wp-login.php?" . HMW_Classes_Tools::getOption( 'hmw_disable_name' ) . "=" . HMW_Classes_Tools::getOption( 'hmw_disable' ) . "</strong><br />" ); ?></div>
48
+ </div>
49
+
50
+ <script>
51
+ (function ($) {
52
+ $(document).ready(function () {
53
+ $(".default_autoload").on('click', function () {
54
+ $('input[name=hmw_mode]').val('default');
55
+ $('.group_autoload button').removeClass('active');
56
+ <?php
57
+ foreach ( HMW_Classes_Tools::$default as $name => $value ) {
58
+ if ( is_string( $value ) && $value <> "0" && $value <> "1" ) {
59
+ echo '$("input[type=text][name=' . $name . ']").val("' . str_replace( '"', '\\"', $value ) . '");' . "\n";
60
+ } elseif ( $value == "0" || $value == "1" ) {
61
+ echo '$("input[name=' . $name . ']").prop("checked", ' . (int) $value . '); $("input[name=' . $name . ']").trigger("change");';
62
+ }
63
+ }
64
+ ?>
65
+ $('input[name=hmw_admin_url]').trigger('keyup');
66
+ $('.tab-panel').hide();
67
+ $('.tab-panel_tutorial').show();
68
+ });
69
+ $(".lite_autoload").on('click', function () {
70
+ $('input[name=hmw_mode]').val('lite');
71
+ $('.group_autoload button').removeClass('active');
72
+ <?php
73
+ $lite = @array_merge( HMW_Classes_Tools::$default, HMW_Classes_Tools::$lite );
74
+ foreach ( $lite as $name => $value ) {
75
+ if ( is_string( $value ) && $value <> "0" && $value <> "1" ) {
76
+ echo '$("input[type=text][name=' . $name . ']").val("' . str_replace( '"', '\\"', $value ) . '");' . "\n";
77
+ } elseif ( $value == "0" || $value == "1" ) {
78
+ echo '$("input[name=' . $name . ']").prop("checked", ' . (int) $value . '); $("input[name=' . $name . ']").trigger("change");';
79
+
80
+ }
81
+ }
82
+ ?>
83
+ $('input[name=hmw_admin_url]').trigger('keyup');
84
+ $('.tab-panel').show();
85
+ $('.tab-panel_tutorial').hide();
86
+
87
+ });
88
+ $(".ninja_autoload").on('click', function () {
89
+ $('input[name=hmw_mode]').val('ninja');
90
+ $('.group_autoload button').removeClass('active');
91
+ <?php
92
+ $ninja = @array_merge( HMW_Classes_Tools::$default, HMW_Classes_Tools::$ninja );
93
+ foreach ( $ninja as $name => $value ) {
94
+ if ( is_string( $value ) && $value <> "0" && $value <> "1" ) {
95
+ echo '$("input[type=text][name=' . $name . ']").val("' . str_replace( '"', '\\"', $value ) . '");' . "\n";
96
+ } elseif ( $value == "0" || $value == "1" ) {
97
+ echo '$("input[name=' . $name . ']").prop("checked", ' . (int) $value . '); $("input[name=' . $name . ']").trigger("change");';
98
+
99
+ }
100
+ }
101
+ ?>
102
+ $('input[name=hmw_admin_url]').trigger('keyup');
103
+ $('.tab-panel').show();
104
+ $('.tab-panel_tutorial').hide();
105
+
106
+ });
107
+
108
+
109
+ });
110
+ })(jQuery);
111
+ </script>
112
+
113
+ </div>
114
+ </div>
115
+ <div class="card col-sm-12 p-0 tab-panel_tutorial embed-responsive embed-responsive-16by9 text-center" <?php echo( ( HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'lite' ) ? 'style="display:none"' : '' ) ?>>
116
+ <iframe width="853" height="480" style="max-width: 100%" src="https://www.youtube.com/embed/VGUs1dL611I?rel=0" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
117
+ </div>
118
+ <div class="card col-sm-12 p-0 tab-panel" <?php echo( ( HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'default' ) ? 'style="display:none"' : '' ) ?>>
119
+ <h3 class="card-title bg-brown text-white p-2"><?php _e( 'Admin Settings', _HMW_PLUGIN_NAME_ ); ?>:</h3>
120
+ <div class="card-body">
121
+ <?php if ( defined( 'HMW_DEFAULT_ADMIN' ) && HMW_DEFAULT_ADMIN ) {
122
+ echo ' <div class="text-danger col-sm-12 border-bottom border-light py-3 mx-0 my-3">' . sprintf( __( 'Your admin URL is changed by another plugin/theme in %s. To activate this option, disable the custom admin in the other plugin or deativate it.', _HMW_PLUGIN_NAME_ ), '<strong>' . HMW_DEFAULT_ADMIN . '</strong>' ) . '</div>';
123
+ echo '<input type="hidden" name="hmw_admin_url" value="' . HMW_Classes_Tools::$default['hmw_admin_url'] . '"/>';
124
+ } else {
125
+ if ( HMW_Classes_Tools::isGodaddy() ) {
126
+ echo ' <div class="text-danger col-sm-12 border-bottom border-light py-3 mx-0 my-3">' . sprintf( __( "Your admin URL can't be changed on %s hosting because of the %s security terms.", _HMW_PLUGIN_NAME_ ), '<strong>Godaddy</strong>', '<strong>Godaddy</strong>' ) . '</div>';
127
+ echo '<input type="hidden" name="hmw_admin_url" value="' . HMW_Classes_Tools::$default['hmw_admin_url'] . '"/>';
128
+ } elseif (PHP_VERSION_ID >= 70400 && HMW_Classes_Tools::isWpengine()) {
129
+ echo ' <div class="text-danger col-sm-12 border-bottom border-light py-3 mx-0 my-3">' . sprintf( __( "Your admin URL can't be changed on %s because of the %s rules are no longer used.", _HMW_PLUGIN_NAME_ ), '<strong>Wpengine with PHP 7 or greater</strong>' , '<strong>.htaccess</strong>') . '</div>';
130
+ echo '<input type="hidden" name="hmw_admin_url" value="' . HMW_Classes_Tools::$default['hmw_admin_url'] . '"/>';
131
+ }else{ ?>
132
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-1 my-3">
133
+ <div class="col-sm-4 p-0 font-weight-bold">
134
+ <?php _e( 'Custom Admin Path', _HMW_PLUGIN_NAME_ ); ?>:
135
+ <div class="small text-black-50"><?php _e( 'eg. adm, back', _HMW_PLUGIN_NAME_ ); ?></div>
136
+ </div>
137
+ <div class="col-sm-8 p-0 input-grou p input-group-lg">
138
+ <input type="text" class="form-control bg-input" name="hmw_admin_url" value="<?php echo HMW_Classes_Tools::getOption( 'hmw_admin_url' ) ?>" placeholder="<?php echo HMW_Classes_Tools::$default['hmw_admin_url'] ?>"/>
139
+ <a href="https://hidemywpghost.com/kb/customize-paths-in-hide-my-wp-ghost/#customize_admin" target="_blank" class="position-absolute float-right" style="right: 7px;top: 25%;"><i class="fa fa-question-circle"></i></a>
140
+ </div>
141
+ </div>
142
+ <?php } ?>
143
+
144
+ <div class="col-sm-12 row mb-1 ml-1">
145
+ <div class="checker col-sm-12 row my-2 py-1">
146
+ <div class="col-sm-12 p-0 switch switch-sm">
147
+ <input type="hidden" name="hmw_hide_admin" value="0"/>
148
+ <input type="checkbox" id="hmw_hide_admin" name="hmw_hide_admin" class="switch" <?php echo( HMW_Classes_Tools::getOption( 'hmw_hide_admin' ) ? 'checked="checked"' : '' ) ?> value="1"/>
149
+ <label for="hmw_hide_admin"><?php _e( 'Hide "wp-admin"', _HMW_PLUGIN_NAME_ ); ?></label>
150
+ <div class="offset-1 text-black-50"><?php _e( 'Show 404 Not Found Error when visitors access /wp-admin', _HMW_PLUGIN_NAME_ ); ?></div>
151
+ </div>
152
+ </div>
153
+ </div>
154
+ <div class="col-sm-12 row mb-1 ml-1 hmw_hide_newadmin_div" <?php echo( HMW_Classes_Tools::getOption( 'hmw_admin_url' ) == HMW_Classes_Tools::$default['hmw_admin_url'] ? 'style="display:none;"' : '' ) ?>>
155
+ <div class="checker col-sm-12 row my-2 py-1">
156
+ <div class="col-sm-12 p-0 switch switch-sm">
157
+ <input type="hidden" name="hmw_hide_newadmin" value="0"/>
158
+ <input type="checkbox" id="hmw_hide_newadmin" name="hmw_hide_newadmin" class="switch" <?php echo( HMW_Classes_Tools::getOption( 'hmw_hide_newadmin' ) ? 'checked="checked"' : '' ) ?> value="1"/>
159
+ <label for="hmw_hide_newadmin"><?php _e( 'Hide the new admin path', _HMW_PLUGIN_NAME_ ); ?></label>
160
+ <div class="offset-1 text-black-50"><?php _e( 'Let only the new login be accessible and redirect me to admin after logging in', _HMW_PLUGIN_NAME_ ); ?></div>
161
+ </div>
162
+ </div>
163
+ </div>
164
+ <div class="admin_warning col-sm-12 my-3 text-danger p-0 text-center small" style="display: none">
165
+ <?php echo sprintf( __( "Some Themes don't work with custom Admin and Ajax paths. In case of ajax errors, switch back to wp-admin and admin-ajax.php.", _HMW_PLUGIN_NAME_ ) ); ?>
166
+ </div>
167
+ <?php } ?>
168
+ </div>
169
+ </div>
170
+ <div class="card col-sm-12 p-0 tab-panel" <?php echo( ( HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'default' ) ? 'style="display:none"' : '' ) ?>>
171
+ <h3 class="card-title bg-brown text-white p-2"><?php _e( 'Login Settings', _HMW_PLUGIN_NAME_ ); ?>:</h3>
172
+ <div class="card-body">
173
+ <?php if ( defined( 'HMW_DEFAULT_LOGIN' ) && HMW_DEFAULT_LOGIN ) {
174
+ echo ' <div class="text-danger col-sm-12 border-bottom border-light py-3 mx-0 my-3">' . sprintf( __( 'Your login URL is changed by another plugin/theme in %s. To activate this option, disable the custom login in the other plugin or deativate it.', _HMW_PLUGIN_NAME_ ), '<strong>' . HMW_DEFAULT_LOGIN . '</strong>' ) . '</div>';
175
+ } else {
176
+ ?>
177
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-1 my-3">
178
+ <div class="col-sm-4 p-0 font-weight-bold">
179
+ <?php _e( 'Custom Login Path', _HMW_PLUGIN_NAME_ ); ?>:
180
+ <div class="small text-black-50"><?php _e( 'eg. login or signin', _HMW_PLUGIN_NAME_ ); ?></div>
181
+ </div>
182
+ <div class="col-sm-8 p-0 input-group input-group-lg">
183
+ <input type="text" class="form-control bg-input" name="hmw_login_url" value="<?php echo HMW_Classes_Tools::getOption( 'hmw_login_url' ) ?>" placeholder="<?php echo HMW_Classes_Tools::$default['hmw_login_url'] ?>"/>
184
+ <a href="https://hidemywpghost.com/kb/customize-paths-in-hide-my-wp-ghost/#customize_login" target="_blank" class="position-absolute float-right" style="right: 7px;top: 25%;"><i class="fa fa-question-circle"></i></a>
185
+ </div>
186
+ </div>
187
+
188
+ <div class="col-sm-12 row mb-1 ml-1 hmw_hide_wplogin_div">
189
+ <div class="checker col-sm-12 row my-2 py-1">
190
+ <div class="col-sm-12 p-0 switch switch-sm">
191
+ <input type="hidden" name="hmw_hide_wplogin" value="0"/>
192
+ <input type="checkbox" id="hmw_hide_wplogin" name="hmw_hide_wplogin" class="switch" <?php echo( HMW_Classes_Tools::getOption( 'hmw_hide_wplogin' ) ? 'checked="checked"' : '' ) ?> value="1"/>
193
+ <label for="hmw_hide_wplogin"><?php _e( 'Hide "wp-login.php"', _HMW_PLUGIN_NAME_ ); ?></label>
194
+ <div class="offset-1 text-black-50"><?php _e( 'Show 404 Not Found Error when visitors access /wp-login.php', _HMW_PLUGIN_NAME_ ); ?></div>
195
+ </div>
196
+ </div>
197
+ </div>
198
+
199
+ <div class="col-sm-12 row mb-1 ml-1 hmw_hide_login_div">
200
+ <div class="checker col-sm-12 row my-2 py-1">
201
+ <div class="col-sm-12 p-0 switch switch-sm">
202
+ <input type="hidden" name="hmw_hide_login" value="0"/>
203
+ <input type="checkbox" id="hmw_hide_login" name="hmw_hide_login" class="switch" <?php echo( HMW_Classes_Tools::getOption( 'hmw_hide_login' ) ? 'checked="checked"' : '' ) ?> value="1"/>
204
+ <label for="hmw_hide_login"><?php _e( 'Hide /login', _HMW_PLUGIN_NAME_ ); ?></label>
205
+ <div class="offset-1 text-black-50"><?php _e( 'Show 404 Not Found Error when visitors access /login', _HMW_PLUGIN_NAME_ ); ?></div>
206
+ </div>
207
+ </div>
208
+ </div>
209
+
210
+ <div class="border-bottom border-gray"></div>
211
+
212
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-1 my-3">
213
+ <div class="col-sm-4 p-0 font-weight-bold">
214
+ <?php _e( 'Custom Lost Password Path', _HMW_PLUGIN_NAME_ ); ?>:
215
+ <div class="small text-black-50"><?php _e( 'eg. lostpass or forgotpass', _HMW_PLUGIN_NAME_ ); ?></div>
216
+ </div>
217
+ <div class="col-sm-8 p-0 input-group input-group-lg">
218
+ <input type="text" class="form-control bg-input" name="hmw_lostpassword_url" value="<?php echo HMW_Classes_Tools::getOption( 'hmw_lostpassword_url' ) ?>" placeholder="?action=lostpassword"/>
219
+ <a href="https://hidemywpghost.com/kb/customize-paths-in-hide-my-wp-ghost/#customize_lost_password" target="_blank" class="position-absolute float-right" style="right: 7px;top: 25%;"><i class="fa fa-question-circle"></i></a>
220
+ </div>
221
+ </div>
222
+
223
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-1 my-3">
224
+ <div class="col-sm-4 p-0 font-weight-bold">
225
+ <?php _e( 'Custom Register Path', _HMW_PLUGIN_NAME_ ); ?>:
226
+ <div class="small text-black-50"><?php _e( 'eg. newuser or register', _HMW_PLUGIN_NAME_ ); ?></div>
227
+ </div>
228
+ <div class="col-sm-8 p-0 input-group input-group-lg">
229
+ <input type="text" class="form-control bg-input" name="hmw_register_url" value="<?php echo HMW_Classes_Tools::getOption( 'hmw_register_url' ) ?>" placeholder="?action=register"/>
230
+ <a href="https://hidemywpghost.com/kb/customize-paths-in-hide-my-wp-ghost/#customize_register" target="_blank" class="position-absolute float-right" style="right: 7px;top: 25%;"><i class="fa fa-question-circle"></i></a>
231
+ </div>
232
+ </div>
233
+
234
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-1 my-3">
235
+ <div class="col-sm-4 p-0 font-weight-bold">
236
+ <?php _e( 'Custom Logout Path', _HMW_PLUGIN_NAME_ ); ?>:
237
+ <div class="small text-black-50"><?php _e( 'eg. logout or disconnect', _HMW_PLUGIN_NAME_ ); ?></div>
238
+ </div>
239
+ <div class="col-sm-8 p-0 input-group input-group-lg">
240
+ <input type="text" class="form-control bg-input" name="hmw_logout_url" value="<?php echo HMW_Classes_Tools::getOption( 'hmw_logout_url' ) ?>" placeholder="?action=logout"/>
241
+ <a href="https://hidemywpghost.com/kb/customize-paths-in-hide-my-wp-ghost/#customize_logout" target="_blank" class="position-absolute float-right" style="right: 7px;top: 25%;"><i class="fa fa-question-circle"></i></a>
242
+ </div>
243
+ </div>
244
+
245
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-0 my-3">
246
+ <div class="col-sm-4 p-0 py-2 font-weight-bold">
247
+ <?php _e( 'Logout Redirect Page', _HMW_PLUGIN_NAME_ ); ?>:
248
+ </div>
249
+ <div class="col-sm-8 p-0 input-group input-group-lg">
250
+ <input type="text" class="form-control bg-input" name="hmw_logout_redirect" value="<?php echo HMW_Classes_Tools::getOption( 'hmw_logout_redirect' ) ?>"/>
251
+ <a href="https://hidemywpghost.com/kb/customize-paths-in-hide-my-wp-ghost/#customize_logout" target="_blank" class="position-absolute float-right" style="right: 7px;top: 25%;"><i class="fa fa-question-circle"></i></a>
252
+ </div>
253
+ </div>
254
+
255
+ <?php if ( is_multisite() ) { ?>
256
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-1 my-3">
257
+ <div class="col-sm-4 p-0 font-weight-bold">
258
+ <?php _e( 'Custom Activation Path', _HMW_PLUGIN_NAME_ ); ?>:
259
+ <div class="small text-black-50"><?php _e( 'eg. multisite activation link', _HMW_PLUGIN_NAME_ ); ?></div>
260
+ </div>
261
+ <div class="col-sm-8 p-0 input-group input-group-lg">
262
+ <input type="text" class="form-control bg-input" name="hmw_activate_url" value="<?php echo HMW_Classes_Tools::getOption( 'hmw_activate_url' ) ?>" placeholder="<?php echo HMW_Classes_Tools::$default['hmw_activate_url'] ?>"/>
263
+ <a href="https://hidemywpghost.com/kb/customize-paths-in-hide-my-wp-ghost/#customize_register" target="_blank" class="position-absolute float-right" style="right: 7px;top: 25%;"><i class="fa fa-question-circle"></i></a>
264
+ </div>
265
+ </div>
266
+ <?php } ?>
267
+ <?php } ?>
268
+
269
+ </div>
270
+ </div>
271
+ <div class="card col-sm-12 p-0 tab-panel" <?php echo( ( HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'default' ) ? 'style="display:none"' : '' ) ?>>
272
+ <h3 class="card-title bg-brown text-white p-2"><?php _e( 'Common Paths', _HMW_PLUGIN_NAME_ ); ?>:</h3>
273
+ <div class="card-body">
274
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-1 my-3">
275
+ <div class="col-sm-4 p-0 font-weight-bold">
276
+ <?php _e( 'Custom admin-ajax Path', _HMW_PLUGIN_NAME_ ); ?>:
277
+ <div class="small text-black-50"><?php _e( 'eg. ajax, json', _HMW_PLUGIN_NAME_ ); ?></div>
278
+ </div>
279
+ <div class="col-sm-8 p-0 input-group input-group-lg">
280
+ <input type="text" class="form-control bg-input" name="hmw_admin-ajax_url" value="<?php echo HMW_Classes_Tools::getOption( 'hmw_admin-ajax_url' ) ?>" placeholder="<?php echo HMW_Classes_Tools::$default['hmw_admin-ajax_url'] ?>"/>
281
+ <a href="https://hidemywpghost.com/kb/customize-paths-in-hide-my-wp-ghost/#customize_ajax" target="_blank" class="position-absolute float-right" style="right: 7px;top: 25%;"><i class="fa fa-question-circle"></i></a>
282
+ </div>
283
+ </div>
284
+
285
+ <div class="col-sm-12 row mb-1 ml-1 hmw_hideajax_admin_div">
286
+ <div class="checker col-sm-12 row my-2 py-1">
287
+ <div class="col-sm-12 p-0 switch switch-sm">
288
+ <input type="hidden" name="hmw_hideajax_admin" value="0"/>
289
+ <input type="checkbox" id="hmw_hideajax_admin" name="hmw_hideajax_admin" class="switch" <?php echo( HMW_Classes_Tools::getOption( 'hmw_hideajax_admin' ) ? 'checked="checked"' : '' ) ?> value="1"/>
290
+ <label for="hmw_hideajax_admin"><?php _e( 'Hide wp-admin from ajax URL', _HMW_PLUGIN_NAME_ ); ?></label>
291
+ <div class="offset-1 text-black-50"><?php echo sprintf( __( 'Show /%s instead of /%s', _HMW_PLUGIN_NAME_ ), HMW_Classes_Tools::getOption( 'hmw_admin-ajax_url' ), HMW_Classes_Tools::getOption( 'hmw_admin_url' ) . '/' . HMW_Classes_Tools::getOption( 'hmw_admin-ajax_url' ) ); ?></div>
292
+ <div class="offset-1 text-danger"><?php _e( 'Works only with the custom admin-ajax path to avoid infinite loops.', _HMW_PLUGIN_NAME_ ); ?></div>
293
+ </div>
294
+ </div>
295
+ </div>
296
+
297
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-1 my-3">
298
+ <div class="col-sm-4 p-0 font-weight-bold">
299
+ <?php _e( 'Custom wp-content Path', _HMW_PLUGIN_NAME_ ); ?>:
300
+ <div class="small text-black-50"><?php _e( 'eg. core, inc, include', _HMW_PLUGIN_NAME_ ); ?></div>
301
+ </div>
302
+ <div class="col-sm-8 p-0 input-group input-group-lg">
303
+ <input type="text" class="form-control bg-input" name="hmw_wp-content_url" value="<?php echo HMW_Classes_Tools::getOption( 'hmw_wp-content_url' ) ?>" placeholder="<?php echo HMW_Classes_Tools::$default['hmw_wp-content_url'] ?>"/>
304
+ <a href="https://hidemywpghost.com/kb/customize-paths-in-hide-my-wp-ghost/#customize_wpcontent" target="_blank" class="position-absolute float-right" style="right: 7px;top: 25%;"><i class="fa fa-question-circle"></i></a>
305
+ </div>
306
+ </div>
307
+
308
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-1 my-3">
309
+ <div class="col-sm-4 p-0 font-weight-bold">
310
+ <?php _e( 'Custom wp-includes Path', _HMW_PLUGIN_NAME_ ); ?>:
311
+ <div class="small text-black-50"><?php _e( 'eg. lib, library', _HMW_PLUGIN_NAME_ ); ?></div>
312
+ </div>
313
+ <div class="col-sm-8 p-0 input-group input-group-lg">
314
+ <input type="text" class="form-control bg-input" name="hmw_wp-includes_url" value="<?php echo HMW_Classes_Tools::getOption( 'hmw_wp-includes_url' ) ?>" placeholder="<?php echo HMW_Classes_Tools::$default['hmw_wp-includes_url'] ?>"/>
315
+ <a href="https://hidemywpghost.com/kb/customize-paths-in-hide-my-wp-ghost/#customize_wpincludes" target="_blank" class="position-absolute float-right" style="right: 7px;top: 25%;"><i class="fa fa-question-circle"></i></a>
316
+ </div>
317
+ </div>
318
+
319
+
320
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-1 my-3">
321
+ <div class="col-sm-4 p-0 font-weight-bold">
322
+ <?php _e( 'Custom uploads Path', _HMW_PLUGIN_NAME_ ); ?>:
323
+ <div class="small text-black-50"><?php _e( 'eg. images, files', _HMW_PLUGIN_NAME_ ); ?></div>
324
+ </div>
325
+ <?php if ( ! defined( 'UPLOADS' ) ) { ?>
326
+ <div class="col-sm-8 p-0 input-group input-group-lg">
327
+ <input type="text" class="form-control bg-input" name="hmw_upload_url" value="<?php echo HMW_Classes_Tools::getOption( 'hmw_upload_url' ) ?>" placeholder="<?php echo HMW_Classes_Tools::$default['hmw_upload_url'] ?>"/>
328
+ <a href="https://hidemywpghost.com/kb/customize-paths-in-hide-my-wp-ghost/#customize_uloads" target="_blank" class="position-absolute float-right" style="right: 7px;top: 25%;"><i class="fa fa-question-circle"></i></a>
329
+ </div>
330
+ <?php } else { ?>
331
+ <div class="col-sm-8 text-danger p-0">
332
+ <?php echo sprintf( __( "You already defined a different wp-content/uploads directory in wp-config.php %s", _HMW_PLUGIN_NAME_ ), ': <strong>' . UPLOADS . '</strong>' ); ?>
333
+ </div>
334
+ <?php } ?>
335
+ </div>
336
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-1 my-3">
337
+ <div class="col-sm-4 p-0 font-weight-bold">
338
+ <?php _e( 'Custom comment Path', _HMW_PLUGIN_NAME_ ); ?>:
339
+ <div class="small text-black-50"><?php _e( 'eg. comments, discussion', _HMW_PLUGIN_NAME_ ); ?></div>
340
+ </div>
341
+ <div class="col-sm-8 p-0 input-group input-group-lg">
342
+ <input type="text" class="form-control bg-input" name="hmw_wp-comments-post" value="<?php echo HMW_Classes_Tools::getOption( 'hmw_wp-comments-post' ) ?>" placeholder="<?php echo HMW_Classes_Tools::$default['hmw_wp-comments-post'] ?>"/>
343
+ <a href="https://hidemywpghost.com/kb/customize-paths-in-hide-my-wp-ghost/#customize_comments" target="_blank" class="position-absolute float-right" style="right: 7px;top: 25%;"><i class="fa fa-question-circle"></i></a>
344
+ </div>
345
+ </div>
346
+
347
+ <?php if ( ! HMW_Classes_Tools::isMultisites() && ! HMW_Classes_Tools::isNginx() && ! HMW_Classes_Tools::isWpengine() ) { ?>
348
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-1 my-3">
349
+ <div class="col-sm-4 p-0 font-weight-bold">
350
+ <?php _e( 'Custom author Path', _HMW_PLUGIN_NAME_ ); ?>:
351
+ <div class="small text-black-50"><?php _e( 'eg. profile, usr, writer', _HMW_PLUGIN_NAME_ ); ?></div>
352
+ </div>
353
+ <div class="col-sm-8 p-0 input-group input-group-lg">
354
+ <input type="text" class="form-control bg-input" name="hmw_author_url" value="<?php echo HMW_Classes_Tools::getOption( 'hmw_author_url' ) ?>" placeholder="<?php echo HMW_Classes_Tools::$default['hmw_author_url'] ?>"/>
355
+ <a href="https://hidemywpghost.com/kb/customize-paths-in-hide-my-wp-ghost/#customize_author" target="_blank" class="position-absolute float-right" style="right: 7px;top: 25%;"><i class="fa fa-question-circle"></i></a>
356
+ </div>
357
+ </div>
358
+ <?php } else { ?>
359
+ <input type="hidden" name="hmw_author_url" value="<?php echo HMW_Classes_Tools::$default['hmw_author_url'] ?>"/>
360
+ <?php } ?>
361
+ <div class="col-sm-12 row mb-1 ml-1">
362
+ <div class="box" data-toggle="popover" data-html="true" data-placement="top" data-content="<?php echo sprintf( __( 'This feature requires %sHide My WP Ghost%s.', _HMW_PLUGIN_NAME_ ), "<a href='https://hidemywpghost.com/hide-my-wp-pricing/' target='_blank'>", "</a>" ) ?>">
363
+ <div class="ribbon"><span><?php echo __( 'PRO', _HMW_PLUGIN_NAME_ ) ?></span></div>
364
+ </div>
365
+ <div class="checker col-sm-12 row my-2 py-1" style="opacity: 0.3">
366
+ <div class="col-sm-12 p-0 switch switch-sm">
367
+ <div class="hmw_pro"><img src="<?php echo _HMW_THEME_URL_ . 'img/pro.png' ?>">
368
+ </div>
369
+ <label for="hmw_hide_authors"><?php _e( 'Hide Author ID URL', _HMW_PLUGIN_NAME_ ); ?></label>
370
+ <div class="offset-1 text-black-50"><?php _e( "Don't let URLs like domain.com?author=1 show the user login name", _HMW_PLUGIN_NAME_ ); ?></div>
371
+ </div>
372
+ </div>
373
+ </div>
374
+
375
+ </div>
376
+ </div>
377
+ <div class="card col-sm-12 p-0 tab-panel" <?php echo( ( HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'default' ) ? 'style="display:none"' : '' ) ?>>
378
+ <h3 class="card-title bg-brown text-white p-2"><?php _e( 'Plugin Settings', _HMW_PLUGIN_NAME_ ); ?>:</h3>
379
+ <div class="card-body">
380
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-1 my-3">
381
+ <div class="col-sm-4 p-0 font-weight-bold">
382
+ <?php _e( 'Custom plugins Path', _HMW_PLUGIN_NAME_ ); ?>:
383
+ <div class="small text-black-50"><?php _e( 'eg. modules', _HMW_PLUGIN_NAME_ ); ?></div>
384
+ </div>
385
+ <div class="col-sm-8 p-0 input-group input-group-lg">
386
+ <input type="text" class="form-control bg-input" name="hmw_plugin_url" value="<?php echo HMW_Classes_Tools::getOption( 'hmw_plugin_url' ) ?>" placeholder="<?php echo HMW_Classes_Tools::$default['hmw_plugin_url'] ?>"/>
387
+ <a href="https://hidemywpghost.com/kb/customize-paths-in-hide-my-wp-ghost/#customize_plugins" target="_blank" class="position-absolute float-right" style="right: 7px;top: 25%;"><i class="fa fa-question-circle"></i></a>
388
+ </div>
389
+ </div>
390
+ <div class="col-sm-12 row mb-1 ml-1">
391
+ <div class="checker col-sm-12 row my-2 py-1">
392
+ <div class="col-sm-12 p-0 switch switch-sm">
393
+ <input type="hidden" name="hmw_hide_plugins" value="0"/>
394
+ <input type="checkbox" id="hmw_hide_plugins" name="hmw_hide_plugins" class="switch" <?php echo( HMW_Classes_Tools::getOption( 'hmw_hide_plugins' ) ? 'checked="checked"' : '' ) ?> value="1"/>
395
+ <label for="hmw_hide_plugins"><?php _e( 'Hide plugin names', _HMW_PLUGIN_NAME_ ); ?></label>
396
+ <div class="offset-1 text-black-50"><?php _e( 'Give random names to each plugin', _HMW_PLUGIN_NAME_ ); ?></div>
397
+ </div>
398
+ </div>
399
+ </div>
400
+ </div>
401
+ </div>
402
+ <div class="card col-sm-12 p-0 tab-panel" <?php echo( ( HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'default' ) ? 'style="display:none"' : '' ) ?>>
403
+ <h3 class="card-title bg-brown text-white p-2"><?php _e( 'Theme Settings', _HMW_PLUGIN_NAME_ ); ?>:</h3>
404
+ <div class="card-body">
405
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-1 my-3">
406
+ <div class="col-sm-4 p-0 font-weight-bold">
407
+ <?php _e( 'Custom themes Path', _HMW_PLUGIN_NAME_ ); ?>:
408
+ <div class="small text-black-50"><?php _e( 'eg. assets, templates, styles', _HMW_PLUGIN_NAME_ ); ?></div>
409
+ </div>
410
+ <div class="col-sm-8 p-0 input-group input-group-lg">
411
+ <input type="text" class="form-control bg-input" name="hmw_themes_url" value="<?php echo HMW_Classes_Tools::getOption( 'hmw_themes_url' ) ?>" placeholder="<?php echo HMW_Classes_Tools::$default['hmw_themes_url'] ?>"/>
412
+ <a href="https://hidemywpghost.com/kb/customize-paths-in-hide-my-wp-ghost/#customize_themes" target="_blank" class="position-absolute float-right" style="right: 7px;top: 25%;"><i class="fa fa-question-circle"></i></a>
413
+ </div>
414
+ </div>
415
+
416
+ <div style="position: relative">
417
+ <div>
418
+ <div class="col-sm-12 row mb-1 ml-1">
419
+ <div class="checker col-sm-12 row my-2 py-1">
420
+ <div class="col-sm-12 p-0 switch switch-sm">
421
+ <input type="hidden" name="hmw_hide_themes" value="0"/>
422
+ <input type="checkbox" id="hmw_hide_themes" name="hmw_hide_themes" class="switch" <?php echo( HMW_Classes_Tools::getOption( 'hmw_hide_themes' ) ? 'checked="checked"' : '' ) ?> value="1"/>
423
+ <label for="hmw_hide_themes"><?php _e( 'Hide theme names', _HMW_PLUGIN_NAME_ ); ?></label>
424
+ <div class="offset-1 text-black-50"><?php _e( 'Give random names to each theme (works in WP multisite)', _HMW_PLUGIN_NAME_ ); ?></div>
425
+ </div>
426
+ </div>
427
+ </div>
428
+
429
+
430
+ </div>
431
+ </div>
432
+ </div>
433
+ </div>
434
+ <div class="card col-sm-12 p-0 tab-panel" <?php echo( ( HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'default' ) ? 'style="display:none"' : '' ) ?>>
435
+ <h3 class="card-title bg-brown text-white p-2"><?php _e( 'REST API Settings', _HMW_PLUGIN_NAME_ ); ?>:</h3>
436
+ <div class="card-body">
437
+ <div class="box" data-toggle="popover" data-html="true" data-placement="top" data-content="<?php echo sprintf( __( 'This feature requires %sHide My WP Ghost%s.', _HMW_PLUGIN_NAME_ ), "<a href='https://hidemywpghost.com/hide-my-wp-pricing/' target='_blank'>", "</a>" ) ?>">
438
+ <div class="ribbon"><span><?php echo __( 'PRO', _HMW_PLUGIN_NAME_ ) ?></span></div>
439
+ </div>
440
+ <div style="opacity: 0.3">
441
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-1 my-3">
442
+ <div class="col-sm-4 p-0 font-weight-bold">
443
+ <?php _e( 'Custom wp-json Path', _HMW_PLUGIN_NAME_ ); ?>:
444
+ <div class="small text-black-50"><?php _e( 'eg. json, api, call', _HMW_PLUGIN_NAME_ ); ?></div>
445
+ </div>
446
+ <div class="col-sm-8 p-0 input-group input-group-lg" style="opacity: 0.3">
447
+ <input type="text" class="form-control bg-input"/>
448
+ </div>
449
+ </div>
450
+
451
+ <div class="col-sm-12 row mb-1 ml-1">
452
+ <div class="checker col-sm-12 row my-2 py-1">
453
+ <div class="col-sm-12 p-0 switch switch-sm">
454
+ <div class="hmw_pro">
455
+ <img src="<?php echo _HMW_THEME_URL_ . 'img/pro.png' ?>">
456
+ </div>
457
+ <label for="hmw_disable_rest_api"><?php _e( 'Disable Rest API access', _HMW_PLUGIN_NAME_ ); ?></label>
458
+ <div class="offset-1 text-black-50"><?php _e( "Disable Rest API access if you don't use your website for API calls", _HMW_PLUGIN_NAME_ ); ?></div>
459
+ </div>
460
+ </div>
461
+ </div>
462
+ </div>
463
+ </div>
464
+ </div>
465
+ <div class="card col-sm-12 p-0 tab-panel" <?php echo( ( HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'default' ) ? 'style="display:none"' : '' ) ?>>
466
+ <h3 class="card-title bg-brown text-white p-2"><?php _e( 'Security Settings', _HMW_PLUGIN_NAME_ ); ?>:</h3>
467
+ <div class="card-body">
468
+ <div class="box" data-toggle="popover" data-html="true" data-placement="top" data-content="<?php echo sprintf( __( 'This feature requires %sHide My WP Ghost%s.', _HMW_PLUGIN_NAME_ ), "<a href='https://hidemywpghost.com/hide-my-wp-pricing/' target='_blank'>", "</a>" ) ?>">
469
+ <div class="ribbon"><span><?php echo __( 'PRO', _HMW_PLUGIN_NAME_ ) ?></span></div>
470
+ </div>
471
+ <div style="opacity: 0.3">
472
+ <div class="col-sm-12 row mb-1 ml-1">
473
+ <div class="checker col-sm-12 row my-2 py-1">
474
+ <div class="col-sm-12 p-0 switch switch-sm">
475
+ <div class="hmw_pro">
476
+ <img src="<?php echo _HMW_THEME_URL_ . 'img/pro.png' ?>">
477
+ </div>
478
+ <label for="hmw_hide_oldpaths"><?php _e( 'Hide WordPress Common Paths', _HMW_PLUGIN_NAME_ ); ?></label>
479
+ <div class="offset-1 text-black-50"><?php _e( 'Hide /wp-content, /wp-include, /plugins, /themes paths', _HMW_PLUGIN_NAME_ ); ?></div>
480
+ <div class="offset-1 text-black-50"><?php _e( 'Hide upgrade.php and install.php for visitors', _HMW_PLUGIN_NAME_ ); ?></div>
481
+ <div class="offset-1 text-black-50"><?php _e( '(this may affect the fonts and images loaded through CSS)', _HMW_PLUGIN_NAME_ ); ?></div>
482
+ </div>
483
+ </div>
484
+ </div>
485
+ <div class="col-sm-12 row mb-1 ml-1">
486
+ <div class="checker col-sm-12 row my-2 py-1">
487
+ <div class="col-sm-12 p-0 switch switch-sm">
488
+ <div class="hmw_pro">
489
+ <img src="<?php echo _HMW_THEME_URL_ . 'img/pro.png' ?>">
490
+ </div>
491
+ <label for="hmw_hide_commonfiles"><?php _e( 'Hide WordPress Common Files', _HMW_PLUGIN_NAME_ ); ?></label>
492
+ <div class="offset-1 text-black-50"><?php _e( 'Hide wp-config.php , wp-config-sample.php, readme.html, license.txt files', _HMW_PLUGIN_NAME_ ); ?></div>
493
+ </div>
494
+ </div>
495
+ </div>
496
+
497
+ <?php if ( HMW_Classes_Tools::isNginx() || HMW_Classes_Tools::isApache() || HMW_Classes_Tools::isLitespeed() ) { ?>
498
+
499
+ <div class="col-sm-12 row mb-1 ml-1">
500
+ <div class="checker col-sm-12 row my-2 py-1">
501
+ <div class="col-sm-12 p-0 switch switch-sm">
502
+ <div class="hmw_pro">
503
+ <img src="<?php echo _HMW_THEME_URL_ . 'img/pro.png' ?>"></div>
504
+ <label for="hmw_sqlinjection"><?php _e( 'Firewall Against Script Injection', _HMW_PLUGIN_NAME_ ); ?></label>
505
+ <div class="offset-1 text-black-50"><?php echo __( 'Most WordPress installations are hosted on the popular Apache, Nginx and IIS web servers.', _HMW_PLUGIN_NAME_ ); ?></div>
506
+ <div class="offset-1 text-black-50"><?php echo __( 'A thorough set of rules can prevent many types of SQL Injection and URL hacks from being interpreted.', _HMW_PLUGIN_NAME_ ); ?></div>
507
+ </div>
508
+ </div>
509
+ </div>
510
+
511
+ <div class="col-sm-12 row mb-1 ml-1">
512
+ <?php $uploads = wp_upload_dir(); ?>
513
+ <div class="checker col-sm-12 row my-2 py-1">
514
+ <div class="col-sm-12 p-0 switch switch-sm">
515
+ <div class="hmw_pro">
516
+ <img src="<?php echo _HMW_THEME_URL_ . 'img/pro.png' ?>"></div>
517
+ <label for="hmw_disable_browsing"><?php _e( 'Disable Directory Browsing', _HMW_PLUGIN_NAME_ ); ?></label>
518
+ <div class="offset-1 text-black-50"><?php echo sprintf( __( "Don't let hackers see any directory content. See %sUploads Directory%s", _HMW_PLUGIN_NAME_ ), '<a href="' . $uploads['baseurl'] . '" target="_blank">', '</a>' ); ?></div>
519
+ </div>
520
+ </div>
521
+ </div>
522
+
523
+ <?php } ?>
524
+ </div>
525
+ </div>
526
+ </div>
527
+ <div class="card col-sm-12 p-0 tab-panel" <?php echo( ( HMW_Classes_Tools::getOption( 'hmw_mode' ) == 'default' ) ? 'style="display:none"' : '' ) ?>>
528
+ <div class="card-body">
529
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-1 my-3">
530
+ <div class="col-sm-4 p-0 font-weight-bold">
531
+ <?php _e( 'Custom category Path', _HMW_PLUGIN_NAME_ ); ?>:
532
+ <div class="small text-black-50"><?php _e( 'eg. cat, dir, list', _HMW_PLUGIN_NAME_ ); ?></div>
533
+ </div>
534
+ <div class="col-sm-8 p-0 input-group input-group-lg">
535
+ <input type="text" class="form-control bg-input" name="hmw_category_base" value="<?php echo HMW_Classes_Tools::getOption( 'hmw_category_base' ) ?>" placeholder="<?php echo HMW_Classes_Tools::$default['hmw_category_base'] ?>"/>
536
+ </div>
537
+ </div>
538
+
539
+ <div class="col-sm-12 row border-bottom border-light py-3 mx-1 my-3">
540
+ <div class="col-sm-4 p-0 font-weight-bold">
541
+ <?php _e( 'Custom tags Path', _HMW_PLUGIN_NAME_ ); ?>:
542
+ <div class="small text-black-50"><?php _e( 'eg. keyword, topic', _HMW_PLUGIN_NAME_ ); ?></div>
543
+ </div>
544
+ <div class="col-sm-8 p-0 input-group input-group-lg">
545
+ <input type="text" class="form-control" name="hmw_tag_base" value="<?php echo HMW_Classes_Tools::getOption( 'hmw_tag_base' ) ?>" placeholder="<?php echo HMW_Classes_Tools::$default['hmw_tag_base'] ?>"/>
546
+ </div>
547
+ </div>
548
+ </div>
549
+ </div>
550
+
551
+
552
+ <?php if ( HMW_Classes_Tools::getOption( 'test_frontend' ) || HMW_Classes_Tools::getOption( 'logout' ) || HMW_Classes_Tools::getOption( 'error' ) ) { ?>
553
+ <div class="col-sm-12 m-0 p-2">
554
+ <button type="submit" class="btn rounded-0 btn-success btn-lg px-5 mr-5 save"><?php _e( 'Save', _HMW_PLUGIN_NAME_ ); ?></button>
555
+ <a href="https://wordpress.org/support/plugin/hide-my-wp/reviews/?rate=5#new-post" target="_blank" style="color: #ff005e;"><?php echo sprintf( __( 'Love Hide My WP %s? Show us ;)', _HMW_PLUGIN_NAME_ ), _HMW_VER_NAME_ ); ?></a>
556
+ </div>
557
+ <?php } else { ?>
558
+ <div class="col-sm-12 m-0 p-2 bg-light text-center" style="position: fixed; bottom: 0; right: 0; z-index: 100; box-shadow: 0px 0px 8px -3px #444;">
559
+ <button type="submit" class="btn rounded-0 btn-success btn-lg px-5 mr-5 save"><?php _e( 'Save', _HMW_PLUGIN_NAME_ ); ?></button>
560
+ <a href="https://wordpress.org/support/plugin/hide-my-wp/reviews/?rate=5#new-post" target="_blank" style="color: #ff005e;"><?php echo sprintf( __( 'Love Hide My WP %s? Show us ;)', _HMW_PLUGIN_NAME_ ), _HMW_VER_NAME_ ); ?></a>
561
+ </div>
562
+ <?php } ?>
563
+ </form>
564
+ </div>
565
+ <div class="hmw_col hmw_col_side">
566
+ <div class="card col-sm-12 p-0">
567
+ <div class="card-body f-gray-dark text-center">
568
+ <h3 class="card-title"><?php _e( 'Check Your Website', _HMW_PLUGIN_NAME_ ); ?></h3>
569
+ <div class="card-text text-muted">
570
+ <?php echo __( 'Check if your website is secured with the current settings.', _HMW_PLUGIN_NAME_ ) ?>
571
+ </div>
572
+ <div class="card-text text-info m-3">
573
+ <a href="<?php echo HMW_Classes_Tools::getSettingsUrl( 'hmw_securitycheck' ) ?>" class="btn rounded-0 btn-warning btn-lg text-white px-5 securitycheck"><?php _e( 'Security Check', _HMW_PLUGIN_NAME_ ); ?></a>
574
+ </div>
575
+ <div class="card-text text-muted small">
576
+ <?php echo __( 'Make sure you save the settings and empty the cache before checking your website with our tool.', _HMW_PLUGIN_NAME_ ) ?>
577
+ </div>
578
+
579
+ <div class="card-text m-3 ">
580
+ <a class="bigbutton text-center" href="https://hidemywpghost.com/knowledge-base/" target="_blank"><?php echo __( "Learn more about Hide My WP", _HMW_PLUGIN_NAME_ ); ?></a>
581
+ </div>
582
+ </div>
583
+ </div>
584
+
585
+ <div class="card col-sm-12 p-0">
586
+ <div class="card-body f-gray-dark text-center">
587
+ <h3 class="card-title"><?php echo __( 'Love Hide My WP?', _HMW_PLUGIN_NAME_ ); ?></h3>
588
+ <div class="card-text text-muted">
589
+ <h1>
590
+ <a href="https://wordpress.org/support/plugin/hide-my-wp/reviews/?rate=5#new-post" target="_blank" style="font-size: 80px"><i class="fa fa-heart text-danger"></i></a>
591
+ </h1>
592
+ <?php echo __( 'Please help us and support our plugin on WordPress.org', _HMW_PLUGIN_NAME_ ) ?>
593
+ </div>
594
+ <div class="card-text text-info m-3">
595
+ <a href="https://wordpress.org/support/plugin/hide-my-wp/reviews/?rate=5#new-post" target="_blank" class="btn rounded-0 btn-success btn-lg px-4"><?php echo __( 'Rate Hide My WP', _HMW_PLUGIN_NAME_ ); ?></a>
596
+ </div>
597
+ <div class="card-text text-muted">
598
+ <?php echo __( 'Contact us after you left the review cause we have a surprise for you.', _HMW_PLUGIN_NAME_ ) ?>
599
+ <h1>
600
+ <a href="https://hidemywpghost.com/contact/" target="_blank" style="font-size: 80px"><i class="fa fa-gift text-info"></i></a>
601
+ </h1>
602
+ </div>
603
+ </div>
604
+ </div>
605
+
606
+ <?php echo $view->getView( 'Support' ) ?>
607
+
608
+ </div>
609
+ </div>
610
+ </div>
611
+ <?php }
view/Plugins.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="hmw_wrap" class="d-flex flex-row my-3 bg-light">
2
+ <?php echo $view->getAdminTabs(HMW_Classes_Tools::getValue('tab', 'hmw_permalinks')); ?>
3
+ <div class="hmw_row d-flex flex-row bg-white px-3">
4
+ <div class="hmw_col row justify-content-center flex-grow-1">
5
+ <?php foreach ($view->plugins as $name => $plugin) { ?>
6
+ <div class="card p-0 col-sm-5 mt-3 m-1">
7
+ <div class="card-body pt-3 px-3 pb-0">
8
+ <h3 class="card-title my-2"><a href="<?php echo $plugin['url']; ?>" class="text-link" target="_blank"><?php echo $plugin['title']; ?></a></h3>
9
+ <div class="card-text">
10
+ <a href="<?php echo $plugin['url']; ?>" target="_blank">
11
+ <img class="col-sm-12 p-0" src="<?php echo $plugin['banner']; ?>" style="max-height: 94px;">
12
+ </a>
13
+ </div>
14
+ <div class="card-text small text-secondary my-2" style="min-height: 120px;"><?php echo $plugin['description']; ?></div>
15
+ <div class="card-footer row text-right">
16
+ <a href="<?php echo $plugin['url']; ?>" class="btn rounded-0 btn-light" target="_blank"><?php _e('More details', _HMW_PLUGIN_NAME_) ?></a>
17
+ <?php if (!HMW_Classes_Tools::isPluginActive($plugin['path'])) { ?>
18
+ <a href="<?php echo $plugin['url']; ?>" target="_blank" class="btn rounded-0 btn-info"><?php _e('Go To Plugin', _HMW_PLUGIN_NAME_) ?></a>
19
+ <?php } else { ?>
20
+ <button class="btn rounded-0 plugin btn-default" disabled><?php _e('Plugin Installed', _HMW_PLUGIN_NAME_) ?></button>
21
+ <?php } ?>
22
+ </div>
23
+ </div>
24
+ </div>
25
+ <?php } ?>
26
+
27
+ </div>
28
+ <div class="hmw_col hmw_col_side">
29
+ <div class="card col-sm-12 p-0 mt-3">
30
+ <div class="card-body f-gray-dark text-left">
31
+ <h3 class="panel-title"><?php _e('Plugins', _HMW_PLUGIN_NAME_); ?></h3>
32
+ <div class="text-info mt-3"><?php echo __("We are testing every week the latest version of these plugins and <strong>we make sure they are working with Hide My WP</strong> plugin.
33
+ <br /><br />You don't need to install all these plugin in your website. If you're already using a cache plugin you don't need to install another one. <strong>We recommend using only one cache plugin</strong>.
34
+ <br /><br />You can also install either <strong>iThemes Security</strong> plugin or <strong>Sucuri Security</strong> plugin to work with Hide My Wp plugin.
35
+ <br /><br />If your plugins directory is not writable you will need to install the plugins manually.", _HMW_PLUGIN_NAME_); ?>
36
+ </div>
37
+ </div>
38
+ </div>
39
+
40
+ <?php echo $view->getView('Support') ?>
41
+
42
+ </div>
43
+ </div>
44
+ </div>
view/SecurityCheck.php ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="hmw_wrap" class="d-flex flex-row my-3 bg-light">
2
+ <?php echo HMW_Classes_ObjController::getClass('HMW_Controllers_Settings')->getAdminTabs('hmw_securitycheck'); ?>
3
+ <div class="hmw_row d-flex flex-row bg-white px-3">
4
+ <div class="hmw_col flex-grow-1 mr-3">
5
+ <div class="card col-sm-12 p-0">
6
+ <h3 class="card-title bg-brown text-white p-2"><?php _e('WordPress Security Check', _HMW_PLUGIN_NAME_); ?>:</h3>
7
+ <div class="card-body">
8
+ <?php if (HMW_Classes_Tools::getOption('api_token') <> '') { ?>
9
+ <div class="col-sm-12 my-0 text-center">
10
+ <a href="<?php echo _HMW_ACCOUNT_SITE_ . '/api/auth/' . HMW_Classes_Tools::getOption('api_token') ?>" target="_blank"><img src="<?php echo _HMW_THEME_URL_ . 'img/monitor_panel.png' ?>" style="width: 100%; max-width: 800px;"/></a>
11
+ </div>
12
+ <?php } ?>
13
+ <div class="col-sm-12 border-bottom border-light py-3 m-0">
14
+ <div class="card col-sm-12 p-4 bg-light ">
15
+ <div class="card-body text-center p-0">
16
+ <div class="start_securitycheck">
17
+ <?php if(!empty($view->riskreport)) { ?>
18
+ <div class="row">
19
+ <div class="col-sm-5" style="text-align: center">
20
+ <?php if (((count($view->riskreport) * 100) / count($view->risktasks)) > 90) { ?>
21
+ <img src="<?php echo _HMW_THEME_URL_ . 'img/speedometer_danger.png' ?>" style="max-width: 60%; margin: 10px auto;"/>
22
+ <div style="font-size: 14px; font-style: italic; text-align: center; color: red;"><?php echo sprintf(__("Your website security %sis extremely weak%s. %sMany hacking doors are available.", _HMW_PLUGIN_NAME_), '<strong>', '</strong>', '<br />') ?></div>
23
+ <?php } elseif (((count($view->riskreport) * 100) / count($view->risktasks)) > 50) { ?>
24
+ <img src="<?php echo _HMW_THEME_URL_ . 'img/speedometer_low.png' ?>" style="max-width: 60%; margin: 10px auto;"/>
25
+ <div style="font-size: 14px; font-style: italic; text-align: center; color: red;"><?php echo sprintf(__("Your website security %sis very weak%s. %sMany hacking doors are available.", _HMW_PLUGIN_NAME_), '<strong>', '</strong>', '<br />') ?></div>
26
+ <?php } elseif (((count($view->riskreport) * 100) / count($view->risktasks)) > 0) { ?>
27
+ <img src="<?php echo _HMW_THEME_URL_ . 'img/speedometer_medium.png' ?>" style="max-width: 60%; margin: 10px auto;"/>
28
+ <div style="font-size: 14px; font-style: italic; text-align: center; color: orangered;"><?php echo sprintf(__("Your website security is still weak. %sSome of the main hacking doors are still available.", _HMW_PLUGIN_NAME_), '<br />') ?></div>
29
+ <?php } else { ?>
30
+ <img src="<?php echo _HMW_THEME_URL_ . 'img/speedometer_high.png' ?>" style="max-width: 60%; margin: 10px auto;"/>
31
+ <div style="font-size: 14px; font-style: italic; text-align: center; color: green;"><?php echo sprintf(__("Your website security is strong. %sKeep checking the security every week.", _HMW_PLUGIN_NAME_), '<br />') ?></div>
32
+ <?php } ?>
33
+ </div>
34
+ <div class="col-sm-7 my-4">
35
+ <button type="button" class="btn rounded-0 btn-warning btn-lg text-white px-5 "><?php _e('Start Scan', _HMW_PLUGIN_NAME_); ?></button>
36
+ <?php
37
+ if (!empty($view->report)) {
38
+ $overview = array('success' => 0, 'warning' => 0, 'total' => 0);
39
+ foreach ($view->report as $row) {
40
+ $overview['success'] += (int)$row['valid'];
41
+ $overview['warning'] += (int)$row['warning'];
42
+ $overview['total'] += 1;
43
+ }
44
+ echo '<table class="offset-2 col-sm-8 mt-3 mb-0">';
45
+ echo '<tbody>';
46
+ echo '
47
+ <tr>
48
+ <td class="text-success border-right"><h6>' . __('Passed', _HMW_PLUGIN_NAME_) . '</h6><h2>' . $overview['success'] . '</h2></td>
49
+ <td class="text-danger"><h6>' . __('Failed', _HMW_PLUGIN_NAME_) . '</h6><h2>' . ($overview['total'] - $overview['success']) . '</h2></td>
50
+ </tr>';
51
+ echo '</tbody>';
52
+ echo '</table>';
53
+
54
+ if (($overview['total'] - $overview['success']) == 0) { ?>
55
+ <div class="text-center text-success font-weight-bold mt-4"><?php echo __("Congratulations! You completed all the security tasks. Make sure you check your site once a week.", _HMW_PLUGIN_NAME_) ?></div>
56
+ <?php
57
+ }
58
+ }
59
+ ?>
60
+ </div>
61
+ </div>
62
+ <?php }else{?>
63
+ <button type="button" class="btn rounded-0 btn-warning btn-lg text-white px-5 "><?php _e('Start Scan', _HMW_PLUGIN_NAME_); ?></button>
64
+ <?php }?>
65
+
66
+ <div class="text-center small text-black-50 mt-4"><?php echo sprintf(__("According to %sGoogle latest stats%s, over %s20k websites are hacked every week%s and over %s30&#37; of them are made in WordPress%s. <br />It's %sbetter to prevent an attack%s than to spend a lot of money and time to recover your data after an attack not to mention the situation when your clients' data are stollen.", _HMW_PLUGIN_NAME_), '<a href="https://transparencyreport.google.com/safe-browsing/overview" target="_blank">', '</a>','<strong>','</strong>','<strong>','</strong>','<strong>','</strong>') ?></div>
67
+ <?php if (isset($view->securitycheck_time['timestamp'])) { ?>
68
+ <div class="text-center text-info my-2 font-italic" style="font-size: 12px">
69
+ <strong><?php _e('Last check:', _HMW_PLUGIN_NAME_); ?></strong> <?php echo date(get_option('date_format') . ' ' . get_option('time_format'), ($view->securitycheck_time['timestamp'] + (get_option('gmt_offset') * HOUR_IN_SECONDS))); ?>
70
+ </div>
71
+ <?php } ?>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ <div class="col-sm-12 mt-3 p-0 input-group">
76
+ <?php
77
+ if (!empty($view->report)) {
78
+ echo '<table class="table table-striped table_securitycheck">';
79
+ echo '
80
+ <thead>
81
+ <tr>
82
+ <th scope="col">' . __('Name', _HMW_PLUGIN_NAME_) . '</th>
83
+ <th scope="col">' . __('Value', _HMW_PLUGIN_NAME_) . '</th>
84
+ <th scope="col">' . __('Valid', _HMW_PLUGIN_NAME_) . '</th>
85
+ <th scope="col">' . __('Action', _HMW_PLUGIN_NAME_) . '</th>
86
+ </tr>
87
+ </thead>';
88
+
89
+ echo '<tbody>';
90
+ foreach ($view->report as $index => $row) {
91
+ echo '
92
+ <tr>
93
+ <td style="min-width: 250px">' . $row['name'] . '</td>
94
+ <td style="min-width: 200px; max-width: 250px; font-weight: bold">' . $row['value'] . '</td>
95
+ <td class="' . ($row['valid'] ? 'text-success' : 'text-danger') . '">' . ($row['valid'] ? '<i class="fa fa-check mx-2"></i>' : '<i class="fa fa-times mx-2"></i>' . (isset($row['solution']) ? $row['solution'] : '')) . '</td>
96
+ <td style="min-width: 180px; padding-right: 0!important;" >
97
+ <div class="modal fade" id="hmw_securitydetail' . $index . '" tabindex="-1" role="dialog" aria-hidden="true">
98
+ <div class="modal-dialog modal-lg" role="document">
99
+ <div class="modal-content">
100
+ <div class="modal-header">
101
+ <h5 class="modal-title" id="exampleModalLabel">' . $row['name'] . '</h5>
102
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
103
+ <span aria-hidden="true">&times;</span>
104
+ </button>
105
+ </div>
106
+ <div class="modal-body">' . $row['message'] . '</div>
107
+ </div>
108
+ </div>
109
+ </div>
110
+ <button class="btn btn-default" type="button" data-toggle="modal" data-target="#hmw_securitydetail' . $index . '">' . __('Info', _HMW_PLUGIN_NAME_) . '</button>
111
+ ' . ((!$row['valid'] && isset($row['javascript']) && $row['javascript'] <> '') ? (isset($row['pro']) ? $row['pro'] : '<button class="btn btn-success mx-0" onclick="' . $row['javascript'] . '">' . __('Fix it', _HMW_PLUGIN_NAME_) . '</button>') : '') . '
112
+ <button type="button" class="close m-1" aria-label="Close" style="display: none" onclick="if (confirm(\'' . __('Are you sure you want to ignore this task in the future?') . '\')) {jQuery(this).hmw_securityExclude(\'' . $index . '\');}">
113
+ <span aria-hidden="true">&times;</span>
114
+ </button>
115
+ </td>
116
+ </tr>';
117
+ }
118
+ echo '</tbody>';
119
+ echo '</table>';
120
+
121
+ }
122
+ ?>
123
+ </div>
124
+ <div class="col-sm-12 text-right">
125
+ <button class="btn btn-default hmw_resetexclude" type="button"><?php echo __('Reset all ingnored tasks', _HMW_PLUGIN_NAME_) ?></button>
126
+ </div>
127
+ </div>
128
+ <?php if (!HMW_Classes_Tools::getOption('api_token') <> '') { ?>
129
+ <div class="col-sm-12 border-bottom border-light py-3 mx-0 my-3">
130
+ <div class="card col-sm-12 p-0 input-group">
131
+ <div class="card-body text-center">
132
+ <a href="https://wpplugins.tips/wordpress-vulnerability-detector/?url=<?php echo urlencode(home_url()) ?>" target="_blank"><img src="<?php echo _HMW_THEME_URL_ . 'img/security_check.png' ?>" style="width: 100%"></a>
133
+ </div>
134
+ </div>
135
+ </div>
136
+ <?php } ?>
137
+ </div>
138
+ </div>
139
+ </div>
140
+
141
+ </div>
142
+ </div>
view/Support.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="card col-sm-12 p-0">
2
+ <div class="card-body f-gray-dark text-center">
3
+ <h3 class="card-title"><?php _e('Need Help?', _HMW_PLUGIN_NAME_); ?></h3>
4
+ <form id="hmw_support">
5
+ <div class="card-text my-2 text-muted">
6
+ <?php echo sprintf(__("Read the plugin tutorial and how to setup every feature %sRead Hide My WP Tutorial%s", _HMW_PLUGIN_NAME_),'<br /><a href="https://hidemywpghost.com/kb/hide-my-wp-ghost-tutorial/" target="_blank"><strong>','</strong></a>') ?>
7
+ <br /><br />
8
+ <?php echo sprintf(__("You can also email us on %scontact@wpplugins.tips%s and we are happy to answer any question or suggestion you may have and we aim to respond within 24 hours.", _HMW_PLUGIN_NAME_),'<a href="mailto:contact@wpplugins.tips" target="_blank">','</a>') ?>
9
+ </div>
10
+
11
+ </form>
12
+
13
+ </div>
14
+ </div>
view/Tweaks.php ADDED
@@ -0,0 +1,213 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="hmw_wrap" class="d-flex flex-row my-3 bg-light">
2
+ <?php echo $view->getAdminTabs( HMW_Classes_Tools::getValue( 'tab', 'hmw_permalinks' ) ); ?>
3
+ <div class="hmw_row d-flex flex-row bg-white px-3">
4
+ <div class="hmw_col flex-grow-1 mr-3">
5
+ <form method="POST">
6
+ <?php wp_nonce_field( 'hmw_tweakssettings', 'hmw_nonce' ) ?>
7
+ <input type="hidden" name="action" value="hmw_tweakssettings"/>
8
+
9
+ <div class="card col-sm-12 p-0 tab-panel">
10
+ <h3 class="card-title bg-brown text-white p-2"><?php _e( 'Change Options', _HMW_PLUGIN_NAME_ ); ?>:</h3>
11
+ <div class="card-body">
12
+
13
+ <div class="col-sm-12 row mb-1 ml-1">
14
+ <div class="checker col-sm-12 row my-2 py-1">
15
+ <div class="col-sm-12 p-0 switch switch-sm">
16
+ <input type="hidden" name="hmw_hide_loggedusers" value="0"/>
17
+ <input type="checkbox" id="hmw_hide_loggedusers" name="hmw_hide_loggedusers" class="switch" <?php echo( HMW_Classes_Tools::getOption( 'hmw_hide_loggedusers' ) ? 'checked="checked"' : '' ) ?> value="1"/>
18
+ <label for="hmw_hide_loggedusers"><?php _e( 'Change Paths for Logged Users', _HMW_PLUGIN_NAME_ ); ?></label>
19
+ <a href="https://hidemywpghost.com/kb/activate-security-tweaks/#change_paths_logged_users" target="_blank" class="d-inline-block ml-2"><i class="fa fa-question-circle"></i></a>
20
+ <div class="offset-1 text-black-50"><?php _e( "Change WordPress paths while you're logged in", _HMW_PLUGIN_NAME_ ); ?></div>
21
+ <div class="offset-1 text-black-50"><?php _e( "(not recommended, may affect other plugins functionality in admin)", _HMW_PLUGIN_NAME_ ); ?></div>
22
+ </div>
23
+ </div>
24
+ </div>
25
+
26
+ <div class="col-sm-12 row mb-1 ml-1">
27
+ <div class="box" data-toggle="popover" data-html="true" data-placement="top" data-content="<?php echo sprintf( __( 'This feature requires %sHide My WP Ghost%s.', _HMW_PLUGIN_NAME_ ), "<a href='https://hidemywpghost.com/hide-my-wp-pricing/' target='_blank'>", "</a>" ) ?>">
28
+ <div class="ribbon"><span><?php echo __( 'PRO', _HMW_PLUGIN_NAME_ ) ?></span></div>
29
+ </div>
30
+ <div class="checker col-sm-12 row my-2 py-1" style="opacity: 0.3">
31
+ <div class="col-sm-12 p-0 switch switch-sm">
32
+ <div class="hmw_pro">
33
+ <img src="<?php echo _HMW_THEME_URL_ . 'img/pro.png' ?>"></div>
34
+
35
+ <label for="hmw_in_dashboard"><?php _e( 'Change Paths in Cached Files', _HMW_PLUGIN_NAME_ ); ?></label>
36
+ <div class="offset-1 text-black-50"><?php _e( 'Change the WordPress common paths in the cached files from /wp-content/cache directory', _HMW_PLUGIN_NAME_ ); ?></div>
37
+ <div class="offset-1 text-black-50"><?php _e( '(this feature runs in background and needs up to one minute after every cache purged)', _HMW_PLUGIN_NAME_ ); ?></div>
38
+ </div>
39
+ </div>
40
+ </div>
41
+
42
+
43
+ <div class="col-sm-12 row mb-1 ml-1">
44
+ <div class="checker col-sm-12 row my-2 py-1">
45
+ <div class="col-sm-12 p-0 switch switch-sm">
46
+ <input type="hidden" name="hmw_hideajax_paths" value="0"/>
47
+ <input type="checkbox" id="hmw_hideajax_paths" name="hmw_hideajax_paths" class="switch" <?php echo( HMW_Classes_Tools::getOption( 'hmw_hideajax_paths' ) ? 'checked="checked"' : '' ) ?> value="1"/>
48
+ <label for="hmw_hideajax_paths"><?php _e( 'Change Paths in Ajax Calls', _HMW_PLUGIN_NAME_ ); ?></label>
49
+ <a href="https://hidemywpghost.com/kb/activate-security-tweaks/#change_paths_ajax" target="_blank" class="d-inline-block ml-2"><i class="fa fa-question-circle"></i></a>
50
+ <div class="offset-1 text-black-50"><?php echo __( 'This will prevent from showing the old paths when an image or font is called through ajax', _HMW_PLUGIN_NAME_ ); ?></div>
51
+ </div>
52
+ </div>
53
+ </div>
54
+
55
+ </div>
56
+ </div>
57
+ <div class="card col-sm-12 p-0 tab-panel">
58
+ <h3 class="card-title bg-brown text-white p-2"><?php _e( 'Hide/Show Options', _HMW_PLUGIN_NAME_ ); ?>:</h3>
59
+ <div class="card-body">
60
+ <div class="col-sm-12 row mb-1 ml-1">
61
+ <div class="checker col-sm-12 row my-2 py-1">
62
+ <div class="col-sm-12 p-0 switch switch-sm">
63
+ <input type="hidden" name="hmw_hide_version" value="0"/>
64
+ <input type="checkbox" id="hmw_hide_version" name="hmw_hide_version" class="js-switch pull-right fixed-sidebar-check" <?php echo(HMW_Classes_Tools::getOption('hmw_hide_version') ? 'checked="checked"' : '') ?>value="1"/>
65
+ <label for="hmw_hide_version"><?php _e('Hide Versions and WordPress Tags', _HMW_PLUGIN_NAME_); ?></label>
66
+ <a href="https://hidemywpghost.com/kb/activate-security-tweaks/#hide_wordpress_version" target="_blank" class="d-inline-block ml-2" ><i class="fa fa-question-circle"></i></a>
67
+ <div class="offset-1 text-black-50"><?php _e("Hide WordPress and Plugin versions from the end of any image, css and js files", _HMW_PLUGIN_NAME_); ?></div>
68
+ <div class="offset-1 text-black-50"><?php _e("Hide the WP Generator META", _HMW_PLUGIN_NAME_); ?></div>
69
+ <div class="offset-1 text-black-50"><?php _e("Hide the WP DNS Prefetch META", _HMW_PLUGIN_NAME_); ?></div>
70
+ </div>
71
+ </div>
72
+ </div>
73
+ <div class="col-sm-12 row mb-1 ml-1">
74
+ <div class="checker col-sm-12 row my-2 py-1">
75
+ <div class="col-sm-12 p-0 switch switch-sm">
76
+ <input type="hidden" name="hmw_hide_header" value="0"/>
77
+ <input type="checkbox" id="hmw_hide_header" name="hmw_hide_header" class="js-switch pull-right fixed-sidebar-check" <?php echo(HMW_Classes_Tools::getOption('hmw_hide_header') ? 'checked="checked"' : '') ?> value="1"/>
78
+ <label for="hmw_hide_header"><?php _e('Hide RSD (Really Simple Discovery) header', _HMW_PLUGIN_NAME_); ?></label>
79
+ <a href="https://hidemywpghost.com/kb/activate-security-tweaks/#hide_rsd" target="_blank" class="d-inline-block ml-2" ><i class="fa fa-question-circle"></i></a>
80
+ <div class="offset-1 text-black-50"><?php _e("Don't show any WordPress information in HTTP header request", _HMW_PLUGIN_NAME_); ?></div>
81
+ </div>
82
+ </div>
83
+ </div>
84
+
85
+ <div class="col-sm-12 row mb-1 ml-1">
86
+ <div class="checker col-sm-12 row my-2 py-1">
87
+ <div class="col-sm-12 p-0 switch switch-sm">
88
+ <input type="hidden" name="hmw_hide_comments" value="0"/>
89
+ <input type="checkbox" id="hmw_hide_comments" name="hmw_hide_comments" class="js-switch pull-right fixed-sidebar-check" <?php echo(HMW_Classes_Tools::getOption('hmw_hide_comments') ? 'checked="checked"' : '') ?> value="1"/>
90
+ <label for="hmw_hide_comments"><?php _e('Hide WordPress HTML Comments', _HMW_PLUGIN_NAME_); ?></label>
91
+ <a href="https://hidemywpghost.com/kb/activate-security-tweaks/#hide_comments" target="_blank" class="d-inline-block ml-2" ><i class="fa fa-question-circle"></i></a>
92
+ <div class="offset-1 text-black-50"><?php _e("Hide the HTML Comments left by theme and plugins", _HMW_PLUGIN_NAME_); ?></div>
93
+ </div>
94
+ </div>
95
+ </div>
96
+ <div class="col-sm-12 row mb-1 ml-1">
97
+ <div class="checker col-sm-12 row my-2 py-1">
98
+ <div class="col-sm-12 p-0 switch switch-sm">
99
+ <input type="hidden" name="hmw_disable_emojicons" value="0"/>
100
+ <input type="checkbox" id="hmw_disable_emojicons" name="hmw_disable_emojicons" class="js-switch pull-right fixed-sidebar-check" <?php echo(HMW_Classes_Tools::getOption('hmw_disable_emojicons') ? 'checked="checked"' : '') ?> value="1"/>
101
+ <label for="hmw_disable_emojicons"><?php _e('Hide Emojicons', _HMW_PLUGIN_NAME_); ?></label>
102
+ <a href="https://hidemywpghost.com/kb/activate-security-tweaks/#hide_emojicons" target="_blank" class="d-inline-block ml-2" ><i class="fa fa-question-circle"></i></a>
103
+ <div class="offset-1 text-black-50"><?php _e("Don't load Emoji Icons if you don't use them", _HMW_PLUGIN_NAME_); ?></div>
104
+ </div>
105
+ </div>
106
+ </div>
107
+ </div>
108
+ </div>
109
+ <div class="card col-sm-12 p-0 tab-panel">
110
+ <h3 class="card-title bg-brown text-white p-2"><?php _e( 'Other Settings', _HMW_PLUGIN_NAME_ ); ?>:</h3>
111
+ <div class="card-body">
112
+ <div class="col-sm-12 row mb-1 ml-1">
113
+ <div class="checker col-sm-12 row my-2 py-1">
114
+ <div class="col-sm-12 p-0 switch switch-sm">
115
+ <input type="hidden" name="hmw_disable_xmlrpc" value="0"/>
116
+ <input type="checkbox" id="hmw_disable_xmlrpc" name="hmw_disable_xmlrpc" class="js-switch pull-right fixed-sidebar-check" <?php echo(HMW_Classes_Tools::getOption('hmw_disable_xmlrpc') ? 'checked="checked"' : '') ?> value="1"/>
117
+ <label for="hmw_disable_xmlrpc"><?php _e('Disable XML-RPC authentication', _HMW_PLUGIN_NAME_); ?></label>
118
+ <a href="https://hidemywpghost.com/kb/activate-security-tweaks/#disable_xml_rpc_access" target="_blank" class="d-inline-block ml-2" ><i class="fa fa-question-circle"></i></a>
119
+ <div class="offset-1 text-black-50"><?php echo sprintf(__("Don't load XML-RPC to prevent %sBrute force attacks via XML-RPC%s", _HMW_PLUGIN_NAME_), '<a href="https://hidemywpghost.com/should-you-disable-xml-rpc-on-wordpress/" target="_blank">', '</a>'); ?></div>
120
+ </div>
121
+ </div>
122
+ </div>
123
+ <div class="col-sm-12 row mb-1 ml-1">
124
+ <div class="checker col-sm-12 row my-2 py-1">
125
+ <div class="col-sm-12 p-0 switch switch-sm">
126
+ <input type="hidden" name="hmw_disable_embeds" value="0"/>
127
+ <input type="checkbox" id="hmw_disable_embeds" name="hmw_disable_embeds" class="js-switch pull-right fixed-sidebar-check" <?php echo(HMW_Classes_Tools::getOption('hmw_disable_embeds') ? 'checked="checked"' : '') ?> value="1"/>
128
+ <label for="hmw_disable_embeds"><?php _e('Disable Embed scripts', _HMW_PLUGIN_NAME_); ?></label>
129
+ <a href="https://hidemywpghost.com/kb/activate-security-tweaks/#disable_embed_scripts" target="_blank" class="d-inline-block ml-2" ><i class="fa fa-question-circle"></i></a>
130
+ <div class="offset-1 text-black-50"><?php _e("Don't load oEmbed service if you don't use oEmbed videos", _HMW_PLUGIN_NAME_); ?></div>
131
+ </div>
132
+ </div>
133
+ </div>
134
+
135
+ <div class="col-sm-12 row mb-1 ml-1">
136
+ <div class="checker col-sm-12 row my-2 py-1">
137
+ <div class="col-sm-12 p-0 switch switch-sm">
138
+ <input type="hidden" name="hmw_disable_manifest" value="0"/>
139
+ <input type="checkbox" id="hmw_disable_manifest" name="hmw_disable_manifest" class="js-switch pull-right fixed-sidebar-check" <?php echo(HMW_Classes_Tools::getOption('hmw_disable_manifest') ? 'checked="checked"' : '') ?> value="1"/>
140
+ <label for="hmw_disable_manifest"><?php _e('Disable WLW Manifest scripts', _HMW_PLUGIN_NAME_); ?></label>
141
+ <a href="https://hidemywpghost.com/kb/activate-security-tweaks/#disable_wlw_scripts" target="_blank" class="d-inline-block ml-2" ><i class="fa fa-question-circle"></i></a>
142
+ <div class="offset-1 text-black-50"><?php _e("Don't load WLW if you didn't configure Windows Live Writer for your site", _HMW_PLUGIN_NAME_); ?></div>
143
+ </div>
144
+ </div>
145
+ </div>
146
+
147
+ <div class="col-sm-12 row mb-1 ml-1">
148
+ <div class="checker col-sm-12 row my-2 py-1">
149
+ <div class="col-sm-12 p-0 switch switch-sm">
150
+ <input type="hidden" name="hmw_disable_debug" value="0"/>
151
+ <input type="checkbox" id="hmw_disable_debug" name="hmw_disable_debug" class="js-switch pull-right fixed-sidebar-check" <?php echo(HMW_Classes_Tools::getOption('hmw_disable_debug') ? 'checked="checked"' : '') ?> value="1"/>
152
+ <label for="hmw_disable_debug"><?php _e('Disable DB Debug in Frontent', _HMW_PLUGIN_NAME_); ?></label>
153
+ <a href="https://hidemywpghost.com/kb/activate-security-tweaks/#disable_db_debug" target="_blank" class="d-inline-block ml-2" ><i class="fa fa-question-circle"></i></a>
154
+ <div class="offset-1 text-black-50"><?php _e("Don't load DB Debug if your website is live", _HMW_PLUGIN_NAME_); ?></div>
155
+ </div>
156
+ </div>
157
+ </div>
158
+ </div>
159
+
160
+ </div>
161
+ <div class="col-sm-12 m-0 p-2 bg-light text-center" style="position: fixed; bottom: 0; right: 0; z-index: 100; box-shadow: 0px 0px 8px -3px #444;">
162
+ <button type="submit" class="btn rounded-0 btn-success btn-lg px-5 mr-5 save"><?php _e('Save', _HMW_PLUGIN_NAME_); ?></button>
163
+ <a href="https://wordpress.org/support/plugin/hide-my-wp/reviews/?rate=5#new-post" target="_blank" style="color: #ff005e;"><?php echo sprintf( __( 'Love Hide My WP %s? Show us ;)', _HMW_PLUGIN_NAME_ ), _HMW_VER_NAME_ ); ?></a>
164
+ </div>
165
+ </form>
166
+ </div>
167
+ <div class="hmw_col hmw_col_side">
168
+ <?php echo $view->getView( 'Support' ) ?>
169
+
170
+
171
+ <div class="card col-sm-12 p-0">
172
+ <div class="card-body f-gray-dark text-center">
173
+ <h3 class="card-title"><?php _e( 'Check Your Website', _HMW_PLUGIN_NAME_ ); ?></h3>
174
+ <div class="card-text text-muted">
175
+ <?php echo __( 'Check if your website is secured with the current settings.', _HMW_PLUGIN_NAME_ ) ?>
176
+ </div>
177
+ <div class="card-text text-info m-3">
178
+ <a href="<?php echo HMW_Classes_Tools::getSettingsUrl( 'hmw_securitycheck' ) ?>" class="btn rounded-0 btn-warning btn-lg text-white px-5 securitycheck"><?php _e( 'Security Check', _HMW_PLUGIN_NAME_ ); ?></a>
179
+ </div>
180
+ <div class="card-text text-muted small">
181
+ <?php echo __( 'Make sure you save the settings and empty the cache before checking your website with our tool.', _HMW_PLUGIN_NAME_ ) ?>
182
+ </div>
183
+
184
+ <div class="card-text m-3 ">
185
+ <a class="bigbutton text-center" href="https://hidemywpghost.com/knowledge-base/" target="_blank"><?php echo __( "Learn more about Hide My WP", _HMW_PLUGIN_NAME_ ); ?></a>
186
+ </div>
187
+ </div>
188
+ </div>
189
+
190
+ <div class="card col-sm-12 p-0">
191
+ <div class="card-body f-gray-dark text-center">
192
+ <h3 class="card-title"><?php echo __( 'Love Hide My WP?', _HMW_PLUGIN_NAME_ ); ?></h3>
193
+ <div class="card-text text-muted">
194
+ <h1>
195
+ <a href="https://wordpress.org/support/plugin/hide-my-wp/reviews/?rate=5#new-post" target="_blank" style="font-size: 80px"><i class="fa fa-heart text-danger"></i></a>
196
+ </h1>
197
+ <?php echo __( 'Please help us and support our plugin on WordPress.org', _HMW_PLUGIN_NAME_ ) ?>
198
+ </div>
199
+ <div class="card-text text-info m-3">
200
+ <a href="https://wordpress.org/support/plugin/hide-my-wp/reviews/?rate=5#new-post" target="_blank" class="btn rounded-0 btn-success btn-lg px-4"><?php echo __( 'Rate Hide My WP', _HMW_PLUGIN_NAME_ ); ?></a>
201
+ </div>
202
+ <div class="card-text text-muted">
203
+ <?php echo __( 'Contact us after you left the review cause we have a surprise for you.', _HMW_PLUGIN_NAME_ ) ?>
204
+ <h1>
205
+ <a href="https://hidemywpghost.com/contact/" target="_blank" style="font-size: 80px"><i class="fa fa-gift text-info"></i></a>
206
+ </h1>
207
+ </div>
208
+ </div>
209
+ </div>
210
+ </div>
211
+
212
+ </div>
213
+ </div>
view/css/alert.css ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .hmw_notice {
2
+ background: #ffffe2 !important;
3
+ padding: 1em;
4
+ margin: 0;
5
+ color: #444;
6
+ border-left: 2px solid #ffffe2;
7
+ border-bottom: 2px solid #e5765c;
8
+ }
9
+
10
+ .hmw_notice.success {
11
+ background: #188a18 !important;
12
+ color: white;
13
+ }
14
+
15
+ .hmw_notice.notice {
16
+ background: #ffffe2 !important;
17
+ color: #444;
18
+ border-left: 2px solid #ffffe2;
19
+ border-bottom: 2px solid #e5765c;
20
+ }
21
+
22
+ .hmw_notice p {
23
+
24
+ display: block;
25
+ font-size: 14px;
26
+ font-weight: normal;
27
+ letter-spacing: normal;
28
+ line-height: 30px;
29
+ margin: 0 0 10px 0;
30
+ font-style: normal;
31
+ white-space: normal;
32
+ }
33
+
34
+ .hmw_logout {
35
+ display: inline-block;
36
+ margin-left: 10px;
37
+ }
38
+
39
+ .hmw_btn {
40
+ font-size: 18px;
41
+ border: 1px solid transparent;
42
+ border-radius: 0;
43
+ outline: none !important;
44
+ display: inline-block;
45
+ padding: 6px 12px;
46
+ margin-bottom: 0;
47
+ font-weight: normal;
48
+ line-height: 1.42857143;
49
+ text-align: center;
50
+ white-space: nowrap;
51
+ vertical-align: middle;
52
+ -ms-touch-action: manipulation;
53
+ touch-action: manipulation;
54
+ cursor: pointer;
55
+ -webkit-user-select: none;
56
+ -moz-user-select: none;
57
+ -ms-user-select: none;
58
+ user-select: none;
59
+ background-image: none;
60
+ }
61
+
62
+ .hmw_btn-success {
63
+ color: #fff;
64
+ background-color: green;
65
+ border-color: transparent;
66
+ }
67
+
68
+ .hmw_btn-warning {
69
+ color: #fff;
70
+ background-color: #e8bf40;
71
+ border-color: transparent;
72
+ }
view/css/bootstrap.min.css ADDED
@@ -0,0 +1 @@
 
1
+ :root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(2.25rem + 2px);padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::after,.was-validated .custom-file-input:valid~.custom-file-label::after{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::after,.was-validated .custom-file-input:invalid~.custom-file-label::after{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-label::after{border-color:#80bdff}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.25rem;padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:not(:disabled):not(.disabled){cursor:pointer}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-dialog-centered::before{display:block;height:calc(100vh - (.5rem * 2));content:""}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-dialog-centered::before{height:calc(100vh - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-ms-flex-align:center;align-items:center;width:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease}@media screen and (prefers-reduced-motion:reduce){.carousel-item-next,.carousel-item-prev,.carousel-item.active{transition:none}}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;transition-duration:.6s;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-l