diff --git a/contract/Contracts/WordPress-Website/_scratch/site_analysis/IMPLEMENTATION-PLAN.md b/contract/Contracts/WordPress-Website/_scratch/site_analysis/IMPLEMENTATION-PLAN.md index 05c2d079..dd03a4cb 100644 --- a/contract/Contracts/WordPress-Website/_scratch/site_analysis/IMPLEMENTATION-PLAN.md +++ b/contract/Contracts/WordPress-Website/_scratch/site_analysis/IMPLEMENTATION-PLAN.md @@ -808,11 +808,31 @@ This implementation plan is a draft for review. Please confirm: - Site icon/favicon managed via WordPress Customizer (Appearance > Customize > Site Identity) - Theme color set to #0A0A0A (background dark) for mobile browser chrome -### Phase 6: Performance & Security - PENDING +### Phase 6: Performance & Security - COMPLETED (Partial) +- [x] WebP image conversion via "Converter for Media" plugin +- [x] Nginx rewrite rules for serving WebP to supported browsers +- [x] Server dependencies documented in DEPENDENCIES.md +- [ ] Caching plugin - SKIPPED (not requested) +- [ ] Security plugin - SKIPPED (not requested) +- [ ] Backups plugin - SKIPPED (not requested) + +**Technical Details:** +- Plugin: Converter for Media v6.3.2 +- Conversion method: PHP GD/Imagick (both available, WebP supported) +- WebP files stored in: `/wp-content/uploads-webpc/` +- Nginx serves WebP when browser sends `Accept: image/webp` header +- No external APIs or services used (fully local processing) + +**Files Created:** +- /var/www/html/DEPENDENCIES.md (server dependency documentation) + +**Files Modified:** +- /etc/nginx/sites-available/default (WebP rewrite rules added) + ### Phase 7: Testing & Launch - PENDING --- -*Document Version: 1.4* +*Document Version: 1.5* *Last Updated: November 28, 2025* *Prepared by: Hanson.xyz Development Team* diff --git a/db-snapshots/db-snapshot.sql b/db-snapshots/db-snapshot.sql index 869c10b0..afbe73f5 100644 --- a/db-snapshots/db-snapshot.sql +++ b/db-snapshots/db-snapshot.sql @@ -15,6 +15,261 @@ /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +-- +-- Table structure for table `wp_aiowps_audit_log` +-- + +DROP TABLE IF EXISTS `wp_aiowps_audit_log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `wp_aiowps_audit_log` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `network_id` bigint NOT NULL DEFAULT '0', + `site_id` bigint NOT NULL DEFAULT '0', + `username` varchar(60) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `ip` varchar(45) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `level` varchar(25) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `event_type` varchar(25) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `details` text COLLATE utf8mb4_unicode_520_ci NOT NULL, + `stacktrace` text COLLATE utf8mb4_unicode_520_ci NOT NULL, + `created` int unsigned DEFAULT NULL, + `country_code` varchar(50) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `username` (`username`), + KEY `ip` (`ip`), + KEY `level` (`level`), + KEY `event_type` (`event_type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_aiowps_audit_log` +-- + +LOCK TABLES `wp_aiowps_audit_log` WRITE; +/*!40000 ALTER TABLE `wp_aiowps_audit_log` DISABLE KEYS */; +/*!40000 ALTER TABLE `wp_aiowps_audit_log` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_aiowps_debug_log` +-- + +DROP TABLE IF EXISTS `wp_aiowps_debug_log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `wp_aiowps_debug_log` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `created` datetime NOT NULL DEFAULT '1000-10-10 10:00:00', + `logtime` int unsigned DEFAULT NULL, + `level` varchar(25) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `network_id` bigint NOT NULL DEFAULT '0', + `site_id` bigint NOT NULL DEFAULT '0', + `message` text COLLATE utf8mb4_unicode_520_ci NOT NULL, + `type` varchar(25) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_aiowps_debug_log` +-- + +LOCK TABLES `wp_aiowps_debug_log` WRITE; +/*!40000 ALTER TABLE `wp_aiowps_debug_log` DISABLE KEYS */; +/*!40000 ALTER TABLE `wp_aiowps_debug_log` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_aiowps_events` +-- + +DROP TABLE IF EXISTS `wp_aiowps_events`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `wp_aiowps_events` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `event_type` varchar(150) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `username` varchar(150) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, + `user_id` bigint DEFAULT NULL, + `event_date` datetime NOT NULL DEFAULT '1000-10-10 10:00:00', + `created` int unsigned DEFAULT NULL, + `ip_or_host` varchar(100) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, + `referer_info` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, + `url` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, + `country_code` varchar(50) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, + `event_data` longtext COLLATE utf8mb4_unicode_520_ci, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_aiowps_events` +-- + +LOCK TABLES `wp_aiowps_events` WRITE; +/*!40000 ALTER TABLE `wp_aiowps_events` DISABLE KEYS */; +/*!40000 ALTER TABLE `wp_aiowps_events` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_aiowps_global_meta` +-- + +DROP TABLE IF EXISTS `wp_aiowps_global_meta`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `wp_aiowps_global_meta` ( + `meta_id` bigint NOT NULL AUTO_INCREMENT, + `date_time` datetime NOT NULL DEFAULT '1000-10-10 10:00:00', + `created` int unsigned DEFAULT NULL, + `meta_key1` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL, + `meta_key2` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL, + `meta_key3` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL, + `meta_key4` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL, + `meta_key5` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL, + `meta_value1` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL, + `meta_value2` text COLLATE utf8mb4_unicode_520_ci NOT NULL, + `meta_value3` text COLLATE utf8mb4_unicode_520_ci NOT NULL, + `meta_value4` longtext COLLATE utf8mb4_unicode_520_ci NOT NULL, + `meta_value5` longtext COLLATE utf8mb4_unicode_520_ci NOT NULL, + PRIMARY KEY (`meta_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_aiowps_global_meta` +-- + +LOCK TABLES `wp_aiowps_global_meta` WRITE; +/*!40000 ALTER TABLE `wp_aiowps_global_meta` DISABLE KEYS */; +/*!40000 ALTER TABLE `wp_aiowps_global_meta` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_aiowps_logged_in_users` +-- + +DROP TABLE IF EXISTS `wp_aiowps_logged_in_users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `wp_aiowps_logged_in_users` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `user_id` bigint NOT NULL, + `username` varchar(60) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `ip_address` varchar(45) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `site_id` bigint NOT NULL, + `created` int unsigned DEFAULT NULL, + `expires` int unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique_user_id` (`user_id`), + KEY `created` (`created`), + KEY `expires` (`expires`), + KEY `user_id` (`user_id`), + KEY `site_id` (`site_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_aiowps_logged_in_users` +-- + +LOCK TABLES `wp_aiowps_logged_in_users` WRITE; +/*!40000 ALTER TABLE `wp_aiowps_logged_in_users` DISABLE KEYS */; +/*!40000 ALTER TABLE `wp_aiowps_logged_in_users` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_aiowps_login_lockdown` +-- + +DROP TABLE IF EXISTS `wp_aiowps_login_lockdown`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `wp_aiowps_login_lockdown` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `user_id` bigint NOT NULL, + `user_login` varchar(150) COLLATE utf8mb4_unicode_520_ci NOT NULL, + `lockdown_date` datetime NOT NULL DEFAULT '1000-10-10 10:00:00', + `created` int unsigned DEFAULT NULL, + `release_date` datetime NOT NULL DEFAULT '1000-10-10 10:00:00', + `released` int unsigned DEFAULT NULL, + `failed_login_ip` varchar(100) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `lock_reason` varchar(128) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `unlock_key` varchar(128) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `is_lockout_email_sent` tinyint(1) NOT NULL DEFAULT '1', + `backtrace_log` text COLLATE utf8mb4_unicode_520_ci NOT NULL, + `ip_lookup_result` longtext COLLATE utf8mb4_unicode_520_ci, + PRIMARY KEY (`id`), + KEY `failed_login_ip` (`failed_login_ip`), + KEY `is_lockout_email_sent` (`is_lockout_email_sent`), + KEY `unlock_key` (`unlock_key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_aiowps_login_lockdown` +-- + +LOCK TABLES `wp_aiowps_login_lockdown` WRITE; +/*!40000 ALTER TABLE `wp_aiowps_login_lockdown` DISABLE KEYS */; +/*!40000 ALTER TABLE `wp_aiowps_login_lockdown` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_aiowps_message_store` +-- + +DROP TABLE IF EXISTS `wp_aiowps_message_store`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `wp_aiowps_message_store` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `message_key` text COLLATE utf8mb4_unicode_520_ci NOT NULL, + `message_value` text COLLATE utf8mb4_unicode_520_ci NOT NULL, + `created` int unsigned DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_aiowps_message_store` +-- + +LOCK TABLES `wp_aiowps_message_store` WRITE; +/*!40000 ALTER TABLE `wp_aiowps_message_store` DISABLE KEYS */; +/*!40000 ALTER TABLE `wp_aiowps_message_store` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `wp_aiowps_permanent_block` +-- + +DROP TABLE IF EXISTS `wp_aiowps_permanent_block`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `wp_aiowps_permanent_block` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `blocked_ip` varchar(100) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `block_reason` varchar(128) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `country_origin` varchar(50) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '', + `blocked_date` datetime NOT NULL DEFAULT '1000-10-10 10:00:00', + `created` int unsigned DEFAULT NULL, + `unblock` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `blocked_ip` (`blocked_ip`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `wp_aiowps_permanent_block` +-- + +LOCK TABLES `wp_aiowps_permanent_block` WRITE; +/*!40000 ALTER TABLE `wp_aiowps_permanent_block` DISABLE KEYS */; +/*!40000 ALTER TABLE `wp_aiowps_permanent_block` ENABLE KEYS */; +UNLOCK TABLES; + -- -- Table structure for table `wp_commentmeta` -- @@ -134,7 +389,7 @@ CREATE TABLE `wp_options` ( PRIMARY KEY (`option_id`), UNIQUE KEY `option_name` (`option_name`), KEY `autoload` (`autoload`) -) ENGINE=InnoDB AUTO_INCREMENT=179 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +) ENGINE=InnoDB AUTO_INCREMENT=185 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -143,7 +398,7 @@ CREATE TABLE `wp_options` ( LOCK TABLES `wp_options` WRITE; /*!40000 ALTER TABLE `wp_options` DISABLE KEYS */; -INSERT INTO `wp_options` VALUES (1,'cron','a:10:{i:1764363747;a:1:{s:32:\"recovery_mode_clean_expired_keys\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1764363748;a:1:{s:34:\"wp_privacy_delete_old_export_files\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"hourly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:3600;}}}i:1764367344;a:1:{s:16:\"wp_version_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1764369115;a:1:{s:30:\"wp_delete_temp_updater_backups\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}i:1764369116;a:1:{s:27:\"acf_update_site_health_data\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}i:1764369144;a:1:{s:17:\"wp_update_plugins\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1764370944;a:1:{s:16:\"wp_update_themes\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1764371307;a:1:{s:31:\"wpseo_permalink_structure_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1764450148;a:1:{s:30:\"wp_site_health_scheduled_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}s:7:\"version\";i:2;}','on'),(2,'siteurl','https://homeproz.dev.hanson.xyz','on'),(3,'home','https://homeproz.dev.hanson.xyz','on'),(4,'blogname','HomeProz','on'),(5,'blogdescription','','on'),(6,'users_can_register','0','on'),(7,'admin_email','brian@hanson.xyz','on'),(8,'start_of_week','1','on'),(9,'use_balanceTags','0','on'),(10,'use_smilies','1','on'),(11,'require_name_email','1','on'),(12,'comments_notify','1','on'),(13,'posts_per_rss','10','on'),(14,'rss_use_excerpt','0','on'),(15,'mailserver_url','mail.example.com','on'),(16,'mailserver_login','login@example.com','on'),(17,'mailserver_pass','','on'),(18,'mailserver_port','110','on'),(19,'default_category','1','on'),(20,'default_comment_status','open','on'),(21,'default_ping_status','open','on'),(22,'default_pingback_flag','1','on'),(23,'posts_per_page','10','on'),(24,'date_format','F j, Y','on'),(25,'time_format','g:i a','on'),(26,'links_updated_date_format','F j, Y g:i a','on'),(27,'comment_moderation','0','on'),(28,'moderation_notify','1','on'),(29,'permalink_structure','/%postname%/','on'),(30,'rewrite_rules','a:133:{s:11:\"^wp-json/?$\";s:22:\"index.php?rest_route=/\";s:14:\"^wp-json/(.*)?\";s:33:\"index.php?rest_route=/$matches[1]\";s:21:\"^index.php/wp-json/?$\";s:22:\"index.php?rest_route=/\";s:24:\"^index.php/wp-json/(.*)?\";s:33:\"index.php?rest_route=/$matches[1]\";s:17:\"^wp-sitemap\\.xml$\";s:23:\"index.php?sitemap=index\";s:17:\"^wp-sitemap\\.xsl$\";s:36:\"index.php?sitemap-stylesheet=sitemap\";s:23:\"^wp-sitemap-index\\.xsl$\";s:34:\"index.php?sitemap-stylesheet=index\";s:48:\"^wp-sitemap-([a-z]+?)-([a-z\\d_-]+?)-(\\d+?)\\.xml$\";s:75:\"index.php?sitemap=$matches[1]&sitemap-subtype=$matches[2]&paged=$matches[3]\";s:34:\"^wp-sitemap-([a-z]+?)-(\\d+?)\\.xml$\";s:47:\"index.php?sitemap=$matches[1]&paged=$matches[2]\";s:13:\"properties/?$\";s:28:\"index.php?post_type=property\";s:43:\"properties/feed/(feed|rdf|rss|rss2|atom)/?$\";s:45:\"index.php?post_type=property&feed=$matches[1]\";s:38:\"properties/(feed|rdf|rss|rss2|atom)/?$\";s:45:\"index.php?post_type=property&feed=$matches[1]\";s:30:\"properties/page/([0-9]{1,})/?$\";s:46:\"index.php?post_type=property&paged=$matches[1]\";s:47:\"category/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?category_name=$matches[1]&feed=$matches[2]\";s:42:\"category/(.+?)/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?category_name=$matches[1]&feed=$matches[2]\";s:23:\"category/(.+?)/embed/?$\";s:46:\"index.php?category_name=$matches[1]&embed=true\";s:35:\"category/(.+?)/page/?([0-9]{1,})/?$\";s:53:\"index.php?category_name=$matches[1]&paged=$matches[2]\";s:17:\"category/(.+?)/?$\";s:35:\"index.php?category_name=$matches[1]\";s:44:\"tag/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?tag=$matches[1]&feed=$matches[2]\";s:39:\"tag/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?tag=$matches[1]&feed=$matches[2]\";s:20:\"tag/([^/]+)/embed/?$\";s:36:\"index.php?tag=$matches[1]&embed=true\";s:32:\"tag/([^/]+)/page/?([0-9]{1,})/?$\";s:43:\"index.php?tag=$matches[1]&paged=$matches[2]\";s:14:\"tag/([^/]+)/?$\";s:25:\"index.php?tag=$matches[1]\";s:45:\"type/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?post_format=$matches[1]&feed=$matches[2]\";s:40:\"type/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?post_format=$matches[1]&feed=$matches[2]\";s:21:\"type/([^/]+)/embed/?$\";s:44:\"index.php?post_format=$matches[1]&embed=true\";s:33:\"type/([^/]+)/page/?([0-9]{1,})/?$\";s:51:\"index.php?post_format=$matches[1]&paged=$matches[2]\";s:15:\"type/([^/]+)/?$\";s:33:\"index.php?post_format=$matches[1]\";s:38:\"properties/[^/]+/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:48:\"properties/[^/]+/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:68:\"properties/[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:63:\"properties/[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:63:\"properties/[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:44:\"properties/[^/]+/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:27:\"properties/([^/]+)/embed/?$\";s:41:\"index.php?property=$matches[1]&embed=true\";s:31:\"properties/([^/]+)/trackback/?$\";s:35:\"index.php?property=$matches[1]&tb=1\";s:51:\"properties/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?property=$matches[1]&feed=$matches[2]\";s:46:\"properties/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?property=$matches[1]&feed=$matches[2]\";s:39:\"properties/([^/]+)/page/?([0-9]{1,})/?$\";s:48:\"index.php?property=$matches[1]&paged=$matches[2]\";s:46:\"properties/([^/]+)/comment-page-([0-9]{1,})/?$\";s:48:\"index.php?property=$matches[1]&cpage=$matches[2]\";s:35:\"properties/([^/]+)(?:/([0-9]+))?/?$\";s:47:\"index.php?property=$matches[1]&page=$matches[2]\";s:27:\"properties/[^/]+/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\"properties/[^/]+/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\"properties/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"properties/[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"properties/[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\"properties/[^/]+/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:54:\"property-type/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?property_type=$matches[1]&feed=$matches[2]\";s:49:\"property-type/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?property_type=$matches[1]&feed=$matches[2]\";s:30:\"property-type/([^/]+)/embed/?$\";s:46:\"index.php?property_type=$matches[1]&embed=true\";s:42:\"property-type/([^/]+)/page/?([0-9]{1,})/?$\";s:53:\"index.php?property_type=$matches[1]&paged=$matches[2]\";s:24:\"property-type/([^/]+)/?$\";s:35:\"index.php?property_type=$matches[1]\";s:56:\"property-status/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:54:\"index.php?property_status=$matches[1]&feed=$matches[2]\";s:51:\"property-status/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:54:\"index.php?property_status=$matches[1]&feed=$matches[2]\";s:32:\"property-status/([^/]+)/embed/?$\";s:48:\"index.php?property_status=$matches[1]&embed=true\";s:44:\"property-status/([^/]+)/page/?([0-9]{1,})/?$\";s:55:\"index.php?property_status=$matches[1]&paged=$matches[2]\";s:26:\"property-status/([^/]+)/?$\";s:37:\"index.php?property_status=$matches[1]\";s:49:\"location/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:56:\"index.php?property_location=$matches[1]&feed=$matches[2]\";s:44:\"location/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:56:\"index.php?property_location=$matches[1]&feed=$matches[2]\";s:25:\"location/([^/]+)/embed/?$\";s:50:\"index.php?property_location=$matches[1]&embed=true\";s:37:\"location/([^/]+)/page/?([0-9]{1,})/?$\";s:57:\"index.php?property_location=$matches[1]&paged=$matches[2]\";s:19:\"location/([^/]+)/?$\";s:39:\"index.php?property_location=$matches[1]\";s:12:\"robots\\.txt$\";s:18:\"index.php?robots=1\";s:13:\"favicon\\.ico$\";s:19:\"index.php?favicon=1\";s:12:\"sitemap\\.xml\";s:24:\"index.php??sitemap=index\";s:48:\".*wp-(atom|rdf|rss|rss2|feed|commentsrss2)\\.php$\";s:18:\"index.php?feed=old\";s:20:\".*wp-app\\.php(/.*)?$\";s:19:\"index.php?error=403\";s:18:\".*wp-register.php$\";s:23:\"index.php?register=true\";s:32:\"feed/(feed|rdf|rss|rss2|atom)/?$\";s:27:\"index.php?&feed=$matches[1]\";s:27:\"(feed|rdf|rss|rss2|atom)/?$\";s:27:\"index.php?&feed=$matches[1]\";s:8:\"embed/?$\";s:21:\"index.php?&embed=true\";s:20:\"page/?([0-9]{1,})/?$\";s:28:\"index.php?&paged=$matches[1]\";s:27:\"comment-page-([0-9]{1,})/?$\";s:39:\"index.php?&page_id=10&cpage=$matches[1]\";s:41:\"comments/feed/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?&feed=$matches[1]&withcomments=1\";s:36:\"comments/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?&feed=$matches[1]&withcomments=1\";s:17:\"comments/embed/?$\";s:21:\"index.php?&embed=true\";s:44:\"search/(.+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:40:\"index.php?s=$matches[1]&feed=$matches[2]\";s:39:\"search/(.+)/(feed|rdf|rss|rss2|atom)/?$\";s:40:\"index.php?s=$matches[1]&feed=$matches[2]\";s:20:\"search/(.+)/embed/?$\";s:34:\"index.php?s=$matches[1]&embed=true\";s:32:\"search/(.+)/page/?([0-9]{1,})/?$\";s:41:\"index.php?s=$matches[1]&paged=$matches[2]\";s:14:\"search/(.+)/?$\";s:23:\"index.php?s=$matches[1]\";s:47:\"author/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?author_name=$matches[1]&feed=$matches[2]\";s:42:\"author/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?author_name=$matches[1]&feed=$matches[2]\";s:23:\"author/([^/]+)/embed/?$\";s:44:\"index.php?author_name=$matches[1]&embed=true\";s:35:\"author/([^/]+)/page/?([0-9]{1,})/?$\";s:51:\"index.php?author_name=$matches[1]&paged=$matches[2]\";s:17:\"author/([^/]+)/?$\";s:33:\"index.php?author_name=$matches[1]\";s:69:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:80:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]\";s:64:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$\";s:80:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]\";s:45:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/embed/?$\";s:74:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&embed=true\";s:57:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/page/?([0-9]{1,})/?$\";s:81:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&paged=$matches[4]\";s:39:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$\";s:63:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]\";s:56:\"([0-9]{4})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:64:\"index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]\";s:51:\"([0-9]{4})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$\";s:64:\"index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]\";s:32:\"([0-9]{4})/([0-9]{1,2})/embed/?$\";s:58:\"index.php?year=$matches[1]&monthnum=$matches[2]&embed=true\";s:44:\"([0-9]{4})/([0-9]{1,2})/page/?([0-9]{1,})/?$\";s:65:\"index.php?year=$matches[1]&monthnum=$matches[2]&paged=$matches[3]\";s:26:\"([0-9]{4})/([0-9]{1,2})/?$\";s:47:\"index.php?year=$matches[1]&monthnum=$matches[2]\";s:43:\"([0-9]{4})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?year=$matches[1]&feed=$matches[2]\";s:38:\"([0-9]{4})/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?year=$matches[1]&feed=$matches[2]\";s:19:\"([0-9]{4})/embed/?$\";s:37:\"index.php?year=$matches[1]&embed=true\";s:31:\"([0-9]{4})/page/?([0-9]{1,})/?$\";s:44:\"index.php?year=$matches[1]&paged=$matches[2]\";s:13:\"([0-9]{4})/?$\";s:26:\"index.php?year=$matches[1]\";s:27:\".?.+?/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\".?.+?/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\".?.+?/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\".?.+?/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\".?.+?/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\".?.+?/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:16:\"(.?.+?)/embed/?$\";s:41:\"index.php?pagename=$matches[1]&embed=true\";s:20:\"(.?.+?)/trackback/?$\";s:35:\"index.php?pagename=$matches[1]&tb=1\";s:40:\"(.?.+?)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?pagename=$matches[1]&feed=$matches[2]\";s:35:\"(.?.+?)/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?pagename=$matches[1]&feed=$matches[2]\";s:28:\"(.?.+?)/page/?([0-9]{1,})/?$\";s:48:\"index.php?pagename=$matches[1]&paged=$matches[2]\";s:35:\"(.?.+?)/comment-page-([0-9]{1,})/?$\";s:48:\"index.php?pagename=$matches[1]&cpage=$matches[2]\";s:24:\"(.?.+?)(?:/([0-9]+))?/?$\";s:47:\"index.php?pagename=$matches[1]&page=$matches[2]\";s:27:\"[^/]+/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\"[^/]+/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\"[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\"[^/]+/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:16:\"([^/]+)/embed/?$\";s:37:\"index.php?name=$matches[1]&embed=true\";s:20:\"([^/]+)/trackback/?$\";s:31:\"index.php?name=$matches[1]&tb=1\";s:40:\"([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?name=$matches[1]&feed=$matches[2]\";s:35:\"([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?name=$matches[1]&feed=$matches[2]\";s:28:\"([^/]+)/page/?([0-9]{1,})/?$\";s:44:\"index.php?name=$matches[1]&paged=$matches[2]\";s:35:\"([^/]+)/comment-page-([0-9]{1,})/?$\";s:44:\"index.php?name=$matches[1]&cpage=$matches[2]\";s:24:\"([^/]+)(?:/([0-9]+))?/?$\";s:43:\"index.php?name=$matches[1]&page=$matches[2]\";s:16:\"[^/]+/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:26:\"[^/]+/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:46:\"[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:41:\"[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:41:\"[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:22:\"[^/]+/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";}','on'),(31,'hack_file','0','on'),(32,'blog_charset','UTF-8','on'),(33,'moderation_keys','','off'),(34,'active_plugins','a:4:{i:0;s:30:\"advanced-custom-fields/acf.php\";i:1;s:36:\"contact-form-7/wp-contact-form-7.php\";i:2;s:53:\"webp-converter-for-media/webp-converter-for-media.php\";i:3;s:24:\"wordpress-seo/wp-seo.php\";}','on'),(35,'category_base','','on'),(36,'ping_sites','https://rpc.pingomatic.com/','on'),(37,'comment_max_links','2','on'),(38,'gmt_offset','0','on'),(39,'default_email_category','1','on'),(40,'recently_edited','','off'),(41,'template','homeproz','on'),(42,'stylesheet','homeproz','on'),(43,'comment_registration','0','on'),(44,'html_type','text/html','on'),(45,'use_trackback','0','on'),(46,'default_role','subscriber','on'),(47,'db_version','60421','on'),(48,'uploads_use_yearmonth_folders','1','on'),(49,'upload_path','','on'),(50,'blog_public','1','on'),(51,'default_link_category','2','on'),(52,'show_on_front','page','on'),(53,'tag_base','','on'),(54,'show_avatars','1','on'),(55,'avatar_rating','G','on'),(56,'upload_url_path','','on'),(57,'thumbnail_size_w','150','on'),(58,'thumbnail_size_h','150','on'),(59,'thumbnail_crop','1','on'),(60,'medium_size_w','300','on'),(61,'medium_size_h','300','on'),(62,'avatar_default','mystery','on'),(63,'large_size_w','1024','on'),(64,'large_size_h','1024','on'),(65,'image_default_link_type','none','on'),(66,'image_default_size','','on'),(67,'image_default_align','','on'),(68,'close_comments_for_old_posts','0','on'),(69,'close_comments_days_old','14','on'),(70,'thread_comments','1','on'),(71,'thread_comments_depth','5','on'),(72,'page_comments','0','on'),(73,'comments_per_page','50','on'),(74,'default_comments_page','newest','on'),(75,'comment_order','asc','on'),(76,'sticky_posts','a:0:{}','on'),(77,'widget_categories','a:0:{}','on'),(78,'widget_text','a:0:{}','on'),(79,'widget_rss','a:0:{}','on'),(80,'uninstall_plugins','a:2:{s:24:\"wordpress-seo/wp-seo.php\";s:14:\"__return_false\";s:53:\"webp-converter-for-media/webp-converter-for-media.php\";a:2:{i:0;s:37:\"WebpConverter\\Plugin\\UninstallHandler\";i:1;s:22:\"load_uninstall_actions\";}}','off'),(81,'timezone_string','','on'),(82,'page_for_posts','9','on'),(83,'page_on_front','10','on'),(84,'default_post_format','0','on'),(85,'link_manager_enabled','0','on'),(86,'finished_splitting_shared_terms','1','on'),(87,'site_icon','0','on'),(88,'medium_large_size_w','768','on'),(89,'medium_large_size_h','0','on'),(90,'wp_page_for_privacy_policy','3','on'),(91,'show_comments_cookies_opt_in','1','on'),(92,'admin_email_lifespan','1779915744','on'),(93,'disallowed_keys','','off'),(94,'comment_previously_approved','1','on'),(95,'auto_plugin_theme_update_emails','a:0:{}','off'),(96,'auto_update_core_dev','enabled','on'),(97,'auto_update_core_minor','enabled','on'),(98,'auto_update_core_major','enabled','on'),(99,'wp_force_deactivated_plugins','a:0:{}','on'),(100,'wp_attachment_pages_enabled','1','on'),(101,'initial_db_version','60421','on'),(102,'wp_user_roles','a:7:{s:13:\"administrator\";a:2:{s:4:\"name\";s:13:\"Administrator\";s:12:\"capabilities\";a:62:{s:13:\"switch_themes\";b:1;s:11:\"edit_themes\";b:1;s:16:\"activate_plugins\";b:1;s:12:\"edit_plugins\";b:1;s:10:\"edit_users\";b:1;s:10:\"edit_files\";b:1;s:14:\"manage_options\";b:1;s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:6:\"import\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:8:\"level_10\";b:1;s:7:\"level_9\";b:1;s:7:\"level_8\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:12:\"delete_users\";b:1;s:12:\"create_users\";b:1;s:17:\"unfiltered_upload\";b:1;s:14:\"edit_dashboard\";b:1;s:14:\"update_plugins\";b:1;s:14:\"delete_plugins\";b:1;s:15:\"install_plugins\";b:1;s:13:\"update_themes\";b:1;s:14:\"install_themes\";b:1;s:11:\"update_core\";b:1;s:10:\"list_users\";b:1;s:12:\"remove_users\";b:1;s:13:\"promote_users\";b:1;s:18:\"edit_theme_options\";b:1;s:13:\"delete_themes\";b:1;s:6:\"export\";b:1;s:20:\"wpseo_manage_options\";b:1;}}s:6:\"editor\";a:2:{s:4:\"name\";s:6:\"Editor\";s:12:\"capabilities\";a:36:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:15:\"wpseo_bulk_edit\";b:1;s:28:\"wpseo_edit_advanced_metadata\";b:1;}}s:6:\"author\";a:2:{s:4:\"name\";s:6:\"Author\";s:12:\"capabilities\";a:10:{s:12:\"upload_files\";b:1;s:10:\"edit_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;s:22:\"delete_published_posts\";b:1;}}s:11:\"contributor\";a:2:{s:4:\"name\";s:11:\"Contributor\";s:12:\"capabilities\";a:5:{s:10:\"edit_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;}}s:10:\"subscriber\";a:2:{s:4:\"name\";s:10:\"Subscriber\";s:12:\"capabilities\";a:2:{s:4:\"read\";b:1;s:7:\"level_0\";b:1;}}s:13:\"wpseo_manager\";a:2:{s:4:\"name\";s:11:\"SEO Manager\";s:12:\"capabilities\";a:38:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:15:\"wpseo_bulk_edit\";b:1;s:28:\"wpseo_edit_advanced_metadata\";b:1;s:20:\"wpseo_manage_options\";b:1;s:23:\"view_site_health_checks\";b:1;}}s:12:\"wpseo_editor\";a:2:{s:4:\"name\";s:10:\"SEO Editor\";s:12:\"capabilities\";a:36:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:15:\"wpseo_bulk_edit\";b:1;s:28:\"wpseo_edit_advanced_metadata\";b:1;}}}','on'),(103,'fresh_site','0','off'),(104,'user_count','1','off'),(105,'widget_block','a:6:{i:2;a:1:{s:7:\"content\";s:19:\"\";}i:3;a:1:{s:7:\"content\";s:154:\"

Recent Posts

\";}i:4;a:1:{s:7:\"content\";s:227:\"

Recent Comments

\";}i:5;a:1:{s:7:\"content\";s:146:\"

Archives

\";}i:6;a:1:{s:7:\"content\";s:150:\"

Categories

\";}s:12:\"_multiwidget\";i:1;}','auto'),(106,'sidebars_widgets','a:2:{s:19:\"wp_inactive_widgets\";a:5:{i:0;s:7:\"block-2\";i:1;s:7:\"block-3\";i:2;s:7:\"block-4\";i:3;s:7:\"block-5\";i:4;s:7:\"block-6\";}s:13:\"array_version\";i:3;}','auto'),(107,'widget_pages','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(108,'widget_calendar','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(109,'widget_archives','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(110,'widget_media_audio','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(111,'widget_media_image','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(112,'widget_media_gallery','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(113,'widget_media_video','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(114,'widget_meta','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(115,'widget_search','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(116,'widget_recent-posts','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(117,'widget_recent-comments','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(118,'widget_tag_cloud','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(119,'widget_nav_menu','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(120,'widget_custom_html','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(121,'_transient_wp_core_block_css_files','a:2:{s:7:\"version\";s:5:\"6.8.3\";s:5:\"files\";a:536:{i:0;s:23:\"archives/editor-rtl.css\";i:1;s:27:\"archives/editor-rtl.min.css\";i:2;s:19:\"archives/editor.css\";i:3;s:23:\"archives/editor.min.css\";i:4;s:22:\"archives/style-rtl.css\";i:5;s:26:\"archives/style-rtl.min.css\";i:6;s:18:\"archives/style.css\";i:7;s:22:\"archives/style.min.css\";i:8;s:20:\"audio/editor-rtl.css\";i:9;s:24:\"audio/editor-rtl.min.css\";i:10;s:16:\"audio/editor.css\";i:11;s:20:\"audio/editor.min.css\";i:12;s:19:\"audio/style-rtl.css\";i:13;s:23:\"audio/style-rtl.min.css\";i:14;s:15:\"audio/style.css\";i:15;s:19:\"audio/style.min.css\";i:16;s:19:\"audio/theme-rtl.css\";i:17;s:23:\"audio/theme-rtl.min.css\";i:18;s:15:\"audio/theme.css\";i:19;s:19:\"audio/theme.min.css\";i:20;s:21:\"avatar/editor-rtl.css\";i:21;s:25:\"avatar/editor-rtl.min.css\";i:22;s:17:\"avatar/editor.css\";i:23;s:21:\"avatar/editor.min.css\";i:24;s:20:\"avatar/style-rtl.css\";i:25;s:24:\"avatar/style-rtl.min.css\";i:26;s:16:\"avatar/style.css\";i:27;s:20:\"avatar/style.min.css\";i:28;s:21:\"button/editor-rtl.css\";i:29;s:25:\"button/editor-rtl.min.css\";i:30;s:17:\"button/editor.css\";i:31;s:21:\"button/editor.min.css\";i:32;s:20:\"button/style-rtl.css\";i:33;s:24:\"button/style-rtl.min.css\";i:34;s:16:\"button/style.css\";i:35;s:20:\"button/style.min.css\";i:36;s:22:\"buttons/editor-rtl.css\";i:37;s:26:\"buttons/editor-rtl.min.css\";i:38;s:18:\"buttons/editor.css\";i:39;s:22:\"buttons/editor.min.css\";i:40;s:21:\"buttons/style-rtl.css\";i:41;s:25:\"buttons/style-rtl.min.css\";i:42;s:17:\"buttons/style.css\";i:43;s:21:\"buttons/style.min.css\";i:44;s:22:\"calendar/style-rtl.css\";i:45;s:26:\"calendar/style-rtl.min.css\";i:46;s:18:\"calendar/style.css\";i:47;s:22:\"calendar/style.min.css\";i:48;s:25:\"categories/editor-rtl.css\";i:49;s:29:\"categories/editor-rtl.min.css\";i:50;s:21:\"categories/editor.css\";i:51;s:25:\"categories/editor.min.css\";i:52;s:24:\"categories/style-rtl.css\";i:53;s:28:\"categories/style-rtl.min.css\";i:54;s:20:\"categories/style.css\";i:55;s:24:\"categories/style.min.css\";i:56;s:19:\"code/editor-rtl.css\";i:57;s:23:\"code/editor-rtl.min.css\";i:58;s:15:\"code/editor.css\";i:59;s:19:\"code/editor.min.css\";i:60;s:18:\"code/style-rtl.css\";i:61;s:22:\"code/style-rtl.min.css\";i:62;s:14:\"code/style.css\";i:63;s:18:\"code/style.min.css\";i:64;s:18:\"code/theme-rtl.css\";i:65;s:22:\"code/theme-rtl.min.css\";i:66;s:14:\"code/theme.css\";i:67;s:18:\"code/theme.min.css\";i:68;s:22:\"columns/editor-rtl.css\";i:69;s:26:\"columns/editor-rtl.min.css\";i:70;s:18:\"columns/editor.css\";i:71;s:22:\"columns/editor.min.css\";i:72;s:21:\"columns/style-rtl.css\";i:73;s:25:\"columns/style-rtl.min.css\";i:74;s:17:\"columns/style.css\";i:75;s:21:\"columns/style.min.css\";i:76;s:33:\"comment-author-name/style-rtl.css\";i:77;s:37:\"comment-author-name/style-rtl.min.css\";i:78;s:29:\"comment-author-name/style.css\";i:79;s:33:\"comment-author-name/style.min.css\";i:80;s:29:\"comment-content/style-rtl.css\";i:81;s:33:\"comment-content/style-rtl.min.css\";i:82;s:25:\"comment-content/style.css\";i:83;s:29:\"comment-content/style.min.css\";i:84;s:26:\"comment-date/style-rtl.css\";i:85;s:30:\"comment-date/style-rtl.min.css\";i:86;s:22:\"comment-date/style.css\";i:87;s:26:\"comment-date/style.min.css\";i:88;s:31:\"comment-edit-link/style-rtl.css\";i:89;s:35:\"comment-edit-link/style-rtl.min.css\";i:90;s:27:\"comment-edit-link/style.css\";i:91;s:31:\"comment-edit-link/style.min.css\";i:92;s:32:\"comment-reply-link/style-rtl.css\";i:93;s:36:\"comment-reply-link/style-rtl.min.css\";i:94;s:28:\"comment-reply-link/style.css\";i:95;s:32:\"comment-reply-link/style.min.css\";i:96;s:30:\"comment-template/style-rtl.css\";i:97;s:34:\"comment-template/style-rtl.min.css\";i:98;s:26:\"comment-template/style.css\";i:99;s:30:\"comment-template/style.min.css\";i:100;s:42:\"comments-pagination-numbers/editor-rtl.css\";i:101;s:46:\"comments-pagination-numbers/editor-rtl.min.css\";i:102;s:38:\"comments-pagination-numbers/editor.css\";i:103;s:42:\"comments-pagination-numbers/editor.min.css\";i:104;s:34:\"comments-pagination/editor-rtl.css\";i:105;s:38:\"comments-pagination/editor-rtl.min.css\";i:106;s:30:\"comments-pagination/editor.css\";i:107;s:34:\"comments-pagination/editor.min.css\";i:108;s:33:\"comments-pagination/style-rtl.css\";i:109;s:37:\"comments-pagination/style-rtl.min.css\";i:110;s:29:\"comments-pagination/style.css\";i:111;s:33:\"comments-pagination/style.min.css\";i:112;s:29:\"comments-title/editor-rtl.css\";i:113;s:33:\"comments-title/editor-rtl.min.css\";i:114;s:25:\"comments-title/editor.css\";i:115;s:29:\"comments-title/editor.min.css\";i:116;s:23:\"comments/editor-rtl.css\";i:117;s:27:\"comments/editor-rtl.min.css\";i:118;s:19:\"comments/editor.css\";i:119;s:23:\"comments/editor.min.css\";i:120;s:22:\"comments/style-rtl.css\";i:121;s:26:\"comments/style-rtl.min.css\";i:122;s:18:\"comments/style.css\";i:123;s:22:\"comments/style.min.css\";i:124;s:20:\"cover/editor-rtl.css\";i:125;s:24:\"cover/editor-rtl.min.css\";i:126;s:16:\"cover/editor.css\";i:127;s:20:\"cover/editor.min.css\";i:128;s:19:\"cover/style-rtl.css\";i:129;s:23:\"cover/style-rtl.min.css\";i:130;s:15:\"cover/style.css\";i:131;s:19:\"cover/style.min.css\";i:132;s:22:\"details/editor-rtl.css\";i:133;s:26:\"details/editor-rtl.min.css\";i:134;s:18:\"details/editor.css\";i:135;s:22:\"details/editor.min.css\";i:136;s:21:\"details/style-rtl.css\";i:137;s:25:\"details/style-rtl.min.css\";i:138;s:17:\"details/style.css\";i:139;s:21:\"details/style.min.css\";i:140;s:20:\"embed/editor-rtl.css\";i:141;s:24:\"embed/editor-rtl.min.css\";i:142;s:16:\"embed/editor.css\";i:143;s:20:\"embed/editor.min.css\";i:144;s:19:\"embed/style-rtl.css\";i:145;s:23:\"embed/style-rtl.min.css\";i:146;s:15:\"embed/style.css\";i:147;s:19:\"embed/style.min.css\";i:148;s:19:\"embed/theme-rtl.css\";i:149;s:23:\"embed/theme-rtl.min.css\";i:150;s:15:\"embed/theme.css\";i:151;s:19:\"embed/theme.min.css\";i:152;s:19:\"file/editor-rtl.css\";i:153;s:23:\"file/editor-rtl.min.css\";i:154;s:15:\"file/editor.css\";i:155;s:19:\"file/editor.min.css\";i:156;s:18:\"file/style-rtl.css\";i:157;s:22:\"file/style-rtl.min.css\";i:158;s:14:\"file/style.css\";i:159;s:18:\"file/style.min.css\";i:160;s:23:\"footnotes/style-rtl.css\";i:161;s:27:\"footnotes/style-rtl.min.css\";i:162;s:19:\"footnotes/style.css\";i:163;s:23:\"footnotes/style.min.css\";i:164;s:23:\"freeform/editor-rtl.css\";i:165;s:27:\"freeform/editor-rtl.min.css\";i:166;s:19:\"freeform/editor.css\";i:167;s:23:\"freeform/editor.min.css\";i:168;s:22:\"gallery/editor-rtl.css\";i:169;s:26:\"gallery/editor-rtl.min.css\";i:170;s:18:\"gallery/editor.css\";i:171;s:22:\"gallery/editor.min.css\";i:172;s:21:\"gallery/style-rtl.css\";i:173;s:25:\"gallery/style-rtl.min.css\";i:174;s:17:\"gallery/style.css\";i:175;s:21:\"gallery/style.min.css\";i:176;s:21:\"gallery/theme-rtl.css\";i:177;s:25:\"gallery/theme-rtl.min.css\";i:178;s:17:\"gallery/theme.css\";i:179;s:21:\"gallery/theme.min.css\";i:180;s:20:\"group/editor-rtl.css\";i:181;s:24:\"group/editor-rtl.min.css\";i:182;s:16:\"group/editor.css\";i:183;s:20:\"group/editor.min.css\";i:184;s:19:\"group/style-rtl.css\";i:185;s:23:\"group/style-rtl.min.css\";i:186;s:15:\"group/style.css\";i:187;s:19:\"group/style.min.css\";i:188;s:19:\"group/theme-rtl.css\";i:189;s:23:\"group/theme-rtl.min.css\";i:190;s:15:\"group/theme.css\";i:191;s:19:\"group/theme.min.css\";i:192;s:21:\"heading/style-rtl.css\";i:193;s:25:\"heading/style-rtl.min.css\";i:194;s:17:\"heading/style.css\";i:195;s:21:\"heading/style.min.css\";i:196;s:19:\"html/editor-rtl.css\";i:197;s:23:\"html/editor-rtl.min.css\";i:198;s:15:\"html/editor.css\";i:199;s:19:\"html/editor.min.css\";i:200;s:20:\"image/editor-rtl.css\";i:201;s:24:\"image/editor-rtl.min.css\";i:202;s:16:\"image/editor.css\";i:203;s:20:\"image/editor.min.css\";i:204;s:19:\"image/style-rtl.css\";i:205;s:23:\"image/style-rtl.min.css\";i:206;s:15:\"image/style.css\";i:207;s:19:\"image/style.min.css\";i:208;s:19:\"image/theme-rtl.css\";i:209;s:23:\"image/theme-rtl.min.css\";i:210;s:15:\"image/theme.css\";i:211;s:19:\"image/theme.min.css\";i:212;s:29:\"latest-comments/style-rtl.css\";i:213;s:33:\"latest-comments/style-rtl.min.css\";i:214;s:25:\"latest-comments/style.css\";i:215;s:29:\"latest-comments/style.min.css\";i:216;s:27:\"latest-posts/editor-rtl.css\";i:217;s:31:\"latest-posts/editor-rtl.min.css\";i:218;s:23:\"latest-posts/editor.css\";i:219;s:27:\"latest-posts/editor.min.css\";i:220;s:26:\"latest-posts/style-rtl.css\";i:221;s:30:\"latest-posts/style-rtl.min.css\";i:222;s:22:\"latest-posts/style.css\";i:223;s:26:\"latest-posts/style.min.css\";i:224;s:18:\"list/style-rtl.css\";i:225;s:22:\"list/style-rtl.min.css\";i:226;s:14:\"list/style.css\";i:227;s:18:\"list/style.min.css\";i:228;s:22:\"loginout/style-rtl.css\";i:229;s:26:\"loginout/style-rtl.min.css\";i:230;s:18:\"loginout/style.css\";i:231;s:22:\"loginout/style.min.css\";i:232;s:25:\"media-text/editor-rtl.css\";i:233;s:29:\"media-text/editor-rtl.min.css\";i:234;s:21:\"media-text/editor.css\";i:235;s:25:\"media-text/editor.min.css\";i:236;s:24:\"media-text/style-rtl.css\";i:237;s:28:\"media-text/style-rtl.min.css\";i:238;s:20:\"media-text/style.css\";i:239;s:24:\"media-text/style.min.css\";i:240;s:19:\"more/editor-rtl.css\";i:241;s:23:\"more/editor-rtl.min.css\";i:242;s:15:\"more/editor.css\";i:243;s:19:\"more/editor.min.css\";i:244;s:30:\"navigation-link/editor-rtl.css\";i:245;s:34:\"navigation-link/editor-rtl.min.css\";i:246;s:26:\"navigation-link/editor.css\";i:247;s:30:\"navigation-link/editor.min.css\";i:248;s:29:\"navigation-link/style-rtl.css\";i:249;s:33:\"navigation-link/style-rtl.min.css\";i:250;s:25:\"navigation-link/style.css\";i:251;s:29:\"navigation-link/style.min.css\";i:252;s:33:\"navigation-submenu/editor-rtl.css\";i:253;s:37:\"navigation-submenu/editor-rtl.min.css\";i:254;s:29:\"navigation-submenu/editor.css\";i:255;s:33:\"navigation-submenu/editor.min.css\";i:256;s:25:\"navigation/editor-rtl.css\";i:257;s:29:\"navigation/editor-rtl.min.css\";i:258;s:21:\"navigation/editor.css\";i:259;s:25:\"navigation/editor.min.css\";i:260;s:24:\"navigation/style-rtl.css\";i:261;s:28:\"navigation/style-rtl.min.css\";i:262;s:20:\"navigation/style.css\";i:263;s:24:\"navigation/style.min.css\";i:264;s:23:\"nextpage/editor-rtl.css\";i:265;s:27:\"nextpage/editor-rtl.min.css\";i:266;s:19:\"nextpage/editor.css\";i:267;s:23:\"nextpage/editor.min.css\";i:268;s:24:\"page-list/editor-rtl.css\";i:269;s:28:\"page-list/editor-rtl.min.css\";i:270;s:20:\"page-list/editor.css\";i:271;s:24:\"page-list/editor.min.css\";i:272;s:23:\"page-list/style-rtl.css\";i:273;s:27:\"page-list/style-rtl.min.css\";i:274;s:19:\"page-list/style.css\";i:275;s:23:\"page-list/style.min.css\";i:276;s:24:\"paragraph/editor-rtl.css\";i:277;s:28:\"paragraph/editor-rtl.min.css\";i:278;s:20:\"paragraph/editor.css\";i:279;s:24:\"paragraph/editor.min.css\";i:280;s:23:\"paragraph/style-rtl.css\";i:281;s:27:\"paragraph/style-rtl.min.css\";i:282;s:19:\"paragraph/style.css\";i:283;s:23:\"paragraph/style.min.css\";i:284;s:35:\"post-author-biography/style-rtl.css\";i:285;s:39:\"post-author-biography/style-rtl.min.css\";i:286;s:31:\"post-author-biography/style.css\";i:287;s:35:\"post-author-biography/style.min.css\";i:288;s:30:\"post-author-name/style-rtl.css\";i:289;s:34:\"post-author-name/style-rtl.min.css\";i:290;s:26:\"post-author-name/style.css\";i:291;s:30:\"post-author-name/style.min.css\";i:292;s:26:\"post-author/editor-rtl.css\";i:293;s:30:\"post-author/editor-rtl.min.css\";i:294;s:22:\"post-author/editor.css\";i:295;s:26:\"post-author/editor.min.css\";i:296;s:25:\"post-author/style-rtl.css\";i:297;s:29:\"post-author/style-rtl.min.css\";i:298;s:21:\"post-author/style.css\";i:299;s:25:\"post-author/style.min.css\";i:300;s:33:\"post-comments-form/editor-rtl.css\";i:301;s:37:\"post-comments-form/editor-rtl.min.css\";i:302;s:29:\"post-comments-form/editor.css\";i:303;s:33:\"post-comments-form/editor.min.css\";i:304;s:32:\"post-comments-form/style-rtl.css\";i:305;s:36:\"post-comments-form/style-rtl.min.css\";i:306;s:28:\"post-comments-form/style.css\";i:307;s:32:\"post-comments-form/style.min.css\";i:308;s:26:\"post-content/style-rtl.css\";i:309;s:30:\"post-content/style-rtl.min.css\";i:310;s:22:\"post-content/style.css\";i:311;s:26:\"post-content/style.min.css\";i:312;s:23:\"post-date/style-rtl.css\";i:313;s:27:\"post-date/style-rtl.min.css\";i:314;s:19:\"post-date/style.css\";i:315;s:23:\"post-date/style.min.css\";i:316;s:27:\"post-excerpt/editor-rtl.css\";i:317;s:31:\"post-excerpt/editor-rtl.min.css\";i:318;s:23:\"post-excerpt/editor.css\";i:319;s:27:\"post-excerpt/editor.min.css\";i:320;s:26:\"post-excerpt/style-rtl.css\";i:321;s:30:\"post-excerpt/style-rtl.min.css\";i:322;s:22:\"post-excerpt/style.css\";i:323;s:26:\"post-excerpt/style.min.css\";i:324;s:34:\"post-featured-image/editor-rtl.css\";i:325;s:38:\"post-featured-image/editor-rtl.min.css\";i:326;s:30:\"post-featured-image/editor.css\";i:327;s:34:\"post-featured-image/editor.min.css\";i:328;s:33:\"post-featured-image/style-rtl.css\";i:329;s:37:\"post-featured-image/style-rtl.min.css\";i:330;s:29:\"post-featured-image/style.css\";i:331;s:33:\"post-featured-image/style.min.css\";i:332;s:34:\"post-navigation-link/style-rtl.css\";i:333;s:38:\"post-navigation-link/style-rtl.min.css\";i:334;s:30:\"post-navigation-link/style.css\";i:335;s:34:\"post-navigation-link/style.min.css\";i:336;s:27:\"post-template/style-rtl.css\";i:337;s:31:\"post-template/style-rtl.min.css\";i:338;s:23:\"post-template/style.css\";i:339;s:27:\"post-template/style.min.css\";i:340;s:24:\"post-terms/style-rtl.css\";i:341;s:28:\"post-terms/style-rtl.min.css\";i:342;s:20:\"post-terms/style.css\";i:343;s:24:\"post-terms/style.min.css\";i:344;s:24:\"post-title/style-rtl.css\";i:345;s:28:\"post-title/style-rtl.min.css\";i:346;s:20:\"post-title/style.css\";i:347;s:24:\"post-title/style.min.css\";i:348;s:26:\"preformatted/style-rtl.css\";i:349;s:30:\"preformatted/style-rtl.min.css\";i:350;s:22:\"preformatted/style.css\";i:351;s:26:\"preformatted/style.min.css\";i:352;s:24:\"pullquote/editor-rtl.css\";i:353;s:28:\"pullquote/editor-rtl.min.css\";i:354;s:20:\"pullquote/editor.css\";i:355;s:24:\"pullquote/editor.min.css\";i:356;s:23:\"pullquote/style-rtl.css\";i:357;s:27:\"pullquote/style-rtl.min.css\";i:358;s:19:\"pullquote/style.css\";i:359;s:23:\"pullquote/style.min.css\";i:360;s:23:\"pullquote/theme-rtl.css\";i:361;s:27:\"pullquote/theme-rtl.min.css\";i:362;s:19:\"pullquote/theme.css\";i:363;s:23:\"pullquote/theme.min.css\";i:364;s:39:\"query-pagination-numbers/editor-rtl.css\";i:365;s:43:\"query-pagination-numbers/editor-rtl.min.css\";i:366;s:35:\"query-pagination-numbers/editor.css\";i:367;s:39:\"query-pagination-numbers/editor.min.css\";i:368;s:31:\"query-pagination/editor-rtl.css\";i:369;s:35:\"query-pagination/editor-rtl.min.css\";i:370;s:27:\"query-pagination/editor.css\";i:371;s:31:\"query-pagination/editor.min.css\";i:372;s:30:\"query-pagination/style-rtl.css\";i:373;s:34:\"query-pagination/style-rtl.min.css\";i:374;s:26:\"query-pagination/style.css\";i:375;s:30:\"query-pagination/style.min.css\";i:376;s:25:\"query-title/style-rtl.css\";i:377;s:29:\"query-title/style-rtl.min.css\";i:378;s:21:\"query-title/style.css\";i:379;s:25:\"query-title/style.min.css\";i:380;s:25:\"query-total/style-rtl.css\";i:381;s:29:\"query-total/style-rtl.min.css\";i:382;s:21:\"query-total/style.css\";i:383;s:25:\"query-total/style.min.css\";i:384;s:20:\"query/editor-rtl.css\";i:385;s:24:\"query/editor-rtl.min.css\";i:386;s:16:\"query/editor.css\";i:387;s:20:\"query/editor.min.css\";i:388;s:19:\"quote/style-rtl.css\";i:389;s:23:\"quote/style-rtl.min.css\";i:390;s:15:\"quote/style.css\";i:391;s:19:\"quote/style.min.css\";i:392;s:19:\"quote/theme-rtl.css\";i:393;s:23:\"quote/theme-rtl.min.css\";i:394;s:15:\"quote/theme.css\";i:395;s:19:\"quote/theme.min.css\";i:396;s:23:\"read-more/style-rtl.css\";i:397;s:27:\"read-more/style-rtl.min.css\";i:398;s:19:\"read-more/style.css\";i:399;s:23:\"read-more/style.min.css\";i:400;s:18:\"rss/editor-rtl.css\";i:401;s:22:\"rss/editor-rtl.min.css\";i:402;s:14:\"rss/editor.css\";i:403;s:18:\"rss/editor.min.css\";i:404;s:17:\"rss/style-rtl.css\";i:405;s:21:\"rss/style-rtl.min.css\";i:406;s:13:\"rss/style.css\";i:407;s:17:\"rss/style.min.css\";i:408;s:21:\"search/editor-rtl.css\";i:409;s:25:\"search/editor-rtl.min.css\";i:410;s:17:\"search/editor.css\";i:411;s:21:\"search/editor.min.css\";i:412;s:20:\"search/style-rtl.css\";i:413;s:24:\"search/style-rtl.min.css\";i:414;s:16:\"search/style.css\";i:415;s:20:\"search/style.min.css\";i:416;s:20:\"search/theme-rtl.css\";i:417;s:24:\"search/theme-rtl.min.css\";i:418;s:16:\"search/theme.css\";i:419;s:20:\"search/theme.min.css\";i:420;s:24:\"separator/editor-rtl.css\";i:421;s:28:\"separator/editor-rtl.min.css\";i:422;s:20:\"separator/editor.css\";i:423;s:24:\"separator/editor.min.css\";i:424;s:23:\"separator/style-rtl.css\";i:425;s:27:\"separator/style-rtl.min.css\";i:426;s:19:\"separator/style.css\";i:427;s:23:\"separator/style.min.css\";i:428;s:23:\"separator/theme-rtl.css\";i:429;s:27:\"separator/theme-rtl.min.css\";i:430;s:19:\"separator/theme.css\";i:431;s:23:\"separator/theme.min.css\";i:432;s:24:\"shortcode/editor-rtl.css\";i:433;s:28:\"shortcode/editor-rtl.min.css\";i:434;s:20:\"shortcode/editor.css\";i:435;s:24:\"shortcode/editor.min.css\";i:436;s:24:\"site-logo/editor-rtl.css\";i:437;s:28:\"site-logo/editor-rtl.min.css\";i:438;s:20:\"site-logo/editor.css\";i:439;s:24:\"site-logo/editor.min.css\";i:440;s:23:\"site-logo/style-rtl.css\";i:441;s:27:\"site-logo/style-rtl.min.css\";i:442;s:19:\"site-logo/style.css\";i:443;s:23:\"site-logo/style.min.css\";i:444;s:27:\"site-tagline/editor-rtl.css\";i:445;s:31:\"site-tagline/editor-rtl.min.css\";i:446;s:23:\"site-tagline/editor.css\";i:447;s:27:\"site-tagline/editor.min.css\";i:448;s:26:\"site-tagline/style-rtl.css\";i:449;s:30:\"site-tagline/style-rtl.min.css\";i:450;s:22:\"site-tagline/style.css\";i:451;s:26:\"site-tagline/style.min.css\";i:452;s:25:\"site-title/editor-rtl.css\";i:453;s:29:\"site-title/editor-rtl.min.css\";i:454;s:21:\"site-title/editor.css\";i:455;s:25:\"site-title/editor.min.css\";i:456;s:24:\"site-title/style-rtl.css\";i:457;s:28:\"site-title/style-rtl.min.css\";i:458;s:20:\"site-title/style.css\";i:459;s:24:\"site-title/style.min.css\";i:460;s:26:\"social-link/editor-rtl.css\";i:461;s:30:\"social-link/editor-rtl.min.css\";i:462;s:22:\"social-link/editor.css\";i:463;s:26:\"social-link/editor.min.css\";i:464;s:27:\"social-links/editor-rtl.css\";i:465;s:31:\"social-links/editor-rtl.min.css\";i:466;s:23:\"social-links/editor.css\";i:467;s:27:\"social-links/editor.min.css\";i:468;s:26:\"social-links/style-rtl.css\";i:469;s:30:\"social-links/style-rtl.min.css\";i:470;s:22:\"social-links/style.css\";i:471;s:26:\"social-links/style.min.css\";i:472;s:21:\"spacer/editor-rtl.css\";i:473;s:25:\"spacer/editor-rtl.min.css\";i:474;s:17:\"spacer/editor.css\";i:475;s:21:\"spacer/editor.min.css\";i:476;s:20:\"spacer/style-rtl.css\";i:477;s:24:\"spacer/style-rtl.min.css\";i:478;s:16:\"spacer/style.css\";i:479;s:20:\"spacer/style.min.css\";i:480;s:20:\"table/editor-rtl.css\";i:481;s:24:\"table/editor-rtl.min.css\";i:482;s:16:\"table/editor.css\";i:483;s:20:\"table/editor.min.css\";i:484;s:19:\"table/style-rtl.css\";i:485;s:23:\"table/style-rtl.min.css\";i:486;s:15:\"table/style.css\";i:487;s:19:\"table/style.min.css\";i:488;s:19:\"table/theme-rtl.css\";i:489;s:23:\"table/theme-rtl.min.css\";i:490;s:15:\"table/theme.css\";i:491;s:19:\"table/theme.min.css\";i:492;s:24:\"tag-cloud/editor-rtl.css\";i:493;s:28:\"tag-cloud/editor-rtl.min.css\";i:494;s:20:\"tag-cloud/editor.css\";i:495;s:24:\"tag-cloud/editor.min.css\";i:496;s:23:\"tag-cloud/style-rtl.css\";i:497;s:27:\"tag-cloud/style-rtl.min.css\";i:498;s:19:\"tag-cloud/style.css\";i:499;s:23:\"tag-cloud/style.min.css\";i:500;s:28:\"template-part/editor-rtl.css\";i:501;s:32:\"template-part/editor-rtl.min.css\";i:502;s:24:\"template-part/editor.css\";i:503;s:28:\"template-part/editor.min.css\";i:504;s:27:\"template-part/theme-rtl.css\";i:505;s:31:\"template-part/theme-rtl.min.css\";i:506;s:23:\"template-part/theme.css\";i:507;s:27:\"template-part/theme.min.css\";i:508;s:30:\"term-description/style-rtl.css\";i:509;s:34:\"term-description/style-rtl.min.css\";i:510;s:26:\"term-description/style.css\";i:511;s:30:\"term-description/style.min.css\";i:512;s:27:\"text-columns/editor-rtl.css\";i:513;s:31:\"text-columns/editor-rtl.min.css\";i:514;s:23:\"text-columns/editor.css\";i:515;s:27:\"text-columns/editor.min.css\";i:516;s:26:\"text-columns/style-rtl.css\";i:517;s:30:\"text-columns/style-rtl.min.css\";i:518;s:22:\"text-columns/style.css\";i:519;s:26:\"text-columns/style.min.css\";i:520;s:19:\"verse/style-rtl.css\";i:521;s:23:\"verse/style-rtl.min.css\";i:522;s:15:\"verse/style.css\";i:523;s:19:\"verse/style.min.css\";i:524;s:20:\"video/editor-rtl.css\";i:525;s:24:\"video/editor-rtl.min.css\";i:526;s:16:\"video/editor.css\";i:527;s:20:\"video/editor.min.css\";i:528;s:19:\"video/style-rtl.css\";i:529;s:23:\"video/style-rtl.min.css\";i:530;s:15:\"video/style.css\";i:531;s:19:\"video/style.min.css\";i:532;s:19:\"video/theme-rtl.css\";i:533;s:23:\"video/theme-rtl.min.css\";i:534;s:15:\"video/theme.css\";i:535;s:19:\"video/theme.min.css\";}}','on'),(124,'_transient_doing_cron','1764371701.4586930274963378906250','on'),(125,'theme_mods_twentytwentyfive','a:2:{s:18:\"custom_css_post_id\";i:-1;s:16:\"sidebars_widgets\";a:2:{s:4:\"time\";i:1764367183;s:4:\"data\";a:3:{s:19:\"wp_inactive_widgets\";a:0:{}s:9:\"sidebar-1\";a:3:{i:0;s:7:\"block-2\";i:1;s:7:\"block-3\";i:2;s:7:\"block-4\";}s:9:\"sidebar-2\";a:2:{i:0;s:7:\"block-5\";i:1;s:7:\"block-6\";}}}}','off'),(126,'_transient_wp_styles_for_blocks','a:2:{s:4:\"hash\";s:32:\"64ad95698215776f80fa1e80f2eb5417\";s:6:\"blocks\";a:7:{s:11:\"core/button\";s:0:\"\";s:14:\"core/site-logo\";s:0:\"\";s:18:\"core/post-template\";s:0:\"\";s:12:\"core/columns\";s:0:\"\";s:14:\"core/pullquote\";s:121:\":root :where(.wp-block-pullquote){font-size: clamp(0.984em, 0.984rem + ((1vw - 0.2em) * 0.938), 1.5em);line-height: 1.6;}\";s:15:\"core/site-title\";s:89:\":root :where(.wp-block-site-title){font-family: var(--wp--preset--font-family--display);}\";s:15:\"core/navigation\";s:86:\":root :where(.wp-block-navigation){font-family: var(--wp--preset--font-family--body);}\";}}','on'),(129,'category_children','a:0:{}','auto'),(132,'_site_transient_update_themes','O:8:\"stdClass\":5:{s:12:\"last_checked\";i:1764371702;s:7:\"checked\";a:4:{s:8:\"homeproz\";s:5:\"1.0.0\";s:16:\"twentytwentyfive\";s:3:\"1.3\";s:16:\"twentytwentyfour\";s:3:\"1.3\";s:17:\"twentytwentythree\";s:3:\"1.6\";}s:8:\"response\";a:0:{}s:9:\"no_update\";a:3:{s:16:\"twentytwentyfive\";a:6:{s:5:\"theme\";s:16:\"twentytwentyfive\";s:11:\"new_version\";s:3:\"1.3\";s:3:\"url\";s:46:\"https://wordpress.org/themes/twentytwentyfive/\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/theme/twentytwentyfive.1.3.zip\";s:8:\"requires\";s:3:\"6.7\";s:12:\"requires_php\";s:3:\"7.2\";}s:16:\"twentytwentyfour\";a:6:{s:5:\"theme\";s:16:\"twentytwentyfour\";s:11:\"new_version\";s:3:\"1.3\";s:3:\"url\";s:46:\"https://wordpress.org/themes/twentytwentyfour/\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/theme/twentytwentyfour.1.3.zip\";s:8:\"requires\";s:3:\"6.4\";s:12:\"requires_php\";s:3:\"7.0\";}s:17:\"twentytwentythree\";a:6:{s:5:\"theme\";s:17:\"twentytwentythree\";s:11:\"new_version\";s:3:\"1.6\";s:3:\"url\";s:47:\"https://wordpress.org/themes/twentytwentythree/\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/theme/twentytwentythree.1.6.zip\";s:8:\"requires\";s:3:\"6.1\";s:12:\"requires_php\";s:3:\"5.6\";}}s:12:\"translations\";a:0:{}}','off'),(133,'current_theme','HomeProz','auto'),(134,'theme_switched','','auto'),(135,'theme_mods_homeproz','a:2:{s:18:\"nav_menu_locations\";a:1:{s:7:\"primary\";i:15;}s:18:\"custom_css_post_id\";i:-1;}','auto'),(141,'property_type_children','a:0:{}','auto'),(144,'property_status_children','a:0:{}','auto'),(150,'property_location_children','a:0:{}','auto'),(152,'_site_transient_update_core','O:8:\"stdClass\":4:{s:7:\"updates\";a:1:{i:0;O:8:\"stdClass\":10:{s:8:\"response\";s:6:\"latest\";s:8:\"download\";s:59:\"https://downloads.wordpress.org/release/wordpress-6.8.3.zip\";s:6:\"locale\";s:5:\"en_US\";s:8:\"packages\";O:8:\"stdClass\":5:{s:4:\"full\";s:59:\"https://downloads.wordpress.org/release/wordpress-6.8.3.zip\";s:10:\"no_content\";s:70:\"https://downloads.wordpress.org/release/wordpress-6.8.3-no-content.zip\";s:11:\"new_bundled\";s:71:\"https://downloads.wordpress.org/release/wordpress-6.8.3-new-bundled.zip\";s:7:\"partial\";s:0:\"\";s:8:\"rollback\";s:0:\"\";}s:7:\"current\";s:5:\"6.8.3\";s:7:\"version\";s:5:\"6.8.3\";s:11:\"php_version\";s:6:\"7.2.24\";s:13:\"mysql_version\";s:5:\"5.5.5\";s:11:\"new_bundled\";s:3:\"6.7\";s:15:\"partial_version\";s:0:\"\";}}s:12:\"last_checked\";i:1764371702;s:15:\"version_checked\";s:5:\"6.8.3\";s:12:\"translations\";a:0:{}}','off'),(156,'acf_first_activated_version','6.6.2','on'),(157,'acf_site_health','{\"event_first_activated\":1764369116,\"last_updated\":1764369116}','off'),(158,'_site_transient_timeout_wp_theme_files_patterns-2aae27f1f26ef7a6be8ebee5c8a6a86b','1764372438','off'),(159,'_site_transient_wp_theme_files_patterns-2aae27f1f26ef7a6be8ebee5c8a6a86b','a:2:{s:7:\"version\";s:5:\"1.0.0\";s:8:\"patterns\";a:0:{}}','off'),(162,'wpcf7','a:2:{s:7:\"version\";s:5:\"6.1.3\";s:13:\"bulk_validate\";a:4:{s:9:\"timestamp\";i:1764370639;s:7:\"version\";s:5:\"6.1.3\";s:11:\"count_valid\";i:1;s:13:\"count_invalid\";i:0;}}','auto'),(165,'_site_transient_timeout_theme_roots','1764373103','off'),(166,'_site_transient_theme_roots','a:4:{s:8:\"homeproz\";s:7:\"/themes\";s:16:\"twentytwentyfive\";s:7:\"/themes\";s:16:\"twentytwentyfour\";s:7:\"/themes\";s:17:\"twentytwentythree\";s:7:\"/themes\";}','off'),(167,'yoast_migrations_free','a:1:{s:7:\"version\";s:4:\"26.4\";}','auto'),(168,'wpseo','a:120:{s:8:\"tracking\";b:0;s:16:\"toggled_tracking\";b:0;s:22:\"license_server_version\";b:0;s:15:\"ms_defaults_set\";b:0;s:40:\"ignore_search_engines_discouraged_notice\";b:0;s:19:\"indexing_first_time\";b:1;s:16:\"indexing_started\";b:0;s:15:\"indexing_reason\";s:24:\"attachments_made_enabled\";s:29:\"indexables_indexing_completed\";b:0;s:13:\"index_now_key\";s:0:\"\";s:7:\"version\";s:4:\"26.4\";s:16:\"previous_version\";s:0:\"\";s:20:\"disableadvanced_meta\";b:1;s:30:\"enable_headless_rest_endpoints\";b:1;s:17:\"ryte_indexability\";b:0;s:11:\"baiduverify\";s:0:\"\";s:12:\"googleverify\";s:0:\"\";s:8:\"msverify\";s:0:\"\";s:12:\"yandexverify\";s:0:\"\";s:12:\"ahrefsverify\";s:0:\"\";s:9:\"site_type\";s:0:\"\";s:20:\"has_multiple_authors\";s:0:\"\";s:16:\"environment_type\";s:0:\"\";s:23:\"content_analysis_active\";b:1;s:23:\"keyword_analysis_active\";b:1;s:34:\"inclusive_language_analysis_active\";b:0;s:21:\"enable_admin_bar_menu\";b:1;s:26:\"enable_cornerstone_content\";b:1;s:18:\"enable_xml_sitemap\";b:1;s:24:\"enable_text_link_counter\";b:1;s:16:\"enable_index_now\";b:1;s:19:\"enable_ai_generator\";b:1;s:22:\"ai_enabled_pre_default\";b:0;s:22:\"show_onboarding_notice\";b:1;s:18:\"first_activated_on\";i:1764371307;s:13:\"myyoast-oauth\";b:0;s:26:\"semrush_integration_active\";b:1;s:14:\"semrush_tokens\";a:0:{}s:20:\"semrush_country_code\";s:2:\"us\";s:19:\"permalink_structure\";s:0:\"\";s:8:\"home_url\";s:0:\"\";s:18:\"dynamic_permalinks\";b:0;s:17:\"category_base_url\";s:0:\"\";s:12:\"tag_base_url\";s:0:\"\";s:21:\"custom_taxonomy_slugs\";a:0:{}s:29:\"enable_enhanced_slack_sharing\";b:1;s:23:\"enable_metabox_insights\";b:1;s:23:\"enable_link_suggestions\";b:1;s:26:\"algolia_integration_active\";b:0;s:14:\"import_cursors\";a:0:{}s:13:\"workouts_data\";a:1:{s:13:\"configuration\";a:1:{s:13:\"finishedSteps\";a:0:{}}}s:28:\"configuration_finished_steps\";a:0:{}s:36:\"dismiss_configuration_workout_notice\";b:0;s:34:\"dismiss_premium_deactivated_notice\";b:0;s:19:\"importing_completed\";a:0:{}s:26:\"wincher_integration_active\";b:1;s:14:\"wincher_tokens\";a:0:{}s:36:\"wincher_automatically_add_keyphrases\";b:0;s:18:\"wincher_website_id\";s:0:\"\";s:18:\"first_time_install\";b:1;s:34:\"should_redirect_after_install_free\";b:0;s:34:\"activation_redirect_timestamp_free\";i:1764371307;s:18:\"remove_feed_global\";b:0;s:27:\"remove_feed_global_comments\";b:0;s:25:\"remove_feed_post_comments\";b:0;s:19:\"remove_feed_authors\";b:0;s:22:\"remove_feed_categories\";b:0;s:16:\"remove_feed_tags\";b:0;s:29:\"remove_feed_custom_taxonomies\";b:0;s:22:\"remove_feed_post_types\";b:0;s:18:\"remove_feed_search\";b:0;s:21:\"remove_atom_rdf_feeds\";b:0;s:17:\"remove_shortlinks\";b:0;s:21:\"remove_rest_api_links\";b:0;s:20:\"remove_rsd_wlw_links\";b:0;s:19:\"remove_oembed_links\";b:0;s:16:\"remove_generator\";b:0;s:20:\"remove_emoji_scripts\";b:0;s:24:\"remove_powered_by_header\";b:0;s:22:\"remove_pingback_header\";b:0;s:28:\"clean_campaign_tracking_urls\";b:0;s:16:\"clean_permalinks\";b:0;s:32:\"clean_permalinks_extra_variables\";s:0:\"\";s:14:\"search_cleanup\";b:0;s:20:\"search_cleanup_emoji\";b:0;s:23:\"search_cleanup_patterns\";b:0;s:22:\"search_character_limit\";i:50;s:20:\"deny_search_crawling\";b:0;s:21:\"deny_wp_json_crawling\";b:0;s:20:\"deny_adsbot_crawling\";b:0;s:19:\"deny_ccbot_crawling\";b:0;s:29:\"deny_google_extended_crawling\";b:0;s:20:\"deny_gptbot_crawling\";b:0;s:27:\"redirect_search_pretty_urls\";b:0;s:29:\"least_readability_ignore_list\";a:0:{}s:27:\"least_seo_score_ignore_list\";a:0:{}s:23:\"most_linked_ignore_list\";a:0:{}s:24:\"least_linked_ignore_list\";a:0:{}s:28:\"indexables_page_reading_list\";a:5:{i:0;b:0;i:1;b:0;i:2;b:0;i:3;b:0;i:4;b:0;}s:25:\"indexables_overview_state\";s:21:\"dashboard-not-visited\";s:28:\"last_known_public_post_types\";a:0:{}s:28:\"last_known_public_taxonomies\";a:0:{}s:23:\"last_known_no_unindexed\";a:0:{}s:14:\"new_post_types\";a:0:{}s:14:\"new_taxonomies\";a:0:{}s:34:\"show_new_content_type_notification\";b:0;s:44:\"site_kit_configuration_permanently_dismissed\";b:0;s:18:\"site_kit_connected\";b:0;s:37:\"site_kit_tracking_setup_widget_loaded\";s:2:\"no\";s:41:\"site_kit_tracking_first_interaction_stage\";s:0:\"\";s:40:\"site_kit_tracking_last_interaction_stage\";s:0:\"\";s:52:\"site_kit_tracking_setup_widget_temporarily_dismissed\";s:2:\"no\";s:52:\"site_kit_tracking_setup_widget_permanently_dismissed\";s:2:\"no\";s:31:\"google_site_kit_feature_enabled\";b:0;s:25:\"ai_free_sparks_started_on\";N;s:15:\"enable_llms_txt\";b:0;s:15:\"last_updated_on\";b:0;s:17:\"default_seo_title\";a:0:{}s:21:\"default_seo_meta_desc\";a:0:{}s:18:\"first_activated_by\";i:0;}','auto'),(169,'wpseo_titles','a:173:{s:17:\"forcerewritetitle\";b:0;s:9:\"separator\";s:7:\"sc-dash\";s:16:\"title-home-wpseo\";s:47:\"HomeProz Real Estate | Albert Lea MN Properties\";s:18:\"title-author-wpseo\";s:41:\"%%name%%, Author at %%sitename%% %%page%%\";s:19:\"title-archive-wpseo\";s:38:\"%%date%% %%page%% %%sep%% %%sitename%%\";s:18:\"title-search-wpseo\";s:63:\"You searched for %%searchphrase%% %%page%% %%sep%% %%sitename%%\";s:15:\"title-404-wpseo\";s:35:\"Page not found %%sep%% %%sitename%%\";s:25:\"social-title-author-wpseo\";s:8:\"%%name%%\";s:26:\"social-title-archive-wpseo\";s:8:\"%%date%%\";s:31:\"social-description-author-wpseo\";s:0:\"\";s:32:\"social-description-archive-wpseo\";s:0:\"\";s:29:\"social-image-url-author-wpseo\";s:0:\"\";s:30:\"social-image-url-archive-wpseo\";s:0:\"\";s:28:\"social-image-id-author-wpseo\";i:0;s:29:\"social-image-id-archive-wpseo\";i:0;s:19:\"metadesc-home-wpseo\";s:120:\"HomeProz Real Estate - Your trusted partner for buying and selling homes in Albert Lea, Minnesota and surrounding areas.\";s:21:\"metadesc-author-wpseo\";s:0:\"\";s:22:\"metadesc-archive-wpseo\";s:0:\"\";s:9:\"rssbefore\";s:0:\"\";s:8:\"rssafter\";s:53:\"The post %%POSTLINK%% appeared first on %%BLOGLINK%%.\";s:20:\"noindex-author-wpseo\";b:0;s:28:\"noindex-author-noposts-wpseo\";b:0;s:21:\"noindex-archive-wpseo\";b:0;s:14:\"disable-author\";b:0;s:12:\"disable-date\";b:0;s:19:\"disable-post_format\";b:0;s:18:\"disable-attachment\";b:0;s:20:\"breadcrumbs-404crumb\";s:25:\"Error 404: Page not found\";s:29:\"breadcrumbs-display-blog-page\";b:0;s:20:\"breadcrumbs-boldlast\";b:0;s:25:\"breadcrumbs-archiveprefix\";s:12:\"Archives for\";s:18:\"breadcrumbs-enable\";b:0;s:16:\"breadcrumbs-home\";s:4:\"Home\";s:18:\"breadcrumbs-prefix\";s:0:\"\";s:24:\"breadcrumbs-searchprefix\";s:16:\"You searched for\";s:15:\"breadcrumbs-sep\";s:2:\"»\";s:12:\"website_name\";s:0:\"\";s:11:\"person_name\";s:0:\"\";s:11:\"person_logo\";s:0:\"\";s:22:\"alternate_website_name\";s:0:\"\";s:12:\"company_logo\";s:0:\"\";s:12:\"company_name\";s:0:\"\";s:22:\"company_alternate_name\";s:0:\"\";s:17:\"company_or_person\";s:7:\"company\";s:25:\"company_or_person_user_id\";b:0;s:17:\"stripcategorybase\";b:0;s:26:\"open_graph_frontpage_title\";s:12:\"%%sitename%%\";s:25:\"open_graph_frontpage_desc\";s:0:\"\";s:26:\"open_graph_frontpage_image\";s:0:\"\";s:24:\"publishing_principles_id\";i:0;s:25:\"ownership_funding_info_id\";i:0;s:29:\"actionable_feedback_policy_id\";i:0;s:21:\"corrections_policy_id\";i:0;s:16:\"ethics_policy_id\";i:0;s:19:\"diversity_policy_id\";i:0;s:28:\"diversity_staffing_report_id\";i:0;s:15:\"org-description\";s:0:\"\";s:9:\"org-email\";s:0:\"\";s:9:\"org-phone\";s:0:\"\";s:14:\"org-legal-name\";s:0:\"\";s:17:\"org-founding-date\";s:0:\"\";s:20:\"org-number-employees\";s:0:\"\";s:10:\"org-vat-id\";s:0:\"\";s:10:\"org-tax-id\";s:0:\"\";s:7:\"org-iso\";s:0:\"\";s:8:\"org-duns\";s:0:\"\";s:11:\"org-leicode\";s:0:\"\";s:9:\"org-naics\";s:0:\"\";s:10:\"title-post\";s:39:\"%%title%% %%page%% %%sep%% %%sitename%%\";s:13:\"metadesc-post\";s:0:\"\";s:12:\"noindex-post\";b:0;s:23:\"display-metabox-pt-post\";b:0;s:23:\"post_types-post-maintax\";i:0;s:21:\"schema-page-type-post\";s:7:\"WebPage\";s:24:\"schema-article-type-post\";s:7:\"Article\";s:17:\"social-title-post\";s:9:\"%%title%%\";s:23:\"social-description-post\";s:0:\"\";s:21:\"social-image-url-post\";s:0:\"\";s:20:\"social-image-id-post\";i:0;s:10:\"title-page\";s:39:\"%%title%% %%page%% %%sep%% %%sitename%%\";s:13:\"metadesc-page\";s:0:\"\";s:12:\"noindex-page\";b:0;s:23:\"display-metabox-pt-page\";b:0;s:23:\"post_types-page-maintax\";i:0;s:21:\"schema-page-type-page\";s:7:\"WebPage\";s:24:\"schema-article-type-page\";s:4:\"None\";s:17:\"social-title-page\";s:9:\"%%title%%\";s:23:\"social-description-page\";s:0:\"\";s:21:\"social-image-url-page\";s:0:\"\";s:20:\"social-image-id-page\";i:0;s:16:\"title-attachment\";s:39:\"%%title%% %%page%% %%sep%% %%sitename%%\";s:19:\"metadesc-attachment\";s:0:\"\";s:18:\"noindex-attachment\";b:0;s:29:\"display-metabox-pt-attachment\";b:0;s:29:\"post_types-attachment-maintax\";i:0;s:27:\"schema-page-type-attachment\";s:7:\"WebPage\";s:30:\"schema-article-type-attachment\";s:4:\"None\";s:18:\"title-tax-category\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:21:\"metadesc-tax-category\";s:0:\"\";s:28:\"display-metabox-tax-category\";b:0;s:20:\"noindex-tax-category\";b:0;s:25:\"social-title-tax-category\";s:23:\"%%term_title%% Archives\";s:31:\"social-description-tax-category\";s:0:\"\";s:29:\"social-image-url-tax-category\";s:0:\"\";s:28:\"social-image-id-tax-category\";i:0;s:26:\"taxonomy-category-ptparent\";i:0;s:18:\"title-tax-post_tag\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:21:\"metadesc-tax-post_tag\";s:0:\"\";s:28:\"display-metabox-tax-post_tag\";b:0;s:20:\"noindex-tax-post_tag\";b:0;s:25:\"social-title-tax-post_tag\";s:23:\"%%term_title%% Archives\";s:31:\"social-description-tax-post_tag\";s:0:\"\";s:29:\"social-image-url-tax-post_tag\";s:0:\"\";s:28:\"social-image-id-tax-post_tag\";i:0;s:26:\"taxonomy-post_tag-ptparent\";i:0;s:21:\"title-tax-post_format\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:24:\"metadesc-tax-post_format\";s:0:\"\";s:31:\"display-metabox-tax-post_format\";b:0;s:23:\"noindex-tax-post_format\";b:0;s:28:\"social-title-tax-post_format\";s:23:\"%%term_title%% Archives\";s:34:\"social-description-tax-post_format\";s:0:\"\";s:32:\"social-image-url-tax-post_format\";s:0:\"\";s:31:\"social-image-id-tax-post_format\";i:0;s:29:\"taxonomy-post_format-ptparent\";i:0;s:14:\"title-property\";s:30:\"%%title%% %%sep%% %%sitename%%\";s:17:\"metadesc-property\";s:106:\"View property details, photos, and features for %%title%%. Contact HomeProz Real Estate in Albert Lea, MN.\";s:16:\"noindex-property\";b:0;s:27:\"display-metabox-pt-property\";b:0;s:27:\"post_types-property-maintax\";i:0;s:25:\"schema-page-type-property\";s:7:\"WebPage\";s:28:\"schema-article-type-property\";s:4:\"None\";s:21:\"social-title-property\";s:9:\"%%title%%\";s:27:\"social-description-property\";s:0:\"\";s:25:\"social-image-url-property\";s:0:\"\";s:24:\"social-image-id-property\";i:0;s:24:\"title-ptarchive-property\";s:49:\"Properties For Sale %%page%% %%sep%% %%sitename%%\";s:27:\"metadesc-ptarchive-property\";s:126:\"Browse all properties for sale in Albert Lea, Minnesota and surrounding areas. Find your dream home with HomeProz Real Estate.\";s:26:\"bctitle-ptarchive-property\";s:0:\"\";s:26:\"noindex-ptarchive-property\";b:0;s:31:\"social-title-ptarchive-property\";s:21:\"%%pt_plural%% Archive\";s:37:\"social-description-ptarchive-property\";s:0:\"\";s:35:\"social-image-url-ptarchive-property\";s:0:\"\";s:34:\"social-image-id-ptarchive-property\";i:0;s:23:\"title-tax-property_type\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:26:\"metadesc-tax-property_type\";s:0:\"\";s:33:\"display-metabox-tax-property_type\";b:0;s:25:\"noindex-tax-property_type\";b:0;s:30:\"social-title-tax-property_type\";s:23:\"%%term_title%% Archives\";s:36:\"social-description-tax-property_type\";s:0:\"\";s:34:\"social-image-url-tax-property_type\";s:0:\"\";s:33:\"social-image-id-tax-property_type\";i:0;s:31:\"taxonomy-property_type-ptparent\";i:0;s:25:\"title-tax-property_status\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:28:\"metadesc-tax-property_status\";s:0:\"\";s:35:\"display-metabox-tax-property_status\";b:0;s:27:\"noindex-tax-property_status\";b:0;s:32:\"social-title-tax-property_status\";s:23:\"%%term_title%% Archives\";s:38:\"social-description-tax-property_status\";s:0:\"\";s:36:\"social-image-url-tax-property_status\";s:0:\"\";s:35:\"social-image-id-tax-property_status\";i:0;s:33:\"taxonomy-property_status-ptparent\";i:0;s:27:\"title-tax-property_location\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:30:\"metadesc-tax-property_location\";s:0:\"\";s:37:\"display-metabox-tax-property_location\";b:0;s:29:\"noindex-tax-property_location\";b:0;s:34:\"social-title-tax-property_location\";s:23:\"%%term_title%% Archives\";s:40:\"social-description-tax-property_location\";s:0:\"\";s:38:\"social-image-url-tax-property_location\";s:0:\"\";s:37:\"social-image-id-tax-property_location\";i:0;s:35:\"taxonomy-property_location-ptparent\";i:0;s:14:\"person_logo_id\";i:0;s:15:\"company_logo_id\";i:0;s:29:\"open_graph_frontpage_image_id\";i:0;}','auto'),(170,'wpseo_social','a:20:{s:13:\"facebook_site\";s:0:\"\";s:13:\"instagram_url\";s:0:\"\";s:12:\"linkedin_url\";s:0:\"\";s:11:\"myspace_url\";s:0:\"\";s:16:\"og_default_image\";s:0:\"\";s:19:\"og_default_image_id\";s:0:\"\";s:18:\"og_frontpage_title\";s:47:\"HomeProz Real Estate | Albert Lea MN Properties\";s:17:\"og_frontpage_desc\";s:97:\"Your trusted partner for buying and selling homes in Albert Lea, Minnesota and surrounding areas.\";s:18:\"og_frontpage_image\";s:0:\"\";s:21:\"og_frontpage_image_id\";s:0:\"\";s:9:\"opengraph\";b:1;s:13:\"pinterest_url\";s:0:\"\";s:15:\"pinterestverify\";s:0:\"\";s:7:\"twitter\";b:1;s:12:\"twitter_site\";s:0:\"\";s:17:\"twitter_card_type\";s:19:\"summary_large_image\";s:11:\"youtube_url\";s:0:\"\";s:13:\"wikipedia_url\";s:0:\"\";s:17:\"other_social_urls\";a:0:{}s:12:\"mastodon_url\";s:0:\"\";}','auto'),(171,'wpseo_llmstxt','a:7:{s:23:\"llms_txt_selection_mode\";s:4:\"auto\";s:13:\"about_us_page\";i:0;s:12:\"contact_page\";i:0;s:10:\"terms_page\";i:0;s:19:\"privacy_policy_page\";i:0;s:9:\"shop_page\";i:0;s:20:\"other_included_pages\";a:0:{}}','auto'),(174,'webpc_is_new_installation','1','auto'),(175,'webpc_notice_thanks','1765581302','auto'),(176,'webpc_notice_pro_version','1764976502','auto'),(177,'webpc_stats_installation_date','2025-11-28 23:15:02','auto'),(178,'webpc_stats_first_version','6.3.2','auto'); +INSERT INTO `wp_options` VALUES (1,'cron','a:12:{i:1764363747;a:1:{s:32:\"recovery_mode_clean_expired_keys\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1764363748;a:1:{s:34:\"wp_privacy_delete_old_export_files\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"hourly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:3600;}}}i:1764367344;a:1:{s:16:\"wp_version_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1764369115;a:1:{s:30:\"wp_delete_temp_updater_backups\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}i:1764369116;a:1:{s:27:\"acf_update_site_health_data\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}i:1764369144;a:1:{s:17:\"wp_update_plugins\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1764370944;a:1:{s:16:\"wp_update_themes\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1764371307;a:1:{s:31:\"wpseo_permalink_structure_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1764371970;a:4:{s:26:\"aios_15_minutes_cron_event\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:21:\"aios-every-15-minutes\";s:4:\"args\";a:0:{}s:8:\"interval\";i:900;}}s:24:\"aiowps_hourly_cron_event\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"hourly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:3600;}}s:23:\"aiowps_daily_cron_event\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}s:24:\"aiowps_weekly_cron_event\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}i:1764371978;a:1:{s:23:\"aiowps_clean_old_events\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1764450148;a:1:{s:30:\"wp_site_health_scheduled_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}s:7:\"version\";i:2;}','on'),(2,'siteurl','https://homeproz.dev.hanson.xyz','on'),(3,'home','https://homeproz.dev.hanson.xyz','on'),(4,'blogname','HomeProz','on'),(5,'blogdescription','','on'),(6,'users_can_register','0','on'),(7,'admin_email','brian@hanson.xyz','on'),(8,'start_of_week','1','on'),(9,'use_balanceTags','0','on'),(10,'use_smilies','1','on'),(11,'require_name_email','1','on'),(12,'comments_notify','1','on'),(13,'posts_per_rss','10','on'),(14,'rss_use_excerpt','0','on'),(15,'mailserver_url','mail.example.com','on'),(16,'mailserver_login','login@example.com','on'),(17,'mailserver_pass','','on'),(18,'mailserver_port','110','on'),(19,'default_category','1','on'),(20,'default_comment_status','open','on'),(21,'default_ping_status','open','on'),(22,'default_pingback_flag','1','on'),(23,'posts_per_page','10','on'),(24,'date_format','F j, Y','on'),(25,'time_format','g:i a','on'),(26,'links_updated_date_format','F j, Y g:i a','on'),(27,'comment_moderation','0','on'),(28,'moderation_notify','1','on'),(29,'permalink_structure','/%postname%/','on'),(30,'rewrite_rules','a:133:{s:11:\"^wp-json/?$\";s:22:\"index.php?rest_route=/\";s:14:\"^wp-json/(.*)?\";s:33:\"index.php?rest_route=/$matches[1]\";s:21:\"^index.php/wp-json/?$\";s:22:\"index.php?rest_route=/\";s:24:\"^index.php/wp-json/(.*)?\";s:33:\"index.php?rest_route=/$matches[1]\";s:17:\"^wp-sitemap\\.xml$\";s:23:\"index.php?sitemap=index\";s:17:\"^wp-sitemap\\.xsl$\";s:36:\"index.php?sitemap-stylesheet=sitemap\";s:23:\"^wp-sitemap-index\\.xsl$\";s:34:\"index.php?sitemap-stylesheet=index\";s:48:\"^wp-sitemap-([a-z]+?)-([a-z\\d_-]+?)-(\\d+?)\\.xml$\";s:75:\"index.php?sitemap=$matches[1]&sitemap-subtype=$matches[2]&paged=$matches[3]\";s:34:\"^wp-sitemap-([a-z]+?)-(\\d+?)\\.xml$\";s:47:\"index.php?sitemap=$matches[1]&paged=$matches[2]\";s:13:\"properties/?$\";s:28:\"index.php?post_type=property\";s:43:\"properties/feed/(feed|rdf|rss|rss2|atom)/?$\";s:45:\"index.php?post_type=property&feed=$matches[1]\";s:38:\"properties/(feed|rdf|rss|rss2|atom)/?$\";s:45:\"index.php?post_type=property&feed=$matches[1]\";s:30:\"properties/page/([0-9]{1,})/?$\";s:46:\"index.php?post_type=property&paged=$matches[1]\";s:47:\"category/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?category_name=$matches[1]&feed=$matches[2]\";s:42:\"category/(.+?)/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?category_name=$matches[1]&feed=$matches[2]\";s:23:\"category/(.+?)/embed/?$\";s:46:\"index.php?category_name=$matches[1]&embed=true\";s:35:\"category/(.+?)/page/?([0-9]{1,})/?$\";s:53:\"index.php?category_name=$matches[1]&paged=$matches[2]\";s:17:\"category/(.+?)/?$\";s:35:\"index.php?category_name=$matches[1]\";s:44:\"tag/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?tag=$matches[1]&feed=$matches[2]\";s:39:\"tag/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?tag=$matches[1]&feed=$matches[2]\";s:20:\"tag/([^/]+)/embed/?$\";s:36:\"index.php?tag=$matches[1]&embed=true\";s:32:\"tag/([^/]+)/page/?([0-9]{1,})/?$\";s:43:\"index.php?tag=$matches[1]&paged=$matches[2]\";s:14:\"tag/([^/]+)/?$\";s:25:\"index.php?tag=$matches[1]\";s:45:\"type/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?post_format=$matches[1]&feed=$matches[2]\";s:40:\"type/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?post_format=$matches[1]&feed=$matches[2]\";s:21:\"type/([^/]+)/embed/?$\";s:44:\"index.php?post_format=$matches[1]&embed=true\";s:33:\"type/([^/]+)/page/?([0-9]{1,})/?$\";s:51:\"index.php?post_format=$matches[1]&paged=$matches[2]\";s:15:\"type/([^/]+)/?$\";s:33:\"index.php?post_format=$matches[1]\";s:38:\"properties/[^/]+/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:48:\"properties/[^/]+/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:68:\"properties/[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:63:\"properties/[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:63:\"properties/[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:44:\"properties/[^/]+/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:27:\"properties/([^/]+)/embed/?$\";s:41:\"index.php?property=$matches[1]&embed=true\";s:31:\"properties/([^/]+)/trackback/?$\";s:35:\"index.php?property=$matches[1]&tb=1\";s:51:\"properties/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?property=$matches[1]&feed=$matches[2]\";s:46:\"properties/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?property=$matches[1]&feed=$matches[2]\";s:39:\"properties/([^/]+)/page/?([0-9]{1,})/?$\";s:48:\"index.php?property=$matches[1]&paged=$matches[2]\";s:46:\"properties/([^/]+)/comment-page-([0-9]{1,})/?$\";s:48:\"index.php?property=$matches[1]&cpage=$matches[2]\";s:35:\"properties/([^/]+)(?:/([0-9]+))?/?$\";s:47:\"index.php?property=$matches[1]&page=$matches[2]\";s:27:\"properties/[^/]+/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\"properties/[^/]+/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\"properties/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"properties/[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"properties/[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\"properties/[^/]+/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:54:\"property-type/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?property_type=$matches[1]&feed=$matches[2]\";s:49:\"property-type/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?property_type=$matches[1]&feed=$matches[2]\";s:30:\"property-type/([^/]+)/embed/?$\";s:46:\"index.php?property_type=$matches[1]&embed=true\";s:42:\"property-type/([^/]+)/page/?([0-9]{1,})/?$\";s:53:\"index.php?property_type=$matches[1]&paged=$matches[2]\";s:24:\"property-type/([^/]+)/?$\";s:35:\"index.php?property_type=$matches[1]\";s:56:\"property-status/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:54:\"index.php?property_status=$matches[1]&feed=$matches[2]\";s:51:\"property-status/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:54:\"index.php?property_status=$matches[1]&feed=$matches[2]\";s:32:\"property-status/([^/]+)/embed/?$\";s:48:\"index.php?property_status=$matches[1]&embed=true\";s:44:\"property-status/([^/]+)/page/?([0-9]{1,})/?$\";s:55:\"index.php?property_status=$matches[1]&paged=$matches[2]\";s:26:\"property-status/([^/]+)/?$\";s:37:\"index.php?property_status=$matches[1]\";s:49:\"location/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:56:\"index.php?property_location=$matches[1]&feed=$matches[2]\";s:44:\"location/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:56:\"index.php?property_location=$matches[1]&feed=$matches[2]\";s:25:\"location/([^/]+)/embed/?$\";s:50:\"index.php?property_location=$matches[1]&embed=true\";s:37:\"location/([^/]+)/page/?([0-9]{1,})/?$\";s:57:\"index.php?property_location=$matches[1]&paged=$matches[2]\";s:19:\"location/([^/]+)/?$\";s:39:\"index.php?property_location=$matches[1]\";s:12:\"robots\\.txt$\";s:18:\"index.php?robots=1\";s:13:\"favicon\\.ico$\";s:19:\"index.php?favicon=1\";s:12:\"sitemap\\.xml\";s:24:\"index.php??sitemap=index\";s:48:\".*wp-(atom|rdf|rss|rss2|feed|commentsrss2)\\.php$\";s:18:\"index.php?feed=old\";s:20:\".*wp-app\\.php(/.*)?$\";s:19:\"index.php?error=403\";s:18:\".*wp-register.php$\";s:23:\"index.php?register=true\";s:32:\"feed/(feed|rdf|rss|rss2|atom)/?$\";s:27:\"index.php?&feed=$matches[1]\";s:27:\"(feed|rdf|rss|rss2|atom)/?$\";s:27:\"index.php?&feed=$matches[1]\";s:8:\"embed/?$\";s:21:\"index.php?&embed=true\";s:20:\"page/?([0-9]{1,})/?$\";s:28:\"index.php?&paged=$matches[1]\";s:27:\"comment-page-([0-9]{1,})/?$\";s:39:\"index.php?&page_id=10&cpage=$matches[1]\";s:41:\"comments/feed/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?&feed=$matches[1]&withcomments=1\";s:36:\"comments/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?&feed=$matches[1]&withcomments=1\";s:17:\"comments/embed/?$\";s:21:\"index.php?&embed=true\";s:44:\"search/(.+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:40:\"index.php?s=$matches[1]&feed=$matches[2]\";s:39:\"search/(.+)/(feed|rdf|rss|rss2|atom)/?$\";s:40:\"index.php?s=$matches[1]&feed=$matches[2]\";s:20:\"search/(.+)/embed/?$\";s:34:\"index.php?s=$matches[1]&embed=true\";s:32:\"search/(.+)/page/?([0-9]{1,})/?$\";s:41:\"index.php?s=$matches[1]&paged=$matches[2]\";s:14:\"search/(.+)/?$\";s:23:\"index.php?s=$matches[1]\";s:47:\"author/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?author_name=$matches[1]&feed=$matches[2]\";s:42:\"author/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?author_name=$matches[1]&feed=$matches[2]\";s:23:\"author/([^/]+)/embed/?$\";s:44:\"index.php?author_name=$matches[1]&embed=true\";s:35:\"author/([^/]+)/page/?([0-9]{1,})/?$\";s:51:\"index.php?author_name=$matches[1]&paged=$matches[2]\";s:17:\"author/([^/]+)/?$\";s:33:\"index.php?author_name=$matches[1]\";s:69:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:80:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]\";s:64:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$\";s:80:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]\";s:45:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/embed/?$\";s:74:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&embed=true\";s:57:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/page/?([0-9]{1,})/?$\";s:81:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&paged=$matches[4]\";s:39:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$\";s:63:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]\";s:56:\"([0-9]{4})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:64:\"index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]\";s:51:\"([0-9]{4})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$\";s:64:\"index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]\";s:32:\"([0-9]{4})/([0-9]{1,2})/embed/?$\";s:58:\"index.php?year=$matches[1]&monthnum=$matches[2]&embed=true\";s:44:\"([0-9]{4})/([0-9]{1,2})/page/?([0-9]{1,})/?$\";s:65:\"index.php?year=$matches[1]&monthnum=$matches[2]&paged=$matches[3]\";s:26:\"([0-9]{4})/([0-9]{1,2})/?$\";s:47:\"index.php?year=$matches[1]&monthnum=$matches[2]\";s:43:\"([0-9]{4})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?year=$matches[1]&feed=$matches[2]\";s:38:\"([0-9]{4})/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?year=$matches[1]&feed=$matches[2]\";s:19:\"([0-9]{4})/embed/?$\";s:37:\"index.php?year=$matches[1]&embed=true\";s:31:\"([0-9]{4})/page/?([0-9]{1,})/?$\";s:44:\"index.php?year=$matches[1]&paged=$matches[2]\";s:13:\"([0-9]{4})/?$\";s:26:\"index.php?year=$matches[1]\";s:27:\".?.+?/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\".?.+?/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\".?.+?/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\".?.+?/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\".?.+?/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\".?.+?/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:16:\"(.?.+?)/embed/?$\";s:41:\"index.php?pagename=$matches[1]&embed=true\";s:20:\"(.?.+?)/trackback/?$\";s:35:\"index.php?pagename=$matches[1]&tb=1\";s:40:\"(.?.+?)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?pagename=$matches[1]&feed=$matches[2]\";s:35:\"(.?.+?)/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?pagename=$matches[1]&feed=$matches[2]\";s:28:\"(.?.+?)/page/?([0-9]{1,})/?$\";s:48:\"index.php?pagename=$matches[1]&paged=$matches[2]\";s:35:\"(.?.+?)/comment-page-([0-9]{1,})/?$\";s:48:\"index.php?pagename=$matches[1]&cpage=$matches[2]\";s:24:\"(.?.+?)(?:/([0-9]+))?/?$\";s:47:\"index.php?pagename=$matches[1]&page=$matches[2]\";s:27:\"[^/]+/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\"[^/]+/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\"[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\"[^/]+/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:16:\"([^/]+)/embed/?$\";s:37:\"index.php?name=$matches[1]&embed=true\";s:20:\"([^/]+)/trackback/?$\";s:31:\"index.php?name=$matches[1]&tb=1\";s:40:\"([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?name=$matches[1]&feed=$matches[2]\";s:35:\"([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?name=$matches[1]&feed=$matches[2]\";s:28:\"([^/]+)/page/?([0-9]{1,})/?$\";s:44:\"index.php?name=$matches[1]&paged=$matches[2]\";s:35:\"([^/]+)/comment-page-([0-9]{1,})/?$\";s:44:\"index.php?name=$matches[1]&cpage=$matches[2]\";s:24:\"([^/]+)(?:/([0-9]+))?/?$\";s:43:\"index.php?name=$matches[1]&page=$matches[2]\";s:16:\"[^/]+/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:26:\"[^/]+/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:46:\"[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:41:\"[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:41:\"[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:22:\"[^/]+/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";}','on'),(31,'hack_file','0','on'),(32,'blog_charset','UTF-8','on'),(33,'moderation_keys','','off'),(34,'active_plugins','a:5:{i:0;s:30:\"advanced-custom-fields/acf.php\";i:1;s:51:\"all-in-one-wp-security-and-firewall/wp-security.php\";i:2;s:36:\"contact-form-7/wp-contact-form-7.php\";i:3;s:53:\"webp-converter-for-media/webp-converter-for-media.php\";i:4;s:24:\"wordpress-seo/wp-seo.php\";}','on'),(35,'category_base','','on'),(36,'ping_sites','https://rpc.pingomatic.com/','on'),(37,'comment_max_links','2','on'),(38,'gmt_offset','0','on'),(39,'default_email_category','1','on'),(40,'recently_edited','','off'),(41,'template','homeproz','on'),(42,'stylesheet','homeproz','on'),(43,'comment_registration','0','on'),(44,'html_type','text/html','on'),(45,'use_trackback','0','on'),(46,'default_role','subscriber','on'),(47,'db_version','60421','on'),(48,'uploads_use_yearmonth_folders','1','on'),(49,'upload_path','','on'),(50,'blog_public','1','on'),(51,'default_link_category','2','on'),(52,'show_on_front','page','on'),(53,'tag_base','','on'),(54,'show_avatars','1','on'),(55,'avatar_rating','G','on'),(56,'upload_url_path','','on'),(57,'thumbnail_size_w','150','on'),(58,'thumbnail_size_h','150','on'),(59,'thumbnail_crop','1','on'),(60,'medium_size_w','300','on'),(61,'medium_size_h','300','on'),(62,'avatar_default','mystery','on'),(63,'large_size_w','1024','on'),(64,'large_size_h','1024','on'),(65,'image_default_link_type','none','on'),(66,'image_default_size','','on'),(67,'image_default_align','','on'),(68,'close_comments_for_old_posts','0','on'),(69,'close_comments_days_old','14','on'),(70,'thread_comments','1','on'),(71,'thread_comments_depth','5','on'),(72,'page_comments','0','on'),(73,'comments_per_page','50','on'),(74,'default_comments_page','newest','on'),(75,'comment_order','asc','on'),(76,'sticky_posts','a:0:{}','on'),(77,'widget_categories','a:0:{}','on'),(78,'widget_text','a:0:{}','on'),(79,'widget_rss','a:0:{}','on'),(80,'uninstall_plugins','a:3:{s:24:\"wordpress-seo/wp-seo.php\";s:14:\"__return_false\";s:53:\"webp-converter-for-media/webp-converter-for-media.php\";a:2:{i:0;s:37:\"WebpConverter\\Plugin\\UninstallHandler\";i:1;s:22:\"load_uninstall_actions\";}s:51:\"all-in-one-wp-security-and-firewall/wp-security.php\";a:2:{i:0;s:15:\"AIO_WP_Security\";i:1;s:17:\"uninstall_handler\";}}','off'),(81,'timezone_string','','on'),(82,'page_for_posts','9','on'),(83,'page_on_front','10','on'),(84,'default_post_format','0','on'),(85,'link_manager_enabled','0','on'),(86,'finished_splitting_shared_terms','1','on'),(87,'site_icon','0','on'),(88,'medium_large_size_w','768','on'),(89,'medium_large_size_h','0','on'),(90,'wp_page_for_privacy_policy','3','on'),(91,'show_comments_cookies_opt_in','1','on'),(92,'admin_email_lifespan','1779915744','on'),(93,'disallowed_keys','','off'),(94,'comment_previously_approved','1','on'),(95,'auto_plugin_theme_update_emails','a:0:{}','off'),(96,'auto_update_core_dev','enabled','on'),(97,'auto_update_core_minor','enabled','on'),(98,'auto_update_core_major','enabled','on'),(99,'wp_force_deactivated_plugins','a:0:{}','on'),(100,'wp_attachment_pages_enabled','1','on'),(101,'initial_db_version','60421','on'),(102,'wp_user_roles','a:7:{s:13:\"administrator\";a:2:{s:4:\"name\";s:13:\"Administrator\";s:12:\"capabilities\";a:62:{s:13:\"switch_themes\";b:1;s:11:\"edit_themes\";b:1;s:16:\"activate_plugins\";b:1;s:12:\"edit_plugins\";b:1;s:10:\"edit_users\";b:1;s:10:\"edit_files\";b:1;s:14:\"manage_options\";b:1;s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:6:\"import\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:8:\"level_10\";b:1;s:7:\"level_9\";b:1;s:7:\"level_8\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:12:\"delete_users\";b:1;s:12:\"create_users\";b:1;s:17:\"unfiltered_upload\";b:1;s:14:\"edit_dashboard\";b:1;s:14:\"update_plugins\";b:1;s:14:\"delete_plugins\";b:1;s:15:\"install_plugins\";b:1;s:13:\"update_themes\";b:1;s:14:\"install_themes\";b:1;s:11:\"update_core\";b:1;s:10:\"list_users\";b:1;s:12:\"remove_users\";b:1;s:13:\"promote_users\";b:1;s:18:\"edit_theme_options\";b:1;s:13:\"delete_themes\";b:1;s:6:\"export\";b:1;s:20:\"wpseo_manage_options\";b:1;}}s:6:\"editor\";a:2:{s:4:\"name\";s:6:\"Editor\";s:12:\"capabilities\";a:36:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:15:\"wpseo_bulk_edit\";b:1;s:28:\"wpseo_edit_advanced_metadata\";b:1;}}s:6:\"author\";a:2:{s:4:\"name\";s:6:\"Author\";s:12:\"capabilities\";a:10:{s:12:\"upload_files\";b:1;s:10:\"edit_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;s:22:\"delete_published_posts\";b:1;}}s:11:\"contributor\";a:2:{s:4:\"name\";s:11:\"Contributor\";s:12:\"capabilities\";a:5:{s:10:\"edit_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;}}s:10:\"subscriber\";a:2:{s:4:\"name\";s:10:\"Subscriber\";s:12:\"capabilities\";a:2:{s:4:\"read\";b:1;s:7:\"level_0\";b:1;}}s:13:\"wpseo_manager\";a:2:{s:4:\"name\";s:11:\"SEO Manager\";s:12:\"capabilities\";a:38:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:15:\"wpseo_bulk_edit\";b:1;s:28:\"wpseo_edit_advanced_metadata\";b:1;s:20:\"wpseo_manage_options\";b:1;s:23:\"view_site_health_checks\";b:1;}}s:12:\"wpseo_editor\";a:2:{s:4:\"name\";s:10:\"SEO Editor\";s:12:\"capabilities\";a:36:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:15:\"wpseo_bulk_edit\";b:1;s:28:\"wpseo_edit_advanced_metadata\";b:1;}}}','on'),(103,'fresh_site','0','off'),(104,'user_count','1','off'),(105,'widget_block','a:6:{i:2;a:1:{s:7:\"content\";s:19:\"\";}i:3;a:1:{s:7:\"content\";s:154:\"

Recent Posts

\";}i:4;a:1:{s:7:\"content\";s:227:\"

Recent Comments

\";}i:5;a:1:{s:7:\"content\";s:146:\"

Archives

\";}i:6;a:1:{s:7:\"content\";s:150:\"

Categories

\";}s:12:\"_multiwidget\";i:1;}','auto'),(106,'sidebars_widgets','a:2:{s:19:\"wp_inactive_widgets\";a:5:{i:0;s:7:\"block-2\";i:1;s:7:\"block-3\";i:2;s:7:\"block-4\";i:3;s:7:\"block-5\";i:4;s:7:\"block-6\";}s:13:\"array_version\";i:3;}','auto'),(107,'widget_pages','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(108,'widget_calendar','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(109,'widget_archives','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(110,'widget_media_audio','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(111,'widget_media_image','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(112,'widget_media_gallery','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(113,'widget_media_video','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(114,'widget_meta','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(115,'widget_search','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(116,'widget_recent-posts','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(117,'widget_recent-comments','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(118,'widget_tag_cloud','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(119,'widget_nav_menu','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(120,'widget_custom_html','a:1:{s:12:\"_multiwidget\";i:1;}','auto'),(121,'_transient_wp_core_block_css_files','a:2:{s:7:\"version\";s:5:\"6.8.3\";s:5:\"files\";a:536:{i:0;s:23:\"archives/editor-rtl.css\";i:1;s:27:\"archives/editor-rtl.min.css\";i:2;s:19:\"archives/editor.css\";i:3;s:23:\"archives/editor.min.css\";i:4;s:22:\"archives/style-rtl.css\";i:5;s:26:\"archives/style-rtl.min.css\";i:6;s:18:\"archives/style.css\";i:7;s:22:\"archives/style.min.css\";i:8;s:20:\"audio/editor-rtl.css\";i:9;s:24:\"audio/editor-rtl.min.css\";i:10;s:16:\"audio/editor.css\";i:11;s:20:\"audio/editor.min.css\";i:12;s:19:\"audio/style-rtl.css\";i:13;s:23:\"audio/style-rtl.min.css\";i:14;s:15:\"audio/style.css\";i:15;s:19:\"audio/style.min.css\";i:16;s:19:\"audio/theme-rtl.css\";i:17;s:23:\"audio/theme-rtl.min.css\";i:18;s:15:\"audio/theme.css\";i:19;s:19:\"audio/theme.min.css\";i:20;s:21:\"avatar/editor-rtl.css\";i:21;s:25:\"avatar/editor-rtl.min.css\";i:22;s:17:\"avatar/editor.css\";i:23;s:21:\"avatar/editor.min.css\";i:24;s:20:\"avatar/style-rtl.css\";i:25;s:24:\"avatar/style-rtl.min.css\";i:26;s:16:\"avatar/style.css\";i:27;s:20:\"avatar/style.min.css\";i:28;s:21:\"button/editor-rtl.css\";i:29;s:25:\"button/editor-rtl.min.css\";i:30;s:17:\"button/editor.css\";i:31;s:21:\"button/editor.min.css\";i:32;s:20:\"button/style-rtl.css\";i:33;s:24:\"button/style-rtl.min.css\";i:34;s:16:\"button/style.css\";i:35;s:20:\"button/style.min.css\";i:36;s:22:\"buttons/editor-rtl.css\";i:37;s:26:\"buttons/editor-rtl.min.css\";i:38;s:18:\"buttons/editor.css\";i:39;s:22:\"buttons/editor.min.css\";i:40;s:21:\"buttons/style-rtl.css\";i:41;s:25:\"buttons/style-rtl.min.css\";i:42;s:17:\"buttons/style.css\";i:43;s:21:\"buttons/style.min.css\";i:44;s:22:\"calendar/style-rtl.css\";i:45;s:26:\"calendar/style-rtl.min.css\";i:46;s:18:\"calendar/style.css\";i:47;s:22:\"calendar/style.min.css\";i:48;s:25:\"categories/editor-rtl.css\";i:49;s:29:\"categories/editor-rtl.min.css\";i:50;s:21:\"categories/editor.css\";i:51;s:25:\"categories/editor.min.css\";i:52;s:24:\"categories/style-rtl.css\";i:53;s:28:\"categories/style-rtl.min.css\";i:54;s:20:\"categories/style.css\";i:55;s:24:\"categories/style.min.css\";i:56;s:19:\"code/editor-rtl.css\";i:57;s:23:\"code/editor-rtl.min.css\";i:58;s:15:\"code/editor.css\";i:59;s:19:\"code/editor.min.css\";i:60;s:18:\"code/style-rtl.css\";i:61;s:22:\"code/style-rtl.min.css\";i:62;s:14:\"code/style.css\";i:63;s:18:\"code/style.min.css\";i:64;s:18:\"code/theme-rtl.css\";i:65;s:22:\"code/theme-rtl.min.css\";i:66;s:14:\"code/theme.css\";i:67;s:18:\"code/theme.min.css\";i:68;s:22:\"columns/editor-rtl.css\";i:69;s:26:\"columns/editor-rtl.min.css\";i:70;s:18:\"columns/editor.css\";i:71;s:22:\"columns/editor.min.css\";i:72;s:21:\"columns/style-rtl.css\";i:73;s:25:\"columns/style-rtl.min.css\";i:74;s:17:\"columns/style.css\";i:75;s:21:\"columns/style.min.css\";i:76;s:33:\"comment-author-name/style-rtl.css\";i:77;s:37:\"comment-author-name/style-rtl.min.css\";i:78;s:29:\"comment-author-name/style.css\";i:79;s:33:\"comment-author-name/style.min.css\";i:80;s:29:\"comment-content/style-rtl.css\";i:81;s:33:\"comment-content/style-rtl.min.css\";i:82;s:25:\"comment-content/style.css\";i:83;s:29:\"comment-content/style.min.css\";i:84;s:26:\"comment-date/style-rtl.css\";i:85;s:30:\"comment-date/style-rtl.min.css\";i:86;s:22:\"comment-date/style.css\";i:87;s:26:\"comment-date/style.min.css\";i:88;s:31:\"comment-edit-link/style-rtl.css\";i:89;s:35:\"comment-edit-link/style-rtl.min.css\";i:90;s:27:\"comment-edit-link/style.css\";i:91;s:31:\"comment-edit-link/style.min.css\";i:92;s:32:\"comment-reply-link/style-rtl.css\";i:93;s:36:\"comment-reply-link/style-rtl.min.css\";i:94;s:28:\"comment-reply-link/style.css\";i:95;s:32:\"comment-reply-link/style.min.css\";i:96;s:30:\"comment-template/style-rtl.css\";i:97;s:34:\"comment-template/style-rtl.min.css\";i:98;s:26:\"comment-template/style.css\";i:99;s:30:\"comment-template/style.min.css\";i:100;s:42:\"comments-pagination-numbers/editor-rtl.css\";i:101;s:46:\"comments-pagination-numbers/editor-rtl.min.css\";i:102;s:38:\"comments-pagination-numbers/editor.css\";i:103;s:42:\"comments-pagination-numbers/editor.min.css\";i:104;s:34:\"comments-pagination/editor-rtl.css\";i:105;s:38:\"comments-pagination/editor-rtl.min.css\";i:106;s:30:\"comments-pagination/editor.css\";i:107;s:34:\"comments-pagination/editor.min.css\";i:108;s:33:\"comments-pagination/style-rtl.css\";i:109;s:37:\"comments-pagination/style-rtl.min.css\";i:110;s:29:\"comments-pagination/style.css\";i:111;s:33:\"comments-pagination/style.min.css\";i:112;s:29:\"comments-title/editor-rtl.css\";i:113;s:33:\"comments-title/editor-rtl.min.css\";i:114;s:25:\"comments-title/editor.css\";i:115;s:29:\"comments-title/editor.min.css\";i:116;s:23:\"comments/editor-rtl.css\";i:117;s:27:\"comments/editor-rtl.min.css\";i:118;s:19:\"comments/editor.css\";i:119;s:23:\"comments/editor.min.css\";i:120;s:22:\"comments/style-rtl.css\";i:121;s:26:\"comments/style-rtl.min.css\";i:122;s:18:\"comments/style.css\";i:123;s:22:\"comments/style.min.css\";i:124;s:20:\"cover/editor-rtl.css\";i:125;s:24:\"cover/editor-rtl.min.css\";i:126;s:16:\"cover/editor.css\";i:127;s:20:\"cover/editor.min.css\";i:128;s:19:\"cover/style-rtl.css\";i:129;s:23:\"cover/style-rtl.min.css\";i:130;s:15:\"cover/style.css\";i:131;s:19:\"cover/style.min.css\";i:132;s:22:\"details/editor-rtl.css\";i:133;s:26:\"details/editor-rtl.min.css\";i:134;s:18:\"details/editor.css\";i:135;s:22:\"details/editor.min.css\";i:136;s:21:\"details/style-rtl.css\";i:137;s:25:\"details/style-rtl.min.css\";i:138;s:17:\"details/style.css\";i:139;s:21:\"details/style.min.css\";i:140;s:20:\"embed/editor-rtl.css\";i:141;s:24:\"embed/editor-rtl.min.css\";i:142;s:16:\"embed/editor.css\";i:143;s:20:\"embed/editor.min.css\";i:144;s:19:\"embed/style-rtl.css\";i:145;s:23:\"embed/style-rtl.min.css\";i:146;s:15:\"embed/style.css\";i:147;s:19:\"embed/style.min.css\";i:148;s:19:\"embed/theme-rtl.css\";i:149;s:23:\"embed/theme-rtl.min.css\";i:150;s:15:\"embed/theme.css\";i:151;s:19:\"embed/theme.min.css\";i:152;s:19:\"file/editor-rtl.css\";i:153;s:23:\"file/editor-rtl.min.css\";i:154;s:15:\"file/editor.css\";i:155;s:19:\"file/editor.min.css\";i:156;s:18:\"file/style-rtl.css\";i:157;s:22:\"file/style-rtl.min.css\";i:158;s:14:\"file/style.css\";i:159;s:18:\"file/style.min.css\";i:160;s:23:\"footnotes/style-rtl.css\";i:161;s:27:\"footnotes/style-rtl.min.css\";i:162;s:19:\"footnotes/style.css\";i:163;s:23:\"footnotes/style.min.css\";i:164;s:23:\"freeform/editor-rtl.css\";i:165;s:27:\"freeform/editor-rtl.min.css\";i:166;s:19:\"freeform/editor.css\";i:167;s:23:\"freeform/editor.min.css\";i:168;s:22:\"gallery/editor-rtl.css\";i:169;s:26:\"gallery/editor-rtl.min.css\";i:170;s:18:\"gallery/editor.css\";i:171;s:22:\"gallery/editor.min.css\";i:172;s:21:\"gallery/style-rtl.css\";i:173;s:25:\"gallery/style-rtl.min.css\";i:174;s:17:\"gallery/style.css\";i:175;s:21:\"gallery/style.min.css\";i:176;s:21:\"gallery/theme-rtl.css\";i:177;s:25:\"gallery/theme-rtl.min.css\";i:178;s:17:\"gallery/theme.css\";i:179;s:21:\"gallery/theme.min.css\";i:180;s:20:\"group/editor-rtl.css\";i:181;s:24:\"group/editor-rtl.min.css\";i:182;s:16:\"group/editor.css\";i:183;s:20:\"group/editor.min.css\";i:184;s:19:\"group/style-rtl.css\";i:185;s:23:\"group/style-rtl.min.css\";i:186;s:15:\"group/style.css\";i:187;s:19:\"group/style.min.css\";i:188;s:19:\"group/theme-rtl.css\";i:189;s:23:\"group/theme-rtl.min.css\";i:190;s:15:\"group/theme.css\";i:191;s:19:\"group/theme.min.css\";i:192;s:21:\"heading/style-rtl.css\";i:193;s:25:\"heading/style-rtl.min.css\";i:194;s:17:\"heading/style.css\";i:195;s:21:\"heading/style.min.css\";i:196;s:19:\"html/editor-rtl.css\";i:197;s:23:\"html/editor-rtl.min.css\";i:198;s:15:\"html/editor.css\";i:199;s:19:\"html/editor.min.css\";i:200;s:20:\"image/editor-rtl.css\";i:201;s:24:\"image/editor-rtl.min.css\";i:202;s:16:\"image/editor.css\";i:203;s:20:\"image/editor.min.css\";i:204;s:19:\"image/style-rtl.css\";i:205;s:23:\"image/style-rtl.min.css\";i:206;s:15:\"image/style.css\";i:207;s:19:\"image/style.min.css\";i:208;s:19:\"image/theme-rtl.css\";i:209;s:23:\"image/theme-rtl.min.css\";i:210;s:15:\"image/theme.css\";i:211;s:19:\"image/theme.min.css\";i:212;s:29:\"latest-comments/style-rtl.css\";i:213;s:33:\"latest-comments/style-rtl.min.css\";i:214;s:25:\"latest-comments/style.css\";i:215;s:29:\"latest-comments/style.min.css\";i:216;s:27:\"latest-posts/editor-rtl.css\";i:217;s:31:\"latest-posts/editor-rtl.min.css\";i:218;s:23:\"latest-posts/editor.css\";i:219;s:27:\"latest-posts/editor.min.css\";i:220;s:26:\"latest-posts/style-rtl.css\";i:221;s:30:\"latest-posts/style-rtl.min.css\";i:222;s:22:\"latest-posts/style.css\";i:223;s:26:\"latest-posts/style.min.css\";i:224;s:18:\"list/style-rtl.css\";i:225;s:22:\"list/style-rtl.min.css\";i:226;s:14:\"list/style.css\";i:227;s:18:\"list/style.min.css\";i:228;s:22:\"loginout/style-rtl.css\";i:229;s:26:\"loginout/style-rtl.min.css\";i:230;s:18:\"loginout/style.css\";i:231;s:22:\"loginout/style.min.css\";i:232;s:25:\"media-text/editor-rtl.css\";i:233;s:29:\"media-text/editor-rtl.min.css\";i:234;s:21:\"media-text/editor.css\";i:235;s:25:\"media-text/editor.min.css\";i:236;s:24:\"media-text/style-rtl.css\";i:237;s:28:\"media-text/style-rtl.min.css\";i:238;s:20:\"media-text/style.css\";i:239;s:24:\"media-text/style.min.css\";i:240;s:19:\"more/editor-rtl.css\";i:241;s:23:\"more/editor-rtl.min.css\";i:242;s:15:\"more/editor.css\";i:243;s:19:\"more/editor.min.css\";i:244;s:30:\"navigation-link/editor-rtl.css\";i:245;s:34:\"navigation-link/editor-rtl.min.css\";i:246;s:26:\"navigation-link/editor.css\";i:247;s:30:\"navigation-link/editor.min.css\";i:248;s:29:\"navigation-link/style-rtl.css\";i:249;s:33:\"navigation-link/style-rtl.min.css\";i:250;s:25:\"navigation-link/style.css\";i:251;s:29:\"navigation-link/style.min.css\";i:252;s:33:\"navigation-submenu/editor-rtl.css\";i:253;s:37:\"navigation-submenu/editor-rtl.min.css\";i:254;s:29:\"navigation-submenu/editor.css\";i:255;s:33:\"navigation-submenu/editor.min.css\";i:256;s:25:\"navigation/editor-rtl.css\";i:257;s:29:\"navigation/editor-rtl.min.css\";i:258;s:21:\"navigation/editor.css\";i:259;s:25:\"navigation/editor.min.css\";i:260;s:24:\"navigation/style-rtl.css\";i:261;s:28:\"navigation/style-rtl.min.css\";i:262;s:20:\"navigation/style.css\";i:263;s:24:\"navigation/style.min.css\";i:264;s:23:\"nextpage/editor-rtl.css\";i:265;s:27:\"nextpage/editor-rtl.min.css\";i:266;s:19:\"nextpage/editor.css\";i:267;s:23:\"nextpage/editor.min.css\";i:268;s:24:\"page-list/editor-rtl.css\";i:269;s:28:\"page-list/editor-rtl.min.css\";i:270;s:20:\"page-list/editor.css\";i:271;s:24:\"page-list/editor.min.css\";i:272;s:23:\"page-list/style-rtl.css\";i:273;s:27:\"page-list/style-rtl.min.css\";i:274;s:19:\"page-list/style.css\";i:275;s:23:\"page-list/style.min.css\";i:276;s:24:\"paragraph/editor-rtl.css\";i:277;s:28:\"paragraph/editor-rtl.min.css\";i:278;s:20:\"paragraph/editor.css\";i:279;s:24:\"paragraph/editor.min.css\";i:280;s:23:\"paragraph/style-rtl.css\";i:281;s:27:\"paragraph/style-rtl.min.css\";i:282;s:19:\"paragraph/style.css\";i:283;s:23:\"paragraph/style.min.css\";i:284;s:35:\"post-author-biography/style-rtl.css\";i:285;s:39:\"post-author-biography/style-rtl.min.css\";i:286;s:31:\"post-author-biography/style.css\";i:287;s:35:\"post-author-biography/style.min.css\";i:288;s:30:\"post-author-name/style-rtl.css\";i:289;s:34:\"post-author-name/style-rtl.min.css\";i:290;s:26:\"post-author-name/style.css\";i:291;s:30:\"post-author-name/style.min.css\";i:292;s:26:\"post-author/editor-rtl.css\";i:293;s:30:\"post-author/editor-rtl.min.css\";i:294;s:22:\"post-author/editor.css\";i:295;s:26:\"post-author/editor.min.css\";i:296;s:25:\"post-author/style-rtl.css\";i:297;s:29:\"post-author/style-rtl.min.css\";i:298;s:21:\"post-author/style.css\";i:299;s:25:\"post-author/style.min.css\";i:300;s:33:\"post-comments-form/editor-rtl.css\";i:301;s:37:\"post-comments-form/editor-rtl.min.css\";i:302;s:29:\"post-comments-form/editor.css\";i:303;s:33:\"post-comments-form/editor.min.css\";i:304;s:32:\"post-comments-form/style-rtl.css\";i:305;s:36:\"post-comments-form/style-rtl.min.css\";i:306;s:28:\"post-comments-form/style.css\";i:307;s:32:\"post-comments-form/style.min.css\";i:308;s:26:\"post-content/style-rtl.css\";i:309;s:30:\"post-content/style-rtl.min.css\";i:310;s:22:\"post-content/style.css\";i:311;s:26:\"post-content/style.min.css\";i:312;s:23:\"post-date/style-rtl.css\";i:313;s:27:\"post-date/style-rtl.min.css\";i:314;s:19:\"post-date/style.css\";i:315;s:23:\"post-date/style.min.css\";i:316;s:27:\"post-excerpt/editor-rtl.css\";i:317;s:31:\"post-excerpt/editor-rtl.min.css\";i:318;s:23:\"post-excerpt/editor.css\";i:319;s:27:\"post-excerpt/editor.min.css\";i:320;s:26:\"post-excerpt/style-rtl.css\";i:321;s:30:\"post-excerpt/style-rtl.min.css\";i:322;s:22:\"post-excerpt/style.css\";i:323;s:26:\"post-excerpt/style.min.css\";i:324;s:34:\"post-featured-image/editor-rtl.css\";i:325;s:38:\"post-featured-image/editor-rtl.min.css\";i:326;s:30:\"post-featured-image/editor.css\";i:327;s:34:\"post-featured-image/editor.min.css\";i:328;s:33:\"post-featured-image/style-rtl.css\";i:329;s:37:\"post-featured-image/style-rtl.min.css\";i:330;s:29:\"post-featured-image/style.css\";i:331;s:33:\"post-featured-image/style.min.css\";i:332;s:34:\"post-navigation-link/style-rtl.css\";i:333;s:38:\"post-navigation-link/style-rtl.min.css\";i:334;s:30:\"post-navigation-link/style.css\";i:335;s:34:\"post-navigation-link/style.min.css\";i:336;s:27:\"post-template/style-rtl.css\";i:337;s:31:\"post-template/style-rtl.min.css\";i:338;s:23:\"post-template/style.css\";i:339;s:27:\"post-template/style.min.css\";i:340;s:24:\"post-terms/style-rtl.css\";i:341;s:28:\"post-terms/style-rtl.min.css\";i:342;s:20:\"post-terms/style.css\";i:343;s:24:\"post-terms/style.min.css\";i:344;s:24:\"post-title/style-rtl.css\";i:345;s:28:\"post-title/style-rtl.min.css\";i:346;s:20:\"post-title/style.css\";i:347;s:24:\"post-title/style.min.css\";i:348;s:26:\"preformatted/style-rtl.css\";i:349;s:30:\"preformatted/style-rtl.min.css\";i:350;s:22:\"preformatted/style.css\";i:351;s:26:\"preformatted/style.min.css\";i:352;s:24:\"pullquote/editor-rtl.css\";i:353;s:28:\"pullquote/editor-rtl.min.css\";i:354;s:20:\"pullquote/editor.css\";i:355;s:24:\"pullquote/editor.min.css\";i:356;s:23:\"pullquote/style-rtl.css\";i:357;s:27:\"pullquote/style-rtl.min.css\";i:358;s:19:\"pullquote/style.css\";i:359;s:23:\"pullquote/style.min.css\";i:360;s:23:\"pullquote/theme-rtl.css\";i:361;s:27:\"pullquote/theme-rtl.min.css\";i:362;s:19:\"pullquote/theme.css\";i:363;s:23:\"pullquote/theme.min.css\";i:364;s:39:\"query-pagination-numbers/editor-rtl.css\";i:365;s:43:\"query-pagination-numbers/editor-rtl.min.css\";i:366;s:35:\"query-pagination-numbers/editor.css\";i:367;s:39:\"query-pagination-numbers/editor.min.css\";i:368;s:31:\"query-pagination/editor-rtl.css\";i:369;s:35:\"query-pagination/editor-rtl.min.css\";i:370;s:27:\"query-pagination/editor.css\";i:371;s:31:\"query-pagination/editor.min.css\";i:372;s:30:\"query-pagination/style-rtl.css\";i:373;s:34:\"query-pagination/style-rtl.min.css\";i:374;s:26:\"query-pagination/style.css\";i:375;s:30:\"query-pagination/style.min.css\";i:376;s:25:\"query-title/style-rtl.css\";i:377;s:29:\"query-title/style-rtl.min.css\";i:378;s:21:\"query-title/style.css\";i:379;s:25:\"query-title/style.min.css\";i:380;s:25:\"query-total/style-rtl.css\";i:381;s:29:\"query-total/style-rtl.min.css\";i:382;s:21:\"query-total/style.css\";i:383;s:25:\"query-total/style.min.css\";i:384;s:20:\"query/editor-rtl.css\";i:385;s:24:\"query/editor-rtl.min.css\";i:386;s:16:\"query/editor.css\";i:387;s:20:\"query/editor.min.css\";i:388;s:19:\"quote/style-rtl.css\";i:389;s:23:\"quote/style-rtl.min.css\";i:390;s:15:\"quote/style.css\";i:391;s:19:\"quote/style.min.css\";i:392;s:19:\"quote/theme-rtl.css\";i:393;s:23:\"quote/theme-rtl.min.css\";i:394;s:15:\"quote/theme.css\";i:395;s:19:\"quote/theme.min.css\";i:396;s:23:\"read-more/style-rtl.css\";i:397;s:27:\"read-more/style-rtl.min.css\";i:398;s:19:\"read-more/style.css\";i:399;s:23:\"read-more/style.min.css\";i:400;s:18:\"rss/editor-rtl.css\";i:401;s:22:\"rss/editor-rtl.min.css\";i:402;s:14:\"rss/editor.css\";i:403;s:18:\"rss/editor.min.css\";i:404;s:17:\"rss/style-rtl.css\";i:405;s:21:\"rss/style-rtl.min.css\";i:406;s:13:\"rss/style.css\";i:407;s:17:\"rss/style.min.css\";i:408;s:21:\"search/editor-rtl.css\";i:409;s:25:\"search/editor-rtl.min.css\";i:410;s:17:\"search/editor.css\";i:411;s:21:\"search/editor.min.css\";i:412;s:20:\"search/style-rtl.css\";i:413;s:24:\"search/style-rtl.min.css\";i:414;s:16:\"search/style.css\";i:415;s:20:\"search/style.min.css\";i:416;s:20:\"search/theme-rtl.css\";i:417;s:24:\"search/theme-rtl.min.css\";i:418;s:16:\"search/theme.css\";i:419;s:20:\"search/theme.min.css\";i:420;s:24:\"separator/editor-rtl.css\";i:421;s:28:\"separator/editor-rtl.min.css\";i:422;s:20:\"separator/editor.css\";i:423;s:24:\"separator/editor.min.css\";i:424;s:23:\"separator/style-rtl.css\";i:425;s:27:\"separator/style-rtl.min.css\";i:426;s:19:\"separator/style.css\";i:427;s:23:\"separator/style.min.css\";i:428;s:23:\"separator/theme-rtl.css\";i:429;s:27:\"separator/theme-rtl.min.css\";i:430;s:19:\"separator/theme.css\";i:431;s:23:\"separator/theme.min.css\";i:432;s:24:\"shortcode/editor-rtl.css\";i:433;s:28:\"shortcode/editor-rtl.min.css\";i:434;s:20:\"shortcode/editor.css\";i:435;s:24:\"shortcode/editor.min.css\";i:436;s:24:\"site-logo/editor-rtl.css\";i:437;s:28:\"site-logo/editor-rtl.min.css\";i:438;s:20:\"site-logo/editor.css\";i:439;s:24:\"site-logo/editor.min.css\";i:440;s:23:\"site-logo/style-rtl.css\";i:441;s:27:\"site-logo/style-rtl.min.css\";i:442;s:19:\"site-logo/style.css\";i:443;s:23:\"site-logo/style.min.css\";i:444;s:27:\"site-tagline/editor-rtl.css\";i:445;s:31:\"site-tagline/editor-rtl.min.css\";i:446;s:23:\"site-tagline/editor.css\";i:447;s:27:\"site-tagline/editor.min.css\";i:448;s:26:\"site-tagline/style-rtl.css\";i:449;s:30:\"site-tagline/style-rtl.min.css\";i:450;s:22:\"site-tagline/style.css\";i:451;s:26:\"site-tagline/style.min.css\";i:452;s:25:\"site-title/editor-rtl.css\";i:453;s:29:\"site-title/editor-rtl.min.css\";i:454;s:21:\"site-title/editor.css\";i:455;s:25:\"site-title/editor.min.css\";i:456;s:24:\"site-title/style-rtl.css\";i:457;s:28:\"site-title/style-rtl.min.css\";i:458;s:20:\"site-title/style.css\";i:459;s:24:\"site-title/style.min.css\";i:460;s:26:\"social-link/editor-rtl.css\";i:461;s:30:\"social-link/editor-rtl.min.css\";i:462;s:22:\"social-link/editor.css\";i:463;s:26:\"social-link/editor.min.css\";i:464;s:27:\"social-links/editor-rtl.css\";i:465;s:31:\"social-links/editor-rtl.min.css\";i:466;s:23:\"social-links/editor.css\";i:467;s:27:\"social-links/editor.min.css\";i:468;s:26:\"social-links/style-rtl.css\";i:469;s:30:\"social-links/style-rtl.min.css\";i:470;s:22:\"social-links/style.css\";i:471;s:26:\"social-links/style.min.css\";i:472;s:21:\"spacer/editor-rtl.css\";i:473;s:25:\"spacer/editor-rtl.min.css\";i:474;s:17:\"spacer/editor.css\";i:475;s:21:\"spacer/editor.min.css\";i:476;s:20:\"spacer/style-rtl.css\";i:477;s:24:\"spacer/style-rtl.min.css\";i:478;s:16:\"spacer/style.css\";i:479;s:20:\"spacer/style.min.css\";i:480;s:20:\"table/editor-rtl.css\";i:481;s:24:\"table/editor-rtl.min.css\";i:482;s:16:\"table/editor.css\";i:483;s:20:\"table/editor.min.css\";i:484;s:19:\"table/style-rtl.css\";i:485;s:23:\"table/style-rtl.min.css\";i:486;s:15:\"table/style.css\";i:487;s:19:\"table/style.min.css\";i:488;s:19:\"table/theme-rtl.css\";i:489;s:23:\"table/theme-rtl.min.css\";i:490;s:15:\"table/theme.css\";i:491;s:19:\"table/theme.min.css\";i:492;s:24:\"tag-cloud/editor-rtl.css\";i:493;s:28:\"tag-cloud/editor-rtl.min.css\";i:494;s:20:\"tag-cloud/editor.css\";i:495;s:24:\"tag-cloud/editor.min.css\";i:496;s:23:\"tag-cloud/style-rtl.css\";i:497;s:27:\"tag-cloud/style-rtl.min.css\";i:498;s:19:\"tag-cloud/style.css\";i:499;s:23:\"tag-cloud/style.min.css\";i:500;s:28:\"template-part/editor-rtl.css\";i:501;s:32:\"template-part/editor-rtl.min.css\";i:502;s:24:\"template-part/editor.css\";i:503;s:28:\"template-part/editor.min.css\";i:504;s:27:\"template-part/theme-rtl.css\";i:505;s:31:\"template-part/theme-rtl.min.css\";i:506;s:23:\"template-part/theme.css\";i:507;s:27:\"template-part/theme.min.css\";i:508;s:30:\"term-description/style-rtl.css\";i:509;s:34:\"term-description/style-rtl.min.css\";i:510;s:26:\"term-description/style.css\";i:511;s:30:\"term-description/style.min.css\";i:512;s:27:\"text-columns/editor-rtl.css\";i:513;s:31:\"text-columns/editor-rtl.min.css\";i:514;s:23:\"text-columns/editor.css\";i:515;s:27:\"text-columns/editor.min.css\";i:516;s:26:\"text-columns/style-rtl.css\";i:517;s:30:\"text-columns/style-rtl.min.css\";i:518;s:22:\"text-columns/style.css\";i:519;s:26:\"text-columns/style.min.css\";i:520;s:19:\"verse/style-rtl.css\";i:521;s:23:\"verse/style-rtl.min.css\";i:522;s:15:\"verse/style.css\";i:523;s:19:\"verse/style.min.css\";i:524;s:20:\"video/editor-rtl.css\";i:525;s:24:\"video/editor-rtl.min.css\";i:526;s:16:\"video/editor.css\";i:527;s:20:\"video/editor.min.css\";i:528;s:19:\"video/style-rtl.css\";i:529;s:23:\"video/style-rtl.min.css\";i:530;s:15:\"video/style.css\";i:531;s:19:\"video/style.min.css\";i:532;s:19:\"video/theme-rtl.css\";i:533;s:23:\"video/theme-rtl.min.css\";i:534;s:15:\"video/theme.css\";i:535;s:19:\"video/theme.min.css\";}}','on'),(124,'_transient_doing_cron','1764371989.4203000068664550781250','on'),(125,'theme_mods_twentytwentyfive','a:2:{s:18:\"custom_css_post_id\";i:-1;s:16:\"sidebars_widgets\";a:2:{s:4:\"time\";i:1764367183;s:4:\"data\";a:3:{s:19:\"wp_inactive_widgets\";a:0:{}s:9:\"sidebar-1\";a:3:{i:0;s:7:\"block-2\";i:1;s:7:\"block-3\";i:2;s:7:\"block-4\";}s:9:\"sidebar-2\";a:2:{i:0;s:7:\"block-5\";i:1;s:7:\"block-6\";}}}}','off'),(126,'_transient_wp_styles_for_blocks','a:2:{s:4:\"hash\";s:32:\"64ad95698215776f80fa1e80f2eb5417\";s:6:\"blocks\";a:7:{s:11:\"core/button\";s:0:\"\";s:14:\"core/site-logo\";s:0:\"\";s:18:\"core/post-template\";s:0:\"\";s:12:\"core/columns\";s:0:\"\";s:14:\"core/pullquote\";s:121:\":root :where(.wp-block-pullquote){font-size: clamp(0.984em, 0.984rem + ((1vw - 0.2em) * 0.938), 1.5em);line-height: 1.6;}\";s:15:\"core/site-title\";s:89:\":root :where(.wp-block-site-title){font-family: var(--wp--preset--font-family--display);}\";s:15:\"core/navigation\";s:86:\":root :where(.wp-block-navigation){font-family: var(--wp--preset--font-family--body);}\";}}','on'),(129,'category_children','a:0:{}','auto'),(132,'_site_transient_update_themes','O:8:\"stdClass\":5:{s:12:\"last_checked\";i:1764371969;s:7:\"checked\";a:4:{s:8:\"homeproz\";s:5:\"1.0.0\";s:16:\"twentytwentyfive\";s:3:\"1.3\";s:16:\"twentytwentyfour\";s:3:\"1.3\";s:17:\"twentytwentythree\";s:3:\"1.6\";}s:8:\"response\";a:0:{}s:9:\"no_update\";a:3:{s:16:\"twentytwentyfive\";a:6:{s:5:\"theme\";s:16:\"twentytwentyfive\";s:11:\"new_version\";s:3:\"1.3\";s:3:\"url\";s:46:\"https://wordpress.org/themes/twentytwentyfive/\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/theme/twentytwentyfive.1.3.zip\";s:8:\"requires\";s:3:\"6.7\";s:12:\"requires_php\";s:3:\"7.2\";}s:16:\"twentytwentyfour\";a:6:{s:5:\"theme\";s:16:\"twentytwentyfour\";s:11:\"new_version\";s:3:\"1.3\";s:3:\"url\";s:46:\"https://wordpress.org/themes/twentytwentyfour/\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/theme/twentytwentyfour.1.3.zip\";s:8:\"requires\";s:3:\"6.4\";s:12:\"requires_php\";s:3:\"7.0\";}s:17:\"twentytwentythree\";a:6:{s:5:\"theme\";s:17:\"twentytwentythree\";s:11:\"new_version\";s:3:\"1.6\";s:3:\"url\";s:47:\"https://wordpress.org/themes/twentytwentythree/\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/theme/twentytwentythree.1.6.zip\";s:8:\"requires\";s:3:\"6.1\";s:12:\"requires_php\";s:3:\"5.6\";}}s:12:\"translations\";a:0:{}}','off'),(133,'current_theme','HomeProz','auto'),(134,'theme_switched','','auto'),(135,'theme_mods_homeproz','a:2:{s:18:\"nav_menu_locations\";a:1:{s:7:\"primary\";i:15;}s:18:\"custom_css_post_id\";i:-1;}','auto'),(141,'property_type_children','a:0:{}','auto'),(144,'property_status_children','a:0:{}','auto'),(150,'property_location_children','a:0:{}','auto'),(152,'_site_transient_update_core','O:8:\"stdClass\":4:{s:7:\"updates\";a:1:{i:0;O:8:\"stdClass\":10:{s:8:\"response\";s:6:\"latest\";s:8:\"download\";s:59:\"https://downloads.wordpress.org/release/wordpress-6.8.3.zip\";s:6:\"locale\";s:5:\"en_US\";s:8:\"packages\";O:8:\"stdClass\":5:{s:4:\"full\";s:59:\"https://downloads.wordpress.org/release/wordpress-6.8.3.zip\";s:10:\"no_content\";s:70:\"https://downloads.wordpress.org/release/wordpress-6.8.3-no-content.zip\";s:11:\"new_bundled\";s:71:\"https://downloads.wordpress.org/release/wordpress-6.8.3-new-bundled.zip\";s:7:\"partial\";s:0:\"\";s:8:\"rollback\";s:0:\"\";}s:7:\"current\";s:5:\"6.8.3\";s:7:\"version\";s:5:\"6.8.3\";s:11:\"php_version\";s:6:\"7.2.24\";s:13:\"mysql_version\";s:5:\"5.5.5\";s:11:\"new_bundled\";s:3:\"6.7\";s:15:\"partial_version\";s:0:\"\";}}s:12:\"last_checked\";i:1764371969;s:15:\"version_checked\";s:5:\"6.8.3\";s:12:\"translations\";a:0:{}}','off'),(156,'acf_first_activated_version','6.6.2','on'),(157,'acf_site_health','{\"event_first_activated\":1764369116,\"last_updated\":1764369116}','off'),(158,'_site_transient_timeout_wp_theme_files_patterns-2aae27f1f26ef7a6be8ebee5c8a6a86b','1764372438','off'),(159,'_site_transient_wp_theme_files_patterns-2aae27f1f26ef7a6be8ebee5c8a6a86b','a:2:{s:7:\"version\";s:5:\"1.0.0\";s:8:\"patterns\";a:0:{}}','off'),(162,'wpcf7','a:2:{s:7:\"version\";s:5:\"6.1.3\";s:13:\"bulk_validate\";a:4:{s:9:\"timestamp\";i:1764370639;s:7:\"version\";s:5:\"6.1.3\";s:11:\"count_valid\";i:1;s:13:\"count_invalid\";i:0;}}','auto'),(165,'_site_transient_timeout_theme_roots','1764373103','off'),(166,'_site_transient_theme_roots','a:4:{s:8:\"homeproz\";s:7:\"/themes\";s:16:\"twentytwentyfive\";s:7:\"/themes\";s:16:\"twentytwentyfour\";s:7:\"/themes\";s:17:\"twentytwentythree\";s:7:\"/themes\";}','off'),(167,'yoast_migrations_free','a:1:{s:7:\"version\";s:4:\"26.4\";}','auto'),(168,'wpseo','a:120:{s:8:\"tracking\";b:0;s:16:\"toggled_tracking\";b:0;s:22:\"license_server_version\";b:0;s:15:\"ms_defaults_set\";b:0;s:40:\"ignore_search_engines_discouraged_notice\";b:0;s:19:\"indexing_first_time\";b:1;s:16:\"indexing_started\";b:0;s:15:\"indexing_reason\";s:24:\"attachments_made_enabled\";s:29:\"indexables_indexing_completed\";b:0;s:13:\"index_now_key\";s:0:\"\";s:7:\"version\";s:4:\"26.4\";s:16:\"previous_version\";s:0:\"\";s:20:\"disableadvanced_meta\";b:1;s:30:\"enable_headless_rest_endpoints\";b:1;s:17:\"ryte_indexability\";b:0;s:11:\"baiduverify\";s:0:\"\";s:12:\"googleverify\";s:0:\"\";s:8:\"msverify\";s:0:\"\";s:12:\"yandexverify\";s:0:\"\";s:12:\"ahrefsverify\";s:0:\"\";s:9:\"site_type\";s:0:\"\";s:20:\"has_multiple_authors\";s:0:\"\";s:16:\"environment_type\";s:0:\"\";s:23:\"content_analysis_active\";b:1;s:23:\"keyword_analysis_active\";b:1;s:34:\"inclusive_language_analysis_active\";b:0;s:21:\"enable_admin_bar_menu\";b:1;s:26:\"enable_cornerstone_content\";b:1;s:18:\"enable_xml_sitemap\";b:1;s:24:\"enable_text_link_counter\";b:1;s:16:\"enable_index_now\";b:1;s:19:\"enable_ai_generator\";b:1;s:22:\"ai_enabled_pre_default\";b:0;s:22:\"show_onboarding_notice\";b:1;s:18:\"first_activated_on\";i:1764371307;s:13:\"myyoast-oauth\";b:0;s:26:\"semrush_integration_active\";b:1;s:14:\"semrush_tokens\";a:0:{}s:20:\"semrush_country_code\";s:2:\"us\";s:19:\"permalink_structure\";s:0:\"\";s:8:\"home_url\";s:0:\"\";s:18:\"dynamic_permalinks\";b:0;s:17:\"category_base_url\";s:0:\"\";s:12:\"tag_base_url\";s:0:\"\";s:21:\"custom_taxonomy_slugs\";a:0:{}s:29:\"enable_enhanced_slack_sharing\";b:1;s:23:\"enable_metabox_insights\";b:1;s:23:\"enable_link_suggestions\";b:1;s:26:\"algolia_integration_active\";b:0;s:14:\"import_cursors\";a:0:{}s:13:\"workouts_data\";a:1:{s:13:\"configuration\";a:1:{s:13:\"finishedSteps\";a:0:{}}}s:28:\"configuration_finished_steps\";a:0:{}s:36:\"dismiss_configuration_workout_notice\";b:0;s:34:\"dismiss_premium_deactivated_notice\";b:0;s:19:\"importing_completed\";a:0:{}s:26:\"wincher_integration_active\";b:1;s:14:\"wincher_tokens\";a:0:{}s:36:\"wincher_automatically_add_keyphrases\";b:0;s:18:\"wincher_website_id\";s:0:\"\";s:18:\"first_time_install\";b:1;s:34:\"should_redirect_after_install_free\";b:0;s:34:\"activation_redirect_timestamp_free\";i:1764371307;s:18:\"remove_feed_global\";b:0;s:27:\"remove_feed_global_comments\";b:0;s:25:\"remove_feed_post_comments\";b:0;s:19:\"remove_feed_authors\";b:0;s:22:\"remove_feed_categories\";b:0;s:16:\"remove_feed_tags\";b:0;s:29:\"remove_feed_custom_taxonomies\";b:0;s:22:\"remove_feed_post_types\";b:0;s:18:\"remove_feed_search\";b:0;s:21:\"remove_atom_rdf_feeds\";b:0;s:17:\"remove_shortlinks\";b:0;s:21:\"remove_rest_api_links\";b:0;s:20:\"remove_rsd_wlw_links\";b:0;s:19:\"remove_oembed_links\";b:0;s:16:\"remove_generator\";b:0;s:20:\"remove_emoji_scripts\";b:0;s:24:\"remove_powered_by_header\";b:0;s:22:\"remove_pingback_header\";b:0;s:28:\"clean_campaign_tracking_urls\";b:0;s:16:\"clean_permalinks\";b:0;s:32:\"clean_permalinks_extra_variables\";s:0:\"\";s:14:\"search_cleanup\";b:0;s:20:\"search_cleanup_emoji\";b:0;s:23:\"search_cleanup_patterns\";b:0;s:22:\"search_character_limit\";i:50;s:20:\"deny_search_crawling\";b:0;s:21:\"deny_wp_json_crawling\";b:0;s:20:\"deny_adsbot_crawling\";b:0;s:19:\"deny_ccbot_crawling\";b:0;s:29:\"deny_google_extended_crawling\";b:0;s:20:\"deny_gptbot_crawling\";b:0;s:27:\"redirect_search_pretty_urls\";b:0;s:29:\"least_readability_ignore_list\";a:0:{}s:27:\"least_seo_score_ignore_list\";a:0:{}s:23:\"most_linked_ignore_list\";a:0:{}s:24:\"least_linked_ignore_list\";a:0:{}s:28:\"indexables_page_reading_list\";a:5:{i:0;b:0;i:1;b:0;i:2;b:0;i:3;b:0;i:4;b:0;}s:25:\"indexables_overview_state\";s:21:\"dashboard-not-visited\";s:28:\"last_known_public_post_types\";a:0:{}s:28:\"last_known_public_taxonomies\";a:0:{}s:23:\"last_known_no_unindexed\";a:0:{}s:14:\"new_post_types\";a:0:{}s:14:\"new_taxonomies\";a:0:{}s:34:\"show_new_content_type_notification\";b:0;s:44:\"site_kit_configuration_permanently_dismissed\";b:0;s:18:\"site_kit_connected\";b:0;s:37:\"site_kit_tracking_setup_widget_loaded\";s:2:\"no\";s:41:\"site_kit_tracking_first_interaction_stage\";s:0:\"\";s:40:\"site_kit_tracking_last_interaction_stage\";s:0:\"\";s:52:\"site_kit_tracking_setup_widget_temporarily_dismissed\";s:2:\"no\";s:52:\"site_kit_tracking_setup_widget_permanently_dismissed\";s:2:\"no\";s:31:\"google_site_kit_feature_enabled\";b:0;s:25:\"ai_free_sparks_started_on\";N;s:15:\"enable_llms_txt\";b:0;s:15:\"last_updated_on\";b:0;s:17:\"default_seo_title\";a:0:{}s:21:\"default_seo_meta_desc\";a:0:{}s:18:\"first_activated_by\";i:0;}','auto'),(169,'wpseo_titles','a:173:{s:17:\"forcerewritetitle\";b:0;s:9:\"separator\";s:7:\"sc-dash\";s:16:\"title-home-wpseo\";s:47:\"HomeProz Real Estate | Albert Lea MN Properties\";s:18:\"title-author-wpseo\";s:41:\"%%name%%, Author at %%sitename%% %%page%%\";s:19:\"title-archive-wpseo\";s:38:\"%%date%% %%page%% %%sep%% %%sitename%%\";s:18:\"title-search-wpseo\";s:63:\"You searched for %%searchphrase%% %%page%% %%sep%% %%sitename%%\";s:15:\"title-404-wpseo\";s:35:\"Page not found %%sep%% %%sitename%%\";s:25:\"social-title-author-wpseo\";s:8:\"%%name%%\";s:26:\"social-title-archive-wpseo\";s:8:\"%%date%%\";s:31:\"social-description-author-wpseo\";s:0:\"\";s:32:\"social-description-archive-wpseo\";s:0:\"\";s:29:\"social-image-url-author-wpseo\";s:0:\"\";s:30:\"social-image-url-archive-wpseo\";s:0:\"\";s:28:\"social-image-id-author-wpseo\";i:0;s:29:\"social-image-id-archive-wpseo\";i:0;s:19:\"metadesc-home-wpseo\";s:120:\"HomeProz Real Estate - Your trusted partner for buying and selling homes in Albert Lea, Minnesota and surrounding areas.\";s:21:\"metadesc-author-wpseo\";s:0:\"\";s:22:\"metadesc-archive-wpseo\";s:0:\"\";s:9:\"rssbefore\";s:0:\"\";s:8:\"rssafter\";s:53:\"The post %%POSTLINK%% appeared first on %%BLOGLINK%%.\";s:20:\"noindex-author-wpseo\";b:0;s:28:\"noindex-author-noposts-wpseo\";b:0;s:21:\"noindex-archive-wpseo\";b:0;s:14:\"disable-author\";b:0;s:12:\"disable-date\";b:0;s:19:\"disable-post_format\";b:0;s:18:\"disable-attachment\";b:0;s:20:\"breadcrumbs-404crumb\";s:25:\"Error 404: Page not found\";s:29:\"breadcrumbs-display-blog-page\";b:0;s:20:\"breadcrumbs-boldlast\";b:0;s:25:\"breadcrumbs-archiveprefix\";s:12:\"Archives for\";s:18:\"breadcrumbs-enable\";b:0;s:16:\"breadcrumbs-home\";s:4:\"Home\";s:18:\"breadcrumbs-prefix\";s:0:\"\";s:24:\"breadcrumbs-searchprefix\";s:16:\"You searched for\";s:15:\"breadcrumbs-sep\";s:2:\"»\";s:12:\"website_name\";s:0:\"\";s:11:\"person_name\";s:0:\"\";s:11:\"person_logo\";s:0:\"\";s:22:\"alternate_website_name\";s:0:\"\";s:12:\"company_logo\";s:0:\"\";s:12:\"company_name\";s:0:\"\";s:22:\"company_alternate_name\";s:0:\"\";s:17:\"company_or_person\";s:7:\"company\";s:25:\"company_or_person_user_id\";b:0;s:17:\"stripcategorybase\";b:0;s:26:\"open_graph_frontpage_title\";s:12:\"%%sitename%%\";s:25:\"open_graph_frontpage_desc\";s:0:\"\";s:26:\"open_graph_frontpage_image\";s:0:\"\";s:24:\"publishing_principles_id\";i:0;s:25:\"ownership_funding_info_id\";i:0;s:29:\"actionable_feedback_policy_id\";i:0;s:21:\"corrections_policy_id\";i:0;s:16:\"ethics_policy_id\";i:0;s:19:\"diversity_policy_id\";i:0;s:28:\"diversity_staffing_report_id\";i:0;s:15:\"org-description\";s:0:\"\";s:9:\"org-email\";s:0:\"\";s:9:\"org-phone\";s:0:\"\";s:14:\"org-legal-name\";s:0:\"\";s:17:\"org-founding-date\";s:0:\"\";s:20:\"org-number-employees\";s:0:\"\";s:10:\"org-vat-id\";s:0:\"\";s:10:\"org-tax-id\";s:0:\"\";s:7:\"org-iso\";s:0:\"\";s:8:\"org-duns\";s:0:\"\";s:11:\"org-leicode\";s:0:\"\";s:9:\"org-naics\";s:0:\"\";s:10:\"title-post\";s:39:\"%%title%% %%page%% %%sep%% %%sitename%%\";s:13:\"metadesc-post\";s:0:\"\";s:12:\"noindex-post\";b:0;s:23:\"display-metabox-pt-post\";b:0;s:23:\"post_types-post-maintax\";i:0;s:21:\"schema-page-type-post\";s:7:\"WebPage\";s:24:\"schema-article-type-post\";s:7:\"Article\";s:17:\"social-title-post\";s:9:\"%%title%%\";s:23:\"social-description-post\";s:0:\"\";s:21:\"social-image-url-post\";s:0:\"\";s:20:\"social-image-id-post\";i:0;s:10:\"title-page\";s:39:\"%%title%% %%page%% %%sep%% %%sitename%%\";s:13:\"metadesc-page\";s:0:\"\";s:12:\"noindex-page\";b:0;s:23:\"display-metabox-pt-page\";b:0;s:23:\"post_types-page-maintax\";i:0;s:21:\"schema-page-type-page\";s:7:\"WebPage\";s:24:\"schema-article-type-page\";s:4:\"None\";s:17:\"social-title-page\";s:9:\"%%title%%\";s:23:\"social-description-page\";s:0:\"\";s:21:\"social-image-url-page\";s:0:\"\";s:20:\"social-image-id-page\";i:0;s:16:\"title-attachment\";s:39:\"%%title%% %%page%% %%sep%% %%sitename%%\";s:19:\"metadesc-attachment\";s:0:\"\";s:18:\"noindex-attachment\";b:0;s:29:\"display-metabox-pt-attachment\";b:0;s:29:\"post_types-attachment-maintax\";i:0;s:27:\"schema-page-type-attachment\";s:7:\"WebPage\";s:30:\"schema-article-type-attachment\";s:4:\"None\";s:18:\"title-tax-category\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:21:\"metadesc-tax-category\";s:0:\"\";s:28:\"display-metabox-tax-category\";b:0;s:20:\"noindex-tax-category\";b:0;s:25:\"social-title-tax-category\";s:23:\"%%term_title%% Archives\";s:31:\"social-description-tax-category\";s:0:\"\";s:29:\"social-image-url-tax-category\";s:0:\"\";s:28:\"social-image-id-tax-category\";i:0;s:26:\"taxonomy-category-ptparent\";i:0;s:18:\"title-tax-post_tag\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:21:\"metadesc-tax-post_tag\";s:0:\"\";s:28:\"display-metabox-tax-post_tag\";b:0;s:20:\"noindex-tax-post_tag\";b:0;s:25:\"social-title-tax-post_tag\";s:23:\"%%term_title%% Archives\";s:31:\"social-description-tax-post_tag\";s:0:\"\";s:29:\"social-image-url-tax-post_tag\";s:0:\"\";s:28:\"social-image-id-tax-post_tag\";i:0;s:26:\"taxonomy-post_tag-ptparent\";i:0;s:21:\"title-tax-post_format\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:24:\"metadesc-tax-post_format\";s:0:\"\";s:31:\"display-metabox-tax-post_format\";b:0;s:23:\"noindex-tax-post_format\";b:0;s:28:\"social-title-tax-post_format\";s:23:\"%%term_title%% Archives\";s:34:\"social-description-tax-post_format\";s:0:\"\";s:32:\"social-image-url-tax-post_format\";s:0:\"\";s:31:\"social-image-id-tax-post_format\";i:0;s:29:\"taxonomy-post_format-ptparent\";i:0;s:14:\"title-property\";s:30:\"%%title%% %%sep%% %%sitename%%\";s:17:\"metadesc-property\";s:106:\"View property details, photos, and features for %%title%%. Contact HomeProz Real Estate in Albert Lea, MN.\";s:16:\"noindex-property\";b:0;s:27:\"display-metabox-pt-property\";b:0;s:27:\"post_types-property-maintax\";i:0;s:25:\"schema-page-type-property\";s:7:\"WebPage\";s:28:\"schema-article-type-property\";s:4:\"None\";s:21:\"social-title-property\";s:9:\"%%title%%\";s:27:\"social-description-property\";s:0:\"\";s:25:\"social-image-url-property\";s:0:\"\";s:24:\"social-image-id-property\";i:0;s:24:\"title-ptarchive-property\";s:49:\"Properties For Sale %%page%% %%sep%% %%sitename%%\";s:27:\"metadesc-ptarchive-property\";s:126:\"Browse all properties for sale in Albert Lea, Minnesota and surrounding areas. Find your dream home with HomeProz Real Estate.\";s:26:\"bctitle-ptarchive-property\";s:0:\"\";s:26:\"noindex-ptarchive-property\";b:0;s:31:\"social-title-ptarchive-property\";s:21:\"%%pt_plural%% Archive\";s:37:\"social-description-ptarchive-property\";s:0:\"\";s:35:\"social-image-url-ptarchive-property\";s:0:\"\";s:34:\"social-image-id-ptarchive-property\";i:0;s:23:\"title-tax-property_type\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:26:\"metadesc-tax-property_type\";s:0:\"\";s:33:\"display-metabox-tax-property_type\";b:0;s:25:\"noindex-tax-property_type\";b:0;s:30:\"social-title-tax-property_type\";s:23:\"%%term_title%% Archives\";s:36:\"social-description-tax-property_type\";s:0:\"\";s:34:\"social-image-url-tax-property_type\";s:0:\"\";s:33:\"social-image-id-tax-property_type\";i:0;s:31:\"taxonomy-property_type-ptparent\";i:0;s:25:\"title-tax-property_status\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:28:\"metadesc-tax-property_status\";s:0:\"\";s:35:\"display-metabox-tax-property_status\";b:0;s:27:\"noindex-tax-property_status\";b:0;s:32:\"social-title-tax-property_status\";s:23:\"%%term_title%% Archives\";s:38:\"social-description-tax-property_status\";s:0:\"\";s:36:\"social-image-url-tax-property_status\";s:0:\"\";s:35:\"social-image-id-tax-property_status\";i:0;s:33:\"taxonomy-property_status-ptparent\";i:0;s:27:\"title-tax-property_location\";s:53:\"%%term_title%% Archives %%page%% %%sep%% %%sitename%%\";s:30:\"metadesc-tax-property_location\";s:0:\"\";s:37:\"display-metabox-tax-property_location\";b:0;s:29:\"noindex-tax-property_location\";b:0;s:34:\"social-title-tax-property_location\";s:23:\"%%term_title%% Archives\";s:40:\"social-description-tax-property_location\";s:0:\"\";s:38:\"social-image-url-tax-property_location\";s:0:\"\";s:37:\"social-image-id-tax-property_location\";i:0;s:35:\"taxonomy-property_location-ptparent\";i:0;s:14:\"person_logo_id\";i:0;s:15:\"company_logo_id\";i:0;s:29:\"open_graph_frontpage_image_id\";i:0;}','auto'),(170,'wpseo_social','a:20:{s:13:\"facebook_site\";s:0:\"\";s:13:\"instagram_url\";s:0:\"\";s:12:\"linkedin_url\";s:0:\"\";s:11:\"myspace_url\";s:0:\"\";s:16:\"og_default_image\";s:0:\"\";s:19:\"og_default_image_id\";s:0:\"\";s:18:\"og_frontpage_title\";s:47:\"HomeProz Real Estate | Albert Lea MN Properties\";s:17:\"og_frontpage_desc\";s:97:\"Your trusted partner for buying and selling homes in Albert Lea, Minnesota and surrounding areas.\";s:18:\"og_frontpage_image\";s:0:\"\";s:21:\"og_frontpage_image_id\";s:0:\"\";s:9:\"opengraph\";b:1;s:13:\"pinterest_url\";s:0:\"\";s:15:\"pinterestverify\";s:0:\"\";s:7:\"twitter\";b:1;s:12:\"twitter_site\";s:0:\"\";s:17:\"twitter_card_type\";s:19:\"summary_large_image\";s:11:\"youtube_url\";s:0:\"\";s:13:\"wikipedia_url\";s:0:\"\";s:17:\"other_social_urls\";a:0:{}s:12:\"mastodon_url\";s:0:\"\";}','auto'),(171,'wpseo_llmstxt','a:7:{s:23:\"llms_txt_selection_mode\";s:4:\"auto\";s:13:\"about_us_page\";i:0;s:12:\"contact_page\";i:0;s:10:\"terms_page\";i:0;s:19:\"privacy_policy_page\";i:0;s:9:\"shop_page\";i:0;s:20:\"other_included_pages\";a:0:{}}','auto'),(174,'webpc_is_new_installation','1','auto'),(175,'webpc_notice_thanks','1765581302','auto'),(176,'webpc_notice_pro_version','1764976502','auto'),(177,'webpc_stats_installation_date','2025-11-28 23:15:02','auto'),(178,'webpc_stats_first_version','6.3.2','auto'),(181,'aio_wp_security_configs','a:47:{s:28:\"aiowps_enable_login_lockdown\";s:1:\"1\";s:28:\"aiowps_allow_unlock_requests\";s:1:\"1\";s:25:\"aiowps_max_login_attempts\";s:2:\"10\";s:24:\"aiowps_retry_time_period\";s:1:\"5\";s:26:\"aiowps_lockout_time_length\";s:2:\"30\";s:30:\"aiowps_max_lockout_time_length\";s:2:\"60\";s:28:\"aiowps_set_generic_login_msg\";s:1:\"1\";s:26:\"aiowps_enable_email_notify\";s:1:\"1\";s:20:\"aiowps_email_address\";s:16:\"brian@hanson.xyz\";s:39:\"aiowps_enable_invalid_username_lockdown\";s:0:\"\";s:43:\"aiowps_instantly_lockout_specific_usernames\";a:3:{i:0;s:5:\"admin\";i:1;s:13:\"administrator\";i:2;s:4:\"test\";}s:36:\"aiowps_remove_wp_generator_meta_info\";s:1:\"1\";s:27:\"aiowps_disable_file_editing\";s:1:\"1\";s:37:\"aiowps_prevent_default_wp_file_access\";s:1:\"1\";s:28:\"aiowps_enable_basic_firewall\";s:1:\"1\";s:27:\"aiowps_max_file_upload_size\";i:100;s:38:\"aiowps_disable_xmlrpc_pingback_methods\";s:1:\"1\";s:34:\"aiowps_block_debug_log_file_access\";s:1:\"1\";s:26:\"aiowps_disable_index_views\";s:1:\"1\";s:32:\"aiowps_prevent_users_enumeration\";s:1:\"1\";s:42:\"aiowps_disallow_unauthorized_rest_requests\";s:1:\"1\";s:40:\"aiowps_prevent_site_display_inside_frame\";s:1:\"1\";s:28:\"aiowps_enable_login_honeypot\";s:1:\"1\";s:35:\"aiowps_disable_application_password\";s:0:\"\";s:30:\"aiowps_enable_spambot_blocking\";s:1:\"1\";s:29:\"aiowps_enable_comment_captcha\";s:0:\"\";s:25:\"aiowps_enable_404_logging\";s:1:\"1\";s:28:\"aiowps_enable_404_IP_lockout\";s:0:\"\";s:36:\"aiowps_on_uninstall_delete_db_tables\";s:1:\"1\";s:34:\"aiowps_on_uninstall_delete_configs\";s:1:\"1\";s:31:\"aiowps_enable_rename_login_page\";s:0:\"\";s:43:\"aiowps_enable_brute_force_attack_prevention\";s:0:\"\";s:19:\"aiowps_site_lockout\";s:0:\"\";s:19:\"aiowps_enable_debug\";s:0:\"\";s:22:\"aiowps_default_captcha\";s:0:\"\";s:27:\"aiowps_enable_login_captcha\";s:0:\"\";s:35:\"aiowps_enable_registration_honeypot\";s:1:\"1\";s:26:\"aiowps_enable_blacklisting\";s:0:\"\";s:25:\"aiowps_enable_5g_firewall\";s:0:\"\";s:25:\"aiowps_enable_6g_firewall\";s:0:\"\";s:26:\"aiowps_enable_custom_rules\";s:0:\"\";s:25:\"aiowps_prevent_hotlinking\";s:0:\"\";s:22:\"aiowps_copy_protection\";s:0:\"\";s:33:\"aiowps_disable_rss_and_atom_feeds\";s:0:\"\";s:27:\"aiowps_enable_forced_logout\";s:0:\"\";s:32:\"aiowps_enable_automated_fcd_scan\";s:0:\"\";s:12:\"installed-at\";i:1764371970;}','auto'),(182,'aios_antibot_key_map_info','a:3:{i:0;a:2:{i:0;a:2:{i:0;s:8:\"dz7zzn8y\";i:1;s:12:\"ewbnnm47eqe7\";}i:1;a:2:{i:0;s:8:\"ovzo7jga\";i:1;s:12:\"zojsx526xhvu\";}}i:1;a:2:{i:0;a:2:{i:0;s:8:\"xdxz27wr\";i:1;s:12:\"xeft4p3ib2l1\";}i:1;a:2:{i:0;s:8:\"oth0fymk\";i:1;s:12:\"bjcyxlmg09pv\";}}i:2;i:1764720000;}','off'),(183,'aiowpsec_db_version','2.1.4','auto'),(184,'aiowpsec_firewall_version','1.0.8','auto'); /*!40000 ALTER TABLE `wp_options` ENABLE KEYS */; UNLOCK TABLES; @@ -466,7 +721,7 @@ CREATE TABLE `wp_yoast_indexable` ( KEY `subpages` (`post_parent`,`object_type`,`post_status`,`object_id`), KEY `prominent_words` (`prominent_words_version`,`object_type`,`object_sub_type`,`post_status`), KEY `published_sitemap_index` (`object_published_at`,`is_robots_noindex`,`object_type`,`object_sub_type`) -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -475,7 +730,7 @@ CREATE TABLE `wp_yoast_indexable` ( LOCK TABLES `wp_yoast_indexable` WRITE; /*!40000 ALTER TABLE `wp_yoast_indexable` DISABLE KEYS */; -INSERT INTO `wp_yoast_indexable` VALUES (1,NULL,NULL,NULL,'date-archive',NULL,NULL,NULL,'%%date%% %%page%% %%sep%% %%sitename%%','',NULL,NULL,1,0,NULL,NULL,NULL,NULL,NULL,NULL,0,0,0,0,0,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2025-11-28 23:08:35','2025-11-29 05:08:35',1,NULL,NULL,NULL,NULL,0,NULL,1,NULL,NULL,NULL),(2,'https://homeproz.dev.hanson.xyz/properties/','43:fe19fb00353a16a1e0f990a64c3584a1',NULL,'post-type-archive','property',NULL,NULL,'Properties For Sale %%page%% %%sep%% %%sitename%%','Browse all properties for sale in Albert Lea, Minnesota and surrounding areas. Find your dream home with HomeProz Real Estate.','Properties',NULL,1,0,NULL,NULL,NULL,NULL,NULL,NULL,0,0,0,0,0,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2025-11-28 23:08:35','2025-11-29 05:08:35',1,NULL,NULL,NULL,NULL,0,NULL,2,'2025-11-28 23:08:35','2025-11-28 22:33:26',NULL),(3,'https://homeproz.dev.hanson.xyz/','32:69cc765724b94f94108e52a02a04fa6f',NULL,'home-page',NULL,NULL,NULL,'HomeProz Real Estate | Albert Lea MN Properties','HomeProz Real Estate - Your trusted partner for buying and selling homes in Albert Lea, Minnesota and surrounding areas.','Home',NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,0,0,0,0,0,0,NULL,NULL,NULL,NULL,NULL,'%%sitename%%','','','0',NULL,NULL,NULL,NULL,NULL,'2025-11-28 23:08:35','2025-11-29 05:08:35',1,NULL,NULL,NULL,NULL,0,NULL,2,'2025-11-28 23:08:35','2025-11-28 21:02:25',NULL); +INSERT INTO `wp_yoast_indexable` VALUES (1,NULL,NULL,NULL,'date-archive',NULL,NULL,NULL,'%%date%% %%page%% %%sep%% %%sitename%%','',NULL,NULL,1,0,NULL,NULL,NULL,NULL,NULL,NULL,0,0,0,0,0,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2025-11-28 23:08:35','2025-11-29 05:08:35',1,NULL,NULL,NULL,NULL,0,NULL,1,NULL,NULL,NULL),(2,'https://homeproz.dev.hanson.xyz/properties/','43:fe19fb00353a16a1e0f990a64c3584a1',NULL,'post-type-archive','property',NULL,NULL,'Properties For Sale %%page%% %%sep%% %%sitename%%','Browse all properties for sale in Albert Lea, Minnesota and surrounding areas. Find your dream home with HomeProz Real Estate.','Properties',NULL,1,0,NULL,NULL,NULL,NULL,NULL,NULL,0,0,0,0,0,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2025-11-28 23:08:35','2025-11-29 05:08:35',1,NULL,NULL,NULL,NULL,0,NULL,2,'2025-11-28 23:08:35','2025-11-28 22:33:26',NULL),(3,'https://homeproz.dev.hanson.xyz/','32:69cc765724b94f94108e52a02a04fa6f',NULL,'home-page',NULL,NULL,NULL,'HomeProz Real Estate | Albert Lea MN Properties','HomeProz Real Estate - Your trusted partner for buying and selling homes in Albert Lea, Minnesota and surrounding areas.','Home',NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,0,0,0,0,0,0,NULL,NULL,NULL,NULL,NULL,'%%sitename%%','','','0',NULL,NULL,NULL,NULL,NULL,'2025-11-28 23:08:35','2025-11-29 05:08:35',1,NULL,NULL,NULL,NULL,0,NULL,2,'2025-11-28 23:08:35','2025-11-28 21:02:25',NULL),(4,'https://homeproz.dev.hanson.xyz/','32:69cc765724b94f94108e52a02a04fa6f',10,'post','page',0,0,NULL,NULL,'Home','publish',NULL,0,NULL,NULL,NULL,NULL,NULL,0,0,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2025-11-28 23:18:48','2025-11-29 05:18:48',1,NULL,NULL,NULL,NULL,0,NULL,2,'2025-11-28 22:57:59','2025-11-28 22:57:59',0); /*!40000 ALTER TABLE `wp_yoast_indexable` ENABLE KEYS */; UNLOCK TABLES; @@ -504,6 +759,7 @@ CREATE TABLE `wp_yoast_indexable_hierarchy` ( LOCK TABLES `wp_yoast_indexable_hierarchy` WRITE; /*!40000 ALTER TABLE `wp_yoast_indexable_hierarchy` DISABLE KEYS */; +INSERT INTO `wp_yoast_indexable_hierarchy` VALUES (4,0,0,1); /*!40000 ALTER TABLE `wp_yoast_indexable_hierarchy` ENABLE KEYS */; UNLOCK TABLES; @@ -606,4 +862,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025-11-28 17:16:24 +-- Dump completed on 2025-11-28 17:19:54 diff --git a/wp-content/aiowps_backups/index.html b/wp-content/aiowps_backups/index.html new file mode 100644 index 00000000..e69de29b diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/SECURITY.md b/wp-content/plugins/all-in-one-wp-security-and-firewall/SECURITY.md new file mode 100755 index 00000000..1a912378 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/SECURITY.md @@ -0,0 +1,19 @@ +If you believe that you have found a security issue associated with the current release of this plugin, then please report it to the email address with local part security-reports-only and the domain updraftplus.com. If receipt of the email is not acknowledged within 3 working days, then you can try again and also use the inquiry form on the plugin's website. + +Do not send emails on any other subject to this address. They will not be acknowledged, regardless of whether they contain pleas to do otherwise; there are inquiry forms and support forums available which are linked within the plugin and easy to find on the plugin website. + +Please include as much of the information listed below as you can to help us better understand and resolve the issue: + +* The type of issue (e.g., buffer overflow, SQL injection, or cross-site scripting) +* Affected version(s) +* Impact of the issue, including how an attacker might exploit the issue +* Step-by-step instructions to reproduce the issue +* The location of the affected code +* Full paths of source file(s) related to the manifestation of the issue +* Any special configuration required to reproduce the issue +* Any log files that are related to this issue (if possible) +* Proof-of-concept or exploit code (if possible) + +This information will help us triage your report more quickly. + +Thank you! \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/general/wp-security-ajax-data-table.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/general/wp-security-ajax-data-table.php new file mode 100755 index 00000000..efd8d1f4 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/general/wp-security-ajax-data-table.php @@ -0,0 +1,1486 @@ +get_column_info(). + * + * @since 4.1.0 + * @var array + */ + protected $_column_headers; + + /** + * {@internal Missing Summary} + * + * @var array + */ + protected $compat_fields = array('_args', '_pagination_args', 'screen', '_actions', '_pagination'); + + /** + * {@internal Missing Summary} + * + * @var array + */ + protected $compat_methods = array( + 'set_pagination_args', + 'get_views', + 'get_bulk_actions', + 'bulk_actions', + 'row_actions', + 'months_dropdown', + 'view_switcher', + 'comments_bubble', + 'get_items_per_page', + 'pagination', + 'get_sortable_columns', + 'get_column_info', + 'get_table_classes', + 'display_tablenav', + 'extra_tablenav', + 'single_row_columns', + ); + + /** + * Constructor. + * + * The child class should call this constructor from its own constructor to override + * the default $args. + * + * @since 3.1.0 + * + * @param array|string $args { + * Array or string of arguments. + * + * @type string $plural Plural value used for labels and the objects being listed. + * This affects things such as CSS class-names and nonces used + * in the list table, e.g. 'posts'. Default empty. + * @type string $singular Singular label for an object being listed, e.g. 'post'. + * Default empty + * @type bool $ajax Whether the list table supports Ajax. This includes loading + * and sorting data, for example. If true, the class will call + * the js_vars() method in the footer to provide variables + * to any scripts handling Ajax events. Default false. + * @type string $screen String containing the hook name used to determine the current + * screen. If left null, the current screen will be automatically set. + * Default null. + * } + */ + public function __construct($args = array()) { + $args = wp_parse_args( + $args, + array( + 'plural' => '', + 'singular' => '', + 'ajax' => false, + 'screen' => null, + ) + ); + + $this->screen = convert_to_screen($args['screen']); + + add_filter("manage_{$this->screen->id}_columns", array($this, 'get_columns'), 0); + + if (!$args['plural']) { + $args['plural'] = $this->screen->base; + } + + $args['plural'] = sanitize_key($args['plural']); + $args['singular'] = sanitize_key($args['singular']); + + $this->_args = $args; + + if ($args['ajax']) { + // wp_enqueue_script('list-table'); + add_action('admin_footer', array($this, 'js_vars')); + } + + if (empty($this->modes)) { + $this->modes = array( + 'list' => __('List view', 'all-in-one-wp-security-and-firewall'), + 'excerpt' => __('Excerpt view', 'all-in-one-wp-security-and-firewall'), + ); + } + } + + /** + * Make private properties readable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name - Property to get. + * @return mixed Property. + */ + public function __get($name) { + if (in_array($name, $this->compat_fields)) { + return $this->$name; + } + } + + /** + * Make private properties settable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name - Property to check if set. + * @param mixed $value - Property value. + * @return mixed Newly-set property. + */ + public function __set($name, $value) { + if (in_array($name, $this->compat_fields)) { + return $this->$name = $value; + } + } + + /** + * Make private properties checkable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name - Property to check if set. + * @return bool Whether the property is set. + */ + public function __isset($name) { + if (in_array($name, $this->compat_fields)) { + return isset($this->$name); + } + } + + /** + * Make private properties un-settable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name - Property to unset. + */ + public function __unset($name) { + if (in_array($name, $this->compat_fields)) { + unset($this->$name); + } + } + + /** + * Make private/protected methods readable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name - Method to call. + * @param array $arguments - Arguments to pass when calling. + * @return mixed|bool Return value of the callback, false otherwise. + */ + public function __call($name, $arguments) { + if (in_array($name, $this->compat_methods)) { + return call_user_func_array(array($this, $name), $arguments); + } + return false; + } + + /** + * Checks the current user's permissions + * + * @since 3.1.0 + * @abstract + */ + public function ajax_user_can() { + die('function AIOWPSecurity_List_Table::ajax_user_can() must be over-ridden in a sub-class.'); + } + + /** + * Prepares the list of items for displaying. + * + * @uses AIOWPSecurity_List_Table::set_pagination_args() + * + * @since 3.1.0 + * @abstract + */ + public function prepare_items() { + die('function AIOWPSecurity_List_Table::prepare_items() must be over-ridden in a sub-class.'); + } + + /** + * An internal method that sets all the necessary pagination arguments + * + * @since 3.1.0 + * + * @param array|string $args - Array or string of arguments with information about the pagination. + */ + protected function set_pagination_args($args) { + $args = wp_parse_args( + $args, + array( + 'total_items' => 0, + 'total_pages' => 0, + 'per_page' => 0, + ) + ); + + if (!$args['total_pages'] && $args['per_page'] > 0) { + $args['total_pages'] = ceil($args['total_items'] / $args['per_page']); + } + + // Redirect if page number is invalid and headers are not already sent. + if (!headers_sent() && !wp_doing_ajax() && $args['total_pages'] > 0 && $this->get_pagenum() > $args['total_pages']) { + wp_redirect(add_query_arg('paged', $args['total_pages'])); + exit; + } + + $this->_pagination_args = $args; + } + + /** + * Access the pagination args. + * + * @since 3.1.0 + * + * @param string $key - Pagination argument to retrieve. Common values include 'total_items', + * 'total_pages', 'per_page', or 'infinite_scroll'. + * @return int Number of items that correspond to the given pagination argument. + */ + public function get_pagination_arg($key) { + if ('page' === $key) { + return $this->get_pagenum(); + } + + if (isset($this->_pagination_args[$key])) { + return $this->_pagination_args[$key]; + } + } + + /** + * Whether the table has items to display or not + * + * @since 3.1.0 + * + * @return bool + */ + public function has_items() { + return !empty($this->items); + } + + /** + * Message to be displayed when there are no items + * + * @since 3.1.0 + */ + public function no_items() { + esc_html_e('No items found.', 'all-in-one-wp-security-and-firewall'); + } + + /** + * Displays the search box. + * + * @since 3.1.0 + * + * @param string $text - The 'submit' button label. + * @param string $input_id - ID attribute value for the search input field. + */ + public function search_box($text, $input_id) { + if (empty($this->_args['data']['s']) && !$this->has_items()) { + return; + } + + $input_id = $input_id . '-search-input'; + + if (!empty($this->_args['data']['orderby'])) { + echo ''; + } + if (!empty($this->_args['data']['order'])) { + echo ''; + } + if (!empty($this->_args['data']['post_mime_type'])) { + echo ''; + } + if (!empty($this->_args['data']['detached'])) { + echo ''; + } + ?> + + link) with the list + * of views available on this table. + * + * @since 3.1.0 + * + * @return array + */ + protected function get_views() { + return array(); + } + + /** + * Display the list of views available on this table. + * + * @since 3.1.0 + */ + public function views() { + $views = $this->get_views(); + /** + * Filters the list of available list table views. + * + * The dynamic portion of the hook name, `$this->screen->id`, refers + * to the ID of the current screen, usually a string. + * + * @since 3.5.0 + * + * @param string[] - $views An array of available list table views. + */ + $views = apply_filters("views_{$this->screen->id}", $views); + + if (empty($views)) { + return; + } + + $this->screen->render_screen_reader_content('heading_views'); + + echo "'; + } + + /** + * Get an associative array (option_name => option_title) with the list + * of bulk actions available on this table. + * + * @since 3.1.0 + * + * @return array + */ + protected function get_bulk_actions() { + return array(); + } + + /** + * Display the bulk actions dropdown. + * + * @since 3.1.0 + * + * @param string $which - The location of the bulk actions: 'top' or 'bottom'. + * This is designated as optional for backward compatibility. + */ + protected function bulk_actions($which = '') { + if (is_null($this->_actions)) { + $this->_actions = $this->get_bulk_actions(); + /** + * Filters the list table Bulk Actions drop-down. + * + * The dynamic portion of the hook name, `$this->screen->id`, refers + * to the ID of the current screen, usually a string. + * + * This filter can currently only be used to remove bulk actions. + * + * @since 3.5.0 + * + * @param string[] $actions - An array of the available bulk actions. + */ + $this->_actions = apply_filters("bulk_actions-{$this->screen->id}", $this->_actions); + $two = ''; + } else { + $two = '2'; + } + + if (empty($this->_actions)) { + return; + } + + echo ''; + echo '\n"; + + $submit_attributes = array('id' => "doaction$two"); + + if ('top' == $which) { + $submit_attributes['onclick'] = "return confirm('".esc_js(__('Are you sure you want to perform this bulk action?', 'all-in-one-wp-security-and-firewall'))."')"; + } + + submit_button(__('Apply', 'all-in-one-wp-security-and-firewall'), 'action', '', false, $submit_attributes); + echo "\n"; + } + + /** + * Get the current action selected from the bulk actions dropdown. + * + * @since 3.1.0 + * + * @return string|false The action name or False if no action was selected + */ + public function current_action() { + if (isset($this->_args['data']['filter_action']) && !empty($this->_args['data']['filter_action'])) { + return false; + } + + if (isset($this->_args['data']['action']) && -1 != $this->_args['data']['action']) { + return $this->_args['data']['action']; + } + + if (isset($this->_args['data']['action2']) && -1 != $this->_args['data']['action2']) { + return $this->_args['data']['action2']; + } + + return false; + } + + /** + * Generate row actions div + * + * @since 3.1.0 + * + * @param string[] $actions - An array of action links. + * @param bool $always_visible - Whether the actions should be always visible. + * @return string + */ + protected function row_actions($actions, $always_visible = false) { + $action_count = count($actions); + $i = 0; + + if (!$action_count) { + return ''; + } + + $out = '
'; + foreach ($actions as $action => $link) { + ++$i; + ($i == $action_count) ? $sep = '' : $sep = ' | '; + $out .= "$link$sep"; + } + $out .= '
'; + + $out .= ''; + + return $out; + } + + /** + * Display a monthly dropdown for filtering items + * + * @since 3.1.0 + * + * @global wpdb $wpdb + * @global WP_Locale $wp_locale + * + * @param string $post_type + */ + protected function months_dropdown($post_type) { + global $wpdb, $wp_locale; + + /** + * Filters whether to remove the 'Months' drop-down from the post list table. + * + * @since 4.2.0 + * + * @param bool $disable - Whether to disable the drop-down. Default false. + * @param string $post_type - The post type. + */ + if (apply_filters('disable_months_dropdown', false, $post_type)) { + return; + } + + $extra_checks = "AND post_status != 'auto-draft'"; + if (!isset($this->_args['data']['post_status']) || 'trash' !== $this->_args['data']['post_status']) { + $extra_checks .= " AND post_status != 'trash'"; + } elseif (isset($this->_args['data']['post_status'])) { + $extra_checks = $wpdb->prepare(' AND post_status = %s', $this->_args['data']['post_status']); + } + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- The $extra_checks variable, although prepared above, cannot be added to the prepare args in this statement. + $months = $wpdb->get_results($wpdb->prepare("SELECT DISTINCT YEAR(post_date) AS year, MONTH(post_date) AS month FROM $wpdb->posts WHERE post_type = %s $extra_checks ORDER BY post_date DESC", $post_type)); + + /** + * Filters the 'Months' drop-down results. + * + * @since 3.7.0 + * + * @param object $months The months drop-down query results. + * @param string $post_type The post type. + */ + $months = apply_filters('months_dropdown_results', $months, $post_type); + + $month_count = count($months); + + if (!$month_count || (1 == $month_count && 0 == $months[0]->month)) { + return; + } + + $m = isset($this->_args['data']['m']) ? (int) $this->_args['data']['m'] : 0; + ?> + + + + +
+ modes as $mode => $title) { + $classes = array('view-' . $mode); + if ($current_mode === $mode) { + $classes[] = 'current'; + } + printf("%s\n", + esc_url(add_query_arg('mode', $mode)), + implode(' ', array_map('esc_attr', $classes)), + esc_html($title) + ); + } + ?> +
+ %s', esc_html__('No comments', 'all-in-one-wp-security-and-firewall')); + // Approved comments have different display depending on some conditions. + } elseif ($approved_comments) { + printf('%s', + esc_url( + add_query_arg( + array( + 'p' => $post_id, + 'comment_status' => 'approved', + ), + admin_url('edit-comments.php') + ) + ), + esc_html($approved_comments_number), + $pending_comments ? esc_html($approved_phrase) : esc_html($approved_only_phrase) + ); + } else { + printf( + '%s', + esc_html($approved_comments_number), + $pending_comments ? esc_html__('No approved comments', 'all-in-one-wp-security-and-firewall') : esc_html__('No comments', 'all-in-one-wp-security-and-firewall') + ); + } + + if ($pending_comments) { + printf( + '%s', + esc_url( + add_query_arg( + array( + 'p' => $post_id, + 'comment_status' => 'moderated', + ), + admin_url('edit-comments.php') + ) + ), + esc_html($pending_comments_number), + esc_html($pending_phrase) + ); + } else { + printf( + '%s', + esc_html($pending_comments_number), + $approved_comments ? esc_html__('No pending comments', 'all-in-one-wp-security-and-firewall') : esc_html__('No comments', 'all-in-one-wp-security-and-firewall') + ); + } + } + + /** + * Get the current page number + * + * @since 3.1.0 + * + * @return int + */ + public function get_pagenum() { + $pagenum = isset($this->_args['data']['paged']) ? absint($this->_args['data']['paged']) : 0; + + if (isset($this->_pagination_args['total_pages']) && $pagenum > $this->_pagination_args['total_pages']) { + $pagenum = $this->_pagination_args['total_pages']; + } + + return max(1, $pagenum); + } + + /** + * Get number of items to display on a single page + * + * @since 3.1.0 + * + * @param string $option + * @param int $default + * @return int + */ + protected function get_items_per_page($option, $default = 20) { + $per_page = (int) get_user_option($option); + if (empty($per_page) || $per_page < 1) { + $per_page = $default; + } + + /** + * Filters the number of items to be displayed on each page of the list table. + * + * The dynamic hook name, $option, refers to the `per_page` option depending + * on the type of list table in use. Possible values include: 'edit_comments_per_page', + * 'sites_network_per_page', 'site_themes_network_per_page', 'themes_network_per_page', + * 'users_network_per_page', 'edit_post_per_page', 'edit_page_per_page', + * 'edit_{$post_type}_per_page', etc. + * + * @since 2.9.0 + * + * @param int $per_page - Number of items to be displayed. Default 20. + */ + return (int) apply_filters("{$option}", $per_page); + } + + + + /** + * Display the pagination. + * + * @since 3.1.0 + * + * @param string $which + */ + protected function pagination($which) { + if (empty($this->_pagination_args)) { + return; + } + + $total_items = $this->_pagination_args['total_items']; + $total_pages = $this->_pagination_args['total_pages']; + $infinite_scroll = false; + if (isset($this->_pagination_args['infinite_scroll'])) { + $infinite_scroll = $this->_pagination_args['infinite_scroll']; + } + + if ('top' === $which && $total_pages > 1) { + $this->screen->render_screen_reader_content('heading_pagination'); + } + + /* translators: %s: Total items */ + $output = '' . sprintf(_n('%s item', '%s items', esc_html($total_items), 'all-in-one-wp-security-and-firewall'), number_format_i18n($total_items)) . ''; + + $current = $this->get_pagenum(); + + $removable_query_args = wp_removable_query_args(); + + $host = isset($_SERVER['HTTP_HOST']) ? sanitize_text_field(wp_unslash($_SERVER['HTTP_HOST'])) : ''; + $request = isset($_SERVER['REQUEST_URI']) ? sanitize_text_field(wp_unslash($_SERVER['REQUEST_URI'])) : ''; + $current_url = set_url_scheme('http://' . $host . $request); + + $current_url = remove_query_arg($removable_query_args, $current_url); + + $page_links = array(); + + $total_pages_before = ''; + $total_pages_after = ''; + + $disable_first = $disable_last = $disable_prev = $disable_next = false; + + if (1 == $current) { + $disable_first = true; + $disable_prev = true; + } + if (2 == $current) { + $disable_first = true; + } + if ($current == $total_pages) { + $disable_last = true; + $disable_next = true; + } + if ($current == $total_pages - 1) { + $disable_last = true; + } + + if ($disable_first) { + $page_links[] = ''; + } else { + $page_links[] = sprintf( + "%s", + esc_url(remove_query_arg('paged', $current_url)), + esc_html__('First page', 'all-in-one-wp-security-and-firewall'), + '«' + ); + } + + if ($disable_prev) { + $page_links[] = ''; + } else { + $page_links[] = sprintf( + "%s", + esc_url(add_query_arg('paged', max(1, $current - 1), $current_url)), + esc_html__('Previous page', 'all-in-one-wp-security-and-firewall'), + '‹' + ); + } + + if ('bottom' === $which) { + $html_current_page = $current; + $total_pages_before = '' . __('Current page', 'all-in-one-wp-security-and-firewall') . ''; + } else { + $html_current_page = sprintf( + "%s", + '', + $current, + strlen($total_pages) + ); + } + $html_total_pages = sprintf("%s", number_format_i18n($total_pages)); + /* translators: 1: Current page, 2: Total pages */ + $page_links[] = $total_pages_before . sprintf(esc_html_x('%1$s of %2$s', 'paging', 'all-in-one-wp-security-and-firewall'), $html_current_page, $html_total_pages) . $total_pages_after; + + if ($disable_next) { + $page_links[] = ''; + } else { + $page_links[] = sprintf( + "%s", + esc_url(add_query_arg('paged', min($total_pages, $current + 1), $current_url)), + esc_html__('Next page', 'all-in-one-wp-security-and-firewall'), + '›' + ); + } + + if ($disable_last) { + $page_links[] = ''; + } else { + $page_links[] = sprintf( + "%s", + esc_url(add_query_arg('paged', $total_pages, $current_url)), + esc_html__('Last page', 'all-in-one-wp-security-and-firewall'), + '»' + ); + } + + $pagination_links_class = 'pagination-links'; + if (!empty($infinite_scroll)) { + $pagination_links_class .= ' hide-if-js'; + } + $output .= "\n" . join("\n", $page_links) . ''; + + if ($total_pages) { + $page_class = $total_pages < 2 ? ' one-page' : ''; + } else { + $page_class = ' no-pages'; + } + $this->_pagination = "
" . $output . "
"; + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Necessary escaping done above. + echo $this->_pagination; + } + + /** + * Get a list of columns. The format is: + * 'internal-name' => 'Title' + * + * @since 3.1.0 + * @abstract + * + * @return array + */ + public function get_columns() { + die('function AIOWPSecurity_List_Table::get_columns() must be over-ridden in a sub-class.'); + } + + /** + * Get a list of sortable columns. The format is: + * 'internal-name' => 'orderby' + * or + * 'internal-name' => array('orderby', true) + * + * The second format will make the initial sorting order be descending + * + * @since 3.1.0 + * + * @return array + */ + protected function get_sortable_columns() { + return array(); + } + + /** + * Gets the name of the default primary column. + * + * @since 4.3.0 + * + * @return string Name of the default primary column, in this case, an empty string. + */ + protected function get_default_primary_column_name() { + $columns = $this->get_columns(); + $column = ''; + + if (empty($columns)) { + return $column; + } + + // We need a primary defined so responsive views show something, + // so let's fall back to the first non-checkbox column. + foreach ($columns as $col => $column_name) { + if ('cb' === $col) { + continue; + } + + $column = $col; + break; + } + + return $column; + } + + /** + * Public wrapper for AIOWPSecurity_List_Table::get_default_primary_column_name(). + * + * @since 4.4.0 + * + * @return string Name of the default primary column. + */ + public function get_primary_column() { + return $this->get_primary_column_name(); + } + + /** + * Gets the name of the primary column. + * + * @since 4.3.0 + * + * @return string The name of the primary column. + */ + protected function get_primary_column_name() { + $columns = get_column_headers($this->screen); + $default = $this->get_default_primary_column_name(); + + // If the primary column doesn't exist fall back to the + // first non-checkbox column. + if (!isset($columns[$default])) { + $default = AIOWPSecurity_Ajax_Data_Table::get_default_primary_column_name(); + } + + /** + * Filters the name of the primary column for the current list table. + * + * @since 4.3.0 + * + * @param string $default Column name default for the specific list table, e.g. 'name'. + * @param string $context Screen ID for specific list table, e.g. 'plugins'. + */ + $column = apply_filters('list_table_primary_column', $default, $this->screen->id); + + if (empty($column) || !isset($columns[$column])) { + $column = $default; + } + + return $column; + } + + /** + * Get a list of all, hidden and sortable columns, with filter applied + * + * @since 3.1.0 + * + * @return array + */ + protected function get_column_info() { + // $_column_headers is already set / cached + if (isset($this->_column_headers) && is_array($this->_column_headers)) { + // Back-compat for list tables that have been manually setting $_column_headers for horse reasons. + // In 4.3, we added a fourth argument for primary column. + $column_headers = array(array(), array(), array(), $this->get_primary_column_name()); + foreach ($this->_column_headers as $key => $value) { + $column_headers[$key] = $value; + } + + return $column_headers; + } + + $columns = get_column_headers($this->screen); + $hidden = get_hidden_columns($this->screen); + + $sortable_columns = $this->get_sortable_columns(); + /** + * Filters the list table sortable columns for a specific screen. + * + * The dynamic portion of the hook name, `$this->screen->id`, refers + * to the ID of the current screen, usually a string. + * + * @since 3.5.0 + * + * @param array $sortable_columns - An array of sortable columns. + */ + $_sortable = apply_filters("manage_{$this->screen->id}_sortable_columns", $sortable_columns); + + $sortable = array(); + foreach ($_sortable as $id => $data) { + if (empty($data)) { + continue; + } + + $data = (array) $data; + if (!isset($data[1])) { + $data[1] = false; + } + + $sortable[$id] = $data; + } + + $primary = $this->get_primary_column_name(); + $this->_column_headers = array($columns, $hidden, $sortable, $primary); + + return $this->_column_headers; + } + + /** + * Return number of visible columns + * + * @since 3.1.0 + * + * @return int + */ + public function get_column_count() { + list ($columns, $hidden) = $this->get_column_info(); + $hidden = array_intersect(array_keys($columns), array_filter($hidden)); + return count($columns) - count($hidden); + } + + /** + * Print column headers, accounting for hidden and sortable columns. + * + * @since 3.1.0 + * + * @staticvar int $cb_counter + * + * @param bool $with_id - Whether to set the id attribute or not + */ + public function print_column_headers($with_id = true) { + list($columns, $hidden, $sortable, $primary) = $this->get_column_info(); + + $host = isset($_SERVER['HTTP_HOST']) ? sanitize_text_field(wp_unslash($_SERVER['HTTP_HOST'])) : ''; + $request = isset($_SERVER['REQUEST_URI']) ? sanitize_text_field(wp_unslash($_SERVER['REQUEST_URI'])) : ''; + $current_url = set_url_scheme('http://' . $host . $request); + $current_url = remove_query_arg('paged', $current_url); + + if (isset($this->_args['data']['orderby'])) { + $current_orderby = $this->_args['data']['orderby']; + } else { + $current_orderby = ''; + } + + if (isset($this->_args['data']['order']) && 'desc' === $this->_args['data']['order']) { + $current_order = 'desc'; + } else { + $current_order = 'asc'; + } + + if (!empty($columns['cb'])) { + static $cb_counter = 1; + $columns['cb'] = '' + . ''; + $cb_counter++; + } + + foreach ($columns as $column_key => $column_display_name) { + $class = array('manage-column', "column-$column_key"); + + if (in_array($column_key, $hidden)) { + $class[] = 'hidden'; + } + + if ('cb' === $column_key) { + $class[] = 'check-column'; + } elseif (in_array($column_key, array('posts', 'comments', 'links'))) { + $class[] = 'num'; + } + + if ($column_key === $primary) { + $class[] = 'column-primary'; + } + + if (isset($sortable[$column_key])) { + list($orderby, $desc_first) = $sortable[$column_key]; + + if ($current_orderby === $orderby) { + $order = 'asc' === $current_order ? 'desc' : 'asc'; + $class[] = 'sorted'; + $class[] = $current_order; + } else { + $order = $desc_first ? 'desc' : 'asc'; + $class[] = 'sortable'; + $class[] = $desc_first ? 'asc' : 'desc'; + } + + $column_display_name = '' . $column_display_name . ''; + } + + $tag = ('cb' === $column_key) ? 'td' : 'th'; + $scope = ('th' === $tag) ? 'scope="col"' : ''; + $id = $with_id ? "id='$column_key'" : ''; + + if (!empty($class)) { + $class = "class='" . join(' ', $class) . "'"; + } + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Escaped earlier in other functions. + echo "<$tag $scope $id $class>$column_display_name"; + } + } + + /** + * Display the table + * + * @since 3.1.0 + */ + public function display() { + $singular = $this->_args['singular']; + + $this->display_tablenav('top'); + + $this->screen->render_screen_reader_content('heading_list'); + ?> + + + + print_column_headers(); ?> + + + + + > + display_rows_or_placeholder(); ?> + + + + + print_column_headers(false); ?> + + + +
+ display_tablenav('bottom'); + } + + /** + * Get a list of CSS classes for the AIOWPSecurity_List_Table table tag. + * + * @since 3.1.0 + * + * @return array List of CSS classes for the table tag. + */ + protected function get_table_classes() { + return array('widefat', 'fixed', 'striped', $this->_args['plural']); + } + + /** + * Generate the table navigation above or below the table + * + * @since 3.1.0 + * @param string $which + */ + protected function display_tablenav($which) { + if ('top' === $which) { + wp_nonce_field('bulk-' . $this->_args['plural']); + } + ?> +
+ + has_items()) : ?> +
+ bulk_actions($which); ?> +
+ extra_tablenav($which); + $this->pagination($which); + ?> + +
+
+ has_items()) { + $this->display_rows(); + } else { + echo ''; + $this->no_items(); + echo ''; + } + } + + /** + * Generate the table rows + * + * @since 3.1.0 + */ + public function display_rows() { + foreach ($this->items as $item) { + $this->single_row($item); + } + } + + /** + * Generates content for a single row of the table + * + * @since 3.1.0 + * + * @param object $item The current item + */ + public function single_row($item) { + echo ''; + $this->single_row_columns($item); + echo ''; + } + + /** + * This function renders a default column item + * + * @param array $item - Item object + * @param string $column_name - Column name to be rendered from item object + */ + protected function column_default($item, $column_name) {} // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable, Squiz.WhiteSpace.ScopeClosingBrace.ContentBefore, PEAR.WhiteSpace.ScopeClosingBrace.Line -- this is a protected function + + /** + * This function renders the checkbox column + * + * @param array $item - item object + */ + protected function column_cb($item) {} // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable, Squiz.WhiteSpace.ScopeClosingBrace.ContentBefore, PEAR.WhiteSpace.ScopeClosingBrace.Line -- this is a protected function + + + /** + * Generates the columns for a single row of the table + * + * @since 3.1.0 + * + * @param object $item - The current item + * + * removed $sortable as it was unused from list() call + */ + protected function single_row_columns($item) { + list($columns, $hidden, $sortable, $primary) = $this->get_column_info(); // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- Unused parameters are for future use. + + foreach ($columns as $column_name => $column_display_name) { + $classes = "$column_name column-$column_name"; + if ($primary === $column_name) { + $classes .= ' has-row-actions column-primary'; + } + + if (in_array($column_name, $hidden)) { + $classes .= ' hidden'; + } + + // Comments column uses HTML in the display name with screen reader text. + // Instead of using esc_attr(), we strip tags to get closer to a user-friendly string. + $data = 'data-colname="' . wp_strip_all_tags($column_display_name) . '"'; + + $attributes = "class='$classes' $data"; + if ('cb' === $column_name) { + echo ''; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP Error. Escaped earlier in other functions. + echo $this->column_cb($item); + echo ''; + } elseif (method_exists($this, '_column_' . $column_name)) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP Error. Escaped earlier in other functions. + echo call_user_func( + array($this, '_column_' . $column_name), + $item, + $classes, + $data, + $primary + ); + } elseif (method_exists($this, 'column_' . $column_name)) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP Error. Escaped earlier in other functions. + echo ""; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP Error. Escaped earlier in other functions. + echo call_user_func(array($this, 'column_' . $column_name), $item); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP Error. Escaped earlier in other functions. + echo $this->handle_row_actions($item, $column_name, $primary); + echo ''; + } else { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP Error. Escaped earlier in other functions. + echo ""; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP Error. Escaped earlier in other functions. + echo $this->column_default($item, $column_name); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP Error. Escaped earlier in other functions. + echo $this->handle_row_actions($item, $column_name, $primary); + echo ''; + } + } + } + + /** + * Generates and display row actions links for the list table. + * + * @since 4.3.0 + * + * @param object $item - The item being acted upon. + * @param string $column_name - Current column name. + * @param string $primary - Primary column name. + * @return string The row actions HTML, or an empty string if the current column is the primary column. + */ + protected function handle_row_actions($item, $column_name, $primary) { + return $column_name === $primary ? '' : ''; + } + + + /** + * Handle an incoming ajax request (called from admin-ajax.php) + * + * @param bool $return_instead_of_echo - Whether to return data or die() with data. + * + * @since 3.1.0 + */ + public function ajax_response($return_instead_of_echo = false) { + $this->prepare_items(false); + + ob_start(); + if (!empty($this->_args['data']['no_placeholder'])) { + $this->display_rows(); + } else { + $this->display_rows_or_placeholder(); + } + + $rows = ob_get_clean(); + + ob_start(); + $this->print_column_headers(true); + $headers = ob_get_clean(); + + ob_start(); + $this->pagination('top'); + $pagination_top = ob_get_clean(); + + ob_start(); + $this->pagination('bottom'); + $pagination_bottom = ob_get_clean(); + + $response = array( + 'rows' => $rows, + 'pagination' => array( + 'top' => $pagination_top, + 'bottom' => $pagination_bottom, + ), + 'column_headers' => $headers, + ); + + if (isset($this->_pagination_args['total_items'])) { + $response['total_items_i18n'] = sprintf( + /* translators: %s: Total items */ + _n('%s item', '%s items', $this->_pagination_args['total_items'], 'all-in-one-wp-security-and-firewall'), + number_format_i18n($this->_pagination_args['total_items']) + ); + } + if (isset($this->_pagination_args['total_pages'])) { + $response['total_pages'] = $this->_pagination_args['total_pages']; + $response['total_pages_i18n'] = number_format_i18n($this->_pagination_args['total_pages']); + } + + // Get the message from the helper + $list_message = AIOS_Helper::get_message('aios_list_message'); + if ($list_message) { + $response['message'] = $list_message['message']; + $response['status'] = $list_message['type']; + } + + if ($return_instead_of_echo) { + return $response; + } + + die(wp_json_encode($response)); + } + + /** + * Send required variables to JavaScript land + */ + public function js_vars() { + $args = array( + 'class' => get_class($this), + 'screen' => array( + 'id' => $this->screen->id, + 'base' => $this->screen->base, + ), + ); + + printf("\n", wp_json_encode($args)); + } + + /** + * Retrieves and returns current WP general settings date time format. + * + * @return String + */ + protected function get_wp_date_time_format() { + static $wp_date_time_format; + + if (!isset($wp_date_time_format)) { + $wp_date_time_format = get_option('date_format').' '.get_option('time_format'); + } + + return $wp_date_time_format; + } +} \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/general/wp-security-list-table.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/general/wp-security-list-table.php new file mode 100755 index 00000000..c3e5013c --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/general/wp-security-list-table.php @@ -0,0 +1,1451 @@ +get_column_info(). + * + * @since 4.1.0 + * @var array + */ + protected $_column_headers; + + /** + * {@internal Missing Summary} + * + * @var array + */ + protected $compat_fields = array('_args', '_pagination_args', 'screen', '_actions', '_pagination'); + + /** + * {@internal Missing Summary} + * + * @var array + */ + protected $compat_methods = array( + 'set_pagination_args', + 'get_views', + 'get_bulk_actions', + 'bulk_actions', + 'row_actions', + 'months_dropdown', + 'view_switcher', + 'comments_bubble', + 'get_items_per_page', + 'pagination', + 'get_sortable_columns', + 'get_column_info', + 'get_table_classes', + 'display_tablenav', + 'extra_tablenav', + 'single_row_columns', + ); + + /** + * Constructor. + * + * The child class should call this constructor from its own constructor to override + * the default $args. + * + * @since 3.1.0 + * + * @param array|string $args { + * + * @type string $plural Plural value used for labels and the objects being listed. + * This affects things such as CSS class-names and nonces used + * in the list table, e.g. 'posts'. Default empty. + * @type string $singular Singular label for an object being listed, e.g. 'post'. + * Default empty + * @type bool $ajax Whether the list table supports Ajax. This includes loading + * and sorting data, for example. If true, the class will call + * the js_vars() method in the footer to provide variables + * to any scripts handling Ajax events. Default false. + * @type string $screen String containing the hook name used to determine the current + * screen. If left null, the current screen will be automatically set. + * Default null. + * } + */ + public function __construct($args = array()) { + $args = wp_parse_args( + $args, + array( + 'plural' => '', + 'singular' => '', + 'ajax' => false, + 'screen' => null, + ) + ); + + $this->screen = convert_to_screen($args['screen']); + + add_filter("manage_{$this->screen->id}_columns", array($this, 'get_columns'), 0); + + if (!$args['plural']) { + $args['plural'] = $this->screen->base; + } + + $args['plural'] = sanitize_key($args['plural']); + $args['singular'] = sanitize_key($args['singular']); + + $this->_args = $args; + + if ($args['ajax']) { + // wp_enqueue_script('list-table'); + add_action('admin_footer', array($this, 'js_vars')); + } + + if (empty($this->modes)) { + $this->modes = array( + 'list' => __('List view', 'all-in-one-wp-security-and-firewall'), + 'excerpt' => __('Excerpt view', 'all-in-one-wp-security-and-firewall'), + ); + } + } + + /** + * Make private properties readable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to get. + * @return mixed|void Property. + */ + public function __get($name) { + if (in_array($name, $this->compat_fields)) { + return $this->$name; + } + } + + /** + * Make private properties settable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to check if set. + * @param mixed $value Property value. + * @return mixed Newly-set property. + */ + public function __set($name, $value) { + if (in_array($name, $this->compat_fields)) { + return $this->$name = $value; + } + } + + /** + * Make private properties checkable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to check if set. + * @return bool Whether the property is set. + */ + public function __isset($name) { + if (in_array($name, $this->compat_fields)) { + return isset($this->$name); + } + } + + /** + * Make private properties un-settable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to unset. + */ + public function __unset($name) { + if (in_array($name, $this->compat_fields)) { + unset($this->$name); + } + } + + /** + * Make private/protected methods readable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Method to call. + * @param array $arguments Arguments to pass when calling. + * @return mixed|bool Return value of the callback, false otherwise. + */ + public function __call($name, $arguments) { + if (in_array($name, $this->compat_methods)) { + return call_user_func_array(array($this, $name), $arguments); + } + return false; + } + + /** + * Checks the current user's permissions + * + * @since 3.1.0 + * @abstract + */ + public function ajax_user_can() { + die('function AIOWPSecurity_List_Table::ajax_user_can() must be over-ridden in a sub-class.'); + } + + /** + * Prepares the list of items for displaying. + * + * @uses AIOWPSecurity_List_Table::set_pagination_args() + * + * @since 3.1.0 + * @abstract + */ + public function prepare_items() { + die('function AIOWPSecurity_List_Table::prepare_items() must be over-ridden in a sub-class.'); + } + + /** + * An internal method that sets all the necessary pagination arguments + * + * @since 3.1.0 + * + * @param array|string $args Array or string of arguments with information about the pagination. + */ + protected function set_pagination_args($args) { + $args = wp_parse_args( + $args, + array( + 'total_items' => 0, + 'total_pages' => 0, + 'per_page' => 0, + ) + ); + + if (!$args['total_pages'] && $args['per_page'] > 0) { + $args['total_pages'] = ceil($args['total_items'] / $args['per_page']); + } + + // Redirect if page number is invalid and headers are not already sent. + if (! headers_sent() && ! wp_doing_ajax() && $args['total_pages'] > 0 && $this->get_pagenum() > $args['total_pages']) { + wp_redirect(add_query_arg('paged', $args['total_pages'])); + exit; + } + + $this->_pagination_args = $args; + } + + /** + * Access the pagination args. + * + * @since 3.1.0 + * + * @param string $key Pagination argument to retrieve. Common values include 'total_items', + * 'total_pages', 'per_page', or 'infinite_scroll'. + * @return int Number of items that correspond to the given pagination argument. + */ + public function get_pagination_arg($key) { + if ('page' === $key) { + return $this->get_pagenum(); + } + + if (isset($this->_pagination_args[$key])) { + return $this->_pagination_args[$key]; + } + } + + /** + * Whether the table has items to display or not + * + * @since 3.1.0 + * + * @return bool + */ + public function has_items() { + return ! empty($this->items); + } + + /** + * Message to be displayed when there are no items + * + * @since 3.1.0 + */ + public function no_items() { + esc_html_e('No items found.', 'all-in-one-wp-security-and-firewall'); + } + + /** + * Displays the search box. + * + * @since 3.1.0 + * + * @param string $text The 'submit' button label. + * @param string $input_id ID attribute value for the search input field. + */ + public function search_box($text, $input_id) { + // phpcs:disable WordPress.Security.NonceVerification.Recommended -- No nonce. + if (empty($_REQUEST['s']) && !$this->has_items()) { + return; + } + + $input_id = $input_id . '-search-input'; + + if (!empty($_REQUEST['orderby'])) { + echo ''; + } + if (!empty($_REQUEST['order'])) { + echo ''; + } + if (!empty($_REQUEST['post_mime_type'])) { + echo ''; + } + if (!empty($_REQUEST['detached'])) { + echo ''; + } + // phpcs:enable WordPress.Security.NonceVerification.Recommended -- No nonce. + ?> + + link) with the list + * of views available on this table. + * + * @since 3.1.0 + * + * @return array + */ + protected function get_views() { + return array(); + } + + /** + * Display the list of views available on this table. + * + * @since 3.1.0 + */ + public function views() { + $views = $this->get_views(); + /** + * Filters the list of available list table views. + * + * The dynamic portion of the hook name, `$this->screen->id`, refers + * to the ID of the current screen, usually a string. + * + * @since 3.5.0 + * + * @param string[] $views An array of available list table views. + */ + $views = apply_filters("views_{$this->screen->id}", $views); + + if (empty($views)) { + return; + } + + $this->screen->render_screen_reader_content('heading_views'); + + echo "
    \n"; + foreach ($views as $class => $view) { + $views[$class] = "\t
  • $view"; + } + echo implode(" |
  • \n", array_map('esc_attr', $views)) . "\n"; + echo '
'; + } + + /** + * Get an associative array (option_name => option_title) with the list + * of bulk actions available on this table. + * + * @since 3.1.0 + * + * @return array + */ + protected function get_bulk_actions() { + return array(); + } + + /** + * Display the bulk actions dropdown. + * + * @since 3.1.0 + * + * @param string $which The location of the bulk actions: 'top' or 'bottom'. + * This is designated as optional for backward compatibility. + */ + protected function bulk_actions($which = '') { + if (is_null($this->_actions)) { + $this->_actions = $this->get_bulk_actions(); + /** + * Filters the list table Bulk Actions drop-down. + * + * The dynamic portion of the hook name, `$this->screen->id`, refers + * to the ID of the current screen, usually a string. + * + * This filter can currently only be used to remove bulk actions. + * + * @since 3.5.0 + * + * @param string[] $actions An array of the available bulk actions. + */ + $this->_actions = apply_filters("bulk_actions-{$this->screen->id}", $this->_actions); + $two = ''; + } else { + $two = '2'; + } + + if (empty($this->_actions)) { + return; + } + + echo ''; + echo '\n"; + + $submit_attributes = array('id' => "doaction$two"); + + if ('top' == $which) { + $submit_attributes['onclick'] = "return confirm('".esc_js(__('Are you sure you want to perform this bulk action?', 'all-in-one-wp-security-and-firewall'))."')"; + } + + submit_button(__('Apply', 'all-in-one-wp-security-and-firewall'), 'action', '', false, $submit_attributes); + echo "\n"; + } + + /** + * Get the current action selected from the bulk actions dropdown. + * + * @since 3.1.0 + * + * @return string|false The action name or False if no action was selected + */ + public function current_action() { + // phpcs:disable WordPress.Security.NonceVerification.Recommended -- No nonce. + if (isset($_REQUEST['filter_action']) && ! empty($_REQUEST['filter_action'])) { + return false; + } + + if (isset($_REQUEST['action']) && -1 != $_REQUEST['action']) { + return sanitize_text_field(wp_unslash($_REQUEST['action'])); + } + + if (isset($_REQUEST['action2']) && -1 != $_REQUEST['action2']) { + return sanitize_text_field(wp_unslash($_REQUEST['action2'])); + } + + return false; + // phpcs:enable WordPress.Security.NonceVerification.Recommended -- No nonce. + } + + /** + * Generate row actions div + * + * @since 3.1.0 + * + * @param string[] $actions An array of action links. + * @param bool $always_visible Whether the actions should be always visible. + * @return string + */ + protected function row_actions($actions, $always_visible = false) { + $action_count = count($actions); + $i = 0; + + if (!$action_count) { + return ''; + } + + $out = '
'; + foreach ($actions as $action => $link) { + ++$i; + ($i == $action_count) ? $sep = '' : $sep = ' | '; + $out .= "$link$sep"; + } + $out .= '
'; + + $out .= ''; + + return $out; + } + + /** + * Display a monthly dropdown for filtering items + * + * @since 3.1.0 + * + * @global wpdb $wpdb + * @global WP_Locale $wp_locale + * + * @param string $post_type + */ + protected function months_dropdown($post_type) { + // phpcs:disable WordPress.Security.NonceVerification.Recommended -- No nonce. + global $wpdb, $wp_locale; + + /** + * Filters whether to remove the 'Months' drop-down from the post list table. + * + * @since 4.2.0 + * + * @param bool $disable Whether to disable the drop-down. Default false. + * @param string $post_type The post type. + */ + if (apply_filters('disable_months_dropdown', false, $post_type)) { + return; + } + + $extra_checks = "AND post_status != 'auto-draft'"; + if (! isset($_GET['post_status']) || 'trash' !== $_GET['post_status']) { + $extra_checks .= " AND post_status != 'trash'"; + } elseif (isset($_GET['post_status'])) { + $extra_checks = $wpdb->prepare(' AND post_status = %s', sanitize_text_field(wp_unslash($_GET['post_status']))); + } + + // phpcs:disable WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- PCP warning. Direct call needed. + $months = $wpdb->get_results( + $wpdb->prepare( + " + SELECT DISTINCT YEAR(post_date) AS year, MONTH(post_date) AS month + FROM $wpdb->posts + WHERE post_type = %s + $extra_checks + ORDER BY post_date DESC + ", + $post_type + ) + ); + // phpcs:enable WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- PCP warning. Direct call needed. + + /** + * Filters the 'Months' drop-down results. + * + * @since 3.7.0 + * + * @param object $months The months drop-down query results. + * @param string $post_type The post type. + */ + $months = apply_filters('months_dropdown_results', $months, $post_type); + + $month_count = count($months); + + if (!$month_count || (1 == $month_count && 0 == $months[0]->month)) { + return; + } + + $m = isset($_GET['m']) ? (int) $_GET['m'] : 0; + ?> + + + + +
+ modes as $mode => $title) { + $classes = array('view-' . $mode); + if ($current_mode === $mode) { + $classes[] = 'current'; + } + printf( + "%s\n", + esc_url(add_query_arg('mode', $mode)), + implode(' ', array_map('esc_attr', $classes)), + esc_html($title) + ); + } + ?> +
+
%s', + esc_html__('No comments', 'all-in-one-wp-security-and-firewall') + ); + // Approved comments have different display depending on some conditions. + } elseif ($approved_comments) { + printf( + '%s', + esc_url( + add_query_arg( + array( + 'p' => $post_id, + 'comment_status' => 'approved', + ), + admin_url('edit-comments.php') + ) + ), + esc_html($approved_comments_number), + $pending_comments ? esc_html($approved_phrase) : esc_html($approved_only_phrase) + ); + } else { + printf( + '%s', + esc_html($approved_comments_number), + $pending_comments ? esc_html__('No approved comments', 'all-in-one-wp-security-and-firewall') : esc_html__('No comments', 'all-in-one-wp-security-and-firewall') + ); + } + + if ($pending_comments) { + printf( + '%s', + esc_url( + add_query_arg( + array( + 'p' => $post_id, + 'comment_status' => 'moderated', + ), + admin_url('edit-comments.php') + ) + ), + esc_html($pending_comments_number), + esc_html($pending_phrase) + ); + } else { + printf( + '%s', + esc_html($pending_comments_number), + $approved_comments ? esc_html__('No pending comments', 'all-in-one-wp-security-and-firewall') : esc_html__('No comments', 'all-in-one-wp-security-and-firewall') + ); + } + } + + /** + * Get the current page number + * + * @since 3.1.0 + * + * @return int + */ + public function get_pagenum() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- No nonce. + $pagenum = isset($_REQUEST['paged']) ? absint($_REQUEST['paged']) : 0; + + if (isset($this->_pagination_args['total_pages']) && $pagenum > $this->_pagination_args['total_pages']) { + $pagenum = $this->_pagination_args['total_pages']; + } + + return max(1, $pagenum); + } + + /** + * Get number of items to display on a single page + * + * @since 3.1.0 + * + * @param string $option + * @param int $default + * @return int + */ + protected function get_items_per_page($option, $default = 20) { + $per_page = (int) get_user_option($option); + if (empty($per_page) || $per_page < 1) { + $per_page = $default; + } + + /** + * Filters the number of items to be displayed on each page of the list table. + * + * The dynamic hook name, $option, refers to the `per_page` option depending + * on the type of list table in use. Possible values include: 'edit_comments_per_page', + * 'sites_network_per_page', 'site_themes_network_per_page', 'themes_network_per_page', + * 'users_network_per_page', 'edit_post_per_page', 'edit_page_per_page', + * 'edit_{$post_type}_per_page', etc. + * + * @since 2.9.0 + * + * @param int $per_page Number of items to be displayed. Default 20. + */ + return (int) apply_filters("{$option}", $per_page); + } + + /** + * Display the pagination. + * + * @since 3.1.0 + * + * @param string $which + */ + protected function pagination($which) { + if (empty($this->_pagination_args)) { + return; + } + + $total_items = $this->_pagination_args['total_items']; + $total_pages = $this->_pagination_args['total_pages']; + $infinite_scroll = false; + if (isset($this->_pagination_args['infinite_scroll'])) { + $infinite_scroll = $this->_pagination_args['infinite_scroll']; + } + + if ('top' === $which && $total_pages > 1) { + $this->screen->render_screen_reader_content('heading_pagination'); + } + + /* translators: %s: Item count. */ + $output = '' . sprintf(_n('%s item', '%s items', esc_html($total_items), 'all-in-one-wp-security-and-firewall'), number_format_i18n($total_items)) . ''; + + $current = $this->get_pagenum(); + $removable_query_args = wp_removable_query_args(); + + $host = isset($_SERVER['HTTP_HOST']) ? sanitize_text_field(wp_unslash($_SERVER['HTTP_HOST'])) : ''; + $request = isset($_SERVER['REQUEST_URI']) ? sanitize_text_field(wp_unslash($_SERVER['REQUEST_URI'])) : ''; + $current_url = set_url_scheme('http://' . $host . $request); + + $current_url = remove_query_arg($removable_query_args, $current_url); + + $page_links = array(); + + $total_pages_before = ''; + $total_pages_after = '
'; + + $disable_first = $disable_last = $disable_prev = $disable_next = false; + + if (1 == $current) { + $disable_first = true; + $disable_prev = true; + } + if (2 == $current) { + $disable_first = true; + } + if ($current == $total_pages) { + $disable_last = true; + $disable_next = true; + } + if ($current == $total_pages - 1) { + $disable_last = true; + } + + if ($disable_first) { + $page_links[] = ''; + } else { + $page_links[] = sprintf( + "%s", + esc_url(remove_query_arg('paged', $current_url)), + esc_html__('First page', 'all-in-one-wp-security-and-firewall'), + '«' + ); + } + + if ($disable_prev) { + $page_links[] = ''; + } else { + $page_links[] = sprintf( + "%s", + esc_url(add_query_arg('paged', max(1, $current - 1), $current_url)), + esc_html__('Previous page', 'all-in-one-wp-security-and-firewall'), + '‹' + ); + } + + if ('bottom' === $which) { + $html_current_page = $current; + $total_pages_before = '' . __('Current page', 'all-in-one-wp-security-and-firewall') . ''; + } else { + $html_current_page = sprintf( + "%s", + '', + $current, + strlen($total_pages) + ); + } + + /* translators %s: Total pages. */ + $html_total_pages = sprintf("%s", number_format_i18n($total_pages)); + /* translators: 1: Current page, 2: Total pages */ + $page_links[] = $total_pages_before . sprintf(esc_html_x('%1$s of %2$s', 'paging', 'all-in-one-wp-security-and-firewall'), $html_current_page, $html_total_pages) . $total_pages_after; + + if ($disable_next) { + $page_links[] = ''; + } else { + $page_links[] = sprintf( + "%s", + esc_url(add_query_arg('paged', min($total_pages, $current + 1), $current_url)), + esc_html__('Next page', 'all-in-one-wp-security-and-firewall'), + '›' + ); + } + + if ($disable_last) { + $page_links[] = ''; + } else { + $page_links[] = sprintf( + "%s", + esc_url(add_query_arg('paged', $total_pages, $current_url)), + esc_html__('Last page', 'all-in-one-wp-security-and-firewall'), + '»' + ); + } + + $pagination_links_class = 'pagination-links'; + if (! empty($infinite_scroll)) { + $pagination_links_class .= ' hide-if-js'; + } + $output .= "\n" . join("\n", $page_links) . ''; + + if ($total_pages) { + $page_class = $total_pages < 2 ? ' one-page' : ''; + } else { + $page_class = ' no-pages'; + } + $this->_pagination = "
$output
"; + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Necessary escaping done above. + echo $this->_pagination; + } + + /** + * Get a list of columns. The format is: + * 'internal-name' => 'Title' + * + * @since 3.1.0 + * @abstract + * + * @return array + */ + public function get_columns() { + die('function AIOWPSecurity_List_Table::get_columns() must be over-ridden in a sub-class.'); + } + + /** + * Get a list of sortable columns. The format is: + * 'internal-name' => 'orderby' + * or + * 'internal-name' => array('orderby', true) + * + * The second format will make the initial sorting order be descending + * + * @since 3.1.0 + * + * @return array + */ + protected function get_sortable_columns() { + return array(); + } + + /** + * Gets the name of the default primary column. + * + * @since 4.3.0 + * + * @return string Name of the default primary column, in this case, an empty string. + */ + protected function get_default_primary_column_name() { + $columns = $this->get_columns(); + $column = ''; + + if (empty($columns)) { + return $column; + } + + // We need a primary defined so responsive views show something, + // so let's fall back to the first non-checkbox column. + foreach ($columns as $col => $column_name) { + if ('cb' === $col) { + continue; + } + + $column = $col; + break; + } + + return $column; + } + + /** + * Public wrapper for AIOWPSecurity_List_Table::get_default_primary_column_name(). + * + * @since 4.4.0 + * + * @return string Name of the default primary column. + */ + public function get_primary_column() { + return $this->get_primary_column_name(); + } + + /** + * Gets the name of the primary column. + * + * @since 4.3.0 + * + * @return string The name of the primary column. + */ + protected function get_primary_column_name() { + $columns = get_column_headers($this->screen); + $default = $this->get_default_primary_column_name(); + + // If the primary column doesn't exist fall back to the + // first non-checkbox column. + if (! isset($columns[$default])) { + $default = AIOWPSecurity_List_Table::get_default_primary_column_name(); + } + + /** + * Filters the name of the primary column for the current list table. + * + * @since 4.3.0 + * + * @param string $default Column name default for the specific list table, e.g. 'name'. + * @param string $context Screen ID for specific list table, e.g. 'plugins'. + */ + $column = apply_filters('list_table_primary_column', $default, $this->screen->id); + + if (empty($column) || ! isset($columns[$column])) { + $column = $default; + } + + return $column; + } + + /** + * Get a list of all, hidden and sortable columns, with filter applied + * + * @since 3.1.0 + * + * @return array + */ + protected function get_column_info() { + // $_column_headers is already set / cached + if (isset($this->_column_headers) && is_array($this->_column_headers)) { + // Back-compat for list tables that have been manually setting $_column_headers for horse reasons. + // In 4.3, we added a fourth argument for primary column. + $column_headers = array(array(), array(), array(), $this->get_primary_column_name()); + foreach ($this->_column_headers as $key => $value) { + $column_headers[$key] = $value; + } + + return $column_headers; + } + + $columns = get_column_headers($this->screen); + $hidden = get_hidden_columns($this->screen); + + $sortable_columns = $this->get_sortable_columns(); + /** + * Filters the list table sortable columns for a specific screen. + * + * The dynamic portion of the hook name, `$this->screen->id`, refers + * to the ID of the current screen, usually a string. + * + * @since 3.5.0 + * + * @param array $sortable_columns An array of sortable columns. + */ + $_sortable = apply_filters("manage_{$this->screen->id}_sortable_columns", $sortable_columns); + + $sortable = array(); + foreach ($_sortable as $id => $data) { + if (empty($data)) { + continue; + } + + $data = (array) $data; + if (! isset($data[1])) { + $data[1] = false; + } + + $sortable[$id] = $data; + } + + $primary = $this->get_primary_column_name(); + $this->_column_headers = array($columns, $hidden, $sortable, $primary); + + return $this->_column_headers; + } + + /** + * Return number of visible columns + * + * @since 3.1.0 + * + * @return int + */ + public function get_column_count() { + list ($columns, $hidden) = $this->get_column_info(); + $hidden = array_intersect(array_keys($columns), array_filter($hidden)); + return count($columns) - count($hidden); + } + + /** + * Print column headers, accounting for hidden and sortable columns. + * + * @since 3.1.0 + * + * @staticvar int $cb_counter + * + * @param bool $with_id Whether to set the id attribute or not + */ + public function print_column_headers($with_id = true) { + // phpcs:disable WordPress.Security.NonceVerification.Recommended -- No nonce. + list($columns, $hidden, $sortable, $primary) = $this->get_column_info(); + + $host = isset($_SERVER['HTTP_HOST']) ? sanitize_text_field(wp_unslash($_SERVER['HTTP_HOST'])) : ''; + $request = isset($_SERVER['REQUEST_URI']) ? sanitize_text_field(wp_unslash($_SERVER['REQUEST_URI'])) : ''; + $current_url = set_url_scheme('http://' . $host . $request); + $current_url = remove_query_arg('paged', $current_url); + + if (isset($_GET['orderby'])) { + $current_orderby = sanitize_text_field(wp_unslash($_GET['orderby'])); + } else { + $current_orderby = ''; + } + + if (isset($_GET['order']) && 'desc' === $_GET['order']) { + $current_order = 'desc'; + } else { + $current_order = 'asc'; + } + + if (! empty($columns['cb'])) { + static $cb_counter = 1; + $columns['cb'] = '' + . ''; + $cb_counter++; + } + + foreach ($columns as $column_key => $column_display_name) { + $class = array('manage-column', "column-$column_key"); + + if (in_array($column_key, $hidden)) { + $class[] = 'hidden'; + } + + if ('cb' === $column_key) { + $class[] = 'check-column'; + } elseif (in_array($column_key, array('posts', 'comments', 'links'))) { + $class[] = 'num'; + } + + if ($column_key === $primary) { + $class[] = 'column-primary'; + } + + if (isset($sortable[$column_key])) { + list($orderby, $desc_first) = $sortable[$column_key]; + + if ($current_orderby === $orderby) { + $order = 'asc' === $current_order ? 'desc' : 'asc'; + $class[] = 'sorted'; + $class[] = $current_order; + } else { + $order = $desc_first ? 'desc' : 'asc'; + $class[] = 'sortable'; + $class[] = $desc_first ? 'asc' : 'desc'; + } + + $column_display_name = '' . $column_display_name . ''; + } + + $tag = ('cb' === $column_key) ? 'td' : 'th'; + $scope = ('th' === $tag) ? 'scope="col"' : ''; + $id = $with_id ? "id='$column_key'" : ''; + + if (! empty($class)) { + $class = "class='" . join(' ', $class) . "'"; + } + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Escaped earlier in other functions. + echo "<$tag $scope $id $class>$column_display_name"; + } + // phpcs:enable WordPress.Security.NonceVerification.Recommended -- No nonce. + } + + /** + * Display the table + * + * @since 3.1.0 + */ + public function display() { + $singular = $this->_args['singular']; + + $this->display_tablenav('top'); + + $this->screen->render_screen_reader_content('heading_list'); + ?> + + + + print_column_headers(); ?> + + + + + > + display_rows_or_placeholder(); ?> + + + + + print_column_headers(false); ?> + + + +
+ display_tablenav('bottom'); + } + + /** + * Get a list of CSS classes for the AIOWPSecurity_List_Table table tag. + * + * @since 3.1.0 + * + * @return array List of CSS classes for the table tag. + */ + protected function get_table_classes() { + return array('widefat', 'fixed', 'striped', $this->_args['plural']); + } + + /** + * Generate the table navigation above or below the table + * + * @since 3.1.0 + * @param string $which + */ + protected function display_tablenav($which) { + if ('top' === $which) { + wp_nonce_field('bulk-' . $this->_args['plural']); + } + ?> +
+ + has_items()) : ?> +
+ bulk_actions($which); ?> +
+ extra_tablenav($which); + $this->pagination($which); + ?> + +
+
+ has_items()) { + $this->display_rows(); + } else { + echo ''; + $this->no_items(); + echo ''; + } + } + + /** + * Generate the table rows + * + * @since 3.1.0 + */ + public function display_rows() { + foreach ($this->items as $item) { + $this->single_row($item); + } + } + + /** + * Generates content for a single row of the table + * + * @since 3.1.0 + * + * @param object $item The current item + */ + public function single_row($item) { + echo ''; + $this->single_row_columns($item); + echo ''; + } + + /** + * This function renders a default column item + * + * @param array $item - Item object + * @param string $column_name - Column name to be rendered from item object + */ + protected function column_default($item, $column_name) {} // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable, Squiz.WhiteSpace.ScopeClosingBrace.ContentBefore, PEAR.WhiteSpace.ScopeClosingBrace.Line -- this is a protected function + + /** + * This function renders the checkbox column + * + * @param array $item - item object + */ + protected function column_cb($item) {} // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable, Squiz.WhiteSpace.ScopeClosingBrace.ContentBefore, PEAR.WhiteSpace.ScopeClosingBrace.Line -- this is a protected function + + /** + * Generates the columns for a single row of the table + * + * @since 3.1.0 + * + * @param object $item The current item + */ + protected function single_row_columns($item) { + list($columns, $hidden, $sortable, $primary) = $this->get_column_info(); // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- Unused parameters are for future use. + + foreach ($columns as $column_name => $column_display_name) { + $classes = "$column_name column-$column_name"; + if ($primary === $column_name) { + $classes .= ' has-row-actions column-primary'; + } + + if (in_array($column_name, $hidden)) { + $classes .= ' hidden'; + } + + // Comments column uses HTML in the display name with screen reader text. + // Instead of using esc_attr(), we strip tags to get closer to a user-friendly string. + $data = 'data-colname="' . wp_strip_all_tags($column_display_name) . '"'; + + $attributes = "class='$classes' $data"; + + if ('cb' === $column_name) { + echo ''; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP Error. Escaped earlier in other functions. + echo $this->column_cb($item); + echo ''; + } elseif (method_exists($this, '_column_' . $column_name)) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP Error. Escaped earlier in other functions. + echo call_user_func( + array($this, '_column_' . $column_name), + $item, + $classes, + $data, + $primary + ); + } elseif (method_exists($this, 'column_' . $column_name)) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP Error. Escaped earlier in other functions. + echo ""; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP Error. Escaped earlier in other functions. + echo call_user_func(array($this, 'column_' . $column_name), $item); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP Error. Escaped earlier in other functions. + echo $this->handle_row_actions($item, $column_name, $primary); + echo ''; + } else { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP Error. Escaped earlier in other functions. + echo ""; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP Error. Escaped earlier in other functions. + echo $this->column_default($item, $column_name); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP Error. Escaped earlier in other functions. + echo $this->handle_row_actions($item, $column_name, $primary); + echo ''; + } + } + } + + /** + * Generates and display row actions links for the list table. + * + * @since 4.3.0 + * + * @param object $item The item being acted upon. + * @param string $column_name Current column name. + * @param string $primary Primary column name. + * @return string The row actions HTML, or an empty string if the current column is the primary column. + */ + protected function handle_row_actions($item, $column_name, $primary) { + return $column_name === $primary ? '' : ''; + } + + /** + * Handle an incoming ajax request (called from admin-ajax.php) + * + * @since 3.1.0 + */ + public function ajax_response() { + $this->prepare_items(); + + ob_start(); + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- No nonce. + if (! empty($_REQUEST['no_placeholder'])) { + $this->display_rows(); + } else { + $this->display_rows_or_placeholder(); + } + + $rows = ob_get_clean(); + + $response = array('rows' => $rows); + + if (isset($this->_pagination_args['total_items'])) { + $response['total_items_i18n'] = sprintf( + /* translators: %s: Total items */ + _n('%s item', '%s items', $this->_pagination_args['total_items'], 'all-in-one-wp-security-and-firewall'), + number_format_i18n($this->_pagination_args['total_items']) + ); + } + if (isset($this->_pagination_args['total_pages'])) { + $response['total_pages'] = $this->_pagination_args['total_pages']; + $response['total_pages_i18n'] = number_format_i18n($this->_pagination_args['total_pages']); + } + + die(wp_json_encode($response)); + } + + /** + * Send required variables to JavaScript land + */ + public function js_vars() { + $args = array( + 'class' => get_class($this), + 'screen' => array( + 'id' => $this->screen->id, + 'base' => $this->screen->base, + ), + ); + + printf("\n", wp_json_encode($args)); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/index.html b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/index.html new file mode 100755 index 00000000..e69de29b diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/index.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/index.php new file mode 100755 index 00000000..a64ea405 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/index.php @@ -0,0 +1,4 @@ +admin_includes(); + add_action('admin_menu', array($this, 'setup_menu_items')); + add_action('admin_menu', array($this, 'create_admin_menus')); + add_action('admin_menu', array($this, 'premium_upgrade_submenu'), 40); + add_action('admin_init', array($this, 'aiowps_csv_download')); + } + + add_action('admin_init', array($this, 'hook_admin_notices')); + + // Make sure we are on our plugin's menu pages + if ($this->is_aiowps_admin_page()) { + add_action('admin_print_scripts', array($this, 'admin_menu_page_scripts')); + add_action('admin_print_styles', array($this, 'admin_menu_page_styles')); + add_action('init', array($this, 'init_hook_handler_for_admin_side')); + + if (class_exists('AIOWPS_PREMIUM')) { + add_filter('admin_footer_text', array($this, 'display_footer_review_message')); + } + } + } + + /** + * Sets up the menu items array which is used to build admin menus + * + * @return void + */ + public function setup_menu_items() { + $menu_items = array( + array( + 'page_title' => __('Dashboard', 'all-in-one-wp-security-and-firewall'), + 'menu_title' => __('Dashboard', 'all-in-one-wp-security-and-firewall'), + 'menu_slug' => AIOWPSEC_MAIN_MENU_SLUG, + 'render_callback' => array($this, 'handle_dashboard_menu_rendering'), + 'icon' => 'dashboard', + 'order' => 20, + ), + array( + 'page_title' => __('Settings', 'all-in-one-wp-security-and-firewall'), + 'menu_title' => __('Settings', 'all-in-one-wp-security-and-firewall'), + 'menu_slug' => AIOWPSEC_SETTINGS_MENU_SLUG, + 'render_callback' => array($this, 'handle_settings_menu_rendering'), + 'icon' => 'settings', + 'order' => 30, + ), + array( + 'page_title' => __('User Security', 'all-in-one-wp-security-and-firewall'), + 'menu_title' => __('User Security', 'all-in-one-wp-security-and-firewall'), + 'menu_slug' => AIOWPSEC_USER_SECURITY_MENU_SLUG, + 'render_callback' => array($this, 'handle_user_security_menu_rendering'), + 'icon' => 'user_security', + 'order' => 40, + ), + array( + 'page_title' => __('Database Security', 'all-in-one-wp-security-and-firewall'), + 'menu_title' => __('Database Security', 'all-in-one-wp-security-and-firewall'), + 'menu_slug' => AIOWPSEC_DB_SEC_MENU_SLUG, + 'render_callback' => array($this, 'handle_database_menu_rendering'), + 'icon' => 'database_security', + 'display_condition_callback' => 'is_super_admin', + 'order' => 50, + ), + array( + 'page_title' => __('File Security', 'all-in-one-wp-security-and-firewall'), + 'menu_title' => __('File Security', 'all-in-one-wp-security-and-firewall'), + 'menu_slug' => AIOWPSEC_FILESYSTEM_MENU_SLUG, + 'render_callback' => array($this, 'handle_filesystem_menu_rendering'), + 'icon' => 'filesystem_security', + 'order' => 60, + ), + array( + 'page_title' => __('Firewall', 'all-in-one-wp-security-and-firewall'), + 'menu_title' => __('Firewall', 'all-in-one-wp-security-and-firewall'), + 'menu_slug' => AIOWPSEC_FIREWALL_MENU_SLUG, + 'render_callback' => array($this, 'handle_firewall_menu_rendering'), + 'icon' => 'firewall', + 'order' => 70, + ), + array( + 'page_title' => __('Brute Force', 'all-in-one-wp-security-and-firewall'), + 'menu_title' => __('Brute Force', 'all-in-one-wp-security-and-firewall'), + 'menu_slug' => AIOWPSEC_BRUTE_FORCE_MENU_SLUG, + 'render_callback' => array($this, 'handle_brute_force_menu_rendering'), + 'icon' => 'brute_force', + 'order' => 80, + ), + array( + 'page_title' => __('Spam Prevention', 'all-in-one-wp-security-and-firewall'), + 'menu_title' => __('Spam Prevention', 'all-in-one-wp-security-and-firewall'), + 'menu_slug' => AIOWPSEC_SPAM_MENU_SLUG, + 'render_callback' => array($this, 'handle_spam_menu_rendering'), + 'icon' => 'spam_prevention', + 'order' => 90, + ), + array( + 'page_title' => __('Scanner', 'all-in-one-wp-security-and-firewall'), + 'menu_title' => __('Scanner', 'all-in-one-wp-security-and-firewall'), + 'menu_slug' => AIOWPSEC_FILESCAN_MENU_SLUG, + 'render_callback' => array($this, 'handle_filescan_menu_rendering'), + 'icon' => 'scanner', + 'display_condition_callback' => array('AIOWPSecurity_Utility_Permissions', 'is_main_site_and_super_admin'), + 'order' => 100, + ), + array( + 'page_title' => __('Tools', 'all-in-one-wp-security-and-firewall'), + 'menu_title' => __('Tools', 'all-in-one-wp-security-and-firewall'), + 'menu_slug' => AIOWPSEC_TOOLS_MENU_SLUG, + 'render_callback' => array($this, 'handle_tools_menu_rendering'), + 'icon' => 'tools', + 'order' => 110, + ), + ); + $menu_items = apply_filters('aiowpsecurity_menu_items', $menu_items); + $this->menu_items = array_filter($menu_items, 'AIOWPSecurity_Utility::should_display_item'); + } + + /** + * Function to get the menu items array + * + * @return array + */ + public function get_menu_items() { + return $this->menu_items; + } + + /** + * This function creates and outputs the csv file for download + * + * @param array $items - the content + * @param array $export_keys - the keys for the content + * @param string $filename - the filename + * + * @return void + */ + public static function aiowps_output_csv($items, $export_keys, $filename = 'data.csv') { + header("Content-Type: text/csv; charset=utf-8"); + header("Content-Disposition: attachment; filename=".$filename); + header("Pragma: no-cache"); + header("Expires: 0"); + $output = fopen('php://output', 'w'); //open output stream + + fputcsv($output, $export_keys, ',', '"', '\\'); // let's put column names first + + foreach ($items as $item) { + $csv_line = array(); + + foreach ($export_keys as $key => $value) { + if (isset($item[$key])) { + $csv_line[] = ('created' == $key) ? AIOWPSecurity_Utility::convert_timestamp($item[$key]) : $item[$key]; + } + } + fputcsv($output, $csv_line, ',', '"', '\\'); + } + } + + /** + * This function will get the content that we want to export as CSV and send it to the download function + * + * @return void + */ + public function aiowps_csv_download() { + global $aio_wp_security; + // phpcs:ignore WordPress.Security.NonceVerification.Missing -- PCP warning. Nonce check in two lines. + if (isset($_POST['aiowps_export_404_event_logs_to_csv'])) {//Export 404 event logs + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- It IS the nonce, so... + $nonce = isset($_REQUEST['_wpnonce']) ? sanitize_key(wp_unslash($_REQUEST['_wpnonce'])) : ''; + $result = AIOWPSecurity_Utility_Permissions::check_nonce_and_user_cap($nonce, 'aiowpsec-export-404-event-logs-to-csv-nonce'); + if (is_wp_error($result)) { + $aio_wp_security->debug_logger->log_debug($result->get_error_message(), 4); + die(esc_html($result->get_error_message())); + } + include_once 'wp-security-list-404.php'; //For rendering the AIOWPSecurity_List_Table in tab1 + $event_list_404 = new AIOWPSecurity_List_404(); //For rendering the AIOWPSecurity_List_Table in tab1 + $event_list_404->prepare_items(true); + $export_keys = array( + 'id' => __('Id', 'all-in-one-wp-security-and-firewall'), + 'event_type' => __('Event Type', 'all-in-one-wp-security-and-firewall'), + 'ip_or_host' => __('IP Address', 'all-in-one-wp-security-and-firewall'), + 'url' => __('Attempted URL', 'all-in-one-wp-security-and-firewall'), + 'referer_info' => __('Referer', 'all-in-one-wp-security-and-firewall'), + 'created' => __('Date and time', 'all-in-one-wp-security-and-firewall'), + 'status' => __('Lock Status', 'all-in-one-wp-security-and-firewall'), + ); + AIOWPSecurity_Utility::output_csv($event_list_404->items, $export_keys, '404_event_logs.csv'); + exit(); + } + } + + /** + * Check whether current admin page is All In One WP Security admin page or not. + * + * @return boolean True if All In One WP Security admin page, Otherwise false. + */ + private function is_aiowps_admin_page() { + if (isset($this->is_aiowps_admin_page)) { + return $this->is_aiowps_admin_page; + } + global $pagenow; + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce on this _GET. + $this->is_aiowps_admin_page = (AIOWPSecurity_Utility_Permissions::has_manage_cap() && 'admin.php' == $pagenow && isset($_GET['page']) && false !== strpos(sanitize_title(wp_unslash($_GET['page'])), AIOWPSEC_MENU_SLUG_PREFIX)); + return $this->is_aiowps_admin_page; + } + + /** + * Hook admin notices on admin dashboard page and admin AIOS pages. + * + * @return void + */ + public function hook_admin_notices() { + if (!current_user_can('update_plugins')) { + return; + } + + // If none of the admin dashboard page or the AIOS page, Then bail + if (!$this->is_admin_dashboard_page() && !$this->is_aiowps_admin_page()) { + return; + } + + add_action('all_admin_notices', array($this, 'render_admin_notices')); + } + + /** + * Check whether current admin page is Admin Dashboard page or not. + * + * @return boolean True if Admin Dashboard page, Otherwise false. + */ + private function is_admin_dashboard_page() { + if (isset($this->is_admin_dashboard_page)) { + return $this->is_admin_dashboard_page; + } + global $pagenow; + $this->is_admin_dashboard_page = 'index.php' == $pagenow; + return $this->is_admin_dashboard_page; + } + + /** + * Render admin notices. + * + * @return void + */ + public function render_admin_notices() { + global $aio_wp_security; + + $custom_notice_ids = array_merge(AIOS_Abstracted_Ids::custom_admin_notice_ids(), AIOS_Abstracted_Ids::htaccess_to_php_feature_notice_ids()); + foreach ($custom_notice_ids as $custom_admin_notice_id) { + $aio_wp_security->notices->do_notice($custom_admin_notice_id, $custom_admin_notice_id); + } + + // Bail if the premium plugin is active and does not show ads. + if (AIOWPSecurity_Utility_Permissions::is_premium_installed()) return; + + $installed_at = $aio_wp_security->notices->get_aiowps_plugin_installed_timestamp(); + $time_now = $aio_wp_security->notices->get_time_now(); + $installed_for = $time_now - $installed_at; + + $dismissed_dash_notice_until = (int) $aio_wp_security->configs->get_value('dismissdashnotice'); + + if ($this->is_admin_dashboard_page() && ($installed_at && $time_now > $dismissed_dash_notice_until && $installed_for > (14 * 86400)) || (defined('AIOWPSECURITY_FORCE_DASHNOTICE') && AIOWPSECURITY_FORCE_DASHNOTICE)) { + $aio_wp_security->include_template('notices/thanks-for-using-main-dash.php'); + } elseif ($this->is_aiowps_admin_page() && $installed_at && $installed_for > 14*86400) { + $aio_wp_security->notices->do_notice(false, 'top'); + } + } + + /** + * This function will include any files needed for the admin dashboard + * + * @return void + */ + private function admin_includes() { + include_once('wp-security-admin-menu.php'); + } + + /** + * Enqueue admin JavaScripts. + * + * @return Void + */ + public function admin_menu_page_scripts() { + if (!AIOWPSecurity_Utility_Permissions::has_manage_cap()) { + return; + } + + wp_enqueue_script('jquery'); + wp_enqueue_script('postbox'); + wp_enqueue_script('dashboard'); + wp_enqueue_script('thickbox'); + wp_enqueue_script('media-upload'); + wp_enqueue_script('chart-bundle', AIO_WP_SECURITY_URL . '/includes/chartjs/Chart.bundle.min.js', array(), AIO_WP_SECURITY_VERSION, true); + wp_enqueue_script('chartjs-gauge', AIO_WP_SECURITY_URL . '/includes/chartjs/chartjs-gauge.min.js', array(), AIO_WP_SECURITY_VERSION, true); + wp_register_script('jquery-blockui', AIO_WP_SECURITY_URL.'/includes/blockui/jquery.blockUI.js', array('jquery'), AIO_WP_SECURITY_VERSION, true); + wp_enqueue_script('jquery-blockui'); + wp_register_script('aiowpsec-admin-js', AIO_WP_SECURITY_URL. '/js/wp-security-admin-script.js', array('jquery'), AIO_WP_SECURITY_VERSION, true); + wp_enqueue_script('aiowpsec-admin-js'); + wp_localize_script('aiowpsec-admin-js', + 'aios_data', + array( + 'ajax_nonce' => wp_create_nonce('wp-security-ajax-nonce'), + ) + ); + wp_localize_script('aiowpsec-admin-js', + 'aios_trans', + array( + 'unexpected_response' => __('Unexpected response:', 'all-in-one-wp-security-and-firewall'), + 'copied' => __('Copied', 'all-in-one-wp-security-and-firewall'), + 'no_import_file' => __('You have not yet selected a file to import.', 'all-in-one-wp-security-and-firewall'), + 'processing' => __('Processing...', 'all-in-one-wp-security-and-firewall'), + 'invalid_domain' => __('Please enter a valid IP address or domain name.', 'all-in-one-wp-security-and-firewall'), + 'logo' => AIO_WP_SECURITY_URL.'/images/plugin-logos/icon-aios-rgb.svg', + 'saving' => __('Saving...', 'all-in-one-wp-security-and-firewall'), + 'deleting' => __('Deleting...', 'all-in-one-wp-security-and-firewall'), + 'blocking' => __('Blocking...', 'all-in-one-wp-security-and-firewall'), + 'unlocking' => __('Unlocking...', 'all-in-one-wp-security-and-firewall'), + 'clearing' => __('Clearing...', 'all-in-one-wp-security-and-firewall'), + 'importing' => __('Importing...', 'all-in-one-wp-security-and-firewall'), + 'exporting' => __('Exporting...', 'all-in-one-wp-security-and-firewall'), + 'refreshing' => __('Refreshing...', 'all-in-one-wp-security-and-firewall'), + 'scanning' => __('Scanning...', 'all-in-one-wp-security-and-firewall'), + 'close' => __('Close', 'all-in-one-wp-security-and-firewall'), + 'completed' => __('Completed.', 'all-in-one-wp-security-and-firewall'), + 'refreshed' => __('Refreshed.', 'all-in-one-wp-security-and-firewall'), + 'deleted' => __('Deleted.', 'all-in-one-wp-security-and-firewall'), + 'show_info' => __('show more', 'all-in-one-wp-security-and-firewall'), + 'hide_info' => __('hide', 'all-in-one-wp-security-and-firewall'), + 'show_notices' => __('But the following notices have been raised', 'all-in-one-wp-security-and-firewall'), + 'disabling' => __('Disabling...', 'all-in-one-wp-security-and-firewall'), + 'setting_up_firewall' => __('Setting up firewall...', 'all-in-one-wp-security-and-firewall'), + 'downgrading_firewall' => __('Downgrading firewall...', 'all-in-one-wp-security-and-firewall'), + 'maintenance_mode_enabled' => __('Maintenance mode is currently enabled.', 'all-in-one-wp-security-and-firewall') . ' ' . __('Remember to disable it when you are done.', 'all-in-one-wp-security-and-firewall'), + 'maintenance_mode_disabled' => __('Maintenance mode is currently disabled.', 'all-in-one-wp-security-and-firewall'), + ) + ); + wp_register_script('aiowpsec-pw-tool-js', AIO_WP_SECURITY_URL. '/js/password-strength-tool.js', array('jquery'), AIO_WP_SECURITY_VERSION, true); // We will enqueue this in the user acct menu class + wp_localize_script('aiowpsec-pw-tool-js', + 'aios_pwtool_trans', + array( + 'years' => __('year(s)', 'all-in-one-wp-security-and-firewall'), + 'months' => __('month(s)', 'all-in-one-wp-security-and-firewall'), + 'days' => __('day(s)', 'all-in-one-wp-security-and-firewall'), + 'hours' => __('hour(s)', 'all-in-one-wp-security-and-firewall'), + 'minutes' => __('minute(s)', 'all-in-one-wp-security-and-firewall'), + 'seconds' => __('second(s)', 'all-in-one-wp-security-and-firewall'), + 'less_than_one_second' => __('less than one second', 'all-in-one-wp-security-and-firewall') + ) + ); + } + + /** + * Enqueue admin styles. + * + * @return Void + */ + public function admin_menu_page_styles() { + wp_enqueue_style('dashboard'); + wp_enqueue_style('thickbox'); + wp_enqueue_style('global'); + wp_enqueue_style('wp-admin'); + $admin_css_version = (defined('WP_DEBUG') && WP_DEBUG) ? time() : filemtime(AIO_WP_SECURITY_PATH. '/css/wp-security-admin-styles.css'); + wp_enqueue_style('aiowpsec-admin-css', AIO_WP_SECURITY_URL. '/css/wp-security-admin-styles.css', array(), $admin_css_version); + } + + /** + * Sets up various class and tasks needed for the admin dashboard + * + * @return void + */ + public function init_hook_handler_for_admin_side() { + $this->initialize_feature_manager(); + $this->do_other_admin_side_init_tasks(); + } + + /** + * Show footer review message and link. + * + * @return string + */ + public function display_footer_review_message() { + $message = sprintf( + /* translators: 1: Product Name, 2: Rating, 3: Trustpilot URL, 4: G2 URL */ + __('Enjoyed %1$s? Please leave us a %2$s rating on %3$s or %4$s', 'all-in-one-wp-security-and-firewall').' '.__('We really appreciate your support!', 'all-in-one-wp-security-and-firewall'), + '' . htmlspecialchars('All In One Security') . '', + '★★★★★', + 'Trustpilot', + 'G2.com' + ); + return $message; + } + + /** + * This function checks if the feature manager is initialized and initializes it if it is not then checks the feature status and recalculates the points + * + * @return void + */ + private function initialize_feature_manager() { + if (!isset($aiowps_feature_mgr)) { + $aiowps_feature_mgr = new AIOWPSecurity_Feature_Item_Manager(); + $aiowps_feature_mgr->check_feature_status_and_recalculate_points(); + $GLOBALS['aiowps_feature_mgr'] = $aiowps_feature_mgr; + } + } + + /** + * Other admin side init tasks. + * + * @return Void + */ + private function do_other_admin_side_init_tasks() { + global $aio_wp_security; + + //***New Feature improvement for Cookie Based Brute Force Protection***// + // The old "test cookie" used to be too easy to guess because someone could just read the code and get the value. + //So now we will drop a more secure test cookie using a 10 digit random string + + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_brute_force_attack_prevention')) { + // This code is for users who had this feature saved using an older release. This will drop the new more secure test cookie to the browser + $test_cookie_name_saved = $aio_wp_security->configs->get_value('aiowps_cookie_brute_test'); + if (empty($test_cookie_name_saved)) { + $random_suffix = AIOWPSecurity_Utility::generate_alpha_numeric_random_string(10); + $test_cookie_name = 'aiowps_cookie_test_'.$random_suffix; + $aio_wp_security->configs->set_value('aiowps_cookie_brute_test', $test_cookie_name, true); + AIOWPSecurity_Utility::set_cookie_value($test_cookie_name, '1'); + } + } + + // For cookie test form submission case + // phpcs:ignore WordPress.Security.NonceVerification.Missing -- PCP warning. No nonce on this _GET. + if (isset($_GET['page']) && AIOWPSEC_BRUTE_FORCE_MENU_SLUG == $_GET['page'] && isset($_GET['tab']) && 'cookie-based-brute-force-prevention' == $_GET['tab']) { + if (isset($_POST['aiowps_do_cookie_test_for_bfla'])) { + $random_suffix = AIOWPSecurity_Utility::generate_alpha_numeric_random_string(10); + $test_cookie_name = 'aiowps_cookie_test_'.$random_suffix; + $aio_wp_security->configs->set_value('aiowps_cookie_brute_test', $test_cookie_name, true); + AIOWPSecurity_Utility::set_cookie_value($test_cookie_name, '1'); + $cur_url = "admin.php?page=".AIOWPSEC_BRUTE_FORCE_MENU_SLUG."&tab=cookie-based-brute-force-prevention"; + $redirect_url = AIOWPSecurity_Utility::add_query_data_to_url($cur_url, 'aiowps_cookie_test', "1"); + AIOWPSecurity_Utility::redirect_to_url($redirect_url); + } + + if (isset($_REQUEST['aiowps_cookie_test'])) { + $test_cookie = $aio_wp_security->configs->get_value('aiowps_cookie_brute_test'); + $cookie_val = AIOWPSecurity_Utility::get_cookie_value($test_cookie); + if (empty($cookie_val)) { + $aio_wp_security->configs->set_value('aiowps_cookie_test_success', ''); + } else { + $aio_wp_security->configs->set_value('aiowps_cookie_test_success', '1'); + } + $aio_wp_security->configs->save_config();//save the value + } + } + } + + /** + * Adds admin menu page and all submenus to the WordPress dashboard + * + * @return void + */ + public function create_admin_menus() { + $menu_icon_url = AIO_WP_SECURITY_URL.'/images/aios-plugin-icon.svg'; + $this->main_menu_page = add_menu_page(__('AIOS', 'all-in-one-wp-security-and-firewall'), __('AIOS', 'all-in-one-wp-security-and-firewall'), apply_filters('aios_management_permission', 'manage_options'), AIOWPSEC_MAIN_MENU_SLUG, array($this, 'handle_dashboard_menu_rendering'), $menu_icon_url); + + foreach ($this->menu_items as $menu_item) { + add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, $menu_item['page_title'], $menu_item['menu_title'], apply_filters('aios_management_permission', 'manage_options'), $menu_item['menu_slug'], $menu_item['render_callback'], $menu_item['order']); + } + + do_action('aiowpsecurity_admin_menu_created'); + } + + /** + * Adds submenu link for premium upgrade tab. + * + * @return Void + */ + public function premium_upgrade_submenu() { + if (!AIOWPSecurity_Utility_Permissions::is_premium_installed()) { + global $submenu; + $submenu[AIOWPSEC_MAIN_MENU_SLUG][] = array(__('Premium Upgrade', 'all-in-one-wp-security-and-firewall'), apply_filters('aios_management_permission', 'manage_options'), 'admin.php?page='.AIOWPSEC_MAIN_MENU_SLUG.'&tab=premium-upgrade'); + } + } + + /** + * Renders 'Dashboard' submenu page. + * + * @return Void + */ + public function handle_dashboard_menu_rendering() { + include_once('wp-security-dashboard-menu.php'); + new AIOWPSecurity_Dashboard_Menu(); + } + + /** + * Renders 'Settings' submenu page. + * + * @return Void + */ + public function handle_settings_menu_rendering() { + include_once('wp-security-settings-menu.php'); + new AIOWPSecurity_Settings_Menu(); + } + + /** + * Renders 'User Security' submenu page. + * + * @return Void + */ + public function handle_user_security_menu_rendering() { + include_once('wp-security-user-security-menu.php'); + new AIOWPSecurity_User_Security_Menu(); + } + + /** + * Renders 'Database Security' submenu page. + * + * @return Void + */ + public function handle_database_menu_rendering() { + include_once('wp-security-database-menu.php'); + new AIOWPSecurity_Database_Menu(); + } + + /** + * Renders 'Filesystem Security' submenu page. + * + * @return Void + */ + public function handle_filesystem_menu_rendering() { + include_once('wp-security-filesystem-menu.php'); + new AIOWPSecurity_Filesystem_Menu(); + } + + /** + * Renders 'Firewall' submenu page. + * + * @return Void + */ + public function handle_firewall_menu_rendering() { + include_once('wp-security-firewall-menu.php'); + new AIOWPSecurity_Firewall_Menu(); + } + + /** + * Renders 'Brute Force' submenu page. + * + * @return Void + */ + public function handle_brute_force_menu_rendering() { + include_once('wp-security-brute-force-menu.php'); + new AIOWPSecurity_Brute_Force_Menu(); + } + + /** + * Renders 'Spam Prevention' submenu page. + * + * @return Void + */ + public function handle_spam_menu_rendering() { + include_once('wp-security-spam-menu.php'); + new AIOWPSecurity_Spam_Menu(); + } + + /** + * Renders 'Scanner' submenu page. + * + * @return Void + */ + public function handle_filescan_menu_rendering() { + include_once('wp-security-filescan-menu.php'); + new AIOWPSecurity_Filescan_Menu(); + } + + /** + * Renders 'Tools' submenu page. + * + * @return Void + */ + public function handle_tools_menu_rendering() { + include_once('wp-security-tools-menu.php'); + new AIOWPSecurity_Tools_Menu(); + } + +} // End of class diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-admin-menu.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-admin-menu.php new file mode 100755 index 00000000..23e003ad --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-admin-menu.php @@ -0,0 +1,280 @@ +setup_menu_tabs(); + $this->render_page($title); + } + + /** + * Render the menu page + * + * @param string $title - the page title + * + * @return void + */ + protected function render_page($title) { + $current_tab = $this->get_current_tab(); + ?> +
+

+ render_tabs($current_tab); ?> +
+
+ menu_tabs[$current_tab]['render_callback']); ?> +
+
+
+ '; + foreach ($this->menu_tabs as $tab_key => $tab_info) { + $active = $current_tab == $tab_key ? 'nav-tab-active' : ''; + echo '' . esc_html($tab_info['title']) . ''; + } + echo ''; + } + + /** + * Get valid current tab slug. + * + * @return string - current valid tab slug or empty string + */ + protected function get_current_tab() { + if (is_array($this->menu_tabs) && !empty($this->menu_tabs)) { + $tab_keys = array_keys($this->menu_tabs); + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce available. + if (empty($_GET['tab'])) { + return $tab_keys[0]; + } else { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce available. + $current_tab = sanitize_text_field(wp_unslash($_GET['tab'])); + return in_array($current_tab, $tab_keys) ? $current_tab : $tab_keys[0]; + } + } else { + return ''; + } + } + + /** + * This function checks to see if there is a display condition for the tab and if so runs it otherwise it returns true to display the tab + * + * @param array $tab_info - the tab information array contains keys like title, render_callback and display_condition_callback + * + * @return boolean - true if the tab should be displayed or false to hide it + */ + protected function should_display_tab($tab_info) { + return AIOWPSecurity_Utility::apply_callback_filter($tab_info, 'display_condition_callback'); + } + + /** + * Shows postbox for settings menu + * + * @param string $id - css ID for postbox + * @param string $title - title of the postbox section + * @param string $content - the content of the postbox + **/ + protected function postbox_toggle($id, $title, $content) { + //Always send string with translation markers in it + ?> +
+

+

+
+ +
+
+ +
+

+
+ +
+
+

'; + $message .= esc_html__('The settings have been successfully updated.', 'all-in-one-wp-security-and-firewall'); + $message .= '

'; + if ($return_instead_of_echo) return $message; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Variable contains escaped HTML. + echo $message; + } + + /** + * Render settings successfully updated message + * + * @param bool $return_instead_of_echo - This is used for when the function needs to return the message + * + * @return string|void + */ + public static function show_msg_settings_updated_st($return_instead_of_echo = false) { + $message = '

'; + $message .= esc_html__('The settings have been successfully updated.', 'all-in-one-wp-security-and-firewall'); + $message .= '

'; + if ($return_instead_of_echo) return $message; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Variable contains escaped HTML. + echo $message; + } + + /** + * Renders record(s) successfully deleted message at top of page. + * + * @param bool $return_instead_of_echo - This is used for when the function needs to return the message + * @return mixed + */ + public static function show_msg_record_deleted_st($return_instead_of_echo = false) { + return AIOWPSecurity_Admin_Menu::show_msg_updated_st(__('The selected record(s) has been deleted successfully.', 'all-in-one-wp-security-and-firewall'), $return_instead_of_echo); + } + + /** + * Renders record(s) unsuccessfully deleted message at top of page. + * + * @param bool $return_instead_of_echo - This is used for when the function needs to return the message + * @return mixed + */ + public static function show_msg_record_not_deleted_st($return_instead_of_echo = false) { + return AIOWPSecurity_Admin_Menu::show_msg_error_st(__('The selected record(s) have failed to delete.', 'all-in-one-wp-security-and-firewall'), $return_instead_of_echo); + } + + /** + * Render successfully updated message + * + * @param string $msg - This contains the message to show + * @param bool $return_instead_of_echo - This is used for when the function needs to return the message + * + * @return string|void + */ + public function show_msg_updated($msg, $return_instead_of_echo = false) { + $message = '

'; + $message .= wp_kses_post($msg); + $message .= '

'; + if ($return_instead_of_echo) return $message; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Variable contains escaped HTML. + echo $message; + } + + /** + * Render successfully updated message + * + * @param string $msg - This contains the message to show + * @param bool $return_instead_of_echo - This is used for when the function needs to return the message + * + * @return string|void + */ + public static function show_msg_updated_st($msg, $return_instead_of_echo = false) { + $message = '

'; + $message .= wp_kses_post($msg); + $message .= '

'; + if ($return_instead_of_echo) return $message; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Variable contains escaped HTML. + echo $message; + } + + /** + * Render error message + * + * @param string $error_msg - This contains the message to show + * @param bool $return_instead_of_echo - This is used for when the function needs to return the message + * + * @return string|void + */ + public function show_msg_error($error_msg, $return_instead_of_echo = false) { + $message = '

'; + $message .= wp_kses_post($error_msg); + $message .= '

'; + if ($return_instead_of_echo) return $message; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Variable contains escaped HTML. + echo $message; + } + + /** + * Render error message + * + * @param string $error_msg - This contains the message to show + * @param bool $return_instead_of_echo - This is used for when the function needs to return the message + * + * @return string|void + */ + public static function show_msg_error_st($error_msg, $return_instead_of_echo = false) { + $message = '

'; + $message .= wp_kses_post($error_msg); + $message .= '

'; + if ($return_instead_of_echo) return $message; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Variable contains escaped HTML. + echo $message; + } + + protected function start_buffer() { + ob_start(); + } + + protected function end_buffer_and_collect() { + $output = ob_get_contents(); + ob_end_clean(); + return $output; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-brute-force-menu.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-brute-force-menu.php new file mode 100755 index 00000000..a6c16995 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-brute-force-menu.php @@ -0,0 +1,176 @@ + array( + 'title' => __('Rename login page', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_rename_login'), + ), + 'cookie-based-brute-force-prevention' => array( + 'title' => __('Cookie based brute force prevention', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_cookie_based_brute_force_prevention'), + 'display_condition_callback' => 'is_main_site', + ), + 'captcha-settings' => array( + 'title' => __('CAPTCHA settings', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_captcha_settings'), + ), + 'login-whitelist' => array( + 'title' => __('Login whitelist', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_login_whitelist'), + ), + '404-detection' => array( + 'title' => __('404 detection', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_404_detection'), + 'display_condition_callback' => array('AIOWPSecurity_Utility_Permissions', 'is_main_site_and_super_admin'), + ), + 'honeypot' => array( + 'title' => __('Honeypot', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_honeypot'), + ), + ); + + $this->menu_tabs = array_filter($menu_tabs, array($this, 'should_display_tab')); + } + + /** + * Rename login page tab. + * + * @global $aio_wp_security + * @global $aiowps_feature_mgr + */ + protected function render_rename_login() { + global $aio_wp_security, $aiowps_feature_mgr; + + if (get_option('permalink_structure')) { + $home_url = trailingslashit(home_url()); + } else { + $home_url = trailingslashit(home_url()) . '?'; + } + + $aio_wp_security->include_template('wp-admin/brute-force/rename-login.php', false, array('aiowps_feature_mgr' => $aiowps_feature_mgr, 'home_url' => $home_url)); + } + + /** + * Cookie based brute force prevention tab. + * + * @global $aio_wp_security + * @global $aiowps_feature_mgr + * + * @return void + */ + protected function render_cookie_based_brute_force_prevention() { + global $aio_wp_security; + global $aiowps_feature_mgr; + + $aio_wp_security->include_template('wp-admin/brute-force/cookie-based-brute-force-prevention.php', false, array('aiowps_feature_mgr' => $aiowps_feature_mgr)); + } + + /** + * Login captcha tab. + * + * @global $aio_wp_security + * @global $aiowps_feature_mgr + * + * @return void + */ + protected function render_captcha_settings() { + global $aio_wp_security, $aiowps_feature_mgr; + + $supported_captchas = $aio_wp_security->captcha_obj->get_supported_captchas(); + $captcha_themes = $aio_wp_security->captcha_obj->get_captcha_themes(); + + $captcha_theme = 'auto'; + if ('cloudflare-turnstile' == $aio_wp_security->configs->get_value('aiowps_default_captcha')) $captcha_theme = $aio_wp_security->configs->get_value('aiowps_turnstile_theme'); + + if ('cloudflare-turnstile' == $aio_wp_security->configs->get_value('aiowps_default_captcha') && false === $aio_wp_security->captcha_obj->cloudflare_turnstile_verify_configuration($aio_wp_security->configs->get_value('aiowps_turnstile_site_key'), $aio_wp_security->configs->get_value('aiowps_turnstile_secret_key'))) { + echo '

' . esc_html__('Your Cloudflare Turnstile configuration is invalid.', 'all-in-one-wp-security-and-firewall').' ' . esc_html__('Please enter the correct Cloudflare Turnstile keys below to use the Turnstile feature.', 'all-in-one-wp-security-and-firewall').'

'; + } + + if ('1' == $aio_wp_security->configs->get_value('aios_google_recaptcha_invalid_configuration')) { + echo '

' . esc_html__('Your Google reCAPTCHA configuration is invalid.', 'all-in-one-wp-security-and-firewall') . ' ' . esc_html__('Please enter the correct reCAPTCHA keys below to use the reCAPTCHA feature.', 'all-in-one-wp-security-and-firewall').'

'; + } + + $default_captcha = $aio_wp_security->configs->get_value('aiowps_default_captcha'); + $aio_wp_security->include_template('wp-admin/brute-force/captcha-settings.php', false, array('aiowps_feature_mgr' => $aiowps_feature_mgr, 'supported_captchas' => $supported_captchas, 'default_captcha' => $default_captcha, 'captcha_themes' => $captcha_themes, 'captcha_theme' => $captcha_theme)); + } + + /** + * Login whitelist tab. + * + * @return void + * @global $aio_wp_security + * @global $aiowps_feature_mgr + */ + protected function render_login_whitelist() { + global $aio_wp_security, $aiowps_feature_mgr; + $ip_v4 = false; + $your_ip_address = AIOWPSecurity_Utility_IP::get_user_ip_address(); + if (filter_var($your_ip_address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) $ip_v4 = true; + + $aiowps_allowed_ip_addresses = $aio_wp_security->configs->get_value('aiowps_allowed_ip_addresses'); + $aio_wp_security->include_template('wp-admin/brute-force/login-whitelist.php', false, array('aiowps_feature_mgr' => $aiowps_feature_mgr, 'your_ip_address' => $your_ip_address, 'ip_v4' => $ip_v4, 'aiowps_allowed_ip_addresses' => $aiowps_allowed_ip_addresses)); + } + + /** + * Renders the 404 Detection tab + * + * @return void + */ + protected function render_404_detection() { + global $aio_wp_security; + + include_once 'wp-security-list-404.php'; // For rendering the AIOWPSecurity_List_Table in basic-firewall tab + $event_list_404 = new AIOWPSecurity_List_404(); // For rendering the AIOWPSecurity_List_Table in basic-firewall tab + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce available. + $page = isset($_REQUEST['page']) ? sanitize_text_field(wp_unslash($_REQUEST['page'])) : ''; + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce available. + $tab = isset($_REQUEST["tab"]) ? sanitize_text_field(wp_unslash($_REQUEST["tab"])) : ''; + $aio_wp_security->include_template('wp-admin/brute-force/404-detection.php', false, array('event_list_404' => $event_list_404, 'page' => $page, 'tab' => $tab)); + } + + /** + * Honeypot tab. + * + * @global $aio_wp_security + * @global $aiowps_feature_mgr + * + * @return void + */ + protected function render_honeypot() { + global $aio_wp_security, $aiowps_feature_mgr; + + $aio_wp_security->include_template('wp-admin/brute-force/honeypot.php', false, array('aiowps_feature_mgr' => $aiowps_feature_mgr)); + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-dashboard-menu.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-dashboard-menu.php new file mode 100755 index 00000000..e997bd8f --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-dashboard-menu.php @@ -0,0 +1,653 @@ + array( + 'title' => __('Dashboard', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_dashboard'), + ), + 'locked-ip' => array( + 'title' => __('Locked IP addresses', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_locked_ip'), + ), + 'permanent-block' => array( + 'title' => __('Permanent block list', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_permanent_block'), + ), + 'audit-logs' => array( + 'title' => __('Audit logs', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_audit_logs'), + ), + 'debug-logs' => array( + 'title' => __('Debugging', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_debug_logs'), + ), + 'premium-upgrade' => array( + 'title' => __('Premium upgrade', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_premium_upgrade_tab'), + 'display_condition_callback' => function() { + return !AIOWPSecurity_Utility_Permissions::is_premium_installed(); + } + ), + ); + + $this->menu_tabs = array_filter($menu_tabs, array($this, 'should_display_tab')); + } + + /** + * Renders the submenu's dashboard tab + * + * @return Void + */ + protected function render_dashboard() { + /** + * Load WordPress dashboard API + */ + require_once(ABSPATH . 'wp-admin/includes/dashboard.php'); + $this->wp_dashboard_setup(); + + wp_enqueue_script('dashboard'); + if (wp_is_mobile()) wp_enqueue_script('jquery-touch-punch'); + + ?> + + +
+ wp_dashboard(); ?> +
+ include_template('wp-admin/dashboard/locked-ip.php', false, array('locked_ip_list' => $locked_ip_list, 'page' => $page, 'tab' => $tab)); + } + + /** + * Renders the submenu's permanent block tab + * + * @return Void + */ + protected function render_permanent_block() { + global $aio_wp_security; + include_once 'wp-security-list-permanent-blocked-ip.php'; // For rendering the AIOWPSecurity_List_Table + $blocked_ip_list = new AIOWPSecurity_List_Blocked_IP(); // For rendering the AIOWPSecurity_List_Table + $tab = isset($_REQUEST["tab"]) ? sanitize_text_field(wp_unslash($_REQUEST["tab"])) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce for tab. + $page = isset($_REQUEST['page']) ? sanitize_text_field(wp_unslash($_REQUEST['page'])) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce for page. + + $aio_wp_security->include_template('wp-admin/dashboard/permanent-block.php', false, array('blocked_ip_list' => $blocked_ip_list, 'page' => $page, 'tab' => $tab)); + } + + /** + * Renders the submenu's audit logs tab + * + * @return void + */ + protected function render_audit_logs() { + global $aio_wp_security; + + // Needed for rendering the audit log table + include_once 'wp-security-list-audit.php'; + $data = array(); + // phpcs:disable WordPress.Security.NonceVerification.Recommended -- PCP warning. Processing form data without nonce verification. No nonce. + if (isset($_GET['event-filter'])) $data['event-filter'] = sanitize_text_field(wp_unslash($_GET['event-filter'])); // Failed logins and logins only to show as audit log + $audit_log_list = new AIOWPSecurity_List_Audit_Log($data); + $tab = isset($_REQUEST["tab"]) ? sanitize_text_field(wp_unslash($_REQUEST["tab"])) : ''; + $page = isset($_REQUEST['page']) ? sanitize_text_field(wp_unslash($_REQUEST['page'])) : ''; + // phpcs:enable WordPress.Security.NonceVerification.Recommended -- PCP warning. Processing form data without nonce verification. No nonce. + + $aio_wp_security->include_template('wp-admin/dashboard/audit-logs.php', false, array('audit_log_list' => $audit_log_list, 'page' => $page, 'tab' => $tab)); + } + + /** + * Renders the submenu's debug logs tab + * + * @return void + */ + protected function render_debug_logs() { + // Needed for rendering the debug log table + include_once 'wp-security-list-debug.php'; + $debug_log_list = new AIOWPSecurity_List_Debug_Log(); + global $aio_wp_security; + $aio_wp_security->include_template('wp-admin/dashboard/debug-logs.php', false, array('debug_log_list' => $debug_log_list)); + } + + /** + * Renders the submenu's premium-upgrade tab body. + * + * @return Void + */ + protected function render_premium_upgrade_tab() { + global $aio_wp_security; + $enqueue_version = (defined('WP_DEBUG') && WP_DEBUG) ? AIO_WP_SECURITY_VERSION.'.'.time() : AIO_WP_SECURITY_VERSION; + wp_enqueue_style('aiowpsec-admin-premium-upgrade-css', AIO_WP_SECURITY_URL.'/css/wp-security-premium-upgrade.css', array(), $enqueue_version); + + echo '
'; + + $aio_wp_security->include_template('wp-admin/dashboard/may-also-like.php'); + + echo '
'; + } + + /** + * Function to customize the layout of the WordPress dashboard. + * Organizes meta-boxes into different containers based on screen columns. + */ + private function wp_dashboard() { + $screen = get_current_screen(); + $columns = absint($screen->get_columns()); + $columns_css = ''; + if ($columns) { + $columns_css = " columns-$columns"; + } + + ?> +
+
+ id, 'normal', ''); ?> +
+
+ id, 'side', ''); ?> +
+
+ id, 'column3', ''); ?> +
+
+ id, 'column4', ''); ?> +
+
+ + configs->get_value('aiowps_enable_brute_force_attack_prevention') + || '1' == $aio_wp_security->configs->get_value('aiowps_enable_rename_login_page') + ) { + wp_add_dashboard_widget('brute_force', __('Brute force prevention login page', 'all-in-one-wp-security-and-firewall'), array($this, 'widget_brute_force')); + } + wp_add_dashboard_widget('logged_in_users', __('Logged in users', 'all-in-one-wp-security-and-firewall'), array($this, 'widget_logged_in_users')); + wp_add_dashboard_widget('locked_ip_addresses', __('Locked IP addresses', 'all-in-one-wp-security-and-firewall'), array($this, 'widget_locked_ip_addresses')); + + do_action('aiowps_dashboard_setup'); + $dashboard_widgets = apply_filters('aiowps_dashboard_widgets', array()); + + foreach ($dashboard_widgets as $widget_id) { + $name = empty($wp_registered_widgets[$widget_id]['all_link']) ? $wp_registered_widgets[$widget_id]['name'] : $wp_registered_widgets[$widget_id]['name'] . " " . __('View all', 'all-in-one-wp-security-and-firewall') . ''; + wp_add_dashboard_widget($widget_id, $name, $wp_registered_widgets[$widget_id]['callback'], $wp_registered_widget_controls[$widget_id]['callback']); + } + } + + public function widget_security_strength_meter() { + global $aiowps_feature_mgr; + $total_site_security_points = $aiowps_feature_mgr->get_total_site_points(); + $total_security_points_achievable = $aiowps_feature_mgr->get_total_achievable_points(); + ?> + + +
+ +
+ +

' . esc_html($total_site_security_points) . ''; ?>

+ +
+ + feature_items; + $pt_src_chart_data = ""; + $pt_src_chart_data .= "['Feature Name', 'Points'],"; + foreach ($feature_items as $item) { + if ($item->is_active()) { + $pt_src_chart_data .= "['" . esc_html($item->feature_name) . "', " . esc_html($item->item_points) . "],"; + } + } + + ?> + + + +
+ +

+

X +

+

+ +

+

+ +

+ +

+

Team UpdraftPlus

+ array( + 'name' => __('Admin username', 'all-in-one-wp-security-and-firewall'), + 'url' => AIOWPSEC_USER_SECURITY_MENU_SLUG, + ), + 'user-login-login-lockdown' => array( + 'name' => __('Login lockout', 'all-in-one-wp-security-and-firewall'), + 'url' => AIOWPSEC_USER_SECURITY_MENU_SLUG . '&tab=login-lockout', + ), + 'filesystem-file-permissions' => array( + 'name' => __('File permission', 'all-in-one-wp-security-and-firewall'), + 'url' => AIOWPSEC_FILESYSTEM_MENU_SLUG, + 'feature_callback' => 'is_main_site' + ), + 'firewall-basic-rules' => array( + 'name' => __('Basic firewall', 'all-in-one-wp-security-and-firewall'), + 'url' => AIOWPSEC_FIREWALL_MENU_SLUG . '&tab=htaccess-rules', + 'feature_callback' => array('AIOWPSecurity_Utility', 'allow_to_write_to_htaccess') + ), + 'db-security-db-prefix' => array( + 'name' => __('Database prefix', 'all-in-one-wp-security-and-firewall'), + 'url' => AIOWPSEC_DB_SEC_MENU_SLUG, + 'feature_callback' => 'is_main_site' + ), + 'filesystem-file-editing' => array( + 'name' => __('PHP file editing', 'all-in-one-wp-security-and-firewall'), + 'url' => AIOWPSEC_FILESYSTEM_MENU_SLUG . '&tab=file-protection', + 'feature_callback' => array('AIOWPSecurity_Utility_Permissions', 'is_main_site_and_super_admin') + ), + 'bf-rename-login-page' => array( + 'name' => __('Renamed login page', 'all-in-one-wp-security-and-firewall'), + 'url' => AIOWPSEC_BRUTE_FORCE_MENU_SLUG, + ), + 'wp-generator-meta-tag' => array( + 'name' => __('Hidden WP meta info', 'all-in-one-wp-security-and-firewall'), + 'url' => AIOWPSEC_SETTINGS_MENU_SLUG . '&tab=wp-version-info', + ), + ); + + $critical_features = apply_filters('aiowps_filter_critical_features_array', $critical_features); + $critical_features = array_filter($critical_features, array($this, 'should_add_feature')); + + esc_html_e('Below is the current status of the critical features that you should activate on your site to achieve a minimum level of recommended security', 'all-in-one-wp-security-and-firewall'); + echo '
'; + foreach ($critical_features as $key => $feature) { + $feature_item = $aiowps_feature_mgr->get_feature_item_by_id($key); + + if (!$feature_item) continue; + + echo ''; + echo '
'; + echo '
' . esc_html($feature['name']) . '
'; + echo '
'; + if ($feature_item->is_active()) { + echo '
'; + } else { + echo '
'; + } + echo '
'; + echo '
'; + echo '
'; + } + echo "
"; + } + + /** + * This outputs the latest logins dashboard widget + * + * @return void + */ + public function widget_last_5_logins() { + global $wpdb; + $audit_log_table = AIOWPSEC_TBL_AUDIT_LOG; + $where_sql = (is_super_admin()) ? '' : ' and site_id = '.get_current_blog_id().' '; + + $last_days = 7; + $days_before_time = strtotime('-'.$last_days.' days', time()); + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- PCP warning. Direct query necessary. + $login_data_lastx_days = $wpdb->get_results( + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- pcp Warning. Ignore. + $wpdb->prepare("SELECT id,created FROM $audit_log_table WHERE event_type = %s $where_sql and created > %s", 'successful_login', $days_before_time), + ARRAY_A + ); // Get the last x days records + + if (!empty($login_data_lastx_days)) { + $chart_data = array(); + $chart_data['columns'] = array(__('Date', 'all-in-one-wp-security-and-firewall'), __('Logins', 'all-in-one-wp-security-and-firewall')); + $chart_data['data'] = $login_data_lastx_days; + $chart_data['last_days'] = $last_days; + $chart_data['id'] = 'logins_last_'.$last_days.'days'; + $this->dashboard_widget_chart($chart_data, 'bar'); + } + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- PCP Error. Ignore. + $data = $wpdb->get_results( + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- PCP error. Ignore. + $wpdb->prepare("SELECT * FROM $audit_log_table WHERE event_type = %s ORDER BY created DESC LIMIT %d", 'successful_login', 5), + ARRAY_A + ); //Get the last 5 records + + if (null == $data) { + echo '

' . esc_html__('No data found.', 'all-in-one-wp-security-and-firewall') . '

'; + } else { + $login_summary_table_data = array(); + //$login_summary_table_data['title'] = __('Last 5 login summary:', 'all-in-one-wp-security-and-firewall'); + $login_summary_table_data['columns'] = array(__('User', 'all-in-one-wp-security-and-firewall'), __('Date', 'all-in-one-wp-security-and-firewall'), 'IP'); + foreach ($data as $entry) { + $login_summary_table_data['data'][] = array($entry['username'], gmdate('Y-m-d H:i:s', $entry['created']), $entry['ip']); + } + $login_summary_table_data = apply_filters('aios_last5_logins_summary', $login_summary_table_data, $data); + $this->dashboard_widget($login_summary_table_data); + + // View all login logs + echo '

' . esc_html__('View all', 'all-in-one-wp-security-and-firewall') . '

'; + } + + echo '
'; + } + + public function widget_maintenance_mode_status() { + global $aio_wp_security; + ?> +

+ configs->get_value('aiowps_site_lockout')) { + echo esc_html__('Maintenance mode is currently enabled.', 'all-in-one-wp-security-and-firewall') . ' ' . esc_html__('Remember to disable it when you are done.', 'all-in-one-wp-security-and-firewall'); + } else { + echo esc_html__('Maintenance mode is currently disabled.', 'all-in-one-wp-security-and-firewall'); + } + ?> +

+ + + + + + +
: +
+ configs->get_value('aiowps_site_lockout')); ?> +
+
+ ' . esc_html__('Configure', 'all-in-one-wp-security-and-firewall') . ''; + } + + public function widget_brute_force() { + global $aio_wp_security; + if ($aio_wp_security->configs->get_value('aiowps_enable_brute_force_attack_prevention') == '1') { + $brute_force_login_feature_link = '' . __('Cookie-based brute force', 'all-in-one-wp-security-and-firewall') . ''; + $brute_force_feature_secret_word = $aio_wp_security->configs->get_value('aiowps_brute_force_secret_word'); + echo '
'; + /* translators: %s: Brute Force Login URL */ + echo '

' . sprintf(esc_html__('The %s feature is currently active.', 'all-in-one-wp-security-and-firewall'), $brute_force_login_feature_link) . '

'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped above. + echo '

' . esc_html__('Your new WordPress login URL is now:', 'all-in-one-wp-security-and-firewall') . '

'; + echo '

' . esc_url(AIOWPSEC_WP_URL) . '/?' . esc_html($brute_force_feature_secret_word) . '=1

'; + echo '
'; //yellow box div + echo '
'; + }// End if statement for Cookie Based Brute Prevention box + + // Insert Rename Login Page feature box if this feature is active + if ($aio_wp_security->configs->get_value('aiowps_enable_rename_login_page') == '1') { + if (get_option('permalink_structure')) { + $home_url = trailingslashit(home_url()); + } else { + $home_url = trailingslashit(home_url()) . '?'; + } + + $rename_login_feature_link = '' . esc_html__('Rename login page', 'all-in-one-wp-security-and-firewall') . ''; + echo '
'; + /* translators: %s: Rename Login URL */ + echo '

' . sprintf(esc_html__('The %s feature is currently active.', 'all-in-one-wp-security-and-firewall'), $rename_login_feature_link) . '

'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped above. + echo '

' . esc_html__('Your new WordPress login URL is now:', 'all-in-one-wp-security-and-firewall') . '

'; + echo '

' . esc_url($home_url) . esc_html($aio_wp_security->configs->get_value('aiowps_login_page_slug')) . '

'; + echo '
'; //yellow box div + echo '
'; + } // End if statement for Rename Login box + } + + /** + * This outputs the logged in users dashboard widget + * + * @return void + */ + public function widget_logged_in_users() { + $users_online_link = ''.esc_html__('Logged in users', 'all-in-one-wp-security-and-firewall').''; + // default display messages + $multiple_users_info_msg = esc_html__('Number of users currently logged into your site (including you) is:', 'all-in-one-wp-security-and-firewall'); + $single_user_info_msg = esc_html__('There are no other users currently logged in.', 'all-in-one-wp-security-and-firewall'); + + if (is_multisite()) { + $current_blog_id = get_current_blog_id(); + $is_main = is_main_site($current_blog_id); + + if (empty($is_main)) { + // Subsite - only get logged in users for this blog_id + $logged_in_users = AIOWPSecurity_User_Login::get_logged_in_users(false); + } else { + // Main site - get sitewide users + $logged_in_users = AIOWPSecurity_User_Login::get_logged_in_users(); + + // If viewing AIOS from multisite main network dashboard, then display a different message + $multiple_users_info_msg = __('Number of users currently logged in site-wide (including you) is:', 'all-in-one-wp-security-and-firewall'); + $single_user_info_msg = __('There are no other site-wide users currently logged in.', 'all-in-one-wp-security-and-firewall'); + } + } else { + $logged_in_users = AIOWPSecurity_User_Login::get_logged_in_users(); + } + + if (empty($logged_in_users)) { + $num_users = 0; + } else { + $num_users = count($logged_in_users); + } + if ($num_users > 1) { + echo '

' . esc_html($multiple_users_info_msg) . ' ' . esc_html($num_users) . '

'; + /* translators: %s: Users Online URL */ + $info_msg = '

' . sprintf(esc_html__('Go to the %s menu to see more details', 'all-in-one-wp-security-and-firewall'), $users_online_link) . '

'; + echo $info_msg . '
'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped above. + } else { + echo '

' . esc_html($single_user_info_msg) . '

'; + } + } + + public function widget_locked_ip_addresses() { + $locked_ips_link = ''. esc_html__('Locked IP addresses', 'all-in-one-wp-security-and-firewall').''; + + $locked_ips = AIOWPSecurity_Utility::get_locked_ips(); + if (false === $locked_ips) { + echo '

' . esc_html__('There are no IP addresses currently locked out.', 'all-in-one-wp-security-and-firewall') . '

'; + } else { + $num_ips = count($locked_ips); + echo '

' . esc_html__('Number of temporarily locked out IP addresses:', 'all-in-one-wp-security-and-firewall') . ' ' . ' ' . esc_html($num_ips) . '

'; + /* translators: %s: Number of locked out IPs */ + $info_msg = '

' . sprintf(esc_html__('Go to the %s menu to see more details', 'all-in-one-wp-security-and-firewall'), $locked_ips_link) . '

'; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped above. + echo $info_msg . '
'; + } + } + + /** + * Determines whether a security feature should be activated based on its callback. + * + * This method checks if a feature should be added by evaluating its callback function. + * If no callback is set, the feature is added by default. If a callback is set, + * it must be callable and return a boolean value. + * + * @param array $feature An array containing feature details with the following keys: + * 'name' => (string) Name of the feature + * 'feature_callback' => (callable|null) Optional callback to determine if feature should be added + * + * @return bool True if the feature should be added, false otherwise + */ + public static function should_add_feature($feature) { + if (empty($feature['feature_callback'])) { + return true; + } elseif (is_callable($feature['feature_callback'])) { + return call_user_func($feature['feature_callback']); + } else { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Part of internal error reporting system. + error_log("Callback function set but not callable (coding error). Feature: " . $feature['name']); + return false; + } + } + + /** + * This function creates summary for dashboard widget in table format + * + * @param array $widget_data title, column names and row data + * + * @return void + */ + private function dashboard_widget($widget_data) { + global $aio_wp_security; + $aio_wp_security->include_template('wp-admin/dashboard/widget-summary.php', false, array('widget_data' => $widget_data)); + } + + /** + * This function creates chart for dashboard widget + * + * @param array $chart_data column names, chart data, last_days and id + * @param string $type bar chart + * + * @return void + */ + private function dashboard_widget_chart($chart_data, $type = 'bar') { + global $aio_wp_security; + $aio_wp_security->include_template('wp-admin/dashboard/widget-'.$type.'-chart.php', false, array('chart_data' => $chart_data)); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-database-menu.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-database-menu.php new file mode 100755 index 00000000..43b07c89 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-database-menu.php @@ -0,0 +1,408 @@ +get_updraftplus_plugin_file_rel_to_plugins_dir(); + + // If UpdraftPlus is installed but not activated, then return activate link. + if ($updraftplus_plugin_file_rel_to_plugins_dir) { + $activate_url = add_query_arg(array( + '_wpnonce' => wp_create_nonce('activate-plugin_'.$updraftplus_plugin_file_rel_to_plugins_dir), + 'action' => 'activate', + 'plugin' => $updraftplus_plugin_file_rel_to_plugins_dir, + ), network_admin_url('plugins.php')); + + // If is network admin then add to link network activation. + if (is_network_admin()) { + $activate_url = add_query_arg(array('networkwide' => 1), $activate_url); + } + return sprintf('%s', + $activate_url, + __('UpdraftPlus is installed but currently not active.', 'all-in-one-wp-security-and-firewall') .' '. __('Follow this link to activate UpdraftPlus, to take a backup.', 'all-in-one-wp-security-and-firewall') + ); + } + + // If UpdraftPlus is not activated or installed, then return the installation link + return ''.__('Follow this link to install UpdraftPlus, to take a database backup.', 'all-in-one-wp-security-and-firewall').''; + } + + /** + * Get path to the UpdraftPlus plugin file relative to the plugins directory. + * + * @return String|false path to the UpdraftPlus plugin file relative to the plugins directory + */ + private function get_updraftplus_plugin_file_rel_to_plugins_dir() { + if (!function_exists('get_plugins')) { + include_once ABSPATH . '/wp-admin/includes/plugin.php'; + } + + $installed_plugins = get_plugins(); + $installed_plugins_keys = array_keys($installed_plugins); + foreach ($installed_plugins_keys as $plugin_file_rel_to_plugins_dir) { + $temp_plugin_file_name = substr($plugin_file_rel_to_plugins_dir, strpos($plugin_file_rel_to_plugins_dir, '/') + 1); + if ('updraftplus.php' == $temp_plugin_file_name) { + return $plugin_file_rel_to_plugins_dir; + } + } + return false; + } + + /** + * This function will setup the menus tabs by setting the array $menu_tabs + * + * @return void + */ + protected function setup_menu_tabs() { + $menu_tabs = array( + 'database-prefix' => array( + 'title' => __('Database prefix', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_database_prefix'), + 'display_condition_callback' => 'is_main_site', + ), + 'database-backup' => array( + 'title' => __('Database backup', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_database_backup'), + ), + ); + + $this->menu_tabs = array_filter($menu_tabs, array($this, 'should_display_tab')); + } + + /** + * Renders the submenu's database prefix tab + * + * @return Void + */ + protected function render_database_prefix() { + global $wpdb, $aio_wp_security, $aiowps_feature_mgr; + $old_db_prefix = $wpdb->prefix; + $new_db_prefix = ''; + $perform_db_change = false; + + if (isset($_POST['aiowps_db_prefix_change'])) { // Do form submission tasks + $nonce = $_REQUEST['_wpnonce']; + if (!wp_verify_nonce($nonce, 'aiowpsec-db-prefix-change-nonce')) { + $aio_wp_security->debug_logger->log_debug("Nonce check failed for DB prefix change operation.", 4); + die(__('Nonce check failed for DB prefix change operation.', 'all-in-one-wp-security-and-firewall')); + } + + // Let's first check if user's system allows writing to wp-config.php file. If plugin cannot write to wp-config we will not do the prefix change. + $config_file = AIOWPSecurity_Utility_File::get_wp_config_file_path(); + $file_write = AIOWPSecurity_Utility_File::is_file_writable($config_file); + if (!$file_write) { + $this->show_msg_error(__('The plugin has detected that it cannot write to the wp-config.php file.', 'all-in-one-wp-security-and-firewall') . ' ' . __('This feature can only be used if the plugin can successfully write to the wp-config.php file.', 'all-in-one-wp-security-and-firewall')); + } else { + if (isset($_POST['aiowps_enable_random_prefix'])) { // User has elected to generate a random DB prefix + $string = AIOWPSecurity_Utility::generate_alpha_random_string('5'); + $new_db_prefix = $string . '_'; + $perform_db_change = true; + } else { + if (empty($_POST['aiowps_new_manual_db_prefix'])) { + $this->show_msg_error(__('Please enter a value for the DB prefix.', 'all-in-one-wp-security-and-firewall')); + } else { + // User has chosen their own DB prefix value + $new_db_prefix = wp_strip_all_tags(trim($_POST['aiowps_new_manual_db_prefix'])); + if ($new_db_prefix !== $_POST['aiowps_new_manual_db_prefix']) { + wp_die("".__('Error:', 'all-in-one-wp-security-and-firewall')." ".__('prefix contains HTML tags', 'all-in-one-wp-security-and-firewall')); + } + if (preg_match('|[^a-z0-9_]|i', $new_db_prefix)) { + wp_die("".__('Error:', 'all-in-one-wp-security-and-firewall')." ".__('prefix contains invalid characters, the prefix should only contain alphanumeric and underscore characters.', 'all-in-one-wp-security-and-firewall')); + } + $error = $wpdb->set_prefix($new_db_prefix); // validate the user chosen prefix + if (is_wp_error($error)) { + wp_die("".__('Error:', 'all-in-one-wp-security-and-firewall')." (".$error->get_error_code()."): ".$error->get_error_message()); + } + $wpdb->set_prefix($old_db_prefix); + $perform_db_change = true; + } + } + } + } + + if ($perform_db_change) { + // Do the DB prefix change operations + $this->change_db_prefix($old_db_prefix, $new_db_prefix); + } + + $aio_wp_security->include_template('wp-admin/database-security/database-prefix.php', false, array('aiowps_feature_mgr' => $aiowps_feature_mgr, 'old_db_prefix' => $old_db_prefix)); + } + + /** + * Renders the submenu's database backup tab + * + * @return Void + */ + protected function render_database_backup() { + global $aio_wp_security; + + $updraftplus_admin = !empty($GLOBALS['updraftplus_admin']) ? $GLOBALS['updraftplus_admin'] : null; + + if ($updraftplus_admin) { + $updraftplus_admin->add_backup_scaffolding(__('Take a database backup using UpdraftPlus', 'all-in-one-wp-security-and-firewall'), array($updraftplus_admin, 'backupnow_modal_contents')); + + } + $install_activate_link = $this->get_install_activate_link_of_updraft_plugin(); + + $aio_wp_security->include_template('wp-admin/database-security/database-backup.php', false, array('install_activate_link' => $install_activate_link)); + } + + /* + * Changes the DB prefix + */ + /** + * This function will change the DB prefix + * + * @param string $table_old_prefix - the old table prefix + * @param string $table_new_prefix - the new table prefix + * + * @return void + */ + private function change_db_prefix($table_old_prefix, $table_new_prefix) { + global $wpdb, $aio_wp_security; + $old_prefix_length = strlen($table_old_prefix); + $error = 0; + + // Config file path + $config_file = AIOWPSecurity_Utility_File::get_wp_config_file_path(); + + // Get the table resource + // $result = mysql_list_tables(DB_NAME); + $result = $this->get_mysql_tables(DB_NAME); //Fix for deprecated php mysql_list_tables function + + // Count the number of tables + if (is_array($result) && count($result) > 0) { + $num_rows = count($result); + } else { + echo '

'.__('Error - Could not get tables or no tables found!', 'all-in-one-wp-security-and-firewall').'

'; + return; + } + $table_count = 0; + $info_msg_string = '

'.__('Starting DB prefix change operations.....', 'all-in-one-wp-security-and-firewall').'

'; + + $info_msg_string .= '

'.sprintf(__('Your WordPress system has a total of %s tables and your new DB prefix will be: %s', 'all-in-one-wp-security-and-firewall'), ''.$num_rows.'', ''.$table_new_prefix.'').'

'; + echo $info_msg_string; + + // Do a back of the config file + if (!AIOWPSecurity_Utility_File::backup_and_rename_wp_config($config_file)) { + echo '

'.__('Failed to make a backup of the wp-config.php file.', 'all-in-one-wp-security-and-firewall') . ' ' .__('This operation will not go ahead.', 'all-in-one-wp-security-and-firewall').'

'; + return; + } else { + echo '

'.__('A backup copy of your wp-config.php file was created successfully!', 'all-in-one-wp-security-and-firewall').'

'; + } + + // Get multisite blog_ids if applicable + if (is_multisite()) { + $blog_ids = AIOWPSecurity_Utility::get_blog_ids(); + } + + // Rename all the table names + foreach ($result as $db_table) { + // Get table name with old prefix + $table_old_name = $db_table; + + if (strpos($table_old_name, $table_old_prefix) === 0) { + // Get table name with new prefix + $table_new_name = AIOWPSecurity_Utility::backquote($table_new_prefix . substr($table_old_name, $old_prefix_length)); + $table_old_name = AIOWPSecurity_Utility::backquote($table_old_name); + + // Write query to rename tables name + $sql = "RENAME TABLE ".$table_old_name." TO ".$table_new_name; + // $sql = "RENAME TABLE %s TO %s"; + + // Execute the query + if (false === $wpdb->query($sql)) { + $error = 1; + echo '

'.sprintf(__('%s table name update failed', 'all-in-one-wp-security-and-firewall'), ''.$table_old_name.'').'

'; + $aio_wp_security->debug_logger->log_debug("DB Security Feature - Unable to change prefix of table ".$table_old_name, 4); + } else { + $table_count++; + } + } else { + continue; + } + } + if (1 == $error) { + echo '

'.sprintf(__('Please change the prefix manually for the above tables to: %s', 'all-in-one-wp-security-and-firewall'), ''.$table_new_prefix.'').'

'; + } else { + echo '

'.sprintf(__('%s tables had their prefix updated successfully!', 'all-in-one-wp-security-and-firewall'), ''.$table_count.'').'

'; + } + + // Let's check for mysql tables of type "view" + $this->alter_table_views($table_old_prefix, $table_new_prefix); + + // Get wp-config.php file contents and modify it with new info + $config_contents = file($config_file); + $prefix_match_string = '$table_prefix='; //this is our search string for the wp-config.php file + foreach ($config_contents as $line_num => $line) { + $no_ws_line = preg_replace('/\s+/', '', $line); //Strip white spaces + if (false !== strpos($no_ws_line, $prefix_match_string)) { + $prefix_parts = explode("=", $line); + $prefix_parts[1] = str_replace($table_old_prefix, $table_new_prefix, $prefix_parts[1]); + $config_contents[$line_num] = implode("=", $prefix_parts); + break; + } + } + // Now let's modify the wp-config.php file + if (AIOWPSecurity_Utility_File::write_content_to_file($config_file, $config_contents)) { + echo '

'. __('wp-config.php file was updated successfully!', 'all-in-one-wp-security-and-firewall').'

'; + } else { + echo '

'.sprintf(__('The "wp-config.php" file was not able to be modified.', 'all-in-one-wp-security-and-firewall').' '.__('Please modify this file manually using your favourite editor and search for variable "$table_prefix" and assign the following value to that variable: %s', 'all-in-one-wp-security-and-firewall'), ''.$table_new_prefix.'').'

'; + $aio_wp_security->debug_logger->log_debug("DB Security Feature - Unable to modify wp-config.php", 4); + } + + // Now let's update the options table + $update_option_table_query = $wpdb->prepare("UPDATE " . $table_new_prefix . "options SET option_name = '".$table_new_prefix ."user_roles' WHERE option_name = %s LIMIT 1", $table_old_prefix."user_roles"); + + if (false === $wpdb->query($update_option_table_query)) { + echo '

'.sprintf(__('Update of table %s failed: unable to change %s to %s', 'all-in-one-wp-security-and-firewall'), $table_new_prefix.'options', $table_old_prefix.'user_roles', $table_new_prefix.'user_roles').'

'; + $aio_wp_security->debug_logger->log_debug("DB Security Feature - Error when updating the options table", 4);//Log the highly unlikely event of DB error + } else { + echo '

'. __('The options table records which had references to the old DB prefix were updated successfully!', 'all-in-one-wp-security-and-firewall') .'

'; + } + + // Now let's update the options tables for the multisite subsites if applicable + if (is_multisite()) { + if (!empty($blog_ids)) { + $main_site_id = get_main_site_id(); + foreach ($blog_ids as $blog_id) { + if ($blog_id == $main_site_id) continue; + $new_pref_and_site_id = $table_new_prefix.$blog_id.'_'; + $old_pref_and_site_id = $table_old_prefix.$blog_id.'_'; + $update_ms_option_table_query = $wpdb->prepare("UPDATE " . $new_pref_and_site_id . "options SET option_name = '".$new_pref_and_site_id."user_roles' WHERE option_name = %s LIMIT 1", $old_pref_and_site_id."user_roles"); + if (false === $wpdb->query($update_ms_option_table_query)) { + echo '

'.sprintf(__('Update of table %s failed: unable to change %s to %s', 'all-in-one-wp-security-and-firewall'), $new_pref_and_site_id.'options', $old_pref_and_site_id.'user_roles', $new_pref_and_site_id.'user_roles').'

'; + $aio_wp_security->debug_logger->log_debug("DB change prefix feature - Error when updating the subsite options table: ".$new_pref_and_site_id.'options', 4);//Log the highly unlikely event of DB error + } else { + echo '

'.sprintf(__('The %s table records which had references to the old DB prefix were updated successfully!', 'all-in-one-wp-security-and-firewall'), $new_pref_and_site_id.'options').'

'; + } + } + } + } + + //Now let's update the user meta table + $custom_sql = "SELECT user_id, meta_key FROM " . $table_new_prefix . "usermeta WHERE meta_key LIKE '" . $table_old_prefix . "%'"; + + $meta_keys = $wpdb->get_results($custom_sql); + + $error_update_usermeta = ''; + + // Update all meta_key field values which have the old table prefix in user_meta table + foreach ($meta_keys as $meta_key) { + // Create new meta key + $new_meta_key = $table_new_prefix . substr($meta_key->meta_key, $old_prefix_length); + + $update_user_meta_sql = $wpdb->prepare("UPDATE " . $table_new_prefix . "usermeta SET meta_key='" . $new_meta_key . "' WHERE meta_key=%s AND user_id=%s", $meta_key->meta_key, $meta_key->user_id); + + if (false === $wpdb->query($update_user_meta_sql)) { + $error_update_usermeta .= '

'.sprintf(__('Error updating user_meta table where new meta_key = %s, old meta_key = %s and user_id = %s.', 'all-in-one-wp-security-and-firewall'), $new_meta_key, $meta_key->meta_key, $meta_key->user_id).'

'; + echo $error_update_usermeta; + $aio_wp_security->debug_logger->log_debug("DB Security Feature - Error updating user_meta table where new meta_key = ".$new_meta_key." old meta_key = ".$meta_key->meta_key." and user_id = ".$meta_key->user_id, 4);//Log the highly unlikely event of DB error + } + } + echo '

'.__('The usermeta table records which had references to the old DB prefix were updated successfully!', 'all-in-one-wp-security-and-firewall').'

'; + // Display tasks finished message + $tasks_finished_msg_string = '

'. __('The database prefix change tasks have been completed.', 'all-in-one-wp-security-and-firewall').'

'; + echo $tasks_finished_msg_string; + } + + /** + * This is an alternative to the deprecated "mysql_list_tables + * + * @param string $database - database name + * + * @returns array - an array of table names + */ + public function get_mysql_tables($database = '') { + global $aio_wp_security; + $tables = array(); + $list_tables_sql = "SHOW TABLES FROM `{$database}`;"; + $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); + + if ($mysqli->connect_errno) { + $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_Database_Menu->get_mysql_tables() - DB connection error.", 4); + return false; + } + + $result = $mysqli->query($list_tables_sql, MYSQLI_USE_RESULT); + if ($result) { + //Alternative way to get the tables + while ($row = $result->fetch_assoc()) { + foreach ($row as $value) { + $tables[] = $value; + } + } + $result->close(); + } + $mysqli->close(); + return $tables; + } + + /** + * Will modify existing table view definitions to reflect the new DB prefix change + * + * @param string $old_db_prefix - old database prefix + * @param string $new_db_prefix - new database prefix + * + * @returns void + */ + private function alter_table_views($old_db_prefix, $new_db_prefix) { + global $wpdb, $aio_wp_security; + $db_name = $wpdb->dbname; + $info_msg_string = '

'.__('Checking for MySQL tables of type "view".....', 'all-in-one-wp-security-and-firewall').'

'; + echo $info_msg_string; + + // get tables which are views + $query = "SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA LIKE '".$db_name."'"; + $res = $wpdb->get_results($query); + if (empty($res)) return; + $view_count = 0; + foreach ($res as $item) { + $old_def = $item->VIEW_DEFINITION; + $new_def = AIOWPSecurity_Utility::str_replace_once($old_db_prefix, $new_db_prefix, $old_def); + $new_def = AIOWPSecurity_Utility::backquote($new_def); + + $view_name = AIOWPSecurity_Utility::backquote($item->TABLE_NAME); + $chg_view_sql = "ALTER VIEW $view_name AS $new_def"; + $view_res = $wpdb->query($chg_view_sql); + if (false === $view_res) { + echo '

'.sprintf(__('Update of the following MySQL view definition failed: %s', 'all-in-one-wp-security-and-firewall'), $old_def).'

'; + $aio_wp_security->debug_logger->log_debug("Update of the following MySQL view definition failed: ".$old_def, 4);//Log the highly unlikely event of DB error + } else { + $view_count++; + } + } + if ($view_count > 0) { + echo '

'.sprintf(__('%s view definitions were updated successfully.', 'all-in-one-wp-security-and-firewall'), ''.$view_count.'').'

'; + } + + return; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-filescan-menu.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-filescan-menu.php new file mode 100755 index 00000000..73dc811c --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-filescan-menu.php @@ -0,0 +1,75 @@ + array( + 'title' => __('File change detection', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_file_change_detect'), + ), + 'malware-scan' => array( + 'title' => __('Malware scan', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_malware_scan'), + ), + ); + + $this->menu_tabs = array_filter($menu_tabs, array($this, 'should_display_tab')); + } + + /** + * File change detection on your system files. + * + * @global $wpdb + * @global $aio_wp_security + * @global $aiowps_feature_mgr + */ + protected function render_file_change_detect() { + global $aio_wp_security; + + $aios_commands = new AIOWPSecurity_Commands(); + + $scanner_data = $aios_commands->get_scanner_data(); + + $aio_wp_security->include_template('wp-admin/scanner/file-change-detect.php', false, $scanner_data); + } + + /** + * Malware code scan on your system files. + * + * @return void + */ + protected function render_malware_scan() { + global $aio_wp_security; + + $aio_wp_security->include_template('wp-admin/scanner/malware-scan.php', false, array()); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-filesystem-menu.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-filesystem-menu.php new file mode 100755 index 00000000..bfc86518 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-filesystem-menu.php @@ -0,0 +1,144 @@ + array( + 'title' => __('File permissions', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_file_permissions'), + 'display_condition_callback' => array('AIOWPSecurity_Utility_Permissions', 'is_main_site_and_super_admin'), + ), + 'file-protection' => array( + 'title' => __('File protection', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_file_protection'), + 'display_condition_callback' => array('AIOWPSecurity_Utility_Permissions', 'is_main_site_and_super_admin'), + ), + 'host-system-logs' => array( + 'title' => __('Host system logs', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_host_system_logs'), + 'display_condition_callback' => array('AIOWPSecurity_Utility_Permissions', 'is_main_site_and_super_admin'), + ), + 'copy-protection' => array( + 'title' => __('Copy protection', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_copy_protection'), + ), + 'frames' => array( + 'title' => __('Frames', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_frames'), + ), + ); + + $this->menu_tabs = array_filter($menu_tabs, array($this, 'should_display_tab')); + } + + /** + * Renders the submenu's file permissions tab + * + * @return Void + */ + protected function render_file_permissions() { + // if this is the case there is no need to display a "fix permissions" button + global $aio_wp_security, $aiowps_feature_mgr; + + $files_dirs_to_check = AIOWPSecurity_Utility_File::get_files_and_dirs_to_check(); + + + $aio_wp_security->include_template('wp-admin/filesystem-security/file-permissions.php', false, array('aiowps_feature_mgr' => $aiowps_feature_mgr, 'files_dirs_to_check' => $files_dirs_to_check, 'file_utility' => new AIOWPSecurity_Utility_File())); + } + + /** + * Renders the submenu's 'File protection' tab + * + * @return void + */ + protected function render_file_protection() { + global $aio_wp_security; + + $show_disallow_file_edit_warning = defined('DISALLOW_FILE_EDIT') && DISALLOW_FILE_EDIT && '1' != $aio_wp_security->configs->get_value('aiowps_disable_file_editing'); + + $aio_wp_security->include_template('wp-admin/filesystem-security/file-protection.php', false, array('show_disallow_file_edit_warning' => $show_disallow_file_edit_warning)); + } + + /** + * Renders the submenu's copy protection tab + * + * @return Void + */ + protected function render_copy_protection() { + global $aio_wp_security; + + $aio_wp_security->include_template('wp-admin/filesystem-security/copy-protection.php', false, array()); + } + + /** + * Renders the submenu's render frames tab + * + * @return Void + */ + protected function render_frames() { + global $aio_wp_security; + + $aio_wp_security->include_template('wp-admin/filesystem-security/frames.php', false, array()); + } + + /** + * Renders the submenu's host system logs tab + * + * @return Void + */ + protected function render_host_system_logs() { + global $aio_wp_security; + $sys_log_file = basename($aio_wp_security->configs->get_value('aiowps_system_log_file')); + $aio_wp_security->include_template('wp-admin/filesystem-security/host-system-logs.php', false, array('sys_log_file' => $sys_log_file)); + } + + /** + * Called via filter admin_footer, this adds the needed javascript to page + * + * @return void + */ + public function filesystem_menu_footer_code() { + ?> + + array( + 'title' => __('PHP rules', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_php_rules'), + ), + 'htaccess-rules' => array( + 'title' => __('.htaccess rules', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_htaccess_rules'), + 'display_condition_callback' => array('AIOWPSecurity_Utility', 'allow_to_write_to_htaccess'), + ), + '6g-firewall' => array( + 'title' => __('6G firewall rules', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_6g_firewall'), + 'display_condition_callback' => array('AIOWPSecurity_Utility_Permissions', 'is_main_site_and_super_admin'), + ), + '5g-firewall' => array( + 'title' => __('5G legacy rules', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_5g_firewall'), + 'display_condition_callback' => array('AIOWPSecurity_Utility', 'render_5g_legacy_tab'), + ), + 'internet-bots' => array( + 'title' => __('Internet bots', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_internet_bots'), + 'display_condition_callback' => array('AIOWPSecurity_Utility_Permissions', 'is_main_site_and_super_admin'), + ), + 'block-and-allow-lists' => array( + 'title' => __('Block & allow lists', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_block_and_allow_lists'), + 'display_condition_callback' => array('AIOWPSecurity_Utility_Permissions', 'is_main_site_and_super_admin'), + ), + 'advanced-settings' => array( + 'title' => __('Advanced settings', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_advanced_settings'), + 'display_condition_callback' => array('AIOWPSecurity_Utility_Permissions', 'is_main_site_and_super_admin'), + ) + ); + + $this->menu_tabs = array_filter($menu_tabs, array($this, 'should_display_tab')); + } + + /** + * Renders the PHP Firewall settings tab + * + * @return void + */ + protected function render_php_rules() { + global $aio_wp_security; + + $aios_commands = new AIOWPSecurity_Commands(); + + $php_firewall_data = $aios_commands->get_php_firewall_data(); + + $aio_wp_security->include_template('wp-admin/firewall/php-firewall-rules.php', false, compact('php_firewall_data')); + } + + /** + * Renders the Htaccess Firewall tab + * + * @return void + */ + protected function render_htaccess_rules() { + global $aio_wp_security; + + $aios_commands = new AIOWPSecurity_Commands(); + + $htaccess_rules_data = $aios_commands->get_htaccess_rules_data(); + + $aio_wp_security->include_template('wp-admin/firewall/htaccess-firewall-rules.php', false, compact('htaccess_rules_data')); + } + + /** + * Renders the 6G Blacklist Firewall Rules tab + * + * @return void + */ + protected function render_6g_firewall() { + global $aio_wp_security; + + $aio_wp_security->include_template('wp-admin/general/moved.php', false, array('key' => '6g')); + } + + /** + * Renders the 5G Blacklist Firewall Rules tab + * + * @return void + */ + protected function render_5g_firewall() { + global $aio_wp_security; + + $aio_wp_security->include_template('wp-admin/firewall/5g.php'); + } + + /** + * Renders the Internet Bots tab + * + * @return void + */ + protected function render_internet_bots() { + global $aio_wp_security; + + $aio_wp_security->include_template('wp-admin/general/moved.php', false, array('key' => 'internet-bots')); + } + + + /** + * Renders the Advanced settings tab. + * + * @return void + */ + protected function render_advanced_settings() { + global $aio_wp_security; + + $aios_commands = new AIOWPSecurity_Commands(); + + $advanced_settings_data = $aios_commands->get_firewall_advanced_settings_data(); + + $aio_wp_security->include_template('wp-admin/firewall/advanced-settings.php', false, compact('advanced_settings_data')); + } + + /** + * Renders ban user tab for blacklist IPs and user agents + * + * @global $aio_wp_security + * @global $aiowps_feature_mgr + * + * @return void + */ + protected function render_block_and_allow_lists() { + global $aio_wp_security; + + $aios_commands = new AIOWPSecurity_Commands(); + + $block_allowlist_data = $aios_commands->get_block_allow_lists_data(); + + $aio_wp_security->include_template('wp-admin/firewall/block-and-allow-lists.php', false, $block_allowlist_data); + } + + /** + * Validates posted user agent list and set, save as config. + * + * @global $aio_wp_security + * @global $aiowps_firewall_config + * + * @param string $banned_user_agents + * + * @return int + */ + private function validate_user_agent_list($banned_user_agents) { + global $aio_wp_security; + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + $submitted_agents = AIOWPSecurity_Utility::splitby_newline_trim_filter_empty($banned_user_agents); + $agents = array_unique(array_filter(array_map('sanitize_text_field', $submitted_agents), 'strlen')); + $aio_wp_security->configs->set_value('aiowps_banned_user_agents', implode("\n", $agents)); + $aiowps_firewall_config->set_value('aiowps_blacklist_user_agents', $agents); + $_POST['aiowps_banned_user_agents'] = ''; // Clear the post variable for the banned address list + return 1; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-firewall-setup-notice.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-firewall-setup-notice.php new file mode 100755 index 00000000..17326037 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-firewall-setup-notice.php @@ -0,0 +1,646 @@ +bootstrap = AIOWPSecurity_Utility_Firewall::get_bootstrap_file(); + $this->wpconfig = AIOWPSecurity_Utility_Firewall::get_wpconfig_file(); + $this->muplugin = AIOWPSecurity_Utility_Firewall::get_muplugin_file(); + AIOWPSecurity_Utility_Firewall::get_firewall_rules_path(true); // Creates the needed directories for the first time. + } + + /** + * Entry point for the dashboard notice + * + * @return void + */ + public function start_firewall_setup() { + + global $aio_wp_security; + + $firewall_files = array( + 'server' => AIOWPSecurity_Utility_Firewall::get_server_file(), + 'bootstrap' => $this->bootstrap, + 'wpconfig' => $this->wpconfig, + 'muplugin' => $this->muplugin, + ); + + //Check each file and update the contents if necessary + foreach ($firewall_files as $name => $file) { + ${'is_firewall_in_'.$name} = false; + + if (AIOWPSecurity_Utility_Firewall::MANUAL_SETUP === $file) { + continue; + } + + ${'is_firewall_in_'.$name} = $file->contains_contents(); + + if (true === ${'is_firewall_in_'.$name}) { + $file->update_contents(); + } + } + + if (!$aio_wp_security->is_aiowps_admin_page()) { + return; + } + + if (AIOWPSecurity_Utility_Firewall::is_firewall_setup()) { + if (true !== $is_firewall_in_server) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UndefinedVariable -- variable is set in the foreach loop + $this->render_upgrade_protection_notice(); + } + } else { + $this->render_automatic_setup_notice(); + } + + $this->render_notices(); + } + + /** + * Will execute when the user presses 'Set up now' button + * + * @return void + */ + public function do_setup() { + + $is_inserted_firewall_file = false; + + $is_inserted_bootstrap_file = $this->bootstrap->contains_contents(); + if (true !== $is_inserted_bootstrap_file) { + $is_inserted_bootstrap_file = $this->bootstrap->insert_contents(); + + if (true !== $is_inserted_bootstrap_file) { + $this->log_wp_error($is_inserted_bootstrap_file); + $this->show_notice(self::NOTICE_BOOTSTRAP); + return; + } + + } + + $firewall_file = AIOWPSecurity_Utility_Firewall::get_server_file(); + + if ($firewall_file instanceof AIOWPSecurity_Block_Userini) { + + $directive = AIOWPSecurity_Utility_Firewall::get_already_set_directive($firewall_file); + + if (!empty($directive)) { + + if (AIOWPSecurity_Utility_Firewall::get_bootstrap_path() === $directive) { + $is_inserted_firewall_file = true; + } else { + $this->show_notice(self::NOTICE_DIRECTIVE_SET, array('directive' => $directive)); + } + + } else { + $is_inserted_firewall_file = $firewall_file->insert_contents(); + } + + } else { + + if (AIOWPSecurity_Utility_Firewall::MANUAL_SETUP !== $firewall_file) { + $is_inserted_firewall_file = $firewall_file->insert_contents(); // attempts to insert firewall into required file + } + } + + //Set up the firewall in the wp-config file + $is_inserted_wpconfig = $this->wpconfig->contains_contents(); + if (true !== $is_inserted_wpconfig) { + $is_inserted_wpconfig = $this->wpconfig->insert_contents(); + } + $this->log_wp_error($is_inserted_wpconfig); + + //Set up the firewall in the mu-plugin + $is_inserted_muplugin = $this->muplugin->contains_contents(); + if (true !== $is_inserted_muplugin) { + $is_inserted_muplugin = $this->muplugin->insert_contents(); + } + if (false === $is_inserted_muplugin) { + $this->log_wp_error(new \WP_Error( + 'file-mu-plugin-failed', + 'Unable to create the mu-plugin', + $this->muplugin + )); + } + $this->log_wp_error($is_inserted_muplugin); + + if (true === $is_inserted_firewall_file) { + $this->show_notice(self::NOTICE_INSTALLED); + } else { + $this->log_wp_error($is_inserted_firewall_file); + $this->show_notice(self::NOTICE_MANUAL); + } + + } + + /** + * Dismisses the notice. + * + * @return void + */ + private function do_dismiss() { + global $aio_wp_security; + + $aio_wp_security->configs->set_value('aios_firewall_dismiss', true, true); + } + + /** + * Checks whether the notice is dismissed + * + * @return boolean + */ + private function is_dismissed() { + global $aio_wp_security; + return (true === $aio_wp_security->configs->get_value('aios_firewall_dismiss')); + + } + + /** + * Handles the form submission for the 'Set up now' notice + * + * @return void + */ + public function handle_setup_form() { + $nonce = isset($_POST['_wpnonce']) ? $_POST['_wpnonce'] : ''; + $result = AIOWPSecurity_Utility_Permissions::check_nonce_and_user_cap($nonce, 'aiowpsec-firewall-setup'); + if (!is_wp_error($result)) { + $this->do_setup(); + $this->do_redirect(); + } + } + + /** + * Handles the dismiss form + * + * @return void + */ + public function handle_dismiss_form() { + $nonce = isset($_POST['_wpnonce']) ? $_POST['_wpnonce'] : ''; + $result = AIOWPSecurity_Utility_Permissions::check_nonce_and_user_cap($nonce, 'aiowpsec-firewall-setup-dismiss'); + if (!is_wp_error($result)) { + $this->do_dismiss(); + $this->do_redirect(); + } + } + + /** + * Handles the form that downgrades the firewall's protection. + * + * @return void + */ + public function handle_downgrade_protection_form() { + $nonce = isset($_POST['_wpnonce']) ? $_POST['_wpnonce'] : ''; + $result = AIOWPSecurity_Utility_Permissions::check_nonce_and_user_cap($nonce, 'aiowpsec-firewall-downgrade'); + if (!is_wp_error($result)) { + AIOWPSecurity_Utility_Firewall::remove_firewall(); + $this->do_redirect(); + } + } + + /** + * Handles the redirect + * + * @return void + */ + private function do_redirect() { + + // Go back to the previous page and tab if set + if (isset($_POST['_wp_http_referer'])) { + + $matches = array(); + if (preg_match('/\?page='.AIOWPSEC_MENU_SLUG_PREFIX.'(?.*)(&tab=(?.*))?$/m', $_POST['_wp_http_referer'], $matches)) { + $url = 'admin.php?page='.AIOWPSEC_MENU_SLUG_PREFIX; + + if (isset($matches['page'])) { + $url .= sanitize_text_field($matches['page']); + + if (isset($matches['tab'])) { + $url .= '&tab='.sanitize_text_field($matches['tab']); + } + } + + AIOWPSecurity_Utility::redirect_to_url(admin_url(sanitize_url($url))); + } + + } + + AIOWPSecurity_Utility::redirect_to_url(admin_url('admin.php?page='.AIOWPSEC_MENU_SLUG_PREFIX)); + } + + /** + * Wrapper function to log WP_Errors to debug log + * + * @param WP_Error $wp_error - Our error which gets logged + * @return void + */ + private function log_wp_error($wp_error) { + + if (is_wp_error($wp_error)) { + global $aio_wp_security; + + $error_message = $wp_error->get_error_message(); + $error_message .= ' - '; + $error_message .= $wp_error->get_error_data(); + $aio_wp_security->debug_logger->log_debug($error_message, 4); + } + } + + /** + * Sets the flags to show notices + * + * @param string $type - the type of notice we want to set + * @param array $values - any values that need to be passed + * @return void + */ + private function show_notice($type, $values = array()) { + global $aio_wp_security; + + $aio_wp_security->configs->set_value('firewall_notice_'.$type, true); + + if (!empty($values)) { + $aio_wp_security->configs->set_value('firewall_notice_values', $values); + } + + $aio_wp_security->configs->save_config(); + } + + /** + * Renders any necessary notices + * + * @return void + */ + public function render_notices() { + global $aio_wp_security; + + $notices = array( + self::NOTICE_BOOTSTRAP, + self::NOTICE_MANUAL, + self::NOTICE_INSTALLED, + self::NOTICE_DIRECTIVE_SET, + ); + + foreach ($notices as $notice) { + if ($aio_wp_security->configs->get_value('firewall_notice_'.$notice)) { + + switch ($notice) { + case self::NOTICE_BOOTSTRAP: + $this->render_bootstrap_notice(); + break; + case self::NOTICE_MANUAL: + if (!$this->any_pending_notices(self::NOTICE_MANUAL)) { + $this->render_manual_setup_notice(); + } + break; + case self::NOTICE_INSTALLED: + $this->render_firewall_installed_notice(); + break; + case self::NOTICE_DIRECTIVE_SET: + $values = $aio_wp_security->configs->get_value('firewall_notice_values'); + $this->render_userini_directive_set_notice($values['directive']); + $aio_wp_security->configs->delete_value('firewall_notice_values'); + break; + } + + $aio_wp_security->configs->delete_value('firewall_notice_'.$notice); + } + } + + $aio_wp_security->configs->save_config(); + } + + /** + * Detects if we have any notices pending to display + * + * @param string ...$exclude - do not check the status of these notices + * + * @return boolean + */ + private function any_pending_notices(...$exclude) { + global $aio_wp_security; + + $notices = array( + self::NOTICE_BOOTSTRAP, + self::NOTICE_MANUAL, + self::NOTICE_INSTALLED, + self::NOTICE_DIRECTIVE_SET, + ); + $notices = array_diff($notices, $exclude); + + foreach ($notices as $notice) { + if (true === $aio_wp_security->configs->get_value('firewall_notice_'.$notice)) { + return true; + } + } + + return false; + } + + /** + * Notice is shown if we are unable to write to the bootstrap file + * + * @return void + */ + private function render_bootstrap_notice() { + ?> +
+

+ +

+

+

+

+

+ bootstrap, PATHINFO_BASENAME)); + ?> +

+
bootstrap); ?>
+

+
bootstrap->get_contents()); ?>
+

+ render_try_again_button(); + $this->render_manual_notice_footer(); + } + + /** + * Notice is shown if auto_prepend_file directive is already set in user.ini + * + * @param string $directive_value + * @return void + */ + private function render_userini_directive_set_notice($directive_value) { + + $firewall_file = AIOWPSecurity_Utility_Firewall::get_server_file(); + + $this->render_manual_notice_header(); + ?> +

+ +

+

+ + +

+ +

+ +

+ +

+
+ + +

+ +

+
get_contents()); ?>
+

+ +

+ render_try_again_button(); + $this->render_manual_notice_footer(); + } + + /** + * Shows when the firewall has successfully installed + * + * @return void + */ + private function render_firewall_installed_notice() { + global $aio_wp_security; + + $aio_wp_security->include_template('notices/firewall-installed-notice.php', false); + } + + /** + * Renders the 'manual setup' dashboard notice + * + * @return void + */ + private function render_manual_setup_notice() { + + $firewall_file = AIOWPSecurity_Utility_Firewall::get_server_file(); + + if (AIOWPSecurity_Utility_Firewall::MANUAL_SETUP === $firewall_file) { + //Show users how to manually add the firewall via php.ini if we can't detect their server + $bootstrap_path = AIOWPSecurity_Utility_Firewall::get_bootstrap_path(); + + $this->render_manual_notice_header(); + ?> +

+ +

+

+ +

+
+

+ +

+ render_manual_notice_footer(); + } else { + //Show users how to manually add the firewall via their own server file + $this->render_manual_notice_header(); + $firewall_file_name = pathinfo($firewall_file, PATHINFO_BASENAME); + ?> +

+ +

+

+

+ +

+
get_contents()); ?>
+

+ +

+ render_try_again_button(); + $this->render_manual_notice_footer(); + } + } + + /** + * The header for notices that require manual intervention + * + * @return void + */ + private function render_manual_notice_header() { + ?> +
+

+ +

+

+ +

+

+ +

+ +

+ +

+
+ +
+ + +
+ +
+
+ should_not_show_notice()) { + return; + } + ?> +
+
+ + +

+ + +

+ +
+

+
+ +
+ + is_dismissed() && !AIOWPSecurity_Utility_Firewall::is_firewall_page()) { + return true; + } + + if ($this->any_pending_notices()) { + return true; //only display if there are no other notices waiting to be displayed + } + + return false; + } + + /** + * Renders the 'Set up now' dashboard notice + * + * @return void + */ + private function render_automatic_setup_notice() { + global $aio_wp_security; + + if ($this->should_not_show_notice()) { + return; + } + $aio_wp_security->include_template('notices/firewall-setup-notice.php', false, array('show_dismiss' => !AIOWPSecurity_Utility_Firewall::is_firewall_page())); + } + + /** + * Ensures only one instance of the class can be created (singleton) + * + * @return AIOWPSecurity_Firewall_Setup_Notice|null + */ + public static function get_instance() { + + if (null === self::$instance) { + self::$instance = new self(); + } + + return self::$instance; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-404.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-404.php new file mode 100755 index 00000000..2780ad93 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-404.php @@ -0,0 +1,362 @@ + 'item', //singular name of the listed records + 'plural' => 'items', //plural name of the listed records + 'ajax' => false //does this table support ajax? + )); + } + + /** + * Returns created column in datetime format as per user setting time zone. + * + * @param array $item - data for the columns on the current row + * + * @return string - the datetime + */ + public function column_created($item) { + return AIOWPSecurity_Utility::convert_timestamp($item['created']); + } + + public function column_default($item, $column_name) { + return $item[$column_name]; + } + + /** + * Returns id column html to be rendered. + * + * @param array $item - data for the columns on the current row + * + * @return string - html string for column rendered + */ + public function column_id($item) { + $ip = $item['ip_or_host']; + + $is_locked = AIOWPSecurity_Utility::check_locked_ip($ip, '404'); + $blacklist_tab = 'blacklist'; + $is_blacklist = AIOWPSecurity_Utility::check_blacklist_ip($ip); + $actions = array(); + $actions['delete'] = '' . __('Delete', 'all-in-one-wp-security-and-firewall') . ''; + + if ($is_locked) { + // Build row actions for locked items + $actions['unblock'] = '' . __('Unblock', 'all-in-one-wp-security-and-firewall') . ''; + } elseif ($is_blacklist) { + $unblock_url_nonce = wp_nonce_url(sprintf('admin.php?page=%s&tab=%s', AIOWPSEC_FIREWALL_MENU_SLUG, $blacklist_tab), "404_log_item_action", "aiowps_nonce"); + $actions = array( + 'unblock' => ''.__('Unblock', 'all-in-one-wp-security-and-firewall').'', + ); + } else { + // Build row actions for other items + $actions['temp_block'] = '' . __('Temporarily block', 'all-in-one-wp-security-and-firewall') . ''; + $actions['blacklist_ip'] = '' . __('Blacklist IP', 'all-in-one-wp-security-and-firewall') . ''; + } + + //Return the user_login contents + return sprintf('%1$s %2$s', + /* $1%s */ $item['id'], + /* $2%s */ $this->row_actions($actions) + ); + } + + /** + * Returns status column html to be rendered. + * + * @param array $item - data for the columns on the current row + * + * @return string - html string for column rendered + */ + public function column_status($item) { + global $aio_wp_security; + $ip = $item['ip_or_host']; + //Check if this IP address is locked + $is_locked = AIOWPSecurity_Utility::check_locked_ip($ip, '404'); + $blacklisted_string = $aio_wp_security->configs->get_value('aiowps_banned_ip_addresses'); + $banned = strpos($blacklisted_string, $ip); + + if (false !== $banned) { + return 'blacklisted'; + } elseif ($is_locked) { + return 'temporarily blocked'; + } else { + return ''; + } + } + + /** + * Returns checkbox column html to be rendered. + * + * @param array $item - data for the columns on the current row + * + * @return string - html string for column rendered + */ + public function column_cb($item) { + return sprintf('', + /* $1%s */ $this->_args['singular'], //Let's simply repurpose the table's singular label + /* $2%s */ $item['id'] //The value of the checkbox should be the record's id + ); + } + + public function get_columns() { + $columns = array( + 'cb' => '', //Render a checkbox + 'id' => 'ID', + 'event_type' => __('Event type', 'all-in-one-wp-security-and-firewall'), + 'ip_or_host' => __('IP address', 'all-in-one-wp-security-and-firewall'), + 'url' => __('Attempted URL', 'all-in-one-wp-security-and-firewall'), + 'referer_info' => __('Referer', 'all-in-one-wp-security-and-firewall'), + 'created' => __('Date and time', 'all-in-one-wp-security-and-firewall'), + 'status' => __('Lock status', 'all-in-one-wp-security-and-firewall'), + ); + $columns = apply_filters('list_404_get_columns', $columns); + return $columns; + } + + public function get_sortable_columns() { + $sortable_columns = array( + 'id' => array('id', false), + 'event_type' => array('event_type', false), + 'ip_or_host' => array('ip_or_host', false), + 'url' => array('url', false), + 'referer_info' => array('referer_info', false), + 'created' => array('created', false), + ); + $sortable_columns = apply_filters('list_404_get_sortable_columns', $sortable_columns); + return $sortable_columns; + } + + /** + * Get bulk actions for the current WordPress screen. + * + * @return array An associative array of bulk actions where the keys are action names + * and the values are the corresponding action labels. + */ + public function get_bulk_actions() { + return array( + //'unlock' => 'Unlock', + 'bulk_block_ip' => __('Temporarily block IP', 'all-in-one-wp-security-and-firewall'), + 'bulk_blacklist_ip' => __('Blacklist IP', 'all-in-one-wp-security-and-firewall'), + 'delete' => __('Delete', 'all-in-one-wp-security-and-firewall') + ); + } + + /** + * Process bulk actions for the current WordPress screen. + * + * This method checks for the presence of a valid nonce and user capabilities, + * then performs the appropriate action based on the selected bulk action. + * + * @return void + */ + private function process_bulk_action() { + // phpcs:disable WordPress.Security.NonceVerification.Recommended -- PCP warning. This is the nonce. + if (empty($_REQUEST['_wpnonce']) || !isset($_REQUEST['_wp_http_referer'])) return; + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- PCP warning. Ignore. + $result = AIOWPSecurity_Utility_Permissions::check_nonce_and_user_cap($_REQUEST['_wpnonce'], 'bulk-items'); + if (is_wp_error($result)) return; + + if ('bulk_block_ip' === $this->current_action()) {//Process delete bulk actions + if (!isset($_REQUEST['item'])) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('Please select some records using the checkboxes', 'all-in-one-wp-security-and-firewall')); + } else { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- PCP warning, ignore. Sanitized later. + $this->block_ip(wp_unslash($_REQUEST['item'])); + } + } + + if ('bulk_blacklist_ip' === $this->current_action()) {//Process delete bulk actions + if (!isset($_REQUEST['item'])) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('Please select some records using the checkboxes', 'all-in-one-wp-security-and-firewall')); + } else { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- PCP warning, ignore. Sanitized later. + $this->blacklist_ip_address(wp_unslash($_REQUEST['item'])); + } + } + if ('delete' === $this->current_action()) {//Process delete bulk actions + if (!isset($_REQUEST['item'])) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('Please select some records using the checkboxes', 'all-in-one-wp-security-and-firewall')); + } else { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- PCP warning, ignore. Sanitized later. + $this->delete_404_event_records(wp_unslash($_REQUEST['item'])); + } + } + // phpcs:enable WordPress.Security.NonceVerification.Recommended -- PCP warning. This is the nonce. + } + + /** + * Locks an IP address by adding it to the AIOWPSEC_TBL_LOGIN_LOCKOUT table. + * + * @param array|string $entries - ids that correspond to ip addresses in the AIOWPSEC_TBL_EVENTS table or a single ip address + * @param string $username - (optional)username of user being locked + * + * @return boolean|void + */ + public function block_ip($entries, $username = '') { + global $wpdb; + if (is_array($entries)) { + //lock multiple records + $entries = array_filter($entries, 'is_numeric'); //discard non-numeric ID values + $id_list = "(" .implode(",", $entries) .")"; //Create comma separate list for DB operation + $events_table = AIOWPSEC_TBL_EVENTS; + // phpcs:ignore WordPress.DB.PreparedSQL, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $results = $wpdb->get_col("SELECT ip_or_host FROM $events_table WHERE ID IN " . $id_list); + if (empty($results)) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('Could not process the request because the IP addresses for the selected entries could not be found.', 'all-in-one-wp-security-and-firewall')); + return false; + } else { + foreach ($results as $entry) { + if (filter_var($entry, FILTER_VALIDATE_IP)) { + AIOWPSecurity_Utility::lock_IP($entry, '404', $username); + } + } + } + AIOWPSecurity_Admin_Menu::show_msg_updated_st(__('The selected IP addresses are now temporarily blocked.', 'all-in-one-wp-security-and-firewall')); + } + } + + /** + * Permanently blocks an IP address by adding it to the blacklist and writing rules to the htaccess file. + * + * @param array|string $entries - ids that correspond to ip addresses in the AIOWPSEC_TBL_EVENTS table or a single ip address + * + * @return boolean|void + */ + public function blacklist_ip_address($entries) { + global $wpdb, $aio_wp_security; + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + $bl_ip_addresses = $aio_wp_security->configs->get_value('aiowps_banned_ip_addresses'); //get the currently saved blacklisted IPs + $ip_list_array = AIOWPSecurity_Utility_IP::create_ip_list_array_from_string_with_newline($bl_ip_addresses); + + if (is_array($entries)) { + //Get the selected IP addresses + $entries = array_filter($entries, 'is_numeric'); //discard non-numeric ID values + $id_list = "(" .implode(",", $entries) .")"; //Create comma separate list for DB operation + $events_table = AIOWPSEC_TBL_EVENTS; + // phpcs:ignore WordPress.DB.PreparedSQL, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $results = $wpdb->get_col("SELECT ip_or_host FROM $events_table WHERE ID IN " . $id_list); + if (empty($results)) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('Could not process the request because the IP addresses for the selected entries could not be found.', 'all-in-one-wp-security-and-firewall')); + return false; + } else { + foreach ($results as $entry) { + $ip_list_array[] = $entry; + } + } + } + + $validated_ip_list_array = AIOWPSecurity_Utility_IP::validate_ip_list($ip_list_array, 'blacklist'); + if (is_wp_error($validated_ip_list_array)) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(nl2br($validated_ip_list_array->get_error_message())); + } else { + $banned_ip_data = implode("\n", $validated_ip_list_array); + $aio_wp_security->configs->set_value('aiowps_enable_blacklisting', '1'); // Force blacklist feature to be enabled. + $aio_wp_security->configs->set_value('aiowps_banned_ip_addresses', $banned_ip_data); + $aio_wp_security->configs->save_config(); + + $aiowps_firewall_config->set_value('aiowps_blacklist_ips', $validated_ip_list_array); + AIOWPSecurity_Admin_Menu::show_msg_updated_st(__('The selected IP addresses have been added to the blacklist and will be permanently blocked.', 'all-in-one-wp-security-and-firewall')); + } + } + + /** + * Deletes one or more records from the AIOWPSEC_TBL_EVENTS table. + * + * @param array|string|integer $entries - ids or a single id + * + * @return void|string + */ + public function delete_404_event_records($entries) { + global $wpdb, $aio_wp_security; + $events_table = AIOWPSEC_TBL_EVENTS; + if (is_array($entries)) { + //Delete multiple records + $entries = array_map('esc_sql', $entries); //escape every array element + $entries = array_filter($entries, 'is_numeric'); //discard non-numeric ID values + $id_list = "(" . implode(",", $entries) . ")"; //Create comma separate list for DB operation + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $result = $wpdb->query("DELETE FROM " . $events_table . " WHERE id IN " . $id_list); + if ($result) { + AIOWPSecurity_Admin_Menu::show_msg_record_deleted_st(); + } else { + // Error on bulk delete + $aio_wp_security->debug_logger->log_debug('Database error occurred when deleting rows from Events table. Database error: '.$wpdb->last_error, 4); + AIOWPSecurity_Admin_Menu::show_msg_record_not_deleted_st(); + } + } + } + + /** + * Retrieves all items from AIOWPSEC_TBL_EVENTS according to a search term inside $_REQUEST['s'] and only '404' events if there is no search term. It then assigns to $this->items. + * + * @param Boolean $ignore_pagination - whether to not paginate + * + * @return Void + */ + public function prepare_items($ignore_pagination = false) { + /** + * First, lets decide how many records per page to show + */ + $per_page = 100; + $columns = $this->get_columns(); + $hidden = array(); + $sortable = $this->get_sortable_columns(); + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. Nonce checked in previous function. + $search_term = isset($_REQUEST['s']) ? sanitize_text_field(wp_unslash($_REQUEST['s'])) : ''; + + $this->_column_headers = array($columns, $hidden, $sortable); + + $this->process_bulk_action(); + + global $wpdb; + $events_table_name = AIOWPSEC_TBL_EVENTS; + + // Ordering parameters + // Parameters that are going to be used to order the result + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce. + $orderby = isset($_GET['orderby']) ? sanitize_text_field(wp_unslash($_GET['orderby'])) : ''; + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce. + $order = isset($_GET['order']) ? sanitize_text_field(wp_unslash($_GET['order'])) : ''; + + $orderby = !empty($orderby) ? esc_sql($orderby) : 'id'; + $order = !empty($order) ? esc_sql($order) : 'DESC'; + + $orderby = AIOWPSecurity_Utility::sanitize_value_by_array($orderby, $sortable); + $order = AIOWPSecurity_Utility::sanitize_value_by_array($order, array('DESC' => '1', 'ASC' => '1')); + + if (empty($search_term)) { + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $data = $wpdb->get_results("SELECT * FROM $events_table_name WHERE `event_type` = '404' ORDER BY $orderby $order", ARRAY_A); + } else { + // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.LikeWildcardsInQueryWithPlaceholder, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $data = $wpdb->get_results($wpdb->prepare("SELECT * FROM $events_table_name WHERE `ip_or_host` LIKE '%%%s%%' OR `url` LIKE '%%%s%%' OR `referer_info` LIKE '%%%s%%' ORDER BY $orderby $order", $wpdb->esc_like($search_term), $wpdb->esc_like($search_term), $wpdb->esc_like($search_term)), ARRAY_A); + } + + if (!$ignore_pagination) { + $current_page = $this->get_pagenum(); + $total_items = count($data); + $data = array_slice($data, (($current_page - 1) * $per_page), $per_page); + $this->set_pagination_args(array( + 'total_items' => $total_items, //WE have to calculate the total number of items + 'per_page' => $per_page, //WE have to determine how many items to show on a page + 'total_pages' => ceil($total_items / $per_page) //WE have to calculate the total number of pages + )); + } + + foreach ($data as $index => $row) { + // Insert an empty status column - we will use later + $data[$index]['status'] = ''; + } + + $this->items = $data; + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-audit.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-audit.php new file mode 100755 index 00000000..4c5c1702 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-audit.php @@ -0,0 +1,527 @@ + 'item', // singular name of the listed records + 'plural' => 'items', // plural name of the listed records + 'ajax' => true, // does this table support ajax? + 'data' => $data // Request data + )); + + } + + /** + * Returns the default column item + * + * @param object $item - item from which column data is returned + * @param string $column_name - column name to be fetched from item + * @return string + */ + public function column_default($item, $column_name) { + return $item[$column_name]; + } + + /** + * Returns cb column html to be rendered. + * + * @param array $item - data for the columns on the current row + * + * @return string - the html to be rendered + */ + public function column_cb($item) { + return sprintf( + '', + /* $1%s */ $this->_args['singular'], // Let's simply repurpose the table's singular label + /* $2%s */ $item['id'] // The value of the checkbox should be the record's id + ); + } + + /** + * Returns created column html to be rendered. + * + * @param array $item Data for the columns on the current row. + * + * @return string The html to be rendered. + */ + public function column_created($item) { + $actions = array( + 'delete' => '' . esc_html__('Delete', 'all-in-one-wp-security-and-firewall') . '' + ); + + return AIOWPSecurity_Utility::convert_timestamp($item['created']) . '' . $this->row_actions($actions); + } + + /** + * Returns ip column html to be rendered. + * + * @param array $item Data for the columns on the current row. + * + * @return string The html to be rendered. + */ + public function column_ip($item) { + $ip = $item['ip']; + + $unblacklist_ip_warning_translation = __('Are you sure you want to unblacklist this IP address?', 'all-in-one-wp-security-and-firewall'); + $unlock_ip_warning_translation = __('Are you sure you want to unlock this IP address?', 'all-in-one-wp-security-and-firewall'); + $lock_ip_warning_translation = __('Are you sure you want to temporarily lock this IP address?', 'all-in-one-wp-security-and-firewall'); + $blacklist_ip_warning_translation = __('Are you sure you want to blacklist this IP address?', 'all-in-one-wp-security-and-firewall'); + + // Build row actions. + if (AIOWPSecurity_Utility_Permissions::is_main_site_and_super_admin() && AIOWPSecurity_Utility::check_blacklist_ip($ip)) { + $actions = array( + 'unblacklist' => '' . esc_html__('Unblacklist', 'all-in-one-wp-security-and-firewall') . '', + ); + } elseif (AIOWPSecurity_Utility::check_locked_ip($ip, 'audit-log')) { + $actions = array( + 'unlock' => '' . esc_html__('Unlock', 'all-in-one-wp-security-and-firewall') . '', + ); + } else { + $actions = array( + 'lock_ip' => '' . esc_html__('Lock IP', 'all-in-one-wp-security-and-firewall') . '', + ); + + if (AIOWPSecurity_Utility_Permissions::is_main_site_and_super_admin()) { + $actions['blacklist_ip'] = '' . esc_html__('Blacklist IP', 'all-in-one-wp-security-and-firewall') . ''; + } + } + + return $ip . '' . $this->row_actions($actions); + } + + /** + * Returns event type column html to be rendered. + * + * @param array $item - data for the columns on the current row + * + * @return string - the html to be rendered + */ + public function column_event_type($item) { + if (empty($item['event_type'])) return __('No event type available.', 'all-in-one-wp-security-and-firewall'); + + $output = isset(AIOWPSecurity_Audit_Events::$event_types[$item['event_type']]) ? AIOWPSecurity_Audit_Events::$event_types[$item['event_type']] : $item['event_type']; + + return $output; + } + + /** + * Returns details column html to be rendered. + * + * @param array $item - data for the columns on the current row + * + * @return string - the html to be rendered + */ + public function column_details($item) { + $details = json_decode($item['details'], true); + + if (!is_array($details)) return $item['details']; + + $key = array_keys($details)[0]; + + if (method_exists("AIOWPSecurity_Audit_Text_Handler", "{$key}_to_text")) { + return call_user_func("AIOWPSecurity_Audit_Text_Handler::{$key}_to_text", $details[$key]); + } + + return $item['details']; + } + + /** + * Returns stack trace column html to be rendered. + * + * @param array $item - data for the columns on the current row + * + * @return string - the html to be rendered + */ + public function column_stacktrace($item) { + if (empty($item['stacktrace'])) return __('No stack trace available.', 'all-in-one-wp-security-and-firewall'); + + if (is_serialized($item['stacktrace'])) { + $stacktrace = AIOWPSecurity_Utility::unserialize($item['stacktrace']); + } else { + $stacktrace = $item['stacktrace']; + } + ob_start(); + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_var_dump -- Part of error reporting system. + var_dump($stacktrace); + $stacktrace_output = ob_get_contents(); + ob_end_clean(); + + $output = sprintf('%s', $item['id'], esc_html__('Stack trace', 'all-in-one-wp-security-and-firewall'), esc_html__('Show trace', 'all-in-one-wp-security-and-firewall')); + $output .= sprintf('', $item['id'], htmlspecialchars($stacktrace_output)); + + return $output; + } + + /** + * Sets the columns for the table + * + * @return array + */ + public function get_columns() { + $columns = array( + 'cb' => '', //Render a checkbox + 'created' => __('Date and time', 'all-in-one-wp-security-and-firewall'), + 'level' => __('Level', 'all-in-one-wp-security-and-firewall'), + 'network_id' => __('Network ID', 'all-in-one-wp-security-and-firewall'), + 'site_id' => __('Site ID', 'all-in-one-wp-security-and-firewall'), + 'username' => __('Username', 'all-in-one-wp-security-and-firewall'), + 'ip' => __('IP', 'all-in-one-wp-security-and-firewall'), + 'event_type' => __('Event', 'all-in-one-wp-security-and-firewall'), + 'details' => __('Details', 'all-in-one-wp-security-and-firewall'), + 'stacktrace' => __('Stack trace', 'all-in-one-wp-security-and-firewall') + ); + $columns = apply_filters('list_auditlogs_get_columns', $columns); + return $columns; + } + + /** + * Sets which of the columns the table data can be sorted by + * + * @return array + */ + public function get_sortable_columns() { + $sortable_columns = array( + 'created' => array('created', false), + 'network_id' => array('network_id', false), + 'site_id' => array('site_id', false), + 'level' => array('level', false), + 'username' => array('username', false), + 'ip' => array('ip', false), + 'event_type' => array('event_type', false), + 'details' => array('details', false), + 'stacktrace' => array('stacktrace', false) + ); + $sortable_columns = apply_filters('list_auditlogs_get_sortable_columns', $sortable_columns); + return $sortable_columns; + } + + /** + * This function will display a list of bulk actions for the list table + * + * @return array + */ + public function get_bulk_actions() { + $actions = array( + 'delete_all' => __('Delete all', 'all-in-one-wp-security-and-firewall'), + 'delete_selected' => __('Delete selected', 'all-in-one-wp-security-and-firewall'), + 'delete_filtered' => __('Delete filtered', 'all-in-one-wp-security-and-firewall') + ); + return $actions; + } + + /** + * This function will process the bulk action request, $search_term and $filters are only used if the user is trying to bulk delete the filtered items + * + * @param string $search_term - The search term used for filtering records. + * @param array $filters - An array containing filters applied to the records. + * @param string $action - The bulk action to be performed. + * @param array $items - An array of record IDs on which the action will be performed. Default is an empty array. + * + * @return void + */ + private function process_bulk_action($search_term, $filters, $action, $items = array()) { + global $wpdb; + + if ('delete_selected' === $action) { // Process delete bulk actions + if (!isset($items)) { + AIOS_Helper::set_message('aios_list_message', __('Please select some records using the checkboxes', 'all-in-one-wp-security-and-firewall'), 'error'); + } else { + $this->delete_audit_event_records($items); + } + } elseif ('delete_filtered' === $action) { + if (!empty($filters) || '' !== $search_term) { + $audit_log_tbl = AIOWPSEC_TBL_AUDIT_LOG; + $where_sql = $this->get_audit_list_where_sql($search_term, $filters); + // phpcs:ignore WordPress.DB.PreparedSQL, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $results = $wpdb->get_results("SELECT id FROM {$audit_log_tbl} {$where_sql}", 'ARRAY_A'); + $items = array_column($results, 'id'); + $this->delete_audit_event_records($items); + } else { + AIOS_Helper::set_message('aios_list_message', __('Please select the level or the event type filter or filter by a search term', 'all-in-one-wp-security-and-firewall'), 'error'); + } + } elseif ('delete_all' === $action) { + $this->delete_audit_event_records(null, true); + } + } + + /** + * Outputs extra controls to be displayed between bulk actions and pagination + * + * @param string $which - where we are outputting content (top or bottom) + * + * @return void + */ + protected function extra_tablenav($which) { + switch ($which) { + case 'top': + ?> +
+ + + +
+ query($delete_command); + } elseif (is_array($entries)) { + // Delete multiple records + $entries = array_map('esc_sql', $entries); // Escape every array element + $entries = array_filter($entries, 'is_numeric'); // Discard non-numeric ID values + $chunks = array_chunk($entries, 1000); + + $site_id_where_sql = (!is_super_admin()) ? ' AND site_id = ' . get_current_blog_id() : ''; + + // Processing each chunk + foreach ($chunks as $chunk) { + $id_list = "(" . implode(",", $chunk) . ")"; // Create comma separate list for DB operation + $delete_command = "DELETE FROM " . $audit_log_tbl . " WHERE id IN " . $id_list . $site_id_where_sql; + // phpcs:ignore WordPress.DB.PreparedSQL, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $result = $wpdb->query($delete_command); + if (!$result) { + $aio_wp_security->debug_logger->log_debug('Database error occurred when deleting rows from Audit log table. Database error: '.$wpdb->last_error, 4); + AIOS_Helper::set_message('aios_list_message', __('The selected record(s) have failed to delete.', 'all-in-one-wp-security-and-firewall'), 'error'); + return; + } + } + } elseif (!empty($entries)) { + // Delete single record + $site_id_where_sql = (!is_super_admin()) ? ' AND site_id = ' . get_current_blog_id() : ''; + $delete_command = "DELETE FROM " . $audit_log_tbl . " WHERE id = '" . absint($entries) . "'" . $site_id_where_sql; + // phpcs:ignore WordPress.DB.PreparedSQL, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $result = $wpdb->query($delete_command); + } + + if ($result || 0 < $result) { + $aios_list_message = __('The selected record(s) has been deleted successfully.', 'all-in-one-wp-security-and-firewall'); + AIOS_Helper::set_message('aios_list_message', $aios_list_message); + } else { + $aios_list_message = __('The selected record(s) have failed to delete.', 'all-in-one-wp-security-and-firewall'); + $aio_wp_security->debug_logger->log_debug('Database error occurred when deleting rows from Audit log table. Database error: '.$wpdb->last_error, 4); + AIOS_Helper::set_message('aios_list_message', $aios_list_message, 'error'); + } + + return $aios_list_message; + } + + /** + * This function will build and return the SQL WHERE statement + * + * @param string $search_term - the search term applied + * @param array $filters - the filters applied + * + * @return string - the SQL WHERE statement + */ + private function get_audit_list_where_sql($search_term, $filters) { + + $where_sql = ''; + + if ('' == $search_term) { + $where_sql = (!is_super_admin()) ? 'WHERE site_id = '.get_current_blog_id() : ''; + $extra_where = ''; + + if (!empty($filters)) { + $where_sql = empty($where_sql) ? 'WHERE ' : $where_sql . ' AND '; + foreach ($filters as $filter => $value) { + if (!empty($extra_where)) $extra_where .= ' AND '; + $extra_where .= "`{$filter}` = '".esc_sql($value)."'"; + } + } + + $where_sql .= $extra_where; + } else { + $where_sql = (!is_super_admin()) ? 'WHERE site_id = '.get_current_blog_id().' AND ' : 'WHERE '; + $extra_where = ''; + + if (!empty($filters)) { + foreach ($filters as $filter => $value) { + if (!empty($extra_where)) $extra_where .= ' AND '; + $extra_where .= "`{$filter}` = '".esc_sql($value)."'"; + } + $where_sql .= $extra_where . ' AND ('; + $extra_where = ''; + } + + // We don't use FILTER_VALIDATE_IP here as we want to be able to search for partial IP's + if (preg_match('/^[0-9a-f:\.]+$/i', $search_term)) { + $extra_where .= "`ip` LIKE '".esc_sql($search_term)."%'"; + } + + if (in_array($search_term, AIOWPSecurity_Audit_Events::$log_levels) && !isset($filters['level'])) { + if (!empty($extra_where)) $extra_where .= ' OR '; + $extra_where .= "`level` = '".esc_sql($search_term)."'"; + } + + if (!empty($extra_where)) $extra_where .= ' OR '; + if (isset($filters['event_type'])) { + $extra_where .= "`username` LIKE '".esc_sql($search_term)."%'"; + } else { + $extra_where .= "(`username` LIKE '".esc_sql($search_term)."%' or `event_type` LIKE '%".esc_sql($search_term)."%')"; + } + if (!empty($filters)) $extra_where .= ')'; + + $where_sql .= $extra_where; + } + + return $where_sql; + } + + /** + * Grabs the data from database and handles the pagination + * + * @param boolean $ignore_pagination - whether to not paginate + * + * @return void + */ + public function prepare_items($ignore_pagination = false) { + /** + * First, lets decide how many records per page to show + */ + $no_action = -1; + $per_page = defined('AIOWPSEC_AUDIT_LOG_PER_PAGE') ? absint(AIOWPSEC_AUDIT_LOG_PER_PAGE) : 100; + $per_page = empty($per_page) ? 100 : $per_page; + $current_page = $this->get_pagenum(); + $offset = (!$ignore_pagination && $per_page > 0) ? ($current_page - 1) * $per_page : 0; + $columns = $this->get_columns(); + $hidden = array('id'); // we really don't need the IDs of the log entries displayed + if (!is_multisite()) { + $hidden[] = 'network_id'; + $hidden[] = 'site_id'; + } + $sortable = $this->get_sortable_columns(); + $filters = array(); + if (isset($this->_args['data']['level-filter']) && $no_action != $this->_args['data']['level-filter']) $filters['level'] = sanitize_text_field($this->_args['data']['level-filter']); + if (isset($this->_args['data']['event-filter']) && $no_action != $this->_args['data']['event-filter']) $filters['event_type'] = sanitize_text_field($this->_args['data']['event-filter']); + $search_term = isset($this->_args['data']['s']) ? sanitize_text_field(stripslashes($this->_args['data']['s'])) : ''; + + $this->_column_headers = array($columns, $hidden, $sortable); + + $items = array(); + + if (isset($this->_args['data']['items'])) { + if (is_array($this->_args['data']['items'])) { + foreach ($this->_args['data']['items'] as $item) { + $sanitized_item = sanitize_text_field($item); + $items[] = $sanitized_item; + } + } else { + $sanitized_item = sanitize_text_field($this->_args['data']['items']); + $items[] = $sanitized_item; + } + } else { + $items = null; + } + + if (isset($this->_args['data']['action'])) $action = sanitize_text_field($this->_args['data']['action']); + else $action = $no_action; + + if (isset($action) && $no_action !== $action) { + $this->process_bulk_action($search_term, $filters, $action, $items); + } + + global $wpdb; + + $audit_log_tbl = AIOWPSEC_TBL_AUDIT_LOG; + + // Parameters that are going to be used to order the result + isset($this->_args['data']["orderby"]) ? $orderby = wp_strip_all_tags($this->_args['data']["orderby"]) : $orderby = ''; + isset($this->_args['data']["order"]) ? $order = wp_strip_all_tags($this->_args['data']["order"]) : $order = ''; + // By default show the most recent audit log entries. + $orderby = !empty($orderby) ? esc_sql($orderby) : 'created'; + $order = !empty($order) ? esc_sql($order) : 'DESC'; + + $orderby = AIOWPSecurity_Utility::sanitize_value_by_array($orderby, $sortable); + $order = AIOWPSecurity_Utility::sanitize_value_by_array($order, array('DESC' => '1', 'ASC' => '1')); + + $orderby = sanitize_sql_orderby($orderby); + $order = sanitize_sql_orderby($order); + + $where_sql = $this->get_audit_list_where_sql($search_term, $filters); + + // phpcs:ignore WordPress.DB.PreparedSQL, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $total_items = $wpdb->get_var("SELECT COUNT(*) FROM {$audit_log_tbl} {$where_sql}"); + if ($ignore_pagination) { + // phpcs:ignore WordPress.DB.PreparedSQL, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $data = $wpdb->get_results("SELECT * FROM {$audit_log_tbl} {$where_sql} ORDER BY {$orderby} {$order}", 'ARRAY_A'); + } else { + // phpcs:ignore WordPress.DB.PreparedSQL, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $data = $wpdb->get_results("SELECT * FROM {$audit_log_tbl} {$where_sql} ORDER BY {$orderby} {$order} LIMIT {$per_page} OFFSET {$offset}", 'ARRAY_A'); + } + + // Filter the 'details' section + foreach ($data as $key => $entry) { + $details = json_decode($entry['details'], true); + $details = is_null($details) ? $entry['details'] : $details; // check if the decode worked, if not pass the json string + $data[$key]['details'] = wp_json_encode(apply_filters('aios_audit_filter_details', $details, $entry['event_type'])); + } + + $this->items = $data; + + if ($ignore_pagination) return; + + $this->set_pagination_args(array( + 'total_items' => $total_items, // We have to calculate the total number of items + 'per_page' => $per_page, // We have to determine how many items to show on a page + 'total_pages' => ceil($total_items / $per_page) // We have to calculate the total number of pages + )); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-comment-spammer-ip.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-comment-spammer-ip.php new file mode 100755 index 00000000..1c48ccc9 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-comment-spammer-ip.php @@ -0,0 +1,221 @@ + 'item', // singular name of the listed records + 'plural' => 'items', // plural name of the listed records + 'ajax' => false // does this table support ajax? + )); + + } + + public function column_default($item, $column_name) { + return $item[$column_name]; + } + + public function column_comment_author_IP($item) { + //Build row actions + if (!is_main_site() || 'blocked' === $item['status']) { + //Suppress the block link if site is a multi site AND not the main site or the status is blocked + $actions = array(); //blank array + } else { + //Add IP to block URL + $ip = $item['comment_author_IP']; + $actions = array( + 'block' => ''.__('Block', 'all-in-one-wp-security-and-firewall').'', + ); + } + + //Return the user_login contents + return sprintf('%1$s %2$s', + /*$1%s*/ $item['comment_author_IP'], + /*$2%s*/ $this->row_actions($actions) + ); + } + + + public function column_cb($item) { + return sprintf( + '', + /*$1%s*/ $this->_args['singular'], //Let's simply repurpose the table's singular label + /*$2%s*/ esc_attr($item['comment_author_IP']) //The value of the checkbox should be the record's id + ); + } + + public function get_columns() { + $columns = array( + 'cb' => '', //Render a checkbox + 'comment_author_IP' => __('Spammer IP', 'all-in-one-wp-security-and-firewall'), + 'amount' => __('Number of spam comments from this IP', 'all-in-one-wp-security-and-firewall'), + 'status' => __('Status', 'all-in-one-wp-security-and-firewall'), + ); + return $columns; + } + + public function get_sortable_columns() { + $sortable_columns = array( + 'comment_author_IP' => array('comment_author_IP',false), + 'amount' => array('amount',false), + 'status' => array('status',false), + ); + return $sortable_columns; + } + + public function get_bulk_actions() { + if (!is_main_site()) { + //Suppress the block link if site is a multi site AND not the main site + $actions = array(); //blank array + } else { + $actions = array( + 'block' => __('Block', 'all-in-one-wp-security-and-firewall') + ); + } + return $actions; + } + + /** + * This function handles bulk actions on the table + * + * @return void + */ + private function process_bulk_action() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This IS the nonce check. + if (empty($_REQUEST['_wpnonce']) || !isset($_REQUEST['_wp_http_referer'])) return; + // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput -- This IS the nonce check. + $result = AIOWPSecurity_Utility_Permissions::check_nonce_and_user_cap($_REQUEST['_wpnonce'], 'bulk-items'); + if (is_wp_error($result)) return; + + + if ('block' === $this->current_action()) { + //Process block bulk actions + if (!isset($_REQUEST['item'])) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Nonce already checked above. + $error_msg = '

'; + $error_msg .= esc_html__('Please select some records using the checkboxes', 'all-in-one-wp-security-and-firewall'); + $error_msg .= '

'; + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. Output already escaped. + echo $error_msg; + } else { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Nonce already checked above. + $this->block_spammer_ip_records((filter_var(wp_unslash($_REQUEST['item']), FILTER_VALIDATE_IP))); + } + } + } + + + + /** + * This function will add the selected IP addresses to the blacklist. + * + * @param int|array $entries - either an array of IDs or a single ID of ip to be blocked + * + * @return void + */ + public function block_spammer_ip_records($entries) { + if (is_array($entries)) { + $entries = array_map('esc_sql', $entries); // Escape every array element + //Bulk selection using checkboxes were used + foreach ($entries as $ip_add) { + AIOWPSecurity_Blocking::add_ip_to_block_list($ip_add, 'spam'); + } + } + + AIOWPSecurity_Admin_Menu::show_msg_updated_st(__('The selected IP addresses are now permanently blocked.', 'all-in-one-wp-security-and-firewall')); + } + + /** + * This function prepare the items rendered on the table + * + * @return void + */ + public function prepare_items() { + //First, lets decide how many records per page to show + $per_page = 100; + $columns = $this->get_columns(); + $hidden = array(); + $sortable = $this->get_sortable_columns(); + + $this->_column_headers = array($columns, $hidden, $sortable); + + $this->process_bulk_action(); + + global $wpdb; + global $aio_wp_security; + $minimum_comments_per_ip = $aio_wp_security->configs->get_value('aiowps_spam_ip_min_comments'); + if (empty($minimum_comments_per_ip)) { + $minimum_comments_per_ip = 5; + } + // Ordering parameters + //Parameters that are going to be used to order the result + isset($_GET["orderby"]) ? $orderby = wp_strip_all_tags(wp_unslash($_GET["orderby"])) : $orderby = ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- No nonce to check. + isset($_GET["order"]) ? $order = wp_strip_all_tags(wp_unslash($_GET["order"])) : $order = ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- No nonce to check. + + $orderby = !empty($orderby) ? esc_sql($orderby) : 'amount'; + $order = !empty($order) ? esc_sql($order) : 'DESC'; + + $orderby = AIOWPSecurity_Utility::sanitize_value_by_array($orderby, $sortable); + $order = AIOWPSecurity_Utility::sanitize_value_by_array($order, array('DESC' => '1', 'ASC' => '1')); + + // status is not a key in the database so we don't want to sort the database results, but sort the array later + if ('status' == $orderby) { + $sql = $wpdb->prepare("SELECT comment_author_IP, COUNT(*) AS amount + FROM $wpdb->comments + WHERE comment_approved = 'spam' + GROUP BY comment_author_IP + HAVING amount >= %d + ", $minimum_comments_per_ip); + } else { + // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $orderby cannot be prepared. + $sql = $wpdb->prepare("SELECT comment_author_IP, COUNT(*) AS amount + FROM $wpdb->comments + WHERE comment_approved = 'spam' + GROUP BY comment_author_IP + HAVING amount >= %d + ORDER BY $orderby $order + ", $minimum_comments_per_ip); + // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $orderby cannot be prepared. + } + + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- Preparing done in conditional above. + $data = $wpdb->get_results($sql, ARRAY_A); + + // Get all permanently blocked IP addresses + $block_list = AIOWPSecurity_Blocking::get_list_blocked_ips(); + + foreach ($data as $key => $value) { + if (in_array($value['comment_author_IP'], $block_list)) { + $data[$key]['status'] = 'blocked'; + } else { + $data[$key]['status'] = 'not blocked'; + } + } + + if ('status' == $orderby) { + $keys = array_column($data, 'status'); + if ('asc' == $order) { + array_multisort($keys, SORT_ASC, SORT_STRING, $data); + } else { + array_multisort($keys, SORT_DESC, SORT_STRING, $data); + } + } + + $current_page = $this->get_pagenum(); + $total_items = count($data); + $data = array_slice($data, (($current_page - 1) * $per_page), $per_page); + $this->items = $data; + $this->set_pagination_args(array( + 'total_items' => $total_items, //WE have to calculate the total number of items + 'per_page' => $per_page, //WE have to determine how many items to show on a page + 'total_pages' => ceil($total_items / $per_page) //WE have to calculate the total number of pages + )); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-debug.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-debug.php new file mode 100755 index 00000000..4b3d221d --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-debug.php @@ -0,0 +1,149 @@ + 'entry', //singular name of the listed records + 'plural' => 'entries', //plural name of the listed records + 'ajax' => false //does this table support ajax? + )); + + } + + /** + * Returns logtime column in datetime format as per user setting time zone. + * + * @param array $item - data for the columns on the current row + * + * @return string - the datetime + */ + public function column_logtime($item) { + return AIOWPSecurity_Utility::convert_timestamp($item['logtime']); + } + + /** + * This function renders a default column item + * + * @param array $item - Item object + * @param string $column_name - Column name to be rendered from item object + * + * @return mixed - data to be rendered for column + */ + public function column_default($item, $column_name) { + return $item[$column_name]; + } + + /** + * Sets the columns for the table + * + * @return array + */ + public function get_columns() { + return array( + 'logtime' => __('Date and time', 'all-in-one-wp-security-and-firewall'), + 'level' => __('Level', 'all-in-one-wp-security-and-firewall'), + 'network_id' => __('Network ID', 'all-in-one-wp-security-and-firewall'), + 'site_id' => __('Site ID', 'all-in-one-wp-security-and-firewall'), + 'message' => __('Message', 'all-in-one-wp-security-and-firewall'), + 'type' => __('Type', 'all-in-one-wp-security-and-firewall') + ); + } + + /** + * Sets which of the columns the table data can be sorted by + * + * @return array + */ + public function get_sortable_columns() { + return array( + 'logtime' => array('logtime', false), + 'level' => array('level', false), + 'network_id' => array('network_id', false), + 'site_id' => array('site_id', false), + 'message'=>array('message', false), + 'type' => array('type', false) + ); + } + + /** + * Grabs the data from database and handles the pagination + * + * @param boolean $ignore_pagination - whether to not paginate + * + * @return void + */ + public function prepare_items($ignore_pagination = false) { + /** + * First, lets decide how many records per page to show + */ + if (defined('AIOWPSEC_DEBUG_LOG_PER_PAGE')) { + $per_page = absint(AIOWPSEC_DEBUG_LOG_PER_PAGE); + } + + $per_page = empty($per_page) ? 15 : $per_page; + $current_page = $this->get_pagenum(); + $offset = ($current_page - 1) * $per_page; + $columns = $this->get_columns(); + $hidden = array('id'); // we really don't need the IDs of the log entries displayed + if (!is_multisite()) { + $hidden[] = 'network_id'; + $hidden[] = 'site_id'; + } + $sortable = $this->get_sortable_columns(); + + $this->_column_headers = array($columns, $hidden, $sortable); + + global $wpdb; + + $debug_log_tbl = AIOWPSEC_TBL_DEBUG_LOG; + + /* -- Ordering parameters -- */ + + //Parameters that are going to be used to order the result + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce. + isset($_GET["orderby"]) ? $orderby = sanitize_text_field(wp_unslash($_GET["orderby"])) : $orderby = ''; + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce. + isset($_GET["order"]) ? $order = sanitize_text_field(wp_unslash($_GET["order"])) : $order = ''; + + // By default show the most recent debug log entries. + $orderby = !empty($orderby) ? esc_sql($orderby) : 'logtime'; + $order = !empty($order) ? esc_sql($order) : 'DESC'; + + $orderby = AIOWPSecurity_Utility::sanitize_value_by_array($orderby, $sortable); + $order = AIOWPSecurity_Utility::sanitize_value_by_array($order, array('DESC' => '1', 'ASC' => '1')); + + $orderby = sanitize_sql_orderby($orderby); + $order = sanitize_sql_orderby($order); + + $where_sql = (!is_super_admin()) ? 'WHERE site_id = '.get_current_blog_id() : ''; + + if ($ignore_pagination) { + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $data = $wpdb->get_results("SELECT * FROM {$debug_log_tbl}$where_sql ORDER BY $orderby $order", 'ARRAY_A'); + } else { + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $data = $wpdb->get_results("SELECT * FROM {$debug_log_tbl} $where_sql ORDER BY $orderby $order LIMIT $per_page OFFSET $offset", 'ARRAY_A'); + } + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $total_items = $wpdb->get_var("SELECT COUNT(*) FROM {$debug_log_tbl} $where_sql"); + $this->items = $data; + + if ($ignore_pagination) return; + + $this->set_pagination_args(array( + 'total_items' => $total_items, //WE have to calculate the total number of items + 'per_page' => $per_page, //WE have to determine how many items to show on a page + 'total_pages' => ceil($total_items / $per_page) //WE have to calculate the total number of pages + )); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-locked-ip.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-locked-ip.php new file mode 100755 index 00000000..a0d92106 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-locked-ip.php @@ -0,0 +1,318 @@ + 'item', //singular name of the listed records + 'plural' => 'items', //plural name of the listed records + 'ajax' => false //does this table support ajax? + )); + + } + + /** + * Returns created column in datetime format as per user setting time zone. + * + * @param array $item - data for the columns on the current row + * + * @return string - the datetime + */ + public function column_created($item) { + return AIOWPSecurity_Utility::convert_timestamp($item['created']); + } + + /** + * Returns released column in datetime format as per user setting time zone. + * + * @param array $item - data for the columns on the current row + * + * @return string - the datetime + */ + public function column_released($item) { + return AIOWPSecurity_Utility::convert_timestamp($item['released']); + } + + /** + * This function renders a column + * + * @param array $item - Item object + * @param string $column_name - Column name to be rendered from item object + * + * @return string - data to be rendered for column_name + */ + public function column_default($item, $column_name) { + return $item[$column_name]; + } + + /** + * Function to populate the locked ip actions column in the table + * + * @param array $item - Contains the current item data + * + * @return string + */ + public function column_failed_login_ip($item) { + $actions = array( + 'unlock' => ''.esc_html__('Unlock', 'all-in-one-wp-security-and-firewall').'', + 'delete' => ''.esc_html__('Delete', 'all-in-one-wp-security-and-firewall').'', + ); + + //Return the user_login contents + return sprintf('%1$s %2$s', + /*$1%s*/ $item['failed_login_ip'], + /*$2%s*/ $this->row_actions($actions) + ); + } + + + /** + * This function renders the checkbox column + * + * @param array $item - item object + * + * @return string + */ + public function column_cb($item) { + return sprintf( + '', + /*$1%s*/ $this->_args['singular'], //Let's simply repurpose the table's singular label + /*$2%s*/ $item['id'] //The value of the checkbox should be the record's id + ); + } + + /** + * Returns ip_lookup_result column html to be rendered. + * + * @param array $item - data for the columns on the current row + * + * @return string - the html to be rendered + */ + public function column_ip_lookup_result($item) { + if (empty($item['ip_lookup_result'])) return __('There is no IP lookup result available.', 'all-in-one-wp-security-and-firewall'); + + $ip_lookup_result = json_decode($item['ip_lookup_result'], true); + + // check that the json decode worked + if (null === $ip_lookup_result) return __('There is no IP lookup result available.', 'all-in-one-wp-security-and-firewall'); + + foreach ($ip_lookup_result as $key => $value) { + $ip_lookup_result[$key] = empty($value) ? __('Not Found', 'all-in-one-wp-security-and-firewall') : $value; + } + + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_print_r -- PCP warning. Part of error reporting system. + $ip_lookup_result = print_r($ip_lookup_result, true); + + $output = sprintf('%s', esc_attr($item['id']), esc_html__('IP lookup result', 'all-in-one-wp-security-and-firewall'), esc_html__('Show result', 'all-in-one-wp-security-and-firewall')); + $output .= sprintf('', esc_attr($item['id']), esc_html($ip_lookup_result)); + + return $output; + } + + /** + * Sets the columns for the table + * + * @return array + */ + public function get_columns() { + return array( + 'cb' => '', //Render a checkbox + 'failed_login_ip' => __('Locked IP/range', 'all-in-one-wp-security-and-firewall'), + 'user_id' => __('User ID', 'all-in-one-wp-security-and-firewall'), + 'user_login' => __('Username', 'all-in-one-wp-security-and-firewall'), + 'lock_reason' => __('Reason', 'all-in-one-wp-security-and-firewall'), + 'created' => __('Date locked', 'all-in-one-wp-security-and-firewall'), + 'released' => __('Release date', 'all-in-one-wp-security-and-firewall'), + 'ip_lookup_result' => __('IP lookup result', 'all-in-one-wp-security-and-firewall') + ); + } + + /** + * This function returns sortable columns + * + * @return array[] + */ + public function get_sortable_columns() { + return array( + 'failed_login_ip' => array('failed_login_ip',false), + 'user_id' => array('user_id',false), + 'user_login' => array('user_login',false), + 'lock_reason' => array('lock_reason',false), + 'created' => array('created',false), + 'released' => array('released',false) + ); + } + + /** + * This returns the bulk actions for the table + * + * @return array + */ + public function get_bulk_actions() { + return array( + 'unlock' => __('Unlock', 'all-in-one-wp-security-and-firewall'), + 'delete' => __('Delete', 'all-in-one-wp-security-and-firewall'), + ); + } + + /** + * Process bulk actions. + * + * @return void + */ + private function process_bulk_action() { + // phpcs:disable WordPress.Security.NonceVerification.Recommended -- PCP warning. This is the nonce. + if (empty($_REQUEST['_wpnonce']) || !isset($_REQUEST['_wp_http_referer'])) return; + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- PCP warning. This is the nonce. + $result = AIOWPSecurity_Utility_Permissions::check_nonce_and_user_cap($_REQUEST['_wpnonce'], 'bulk-items'); + if (is_wp_error($result)) return; + + if ('delete' == $this->current_action()) { // Process delete bulk actions + if (!isset($_REQUEST['item'])) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('Please select some records using the checkboxes', 'all-in-one-wp-security-and-firewall')); + } else { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- PCP warning. Sanitized later. + $this->delete_lockout_records(wp_unslash($_REQUEST['item'])); + } + } + + if ('unlock' == $this->current_action()) { //Process unlock bulk actions + if (!isset($_REQUEST['item'])) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('Please select some records using the checkboxes', 'all-in-one-wp-security-and-firewall')); + } else { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- PCP warning. Sanitized later. + $this->unlock_ips((wp_unslash($_REQUEST['item']))); + } + } + // phpcs:enable WordPress.Security.NonceVerification.Recommended -- PCP warning. This is the nonce. + } + + /** + * Unlocks multiple IP addresses by modifying the released column of records in the AIOWPSEC_TBL_LOGIN_LOCKOUT table. + * + * @param array $entries IDs that correspond to IP addresses in the AIOWPSEC_TBL_LOGIN_LOCKOUT table. + * + * @return void + */ + public function unlock_ips($entries) { + global $wpdb; + + $lockout_table = AIOWPSEC_TBL_LOGIN_LOCKOUT; + + // Unlock multiple records + $entries = array_filter($entries, 'is_numeric'); // Discard non-numeric ID values + $id_list = '(' .implode(',', $entries) .')'; // Create comma separate list for DB operation + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $result = $wpdb->query("UPDATE $lockout_table SET `released` = UNIX_TIMESTAMP() WHERE `id` IN $id_list"); + + if (null != $result) { + AIOWPSecurity_Admin_Menu::show_msg_updated_st(__('The selected IP entries were unlocked successfully.', 'all-in-one-wp-security-and-firewall')); + } + } + + /** + * Deletes one or more records from the AIOWPSEC_TBL_LOGIN_LOCKOUT table. + * + * @param array|string|integer $entries - ids or a single id + * + * @return void|string + */ + public function delete_lockout_records($entries) { + global $wpdb, $aio_wp_security; + $lockout_table = AIOWPSEC_TBL_LOGIN_LOCKOUT; + if (is_array($entries)) { + // Delete multiple records + $entries = array_filter($entries, 'is_numeric'); //discard non-numeric ID values + $id_list = "(" .implode(",", $entries) .")"; //Create comma separate list for DB operation + $delete_command = "DELETE FROM ".$lockout_table." WHERE id IN ".$id_list; + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $result = $wpdb->query($delete_command); + if ($result) { + AIOWPSecurity_Admin_Menu::show_msg_record_deleted_st(); + } else { + // Error on bulk delete + $aio_wp_security->debug_logger->log_debug('Database error occurred when deleting rows from login lockout table. Database error: '.$wpdb->last_error, 4); + AIOWPSecurity_Admin_Menu::show_msg_record_not_deleted_st(); + } + } elseif (null != $entries) { + // Delete single record + $delete_command = "DELETE FROM ".$lockout_table." WHERE id = '".absint($entries)."'"; + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $result = $wpdb->query($delete_command); + if ($result) { + return AIOWPSecurity_Admin_Menu::show_msg_record_deleted_st(true); + } elseif (false === $result) { + // Error on single delete + $aio_wp_security->debug_logger->log_debug('Database error occurred when deleting rows from login lockout table. Database error: '.$wpdb->last_error, 4); + return AIOWPSecurity_Admin_Menu::show_msg_record_not_deleted_st(true); + } + } + } + + /** + * Retrieves all items from AIOWPSEC_TBL_LOGIN_LOCKOUT. It may paginate and then assigns to $this->items. + * + * @param Boolean $ignore_pagination - whether to not paginate + * + * @return Void + */ + public function prepare_items($ignore_pagination = false) { + global $wpdb; + + $lockout_table = AIOWPSEC_TBL_LOGIN_LOCKOUT; + + $this->process_bulk_action(); + + // How many records per page to show + $per_page = 100; + $columns = $this->get_columns(); + $hidden = array(); + $sortable = $this->get_sortable_columns(); + + $this->_column_headers = array($columns, $hidden, $sortable); + + // Parameters that are going to be used to order the result + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce. + $orderby = isset($_GET['orderby']) ? sanitize_text_field(wp_unslash($_GET['orderby'])) : ''; + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce. + $order = isset($_GET['order']) ? sanitize_text_field(wp_unslash($_GET['order'])) : ''; + + $orderby = !empty($orderby) ? esc_sql($orderby) : 'created'; + $order = !empty($order) ? esc_sql($order) : 'DESC'; + + $orderby = AIOWPSecurity_Utility::sanitize_value_by_array($orderby, $sortable); + $order = AIOWPSecurity_Utility::sanitize_value_by_array($order, array('DESC' => '1', 'ASC' => '1')); + + $current_page = $this->get_pagenum(); + $offset = ($current_page - 1) * $per_page; + + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $total_items = $wpdb->get_var("SELECT COUNT(*) FROM {$lockout_table} WHERE `released` > UNIX_TIMESTAMP()"); + + if ($ignore_pagination) { + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $data = $wpdb->get_results("SELECT * FROM {$lockout_table} WHERE `released` > UNIX_TIMESTAMP() ORDER BY {$orderby} {$order}", 'ARRAY_A'); + } else { + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $data = $wpdb->get_results("SELECT * FROM {$lockout_table} WHERE `released` > UNIX_TIMESTAMP() ORDER BY {$orderby} {$order} LIMIT {$per_page} OFFSET {$offset}", 'ARRAY_A'); + } + + $this->items = $data; + + if ($ignore_pagination) return; + + $this->set_pagination_args(array( + 'total_items' => $total_items, // WE have to calculate the total number of items + 'per_page' => $per_page, // WE have to determine how many items to show on a page + 'total_pages' => ceil($total_items / $per_page) // WE have to calculate the total number of pages + )); + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-logged-in-users.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-logged-in-users.php new file mode 100755 index 00000000..284608e2 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-logged-in-users.php @@ -0,0 +1,260 @@ + 'item', //singular name of the listed records + 'plural' => 'items', //plural name of the listed records + 'ajax' => false //does this table support ajax? + )); + + } + + public function column_default($item, $column_name) { + return $item[$column_name]; + } + + /** + * Returns user id column html to be rendered. + * + * @param array $item - data for the columns on the current row + * + * @return string - the html to be rendered + */ + public function column_user_id($item) { + //Build row actions + $actions = array( + 'logout' => ''.__('Force logout', 'all-in-one-wp-security-and-firewall').'', + ); + + //Return the user_login contents + return sprintf('%1$s %2$s', + /*$1%s*/ $item['user_id'], + /*$2%s*/ $this->row_actions($actions) + ); + } + + /** + * Sets the columns for the table + * + * @return array + */ + public function get_columns() { + $columns = array( + 'cb' => '', + 'user_id' => __('User ID', 'all-in-one-wp-security-and-firewall'), + 'username' => __('Login name', 'all-in-one-wp-security-and-firewall'), + 'ip_address' => __('IP address', 'all-in-one-wp-security-and-firewall'), + 'site_id' => __('Site ID', 'all-in-one-wp-security-and-firewall'), + ); + return $columns; + } + + /** + * Returns cb column html to be rendered. + * + * @param array $item - data for the columns on the current row + * + * @return string - the html to be rendered + */ + public function column_cb($item) { + return sprintf( + '', + /* $1%s */ $this->_args['singular'], // Let's simply repurpose the table's singular label + /* $2%s */ $item['user_id'] // The value of the checkbox should be the record's id and its ip address + ); + } + + /** + * Sets which of the columns the table data can be sorted by + * + * @return array + */ + public function get_sortable_columns() { + return array( + 'user_id' => array('user_id',false), + 'username' => array('username',false), + 'ip_address' => array('ip_address',false), + 'site_id' => array('site_id',false), + ); + } + + /** + * Adds a bulk action user interface + * + * @return array + */ + public function get_bulk_actions() { + return array( + 'force_logout_all' => __('Logout all', 'all-in-one-wp-security-and-firewall'), + 'force_logout_selected' => __('Logout selected', 'all-in-one-wp-security-and-firewall'), + ); + } + + /** + * Process Bulk action from menu + * + * @return void + */ + private function process_bulk_action() { + // phpcs:disable WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput -- PCP warning. Nonce used. + if (empty($_REQUEST['_wpnonce']) || !isset($_REQUEST['_wp_http_referer'])) return; + $result = AIOWPSecurity_Utility_Permissions::check_nonce_and_user_cap($_REQUEST['_wpnonce'], 'bulk-items'); + if (is_wp_error($result)) return; + + if ('force_logout_all' === $this->current_action()) { + $this->force_user_logout(array(), true); + } elseif ('force_logout_selected' === $this->current_action()) { + if (isset($_REQUEST['item'])) { + + if (is_array($_REQUEST['item'])) $this->force_user_logout(wp_unslash($_REQUEST['item'])); + } + } + // phpcs:enable WordPress.Security.NonceVerification.Recommended -- PCP warning. Nonce used. + } + + /** + * This function will force selected user(s) to be logged out. + * + * @param int|array $users - id of selected user or array of user ids to be logged out + * @param bool $logout_all - Boolean to show if all users should be logged out + * + * @return void|string + */ + public function force_user_logout($users, $logout_all = false) { + global $wpdb, $aio_wp_security; + + $logged_in_users_table = AIOWPSEC_TBL_LOGGED_IN_USERS; + + if ($logout_all) { + // get all user_id(except for the admin) in the table and make it an array for users + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $users = $wpdb->get_col("SELECT user_id FROM $logged_in_users_table"); + } + + if (is_array($users)) { + + if (empty($users)) { + AIOWPSecurity_Admin_Menu::show_msg_record_not_deleted_st(); + return; + } + + $errors = 0; + + // Escape the user IDs for security + $users = array_map('esc_sql', $users); + + foreach ($users as $user_id) { + if (is_numeric($user_id) && !is_super_admin($user_id) && AIOWPSecurity_Utility::is_user_member_of_blog($user_id)) { + if ($aio_wp_security->user_login_obj->delete_logged_in_user($user_id)) { + $this->logout_user($user_id); + continue; + } + } + $errors++; + } + + if ($errors > 0) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(__("Some users were not logged out due to the ID being invalid, or them being a super admin or a member of a different subsite on a multisite", 'all-in-one-wp-security-and-firewall')); + return; + } + + AIOWPSecurity_Admin_Menu::show_msg_record_deleted_st(); + } + } + + + /** + * This function handles logging out a user using user_id + * + * @param int $user_id - id of user being logged out + * + * @return void + */ + public function logout_user($user_id) { + $user_id = absint($user_id); + $manager = WP_Session_Tokens::get_instance($user_id); + $manager->destroy_all(); + } + + /** + * Prepares the items for the logged in users table + * + * @param bool $ignore_pagination - this is to check if data should be paginated or not + * + * @return void + */ + public function prepare_items($ignore_pagination = false) { + global $wpdb; + + //First, lets decide how many records per page to show + $per_page = 100; + $columns = $this->get_columns(); + $hidden = array(); + $sortable = $this->get_sortable_columns(); + $logged_in_users_table = AIOWPSEC_TBL_LOGGED_IN_USERS; + $current_page = $this->get_pagenum(); + $offset = ($current_page - 1) * $per_page; + + // Parameters that are going to be used to order the result + // phpcs:disable -- Rule won't be silenced any other way. No nonce. + $orderby = isset($_GET["orderby"]) ? sanitize_text_field(wp_unslash($_GET["orderby"])) : ''; + $order = isset($_GET["order"]) ? sanitize_text_field(wp_unslash($_GET["order"])) : ''; + // phpcs:enable -- Rule won't be silenced any other way. No nonce. + + // By default show the most recent logged in user entries. + $orderby = empty($orderby) ? 'created' : esc_sql($orderby); + $order = empty($order) ? 'DESC' : esc_sql($order); + + $orderby = AIOWPSecurity_Utility::sanitize_value_by_array($orderby, $sortable); + $order = AIOWPSecurity_Utility::sanitize_value_by_array($order, array('DESC' => '1', 'ASC' => '1')); + + $orderby = sanitize_sql_orderby($orderby); + $order = sanitize_sql_orderby($order); + + $this->_column_headers = array($columns, $hidden, $sortable); + + $this->process_bulk_action(); // Process bulk actions + + $where_sql = $this->get_where_sql(); + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $total_items = $wpdb->get_var("SELECT COUNT(*) FROM `{$logged_in_users_table}` $where_sql"); + + if ($ignore_pagination) { + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $data = $wpdb->get_results("SELECT * FROM `{$logged_in_users_table}` $where_sql ORDER BY $orderby $order", 'ARRAY_A'); + } else { + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $data = $wpdb->get_results("SELECT * FROM `{$logged_in_users_table}` $where_sql ORDER BY $orderby $order LIMIT $per_page OFFSET $offset", 'ARRAY_A'); + } + + $this->items = $data; + + if ($ignore_pagination) return; + + $this->set_pagination_args(array( + 'total_items' => $total_items, //WE have to calculate the total number of items + 'per_page' => $per_page, //WE have to determine how many items to show on a page + 'total_pages' => ceil($total_items/$per_page) //WE have to calculate the total number of pages + )); + } + + /** + * This function will build and return the SQL WHERE statement + * + * @return string - the SQL WHERE statement + */ + private function get_where_sql() { + if (is_main_site() && is_super_admin()) return ''; + + return is_multisite() ? sprintf("WHERE site_id = %d", get_current_blog_id()) : ''; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-permanent-blocked-ip.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-permanent-blocked-ip.php new file mode 100755 index 00000000..2e5c4753 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-permanent-blocked-ip.php @@ -0,0 +1,238 @@ + 'item', //singular name of the listed records + 'plural' => 'items', //plural name of the listed records + 'ajax' => false //does this table support ajax? + )); + + } + + /** + * Returns created column in datetime format as per user setting time zone. + * + * @param array $item - data for the columns on the current row + * + * @return string - the datetime + */ + public function column_created($item) { + return AIOWPSecurity_Utility::convert_timestamp($item['created']); + } + + public function column_default($item, $column_name) { + return $item[$column_name]; + } + + /** + * Function to populate the permanent blocked ip actions column in the table + * + * @param array $item - Contains the current item data + * + * @return string + */ + public function column_id($item) { + $actions = array( + 'unblock' => 'Unblock', + ); + + //Return the user_login contents + return sprintf('%1$s %2$s', + /*$1%s*/ + $item['id'], + /*$2%s*/ + $this->row_actions($actions) + ); + } + + + public function column_cb($item) { + return sprintf( + '', + /*$1%s*/ + $this->_args['singular'], //Let's simply repurpose the table's singular label + /*$2%s*/ + $item['id'] //The value of the checkbox should be the record's id + ); + } + + public function get_columns() { + return array( + 'cb' => '', //Render a checkbox + 'id' => 'ID', + 'blocked_ip' => __('Blocked IP', 'all-in-one-wp-security-and-firewall'), + 'block_reason' => __('Reason', 'all-in-one-wp-security-and-firewall'), + 'created' => __('Date and Time', 'all-in-one-wp-security-and-firewall') + ); + } + + public function get_sortable_columns() { + return array( + 'id' => array('id', false), + 'blocked_ip' => array('blocked_ip', false), + 'block_reason' => array('block_reason', false), + 'created' => array('created', false) + ); + } + + public function get_bulk_actions() { + return array( + 'unblock' => __('Unblock', 'all-in-one-wp-security-and-firewall') + ); + } + + private function process_bulk_action() { + // phpcs:disable WordPress.Security.NonceVerification.Recommended -- PCP warning. It IS the nonce. Ignore. + if (empty($_REQUEST['_wpnonce']) || !isset($_REQUEST['_wp_http_referer'])) return; + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- PCP warning. Ignore. + $result = AIOWPSecurity_Utility_Permissions::check_nonce_and_user_cap($_REQUEST['_wpnonce'], 'bulk-items'); + if (is_wp_error($result)) return; + + if ('unblock' === $this->current_action()) { // Process unlock bulk actions + if (!isset($_REQUEST['item'])) { + AIOS_Helper::set_message('aios_list_message', __('Please select some records using the checkboxes', 'all-in-one-wp-security-and-firewall'), 'error'); + } else { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Sanitized later + $this->unblock_ip_address(wp_unslash($_REQUEST['item'])); + } + } + // phpcs:enable WordPress.Security.NonceVerification.Recommended -- PCP warning. It IS the nonce. Ignore. + } + + /** + * Deletes one or more records from the AIOWPSEC_TBL_PERM_BLOCK table. + * + * @param array|string|integer $entries - ids or a single id + * + * @return void|string + */ + public function unblock_ip_address($entries) { + global $wpdb, $aio_wp_security; + if (is_array($entries)) { + // multiple records + + $entries = array_filter($entries, 'is_numeric'); //discard non-numeric ID values + $id_list = "(" . implode(",", $entries) . ")"; //Create comma separate list for DB operation + $delete_command = "DELETE FROM " . AIOWPSEC_TBL_PERM_BLOCK . " WHERE id IN " . $id_list; // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- $id_list cannot be prepared. + $result = $wpdb->query($delete_command); + if ($result) { + AIOS_Helper::set_message('aios_list_message', __('Successfully unblocked and deleted the selected record(s).', 'all-in-one-wp-security-and-firewall')); + } else { + // Error on bulk delete + $aio_wp_security->debug_logger->log_debug('Database error occurred when deleting rows from Perm Block table. Database error: '.$wpdb->last_error, 4); + AIOS_Helper::set_message('aios_list_message', __('Failed to unblock and delete the selected record(s).', 'all-in-one-wp-security-and-firewall'), 'error'); + } + } elseif (!empty($entries)) { + //Delete single record + $delete_command = "DELETE FROM " . AIOWPSEC_TBL_PERM_BLOCK . " WHERE id = %d"; + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $result = $wpdb->query($wpdb->prepare($delete_command, absint($entries))); + if (false === $result) { + // Error on single delete + $aio_wp_security->debug_logger->log_debug('Database error occurred when deleting rows from Perm Block table. Database error: '.$wpdb->last_error, 4); + } + + return $result; + } + } + + /** + * This function will build and return the SQL WHERE statement + * + * @param string $search_term - the search term applied + * + * @return string - the SQL WHERE statement + */ + private function get_permanent_blocked_ip_list_where_sql($search_term) { + $where = ''; + if (!empty($search_term)) { + $where = " WHERE"; + + // We don't use FILTER_VALIDATE_IP here as we want to be able to search for partial IP's + if (preg_match('/^[0-9a-f:\.]+$/i', $search_term)) { + $where .= " `blocked_ip` LIKE '%".esc_sql($search_term)."%' OR"; + } + + $where .= " `block_reason` LIKE '%".esc_sql($search_term)."%'"; + $where .= " OR `country_origin` LIKE '%".esc_sql($search_term)."%'"; + } + + return $where; + } + + /** + * Grabs the data from database and handles the pagination + * + * @param boolean $ignore_pagination - whether to not paginate + * + * @return void + */ + public function prepare_items($ignore_pagination = false) { + /** + * First, lets decide how many records per page to show + */ + $per_page = 100; + $columns = $this->get_columns(); + $hidden = array(); + $sortable = $this->get_sortable_columns(); + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce. + $search = isset($_REQUEST['s']) ? sanitize_text_field(wp_unslash($_REQUEST['s'])) : ''; + + $this->_column_headers = array($columns, $hidden, $sortable); + + $this->process_bulk_action(); + + global $wpdb; + $block_table_name = AIOWPSEC_TBL_PERM_BLOCK; + + // Ordering parameters + // Parameters that are going to be used to order the result + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce. + $orderby = isset($_GET["orderby"]) ? sanitize_text_field(wp_unslash($_GET["orderby"])) : ''; + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce. + $order = isset($_GET["order"]) ? sanitize_text_field(wp_unslash($_GET["order"])) : ''; + + $orderby = !empty($orderby) ? esc_sql($orderby) : 'id'; + $order = !empty($order) ? esc_sql($order) : 'DESC'; + + $orderby = AIOWPSecurity_Utility::sanitize_value_by_array($orderby, $sortable); + $order = AIOWPSecurity_Utility::sanitize_value_by_array($order, array('DESC' => '1', 'ASC' => '1')); + + $current_page = $this->get_pagenum(); + $offset = ($current_page - 1) * $per_page; + + + $search_query = $this->get_permanent_blocked_ip_list_where_sql($search); + + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $total_items = $wpdb->get_var("SELECT COUNT(*) FROM {$block_table_name}{$search_query}"); + + if ($ignore_pagination) { + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $data = $wpdb->get_results("SELECT * FROM {$block_table_name} {$search_query} ORDER BY $orderby$order", 'ARRAY_A'); + } else { + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $data = $wpdb->get_results("SELECT * FROM {$block_table_name}{$search_query} ORDER BY $orderby $order LIMIT $per_page OFFSET $offset", 'ARRAY_A'); + } + + $this->items = $data; + + if ($ignore_pagination) return; + + $this->set_pagination_args(array( + 'total_items' => $total_items, //WE have to calculate the total number of items + 'per_page' => $per_page, //WE have to determine how many items to show on a page + 'total_pages' => ceil($total_items / $per_page) //WE have to calculate the total number of pages + )); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-registered-users.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-registered-users.php new file mode 100755 index 00000000..992eda21 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-list-registered-users.php @@ -0,0 +1,355 @@ + 'item', //singular name of the listed records + 'plural' => 'items', //plural name of the listed records + 'ajax' => false //does this table support ajax? + )); + + } + + public function column_default($item, $column_name) { + return $item[$column_name]; + } + + /** + * Returns ID column html to be rendered. + * + * @param array $item - data for the columns on the current row + * + * @return string - the html to be rendered + */ + public function column_ID($item) { + //Build row actions + $actions = array( + 'view' => ''.__('View', 'all-in-one-wp-security-and-firewall').'', + 'approve_acct' => ''. __('Approve', 'all-in-one-wp-security-and-firewall') . '', + 'delete_acct' => ''. __('Delete', 'all-in-one-wp-security-and-firewall') . '', + 'block_ip' => ''. __('Block IP', 'all-in-one-wp-security-and-firewall') . '', + ); + + //Return the user_login contents + return sprintf('%1$s %2$s', + /*$1%s*/ $item['ID'], + /*$2%s*/ $this->row_actions($actions) + ); + } + + /** + * Returns IP address column html to be rendered. + * + * @param array $item - data for the columns on the current row + * + * @return string - the html to be rendered + */ + public function column_ip_address($item) { + if (AIOWPSecurity_Blocking::is_ip_blocked($item['ip_address'])) { + return $item['ip_address'].'
'.__('blocked', 'all-in-one-wp-security-and-firewall').''; + } else { + return $item['ip_address']; + } + } + + public function column_cb($item) { + return sprintf( + '', + /*$1%s*/ $this->_args['singular'], //Let's simply repurpose the table's singular label + /*$2%s*/ $item['ID'] //The value of the checkbox should be the record's id + ); + } + + + /** + * Returns array of columns to be rendered. + * + * @return array + */ + public function get_columns() { + $columns = array( + 'cb' => '', // Render a checkbox + 'ID' => __('User ID', 'all-in-one-wp-security-and-firewall'), + 'user_login' => __('Login name', 'all-in-one-wp-security-and-firewall'), + 'user_email' => __('Email', 'all-in-one-wp-security-and-firewall'), + 'user_registered' => __('Register date', 'all-in-one-wp-security-and-firewall'), + 'account_status' => __('Account status', 'all-in-one-wp-security-and-firewall'), + 'ip_address' => __('IP address', 'all-in-one-wp-security-and-firewall') + ); + return $columns; + } + + public function get_sortable_columns() { + $sortable_columns = array( + // 'ID' => array('ID',false), + // 'user_login' => array('user_login',false), + // 'user_email' => array('user_email',false), + // 'user_registered' => array('user_registered',false), + // 'account_status' => array('account_status',false), + ); + return $sortable_columns; + } + + public function get_bulk_actions() { + $actions = array( + 'approve' => __('Approve', 'all-in-one-wp-security-and-firewall'), + 'delete' => __('Delete', 'all-in-one-wp-security-and-firewall'), + 'block' => __('Block IP', 'all-in-one-wp-security-and-firewall') + ); + return $actions; + } + + /** + * Process bulk actions. + * + * @return void + */ + private function process_bulk_action() { + if (empty($_REQUEST['_wpnonce']) || !isset($_REQUEST['_wp_http_referer'])) return; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- pcp check ingore this + $result = AIOWPSecurity_Utility_Permissions::check_nonce_and_user_cap(sanitize_text_field(wp_unslash($_REQUEST['_wpnonce'])), 'bulk-items'); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- pcp check ingore this + if (is_wp_error($result)) return; + + if ('approve' == $this->current_action()) { //Process approve bulk actions + if (!isset($_REQUEST['item'])) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- pcp check ingore this + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('Please select some records using the checkboxes', 'all-in-one-wp-security-and-firewall')); + } else { + $this->approve_selected_accounts(array_map('sanitize_text_field', wp_unslash($_REQUEST['item']))); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- pcp check ingore this + } + } + + if ('delete' == $this->current_action()) { //Process delete bulk actions + if (!isset($_REQUEST['item'])) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- pcp check ingore this + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('Please select some records using the checkboxes', 'all-in-one-wp-security-and-firewall')); + } else { + $this->delete_selected_accounts(array_map('sanitize_text_field', wp_unslash($_REQUEST['item']))); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- pcp check ingore this + } + } + + if ('block' == $this->current_action()) { //Process block bulk actions + if (!isset($_REQUEST['item'])) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- pcp check ingore this + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('Please select some records using the checkboxes', 'all-in-one-wp-security-and-firewall')); + } else { + $this->block_selected_ips(array_map('sanitize_text_field', wp_unslash($_REQUEST['item']))); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- pcp check ingore this + } + } + + } + + /** + * This function approves selected user accounts + * + * @param array|int $entries - this is an array of users or user_id to be approved + * + * @return void|string + */ + public function approve_selected_accounts($entries) { + global $aio_wp_security; + $meta_key = 'aiowps_account_status'; + $meta_value = 'approved'; // set account status + $failed_accts = ''; // string to store comma separated accounts which failed to update + $at_least_one_updated = false; + if (is_array($entries)) { + $entries = array_map('esc_sql', $entries); // Escape every array element + //Let's go through each entry and approve + foreach ($entries as $user_id) { + $result = update_user_meta($user_id, $meta_key, $meta_value); + if (false === $result) { + $failed_accts .= ' '.$user_id.', '; + $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_List_Registered_Users::approve_selected_accounts() - could not approve account ID: $user_id", 4); + } else { + $at_least_one_updated = true; + $user = get_user_by('id', $user_id); + if (false === $user) { + //don't send mail + } else { + $this->send_email_upon_account_activation($user); + } + } + } + if ($at_least_one_updated) { + AIOWPSecurity_Admin_Menu::show_msg_updated_st(__('The selected accounts were approved successfully.', 'all-in-one-wp-security-and-firewall')); + } + if ('' != $failed_accts) { + //display any failed account updates + rtrim($failed_accts); + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('The following accounts failed to update successfully:', 'all-in-one-wp-security-and-firewall') . ' ' . $failed_accts); + } + } + } + + /** + * This function sends an email to an approved user + * + * @param WP_User $user - the object for the approved user + * + * @return bool + */ + public function send_email_upon_account_activation($user) { + global $aio_wp_security; + if (!($user instanceof WP_User)) { + return false; + } + + $to_email_address = $user->user_email; + $email_msg = ''; + $subject = '['.network_site_url().'] '. __('Your account is now active', 'all-in-one-wp-security-and-firewall'); + /* translators: %s: Username */ + $email_msg .= sprintf(__('Your account with username: %s is now active', 'all-in-one-wp-security-and-firewall'), $user->user_login) . "\n"; + $subject = apply_filters('aiowps_register_approval_email_subject', $subject); + $email_msg = apply_filters('aiowps_register_approval_email_msg', $email_msg, $user); //also pass the WP_User object + + $sendMail = wp_mail($to_email_address, $subject, $email_msg); + if (false === $sendMail) { + $aio_wp_security->debug_logger->log_debug("Manual account approval notification email failed to send to " . $to_email_address, 4); + } + return $sendMail; + } + + /** + * This function deletes selected entries pending approval + * + * @param array|int $entries - this is an array of users or single user to be deleted + * + * @return void|string + */ + public function delete_selected_accounts($entries) { + global $aio_wp_security; + if (is_array($entries)) { + $entries = array_map('esc_sql', $entries); // Escape every array element + //Let's go through each entry and delete account + foreach ($entries as $user_id) { + $result = wp_delete_user($user_id); + if (true !== $result) { + $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_List_Registered_Users::delete_selected_accounts() - could not delete account ID: $user_id", 4); + } + } + AIOWPSecurity_Admin_Menu::show_msg_updated_st(__('The selected accounts were deleted successfully.', 'all-in-one-wp-security-and-firewall')); + } + } + + /** + * This function blocks selected ip + * + * @param array|int $entries - this is an array of ips or ip to be blocked + * + * @return void|string + */ + public function block_selected_ips($entries) { + global $aio_wp_security; + if (is_array($entries)) { + $entries = array_filter($entries, function ($entry) { + return AIOWPSecurity_Utility_IP::get_user_ip_address() != $entry; + }); + + if (empty($entries)) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('Only invalid IP addresses were provided: you can not block your own IP address', 'all-in-one-wp-security-and-firewall')); + return; + } + $entries = array_map('esc_sql', $entries); // Escape every array element + //Let's go through each entry and block IP + $total_success = 0; + foreach ($entries as $id) { + $ip_address = get_user_meta($id, 'aiowps_registrant_ip', true); + $result = AIOWPSecurity_Blocking::add_ip_to_block_list($ip_address, 'registration_spam'); + if (false === $result) { + if (AIOWPSecurity_Utility_IP::get_user_ip_address() == $ip_address) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('You cannot block your own IP address:', 'all-in-one-wp-security-and-firewall') . ' ' . $ip_address); + } + $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_List_Registered_Users::block_selected_ips() - could not block IP : $ip_address", 4); + } else { + $total_success++; + } + } + if ($total_success > 0) { + $msg = __('The selected IP addresses were successfully added to the permanent block list.', 'all-in-one-wp-security-and-firewall'); + $msg .= ' '.__('View Blocked IPs', 'all-in-one-wp-security-and-firewall').''; + AIOWPSecurity_Admin_Menu::show_msg_updated_st($msg); + } + } + } + + /** + * Grabs the data from database and handles the pagination + * + * @param boolean $ignore_pagination - whether to not paginate + * @return void + */ + public function prepare_items($ignore_pagination = false) { + //First, lets decide how many records per page to show + $per_page = 100; + $columns = $this->get_columns(); + $current_page = $this->get_pagenum(); + $offset = ($current_page - 1) * $per_page; + $hidden = array(); + $sortable = $this->get_sortable_columns(); + $search = isset($_REQUEST['s']) ? sanitize_text_field(wp_unslash($_REQUEST['s'])) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- pcp check ingore this + + $this->_column_headers = array($columns, $hidden, $sortable); + + $this->process_bulk_action(); + + //Get registered users which have the special 'aiowps_account_status' meta key set to 'pending' + if ($ignore_pagination) { + $result = $this->get_registered_user_data('pending', $search); + } else { + $result = $this->get_registered_user_data('pending', $search, $per_page, $offset); + } + + $total_items = $result['total']; + $this->items = $result['data']; + + if ($ignore_pagination) return; + + $this->set_pagination_args(array( + 'total_items' => $total_items, //WE have to calculate the total number of items + 'per_page' => $per_page, //WE have to determine how many items to show on a page + 'total_pages' => ceil($total_items/$per_page) //WE have to calculate the total number of pages + )); + } + + /** + * Returns all users who have the special 'aiowps_account_status' meta key + * + * @param string $status - the status we want to search for + * @param string $search - the search query + * @param null $per_page - how many results per page + * @param int $offset - the page offset + * + * @return array - an array of users that match the search + */ + public function get_registered_user_data($status = '', $search = '', $per_page = null, $offset = 0) { + $user_fields = array( 'ID', 'user_login', 'user_email', 'user_registered'); + $user_query = new WP_User_Query(array('meta_key' => 'aiowps_account_status', 'meta_value' => $status, 'fields' => $user_fields, 'number' => $per_page, 'offset' => $offset)); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key, WordPress.DB.SlowDBQuery.slow_db_query_meta_value -- ignore this + $user_results = $user_query->results; + $user_total = $user_query->get_total(); + + $final_data = array(); + foreach ($user_results as $user) { + $temp_array = get_object_vars($user); //Turn the object into array + $temp_array['account_status'] = get_user_meta($temp_array['ID'], 'aiowps_account_status', true); + $ip = get_user_meta($temp_array['ID'], 'aiowps_registrant_ip', true); + $temp_array['ip_address'] = empty($ip) ? '' : $ip; + if (empty($search)) { + $final_data[] = $temp_array; + } else { + $input = preg_quote($search, '~'); // don't forget to quote input string! + + $result = preg_grep('~' . $input . '~', $temp_array); + if (!empty($result)) $final_data[] = $temp_array; + } + } + + return array( + 'data' => $final_data, + 'total' => $user_total, + ); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-reset-settings.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-reset-settings.php new file mode 100755 index 00000000..179a49e5 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-reset-settings.php @@ -0,0 +1,90 @@ +query('TRUNCATE ' . $wpdb->prefix . 'aiowps_login_lockdown'); + $wpdb->query('TRUNCATE ' . $wpdb->prefix . 'aiowps_global_meta'); + $wpdb->query('TRUNCATE ' . $wpdb->prefix . 'aiowps_events'); + $wpdb->query('TRUNCATE ' . $wpdb->prefix . 'aiowps_permanent_block'); + // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- PCP error. Ignore. + if (is_main_site()) { + $wpdb->query('TRUNCATE ' . AIOWPSEC_TBL_LOGGED_IN_USERS); + $wpdb->query('TRUNCATE ' . AIOWPSEC_TBL_MESSAGE_STORE); + $wpdb->query('TRUNCATE ' . AIOWPSEC_TBL_DEBUG_LOG); + $wpdb->query('TRUNCATE ' . AIOWPSEC_TBL_AUDIT_LOG); + } + // phpcs:enable WordPress.DB.PreparedSQL.NotPrepared -- PCP error. Ignore. + return true; + } + } + +endif; diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-settings-menu.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-settings-menu.php new file mode 100755 index 00000000..13556c04 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-settings-menu.php @@ -0,0 +1,157 @@ + array( + 'title' => __('General settings', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_general_settings'), + ), + 'htaccess-file-operations' => array( + 'title' => '.htaccess '.__('file', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_htaccess_file_operations'), + 'display_condition_callback' => array('AIOWPSecurity_Utility_Permissions', 'is_main_site_and_super_admin'), + ), + 'wp-config-file-operations' => array( + 'title' => 'wp-config.php '.__('file', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_wp_config_file_operations'), + 'display_condition_callback' => array('AIOWPSecurity_Utility_Permissions', 'is_main_site_and_super_admin'), + ), + 'delete-plugin-settings' => array( + 'title' => __('Delete plugin settings', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_delete_plugin_settings_tab') + ), + 'wp-version-info' => array( + 'title' => __('WP version info', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_wp_version_info'), + ), + 'settings-file-operations' => array( + 'title' => __('Import/Export', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_settings_file_operations'), + ), + 'advanced-settings' => array( + 'title' => __('Advanced settings', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_advanced_settings'), + 'display_condition_callback' => array('AIOWPSecurity_Utility_Permissions', 'is_main_site_and_super_admin'), + ), + ); + + $menu_tabs = apply_filters('aiowpsecurity_setting_tabs', $menu_tabs); + $this->menu_tabs = array_filter($menu_tabs, array($this, 'should_display_tab')); + } + + /** + * Renders the submenu's general settings tab. + * + * @return void + */ + protected function render_general_settings() { + global $aio_wp_security; + + $aio_wp_security->include_template('wp-admin/settings/general-settings.php', false, array()); + } + + /** + * Renders the submenu's htaccess file operations tab. + * + * @return void + */ + protected function render_htaccess_file_operations() { + global $aio_wp_security; + + $aio_wp_security->include_template('wp-admin/settings/htaccess-file-operations.php', false, array()); + } + + /** + * Renders the submenu's wp config file operations tab. + * + * @return void + */ + protected function render_wp_config_file_operations() { + global $aio_wp_security; + + $aio_wp_security->include_template('wp-admin/settings/wp-config-file-operations.php', false, array()); + } + + /** + * Renders the submenu's delete plugin settings tab. + * + * @return void + */ + protected function render_delete_plugin_settings_tab() { + global $aio_wp_security; + + $aio_wp_security->include_template('wp-admin/settings/delete-plugin-settings.php', false, array()); + } + + /** + * Renders the submenu's wp version info tab. + * + * @return void + */ + protected function render_wp_version_info() { + global $aio_wp_security, $aiowps_feature_mgr; + + $aio_wp_security->include_template('wp-admin/settings/wp-version-info.php', false, array('aiowps_feature_mgr' => $aiowps_feature_mgr)); + } + + /** + * Renders the submenu's settings file operations tab. + * + * @return void + */ + protected function render_settings_file_operations() { + global $aio_wp_security; + + $events_table_name = AIOWPSEC_TBL_EVENTS; + AIOWPSecurity_Utility::cleanup_table($events_table_name, 500); + + $aio_wp_security->include_template('wp-admin/settings/settings-file-operations.php', false, array()); + } + + /** + * Renders advanced settings tab. + * + * @return void + */ + protected function render_advanced_settings() { + if (!is_main_site()) { + return; + } + + global $aio_wp_security; + + $aios_commands = new AIOWPSecurity_Commands(); + + $advanced_settings_data = $aios_commands->get_ip_address_detection_data(); + + $aio_wp_security->include_template('wp-admin/settings/advanced-settings.php', false, $advanced_settings_data); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-spam-menu.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-spam-menu.php new file mode 100755 index 00000000..1c13d061 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-spam-menu.php @@ -0,0 +1,93 @@ + array( + 'title' => __('Comment spam', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_comment_spam'), + ), + 'comment-spam-ip-monitoring' => array( + 'title' => __('Comment spam IP monitoring', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_comment_spam_ip_monitoring'), + ), + ); + + $this->menu_tabs = array_filter($menu_tabs, array($this, 'should_display_tab')); + } + + /** + * Renders the submenu's comment spam ip monitoring tab body. + * + * @return Void + */ + protected function render_comment_spam() { + global $aiowps_feature_mgr, $aio_wp_security; + $aio_wp_security->include_template('wp-admin/spam-prevention/comment-spam.php', false, array('aiowps_feature_mgr' => $aiowps_feature_mgr)); + } + + /** + * Renders the submenu's comment spam ip monitoring tab body. + * + * @return Void + */ + protected function render_comment_spam_ip_monitoring() { + global $aio_wp_security, $aiowps_feature_mgr, $wpdb; + include_once 'wp-security-list-comment-spammer-ip.php'; // For rendering the AIOWPSecurity_List_Table in tab2 + $spammer_ip_list = new AIOWPSecurity_List_Comment_Spammer_IP(); + + $block_comments_output = ''; + + $min_block_comments = $aio_wp_security->configs->get_value('aiowps_spam_ip_min_comments_block'); + if (!empty($min_block_comments)) { + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $total_res = $wpdb->get_results($wpdb->prepare('SELECT * FROM '.AIOWPSEC_TBL_PERM_BLOCK.' WHERE block_reason=%s', 'spam')); + $block_comments_output = '
'; + if (empty($total_res)) { + $block_comments_output .= '

'.esc_html__('You currently have no IP addresses permanently blocked due to spam.', 'all-in-one-wp-security-and-firewall').'

'; + } else { + $total_count = count($total_res); + $todays_blocked_count = 0; + foreach ($total_res as $blocked_item) { + $now_date_time = new DateTime('now', new DateTimeZone('UTC')); + $blocked_date = new DateTime('@'.$blocked_item->created); //@ with timestamp creates correct DateTime + if ($blocked_date->format('Y-m-d') == $now_date_time->format('Y-m-d')) { + //there was an IP added to permanent block list today + ++$todays_blocked_count; + } + } + $block_comments_output .= '

'.esc_html__('Spammer IPs added to permanent block list today:', 'all-in-one-wp-security-and-firewall'). ' ' . esc_html($todays_blocked_count).'

'.'

'.esc_html__('All time total:', 'all-in-one-wp-security-and-firewall'). ' ' .esc_html($total_count).'

'.'

'.esc_html__('View blocked IPs', 'all-in-one-wp-security-and-firewall').'

'; + } + } + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce. + $page = isset($_REQUEST['page']) ? sanitize_text_field(wp_unslash($_REQUEST['page'])) : ''; + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce. + $tab = isset($_REQUEST['tab']) ? sanitize_text_field(wp_unslash($_REQUEST['tab'])) : ''; + + $aio_wp_security->include_template('wp-admin/spam-prevention/comment-spam-ip-monitoring.php', false, array('spammer_ip_list' => $spammer_ip_list, 'aiowps_feature_mgr' => $aiowps_feature_mgr, 'block_comments_output' => $block_comments_output, 'page' => $page, 'tab' => $tab)); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-tools-menu.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-tools-menu.php new file mode 100755 index 00000000..a41827c8 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-tools-menu.php @@ -0,0 +1,98 @@ + array( + 'title' => __('Password tool', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_password_tool'), + ), + 'whois-lookup' => array( + 'title' => __('WHOIS lookup', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_whois_lookup_tab'), + ), + 'custom-rules' => array( + 'title' => __('Custom .htaccess rules', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_custom_rules'), + 'display_condition_callback' => array('AIOWPSecurity_Utility', 'allow_to_write_to_htaccess'), + ), + 'visitor-lockout' => array( + 'title' => __('Visitor lockout', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_visitor_lockout'), + ), + ); + + $this->menu_tabs = array_filter($menu_tabs, array($this, 'should_display_tab')); + } + + /** + * Render the 'Custom (htaccess) rules' tab + * + * @return void + */ + protected function render_custom_rules() { + global $aio_wp_security; + + $aio_wp_security->include_template('wp-admin/tools/custom-htaccess.php'); + } + + /** + * Renders the submenu's password tool tab + * + * @return Void + */ + protected function render_password_tool() { + global $aio_wp_security; + + wp_enqueue_script('aiowpsec-pw-tool-js'); + $aio_wp_security->include_template('wp-admin/tools/password-tool.php'); + } + + /** + * Renders the submenu's whois-lookup tab body. + * + * @return Void + */ + protected function render_whois_lookup_tab() { + global $aio_wp_security; + + $aio_wp_security->include_template('wp-admin/tools/whois-lookup.php', false, array()); + } + + /** + * Renders the submenu's visitor lockout tab + * + * @return void + */ + protected function render_visitor_lockout() { + global $aio_wp_security; + + $aio_wp_security->include_template('wp-admin/tools/visitor-lockout.php', false, array()); + } + +} // End of class diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-user-security-menu.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-user-security-menu.php new file mode 100755 index 00000000..721f2a43 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/admin/wp-security-user-security-menu.php @@ -0,0 +1,296 @@ + array( + 'title' => __('User accounts', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_wp_user_account'), + ), + 'login-lockout' => array( + 'title' => __('Login lockout', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_login_lockout'), + ), + 'force-logout' => array( + 'title' => __('Force logout', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_force_logout'), + ), + 'logged-in-users' => array( + 'title' => __('Logged in users', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_logged_in_users'), + ), + 'manual-approval' => array( + 'title' => __('Manual approval', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_manual_approval'), + ), + 'salt' => array( + 'title' => __('Salt', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_salt_tab'), + 'display_condition_callback' => array('AIOWPSecurity_Utility_Permissions', 'is_main_site_and_super_admin'), + ), + 'http-authentication' => array( + 'title' => __('HTTP authentication', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_http_authentication'), + ), + 'hibp' => array( + 'title' => __('HIBP', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_hibp'), + 'display_condition_callback' => array('AIOWPSecurity_Utility_Permissions', 'is_main_site_and_super_admin'), + ), + 'additional' => array( + 'title' => __('Additional settings', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_additional'), + ), + ); + + $this->menu_tabs = array_filter($menu_tabs, array($this, 'should_display_tab')); + } + + /** + * Renders the submenu's WP User Account tab + * + * @return Void + */ + protected function render_wp_user_account() { + global $aio_wp_security, $aiowps_feature_mgr; + + if (is_multisite()) { // Multi-site: get admin accounts for current site + $blog_id = get_current_blog_id(); + $user_accounts = $this->get_all_admin_accounts($blog_id); + } else { + $user_accounts = $this->get_all_admin_accounts(); + } + + $aio_wp_security->include_template('wp-admin/user-security/user-accounts.php', false, array('aiowps_feature_mgr' => $aiowps_feature_mgr, 'user_accounts' => $user_accounts, 'AIOWPSecurity_User_Security_Menu' => $this)); + } + + + /** + * This function will retrieve all user accounts which have 'administrator' role and will return html code with results in a table + * + * @param string $blog_id - the blog we want to get the user account information from + * + * @return string - the html from the result + */ + private function get_all_admin_accounts($blog_id = '') { + // TODO: Have included the "blog_id" variable for future use for cases where people want to search particular blog (eg, multi-site) + if ($blog_id) { + $admin_users = get_users('blog_id='.$blog_id.'&orderby=login&role=administrator'); + } else { + $admin_users = get_users('orderby=login&role=administrator'); + } + // now let's put the results in an HTML table + $account_output = ""; + if (!empty($admin_users)) { + $account_output .= ''; + $account_output .= ''; + foreach ($admin_users as $entry) { + $account_output .= ''; + if (strtolower($entry->user_login) == 'admin') { + $account_output .= ''; + } else { + $account_output .= ''; + } + $user_acct_edit_link = admin_url('user-edit.php?user_id=' . $entry->ID); + $account_output .= ''; + $account_output .= ''; + } + $account_output .= '
'.esc_html(__('Account login name', 'all-in-one-wp-security-and-firewall')).'
'.esc_html($entry->user_login).''.esc_html($entry->user_login).''.esc_html(__('Edit user', 'all-in-one-wp-security-and-firewall')).'
'; + } + return $account_output; + } + + /** + * Login Lockout configuration to set. + * + * @global AIO_WP_Security $aio_wp_security + * @global AIOWPSecurity_Feature_Item_Manager $aiowps_feature_mgr + * + * @return Void + */ + protected function render_login_lockout() { + global $aio_wp_security, $aiowps_feature_mgr; + + include_once 'wp-security-list-locked-ip.php'; // For rendering the AIOWPSecurity_List_Table in tab1 + $locked_ip_list = new AIOWPSecurity_List_Locked_IP(); // For rendering the AIOWPSecurity_List_Table in tab1 + + $aiowps_lockdown_allowed_ip_addresses = $aio_wp_security->configs->get_value('aiowps_lockdown_allowed_ip_addresses'); + + $aio_wp_security->include_template('wp-admin/user-security/login-lockout.php', false, array('aiowps_feature_mgr' => $aiowps_feature_mgr, 'locked_ip_list' => $locked_ip_list, "aiowps_lockdown_allowed_ip_addresses" => $aiowps_lockdown_allowed_ip_addresses)); + } + + /** + * Force logged user to logout after x minutes. + * + * @global AIO_WP_Security $aio_wp_security + * @global AIOWPSecurity_Feature_Item_Manager $aiowps_feature_mgr + * @return void + */ + protected function render_force_logout() { + global $aio_wp_security, $aiowps_feature_mgr; + + $aio_wp_security->include_template('wp-admin/user-security/force-logout.php', false, array('aiowps_feature_mgr' => $aiowps_feature_mgr)); + } + + /** + * Logged in users list. + * + * @global AIO_WP_Security $aio_wp_security + * @return void + */ + protected function render_logged_in_users() { + global $aio_wp_security; + + include_once 'wp-security-list-logged-in-users.php'; // For rendering the AIOWPSecurity_List_Table + $user_list = new AIOWPSecurity_List_Logged_In_Users(); + + $aio_wp_security->include_template('wp-admin/user-security/logged-in-users.php', false, array('user_list' => $user_list)); + } + + /** + * Renders the submenu's manual approval tab + * + * @return Void + */ + protected function render_manual_approval() { + global $aio_wp_security, $aiowps_feature_mgr; + + include_once 'wp-security-list-registered-users.php'; // For rendering the AIOWPSecurity_List_Table + $user_list = new AIOWPSecurity_List_Registered_Users(); + + $aio_wp_security->include_template('wp-admin/user-security/manual-approval.php', false, array('user_list' => $user_list, 'aiowps_feature_mgr' => $aiowps_feature_mgr)); + } + + /** + * Renders the submenu's salt tab + * + * @return Void + */ + protected function render_salt_tab() { + global $aio_wp_security; + + $aio_wp_security->include_template('wp-admin/user-security/salt.php'); + } + + /** + * Renders the submenu's http authentication tab. + * + * @global AIO_WP_Security $aio_wp_security + * + * @return void + */ + protected function render_http_authentication() { + global $aio_wp_security, $aiowps_feature_mgr; + + if (isset($_POST['aiowps_save_http_authentication_settings'])) { + $nonce_user_cap_result = AIOWPSecurity_Utility_Permissions::check_nonce_and_user_cap($_POST['_wpnonce'], 'aiowpsec-http-authentication-settings-nonce'); + + if (is_wp_error($nonce_user_cap_result)) { + $aio_wp_security->debug_logger->log_debug($nonce_user_cap_result->get_error_message(), 4); + die($nonce_user_cap_result->get_error_message()); + } + + $error = false; + + $aio_wp_security->configs->set_value('aiowps_http_authentication_admin', ''); + + if (isset($_POST['aiowps_http_authentication_admin'])) { + if (!is_ssl()) { + $this->show_msg_error(__('Failed to save \'Enable for WordPress dashboard\'.', 'all-in-one-wp-security-and-firewall') . ' ' . __('Your site is currently not using https.', 'all-in-one-wp-security-and-firewall')); + $error = true; + } else { + $aio_wp_security->configs->set_value('aiowps_http_authentication_admin', '1'); + } + } + + $aio_wp_security->configs->set_value('aiowps_http_authentication_frontend', ''); + + if (isset($_POST['aiowps_http_authentication_frontend'])) { + if (!is_ssl()) { + $this->show_msg_error(__('Failed to save \'Enable for frontend\'.', 'all-in-one-wp-security-and-firewall') . ' ' . __('Your site is currently not using https.', 'all-in-one-wp-security-and-firewall')); + $error = true; + } else { + $aio_wp_security->configs->set_value('aiowps_http_authentication_frontend', '1'); + } + } + + if (empty($_POST['aiowps_http_authentication_username'])) { + $this->show_msg_error(__('Failed to save \'Username\'.', 'all-in-one-wp-security-and-firewall') . ' ' . __('Please enter a value for the HTTP authentication username.', 'all-in-one-wp-security-and-firewall')); + $error = true; + } else { + $aio_wp_security->configs->set_value('aiowps_http_authentication_username', sanitize_text_field($_POST['aiowps_http_authentication_username'])); + } + + if (empty($_POST['aiowps_http_authentication_password'])) { + $this->show_msg_error(__('Failed to save \'Password\'.', 'all-in-one-wp-security-and-firewall') . ' ' . __('Please enter a value for the HTTP authentication password.', 'all-in-one-wp-security-and-firewall')); + $error = true; + } else { + $aio_wp_security->configs->set_value('aiowps_http_authentication_password', sanitize_text_field($_POST['aiowps_http_authentication_password'])); + } + + $aio_wp_security->configs->set_value('aiowps_http_authentication_failure_message', htmlentities(stripslashes($_POST['aiowps_http_authentication_failure_message']), ENT_COMPAT, 'UTF-8')); + + $aio_wp_security->configs->save_config(); + + // Recalculate points after the feature status/options have been altered. + $aiowps_feature_mgr->check_feature_status_and_recalculate_points(); + + if (!$error) { + $this->show_msg_settings_updated(); + } + } + + wp_enqueue_script('aiowpsec-pw-tool-js'); + + $aio_wp_security->include_template('wp-admin/user-security/http-authentication.php'); + } + + /** + * Renders the submenu's hibp tab. + * + * @global AIO_WP_Security $aio_wp_security + * + * @return void + */ + protected function render_hibp() { + global $aio_wp_security; + + $aio_wp_security->include_template('wp-admin/user-security/hibp.php'); + } + + /** + * Shows additional tab and field for the disable application password and saves on submit. + * + * @global AIO_WP_Security $aio_wp_security + * @global AIOWPSecurity_Feature_Item_Manager $aiowps_feature_mgr + * @return void + */ + protected function render_additional() { + global $aio_wp_security, $aiowps_feature_mgr; + + $aio_wp_security->include_template('wp-admin/user-security/additional.php', false, array('aiowps_feature_mgr' => $aiowps_feature_mgr)); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/backups/index.html b/wp-content/plugins/all-in-one-wp-security-and-firewall/backups/index.html new file mode 100755 index 00000000..e69de29b diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-brute-force-commands.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-brute-force-commands.php new file mode 100755 index 00000000..44783bac --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-brute-force-commands.php @@ -0,0 +1,561 @@ +' . __('You cannot use the value "wp-admin" for your login page slug.', 'all-in-one-wp-security-and-firewall'); + } elseif (preg_match('/[^\p{L}\p{N}_\-]/u', $aiowps_login_page_slug)) { + $error = '
' . __('You must use alphanumeric characters for your login page slug.', 'all-in-one-wp-security-and-firewall'); + } + } + + if ($error) { + $success = false; + $message = $error; + } else { + $options['aiowps_enable_rename_login_page'] = isset($data["aiowps_enable_rename_login_page"]) ? '1' : ''; + $options['aiowps_login_page_slug'] = $aiowps_login_page_slug; + + $this->save_settings($options); + + if (get_option('permalink_structure')) { + $home_url = trailingslashit(home_url()); + } else { + $home_url = trailingslashit(home_url()) . '?'; + } + + $message = __('The settings have been successfully updated.', 'all-in-one-wp-security-and-firewall'); + $args['badges'] = array("bf-rename-login-page"); + $args['content'] = array('aios-rename-login-notice' => $aio_wp_security->include_template('wp-admin/brute-force/partials/rename-login-notice.php', true, array('home_url' => $home_url))); + } + + return $this->handle_response($success, $message, $args); + } + + /** + * Handles the AJAX request to enable or configure cookie-based brute force prevention. + * + * @param array $data The data received from the AJAX request. + * + * @return array The response containing the status, message, and badge. + */ + public function perform_cookie_based_brute_force_prevention($data) { + global $aio_wp_security; + + $options = array(); + $values = array(); + $info = array(); + + $success = true; + $message = ''; + $result = ''; + + if (isset($data['aiowps_enable_brute_force_attack_prevention'])) { + $brute_force_feature_secret_word = sanitize_text_field($data['aiowps_brute_force_secret_word']); + $redirect_url = sanitize_text_field($data['aiowps_cookie_based_brute_force_redirect_url']); + if (empty($brute_force_feature_secret_word)) { + $brute_force_feature_secret_word = AIOS_DEFAULT_BRUTE_FORCE_FEATURE_SECRET_WORD; + $info[] = __('You entered an invalid value for the secret word.', 'all-in-one-wp-security-and-firewall'). ' ' . __('It has been set to the default value.', 'all-in-one-wp-security-and-firewall'); + } elseif (!ctype_alnum($brute_force_feature_secret_word)) { + $message = '

' . __('Settings have not been saved - your secret word must consist only of alphanumeric characters i.e., letters and/or numbers only.', 'all-in-one-wp-security-and-firewall') . '

'; + $success = false; + } + + if (filter_var($redirect_url, FILTER_VALIDATE_URL)) { + $redirect_url = esc_url_raw($redirect_url); + } else { + $redirect_url = 'http://127.0.0.1'; + $info[] = __('You entered an invalid value for the redirect url.', 'all-in-one-wp-security-and-firewall'). ' ' . __('It has been set to the default value.', 'all-in-one-wp-security-and-firewall'); + } + + $options['aiowps_cookie_based_brute_force_redirect_url'] = $redirect_url; + + if ($success) { + $options['aiowps_enable_brute_force_attack_prevention'] = '1'; + $options['aiowps_brute_force_secret_word'] = $brute_force_feature_secret_word; + + $result = '

' . __('You have successfully enabled the cookie based brute force prevention feature', 'all-in-one-wp-security-and-firewall') . '

'; + $result .= '

' . __('From now on you will need to log into your WP Admin using the following URL:', 'all-in-one-wp-security-and-firewall') . '

'; + $result .= '

'.AIOWPSEC_WP_URL.'/?'.esc_html($brute_force_feature_secret_word).'=1

'; + $result .= '

' . __('It is important that you save this URL value somewhere in case you forget it, OR,', 'all-in-one-wp-security-and-firewall') . '

'; + $result .= '

' . sprintf(__('simply remember to add a "?%s=1" to your current site URL address.', 'all-in-one-wp-security-and-firewall'), esc_html($brute_force_feature_secret_word)) . '

'; + AIOWPSecurity_Utility::set_cookie_value(AIOWPSecurity_Utility::get_brute_force_secret_cookie_name(), AIOS_Helper::get_hash($brute_force_feature_secret_word)); + } + } else { + $options['aiowps_enable_brute_force_attack_prevention'] = ''; + $message = __('You have successfully saved cookie based brute force prevention feature settings.', 'all-in-one-wp-security-and-firewall'); + $brute_force_feature_secret_word = $aio_wp_security->configs->get_value('aiowps_brute_force_secret_word'); + $redirect_url = $aio_wp_security->configs->get_value('aiowps_cookie_based_brute_force_redirect_url'); + } + + $options['aiowps_brute_force_attack_prevention_pw_protected_exception'] = isset($data['aiowps_brute_force_attack_prevention_pw_protected_exception']) ? '1' : ''; + $options['aiowps_brute_force_attack_prevention_ajax_exception'] = isset($data['aiowps_brute_force_attack_prevention_ajax_exception']) ? '1' : ''; + + if ($success) { + $this->save_settings($options); + + AIOWPSecurity_Configure_Settings::set_cookie_based_bruteforce_firewall_configs(); + + $message = __('The settings have been successfully updated.', 'all-in-one-wp-security-and-firewall'); + $values['aiowps_brute_force_secret_word'] = $brute_force_feature_secret_word; + $values['aiowps_cookie_based_brute_force_redirect_url'] = $redirect_url; + } + $content = array( + 'aios-brute-force-info-box' => $result + ); + + $badges = array("firewall-enable-brute-force-attack-prevention"); + + $args = array( + 'badges' => $badges, + 'info' => $info, + 'values' => $values, + 'content' => $content + ); + + return $this->handle_response($success, $message, $args); + } + + /** + * Handles the AJAX request for performing cookie test. + * + * @return array The response containing the status, message, and badge. + */ + public function perform_cookie_test() { + global $aio_wp_security; + + $success = true; + + $random_suffix = AIOWPSecurity_Utility::generate_alpha_numeric_random_string(10); + $test_cookie_name = 'aiowps_cookie_test_'.$random_suffix; + $aio_wp_security->configs->set_value('aiowps_cookie_brute_test', $test_cookie_name, true); + $set_cookie = AIOWPSecurity_Utility::set_cookie_value($test_cookie_name, '1'); + $aiowps_cookie_test_success = ''; + $args = array(); + + if ($set_cookie) { + $aiowps_cookie_test_success = '1'; + $message = __('The cookie test was successful, you can now enable this feature.', 'all-in-one-wp-security-and-firewall'); + $result = '

' . __('The cookie test was successful, you can now enable this feature.', 'all-in-one-wp-security-and-firewall') . '

'; + } else { + $success = false; + $message = __('The cookie test failed.', 'all-in-one-wp-security-and-firewall') .' '. __('Consequently, this feature cannot be used on this site.', 'all-in-one-wp-security-and-firewall'); + $result = '

' . __('The cookie test failed on this server.', 'all-in-one-wp-security-and-firewall') .' '. __('Consequently, this feature cannot be used on this site.', 'all-in-one-wp-security-and-firewall') . '

'; + } + + $this->save_settings(array('aiowps_cookie_test_success' => $aiowps_cookie_test_success)); // save the value + $args['content'] = array( + 'aios-perform-cookie-test-div' => $this->get_perform_cookie_test_content(), + 'cookie-test-result-div' => $result + ); + + return $this->handle_response($success, $message, $args); + } + + /** + * Handles the AJAX request to enable or configure login whitelist settings. + * + * @param array $data The data received from the AJAX request. + * + * @return array The response containing the status, message, and badge. + */ + public function perform_login_whitelist_settings($data) { + global $aio_wp_security; + + $success = true; + $options = array(); + $message = ''; + + if (!empty($data['aiowps_allowed_ip_addresses'])) { + $ip_addresses = sanitize_textarea_field(stripslashes($data['aiowps_allowed_ip_addresses'])); + $ip_list_array = AIOWPSecurity_Utility_IP::create_ip_list_array_from_string_with_newline($ip_addresses); + $validated_ip_list_array = AIOWPSecurity_Utility_IP::validate_ip_list($ip_list_array, 'whitelist'); + if (is_wp_error($validated_ip_list_array)) { + $result = -1; + $success = false; + $message = nl2br($validated_ip_list_array->get_error_message()); + } else { + $result = 1; + $whitelist_ip_data = implode("\n", $validated_ip_list_array); + $options['aiowps_allowed_ip_addresses'] = $whitelist_ip_data; + } + } else { + $result = 1; + $options['aiowps_allowed_ip_addresses'] = ''; // Clear the IP address config value + } + + if (1 == $result) { + $options['aiowps_enable_whitelisting'] = isset($data["aiowps_enable_whitelisting"]) ? '1' : ''; + if ('1' == $aio_wp_security->configs->get_value('aiowps_is_login_whitelist_disabled_on_upgrade')) { + $aio_wp_security->configs->delete_value('aiowps_is_login_whitelist_disabled_on_upgrade'); + } + $this->save_settings($options); + } + + $args = array( + 'badges' => array('whitelist-manager-ip-login-whitelisting') + ); + + return $this->handle_response($success, $message, $args); + } + + /** + * Handles the AJAX request to enable or configure honeypot brute force settings. + * + * @param array $data The data received from the AJAX request. + * + * @return array The response containing the status, message, and badge. + */ + public function perform_honeypot_settings($data) { + + $options = array(); + // Save all the form values to the options + $options['aiowps_enable_login_honeypot'] = isset($data["aiowps_enable_login_honeypot"]) ? '1' : ''; + $options['aiowps_enable_registration_honeypot'] = isset($data["aiowps_enable_registration_honeypot"]) ? '1' : ''; + + $this->save_settings($options); + + $args = array( + 'badges' => array('login-honeypot', 'registration-honeypot') + ); + + return $this->handle_response(true, '', $args); + } + + /** + * Handles the AJAX request to enable or configure captcha settings. + * + * @param array $data The data received from the AJAX request. + * + * @return array The response containing the status, message, and badge. + */ + public function perform_captcha_settings($data) { + global $aio_wp_security; + + $captcha_themes = $aio_wp_security->captcha_obj->get_captcha_themes(); + $supported_captchas = $aio_wp_security->captcha_obj->get_supported_captchas(); + $options = array(); + + $default_captcha = isset($data['aiowps_default_captcha']) ? sanitize_text_field($data['aiowps_default_captcha']) : ''; + + $default_captcha = array_key_exists($default_captcha, $supported_captchas) ? $default_captcha : 'none'; + + $options['aiowps_default_captcha'] = $default_captcha; + + // Save all the form values to the options + $random_20_digit_string = AIOWPSecurity_Utility::generate_alpha_numeric_random_string(20); // Generate random 20 char string for use during CAPTCHA encode/decode + $options['aiowps_captcha_secret_key'] = $random_20_digit_string; + $options['aiowps_enable_login_captcha'] = isset($data["aiowps_enable_login_captcha"]) ? '1' : ''; + $options['aiowps_enable_registration_page_captcha'] = isset($data["aiowps_enable_registration_page_captcha"]) ? '1' : ''; + $options['aiowps_enable_comment_captcha'] = isset($data["aiowps_enable_comment_captcha"]) ? '1' : ''; + $options['aiowps_enable_bp_register_captcha'] = isset($data["aiowps_enable_bp_register_captcha"]) ? '1' : ''; + $options['aiowps_enable_bbp_new_topic_captcha'] = isset($data["aiowps_enable_bbp_new_topic_captcha"]) ? '1' : ''; + $options['aiowps_enable_woo_login_captcha'] = isset($data["aiowps_enable_woo_login_captcha"]) ? '1' : ''; + $options['aiowps_enable_woo_register_captcha'] = isset($data["aiowps_enable_woo_register_captcha"]) ? '1' : ''; + $options['aiowps_enable_woo_lostpassword_captcha'] = isset($data["aiowps_enable_woo_lostpassword_captcha"]) ? '1' : ''; + $options['aiowps_enable_woo_checkout_captcha'] = isset($data["aiowps_enable_woo_checkout_captcha"]) ? '1' : ''; + $options['aiowps_enable_custom_login_captcha'] = isset($data["aiowps_enable_custom_login_captcha"]) ? '1' : ''; + $options['aiowps_enable_lost_password_captcha'] = isset($data["aiowps_enable_lost_password_captcha"]) ? '1' : ''; + $options['aiowps_enable_contact_form_7_captcha'] = isset($data["aiowps_enable_contact_form_7_captcha"]) ? '1' : ''; + $options['aiowps_enable_password_protected_captcha'] = isset($data["aiowps_enable_password_protected_captcha"]) ? '1' : ''; + + $options['aiowps_turnstile_site_key'] = sanitize_text_field(stripslashes($data['aiowps_turnstile_site_key'])); + $options['aiowps_recaptcha_site_key'] = sanitize_text_field(stripslashes($data['aiowps_recaptcha_site_key'])); + + $turnstile_theme = isset($data['aiowps_turnstile_theme']) ? sanitize_text_field($data['aiowps_turnstile_theme']) : ''; + $turnstile_theme = array_key_exists($turnstile_theme, $captcha_themes) ? $turnstile_theme : 'auto'; + $options['aiowps_turnstile_theme'] = $turnstile_theme; + + // If secret key is masked then don't resave it + $turnstile_secret_key = sanitize_text_field($data['aiowps_turnstile_secret_key']); + if (strpos($turnstile_secret_key, '********') === false) { + $options['aiowps_turnstile_secret_key'] = $turnstile_secret_key; + } + + // If secret key is masked then don't resave it + $recaptcha_secret_key = sanitize_text_field($data['aiowps_recaptcha_secret_key']); + if (strpos($recaptcha_secret_key, '********') === false) { + $options['aiowps_recaptcha_secret_key'] = $recaptcha_secret_key; + } + + if ('google-recaptcha-v2' == $aio_wp_security->configs->get_value('aiowps_default_captcha') && false === $aio_wp_security->captcha_obj->google_recaptcha_verify_configuration($aio_wp_security->configs->get_value('aiowps_recaptcha_site_key'), $aio_wp_security->configs->get_value('aiowps_recaptcha_secret_key'))) { + $options['aios_google_recaptcha_invalid_configuration'] = '1'; + } elseif ('1' == $aio_wp_security->configs->get_value('aios_google_recaptcha_invalid_configuration')) { + $aio_wp_security->configs->delete_value('aios_google_recaptcha_invalid_configuration'); + } + + $this->save_settings($options); + + $success = false; + $message = ''; + if ('cloudflare-turnstile' == $aio_wp_security->configs->get_value('aiowps_default_captcha') && false === $aio_wp_security->captcha_obj->cloudflare_turnstile_verify_configuration($aio_wp_security->configs->get_value('aiowps_turnstile_site_key'), $aio_wp_security->configs->get_value('aiowps_turnstile_secret_key'))) { + $message = __('Your Cloudflare Turnstile configuration is invalid.', 'all-in-one-wp-security-and-firewall').' '.__('Please enter the correct Cloudflare Turnstile keys below to use the Turnstile feature.', 'all-in-one-wp-security-and-firewall'); + } elseif ('google-recaptcha-v2' == $aio_wp_security->configs->get_value('aiowps_default_captcha') && '1' == $aio_wp_security->configs->get_value('aios_google_recaptcha_invalid_configuration')) { + $message = __('Your Google reCAPTCHA configuration is invalid.', 'all-in-one-wp-security-and-firewall').' '.__('Please enter the correct reCAPTCHA keys below to use the reCAPTCHA feature.', 'all-in-one-wp-security-and-firewall'); + } else { + $success = true; + } + + $features = array( + "user-login-captcha", + "user-registration-captcha", + "lost-password-captcha", + "custom-login-captcha", + "comment-form-captcha", + "password_protected-captcha", + ); + + if (AIOWPSecurity_Utility::is_woocommerce_plugin_active()) { + $woocommerce_features = array( + "woo-login-captcha", + "woo-lostpassword-captcha", + "woo-register-captcha", + "woo-checkout-captcha", + ); + $features = array_merge($features, $woocommerce_features); + } + + if (AIOWPSecurity_Utility::is_buddypress_plugin_active()) { + $features[] = "bp-register-captcha"; + } + + if (AIOWPSecurity_Utility::is_bbpress_plugin_active()) { + $features[] = "bbp-new-topic-captcha"; + } + + if (AIOWPSecurity_Utility::is_contact_form_7_plugin_active()) { + $features[] = "contact-form-7-captcha"; + } + + $args = array( + 'badges' => $features + ); + + return $this->handle_response($success, $message, $args); + } + + /** + * Handles the AJAX request to enable or configure 404 detection and settings. + * + * @param array $data The data received from the AJAX request. + * + * @return array The response containing the status, message, and badge. + */ + public function perform_404_settings($data) { + + $options = array(); + $info = array(); + $values = array(); + + $options['aiowps_enable_404_logging'] = isset($data["aiowps_enable_404_IP_lockout"]) ? '1' : ''; //the "aiowps_enable_404_IP_lockout" checkbox currently controls both the 404 lockout and 404 logging + $options['aiowps_enable_404_IP_lockout'] = isset($data["aiowps_enable_404_IP_lockout"]) ? '1' : ''; + + $lockout_time_length = isset($data['aiowps_404_lockout_time_length']) ? sanitize_text_field($data['aiowps_404_lockout_time_length']) : ''; + $redirect_url = isset($data['aiowps_404_lock_redirect_url']) ? sanitize_text_field(trim($data['aiowps_404_lock_redirect_url'])) : ''; + + if (isset($data["aiowps_enable_404_IP_lockout"])) { + if (!is_numeric($lockout_time_length) || $lockout_time_length < 1) { + $info[] = __('You entered a non numeric or negative value for the lockout time length field.', 'all-in-one-wp-security-and-firewall'). ' ' . __('It has been set to the default value.', 'all-in-one-wp-security-and-firewall'); + $lockout_time_length = '60'; // Set it to the default value for this field + } + + if ('' == $redirect_url || '' == esc_url($redirect_url, array('http', 'https'))) { + $info[] = __('You entered an incorrect format for the "Redirect URL" field.', 'all-in-one-wp-security-and-firewall') . ' ' . __('It has been set to the default value.', 'all-in-one-wp-security-and-firewall'); + $redirect_url = 'http://127.0.0.1'; + } + } + + $options['aiowps_404_lockout_time_length'] = absint($lockout_time_length); + $options['aiowps_404_lock_redirect_url'] = $redirect_url; + $this->save_settings($options); + + $badges = array("firewall-enable-404-blocking"); + $values['aiowps_404_lockout_time_length'] = $lockout_time_length; + $values['aiowps_404_lock_redirect_url'] = $redirect_url; + + $args = array( + 'badges' => $badges, + 'info' => $info, + 'values' => $values + ); + + return $this->handle_response(true, '', $args); + } + + /** + * Handles the AJAX request to clear 404 logs. + * + * @return array The response containing the status, message, and badge. + */ + public function perform_delete_404_event_records() { + global $aio_wp_security, $wpdb; + + $success = true; + $events_table_name = AIOWPSEC_TBL_EVENTS; + //Delete all 404 records from the events table + $where = array('event_type' => '404'); + $result = $wpdb->delete($events_table_name, $where); + + if (false === $result) { + $error = empty($wpdb->last_error) ? '' : $wpdb->last_error; + $aio_wp_security->debug_logger->log_debug("404 Detection Feature - Delete all 404 event logs operation failed. $error", 4); + $success = false; + $message = __('404 Detection Feature - The operation to delete all the 404 event logs failed', 'all-in-one-wp-security-and-firewall'); + } else { + $message = __('All 404 event logs were deleted from the database successfully.', 'all-in-one-wp-security-and-firewall'); + } + + return $this->handle_response($success, $message); + } + + /** + * Handles the AJAX request for 404 log item actions. + * + * @param array $data The data received from the AJAX request. + * + * @return array The response containing the status, message, and badge. + */ + public function perform_404_log_item_action($data) { + global $wpdb, $aio_wp_security, $aiowps_firewall_config; + + if (empty($data['action']) || !in_array($data['action'], array('delete', 'temp_block', 'blacklist', 'unblock'))) { + return $this->handle_response(false, __('Invalid action provided for 404 log item.', 'all-in-one-wp-security-and-firewall')); + } + + $action = $data['action']; + $message = false; + + switch ($action) { + case 'delete': + if (!isset($data['id'])) { + return $this->handle_response(false, __('Invalid 404 event log ID provided.', 'all-in-one-wp-security-and-firewall')); + } + $events_table = AIOWPSEC_TBL_EVENTS; + $id = absint($data['id']); + //Delete single record + $delete_command = "DELETE FROM " . $events_table . " WHERE id = '" . absint($id) . "'"; + $result = $wpdb->query($delete_command); + if (false === $result) { + // Error on single delete + $aio_wp_security->debug_logger->log_debug('Database error occurred when deleting rows from Events table. Database error: '.$wpdb->last_error, 4); + return $this->handle_response(false, __('The selected record(s) have failed to delete.', 'all-in-one-wp-security-and-firewall')); + } else { + $message = __('The selected record(s) has been deleted successfully.', 'all-in-one-wp-security-and-firewall'); + } + break; + case 'temp_block': + if (!isset($data['ip'])) { + return $this->handle_response(false, __('Invalid IP provided.', 'all-in-one-wp-security-and-firewall')); + } + $ip = sanitize_text_field($data['ip']); + $username = isset($data['username']) ? sanitize_user($data['username']) : ''; + + if (AIOWPSecurity_Utility_IP::get_user_ip_address() == $ip) { + return $this->handle_response(false, __('You cannot block your own IP address:', 'all-in-one-wp-security-and-firewall') . ' ' . $ip); + } + //Block single record + if (filter_var($ip, FILTER_VALIDATE_IP)) { + AIOWPSecurity_Utility::lock_IP($ip, '404', $username); + $message = __('The selected IP address is now temporarily blocked.', 'all-in-one-wp-security-and-firewall'); + } else { + $message = __('The selected entry is not a valid IP address.', 'all-in-one-wp-security-and-firewall'); + return $this->handle_response(false, $message); + } + break; + case 'blacklist': + if (!isset($data['ip'])) { + return $this->handle_response(false, __('Invalid IP provided.', 'all-in-one-wp-security-and-firewall')); + } + + $bl_ip_addresses = $aio_wp_security->configs->get_value('aiowps_banned_ip_addresses'); //get the currently saved blacklisted IPs + $ip_list_array = AIOWPSecurity_Utility_IP::create_ip_list_array_from_string_with_newline($bl_ip_addresses); + $ip = sanitize_text_field($data['ip']); + $ip_list_array[] = $ip; + $validated_ip_list_array = AIOWPSecurity_Utility_IP::validate_ip_list($ip_list_array, 'blacklist'); + + if (is_wp_error($validated_ip_list_array)) { + $response = nl2br($validated_ip_list_array->get_error_message()); + return $this->handle_response(false, $response); + } else { + $banned_ip_data = implode("\n", $validated_ip_list_array); + $aio_wp_security->configs->set_value('aiowps_enable_blacklisting', '1'); // Force blacklist feature to be enabled. + $aio_wp_security->configs->set_value('aiowps_banned_ip_addresses', $banned_ip_data); + $aio_wp_security->configs->save_config(); + + $aiowps_firewall_config->set_value('aiowps_blacklist_ips', $validated_ip_list_array); + $message = __('The selected IP addresses have been added to the blacklist and will be permanently blocked.', 'all-in-one-wp-security-and-firewall'); + } + break; + case 'unblock': + if (!isset($data['ip'])) { + return $this->handle_response(false, __('Invalid log event ID provided.', 'all-in-one-wp-security-and-firewall')); + } + + $ip_range = sanitize_text_field($data['ip']); + $lockout_table = AIOWPSEC_TBL_LOGIN_LOCKOUT; + + // get the latest data with that ip in the table that's locked and reason is 404 + $query = $wpdb->prepare("SELECT id FROM {$lockout_table} WHERE `released` > UNIX_TIMESTAMP() AND `lock_reason` = %s and failed_login_ip = %s ORDER BY id ASC LIMIT 1", '404', $ip_range); + $id = $wpdb->get_var($query); + + if (null === $id) { + return $this->handle_response(false, __('Invalid log event ID provided.', 'all-in-one-wp-security-and-firewall')); + } + + $result = $wpdb->query($wpdb->prepare("UPDATE $lockout_table SET `released` = UNIX_TIMESTAMP() WHERE `id` = %d", absint($id))); + + if (null != $result) { + $message = __('Access from the selected IP address has been unblocked.', 'all-in-one-wp-security-and-firewall'); + } else { + return $this->handle_response(false, __('The selected IP entry could not be unlocked', 'all-in-one-wp-security-and-firewall')); + } + break; + } + + return $this->handle_response(true, $message); + } + + /** + * Get the content for performing a cookie test. + * + * This method checks if the cookie test is successful or if the brute-force attack prevention feature is already enabled. + * If either condition is true, it returns an empty string. Otherwise, it displays a message prompting the user to perform + * a cookie test before enabling the feature, along with a button to initiate the test. + * + * @return string The HTML content for the cookie test section. + */ + private function get_perform_cookie_test_content() { + global $aio_wp_security; + $cookie_test_value = $aio_wp_security->configs->get_value('aiowps_cookie_test_success'); + + if ('1' == $cookie_test_value || '1' == $aio_wp_security->configs->get_value('aiowps_enable_brute_force_attack_prevention')) { + return ''; + } else { + return $aio_wp_security->include_template('wp-admin/brute-force/partials/cookie-test-container.php', true); + } + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-comment-commands.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-comment-commands.php new file mode 100755 index 00000000..e2f65953 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-comment-commands.php @@ -0,0 +1,221 @@ + $aiowps_trash_spam_comments_after_days + ); + } + + $response['status'] = 'success'; + $response['message'] = __('The settings were successfully updated.', 'all-in-one-wp-security-and-firewall'); + $response['info'] = $info; + + // Commit the config settings + $this->save_settings($options); + AIOWPSecurity_Comment::trash_spam_comments(); + $response['badges'] = $this->get_features_id_and_html(array('detect-spambots')); + + return $response; + } + + /** + * Perform the saving of comment auto block spammers ip settings + * + * @param array $data - the request data contains the post data + * + * @return array + */ + public function perform_auto_block_spam_ip($data) { + $response = array( + 'status' => 'success', + 'values' => array(), + 'info' => array() + ); + + $enable_auto_block_ip = isset($data["aiowps_enable_autoblock_spam_ip"]) ? '1' : ''; + + $spam_ip_min_comments = sanitize_text_field($data['aiowps_spam_ip_min_comments_block']); + if (!is_numeric($spam_ip_min_comments)) { + $response['info'][] = __('You entered a non-numeric value for the "minimum number of spam comments" field; it has been set to the default value.', 'all-in-one-wp-security-and-firewall'); + $spam_ip_min_comments = '3';// Set it to the default value for this field + } elseif ((int) $spam_ip_min_comments <= 0 || empty($spam_ip_min_comments)) { + $response['info'][] = __('You must enter an integer greater than zero for the "minimum number of spam comments" field; it has been set to the default value.', 'all-in-one-wp-security-and-firewall'); + $spam_ip_min_comments = '3';// Set it to the default value for this field + } + + // Save all the form values to the options + $options = array( + 'aiowps_enable_autoblock_spam_ip' => $enable_auto_block_ip, + 'aiowps_spam_ip_min_comments_block' => absint($spam_ip_min_comments), + ); + + $this->save_settings($options); + $response['message'] = __('The settings were successfully updated.', 'all-in-one-wp-security-and-firewall'); + + $response['badges'] = $this->get_features_id_and_html(array('auto-block-spam-ips')); + $response['values']['aiowps_spam_ip_min_comments_block'] = absint($spam_ip_min_comments); + + return $response; + } + + /** + * Perform the ip spam comment search + * + * @param array $data - the request data contains the post data + * + * @return array + */ + public function perform_ip_spam_search($data) { + $response = array( + 'status' => 'success', + 'info' => array() + ); + + $min_comments_per_ip = sanitize_text_field($data['aiowps_spam_ip_min_comments']); + $error = ''; + + if (!is_numeric($min_comments_per_ip)) { + $error = __('You entered a non-numeric value for the minimum spam comments per IP field; it has been set to the default value.', 'all-in-one-wp-security-and-firewall'); + $min_comments_per_ip = '5'; // Set it to the default value for this field + } elseif ((int) $min_comments_per_ip <= 0 || empty($min_comments_per_ip)) { + $error = __('You must enter an integer greater than zero for the minimum spam comments per IP field; it has been set to the default value.', 'all-in-one-wp-security-and-firewall'); + $min_comments_per_ip = '5'; // Set it to the default value for this field + } + + $min_comments_per_ip = absint($min_comments_per_ip); + + // Save all the form values to the options + $this->save_settings(array( + 'aiowps_spam_ip_min_comments' => $min_comments_per_ip + )); + + if (!empty($error)) { + $response['message'] = $error; + } + + $response['values']['aiowps_spam_ip_min_comments'] = $min_comments_per_ip; + + return $response; + } + + /** + * Perform the action of blocking a spam IP address. + * + * This function takes an IP address as input, checks if it is valid and not the user's own IP, + * and then attempts to add it to the block list for spam. It returns the status and message of the operation. + * + * @param array $data The data containing the IP address to block. + * + * @return array The result of the block operation, including status, message, and updated blocked comments output. + */ + public function perform_block_spam_ip($data) { + + if (empty($data['ip'])) { + return array('status' => 'error', 'message' => __('Invalid IP address provided.', 'all-in-one-wp-security-and-firewall')); + } + + $ip = wp_strip_all_tags($data['ip']); + + if (AIOWPSecurity_Utility_IP::get_user_ip_address() == $ip) { + return array('status' => 'error', 'message' => __('You cannot block your own IP address:', 'all-in-one-wp-security-and-firewall') . ' ' . $ip); + } + + $result = AIOWPSecurity_Blocking::add_ip_to_block_list($ip, 'spam'); + + if ($result) { + $status = 'success'; + $message = __('The selected IP address is now permanently blocked.', 'all-in-one-wp-security-and-firewall'); + } else { + $status = 'error'; + $message = __('The selected IP address could not be blocked due to one of the following reasons:', 'all-in-one-wp-security-and-firewall'); + $message .= ' ' . __('either it has already been blocked, or your user account lacks sufficient permissions to perform IP blocking.', 'all-in-one-wp-security-and-firewall'); + } + + return array( + 'status' => $status, + 'message' => $message, + 'content' => array('aios-blocked-comments-output' => $this->get_blocked_comments_output()) + ); + } + + /** + * Retrieves the output for displaying blocked comments due to spam. + * + * This function queries the database to get IP addresses that are permanently blocked due to spam. + * It returns HTML output that displays the count of IPs blocked today and the all-time total count. + * + * @global object $aio_wp_security The global instance of the aio_wp_security class. + * @global object $wpdb The global instance of the WordPress database class. + * + * @return string HTML output for the blocked comments section. + */ + private function get_blocked_comments_output() { + global $aio_wp_security, $wpdb; + + $block_comments_output = ''; + $min_block_comments = $aio_wp_security->configs->get_value('aiowps_spam_ip_min_comments_block'); + + if (!empty($min_block_comments)) { + $now_date = (new DateTime('now', new DateTimeZone('UTC')))->format('Y-m-d'); + + $sql = $wpdb->prepare( + "SELECT COUNT(*) AS total_count, + SUM(CASE WHEN DATE(FROM_UNIXTIME(created)) = %s THEN 1 ELSE 0 END) AS todays_blocked_count FROM ".AIOWPSEC_TBL_PERM_BLOCK." WHERE block_reason = %s", + $now_date, + 'spam' + ); + + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore + $result = $wpdb->get_row($sql); + + $block_comments_output = '
'; + if (empty($result) || 0 == $result->total_count) { + $block_comments_output .= '

'.esc_html__('You currently have no IP addresses permanently blocked due to spam.', 'all-in-one-wp-security-and-firewall').'

'; + } else { + $todays_blocked_count = $result->todays_blocked_count; + $total_count = $result->total_count; + + $block_comments_output .= '

'.esc_html__('Spammer IPs added to permanent block list today:', 'all-in-one-wp-security-and-firewall') . ' ' . esc_html($todays_blocked_count) . '

'; + $block_comments_output .= '

'.esc_html__('All time total:', 'all-in-one-wp-security-and-firewall'). ' ' . $total_count.'

'; + $block_comments_output .= '

'.esc_html__('View blocked IPs', 'all-in-one-wp-security-and-firewall').'

'; + } + $block_comments_output .= '
'; + } + + return $block_comments_output; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-file-scan-commands.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-file-scan-commands.php new file mode 100755 index 00000000..a53bf6fb --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-file-scan-commands.php @@ -0,0 +1,280 @@ +configs->get_value('aiowps_fcd_exclude_filetypes')) { + $reset_scan_data = true; + } + } + + if (!empty($data['aiowps_fcd_exclude_files'])) { + $files = sanitize_textarea_field(trim($data['aiowps_fcd_exclude_files'])); + // Get the currently saved config value and check if this has changed. If so do another scan to reset the scan data so it omits these files/dirs + if ($files != $aio_wp_security->configs->get_value('aiowps_fcd_exclude_files')) { + $reset_scan_data = true; + } + } + + // Explode by end-of-line character, then trim and filter empty lines + $email_list_array = array_filter(array_map('trim', explode("\n", $data['aiowps_fcd_scan_email_address'])), 'strlen'); + foreach ($email_list_array as $key => $value) { + $email_sane = sanitize_email($value); + if (!is_email($email_sane)) { + $errors[] = __('The following address was removed because it is not a valid email address:', 'all-in-one-wp-security-and-firewall') . ' ' . htmlspecialchars($value); + unset($email_list_array[$key]); + } + } + $email_address = implode("\n", $email_list_array); + if (!empty($errors)) { + $info[] = implode('
', $errors); + } + + // Save all the form values to the options + $options['aiowps_enable_automated_fcd_scan'] = isset($data["aiowps_enable_automated_fcd_scan"]) ? '1' : ''; + $options['aiowps_fcd_scan_frequency'] = absint($fcd_scan_frequency); + $options['aiowps_fcd_scan_interval'] = sanitize_text_field($data["aiowps_fcd_scan_interval"]); + $options['aiowps_fcd_exclude_filetypes'] = $file_types; + $options['aiowps_fcd_exclude_files'] = $files; + $options['aiowps_send_fcd_scan_email'] = isset($data["aiowps_send_fcd_scan_email"]) ? '1' : ''; + $options['aiowps_fcd_scan_email_address'] = $email_address; + $this->save_settings($options); + + $content['aios-file-change-info-box'] = ''; + // Let's check if backup interval was set to less than 24 hours + if (isset($data["aiowps_enable_automated_fcd_scan"]) && ($fcd_scan_frequency < 24) && 0 == $data["aiowps_fcd_scan_interval"]) { + $content['aios-file-change-info-box'] = '
'; + $content['aios-file-change-info-box'] .= '

' . __('You have configured your file change detection scan to occur at least once daily.', 'all-in-one-wp-security-and-firewall') . '

'; + $content['aios-file-change-info-box'] .= '

' . __('For most websites we recommended that you choose a less frequent schedule such as once every few days, once a week or once a month.', 'all-in-one-wp-security-and-firewall') . '

'; + $content['aios-file-change-info-box'] .= '

' . __('Choosing a less frequent schedule will also help reduce your server load.', 'all-in-one-wp-security-and-firewall') . '

'; + $content['aios-file-change-info-box'] .= '
'; + } + + if ($reset_scan_data) { + $aio_wp_security->scan_obj->execute_file_change_detection_scan(); + $new_scan_alert = __('New scan completed: The plugin has detected that you have made changes to the "File Types To Ignore" or "Files To Ignore" fields.', 'all-in-one-wp-security-and-firewall').' '.__('In order to ensure that future scan results are accurate, the old scan data has been refreshed.', 'all-in-one-wp-security-and-firewall'); + $info[] = $new_scan_alert; + } + + $next_fcd_scan_time = AIOWPSecurity_Scan::get_next_scheduled_scan(); + + if (false == $next_fcd_scan_time) { + $next_scheduled_scan = '' . esc_html__('Nothing is currently scheduled', 'all-in-one-wp-security-and-firewall') . ''; + } else { + $scan_time = AIOWPSecurity_Utility::convert_timestamp($next_fcd_scan_time, 'D, F j, Y H:i'); + $next_scheduled_scan = '' . esc_html($scan_time) . ''; + } + + $content['aiowps-next-files-scan-inner'] = $next_scheduled_scan; + $values = array('aiowps_fcd_scan_frequency' => absint($fcd_scan_frequency)); + $badges = array('scan-file-change-detection'); + + $args = array( + 'content' => $content, + 'values' => $values, + 'badges' => $badges, + 'info' => $info + ); + + return $this->handle_response(true, '', $args); + } + + /** + * Retrieves the last file scan data and returns the data to UDC. + * + * @param array $data The request data. + * + * @return array|string[]|WP_Error + */ + public function get_last_scan_data($data) { + global $aio_wp_security; + + if (!AIOWPSecurity_Utility_Permissions::has_manage_cap()) { + return new WP_Error(esc_html__('Sorry, you do not have enough privilege to execute the requested action.', 'all-in-one-wp-security-and-firewall')); + } + + if ($data['reset_change_detected']) { + $aio_wp_security->configs->set_value('aiowps_fcds_change_detected', false, true); + } + + $fcd_data = AIOWPSecurity_Scan::get_fcd_data(); + + $data = $fcd_data['last_scan_result']; + + foreach (array('files_added', 'files_removed', 'files_changed') as $key) { + /* Normalize missing or non-array buckets to an empty array and skip processing */ + if (!isset($data[$key]) || !is_array($data[$key])) { + $data[$key] = array(); + continue; + } + + /* Convert last_modified for each entry */ + foreach ($data[$key] as &$info) { + if (is_array($info) && array_key_exists('last_modified', $info) && is_numeric($info['last_modified'])) { + $info['last_modified'] = AIOWPSecurity_Utility::convert_timestamp($info['last_modified']); + } + } + + unset($info); + } + + $fcd_data['last_scan_result'] = $data; + + return $this->handle_response(true, false, array('extra_args' => $fcd_data)); + } + + /** + * Gets the last file scan result and returns the scan result HTML template + * + * @param array $data - the request data + * + * @return array + */ + public function get_last_scan_results($data) { + global $aio_wp_security; + + if ($data['reset_change_detected']) $aio_wp_security->configs->set_value('aiowps_fcds_change_detected', false, true); + + $fcd_data = AIOWPSecurity_Scan::get_fcd_data(); + + if (!$fcd_data || !isset($fcd_data['last_scan_result'])) { + // no fcd data found + $message = __('No previous scan data was found; either run a manual scan or schedule regular file scans', 'all-in-one-wp-security-and-firewall'); + return $this->handle_response(false, $message); + } + + $content = array('aiowps_previous_scan_wrapper' => $aio_wp_security->include_template('wp-admin/scanner/scan-result.php', true, array('fcd_data' => $fcd_data))); + + return $this->handle_response(true, false, array('content' => $content)); + } + + /** + * Performs a file scan and returns the scan result + * + * @return array + */ + public function perform_file_scan() { + global $aio_wp_security; + + $content = array(); + $extra_args = array(); + + $result = $aio_wp_security->scan_obj->execute_file_change_detection_scan(); + + if (false === $result) { + // error case + $message = __('There was an error during the file change detection scan.', 'all-in-one-wp-security-and-firewall') . ' ' . __('Please check the plugin debug logs.', 'all-in-one-wp-security-and-firewall'); + return $this->handle_response(false, $message); + } + + $aio_wp_security->configs->set_value('aiowps_last_scan_time', time(), true); + + // If this is first scan display special message + if (1 == $result['initial_scan']) { + $extra_args['result'] = __('This is your first file change detection scan.', 'all-in-one-wp-security-and-firewall').' '.__('The details from this scan will be used for future scans.', 'all-in-one-wp-security-and-firewall'). ' ' . __('View the file scan results', 'all-in-one-wp-security-and-firewall') . ''; + $content['aiowps-previous-files-scan-inner'] = '' . __('View last file scan results', 'all-in-one-wp-security-and-firewall') . ''; + } elseif (!$aio_wp_security->configs->get_value('aiowps_fcds_change_detected')) { + $extra_args['result'] = __('The scan is complete - There were no file changes detected.', 'all-in-one-wp-security-and-firewall'); + } elseif ($aio_wp_security->configs->get_value('aiowps_fcds_change_detected')) { + $extra_args['result'] = __('The scan has detected that there was a change in your website\'s files.', 'all-in-one-wp-security-and-firewall'). ' ' . __('View the file scan results', 'all-in-one-wp-security-and-firewall') . ''; + } + + $args = array( + 'extra_args' => $extra_args, + 'content' => $content + ); + + return $this->handle_response(true, false, $args); + } + + /** + * Render the legacy UDC Scanner. + * + * @return array + */ + public function get_scanner_contents() { + global $aio_wp_security; + + $GLOBALS['aiowps_feature_mgr'] = $this->get_feature_mgr_object(); + + $scanner_data = $this->get_scanner_data(); + + $content = $aio_wp_security->include_template('wp-admin/scanner/file-change-detect.php', true, $scanner_data); + + return array( + 'status' => 'success', + 'content' => $content, + ); + } + + /** + * Return file scanner data. + * + * @return array Array of option values, + */ + public function get_scanner_data() { + global $aio_wp_security; + + $fcd_data = AIOWPSecurity_Scan::get_fcd_data(); + $previous_scan = isset($fcd_data['last_scan_result']); + + $next_fcd_scan_time = AIOWPSecurity_Scan::get_next_scheduled_scan(); + + $aiowps_fcds_change_detected = $aio_wp_security->configs->get_value('aiowps_fcds_change_detected'); + $aiowps_enable_automated_fcd_scan = $aio_wp_security->configs->get_value('aiowps_enable_automated_fcd_scan'); + $aiowps_fcd_scan_frequency = $aio_wp_security->configs->get_value('aiowps_fcd_scan_frequency'); + $aiowps_fcd_scan_interval = $aio_wp_security->configs->get_value('aiowps_fcd_scan_interval'); + $aiowps_fcd_exclude_filetypes = $aio_wp_security->configs->get_value('aiowps_fcd_exclude_filetypes'); + $aiowps_fcd_exclude_files = $aio_wp_security->configs->get_value('aiowps_fcd_exclude_files'); + $aiowps_send_fcd_scan_email = $aio_wp_security->configs->get_value('aiowps_send_fcd_scan_email'); + $aiowps_fcd_scan_email_address = $aio_wp_security->configs->get_value('aiowps_fcd_scan_email_address'); + $aiowps_last_scan_time = $aio_wp_security->configs->get_value('aiowps_last_scan_time'); + + return array( + 'previous_scan' => $previous_scan, + 'next_fcd_scan_time' => false === $next_fcd_scan_time ? '' : AIOWPSecurity_Utility::convert_timestamp($next_fcd_scan_time, 'D, F j, Y H:i'), + 'aiowps_fcds_change_detected' => $aiowps_fcds_change_detected, + 'aiowps_enable_automated_fcd_scan' => $aiowps_enable_automated_fcd_scan, + 'aiowps_fcd_scan_frequency' => $aiowps_fcd_scan_frequency, + 'aiowps_fcd_scan_interval' => $aiowps_fcd_scan_interval, + 'aiowps_fcd_exclude_filetypes' => $aiowps_fcd_exclude_filetypes, + 'aiowps_fcd_exclude_files' => $aiowps_fcd_exclude_files, + 'aiowps_send_fcd_scan_email' => $aiowps_send_fcd_scan_email, + 'aiowps_fcd_scan_email_address' => $aiowps_fcd_scan_email_address, + 'aiowps_last_scan_time' => AIOWPSecurity_Utility::convert_timestamp($aiowps_last_scan_time, 'D, F j, Y H:i'), + ); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-files-commands.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-files-commands.php new file mode 100755 index 00000000..16dd18b1 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-files-commands.php @@ -0,0 +1,224 @@ + $aio_wp_security->include_template('wp-admin/filesystem-security/partials/file-permissions-table.php', true, array('files_dirs_to_check' => $files_dirs_to_check, 'file_utility' => new AIOWPSecurity_Utility_File()))); + $args = array( + 'content' => $content, + 'badges' => $badges, + ); + + return $this->handle_response($success, $message, $args); + } + + /** + * This function performs file protection settings + * + * @param array $data - the request data contains the settings + * + * @return array + */ + public function perform_file_protection_settings($data) { + global $aio_wp_security; + + $success = true; + $message = ''; + + $options = array(); + // Update settings for delete readme.html and wp-config-sample.php. + $options['aiowps_auto_delete_default_wp_files'] = isset($data['aiowps_auto_delete_default_wp_files']) ? '1' : ''; + + // Update settings for prevent hotlinking. + $options['aiowps_prevent_hotlinking'] = isset($data['aiowps_prevent_hotlinking']) ? '1' : ''; + + // Update settings for php file editing + $disable_file_editing = isset($data["aiowps_disable_file_editing"]) ? '1' : ''; + $disable_file_editing_status = $disable_file_editing ? AIOWPSecurity_Utility::disable_file_edits() : AIOWPSecurity_Utility::enable_file_edits(); + if ($disable_file_editing_status) { + // Save settings if no errors + $options['aiowps_disable_file_editing'] = $disable_file_editing; + } else { + $message = __('Disable PHP file editing failed: unable to modify or make a backup of the wp-config.php file.', 'all-in-one-wp-security-and-firewall'); + return $this->handle_response(false, $message); + } + + $this->save_settings($options); + + + if (AIOWPSecurity_Utility_Htaccess::write_to_htaccess() && '' !== $options['aiowps_prevent_hotlinking']) { + + // Now let's write the applicable rules to the .htaccess file + $res = AIOWPSecurity_Utility_Htaccess::write_to_htaccess(); + + if ($res) { + $message = __('The settings have been successfully updated', 'all-in-one-wp-security-and-firewall'); + } else { + $success = false; + $message = __('Could not write to the .htaccess file.', 'all-in-one-wp-security-and-firewall'); + + // revert options affected by .htaccess write fail + $options['aiowps_prevent_hotlinking'] = $aio_wp_security->configs->get_value('aiowps_prevent_hotlinking'); + $this->save_settings($options); + } + } + + $features = array( + "auto-delete-wp-files", + "prevent-hotlinking", + "filesystem-file-editing", + ); + + return $this->handle_response($success, $message, array('badges' => $features)); + } + + /** + * This function performs deleting default wp files + * + * @return array + */ + public function perform_delete_default_wp_files() { + $success = true; + $message = __('The files have been deleted successfully.', 'all-in-one-wp-security-and-firewall'); + + $result = AIOWPSecurity_Utility::delete_unneeded_default_files(); + + if (!empty($result['error'])) { + $success = false; + $message = sprintf(__('Failed to delete the %s file(s).', 'all-in-one-wp-security-and-firewall'), $result['error']) . '
' . __('Please try to delete them manually.', 'all-in-one-wp-security-and-firewall'); + } + + return $this->handle_response($success, $message, array('info' => $result['info'])); + } + + /** + * This function performs save copy protection settings + * + * @param array $data - the request data + * + * @return array + */ + public function perform_save_copy_protection($data) { + $this->save_settings(array('aiowps_copy_protection' => isset($data["aiowps_copy_protection"]) ? '1' : '')); + + return $this->handle_response(true, '', array('badges' => array('enable-copy-protection'))); + } + + /** + * This function performs save frame display prevent setting + * + * @param array $data - the request data + * + * @return array + */ + public function perform_save_frame_display_prevent($data) { + $this->save_settings(array('aiowps_prevent_site_display_inside_frame' => isset($data["aiowps_prevent_site_display_inside_frame"]) ? '1' : '')); + + return $this->handle_response(true, '', array('badges' => array('enable-frame-protection'))); + } + + /** + * This function performs host system logs + * + * @param array $data - the request data contains the lgos settings + * + * @return array + */ + public function perform_host_system_logs($data) { + + $content = array(); + $success = true; + $message = false; + + if (isset($data['aiowps_system_log_file'])) { + if ('' != $data['aiowps_system_log_file']) { + $sys_log_file = basename(sanitize_text_field($data['aiowps_system_log_file'])); + } else { + $sys_log_file = 'error_log'; + } + $this->save_settings(array('aiowps_system_log_file' => $sys_log_file)); + } + + $logResults = AIOWPSecurity_Utility_File::recursive_file_search($sys_log_file, 0, ABSPATH); + + if (empty($logResults) || '' == $logResults) { + $success = false; + $message = __('No system logs were found.', 'all-in-one-wp-security-and-firewall'); + } else { + $content['aios-host-system-logs-results'] = ''; + foreach ($logResults as $file) { + $content['aios-host-system-logs-results'] .= $this->display_system_logs_in_table($file); + } + } + + $values = array('aiowps_system_log_file' => $sys_log_file); + + $args = array( + 'content' => $content, + 'values' => $values + ); + + return $this->handle_response($success, $message, $args); + } + + /** + * Displays the last 50 entries of a system log file in a table format. + * + * This function reads the contents of the specified file and returns a + * rendered template displaying the last 50 entries of the log file. + * + * @param string $filepath The path to the log file to be read. + * + * @return string The rendered HTML template displaying the log entries. + */ + private function display_system_logs_in_table($filepath) { + global $aio_wp_security; + // Get contents of the error_log file + $last_50_entries = AIOWPSecurity_Utility_File::read_file_lines($filepath, -1, 50, true); + return $aio_wp_security->include_template('wp-admin/filesystem-security/filesystem-log-result.php', true, array('filepath' => $filepath, 'last_50_entries' => $last_50_entries)); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-firewall-commands.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-firewall-commands.php new file mode 100755 index 00000000..152f6ff6 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-firewall-commands.php @@ -0,0 +1,787 @@ +set_value('aiowps_enable_pingback_firewall', $enable_pingback); + $options['aiowps_disable_xmlrpc_pingback_methods'] = isset($data["aiowps_disable_xmlrpc_pingback_methods"]) ? '1' : ''; //this disables only pingback methods of xmlrpc but leaves other methods so that Jetpack and other apps will still work + $options['aiowps_disable_rss_and_atom_feeds'] = isset($data['aiowps_disable_rss_and_atom_feeds']) ? '1' : ''; + $aiowps_firewall_config->set_value('aiowps_forbid_proxy_comments', isset($data['aiowps_forbid_proxy_comments'])); + $aiowps_firewall_config->set_value('aiowps_deny_bad_query_strings', isset($data['aiowps_deny_bad_query_strings'])); + $aiowps_firewall_config->set_value('aiowps_advanced_char_string_filter', isset($data['aiowps_advanced_char_string_filter'])); + + $block_request_methods = array_map('strtolower', AIOS_Abstracted_Ids::get_firewall_block_request_methods()); + $current_request_methods_settings = $aiowps_firewall_config->get_value('aiowps_6g_block_request_methods'); + $current_other_settings = array( + $aiowps_firewall_config->get_value('aiowps_6g_block_query'), + $aiowps_firewall_config->get_value('aiowps_6g_block_request'), + $aiowps_firewall_config->get_value('aiowps_6g_block_referrers'), + $aiowps_firewall_config->get_value('aiowps_6g_block_agents'), + ); + + $are_methods_set = !empty($current_request_methods_settings); + $are_others_set = array_reduce($current_other_settings, function($carry, $item) { + return $carry || $item; + }); + + if (($are_methods_set || $are_others_set) && '1' !== $aio_wp_security->configs->get_value('aiowps_enable_6g_firewall')) { + $options['aiowps_enable_6g_firewall'] = '1'; + } + + if (isset($data['aiowps_enable_6g_firewall'])) { + $aiowps_6g_block_request_methods = array_filter(AIOS_Abstracted_Ids::get_firewall_block_request_methods(), function($block_request_method) { + return ('PUT' != $block_request_method); + }); + + if (false === $are_methods_set && false === $are_others_set) { + $aiowps_firewall_config->set_value('aiowps_6g_block_request_methods', $aiowps_6g_block_request_methods); + $aiowps_firewall_config->set_value('aiowps_6g_block_query', true); + $aiowps_firewall_config->set_value('aiowps_6g_block_request', true); + $aiowps_firewall_config->set_value('aiowps_6g_block_referrers', true); + $aiowps_firewall_config->set_value('aiowps_6g_block_agents', true); + } else { + $methods = array(); + + foreach ($block_request_methods as $block_request_method) { + if (isset($data['aiowps_block_request_method_'.$block_request_method])) { + $methods[] = strtoupper($block_request_method); + } + } + + $aiowps_firewall_config->set_value('aiowps_6g_block_request_methods', $methods); + $aiowps_firewall_config->set_value('aiowps_6g_block_query', isset($data['aiowps_block_query'])); + $aiowps_firewall_config->set_value('aiowps_6g_block_request', isset($data['aiowps_block_request'])); + $aiowps_firewall_config->set_value('aiowps_6g_block_referrers', isset($data['aiowps_block_refs'])); + $aiowps_firewall_config->set_value('aiowps_6g_block_agents', isset($data['aiowps_block_agents'])); + } + + $options['aiowps_enable_6g_firewall'] = '1'; + + //shows the success notice + } else { + AIOWPSecurity_Configure_Settings::turn_off_all_6g_firewall_configs(); + $options['aiowps_enable_6g_firewall'] = ''; + } + + $aiowps_firewall_config->set_value('aiowps_ban_post_blank_headers', isset($data['aiowps_ban_post_blank_headers'])); + + if (isset($data['aiowps_block_fake_googlebots'])) { + $validated_ip_list_array = AIOWPSecurity_Utility::get_googlebot_ip_ranges(); + + if (is_wp_error($validated_ip_list_array)) { + $info[] = __('The attempt to save the \'Block fake Googlebots\' settings failed, because it was not possible to validate the Googlebot IP addresses:', 'all-in-one-wp-security-and-firewall') . ' ' . $validated_ip_list_array->get_error_message(); + } else { + $aiowps_firewall_config->set_value('aiowps_block_fake_googlebots', true); + $aiowps_firewall_config->set_value('aiowps_googlebot_ip_ranges', $validated_ip_list_array); + } + } else { + $aiowps_firewall_config->set_value('aiowps_block_fake_googlebots', false); + } + $options['aiowps_disallow_unauthorized_rest_requests'] = isset($data["aiowps_disallow_unauthorized_rest_requests"]) ? '1' : ''; + + $aios_whitelisted_rest_routes = array(); + $route_namespaces = AIOWPSecurity_Utility::get_rest_namespaces(); + foreach ($route_namespaces as $route_namespace) { + if (isset($data['aios_whitelisted_rest_routes_'.str_replace('-', '_', $route_namespace)])) { + $aios_whitelisted_rest_routes[] = $route_namespace; + } + } + $options['aios_whitelisted_rest_routes'] = $aios_whitelisted_rest_routes; + + $aios_roles_disallowed_rest_requests = array(); + $user_roles = AIOWPSecurity_Utility_Permissions::get_user_roles(); + foreach ($user_roles as $id => $name) { + if (!isset($data['aios_allowed_roles_rest_requests_'.$id])) { + $aios_roles_disallowed_rest_requests[] = $id; + } + } + $options['aios_roles_disallowed_rest_requests'] = $aios_roles_disallowed_rest_requests; + + // Commit the config settings + $this->save_settings($options); + + $block_request_methods = array_map('strtolower', AIOS_Abstracted_Ids::get_firewall_block_request_methods()); + $methods = $aiowps_firewall_config->get_value('aiowps_6g_block_request_methods'); + if (empty($methods)) { + $methods = array(); + } + + $blocked_query = (bool) $aiowps_firewall_config->get_value('aiowps_6g_block_query'); + $blocked_request = (bool) $aiowps_firewall_config->get_value('aiowps_6g_block_request'); + $blocked_referrers = (bool) $aiowps_firewall_config->get_value('aiowps_6g_block_referrers'); + $blocked_agents = (bool) $aiowps_firewall_config->get_value('aiowps_6g_block_agents'); + $content = array('aios-6g-firewall-settings-container .aios-advanced-options-panel' => $aio_wp_security->include_template('wp-admin/firewall/partials/advanced-settings-6g.php', true, compact('methods', 'blocked_query', 'blocked_request', 'blocked_referrers', 'blocked_agents', 'block_request_methods'))); + + $features = array( + 'firewall-pingback-rules', + 'firewall-disable-rss-and-atom', + 'firewall-forbid-proxy-comments', + 'firewall-deny-bad-queries', + 'firewall-advanced-character-string-filter', + 'firewall-enable-6g', + 'firewall-block-fake-googlebots', + 'firewall-ban-post-blank-headers', + 'disallow-unauthorised-requests', + ); + + $args = array( + 'badges' => $features, + 'content' => $content, + 'info' => $info, + 'extra_args' => array('xmlprc_warning' => $enable_pingback ? $aio_wp_security->include_template('wp-admin/firewall/partials/xmlrpc-warning-notice.php', true) : '') + ); + + return $this->handle_response(true, '', $args); + } + + /** + * Perform saving .htaccess firewall settings + * + * @param array $data - the request data contains the firewall settings + * + * @return array - containing a status and message + */ + public function perform_htaccess_firewall_settings($data) { + global $aio_wp_security; + + + $options = array(); + $info = array(); + $message = ''; + $success = true; + + // Max file upload size in basic rules + $upload_size = absint($data['aiowps_max_file_upload_size']); + + $max_allowed = apply_filters('aiowps_max_allowed_upload_config', 250); // Set a filterable limit of 250MB + $max_allowed = absint($max_allowed); + + if ($upload_size > $max_allowed) { + $upload_size = $max_allowed; + } elseif (empty($upload_size) || 0 > $upload_size) { + $upload_size = AIOS_FIREWALL_MAX_FILE_UPLOAD_LIMIT_MB; + $info[] = __('Max file upload limit was set to default value, because you entered a negative or zero value'); + } + + // Store the current value in case the .htaccess write operation fails and we need to revert it + $original_options = array( + 'aiowps_enable_basic_firewall' => $aio_wp_security->configs->get_value("aiowps_enable_basic_firewall"), + 'aiowps_max_file_upload_size' => $aio_wp_security->configs->get_value('aiowps_max_file_upload_size'), + 'aiowps_block_debug_log_file_access' => $aio_wp_security->configs->get_value("aiowps_block_debug_log_file_access"), + 'aiowps_disable_index_views' => $aio_wp_security->configs->get_value('aiowps_disable_index_views'), + ); + + + // Save settings + $options['aiowps_enable_basic_firewall'] = isset($data["aiowps_enable_basic_firewall"]) ? '1' : ''; + $options['aiowps_max_file_upload_size'] = $upload_size; + $options['aiowps_block_debug_log_file_access'] = isset($data["aiowps_block_debug_log_file_access"]) ? '1' : ''; + $options['aiowps_disable_index_views'] = isset($data['aiowps_disable_index_views']) ? '1' : ''; + + // Commit the config settings + $this->save_settings($options); + + //Now let's write the applicable rules to the .htaccess file + $res = AIOWPSecurity_Utility_Htaccess::write_to_htaccess(); + + if (!$res) { + $success = false; + $message = __('Could not write to the .htaccess file', 'all-in-one-wp-security-and-firewall'); + + $this->save_settings($original_options); + } + + $features = array( + 'firewall-basic-rules', + 'firewall-block-debug-file-access', + 'firewall-disable-index-views', + ); + + $values = array('aiowps_max_file_upload_size' => $upload_size); + + $args = array( + 'badges' => $features, + 'info' => $info, + 'values' => $values + ); + + return $this->handle_response($success, $message, $args); + } + + /** + * Save and update the 5G firewall settings, and conditionally update the .htaccess file if needed. + * + * This function handles the saving of the 5G firewall settings based on user input. It checks if + * the 5G firewall setting has been modified and writes the applicable rules to the .htaccess file + * if necessary. In case of failure to write to the .htaccess file, it returns an error message. + * + * @param array $data The data array containing the 5G firewall setting. + * + * @global object $aio_wp_security The global instance of the All-In-One WP Security & Firewall plugin. + * + * @return array An array containing the status ('success' or 'error') and a message indicating + * the result of the operation. + */ + public function perform_save_5g_settings($data) { + global $aio_wp_security; + + $response = array( + 'status' => 'success', + 'message' => __('The settings were successfully updated.', 'all-in-one-wp-security-and-firewall') + ); + + $options = array(); + + // If the user has changed the 5G firewall checkbox settings, then there is a need to write htaccess rules again. + $is_5G_firewall_option_changed = ((isset($data['aiowps_enable_5g_firewall']) && '1' != $aio_wp_security->configs->get_value('aiowps_enable_5g_firewall')) || (!isset($data['aiowps_enable_5g_firewall']) && '1' == $aio_wp_security->configs->get_value('aiowps_enable_5g_firewall'))); + + // Save settings + $options['aiowps_enable_5g_firewall'] = isset($data['aiowps_enable_5g_firewall']) ? '1' : ''; + $this->save_settings($options); + + $res = true; + + if ($is_5G_firewall_option_changed) { + $res = AIOWPSecurity_Utility_Htaccess::write_to_htaccess(); // let's write the applicable rules to the .htaccess file + } + + if (!$res) { + $response['status'] = 'error'; + $response['message'] = __('Could not write to the .htaccess file for the 5G firewall settings, please check the file permissions.', 'all-in-one-wp-security-and-firewall'); + // revert settings + $options['aiowps_enable_5g_firewall'] = ''; + $this->save_settings($options); + } + + return $response; + } + + /** + * Perform saving blacklist settings + * + * @param array $data - the request data contains blacklist settings + * + * @return array - containing a status, message and feature badge html + */ + public function perform_save_blacklist_settings($data) { + global $aio_wp_security; + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + + $options = array(); + $message = ''; + $success = true; + + $result = 1; + $aiowps_enable_blacklisting = isset($data["aiowps_enable_blacklisting"]) ? '1' : ''; + + if (!empty($data['aiowps_banned_ip_addresses'])) { + $ip_addresses = sanitize_textarea_field(stripslashes($data['aiowps_banned_ip_addresses'])); + $ip_list_array = AIOWPSecurity_Utility_IP::create_ip_list_array_from_string_with_newline($ip_addresses); + $validated_ip_list_array = AIOWPSecurity_Utility_IP::validate_ip_list($ip_list_array, 'blacklist'); + if (is_wp_error($validated_ip_list_array)) { + $result = -1; + $success = false; + $message = nl2br($validated_ip_list_array->get_error_message()); + } else { + $banned_ip_addresses_list = preg_split('/\R/', $aio_wp_security->configs->get_value('aiowps_banned_ip_addresses')); // Historical settings where the separator may have depended on PHP_EOL. + if ($banned_ip_addresses_list !== $validated_ip_list_array) { + $banned_ip_data = implode("\n", $validated_ip_list_array); + $options['aiowps_banned_ip_addresses'] = $banned_ip_data; + $aiowps_firewall_config->set_value('aiowps_blacklist_ips', $validated_ip_list_array); + } + $data['aiowps_banned_ip_addresses'] = ''; // Clear the post variable for the banned address list. + } + } else { + $options['aiowps_banned_ip_addresses'] = ''; // Clear the IP address config value + $aiowps_firewall_config->set_value('aiowps_blacklist_ips', array()); + } + + if (!empty($data['aiowps_banned_user_agents'])) { + $this->validate_user_agent_list(stripslashes($data['aiowps_banned_user_agents'])); + } else { + // Clear the user agent list + $options['aiowps_banned_user_agents'] = ''; + $aiowps_firewall_config->set_value('aiowps_blacklist_user_agents', array()); + } + + if (1 == $result) { + $aio_wp_security->configs->set_value('aiowps_enable_blacklisting', $aiowps_enable_blacklisting, true); + if ('1' == $aio_wp_security->configs->get_value('aiowps_is_ip_blacklist_settings_notice_on_upgrade')) { + $aio_wp_security->configs->delete_value('aiowps_is_ip_blacklist_settings_notice_on_upgrade'); + } + } + + $this->save_settings($options); + + $args = array( + 'badges' => array("blacklist-manager-ip-user-agent-blacklisting") + ); + + return $this->handle_response($success, $message, $args); + } + + /** + * The AJAX function for storing ips in firewall allowlist + * + * @param array $data - the request data contains data to updated + * + * @return array - containing a status and message + */ + public function perform_firewall_allowlist($data) { + $aiowps_firewall_allow_list = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::ALLOW_LIST); + + $message = ''; + $success = true; + $allowlist = $data['aios_firewall_allowlist']; + + if (empty($allowlist)) { + $aiowps_firewall_allow_list::add_ips(''); + return $this->handle_response(true, ''); + } + + $ips = sanitize_textarea_field(wp_unslash($allowlist)); + $ips = AIOWPSecurity_Utility_IP::create_ip_list_array_from_string_with_newline($ips); + $validated_ip_list_array = AIOWPSecurity_Utility_IP::validate_ip_list($ips, 'firewall_allowlist'); + + if (is_wp_error($validated_ip_list_array)) { + $success = false; + $message = nl2br($validated_ip_list_array->get_error_message()); + } else { + $aiowps_firewall_allow_list::add_ips($validated_ip_list_array); + } + + return $this->handle_response($success, $message); + } + + /** + * The AJAX function for saving PHP firewall and block and allowlists in UDC. + * + * @param array $data The data send from UDC. + * + * @return array|WP_Error + */ + public function perform_save_firewall($data) { + if (!AIOWPSecurity_Utility_Permissions::has_manage_cap()) { + return new WP_Error(esc_html__('Sorry, you do not have enough privilege to execute the requested action.', 'all-in-one-wp-security-and-firewall')); + } + + $response = $this->perform_firewall_allowlist($data); + if ('error' === $response['status']) { + return $response; + } + + $response = $this->perform_save_blacklist_settings($data); + if ('error' === $response['status']) { + return $response; + } + + return $this->perform_php_firewall_settings($data); + } + + /** + * Perform the setup process for the firewall. + * + * This function handles the setup form for the firewall and renders notices accordingly. + * + * @return array An array containing the content and message for the response. + */ + public function perform_setup_firewall() { + global $aio_wp_security; + + $firewall_setup = AIOWPSecurity_Firewall_Setup_Notice::get_instance(); + $content = array('aiowps-firewall-status-container' => $aio_wp_security->include_template('wp-admin/firewall/partials/firewall-set-up-button.php', true)); + + $firewall_setup->do_setup(); + ob_start(); + $firewall_setup->render_notices(); + $result = ob_get_clean(); + + + $args = array( + 'content' => $content, + 'extra_args' => array('info_box' => $result) + ); + + $message = false; + + if (AIOWPSecurity_Utility_Firewall::is_firewall_setup()) { + $content['aiowps-firewall-status-container'] = $aio_wp_security->include_template('wp-admin/firewall/partials/firewall-downgrade-button.php', true); + $message = __('Firewall has been setup successfully.', 'all-in-one-wp-security-and-firewall'); + $args['content'] = $content; + } + + return $this->handle_response(AIOWPSecurity_Utility_Firewall::is_firewall_setup(), $message, $args); + } + + /** + * Perform the downgrade process for the firewall. + * + * This function removes the firewall and returns a response indicating success. + * + * @return array An array containing the status, content, and message for the response. + */ + public function perform_downgrade_firewall() { + global $aio_wp_security; + + AIOWPSecurity_Utility_Firewall::remove_firewall(); + + $message = AIOWPSecurity_Utility_Firewall::is_firewall_setup() ? __('Something went wrong please try again later.', 'all-in-one-wp-security-and-firewall') : __('Firewall has been downgraded successfully.', 'all-in-one-wp-security-and-firewall'); + $success = true; + $downgrade_button = $aio_wp_security->include_template('wp-admin/firewall/partials/firewall-set-up-button.php', true); + $extra_args = array(); + + if (AIOWPSecurity_Utility_Firewall::is_firewall_setup()) { + $success = false; + $downgrade_button = $aio_wp_security->include_template('wp-admin/firewall/partials/firewall-downgrade-button.php', true); + } else { + $extra_args['info_box'] = $aio_wp_security->include_template('notices/firewall-setup-notice.php', true, array('show_dismiss' => false)); + } + + $args = array( + 'content' => array('aiowps-firewall-status-container' => $downgrade_button), + 'extra_args' => $extra_args + ); + + return $this->handle_response($success, $message, $args); + } + + /** + * Validates posted user agent list and set, save as config. + * + * @param string $banned_user_agents - List of banned user agents + * + * @return void + */ + private function validate_user_agent_list($banned_user_agents) { + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + $submitted_agents = AIOWPSecurity_Utility::splitby_newline_trim_filter_empty($banned_user_agents); + $agents = array_unique( + array_filter( + array_map( + 'sanitize_text_field', + $submitted_agents + ), + 'strlen' + ) + ); + $aiowps_firewall_config->set_value('aiowps_blacklist_user_agents', $agents); + $this->save_settings(array( + 'aiowps_banned_user_agents' => implode("\n", $agents) + )); + } + + /** + * This function performs save upgrade unsafe http calls settings. + * + * @param array $data - The request data. + * + * @return array + */ + public function perform_save_upgrade_unsafe_http_calls_settings($data) { + $upgrade_unsafe_http_calls_url_exceptions = sanitize_textarea_field(wp_unslash($data['aiowps_upgrade_unsafe_http_calls_url_exceptions'])); + + $errors = ''; + + if (!empty($upgrade_unsafe_http_calls_url_exceptions)) { + foreach (preg_split('/\R/', $upgrade_unsafe_http_calls_url_exceptions) as $url) { + $url = sanitize_url($url); + + if (empty($url)) { + continue; + } + + if (0 === strpos($url, '#')) { + continue; + } + + $parsed_url = parse_url($url); // phpcs:ignore WordPress.WP.AlternativeFunctions.parse_url_parse_url -- Using the same function as WordPress in order to not preclude URLs that would be allowed by WordPress. + + if (empty($parsed_url['scheme'])) { // The same weak sanity check used by the WordPress wp_remote_* functions. + /* translators: %s URL entered by user. */ + $errors .= "\n" . sprintf(__('%s is not a valid url.', 'all-in-one-wp-security-and-firewall'), $url); + continue; + } + } + } + + if (!empty($errors)) { + return $this->handle_response(false, nl2br(trim($errors)), array('badges' => array('upgrade-unsafe-http-calls'))); + } + + $this->save_settings(array( + 'aiowps_upgrade_unsafe_http_calls' => isset($data['aiowps_upgrade_unsafe_http_calls']) ? '1' : '', + 'aiowps_upgrade_unsafe_http_calls_url_exceptions' => $upgrade_unsafe_http_calls_url_exceptions + )); + + return $this->handle_response(true, '', array('badges' => array('upgrade-unsafe-http-calls'))); + } + + /** + * Render the PHP firewall rules for the legacy UDC theme. + * + * @return array + */ + public function get_php_firewall_contents() { + global $aio_wp_security; + + $GLOBALS['aiowps_feature_mgr'] = $this->get_feature_mgr_object(); + $php_firewall_data = $this->get_php_firewall_data(); + + $content = $aio_wp_security->include_template('/wp-admin/firewall/php-firewall-rules.php', true, compact('php_firewall_data')); + + return array( + 'status' => 'success', + 'content' => $php_firewall_data['no_firewall'] . $content, + ); + } + + /** + * Render the .htaccess firewall rules for the legacy UDC theme. + * + * @return array + */ + public function get_htaccess_contents() { + global $aio_wp_security; + + $GLOBALS['aiowps_feature_mgr'] = $this->get_feature_mgr_object(); + + $htaccess_rules_data = $this->get_htaccess_rules_data(); + + $content = $aio_wp_security->include_template('/wp-admin/firewall/htaccess-firewall-rules.php', true, compact('htaccess_rules_data')); + + return array( + 'status' => 'success', + 'content' => $content, + ); + } + + /** + * Render the Block & Allow Lists for the legacy UDC theme. + * + * @return array + */ + public function get_block_allow_lists_contents() { + global $aio_wp_security; + + /* Needed for submit_button() */ + require_once(ABSPATH . 'wp-admin/includes/template.php'); + + $GLOBALS['aiowps_feature_mgr'] = $this->get_feature_mgr_object(); + + $block_allowlist_data = $this->get_block_allow_lists_data(); + + $content = $aio_wp_security->include_template('wp-admin/firewall/block-and-allow-lists.php', true, $block_allowlist_data); + + return array( + 'status' => 'success', + 'content' => $content, + ); + } + + /** + * Render the Advanced Settings for the legacy UDC theme. + * + * @return array + */ + public function get_advanced_settings_contents() { + global $aio_wp_security; + + $GLOBALS['aiowps_feature_mgr'] = $this->get_feature_mgr_object(); + + $advanced_settings_data = $this->get_firewall_advanced_settings_data(); + + $content = $aio_wp_security->include_template('wp-admin/firewall/advanced-settings.php', true, compact('advanced_settings_data')); + + return array( + 'status' => 'success', + 'content' => $content, + ); + } + + /** + * Return data for the advanced firewall. + * + * @return array + */ + public function get_firewall_advanced_settings_data() { + global $aio_wp_security; + + $aiowps_upgrade_unsafe_http_calls = $aio_wp_security->configs->get_value('aiowps_upgrade_unsafe_http_calls'); + $aiowps_upgrade_unsafe_http_calls_url_exceptions = $aio_wp_security->configs->get_value('aiowps_upgrade_unsafe_http_calls_url_exceptions'); + + return array( + 'aiowps_upgrade_unsafe_http_calls' => $aiowps_upgrade_unsafe_http_calls, + 'aiowps_upgrade_unsafe_http_calls_url_exceptions' => $aiowps_upgrade_unsafe_http_calls_url_exceptions, + ); + } + + + /** + * Return data for the allow & block lists. + * + * @return array + */ + public function get_block_allow_lists_data() { + global $aio_wp_security; + + $aiowps_enable_blacklisting = $aio_wp_security->configs->get_value('aiowps_enable_blacklisting'); + $aiowps_banned_ip_addresses = $aio_wp_security->configs->get_value('aiowps_banned_ip_addresses'); + $aiowps_banned_user_agents = $aio_wp_security->configs->get_value('aiowps_banned_user_agents'); + + $aiowps_firewall_allow_list = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::ALLOW_LIST); + $allowlist = $aiowps_firewall_allow_list::get_ips(); + + return array( + 'aiowps_enable_blacklisting' => $aiowps_enable_blacklisting, + 'aiowps_banned_ip_addresses' => $aiowps_banned_ip_addresses, + 'aiowps_banned_user_agents' => $aiowps_banned_user_agents, + 'allowlist' => $allowlist, + ); + } + + /** + * Return data for the .htaccess rules. + * + * @return array + */ + public function get_htaccess_rules_data() { + global $aio_wp_security; + + $aiowps_enable_basic_firewall = $aio_wp_security->configs->get_value('aiowps_enable_basic_firewall'); + $aiowps_max_file_upload_size = $aio_wp_security->configs->get_value('aiowps_max_file_upload_size'); + $aiowps_block_debug_log_file_access = $aio_wp_security->configs->get_value('aiowps_block_debug_log_file_access'); + $aiowps_disable_index_views = $aio_wp_security->configs->get_value('aiowps_disable_index_views'); + + return array( + 'aiowps_enable_basic_firewall' => $aiowps_enable_basic_firewall, + 'aiowps_max_file_upload_size' => $aiowps_max_file_upload_size, + 'aiowps_block_debug_log_file_access' => $aiowps_block_debug_log_file_access, + 'aiowps_disable_index_views' => $aiowps_disable_index_views, + ); + } + + /** + * Return data for the PHP firewall. + * + * @return array + */ + public function get_php_firewall_data() { + global $aio_wp_security, $aiowps_firewall_config, $aiowps_feature_mgr; + + $is_udc_request = AIOS_Helper::is_updraft_central_request(); + + $block_request_methods = array_map('strtolower', AIOS_Abstracted_Ids::get_firewall_block_request_methods()); + + $no_firewall_notice = ''; + $user_roles = array(); + + // Load required data from config + if (!empty($aiowps_firewall_config)) { + // firewall config is available + $methods = $aiowps_firewall_config->get_value('aiowps_6g_block_request_methods'); + if (empty($methods)) { + $methods = array(); + } + + $blocked_query = (bool) $aiowps_firewall_config->get_value('aiowps_6g_block_query'); + $blocked_request = (bool) $aiowps_firewall_config->get_value('aiowps_6g_block_request'); + $blocked_referrers = (bool) $aiowps_firewall_config->get_value('aiowps_6g_block_referrers'); + $blocked_agents = (bool) $aiowps_firewall_config->get_value('aiowps_6g_block_agents'); + + if (empty($methods) && (!$blocked_query && !$blocked_request && !$blocked_referrers && !$blocked_agents) && '1' == $aio_wp_security->configs->get_value('aiowps_enable_6g_firewall')) { + $aio_wp_security->configs->set_value('aiowps_enable_6g_firewall', ''); + $aio_wp_security->configs->save_config(); + $aiowps_feature_mgr->check_feature_status_and_recalculate_points(); + } + + } else { + if ($is_udc_request) { + ob_start(); + } + + ?> +
+

+

+
+

+

+

+
+ configs->get_value('aiowps_enable_6g_firewall'); + $advanced_options_disabled = '1' != $aiowps_enable_6g_firewall; + + $settings = array_merge(array('methods' => $methods), compact('aiowps_enable_6g_firewall', 'blocked_query', 'blocked_request', 'blocked_referrers', 'blocked_agents', 'block_request_methods', 'aiowps_firewall_config', 'advanced_options_disabled')); + + $aiowps_enable_pingback_firewall = $aiowps_firewall_config->get_value('aiowps_enable_pingback_firewall'); + $aiowps_disable_xmlrpc_pingback_methods = $aio_wp_security->configs->get_value('aiowps_disable_xmlrpc_pingback_methods'); + $aiowps_disable_rss_and_atom_feeds = $aio_wp_security->configs->get_value('aiowps_disable_rss_and_atom_feeds'); + $aiowps_forbid_proxy_comments = $aiowps_firewall_config->get_value('aiowps_forbid_proxy_comments'); + $aiowps_deny_bad_query_strings = $aiowps_firewall_config->get_value('aiowps_deny_bad_query_strings'); + $aiowps_advanced_char_string_filter = $aiowps_firewall_config->get_value('aiowps_advanced_char_string_filter'); + + $aiowps_disallow_unauthorized_rest_requests = $aio_wp_security->configs->get_value('aiowps_disallow_unauthorized_rest_requests'); + $aios_roles_disallowed_rest_requests = $aio_wp_security->configs->get_value('aios_roles_disallowed_rest_requests'); + $aios_whitelisted_rest_routes = $aio_wp_security->configs->get_value('aios_whitelisted_rest_routes'); + $aiowps_block_fake_googlebots = $aiowps_firewall_config->get_value('aiowps_block_fake_googlebots'); + $aiowps_ban_post_blank_headers = $aiowps_firewall_config->get_value('aiowps_ban_post_blank_headers'); + + $wp_user_roles = AIOWPSecurity_Utility_Permissions::get_user_roles(); + foreach ($wp_user_roles as $role => $role_name) { + $user_roles[] = $role; + } + + + return array( + 'aiowps_enable_pingback_firewall' => $aiowps_enable_pingback_firewall, + 'aiowps_disable_xmlrpc_pingback_methods' => $aiowps_disable_xmlrpc_pingback_methods, + 'aiowps_disable_rss_and_atom_feeds' => $aiowps_disable_rss_and_atom_feeds, + 'aiowps_forbid_proxy_comments' => $aiowps_forbid_proxy_comments, + 'aiowps_deny_bad_query_strings' => $aiowps_deny_bad_query_strings, + 'aiowps_advanced_char_string_filter' => $aiowps_advanced_char_string_filter, + 'aiowps_disallow_unauthorized_rest_requests' => $aiowps_disallow_unauthorized_rest_requests, + 'aios_roles_disallowed_rest_requests' => $aios_roles_disallowed_rest_requests, + 'aios_whitelisted_rest_routes' => $aios_whitelisted_rest_routes, + 'user_roles' => $user_roles, + 'aiowps_block_fake_googlebots' => $aiowps_block_fake_googlebots, + 'aiowps_ban_post_blank_headers' => $aiowps_ban_post_blank_headers, + 'ng_settings' => $settings, + 'no_firewall' => $no_firewall_notice, + ); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-ip-commands.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-ip-commands.php new file mode 100755 index 00000000..5cfc124f --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-ip-commands.php @@ -0,0 +1,133 @@ +handle_response(false, __('No IP provided.', 'all-in-one-wp-security-and-firewall')); + } + + if (!filter_var($data['ip'], FILTER_VALIDATE_IP)) { + return $this->handle_response(false, __('Invalid IP provided.', 'all-in-one-wp-security-and-firewall')); + } + + if (!AIOWPSecurity_Utility::unlock_ip($data['ip'])) { + return $this->handle_response(false, __('Failed to unlock the selected IP address.', 'all-in-one-wp-security-and-firewall')); + } else { + return $this->handle_response(true, __('The selected IP address was unlocked successfully.', 'all-in-one-wp-security-and-firewall')); + } + } + + /** + * Unblacklists an IP. + * + * @param array $data Contains the IP address to be unblacklisted. + * + * @return array + */ + public function unblacklist_ip($data) { + + if (!isset($data['ip'])) { + return $this->handle_response(false, __('No IP provided.', 'all-in-one-wp-security-and-firewall')); + } + + if (!filter_var($data['ip'], FILTER_VALIDATE_IP)) { + return $this->handle_response(false, __('Invalid IP provided.', 'all-in-one-wp-security-and-firewall')); + } + + if (!AIOWPSecurity_Utility::unblacklist_ip($data['ip'])) { + return $this->handle_response(false, __('Failed to unblacklist the selected IP address.', 'all-in-one-wp-security-and-firewall')); + } else { + return $this->handle_response(true, __('The selected IP address was unblacklisted successfully.', 'all-in-one-wp-security-and-firewall')); + } + } + + /** + * Unblocks an IP by permanent block record ID. + * + * @param array $data Contains the ID of the entry in the AIOWPSEC_TBL_PERM_BLOCK table. + * + * @return array + */ + public function blocked_ip_list_unblock_ip($data) { + + if (!isset($data['id'])) { + return $this->handle_response(false, __('Invalid blocked IP ID provided.', 'all-in-one-wp-security-and-firewall')); + } + + include_once AIO_WP_SECURITY_PATH . '/admin/wp-security-list-permanent-blocked-ip.php'; // For rendering the AIOWPSecurity_List_Table + $blocked_ip_list = new AIOWPSecurity_List_Blocked_IP(); // For rendering the AIOWPSecurity_List_Table + $result = $blocked_ip_list->unblock_ip_address($data['id']); + + if (false === $result) { + $message = __('Failed to unblock and delete the selected record(s).', 'all-in-one-wp-security-and-firewall'); + } else { + $message = __('Successfully unblocked and deleted the selected record(s).', 'all-in-one-wp-security-and-firewall'); + } + return $this->handle_response(true, $message); + } + + /** + * Locks an IP. + * + * @param array $data Contains the IP address to be locked. + * + * @return array + */ + public function lock_ip($data) { + + if (!isset($data['ip'])) { + return $this->handle_response(false, __('No IP provided.', 'all-in-one-wp-security-and-firewall')); + } + + if (!filter_var($data['ip'], FILTER_VALIDATE_IP)) { + return $this->handle_response(false, __('Invalid IP provided.', 'all-in-one-wp-security-and-firewall')); + } + + if (!isset($data['lock_reason'])) { + return $this->handle_response(false, __('No lockout reason provided.', 'all-in-one-wp-security-and-firewall')); + } + + AIOWPSecurity_Utility::lock_ip($data['ip'], $data['lock_reason']); + + return $this->handle_response(true, __('The selected IP address is now temporarily locked.', 'all-in-one-wp-security-and-firewall')); + } + + /** + * Blacklists an IP. + * + * @param array $data Contains the IP address to be blacklisted. + * + * @return array + */ + public function blacklist_ip($data) { + + if (!isset($data['ip'])) { + return $this->handle_response(false, __('No IP provided.', 'all-in-one-wp-security-and-firewall')); + } + + if (!filter_var($data['ip'], FILTER_VALIDATE_IP)) { + return $this->handle_response(false, __('Invalid IP provided.', 'all-in-one-wp-security-and-firewall')); + } + + $result = AIOWPSecurity_Utility::blacklist_ip($data['ip']); + + if (is_wp_error($result)) { + return $this->handle_response(false, nl2br($result->get_error_message())); + } else { + return $this->handle_response(true, __('The selected IP address has been added to the blacklist.', 'all-in-one-wp-security-and-firewall')); + } + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-log-commands.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-log-commands.php new file mode 100755 index 00000000..f527439d --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-log-commands.php @@ -0,0 +1,345 @@ +handle_response(false, AIOWPSecurity_Admin_Menu::show_msg_error_st(__('No audit log ID provided.', 'all-in-one-wp-security-and-firewall'), true)); + } + + include_once AIO_WP_SECURITY_PATH.'/admin/wp-security-list-audit.php'; + $audit_log_list = new AIOWPSecurity_List_Audit_Log(); + + return $this->handle_response(true, $audit_log_list->delete_audit_event_records($data['id'])); + } + + /** + * Deletes an IP lockout record. + * + * @param array $data Contains the ID of the entry in the AIOWPSEC_TBL_LOGIN_LOCKOUT table. + * + * @return array + */ + public function delete_locked_ip_record($data) { + + if (!isset($data['id'])) { + return $this->handle_response(false, AIOWPSecurity_Admin_Menu::show_msg_error_st(__('No locked IP record ID provided.', 'all-in-one-wp-security-and-firewall'), true)); + } + + include_once AIO_WP_SECURITY_PATH . '/admin/wp-security-list-locked-ip.php'; + + $locked_ip_list = new AIOWPSecurity_List_Locked_IP(); + $result = $locked_ip_list->delete_lockout_records($data['id']); + return $this->handle_response(true, $result); + } + + /** + * Clear debug logs + * + * @return array + */ + public function clear_debug_logs() { + global $aio_wp_security; + + $ret = $aio_wp_security->debug_logger->clear_logs(); + + if (is_wp_error($ret)) { + return $this->handle_response(false, AIOWPSecurity_Admin_Menu::show_msg_error_st(esc_html($ret->get_error_message()).'

'.esc_html($ret->get_error_data()).'

', true)); + } else { + return $this->handle_response(true, AIOWPSecurity_Admin_Menu::show_msg_updated_st(__('The debug logs have been cleared.', 'all-in-one-wp-security-and-firewall'), true)); + } + } + + /** + * Renders the audit log tab content. + * + * This function handles the rendering of the audit log tab content based on the + * provided data via AJAX request. The data is used to filter the audit log or perform actions + * + * @access public + * @return void + */ + public function render_audit_log_tab() { + // phpcs:ignore WordPress.Security.NonceVerification.Missing -- PCP warning. Nonce checked in previous function. + if (empty($_POST['data'])) return; + + // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput -- PCP warning. Nonce checked in previous function and sanitization done at later. + $data = wp_unslash($_POST['data']); + + // Needed for rendering the audit log table + include_once(AIO_WP_SECURITY_PATH.'/admin/wp-security-list-audit.php'); + $audit_log_list = new AIOWPSecurity_List_Audit_Log($data); + $audit_log_list->ajax_response(); + } + + /** + * Exports the audit logs as a CSV file and sends the data as an AJAX response. + * + * This function retrieves audit log data, prepares it for export, and generates a CSV string. + * The CSV data is then sent back as part of an AJAX response, along with the filename for the CSV file. + * + * @return array + */ + public function export_audit_logs() { + + // Needed for rendering the audit log table + include_once(AIO_WP_SECURITY_PATH.'/admin/wp-security-list-audit.php'); + $audit_log_list = new AIOWPSecurity_List_Audit_Log(); + + $audit_log_list->prepare_items(true); + $export_keys = array( + 'id' => 'ID', + 'created' => __('Date and time', 'all-in-one-wp-security-and-firewall'), + 'level' => __('Level', 'all-in-one-wp-security-and-firewall'), + 'network_id' => __('Network ID', 'all-in-one-wp-security-and-firewall'), + 'site_id' => __('Site ID', 'all-in-one-wp-security-and-firewall'), + 'username' => __('Username', 'all-in-one-wp-security-and-firewall'), + 'ip' => __('IP', 'all-in-one-wp-security-and-firewall'), + 'event_type' => __('Event', 'all-in-one-wp-security-and-firewall'), + 'details' => __('Details', 'all-in-one-wp-security-and-firewall'), + 'stacktrace' => __('Stack trace', 'all-in-one-wp-security-and-firewall') + ); + + $title = 'audit_event_logs.csv'; + ob_start(); + AIOWPSecurity_Admin_Init::aiowps_output_csv($audit_log_list->items, $export_keys, $title); + + $data = ob_get_clean(); + + return array( + 'title' => $title, + 'data' => $data + ); + } + + /** + * Initializing the WP List API, since UDC commands do not load all parts of WP. + * + * @return void + */ + private function init_wp_list() { + if (!function_exists('submit_button')) { + require_once(ABSPATH . 'wp-admin/includes/template.php'); + } + + if (!function_exists('render_screen_reader_content')) { + require_once(ABSPATH . 'wp-admin/includes/class-wp-screen.php'); + } + + if (!function_exists('get_column_headers')) { + require_once(ABSPATH . 'wp-admin/includes/screen.php'); + } + } + + /** + * Returns the data for downloading the audit log. + * + * @return array|WP_Error + */ + public function process_audit_log_export() { + if (!AIOWPSecurity_Utility_Permissions::has_manage_cap()) { + return new WP_Error(esc_html__('Sorry, you do not have enough privilege to execute the requested action.', 'all-in-one-wp-security-and-firewall')); + } + + $this->init_wp_list(); + + return $this->export_audit_logs(); + } + + /** + * Returns the HTML for the audit log. + * + * @return array + */ + public function get_audit_log_contents() { + global $aio_wp_security; + + $this->init_wp_list(); + + // Needed for rendering the audit log table + include_once AIO_WP_SECURITY_PATH . '/admin/wp-security-list-audit.php'; + $data = array(); + // phpcs:disable WordPress.Security.NonceVerification.Recommended -- PCP warning. Processing form data without nonce verification. No nonce. + if (isset($_GET['event-filter'])) $data['event-filter'] = sanitize_text_field(wp_unslash($_GET['event-filter'])); // Failed logins and logins only to show as audit log + $audit_log_list = new AIOWPSecurity_List_Audit_Log($data); + + $tab = isset($_GET["tab"]) ? sanitize_text_field(wp_unslash($_GET["tab"])) : ''; + $page = isset($_GET['page']) ? sanitize_text_field(wp_unslash($_GET['page'])) : ''; + // phpcs:enable WordPress.Security.NonceVerification.Recommended -- PCP warning. Processing form data without nonce verification. No nonce. + + $content = $aio_wp_security->include_template('wp-admin/dashboard/audit-logs.php', true, array('audit_log_list' => $audit_log_list, 'page' => $page, 'tab' => $tab)); + + return array( + 'status' => 'success', + 'content' => $content, + ); + } + + /** + * Deletes entry from audit log. + * + * @param array $data Table config data. + * + * @return array|WP_Error + */ + public function do_delete_audit_log($data) { + if (!AIOWPSecurity_Utility_Permissions::has_manage_cap()) { + return new WP_Error(esc_html__('Sorry, you do not have enough privilege to execute the requested action.', 'all-in-one-wp-security-and-firewall')); + } + + $this->init_wp_list(); + + if (!class_exists('AIOWPSecurity_Admin_Menu')) { + include_once AIO_WP_SECURITY_PATH . '/admin/wp-security-admin-menu.php'; + } + + return $this->delete_audit_log($data); + } + + /** + * Renders audit log after actions (delete/orderby, block/unblock, etc.) + * + * @param array $data Table config data. + * + * @return array + */ + public function do_render_audit_log_tab($data) { + $this->init_wp_list(); + + // phpcs:ignore WordPress.Security.NonceVerification.Missing -- PCP warning. Nonce checked in previous function. + if (empty($data)) return array(); + + // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput -- PCP warning. Nonce checked in previous function and sanitization done at later. + $data = wp_unslash($data); + + if (!class_exists('AIOWPSecurity_Admin_Menu')) { + include_once AIO_WP_SECURITY_PATH . '/admin/wp-security-admin-menu.php'; + } + + // Needed for rendering the audit log table + include_once(AIO_WP_SECURITY_PATH.'/admin/wp-security-list-audit.php'); + $audit_log_list = new AIOWPSecurity_List_Audit_Log($data); + + return $audit_log_list->ajax_response(true); + } + + /** + * Parses raw audit log data for human-readable output. + * + * @param AIOWPSecurity_List_Audit_Log $audit_log_list Audit log object. + * @param array $data Raw audit log data. + * + * @return array + */ + private function parse_audit_log_data($audit_log_list, $data) { + $items = array(); + + foreach ($data as $db_item) { + if (empty($db_item)) { + continue; + } + + $item = array(); + + foreach ($db_item as $key => $value) { + switch ($key) { + case 'created': + $item[$key] = AIOWPSecurity_Utility::convert_timestamp($value); + break; + case 'event_type': + $item[$key] = $audit_log_list->column_event_type($db_item); + break; + case 'details': + $item[$key] = $audit_log_list->column_details($db_item); + break; + case 'stacktrace': + $item[$key] = $audit_log_list->column_stacktrace($db_item); + break; + default: + $item[$key] = $value; + break; + } + } + + $items[] = $item; + } + + return $items; + } + + /** + * Returns the data for the audit log table. + * + * @param array $data Configuration data. + * + * @return array + */ + public function get_audit_log_data($data) { + // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput -- PCP warning. Nonce checked in previous function and sanitization done at later. + $data = isset($data) ? wp_unslash($data) : array(); + + $data = isset($data['data']) ? $data['data'] : $data; + + $this->init_wp_list(); + $final_column = array(); + + // Needed for rendering the audit log table + include_once(AIO_WP_SECURITY_PATH.'/admin/wp-security-list-audit.php'); + $audit_log_list = new AIOWPSecurity_List_Audit_Log($data); + + $audit_log_list->prepare_items(); + + list($columns, $hidden) = $audit_log_list->get_column_info(); + + foreach ($columns as $column_key => $column_display_name) { + if ('cb' !== $column_key) { + if (!in_array($column_key, $hidden, true)) { + $final_column[$column_key] = array('label' => $column_display_name); + } + } + } + + $audit_log_items = isset($audit_log_list->items) ? $audit_log_list->items : array(); + + foreach ($audit_log_items as $key => $item) { + $ip = isset($item['ip']) ? $item['ip'] : ''; + + if ('' !== $ip) { + $audit_log_items[$key]['is_ip_locked'] = AIOWPSecurity_Utility::check_locked_ip($ip, 'audit-log'); + $audit_log_items[$key]['is_ip_blacklisted'] = AIOWPSecurity_Utility::check_blacklist_ip($ip); + } + } + + $items = $this->parse_audit_log_data($audit_log_list, $audit_log_items); + + $bulk_actions = $audit_log_list->get_bulk_actions(); + + $paged = !empty($data['paged']) ? (int) $data['paged'] : 1; + + AIOWPSecurity_Audit_Events::setup_event_types(); + + return array( + 'audit_log_data' => array( + 'bulk_actions' => $bulk_actions, + 'event_types' => AIOWPSecurity_Audit_Events::$event_types, + 'log_levels' => AIOWPSecurity_Audit_Events::$log_levels, + 'columns' => $final_column, + 'items' => $items, + 'is_multisite' => is_multisite(), + 'pagination' => array('page' => $paged, 'pages' => $audit_log_list->get_pagination_arg('total_pages'), 'results' => $audit_log_list->get_pagination_arg('total_items')), + ), + ); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-settings-commands.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-settings-commands.php new file mode 100755 index 00000000..59133c07 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-settings-commands.php @@ -0,0 +1,562 @@ +handle_response($success, $message, array('info' => $info)); + } + + /** + * Performs the action to disable all firewall rules. + * + * This method disables all firewall rules provided by the AIOWPSecurity_Settings_Tasks class. + * + * @return array An associative array containing the status and message of the operation. + * - 'status' : (string) The status of the operation, either 'success' or 'error'. + * - 'message' : (string) A message indicating the outcome of the operation. + * If the operation is successful, it contains an update message. + * If there is an error, it contains an error message. + */ + public function perform_disable_all_firewall_rules() { + $msg = AIOWPSecurity_Settings_Tasks::disable_all_firewall_rules(); + $success = true; + $message = ''; + + if (isset($msg['updated'])) { + $message = $msg['updated']; + } elseif (isset($msg['error'])) { + $message = $msg['error']; + $success = false; + } + + return $this->handle_response($success, $message); + } + + /** + * Performs the action to reset all settings. + * + * This method resets all settings provided by the AIOWPSecurity_Settings_Tasks class to their default values. + * + * @return array An associative array containing the status and message of the operation. + * - 'status' : (string) The status of the operation, either 'success' or 'error'. + * - 'message' : (string) A message indicating the outcome of the operation. + * If the operation is successful, it contains an update message. + * If there is an error, it contains an error message. + */ + public function perform_reset_all_settings() { + $msg = AIOWPSecurity_Settings_Tasks::reset_all_settings(); + + $success = true; + $message = ''; + + if (isset($msg['updated'])) { + $message = $msg['updated']; + } elseif (isset($msg['error'])) { + $message = $msg['error']; + $success = false; + } + + return $this->handle_response($success, $message); + } + + /** + * Performs the action to save debug settings. + * + * This method updates the debug settings in the AIOWPSecurity_Configs instance based on the provided data. + * + * @param array $data An associative array containing the data to update the debug settings. + * - 'aiowps_enable_debug': (bool) Indicates whether debug mode should be enabled. + * @return array An associative array containing the status and message of the operation. + * - 'status' : (string) The status of the operation, which is always 'success'. + * - 'message' : (string) A message indicating that the settings have been updated successfully. + */ + public function perform_save_debug_settings($data) { + global $aio_wp_security; + + $aio_wp_security->configs->set_value('aiowps_enable_debug', '1' === $data["aiowps_enable_debug"] ? '1' : '', true); + + return $this->handle_response(true); + } + + /** + * Performs the action to backup the .htaccess file. + * + * This method creates a backup of the .htaccess file and renames it with a random prefix. + * It also provides a message indicating the outcome of the backup operation. + * + * @global object $aio_wp_security The global instance of the All-in-One WP Security & Firewall plugin. + * @return array An associative array containing the status and message of the backup operation. + * - 'status' : (string) The status of the operation, which can be 'success' or 'error'. + * - 'message' : (string) A message indicating the outcome of the backup operation. + */ + public function perform_backup_htaccess_file() { + global $aio_wp_security; + + $home_path = AIOWPSecurity_Utility_File::get_home_path(); + $htaccess_path = $home_path . '.htaccess'; + + $result = AIOWPSecurity_Utility_File::backup_and_rename_htaccess($htaccess_path); //Backup the htaccess file + $extra_args = array(); + + if ($result) { + $aiowps_backup_dir = WP_CONTENT_DIR.'/'.AIO_WP_SECURITY_BACKUPS_DIR_NAME; + $success = true; + $message = __('Your .htaccess file was successfully backed up.', 'all-in-one-wp-security-and-firewall'); + $extra_args['data'] = file_get_contents($aiowps_backup_dir.'/'. $result .'.txt'); + $extra_args['title'] = $result; + } else { + $aio_wp_security->debug_logger->log_debug("htaccess - Backup operation failed!", 4); + $success = false; + $message = __('htaccess backup failed.', 'all-in-one-wp-security-and-firewall'); + } + + return $this->handle_response($success, $message, array('extra_args' => $extra_args)); + } + + /** + * Performs the action to restore the .htaccess file. + * + * This method restores the .htaccess file using the provided data, which includes the contents of the .htaccess file. + * It also verifies that the file chosen has valid contents relevant to the .htaccess file. + * + * @global object $aio_wp_security The global instance of the All-in-One WP Security & Firewall plugin. + * @param array $data An associative array containing the data needed to restore the .htaccess file. + * - 'aiowps_htaccess_file' : (string) The name of the .htaccess file to restore from. + * - 'aiowps_htaccess_file_contents' : (string) The contents of the .htaccess file to restore. + * @return array An associative array containing the status and message of the restore operation. + * - 'status' : (string) The status of the operation, which can be 'success' or 'error'. + * - 'message' : (string) A message indicating the outcome of the restore operation. + */ + public function perform_restore_htaccess_file($data) { + global $aio_wp_security; + + $success = true; + + $home_path = AIOWPSecurity_Utility_File::get_home_path(); + $htaccess_path = $home_path . '.htaccess'; + + if (empty($data['aiowps_htaccess_file']) && empty($data['aiowps_htaccess_file_contents'])) { + $message = __('Please choose a valid .htaccess to restore from.', 'all-in-one-wp-security-and-firewall'); + $success = false; + } else { + $htaccess_file_contents = trim(stripslashes($data['aiowps_htaccess_file_contents'])); + //Verify that file chosen has contents which are relevant to .htaccess file + $is_htaccess = AIOWPSecurity_Utility_Htaccess::check_if_htaccess_contents($htaccess_file_contents); + if (1 == $is_htaccess) { + if (!file_put_contents($htaccess_path, $htaccess_file_contents)) { + //Failed to make a backup copy + $aio_wp_security->debug_logger->log_debug("htaccess - Restore from .htaccess operation failed.", 4); + $message = __('The restoration of the .htaccess file failed; please attempt to restore the .htaccess file manually using FTP.', 'all-in-one-wp-security-and-firewall'); + $success = false; + } else { + $message = __('Your .htaccess file has successfully been restored.', 'all-in-one-wp-security-and-firewall'); + } + } else { + $aio_wp_security->debug_logger->log_debug("htaccess restore failed - Contents of restore file appear invalid.", 4); + $success = false; + $message = __('The restoration .htaccess file has failed, please check the contents of the file you are trying to restore from.', 'all-in-one-wp-security-and-firewall'); + } + } + + return $this->handle_response($success, $message); + } + + /** + * Performs the action to restore the wp-config.php file. + * + * This method restores the wp-config.php file using the provided data, which includes the contents of the wp-config.php file. + * It also verifies that the file chosen is a valid wp-config.php file. + * + * @global object $aio_wp_security The global instance of the All-in-One WP Security & Firewall plugin. + * @param array $data An associative array containing the data needed to restore the wp-config.php file. + * - 'aiowps_wp_config_file' : (string) The name of the wp-config.php file to restore from. + * - 'aiowps_wp_config_file_contents' : (string) The contents of the wp-config.php file to restore. + * @return array An associative array containing the status and message of the restore operation. + * - 'status' : (string) The status of the operation, which can be 'success' or 'error'. + * - 'message' : (string) A message indicating the outcome of the restore operation. + */ + public function perform_restore_wp_config_file($data) { + global $aio_wp_security; + + $success = true; + + if (empty($data['aiowps_wp_config_file']) && empty($data['aiowps_wp_config_file_contents'])) { + $message = __('Please choose a wp-config.php file to restore from.', 'all-in-one-wp-security-and-firewall'); + $success = false; + } else { + $wp_config_file_contents = trim(stripslashes($data['aiowps_wp_config_file_contents'])); + + //Verify that file chosen is a wp-config.file + $is_wp_config = AIOWPSecurity_Utility_File::check_if_wp_config_contents($wp_config_file_contents); + if ($is_wp_config) { + $active_root_wp_config = AIOWPSecurity_Utility_File::get_wp_config_file_path(); + if (!file_put_contents($active_root_wp_config, $wp_config_file_contents)) { + //Failed to make a backup copy + $aio_wp_security->debug_logger->log_debug("wp-config.php - Restore from backed up wp-config operation failed.", 4); + $message = __('The restoration of the wp-config.php file failed, please attempt to restore this file manually using FTP.', 'all-in-one-wp-security-and-firewall'); + $success = false; + } else { + $message =__('Your wp-config.php file has successfully been restored.', 'all-in-one-wp-security-and-firewall'); + } + } else { + $aio_wp_security->debug_logger->log_debug("wp-config.php restore failed - Contents of restore file appear invalid.", 4); + $message = __('The restoration of the wp-config.php file failed, please check the contents of the file you are trying to restore from.', 'all-in-one-wp-security-and-firewall'); + $success = false; + } + } + + return $this->handle_response($success, $message); + } + + /** + * Performs the action to delete plugin settings. + * + * This method deletes specific plugin settings based on the provided data. + * + * @param array $data An associative array containing the data needed to delete plugin settings. + * - 'aiowps_on_uninstall_delete_db_tables' : (string) Indicates whether to delete plugin database tables on uninstallation. + * - 'aiowps_on_uninstall_delete_configs' : (string) Indicates whether to delete plugin configuration settings on uninstallation. + * @return array An associative array containing the status and message of the delete operation. + * - 'status' : (string) The status of the operation, which can be 'success'. + * - 'message' : (string) A message indicating that the plugin settings have been successfully deleted. + */ + public function perform_delete_plugin_settings($data) { + + $options = array(); + //Save settings + $options['aiowps_on_uninstall_delete_db_tables'] = isset($data['aiowps_on_uninstall_delete_db_tables']) ? '1' : ''; + $options['aiowps_on_uninstall_delete_configs'] = isset($data['aiowps_on_uninstall_delete_configs']) ? '1' : ''; + $this->save_settings($options); + + return $this->handle_response(true); + } + + /** + * Performs the action to remove WordPress version information settings. + * + * This method sets the option to remove WordPress version information meta tags based on the provided data. + * + * @param array $data An associative array containing the data needed to configure the removal of WordPress version information. + * - 'aiowps_remove_wp_generator_meta_info' : (string) Indicates whether to remove WordPress version information meta tags. + * @return array An associative array containing the status, message, and additional badges related to the removal of WordPress version information. + * - 'status' : (string) The status of the operation, which can be 'success'. + * - 'message' : (string) A message indicating that the settings have been successfully updated. + * - 'badges' : (array) An array containing feature IDs and HTML for additional badges. + */ + public function perform_remove_wp_version_info_settings($data) { + global $aio_wp_security; + + $aio_wp_security->configs->set_value('aiowps_remove_wp_generator_meta_info', '1' === $data["aiowps_remove_wp_generator_meta_info"] ? '1' : '', true); + + return $this->handle_response(true, '', array('badges' => array('wp-generator-meta-tag'))); + } + + /** + * Performs the action to restore AIOWPS settings from an imported file. + * + * This method restores AIOWPS settings from the provided data representing an imported file. + * + * @param array $data An associative array containing the data needed to restore AIOWPS settings. + * - 'aiowps_import_settings_file' : (string) The name of the file containing the AIOWPS settings. + * - 'aiowps_import_settings_file_contents': (string) The contents of the file containing the AIOWPS settings. + * @return array An associative array containing the status and messages related to the restoration of AIOWPS settings. + * - 'status' : (string) The status of the operation, which can be 'success' or 'error'. + * - 'messages' : (array) An array of messages indicating the outcome of the restoration process. + * - 'redirect_url' : (string|null) The URL to redirect to after the restoration process, if applicable. + */ + public function perform_restore_aiowps_settings($data) { + global $aio_wp_security, $simba_two_factor_authentication; + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + + $success = true; + $info = array(); + $extra_args = array(); + + $msg_updated = __('Your AIOS settings were successfully imported.', 'all-in-one-wp-security-and-firewall'); + $msg_error = sprintf(__('Could not write to the %s file.', 'all-in-one-wp-security-and-firewall'), AIOWPSecurity_Utility_File::get_home_path().'.htaccess') . ' ' . __('Please check the file permissions.', 'all-in-one-wp-security-and-firewall'); + + if (empty($data['aiowps_import_settings_file']) && empty($data['aiowps_import_settings_file_contents'])) { + $success = false; + $message = __('Please choose a file to import your settings from.', 'all-in-one-wp-security-and-firewall'); + } else { + // Let's get the uploaded import file contents + $import_file_contents = trim($data['aiowps_import_settings_file_contents']); // stripslashes not required wp_unslash applied already AIOWPSecurity_Ajax::set_data + + // Verify that file chosen has valid AIOS settings contents + $aiowps_settings_file_contents = AIOWPSecurity_Utility_File::check_if_valid_aiowps_settings_content($import_file_contents); + + if ($aiowps_settings_file_contents) { + $is_enabled_cookie_bruteforce_before_import = $aio_wp_security->configs->get_value('aiowps_enable_brute_force_attack_prevention'); + // Apply the settings + $settings_array = json_decode($import_file_contents, true); + if (array_key_exists('general', $settings_array)) { + $aiowps_settings_applied = update_option('aio_wp_security_configs', $settings_array['general']); + + if (!$aiowps_settings_applied && get_option('aio_wp_security_configs') === $settings_array['general']) { + $aiowps_settings_applied = true; + } + + if (is_main_site() && is_super_admin()) { + if (array_key_exists('tfa', $settings_array) && true == $simba_two_factor_authentication->is_tfa_integrated) { + $tfa_settings_applied = $simba_two_factor_authentication->set_configs($settings_array['tfa']); + + if (!$tfa_settings_applied && $simba_two_factor_authentication->get_configs() !== $settings_array['tfa']) { + $aiowps_settings_applied = false; + } + } + + if (array_key_exists('firewall', $settings_array)) { + $aiowps_settings_applied = $aiowps_settings_applied && $aiowps_firewall_config->set_contents($settings_array['firewall']); + } + } + } else { + $aiowps_settings_applied = update_option('aio_wp_security_configs', $settings_array); + + if (!$aiowps_settings_applied && get_option('aio_wp_security_configs') === $settings_array) { + $aiowps_settings_applied = true; + } + } + + if (!$aiowps_settings_applied) { + // Failed to import settings + $aio_wp_security->debug_logger->log_debug('Import AIOS settings operation failed.', 4); + $success = false; + $message = __('Import AIOS settings operation failed.', 'all-in-one-wp-security-and-firewall'); + } else { + $aio_wp_security->configs->load_config(); // Refresh the configs global variable + + //Just in case user submits partial config settings + //Run add_option_values to make sure any missing config items are at least set to default + AIOWPSecurity_Configure_Settings::add_option_values(); + + $res = true; + + if (AIOWPSecurity_Utility::allow_to_write_to_htaccess()) $res = AIOWPSecurity_Utility_Htaccess::write_to_htaccess(); + + // Now let's refresh the .htaccess file with any modified rules if applicable + + $is_enabled_cookie_bruteforce = $aio_wp_security->configs->get_value('aiowps_enable_brute_force_attack_prevention'); + + if ($is_enabled_cookie_bruteforce_before_import != $is_enabled_cookie_bruteforce && 1 == $is_enabled_cookie_bruteforce) { + $url = 'admin.php?page='.AIOWPSEC_SETTINGS_MENU_SLUG."&tab=settings-file-operations&success=import_settings"; + $url .= empty($aio_wp_security->configs->get_value('aiowps_brute_force_secret_word')) ? '' : '&'.$aio_wp_security->configs->get_value('aiowps_brute_force_secret_word').'=1'; + $url .= $res ? '' : '&error=write_htaccess'; + $extra_args['redirect_url'] = admin_url(sanitize_url($url)); + } + + $message = $msg_updated; + if (!$res) { + $info[] = $msg_error; + } + } + } else { + // Invalid settings file + $aio_wp_security->debug_logger->log_debug("The contents of your settings file are invalid.", 4); + $success = false; + $message = __('The contents of your settings file are invalid, please check the contents of the file you are trying to import settings from.', 'all-in-one-wp-security-and-firewall'); + } + } + + $args = array( + 'info' => $info, + 'extra_args' => $extra_args + ); + + return $this->handle_response($success, $message, $args); + } + + /** + * Performs the action to save IP settings. + * + * This method saves the IP settings based on the provided data. + * + * @param array $data An associative array containing the data needed to save IP settings. + * - 'aiowps_ip_retrieve_method': (string) The ID of the IP retrieval method. + * @return array An associative array containing the status and message related to saving IP settings. + * - 'status': (string) The status of the operation, which can be 'success' or 'error'. + * - 'message': (string|null) A message indicating the outcome of saving IP settings, or null if no message is provided. + */ + public function perform_save_ip_settings($data) { + global $wpdb, $aio_wp_security; + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + + $ip_retrieve_method_id = sanitize_text_field($data["aiowps_ip_retrieve_method"]); + + $message = false; + + if (in_array($ip_retrieve_method_id, array_keys(AIOS_Abstracted_Ids::get_ip_retrieve_methods()))) { + $aio_wp_security->configs->set_value('aiowps_ip_retrieve_method', $ip_retrieve_method_id, true); + $aiowps_firewall_config->set_value('aios_ip_retrieve_method', $ip_retrieve_method_id); + $logged_in_users_table = AIOWPSEC_TBL_LOGGED_IN_USERS; + + //Clear logged in list because it might be showing wrong addresses + if (AIOWPSecurity_Utility::is_multisite_install()) { + $current_blog_id = get_current_blog_id(); + $wpdb->query($wpdb->prepare("DELETE FROM `{$logged_in_users_table}` WHERE site_id = %d", $current_blog_id)); + } + $wpdb->query("DELETE FROM `{$logged_in_users_table}`"); + + $message = ''; + } + + return $this->handle_response(true, $message); + } + + /** + * Perform saving the wp-config.php file. + * + * This method backs up the wp-config.php file and retrieves its content. + * It returns the status of the operation, the file content, and the backup title. + * + * @return array An array containing the status, file content, and backup title. + */ + public function perform_save_wp_config() { + $wp_config_path = AIOWPSecurity_Utility_File::get_wp_config_file_path(); + AIOWPSecurity_Utility_File::backup_and_rename_wp_config($wp_config_path); // Backup the wp_config.php file + $title = "wp-config-backup.txt"; + $file_content = file_get_contents($wp_config_path); + + $extra_args = array( + 'data' => $file_content, + 'title' => $title + ); + + return $this->handle_response(true, false, array('extra_args' => $extra_args)); + } + + /** + * Perform exporting All-In-One Security settings. + * + * This method exports general settings, firewall settings, and two-factor authentication settings + * if applicable. It then returns the exported data in JSON format along with a title for the export. + * + * @return array An array containing the status, exported data in JSON format, and a title for the export. + */ + public function perform_export_aios_settings() { + global $simba_two_factor_authentication; + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + + $config_data = array(); + $config_data['general'] = get_option('aio_wp_security_configs'); + + if (is_main_site() && is_super_admin()) { + $config_data['firewall'] = $aiowps_firewall_config->get_contents(); + + if (true == $simba_two_factor_authentication->is_tfa_integrated) { + $config_data['tfa'] = $simba_two_factor_authentication->get_configs(); + } + } + + $output = json_encode($config_data); + + $extra_args = array( + 'data' => $output, + 'title' => 'aiowps_' . current_time('Y-m-d_H-i') . '.txt' + ); + + return $this->handle_response(true, false, array('extra_args' => $extra_args)); + } + + /** + * Render the Import/Export settings UI for legacy UDC. + * + * @return array + */ + public function get_import_export_contents() { + global $aio_wp_security; + + $content = $aio_wp_security->include_template('wp-admin/settings/settings-file-operations.php', true, array()); + + return array( + 'status' => 'success', + 'content' => $content, + ); + } + + /** + * Render the reset settings UI for legacy UDC. + * + * @return array + */ + public function get_reset_contents() { + global $aio_wp_security; + + $content = $aio_wp_security->include_template('wp-admin/settings/general-settings.php', true, array()); + + return array( + 'status' => 'success', + 'content' => $content, + ); + } + + /** + * Return ip address detection data for the advanced settings. + * + * @return array + */ + public function get_ip_address_detection_data() { + global $aio_wp_security; + + $ip_retrieve_methods_postfixes = array( + 'REMOTE_ADDR' => __('Default - if correct, then this is the best option', 'all-in-one-wp-security-and-firewall'), + 'HTTP_CF_CONNECTING_IP' => __("Only use if you're using Cloudflare.", 'all-in-one-wp-security-and-firewall'), + ); + + $ip_retrieve_methods = array(); + + foreach (AIOS_Abstracted_Ids::get_ip_retrieve_methods() as $id => $ip_method) { + $ip_retrieve_methods[$id]['ip_method'] = $ip_method; + + if (isset($_SERVER[$ip_method])) { + /* translators: %s: IP Method */ + $ip_retrieve_methods[$id]['ip_method'] .= ' ' . sprintf(__('(current value: %s)', 'all-in-one-wp-security-and-firewall'), sanitize_text_field(wp_unslash($_SERVER[$ip_method]))); + $ip_retrieve_methods[$id]['is_enabled'] = true; + } else { + $ip_retrieve_methods[$id]['ip_method'] .= ' (' . __('no value (i.e. empty) on your server', 'all-in-one-wp-security-and-firewall') . ')'; + $ip_retrieve_methods[$id]['is_enabled'] = false; + } + + if (!empty($ip_retrieve_methods_postfixes[$ip_method])) { + $ip_retrieve_methods[$id]['ip_method'] .= ' (' . $ip_retrieve_methods_postfixes[$ip_method] . ')'; + } + } + + return array( + 'is_localhost' => AIOWPSecurity_Utility::is_localhost(), + 'current_ip_retrieve_method' => $aio_wp_security->configs->get_value('aiowps_ip_retrieve_method'), + 'ip_retrieve_methods' => $ip_retrieve_methods, + 'server_suitable_ip_methods' => AIOWPSecurity_Utility_IP::get_server_suitable_ip_methods() + ); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-tfa-commands.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-tfa-commands.php new file mode 100755 index 00000000..5797b662 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-tfa-commands.php @@ -0,0 +1,216 @@ +init_tfa(); + + $controller = $tfa->get_controller(); + + $old_algorithm = $controller->get_user_otp_algorithm($current_user->ID); + + if ($old_algorithm != $data['tfa_algorithm_type']) { + $controller->changeUserAlgorithmTo($current_user->ID, $data['tfa_algorithm_type']); + } + + return array( + 'status' => 'success', + ); + } + + /** + * Saves the TFA activation setting. + * + * @param array $data Passed arguments. + * + * @return array|WP_Error + */ + public function save_activation_setting($data) { + if (!AIOWPSecurity_Utility_Permissions::has_manage_cap()) { + return new WP_Error(esc_html__('Sorry, you do not have enough privilege to execute the requested action.', 'all-in-one-wp-security-and-firewall')); + } + + global $current_user; + + $tfa = $this->init_tfa(); + + $tfa->change_tfa_enabled_status($current_user->ID, $data['tfa_enable_tfa']); + + return array( + 'status' => 'success', + ); + } + + /** + * Updates the TFA private key. + * + * @return array|WP_Error + */ + public function update_private_key() { + if (!AIOWPSecurity_Utility_Permissions::has_manage_cap()) { + return new WP_Error(esc_html__('Sorry, you do not have enough privilege to execute the requested action.', 'all-in-one-wp-security-and-firewall')); + } + + global $current_user; + + $user_id = $current_user->ID; + + delete_user_meta($user_id, 'tfa_priv_key_64'); + delete_user_meta($user_id, 'simba_tfa_emergency_codes_64'); + + return array( + 'status' => 'success', + ); + } + + /** + * Updates the TFA OTP Code. + * + * @param array $data Passed arguments. + * + * @return array|WP_Error + */ + public function update_otp_code($data) { + if (!AIOWPSecurity_Utility_Permissions::has_manage_cap()) { + return new WP_Error(esc_html__('Sorry, you do not have enough privilege to execute the requested action.', 'all-in-one-wp-security-and-firewall')); + } + + global $current_user; + + $tfa = $this->init_tfa(); + + if ('refreshotp' == $data['subaction']) { + $code = $tfa->get_controller()->get_current_code($current_user->ID); + + if (false === $code) { + return array( + 'status' => 'error', + 'code' => '', + ); + } + + return array( + 'status' => 'success', + 'code' => $code, + ); + } elseif ('untrust_device' == $data['subaction']) { + global $current_user; + + $trusted_devices = $tfa->user_get_trusted_devices(); + + $trusted_device = $trusted_devices[wp_unslash($data['device_id'])]; + + if (isset($trusted_device)) { + unset($trusted_device); + } + + $current_user_id = $current_user->ID; + + $tfa->user_set_trusted_devices($current_user_id, $trusted_devices); + + $trusted_list = $tfa->include_template('trusted-devices-inner-box.php', array('trusted_devices' => $tfa->user_get_trusted_devices()), true); + + return array( + 'status' => 'success', + 'trusted_list' => $trusted_list, + ); + } + + exit; + } + + /** + * Renders the TFA UI. + * + * @return array + */ + public function get_tfa_contents() { + if (!function_exists('submit_button')) { + require_once(ABSPATH . 'wp-admin/includes/template.php'); + } + + $tfa = $this->init_tfa(); + + $content = $tfa->include_template('user-settings.php', array('simba_tfa' => $tfa), true); + + return array( + 'status' => 'success', + 'content' => $content, + ); + } + + /** + * Get the TFA settings data for the new UDC theme. + * + * @return array + */ + public function get_tfa_data() { + $tfa = $this->init_tfa(); + + return array( + 'tfa_required_administrator' => $tfa->get_option('tfa_required_administrator'), + 'tfa_administrator' => $tfa->get_option('tfa_administrator'), + ); + } + + /** + * Save the TFA settings data for the new UDC theme. + * + * @param array $data The data to save. + * + * @return array|WP_Error + */ + public function perform_save_tfa($data) { + if (!AIOWPSecurity_Utility_Permissions::has_manage_cap()) { + return new WP_Error(esc_html__('Sorry, you do not have enough privilege to execute the requested action.', 'all-in-one-wp-security-and-firewall')); + } + + $success = false; + $message = ''; + + $tfa = $this->init_tfa(); + + $value = isset($data["tfa_required_administrator"]) ? '1' : ''; + + if ($tfa->update_option('tfa_required_administrator', $value)) { + $tfa->update_option('tfa_administrator', $value); + + $success = true; + } + + return $this->handle_response($success, $message); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-tools-commands.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-tools-commands.php new file mode 100755 index 00000000..18196dab --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-tools-commands.php @@ -0,0 +1,253 @@ +')) { + if (!(filter_var($ip_or_domain, FILTER_VALIDATE_IP) || filter_var($ip_or_domain, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME))) $invalid_domain = true; // phpcs:ignore PHPCompatibility.Constants.NewConstants.filter_validate_domainFound -- This code only runs on php 7.0+ so ignore the warning + } + + if ($invalid_domain) { + $result = __('Please enter a valid IP address or domain name to look up.', 'all-in-one-wp-security-and-firewall'); + $result .= __('Nothing to show.', 'all-in-one-wp-security-and-firewall'); + } else { + $result = $this->whois_lookup($ip_or_domain); + + if (is_wp_error($result)) { + $result = htmlspecialchars($result->get_error_message()); + $result .= __('Nothing to show.', 'all-in-one-wp-security-and-firewall'); + } else { + $result = htmlspecialchars($result); + } + } + + $args = array( + 'content' => array('aios-who-is-lookup-result-container' => $aio_wp_security->include_template('wp-admin/tools/partials/who-is-lookup-result.php', true, array('result' => $result, 'ip_or_domain' => $ip_or_domain))) + ); + + return $this->handle_response(true, false, $args); + } + + /** + * Store custom .htaccess settings provided by the user. + * + * @param array $data The data containing the custom .htaccess settings. + * It should include keys 'aiowps_enable_custom_rules', 'aiowps_custom_rules', + * and 'aiowps_place_custom_rules_at_top' if applicable. + * @return array An array containing the status of the operation and any relevant messages. + * The 'status' key indicates whether the operation was successful. + * The 'message' key contains any informational or error messages. + */ + public function perform_store_custom_htaccess_settings($data) { + global $aio_wp_security; + + $success = true; + $message = ''; + + $options = array(); + // Save settings + if (isset($data["aiowps_enable_custom_rules"]) && empty($data['aiowps_custom_rules'])) { + $message = __('You must enter some .htaccess directives in the text box below', 'all-in-one-wp-security-and-firewall'); + return $this->handle_response(false, $message); + } else { + if (!empty($data['aiowps_custom_rules'])) { + // Sanitize textarea shoud not be used as etc rules gets removed. + // Escape textarea should not be used the & becomes &. + // Here stripslashes as old version 5.3.0 not required, AIOWPSecurity_Ajax::set_data applies wp_unslash for ajax data. + // So the .htacces rule having index\.php backslashes removed if used stripslashes below. + $options['aiowps_custom_rules'] = $data['aiowps_custom_rules']; + } else { + $options['aiowps_custom_rules'] = ''; //Clear the custom rules config value + } + + $aiowps_custom_rules = $aio_wp_security->configs->get_value('aiowps_custom_rules'); + $aiowps_place_custom_rules_at_top = $aio_wp_security->configs->get_value('aiowps_place_custom_rules_at_top'); + + $options['aiowps_enable_custom_rules'] = isset($data["aiowps_enable_custom_rules"]) ? '1' : ''; + $options['aiowps_place_custom_rules_at_top'] = isset($data["aiowps_place_custom_rules_at_top"]) ? '1' : ''; + $this->save_settings($options); // Save the configuration + + $write_result = AIOWPSecurity_Utility_Htaccess::write_to_htaccess(); //now let's write to the .htaccess file + if (!$write_result) { + $options['aiowps_enable_custom_rules'] = $aiowps_custom_rules; + $options['aiowps_place_custom_rules_at_top'] = $aiowps_place_custom_rules_at_top; + + $this->save_settings($options); + + $success = false; + $message = __('The plugin was unable to write to the .htaccess file, please edit file manually.', 'all-in-one-wp-security-and-firewall'); + $aio_wp_security->debug_logger->log_debug("Custom Rules feature - The plugin was unable to write to the .htaccess file."); + } + } + + return $this->handle_response($success, $message); + } + + /** + * Perform the general visitor lockout settings operation. + * + * @param array $data The data containing the general visitor lockout settings. + * It should include keys 'aiowps_site_lockout' and 'aiowps_site_lockout_msg'. + * @return array An array containing the status of the operation and any relevant messages. + * The 'status' key indicates whether the operation was successful. + * The 'message' key contains an informational message about the outcome of the operation. + */ + public function perform_general_visitor_lockout($data) { + $options = array(); + + // Save settings + $options['aiowps_site_lockout'] = isset($data["aiowps_site_lockout"]) ? '1' : ''; + $maint_msg = wp_kses_post(wp_unslash($data['aiowps_site_lockout_msg'])); + $options['aiowps_site_lockout_msg'] = $maint_msg; // Text area/msg box + $this->save_settings($options); + + do_action('aiowps_site_lockout_settings_saved'); + + return array( + 'status' => 'success', + 'message' => __('The settings have been successfully updated.', 'all-in-one-wp-security-and-firewall') + ); + } + + /** + * Perform the general visitor lockout setting operation for the dashboard widget. + * + * @param array $data The data containing the general visitor lockout setting. + * It should include the 'aiowps_site_lockout' key. + * @return array An array containing the status of the operation and any relevant messages. + * The 'status' key indicates whether the operation was successful. + * The 'message' key contains an informational message about the outcome of the operation. + */ + public function perform_general_visitor_lockout_dashboard_widget($data) { + $options = array(); + + // Save settings + $options['aiowps_site_lockout'] = isset($data["aiowps_site_lockout"]) ? '1' : ''; + $this->save_settings($options); + + do_action('aiowps_site_lockout_settings_saved'); + + return $this->handle_response(true); + } + + /** + * Checks a password against the HIBP database. + * + * @param array $data Contains the password to be checked. + * + * @return array + */ + public function hibp_check_password($data) { + return array( + 'status' => 'success', + 'pwned' => AIOS_HIBP::password_is_pwned($data['password']), + ); + } + + /** + * Does a WHOIS lookup on an IP address or domain name and then returns the result. + * + * @param String $search - IP address or domain name to do a WHOIS lookup on + * @param Integer $timeout - connection timeout for fsockopen + * + * @return String|WP_Error - returns preformatted WHOIS lookup result or WP_Error + */ + private function whois_lookup($search, $timeout = 10) { + $fp = @fsockopen('whois.iana.org', 43, $errno, $errstr, $timeout); + + if (!$fp) { + return new WP_Error('whois_lookup_failed', 'whois.iana.org: Socket Error '.$errno.' - '.$errstr); + } + + $queries = sprintf(__('Querying %s: %s', 'all-in-one-wp-security-and-firewall'), 'whois.iana.org', $search)."\n"; + + fputs($fp, $search."\r\n"); + $out = ''; + while (!feof($fp)) { + $line = fgets($fp); + if (preg_match('/refer: +(\S+)/', $line, $matches)) { + $referral_server = $matches[1]; + $queries .= sprintf(__('Redirected to %s', 'all-in-one-wp-security-and-firewall'), $referral_server)."\n"; + break; + } + $out .= $line; + } + fclose($fp); + + if (!isset($referral_server) && filter_var($search, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) && preg_match('/whois: +(\S+)/', $out, $matches)) { + $referral_server = $matches[1]; + $queries .= sprintf(__('Redirected to %s', 'all-in-one-wp-security-and-firewall'), $referral_server)."\n"; + } + + $referrals = array(); + + while (isset($referral_server)) { + $referrals[] = $referral_server; + + $fp = @fsockopen($referral_server, 43, $errno, $errstr, $timeout); + + if (!$fp) { + return new WP_Error('whois_lookup_failed', $referral_server.': Socket Error '.$errno.' - '.$errstr); + } + + if ('whois.arin.net' == $referral_server) { + $formatted_search = 'n + '.$search; + } elseif ('whois.denic.de' == $referral_server) { + $formatted_search = '-T dn,ace '.$search; + } elseif ('whois.dk-hostmaster.dk' == $referral_server) { + $formatted_search = '--charset=utf-8 --show-handles '.$search; + } elseif ('whois.nic.ad.jp' == $referral_server || 'whois.jprs.jp' == $referral_server) { + $formatted_search = $search.'/e'; + } else { + $formatted_search = $search; + } + + $queries .= sprintf(__('Querying %s: %s', 'all-in-one-wp-security-and-firewall'), $referral_server, $formatted_search)."\n"; + + $referral_server = null; + + fputs($fp, $formatted_search."\r\n"); + $out = ''; + while (!feof($fp)) { + $line = fgets($fp); + if (preg_match('/Registrar WHOIS Server: +(\S+)/', $line, $matches) + || preg_match('/% referto: +whois -h (\S+)/', $line, $matches) + || preg_match('/% referto: +(\S+)/', $line, $matches) + || preg_match('/ReferralServer: +rwhois:\/\/(\S+)/', $line, $matches) + || preg_match('/ReferralServer: +whois:\/\/(\S+)/', $line, $matches) + ) { + if (!in_array($matches[1], $referrals)) { + $referral_server = $matches[1]; + $queries .= sprintf(__('Redirected to %s', 'all-in-one-wp-security-and-firewall'), $referral_server)."\n"; + break; + } + } + $out .= $line; + } + fclose($fp); + } + + return $queries."\n".$out; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-user-security-commands.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-user-security-commands.php new file mode 100755 index 00000000..33c5c700 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/commands/wp-security-user-security-commands.php @@ -0,0 +1,716 @@ +configs->set_value('aiowps_prevent_users_enumeration', isset($data["aiowps_prevent_users_enumeration"]) ? '1' : '', true); + $aio_wp_security->configs->set_value('aiowps_enforce_strong_password', isset($data['aiowps_enforce_strong_password']) ? '1' : '', true); + + $badges = array('enforce-strong-password', 'disable-users-enumeration'); + + return $this->handle_response(true, '', array('badges' => $badges)); + } + + /** + * Performs the action to change the admin username. + * + * @param array $data An array containing the data for changing the admin username. + * The array may contain the following keys: + * - 'aiowps_new_user_name': The new username to be set for the admin. + * @return array Returns an array containing the status of the operation ('success' or 'error'), + * and a message indicating the result of the operation. + * If the operation is successful, it also includes a badge representing the updated feature details. + */ + public function perform_change_admin_username($data) { + global $wpdb, $aio_wp_security; + + $response = array( + 'status' => 'success', + 'content' => array() + ); + + $error = ''; + if (!empty($data['aiowps_new_user_name'])) { + $new_username = sanitize_text_field($data['aiowps_new_user_name']); + if (validate_username($new_username)) { + if (AIOWPSecurity_Utility::check_user_exists($new_username)) { + $response['status'] = 'error'; + $error = sprintf(__('Username: %s already exists, please enter another value.', 'all-in-one-wp-security-and-firewall'), $new_username); + } else { + // let's check if currently logged in username is 'admin' + $user = wp_get_current_user(); + $user_login = $user->user_login; + if ('admin' == strtolower($user_login)) { + $username_is_admin = true; + } else { + $username_is_admin = false; + } + // Now let's change the username + $sql = $wpdb->prepare("UPDATE `" . $wpdb->users . "` SET user_login = '" . esc_sql($new_username) . "' WHERE user_login=%s", "admin"); + $result = $wpdb->query($sql); + if (false === $result) { + // There was an error updating the users table + $user_update_error = __('The database update operation of the user account failed.', 'all-in-one-wp-security-and-firewall'); + $response['status'] = 'error'; + $response['message'] = $user_update_error; + $aio_wp_security->debug_logger->log_debug($user_update_error . ' ' . $wpdb->last_error, 4); + return $response; + } + + // multisite considerations + if (is_multisite()) { // process sitemeta if we're in a multi-site situation + $oldAdmins = $wpdb->get_var("SELECT meta_value FROM `" . $wpdb->sitemeta . "` WHERE meta_key = 'site_admins'"); + $newAdmins = str_replace('5:"admin"', strlen($new_username) . ':"' . esc_sql($new_username) . '"', $oldAdmins); + $wpdb->query("UPDATE `" . $wpdb->sitemeta . "` SET meta_value = '" . esc_sql($newAdmins) . "' WHERE meta_key = 'site_admins'"); + } + + // If user is logged in with username "admin" then log user out and send to login page so they can login again + if ($username_is_admin) { + // Lets logout the user + $aio_wp_security->debug_logger->log_debug("Logging user out with login ".$user_login. " because they changed their username."); + $after_logout_url = AIOWPSecurity_Utility::get_current_page_url(); + $after_logout_payload = array('redirect_to' => $after_logout_url, 'msg' => $aio_wp_security->user_login_obj->key_login_msg.'=admin_user_changed'); + //Save some of the logout redirect data to a transient + is_multisite() ? set_site_transient('aiowps_logout_payload', $after_logout_payload, 30 * 60) : set_transient('aiowps_logout_payload', $after_logout_payload, 30 * 60); + + $logout_url = AIOWPSEC_WP_URL.'?aiowpsec_do_log_out=1'; + $logout_url = AIOWPSecurity_Utility::add_query_data_to_url($logout_url, 'al_additional_data', '1'); + + $response['logout_user'] = true; + $response['logout_url'] = $logout_url; + } + } + } else { // An invalid username was entered + $error = __('You entered an invalid username, please enter another value.', 'all-in-one-wp-security-and-firewall'); + } + } else { // No username value was entered + $response['status'] = 'error'; + $error = __('Please enter a value for your username.', 'all-in-one-wp-security-and-firewall'); + } + + if (!empty($error)) { // We have some validation or other error + $response['message'] = $error; + } else { + $response['message'] = __('The username has been successfully changed.', 'all-in-one-wp-security-and-firewall'); + $response['badges'] = $this->get_features_id_and_html(array('user-accounts-change-admin-user')); + $response['content']['change-admin-username-content'] = $aio_wp_security->include_template('wp-admin/user-security/partials/wp-username-content.php', true); + } + + return $response; + } + + /** + * Performs the action to save the login lockout settings. + * + * @param array $data An array containing the data to be saved. + * + * @return array Returns an array containing the status of the operation ('success' or 'error'), + * a message indicating the result of the operation, + * and a badge representing the updated feature details. + */ + public function perform_save_login_lockout_settings($data) { + + $response = array( + 'status' => 'success', + 'values' => array(), + 'info' => array() + ); + + $invalid_fields = array(); + + $max_login_attempt_val = sanitize_text_field($data['aiowps_max_login_attempts']); + if (!is_numeric($max_login_attempt_val) || 1 > $max_login_attempt_val) { + $invalid_fields[] = 'max login attempts'; + $max_login_attempt_val = '3'; // Set it to the default value for this field + } + + $login_retry_time_period = sanitize_text_field($data['aiowps_retry_time_period']); + if (!is_numeric($login_retry_time_period) || 1 > $login_retry_time_period) { + $invalid_fields[] = 'login retry time period'; + $login_retry_time_period = '5'; // Set it to the default value for this field + } + + $lockout_time_length = sanitize_text_field($data['aiowps_lockout_time_length']); + if (!is_numeric($lockout_time_length) || 1 > $lockout_time_length) { + $invalid_fields[] = 'minimum lockout time length'; + $lockout_time_length = '5'; // Set it to the default value for this field + } + + $max_lockout_time_length = sanitize_text_field($data['aiowps_max_lockout_time_length']); + if (!is_numeric($max_lockout_time_length) || 1 > $max_lockout_time_length) { + $invalid_fields[] = 'maximum lockout time length'; + $max_lockout_time_length = '60'; // Set it to the default value for this field + } + + if ($lockout_time_length >= $max_lockout_time_length) { + $invalid_fields[] = 'minimum lockout time length'; + $lockout_time_length = '5'; // Set it to the default value for this field + $max_lockout_time_length = '60'; // Set it to the default value for this field + } + + $email_addresses = isset($data['aiowps_email_address']) ? stripslashes($data['aiowps_email_address']) : get_bloginfo('admin_email'); + $email_addresses_trimmed = AIOWPSecurity_Utility::explode_trim_filter_empty($email_addresses, "\n"); + // Read into array, sanitize, filter empty and keep only unique usernames. + $email_address_list = array_unique( + array_filter( + array_map( + 'sanitize_email', + $email_addresses_trimmed + ), + 'is_email' + ) + ); + + if (isset($data['aiowps_enable_email_notify']) && 1 == $data['aiowps_enable_email_notify'] && 0 == count($email_addresses_trimmed)) { + $invalid_fields[] = 'email addresses'; + } elseif (isset($data['aiowps_enable_email_notify']) && 1 == $data['aiowps_enable_email_notify'] && (0 == count($email_address_list) || count($email_address_list) != count($email_addresses_trimmed))) { + $invalid_fields[] = 'email addresses'; + } + if (isset($data['aiowps_enable_email_notify']) && 0 == count($email_address_list)) { + $email_address_list[] = get_bloginfo('admin_email'); + } + + // Instantly lockout specific usernames + $instantly_lockout_specific_usernames = isset($data['aiowps_instantly_lockout_specific_usernames']) ? $data['aiowps_instantly_lockout_specific_usernames'] : ''; + // Read into array, sanitize, filter empty and keep only unique usernames. + $instantly_lockout_specific_usernames = array_unique( + array_filter( + array_map( + 'sanitize_user', + AIOWPSecurity_Utility::explode_trim_filter_empty($instantly_lockout_specific_usernames) + ), + 'strlen' + ) + ); + + $response['message'] = __('The settings have been successfully updated.', 'all-in-one-wp-security-and-firewall'); + + if (!empty($invalid_fields)) { + $invalid_fields = array_unique($invalid_fields); + $invalid_fields = implode(", ", $invalid_fields); + $response['info'][] = sprintf(__('The following options had invalid values and have been set to the defaults: %s', 'all-in-one-wp-security-and-firewall'), $invalid_fields); + } + + $options = array(); + + // Save all the form values to the options + $random_20_digit_string = AIOWPSecurity_Utility::generate_alpha_numeric_random_string(20); // Generate random 20 char string for use during CAPTCHA encode/decode + $options['aiowps_unlock_request_secret_key'] = $random_20_digit_string; + + $options['aiowps_enable_login_lockdown'] = isset($data["aiowps_enable_login_lockdown"]) ? '1' : ''; + $options['aiowps_allow_unlock_requests'] = isset($data["aiowps_allow_unlock_requests"]) ? '1' : ''; + $options['aiowps_max_login_attempts'] = absint($max_login_attempt_val); + $options['aiowps_retry_time_period'] = absint($login_retry_time_period); + $options['aiowps_lockout_time_length'] = absint($lockout_time_length); + $options['aiowps_max_lockout_time_length'] = absint($max_lockout_time_length); + $options['aiowps_set_generic_login_msg'] = isset($data["aiowps_set_generic_login_msg"]) ? '1' : ''; + $options['aiowps_enable_invalid_username_lockdown']= isset($data["aiowps_enable_invalid_username_lockdown"]) ? '1' : ''; + $options['aiowps_instantly_lockout_specific_usernames'] = $instantly_lockout_specific_usernames; + $options['aiowps_enable_email_notify'] = isset($data["aiowps_enable_email_notify"]) ? '1' : ''; + $options['aiowps_enable_php_backtrace_in_email'] = isset($data['aiowps_enable_php_backtrace_in_email']) ? '1' : ''; + $options['aiowps_email_address'] = $email_address_list; + $this->save_settings($options); + + $response['values']['aiowps_max_login_attempts'] = absint($max_login_attempt_val); + $response['values']['aiowps_retry_time_period'] = absint($login_retry_time_period); + $response['values']['aiowps_lockout_time_length'] = absint($lockout_time_length); + $response['values']['aiowps_max_lockout_time_length'] = absint($max_lockout_time_length); + $response['values']['aiowps_email_address'] = implode("\n", $email_address_list); + + $response['badges'] = $this->get_features_id_and_html(array('user-login-login-lockdown')); + + return $response; + } + + /** + * Performs the action to save the login lockout whitelist settings. + * + * @param array $data An array containing the data to be saved. + * The array may contain the following keys: + * - 'aiowps_lockdown_enable_whitelisting': A boolean indicating whether whitelisting is enabled. + * - 'aiowps_lockdown_allowed_ip_addresses': The allowed IP addresses for whitelisting. + * @return array Returns an array containing the status of the operation ('success' or 'error'), + * a message indicating the result of the operation, + * and a badge representing the updated feature details. + */ + public function perform_save_login_lockout_whitelist_settings($data) { + global $aio_wp_security; + + $response = array( + 'status' => 'success' + ); + + $options = array(); + $result = 1; + + if (!empty($data['aiowps_lockdown_allowed_ip_addresses'])) { + $ip_addresses = sanitize_textarea_field(wp_unslash($data['aiowps_lockdown_allowed_ip_addresses'])); + $ip_list_array = AIOWPSecurity_Utility_IP::create_ip_list_array_from_string_with_newline($ip_addresses); + $validated_ip_list_array = AIOWPSecurity_Utility_IP::validate_ip_list($ip_list_array, 'whitelist'); + if (is_wp_error($validated_ip_list_array)) { + $result = -1; + $response['status'] = 'error'; + $response['message'] = AIOWPSecurity_Admin_Menu::show_msg_error_st(nl2br($validated_ip_list_array->get_error_message()), true); + } else { + $allowed_ip_data = implode("\n", $validated_ip_list_array); + $options['aiowps_lockdown_allowed_ip_addresses'] = $allowed_ip_data; + } + } else { + $options['aiowps_lockdown_allowed_ip_addresses'] = ''; //Clear the IP address config value + } + + if (1 == $result) { + $aio_wp_security->configs->set_value('aiowps_lockdown_enable_whitelisting', isset($data["aiowps_lockdown_enable_whitelisting"]) ? '1' : '', true); + $response['message'] = __('The settings have been successfully updated.', 'all-in-one-wp-security-and-firewall'); + $response['badges'] = $this->get_features_id_and_html(array('user-login-lockout-ip-whitelisting')); + } + + $this->save_settings($options); + + return $response; + } + + /** + * Performs the action to force logout users. + * + * @param array $data An array containing the data to be saved. + * The array may contain the following keys: + * - 'aiowps_logout_time_period': The time period (in minutes) for logout. + * - 'aiowps_enable_forced_logout': A boolean indicating whether forced logout is enabled. + * @return array Returns an array containing the status of the operation ('success' or 'error'), + * an array of messages indicating the result of the operation, + * the content representing the logout time period, + * and a badge representing the updated feature details. + */ + public function perform_force_logout($data) { + global $aio_wp_security; + $response = array( + 'status' => 'success', + 'info' => array(), + 'values' => array() + ); + + $options = array(); + + + $logout_time_period = sanitize_text_field($data['aiowps_logout_time_period']); + if (isset($data["aiowps_enable_forced_logout"]) && (!is_numeric($logout_time_period) || $logout_time_period < 1)) { + $response['info'][] = __('You entered a non numeric or negative value for the logout time period field, it has been set to the default value.', 'all-in-one-wp-security-and-firewall'); + $logout_time_period = '60'; // Set it to the default value for this field + } + + // Save all the form values to the options + $options['aiowps_logout_time_period'] = absint($logout_time_period); + $options['aiowps_enable_forced_logout'] = isset($data["aiowps_enable_forced_logout"]) ? '1' : ''; + $this->save_settings($options); + + $response['values']['aiowps_logout_time_period'] = absint($logout_time_period); + $response['badges'] = $this->get_features_id_and_html(array('user-login-force-logout')); + $response['message'] = __('The settings have been successfully updated.', 'all-in-one-wp-security-and-firewall'); + + if ('1' === $options['aiowps_enable_forced_logout']) { + $response['logout_user'] = $this->check_logout_user(); + $response['logout_url'] = $aio_wp_security->user_login_obj->aiowps_force_logout_action_handler(true); + } + + return $response; + } + + /** + * Performs the action to save the HIBP settings. + * + * @param array $data An array containing the data to be saved. + * + * @return array Returns an array containing the status of the operation ('success' or 'error'), + * a message indicating the result of the operation, + * and a badge representing the updated feature details. + */ + public function perform_save_hibp_settings($data) { + global $aio_wp_security; + + $aio_wp_security->configs->set_value('aiowps_hibp_user_profile_update', isset($data['aiowps_hibp_user_profile_update']) ? '1' : '', true); + $aio_wp_security->configs->set_value('aiowps_http_password_reset', isset($data['aiowps_http_password_reset']) ? '1' : '', true); + $aio_wp_security->configs->save_config(); + + return $this->handle_response(true, false, array('badges' => array('hibp'))); + } + + /** + * Performs the action to disable application password. + * + * @param array $data An array containing the data to be saved. + * The array may contain the following key: + * - 'aiowps_disable_application_password': A boolean indicating whether application password is disabled. + * @return array Returns an array containing the status of the operation ('success' or 'error'), + * a message indicating the result of the operation, + * and a badge representing the updated feature details. + */ + public function perform_disable_application_password($data) { + global $aio_wp_security; + + // Save all the form values to the options + $aio_wp_security->configs->set_value('aiowps_disable_application_password', isset($data['aiowps_disable_application_password']) ? '1' : '', true); + + return array( + 'status' => 'success', + 'message' => __('The settings have been successfully updated.', 'all-in-one-wp-security-and-firewall'), + 'badges' => $this->get_features_id_and_html(array('disable-application-password')) + ); + } + + /** + * Performs the action to add salt postfix. + * + * @param array $data An array containing the data to be saved. + * The array may contain the following key: + * - 'aiowps_enable_salt_postfix': A boolean indicating whether salt postfix is enabled. + * @return array Returns an array containing the status of the operation ('success' or 'error'), + * a message indicating the result of the operation, + * and a badge representing the updated feature details. + */ + public function perform_add_salt_postfix($data) { + global $aio_wp_security; + + $response = array( + 'status' => 'success' + ); + + // Save settings + $aiowps_enable_salt_postfix = isset($data['aiowps_enable_salt_postfix']) ? '1' : ''; + if ($aiowps_enable_salt_postfix == $aio_wp_security->configs->get_value('aiowps_enable_salt_postfix')) { + $is_setting_changed = true; + } else { + $is_setting_changed = false; + } + + $aio_wp_security->configs->set_value('aiowps_enable_salt_postfix', $aiowps_enable_salt_postfix, true); + $ret_schedule = $this->schedule_change_auth_keys_and_salt(); + + if (is_wp_error($ret_schedule)) { + $aio_wp_security->debug_logger->log_debug($ret_schedule->get_error_message(), 4); + } + + if ('1' == $aiowps_enable_salt_postfix && $is_setting_changed) { + AIOWPSecurity_Utility::change_salt_postfixes(); + } + + $response['message'] = __('The settings have been successfully updated.', 'all-in-one-wp-security-and-firewall'); + $response['badges'] = $this->get_features_id_and_html(array('enable-salt-postfix')); + + return $response; + } + + /** + * Performs actions on logged-in users. + * + * @param array $data An array containing the data for the action to be performed. + * The array may contain the following keys: + * - 'action': The action to be performed on logged-in users (e.g., 'force_user_logout'). + * - 'logged_in_id': The ID of the logged-in user on which the action will be performed. + * @return array Returns an array containing the status of the operation ('success' or 'error'), + * and a message indicating the result of the operation. + */ + public function perform_logged_in_user_action($data) { + global $aio_wp_security; + include_once AIO_WP_SECURITY_PATH.'/admin/wp-security-list-logged-in-users.php'; // For rendering the AIOWPSecurity_List_Table + $user_list = new AIOWPSecurity_List_Logged_In_Users(); + $response = array( + 'status' => 'success' + ); + + if (empty($data['action']) || !in_array($data['action'], array('force_user_logout'))) { // more actions can be added + return array( + 'status' => 'error', + 'message' => __('Invalid action provided for logged in user.', 'all-in-one-wp-security-and-firewall') + ); + } + + if ('force_user_logout' == $data['action']) { + if (empty($data['logged_in_id'])) { + return array( + 'status' => 'error', + 'message' => __('No user ID was provided', 'all-in-one-wp-security-and-firewall') + ); + } + $user_id = strip_tags($data['logged_in_id']); + $error = ''; + + if (!is_numeric($user_id)) { + $error = __("Invalid user ID provided.", 'all-in-one-wp-security-and-firewall'); + } elseif (get_current_user_id() == $user_id) { + $error = __("You cannot log yourself out", 'all-in-one-wp-security-and-firewall'); + } elseif (is_super_admin($user_id)) { + $error = __("Super admins cannot be logged out.", 'all-in-one-wp-security-and-firewall'); + } elseif (!AIOWPSecurity_Utility::is_user_member_of_blog($user_id)) { + $error = __("You cannot log out a user from a different subsite.", 'all-in-one-wp-security-and-firewall'); + } + if ($error) { + return array( + 'message' => $error, + 'status' => 'error' + ); + } + + $users = esc_sql($user_id); + $result = $aio_wp_security->user_login_obj->delete_logged_in_user($users); + + if ($result) { + $user_list->logout_user($users); + $response['message'] = __('The selected user has been logged out successfully.', 'all-in-one-wp-security-and-firewall'); + } else { + $response['message'] = __('Failed to log out the selected user.', 'all-in-one-wp-security-and-firewall'); + $response['status'] = 'error'; + } + + } + + return $response; + } + + /** + * Performs the action to configure manual registration approval settings. + * + * @param array $data An array containing the data to be saved. + * The array may contain the following key: + * - 'aiowps_enable_manual_registration_approval': A boolean indicating whether manual registration approval is enabled. + * @return array Returns an array containing the status of the operation ('success' or 'error'), + * a message indicating the result of the operation, + * and a badge representing the updated feature details. + */ + public function perform_manual_approval_settings($data) { + global $aio_wp_security; + + // Save settings + $aio_wp_security->configs->set_value('aiowps_enable_manual_registration_approval', isset($data["aiowps_enable_manual_registration_approval"]) ? '1' : '', true); + + return array( + 'status' => 'success', + 'message' => __('The settings have been successfully updated.', 'all-in-one-wp-security-and-firewall'), + 'badges' => $this->get_features_id_and_html(array('manually-approve-registrations')) + ); + } + + /** + * Performs actions on manual approval items (e.g., approve account, delete account, block IP). + * + * @param array $data An array containing the data for the action to be performed. + * The array may contain the following keys: + * - 'action': The action to be performed on the manual approval item (e.g., 'approve_acct', 'delete_acct', 'block_ip'). + * - 'user_id': The ID of the user for whom the action will be performed (applicable for 'approve_acct' and 'delete_acct' actions). + * - 'ip_address': The IP address to be blocked (applicable for 'block_ip' action). + * @return array Returns an array containing the status of the operation ('success' or 'error'), + * and a message indicating the result of the operation. + */ + public function perform_manual_approval_item_action($data) { + global $aio_wp_security; + + include_once AIO_WP_SECURITY_PATH.'/admin/wp-security-list-registered-users.php'; // For rendering the AIOWPSecurity_List_Table + $user_list = new AIOWPSecurity_List_Registered_Users(); + $status = 'error'; + + $valid_actions = array('approve_acct', 'delete_acct', 'block_ip'); + if (empty($data['action']) || !in_array($data['action'], $valid_actions)) { // more actions can be added + return array( + 'status' => 'error', + 'message' => __('Invalid action provided for registered user.', 'all-in-one-wp-security-and-firewall') + ); + } + + switch ($data['action']) { + case 'approve_acct': + if (empty($data['user_id'])) { + return array( + 'status' => 'error', + 'message' => __('No valid user ID was provided', 'all-in-one-wp-security-and-firewall') + ); + } + $user_id = esc_sql(strip_tags($data['user_id'])); + $meta_key = 'aiowps_account_status'; + $meta_value = 'approved'; // set account status + + // Approve single account + $result = update_user_meta($user_id, $meta_key, $meta_value); + if ($result) { + $user = get_user_by('id', $user_id); + $user_list->send_email_upon_account_activation($user); + $message = __('The selected account was approved successfully.', 'all-in-one-wp-security-and-firewall'); + $status = 'success'; + } elseif (false === $result) { + $aio_wp_security->debug_logger->log_debug("could not approve account ID: $user_id", 4); + $message = __('The selected account could not be approved.', 'all-in-one-wp-security-and-firewall'); + } + break; + case 'delete_acct': + if (empty($data['user_id'])) { + return array( + 'status' => 'error', + 'message' => __('No valid user ID was provided', 'all-in-one-wp-security-and-firewall') + ); + } + + $user_id = esc_sql(strip_tags($data['user_id'])); + // Delete single account + $result = wp_delete_user($user_id); + if (true === $result) { + $message = __('The selected account was deleted successfully.', 'all-in-one-wp-security-and-firewall'); + $status = 'success'; + } else { + $aio_wp_security->debug_logger->log_debug("could not delete account ID: $user_id", 4); + $message = __('The selected account could not be deleted.', 'all-in-one-wp-security-and-firewall'); + } + break; + case 'block_ip': + if (empty($data['ip_address'])) { + return array( + 'status' => 'error', + 'message' => __('No valid IP address was provided', 'all-in-one-wp-security-and-firewall') + ); + } + + $ip = esc_sql(strip_tags($data['ip_address'])); + + if (AIOWPSecurity_Utility_IP::get_user_ip_address() == $ip) { + $message = __('You cannot block your own IP address:', 'all-in-one-wp-security-and-firewall') . ' ' . $ip; + break; + } + + // Block single IP + $result = AIOWPSecurity_Blocking::add_ip_to_block_list($ip, 'registration_spam'); + if (true === $result) { + $message = __('The selected IP was successfully added to the permanent block list.', 'all-in-one-wp-security-and-firewall'); + $message .= ' '.__('View Blocked IPs', 'all-in-one-wp-security-and-firewall').''; + $status = 'success'; + } else { + $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_List_Registered_Users::block_selected_ips() - could not block IP: $ip", 4); + $message = __('The selected IP could not be added to the permanent block list.', 'all-in-one-wp-security-and-firewall'); + } + break; + } + + return array( + 'status' => $status, + 'message' => $message + ); + } + + /** + * Schedule weekly aios_change_auth_keys_and_salt cron event. + * + * @return Boolean|WP_Error True if event successfully scheduled. False or WP_Error on failure. + */ + private function schedule_change_auth_keys_and_salt() { + $previous_time = wp_next_scheduled('aios_change_auth_keys_and_salt'); + + if (false !== $previous_time) { + // Clear schedule so that we don't stack up scheduled backups + wp_clear_scheduled_hook('aios_change_auth_keys_and_salt'); + } + $gmt_offset_in_seconds = floatval(get_option('gmt_offset')) * 3600; + $first_time = strtotime('next Sunday '.apply_filters('aios_salt_change_schedule_time', '3:00 am')) + $gmt_offset_in_seconds; + return wp_schedule_event($first_time, 'weekly', 'aios_change_auth_keys_and_salt'); + } + + /** + * Checks if the current user should be automatically logged out based on last login time. + * + * This method compares the current time with the last login time of the user and determines + * if the user should be logged out based on a configured logout time period. + * + * @return bool Returns true if the user should be logged out, false otherwise. + */ + private function check_logout_user() { + global $aio_wp_security; + + // Get the current user + $current_user = wp_get_current_user(); + $user_id = $current_user->ID; + + // Get the current and last login times + $current_time = current_time('mysql', true); + $login_time = $aio_wp_security->user_login_obj->get_wp_user_aiowps_last_login_time($user_id); + + // Return false if login time is empty (no last login recorded) + if (empty($login_time)) { + return false; + } + + // Calculate the time difference between current time and last login time + $diff = strtotime($current_time) - strtotime($login_time); + + // Get the configured logout time period in seconds + $logout_time_interval_value = $aio_wp_security->configs->get_value('aiowps_logout_time_period'); + $logout_time_interval_val_seconds = $logout_time_interval_value * 60; + + // Return true if the time difference exceeds the logout time interval, indicating the user should be logged out + return $diff > $logout_time_interval_val_seconds; + } + + /** + * Whitelists user's IP address + * + * @return array Returns an array containing the status of the operation ('success' or 'error'), + * a message indicating the result of the operation, + * and a badge representing the updated feature details. + */ + public function perform_whitelist_user_ip() { + $response = array( + 'status' => 'success' + ); + + if (!AIOWPSecurity_Utility_Permissions::has_manage_cap()) { + $response['status'] = 'error'; + $response['message'] = __('You don\'t have enough permissions to whitelist your IP address.', 'all-in-one-wp-security-and-firewall'); + return $response; + } + + $aiowps_firewall_allow_list = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::ALLOW_LIST); + + $whitelisted_ips = $aiowps_firewall_allow_list::get_ips(); + $is_whitelisted = $aiowps_firewall_allow_list::is_ip_allowed(); + + if ($is_whitelisted) { + $response['status'] = 'error'; + $response['message'] = __('Your IP address is already whitelisted.', 'all-in-one-wp-security-and-firewall'); + return $response; + } else { + $user_ip = AIOWPSecurity_Utility_IP::get_user_ip_address(); + + if (empty($user_ip)) { + $response['status'] = 'error'; + $response['message'] = __('Your IP address could not be detected.', 'all-in-one-wp-security-and-firewall'); + return $response; + } + + $whitelisted_ips .= (empty($whitelisted_ips) ? '' : "\n") . $user_ip; + + if (!$aiowps_firewall_allow_list::add_ips($whitelisted_ips)) { + $response['status'] = 'error'; + $response['message'] = __('There was an error whitelisting your IP address, please try again.', 'all-in-one-wp-security-and-firewall'); + return $response; + } + + $response['message'] = __('Your IP address has been whitelisted successfully.', 'all-in-one-wp-security-and-firewall'); + return $response; + } + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/family/wp-security-firewall-families.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/family/wp-security-firewall-families.php new file mode 100755 index 00000000..4baa25b0 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/family/wp-security-firewall-families.php @@ -0,0 +1,13 @@ + '6G', 'priority' => 10), + array('name' => 'Blacklist', 'priority' => 1), + array('name' => 'Bruteforce', 'priority' => 0), + array('name' => 'General', 'priority' => 20), + array('name' => 'Bots', 'priority' => 2), +); diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/family/wp-security-firewall-family-builder.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/family/wp-security-firewall-family-builder.php new file mode 100755 index 00000000..fce6d629 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/family/wp-security-firewall-family-builder.php @@ -0,0 +1,33 @@ + $member2['priority']) ? 1 : -1; + }); + + $families = array(); + foreach ($family_list as $member) { + $families[strtolower($member['name'])] = new Family($member['name'], $member['priority']); + } + + return $families; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/family/wp-security-firewall-family-collection.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/family/wp-security-firewall-family-collection.php new file mode 100755 index 00000000..5305d870 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/family/wp-security-firewall-family-collection.php @@ -0,0 +1,49 @@ +families = $families; + } + + /** + * Generator method to iterate over the families + * + * @return iterable + */ + public function get_family() { + foreach ($this->families as $family) { + yield $family; + } + } + + /** + * Adds a new rule to a family member + * + * @param Rule $rule - an active rule to add to its family + * @return void + */ + public function add_rule_to_member(Rule $rule) { + $key = strtolower($rule->family); + if (array_key_exists($key, $this->families)) { + $this->families[$key]->add_rule($rule); + } + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/family/wp-security-firewall-family.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/family/wp-security-firewall-family.php new file mode 100755 index 00000000..d9631ec9 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/family/wp-security-firewall-family.php @@ -0,0 +1,86 @@ +name = $name; + $this->priority = $priority; + $this->rules = array(); + } + + /** + * Adds a rule to the family + * + * @param Rule $rule + * @return void + */ + public function add_rule(Rule $rule) { + $this->rules[] = $rule; + } + + /** + * Applies all the rules in the family + * + * @return void + */ + public function apply_all() { + + if (empty($this->rules)) { + return; + } + + //ensure the rules are ordered by priority + usort($this->rules, function(Rule $rule, Rule $rule2) { + if ($rule->priority == $rule2->priority) { + return 0; + } + return ($rule->priority > $rule2->priority) ? 1 : -1; + }); + + foreach ($this->rules as $rule) { + $rule->apply(); + } + + } + + /** + * Returns the family name if used as a string + * + * @return string + */ + public function __toString() { + return $this->name; + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/libs/traits/file-prefix-trait.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/libs/traits/file-prefix-trait.php new file mode 100755 index 00000000..b1ed55a1 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/libs/traits/file-prefix-trait.php @@ -0,0 +1,30 @@ +path = $path; + $this->init_file(); + } + + /** + * Initialise the file if it doesn't exist + * + * @return void + */ + private function init_file() { + clearstatcache(); + if (!file_exists($this->path)) { + + $dir = dirname($this->path); + if (!file_exists($dir)) Utility::wp_mkdir_p($dir); + + file_put_contents($this->path, self::get_file_content_prefix() . json_encode(array())); + } + } + + /** + * Update the config file with the new prefix whenever the prefix changes. + * + * @return void + */ + public function update_prefix() { + + $valid_prefix = self::get_file_content_prefix(); + $current_prefix = file_get_contents($this->path, false, null, 0, strlen($valid_prefix)); + + if ($current_prefix === $valid_prefix) return; // prefix is valid + + $contents = file_get_contents($this->path); + + $matches = array(); + if (preg_match('/\{.*\}/', $contents, $matches)) { + //update settings + file_put_contents($this->path, $valid_prefix . $matches[0]); + } else { + //reset settings + file_put_contents($this->path, $valid_prefix . json_encode(array())); + } + } + + /** + * Gets the value from the config array + * + * @param string $key + * @return mixed|null + */ + public function get_value($key) { + + $contents = $this->get_contents(); + + if (null === $contents) { + return null; + } + + if (!isset($contents[$key])) { + return null; + } + + return $contents[$key]; + + } + + /** + * Sets a value in our config array + * + * @param string $key + * @param mixed $value + * @return boolean + */ + public function set_value($key, $value) { + + $contents = $this->get_contents(); + + if (null === $contents) { + return false; + } + + $contents[$key] = $value; + + return (false !== file_put_contents($this->path, self::get_file_content_prefix() . json_encode($contents), LOCK_EX)); + } + + /** + * Loads the config array from file + * + * @return string + */ + public function get_contents() { + + clearstatcache(); + if (!file_exists($this->path)) $this->init_file(); + + // __COMPILER_HALT_OFFSET__ doesn't define in a few PHP versions. It's a PHP bug. + // https://bugs.php.net/bug.php?id=70164 + $contents = file_get_contents($this->path, false, null, strlen(self::get_file_content_prefix())); + + if (false === $contents) { + return null; + } + + if (empty($contents)) { + return array(); + } + + return json_decode($contents, true); + } + + /** + * Sets entire firewall config from array. + * + * @param Array $contents + * + * @return Boolean + */ + public function set_contents($contents) { + + if (null === $contents) { + return false; + } + + return (false !== file_put_contents($this->path, self::get_file_content_prefix() . json_encode($contents), LOCK_EX)); + } + + /** + * Returns the path + * + * @return string + */ + public function __toString() { + return $this->path; + } + +} + +// phpcs:enable WordPress.WP.AlternativeFunctions -- WP isn't loaded here. WP API is unavailable diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/libs/wp-security-firewall-constants.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/libs/wp-security-firewall-constants.php new file mode 100755 index 00000000..543780e7 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/libs/wp-security-firewall-constants.php @@ -0,0 +1,213 @@ +constants = array(); + $this->populate_constants(); + } + + /** + * Populates our internal constant array with the defines from wp-config + * + * @return void + */ + protected function populate_constants() { + + $wpconfig = Utility::get_wpconfig_path(); + + clearstatcache(); + if (!file_exists($wpconfig)) return; + + // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents -- WP isn't loaded. WP_Filesystem cannot be used. + $source = file_get_contents($wpconfig); + + if (false === $source) return; + + $tokens = token_get_all($source); + + //Filter out any unwanted tokens + $tokens = array_values(array_filter($tokens, function($token) { + + //All tokens that are not arrays are allowed + if (!is_array($token)) return true; + + $unwanted_tokens = array( + 'T_COMMENT', + 'T_WHITESPACE', + 'T_DOC_COMMENT', + ); + + return (!in_array(token_name($token[self::TOKEN]), $unwanted_tokens)); + })); + + $token_count = count($tokens); + for ($i = 0; $i < $token_count; $i++) { + + $current = $tokens[$i]; + + if (!is_array($current)) continue; + + if ('T_STRING' === token_name($current[self::TOKEN]) && 'define' === strtolower($current[self::CONTENT])) { + + // Name of the define without the surrounding quotes + $name = substr($tokens[$i + self::DEFINE_NAME_OFFSET][self::CONTENT], 1, -1); + + // Grabs the value of the define + $value = $tokens[$i + self::DEFINE_VALUE_OFFSET]; + + if (!is_array($value)) continue; + + // We need to interpret the data type of the define's value + switch (token_name($value[self::TOKEN])) { + case 'T_CONSTANT_ENCAPSED_STRING': + $this->constants[$name] = substr($value[self::CONTENT], 1, -1); + break; + case 'T_LNUMBER': + $this->constants[$name] = intval($value[self::CONTENT]); + break; + case 'T_DNUMBER': + $this->constants[$name] = floatval($value[self::CONTENT]); + break; + case 'T_STRING': + $this->constants[$name] = filter_var($value[self::CONTENT], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); + break; + default: + continue 2; + } + } + } + + } + + /** + * Access the constants as properties + * + * @param string $name + * @return mixed + */ + public function __get($name) { + return $this[$name]; + } + + /** + * Iterate over the constants + * + * @return iterable + */ + #[\ReturnTypeWillChange] + public function getIterator() { + foreach ($this->constants as $name => $value) yield $name => $value; + foreach (get_defined_constants() as $name => $value) yield $name => $value; + } + + /** + * Gives us array access to the constants + * + * @param mixed $offset + * @return mixed + */ + #[\ReturnTypeWillChange] + public function offsetGet($offset) { + if (defined($offset)) { + return constant($offset); + } elseif (isset($this->constants[$offset])) { + return $this->constants[$offset]; + } else { + return null; + } + } + + /** + * Checks if the constant exists + * + * @param mixed $offset + * @return boolean + */ + #[\ReturnTypeWillChange] + public function offsetExists($offset) { + return defined($offset) || isset($this->constants[$offset]); + } + + /** + * Check if constant exists + * + * @param string $name + * @return boolean + */ + public function __isset($name) { + return $this->offsetExists($name); + } + + /** + * Sets the constant. This is disabled as we want it read-only + * + * @param mixed $offset + * @param mixed $value + * @return void + * @throws \Exception - Throws an exception if called to ensure it's read-only. + */ + #[\ReturnTypeWillChange] + public function offsetSet($offset, $value) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- Needed for ArrayAccess interface but not used by us as we require read-only + throw new \Exception('Constants are read-only.'); + } + + /** + * Unsets the constant. This is disabled as we want it read-only + * + * @param mixed $offset + * @return void + * @throws \Exception - Throws an exception if called to ensure it's read-only. + */ + #[\ReturnTypeWillChange] + public function offsetUnset($offset) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- Needed for ArrayAccess interface but not used by us as we require read-only + throw new \Exception('Constants are read-only.'); + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/libs/wp-security-firewall-debug.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/libs/wp-security-firewall-debug.php new file mode 100755 index 00000000..44fc04d7 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/libs/wp-security-firewall-debug.php @@ -0,0 +1,59 @@ +AIOS_FIREWALL_DEBUG && 'rule_triggered' !== $event) return; + + $details = array( + 'name' => $rule->name, + 'family' => $rule->family, + 'ip' => \AIOS_Helper::get_user_ip_address(), + 'time' => time(), + ); + + // Get any user information + foreach ($_COOKIE as $key => $value) { + if (preg_match('/^wordpress_logged_in_/', $key)) { + $details['potential_user'] = stripslashes($value); + break; + } + } + + $details['request'] = $_SERVER; + unset($details['request']['HTTP_COOKIE']); + + // Uncomment when the firewall log issues have been resolved + //$aiowps_firewall_message_store->set($event, $details); + + // Remove when the firewall log issues have been resolved + $aiowps_firewall_message_store->clear_message_store(); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/libs/wp-security-firewall-event.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/libs/wp-security-firewall-event.php new file mode 100755 index 00000000..c308feb3 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/libs/wp-security-firewall-event.php @@ -0,0 +1,51 @@ +messages = array(); + $this->keys_loaded = array(); + $this->table_name = 'aiowps_message_store'; + } + + /** + * Sets internal message store + * + * @param string $key + * @param mixed $value + * @return void + */ + public function set($key, $value) { + + if (!is_string($key)) return; + + if (!isset($this->messages[$key])) { + $this->messages[$key] = array(); + } + + $this->messages[$key][] = $value; + } + + /** + * Gets the messages associated with a key + * + * @param string $key + * @return array + */ + public function get($key) { + + $is_key_loaded = in_array($key, $this->keys_loaded); + $can_check_database = isset($GLOBALS['wpdb']) && !$is_key_loaded && class_exists('Updraft_Semaphore_3_0'); + + //Load requested messages from the database + if ($can_check_database) { + + $lock = new \Updraft_Semaphore_3_0('aios_message_store_lock_'.$key, 60); + $to_delete = array(); + + if ($lock->lock()) { + + try { + global $wpdb; + + $table = $this->get_table(); + + // If we can't get the table to check the DB, still check our internal store for the key + if (empty($table)) return isset($this->messages[$key]) ? $this->messages[$key] : array(); + + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $rows = $wpdb->get_results($wpdb->prepare("SELECT id, message_value FROM `{$table}` WHERE message_key = %s", $key)); + + if (!empty($rows)) { + + foreach ($rows as $row) { + $values = json_decode($row->message_value, true); + + foreach ($values as $value) $this->set($key, $value); + + $to_delete[] = $row->id; + } + + $this->keys_loaded[] = $key; + } + } catch (\Exception $e) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- PCP warning. Necessary for AIOS error reporting system. + error_log("AIOS: Error getting database entries for key '{$key}': {$e->getMessage()}"); + + } catch (\Error $e) { // phpcs:ignore PHPCompatibility.Classes.NewClasses.errorFound -- this won't run on PHP 5.6 so we still want to catch it on other versions + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- PCP warning. Necessary for AIOS error reporting system. + error_log("AIOS: Error getting database entries for key '{$key}': {$e->getMessage()}"); + } finally { + + //Delete IDs of loaded messages + if (!empty($to_delete)) { + $ids = implode(',', $to_delete); + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $wpdb->query("DELETE FROM `{$table}` WHERE id IN ({$ids})"); + } + + $lock->release(); + } + + } + } + + return isset($this->messages[$key]) ? $this->messages[$key] : array(); + } + + /** + * Dumps the message store to the database + * + * @return void + */ + public function dump() { + //No point saving if there are no messages + if (empty($this->messages)) return; + + if (!Utility::attempt_to_access_wpdb()) throw new Exit_Exception('Unable to save the message store to the database: wpdb is inaccessible.'); + + global $wpdb; + + $table = $this->get_table(); + + if (empty($table)) throw new Exit_Exception('Unable to save messages store to the database: unable to get the correct table.'); + + $statement = "INSERT INTO `{$table}` (message_key, message_value, created) VALUES "; + $values = array(); + + foreach ($this->messages as $key => $value) { + $statement .= '(%s, %s, %s),'; + $values[] = $table; + $values[] = $key; + $values[] = json_encode($value); // phpcs:ignore WordPress.WP.AlternativeFunctions.json_encode_json_encode -- This method runs outside the WordPress environment and therefore cannot use WordPress functions. + $values[] = time(); + } + + $statement = rtrim($statement, ','); + + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Prepared above. + $wpdb->query($wpdb->prepare($statement, $values)); + } + + /** + * Returns the table name if it exists + * + * @return string - Table name on success; blank string otherwise + */ + private function get_table() { + global $wpdb; + + if (!$wpdb) return ''; + + $table = $wpdb->get_blog_prefix(0).$this->table_name; + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + if ($table != $wpdb->get_var("SHOW TABLES LIKE '{$table}'")) return ''; + + return $table; + } + + /** + * Clears all the messages from the message store table if it contains data. + * + * @return void + */ + public function clear_message_store() { + global $wpdb; + + $table = $this->get_table(); + + // Check if the table exists and is accessible + if (empty($table)) { + return; + } + + //Check if the table has any rows + // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- PCP warning. Direct query necessary. No caching necessary. + $row_exists = $wpdb->get_var( + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- PCP error. Ignore. + $wpdb->prepare("SELECT EXISTS (SELECT 1 FROM `{$table}` LIMIT 1)") + ); + + // If there are no rows, $row_exists will be 0 + if (!$row_exists) { + return; + } + + // Clear the table (delete all records) + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $wpdb->query($wpdb->prepare("DELETE FROM `{$table}`")); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/libs/wp-security-firewall-singleton-trait.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/libs/wp-security-firewall-singleton-trait.php new file mode 100755 index 00000000..1cf77d83 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/libs/wp-security-firewall-singleton-trait.php @@ -0,0 +1,36 @@ +do_action_forbid(); + $this->do_action_exit(); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/actions/action-forbid-trait.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/actions/action-forbid-trait.php new file mode 100755 index 00000000..f583a3c7 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/actions/action-forbid-trait.php @@ -0,0 +1,17 @@ +permblock_reason = $reason; + } + + /** + * Sets the IP for the perm. block + * + * @param string $ip + * @return void + */ + public function set_perm_block_ip($ip) { + $this->permblock_ip = $ip; + } + + /** + * Permanently ban the IP and exit when the rule condition is satisfied. + * + * @return void + */ + public function do_action() { + + if (!Utility::attempt_to_access_wpdb()) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- PCP warning. Part of AIOS error reporting system. + error_log('AIOS: Unable to access wpdb to ban IP address.'); + $this->do_action_forbid_and_exit(); + } + + global $wpdb; + + $table = $wpdb->prefix.'aiowps_permanent_block'; + + $ip = empty($this->permblock_ip) ? \AIOS_Helper::get_user_ip_address() : $this->permblock_ip; + + $data = array( + 'blocked_ip' => $ip, + 'block_reason' => empty($this->permblock_reason) ? 'firewall_generic' : $this->permblock_reason, + 'blocked_date' => current_time('mysql') + ); + + // Check if the IP already exists + // phpcs:ignore WordPress.DB.PreparedSQL, WordPress.DB.DirectDatabaseQuery -- PCP error. Table name cannot be done via prepare. + $already_exists = $wpdb->get_var($wpdb->prepare("SELECT blocked_ip FROM `{$table}` WHERE blocked_ip = %s", $ip)); + + // If it does exist, no point adding it again so just forbid and exit + if (!is_null($already_exists)) $this->do_action_forbid_and_exit(); + + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Table name cannot be done via prepare. + if (false === $wpdb->query($wpdb->prepare("INSERT INTO " .$table." (blocked_ip, block_reason, blocked_date, created) VALUES (%s, %s, %s, UNIX_TIMESTAMP())", $data['blocked_ip'], $data['block_reason'], $data['blocked_date']))) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- PCP warning. Needed for error reporting. + error_log('AIOS: Unable to insert IP address into table.'); + } + + $this->do_action_forbid_and_exit(); + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/actions/action-redirect-and-exit-trait.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/actions/action-redirect-and-exit-trait.php new file mode 100755 index 00000000..a507e6d8 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/actions/action-redirect-and-exit-trait.php @@ -0,0 +1,23 @@ +do_action_redirect(); + $this->do_action_exit(); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/actions/action-redirect-trait.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/actions/action-redirect-trait.php new file mode 100755 index 00000000..9f3d286d --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/actions/action-redirect-trait.php @@ -0,0 +1,24 @@ +location"); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/6g/rule-block-query-strings-6g.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/6g/rule-block-query-strings-6g.php new file mode 100755 index 00000000..d83d9e03 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/6g/rule-block-query-strings-6g.php @@ -0,0 +1,62 @@ +name = 'Block query strings'; + $this->family = '6G'; + $this->priority = 0; + } + + /** + * Determines whether the rule is active + * + * @return boolean + */ + public function is_active() { + global $aiowps_firewall_config; + return (bool) $aiowps_firewall_config->get_value('aiowps_6g_block_query'); + } + + /** + * The condition to be satisfied for the rule to apply + * + * @return boolean + */ + public function is_satisfied() { + + if (empty($_SERVER['QUERY_STRING'])) return Rule::NOT_SATISFIED; + + //Patterns to match against + $patterns = array( + '/[a-z0-9]{2000,}/i', + '/(eval\()/i', + '/(127\.0\.0\.1)/i', + '/(javascript:)(.*)(;)/i', + '/(base64_encode)(.*)(\()/i', + '/(GLOBALS|REQUEST)(=|\[|%)/i', + '/(<|%3C)(.*)script(.*)(>|%3)/i', + '#(\|\.\.\.|\.\./|~|`|<|>|\|)#i', + '#(boot\.ini|etc/passwd|self/environ)#i', + '/(thumbs?(_editor|open)?|tim(thumb)?)\.php/i', + '/(\'|\")(.*)(drop|insert|md5|select|union)/i', + ); + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Sanitizing will interfere with 6g rules. + return Rule_Utils::contains_pattern(rawurldecode($_SERVER['QUERY_STRING']), $patterns); + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/6g/rule-block-refs-6g.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/6g/rule-block-refs-6g.php new file mode 100755 index 00000000..75ac3be4 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/6g/rule-block-refs-6g.php @@ -0,0 +1,52 @@ +name = 'Block referrer strings'; + $this->family = '6G'; + $this->priority = 0; + } + + /** + * Determines whether the rule is active + * + * @return boolean + */ + public function is_active() { + global $aiowps_firewall_config; + return (bool) $aiowps_firewall_config->get_value('aiowps_6g_block_referrers'); + } + + /** + * The condition to be satisfied for the rule to apply + * + * @return boolean + */ + public function is_satisfied() { + + if (empty($_SERVER['HTTP_REFERER'])) return Rule::NOT_SATISFIED; + + //Patterns to match against + $patterns = array( + '/[a-z0-9]{2000,}/i', + '/(semalt.com|todaperfeita)/i', + ); + + return Rule_Utils::contains_pattern($_SERVER['HTTP_REFERER'], $patterns); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- This is not a WordPress context. Also this only evaluates to a boolean. + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/6g/rule-block-request-strings-6g.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/6g/rule-block-request-strings-6g.php new file mode 100755 index 00000000..83a7ecb2 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/6g/rule-block-request-strings-6g.php @@ -0,0 +1,67 @@ +name = 'Block request strings'; + $this->family = '6G'; + $this->priority = 0; + } + + /** + * Determines whether the rule is active + * + * @return boolean + */ + public function is_active() { + global $aiowps_firewall_config; + return (bool) $aiowps_firewall_config->get_value('aiowps_6g_block_request'); + } + + /** + * The condition to be satisfied for the rule to apply + * + * @return boolean + */ + public function is_satisfied() { + + if (empty($_SERVER['REQUEST_URI'])) return Rule::NOT_SATISFIED; + + // ensure we get the request uri without the query string + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Sanitizing will interfere with 6g rules. + $uri = (string) parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); + + if ('' == $uri) return Rule::NOT_SATISFIED; + + //Patterns to match against + $patterns = array( + '/[a-z0-9]{2000,}/i', + '#(https?|ftp|php):/#i', + '#(base64_encode)(.*)(\()#i', + '#(=\'|=\%27|/\'/?)\.#i', + '#/(\$(\&)?|\*|\"|\.|,|&|&?)/?$#i', + '#(\{0\}|\(/\(|\.\.\.|\+\+\+|\\"\\")#i', + '#(~|`|<|>|:|;|,|%|\|\s|\{|\}|\[|\]|\|)#i', + '#/(=|\$&|_mm|cgi-|etc/passwd|muieblack)#i', + '#(&pws=0|_vti_|\(null\)|\{\$itemURL\}|echo(.*)kae|etc/passwd|eval\(|self/environ)#i', + '#\.(aspx?|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rar|rdf)$#i', + '#/(^$|(wp-)?config|mobiquo|phpinfo|shell|sqlpatch|thumb|thumb_editor|thumbopen|timthumb|webshell)\.php#i', + ); + + return Rule_Utils::contains_pattern(rawurldecode($uri), $patterns); + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/6g/rule-block-user-agents-6g.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/6g/rule-block-user-agents-6g.php new file mode 100755 index 00000000..ca11be23 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/6g/rule-block-user-agents-6g.php @@ -0,0 +1,53 @@ +name = 'Block user-agents'; + $this->family = '6G'; + $this->priority = 0; + } + + /** + * Determines whether the rule is active + * + * @return boolean + */ + public function is_active() { + global $aiowps_firewall_config; + return (bool) $aiowps_firewall_config->get_value('aiowps_6g_block_agents'); + } + + /** + * The condition to be satisfied for the rule to apply + * + * @return boolean + */ + public function is_satisfied() { + + if (empty($_SERVER['HTTP_USER_AGENT'])) return Rule::NOT_SATISFIED; + + //Patterns to match against + $patterns = array( + '/[a-z0-9]{2000,}/i', + '/(archive.org|binlar|casper|checkpriv|choppy|clshttp|cmsworld|diavol|dotbot|extract|feedfinder|flicky|g00g1e|harvest|heritrix|httrack|kmccrew|loader|miner|nikto|nutch|planetwork|postrank|purebot|pycurl|python|seekerspider|siclab|skygrid|sqlmap|sucker|turnit|vikspider|winhttp|xxxyy|youda|zmeu|zune)/i', + ); + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Sanitizing will interfere with 6g rules. + return Rule_Utils::contains_pattern($_SERVER['HTTP_USER_AGENT'], $patterns); + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/6g/rule-request-method-6g.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/6g/rule-request-method-6g.php new file mode 100755 index 00000000..92552efb --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/6g/rule-request-method-6g.php @@ -0,0 +1,53 @@ +name = 'Block request methods'; + $this->family = '6G'; + $this->priority = 0; + + $this->blocked_methods = $aiowps_firewall_config->get_value('aiowps_6g_block_request_methods'); + } + + /** + * Determines whether the rule is active + * + * @return boolean + */ + public function is_active() { + return !empty($this->blocked_methods); + } + + /** + * The condition to be satisfied for the rule to apply + * + * @return boolean + */ + public function is_satisfied() { + return isset($_SERVER['REQUEST_METHOD']) && in_array(strtoupper($_SERVER['REQUEST_METHOD']), $this->blocked_methods); + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/blacklist/rule-ips-blacklist.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/blacklist/rule-ips-blacklist.php new file mode 100755 index 00000000..f2c6d557 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/blacklist/rule-ips-blacklist.php @@ -0,0 +1,65 @@ +name = 'Blocked IPs'; + $this->family = 'Blacklist'; + $this->priority = 0; + $this->blocked_ips = $aiowps_firewall_config->get_value('aiowps_blacklist_ips'); + } + + /** + * Determines whether the rule is active + * + * @global Constants $aiowps_firewall_constants + * + * @return boolean + */ + public function is_active() { + global $aiowps_firewall_constants; + if ($aiowps_firewall_constants->AIOS_DISABLE_BLACKLIST_IP_MANAGER) { + return false; + } else { + return !empty($this->blocked_ips); + } + } + + /** + * The condition to be satisfied for the rule to apply + * + * @return boolean + */ + public function is_satisfied() { + + $user_ip_blocked = \AIOS_Helper::is_user_ip_address_within_list($this->blocked_ips); + + if (true == $user_ip_blocked) return Rule::SATISFIED; + + return Rule::NOT_SATISFIED; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/blacklist/rule-user-agent-blacklist.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/blacklist/rule-user-agent-blacklist.php new file mode 100755 index 00000000..b9c44d80 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/blacklist/rule-user-agent-blacklist.php @@ -0,0 +1,57 @@ +name = 'Blocked user agents'; + $this->family = 'Blacklist'; + $this->priority = 0; + $this->blocked_user_agents = $aiowps_firewall_config->get_value('aiowps_blacklist_user_agents'); + } + + /** + * Determines whether the rule is active + * + * @return boolean + */ + public function is_active() { + return !empty($this->blocked_user_agents) && isset($_SERVER['HTTP_USER_AGENT']); + } + + /** + * The condition to be satisfied for the rule to apply + * + * @return boolean + */ + public function is_satisfied() { + foreach ($this->blocked_user_agents as $block_user_agent) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Sanitizing will interfere with 6g rules. + if (isset($_SERVER['HTTP_USER_AGENT']) && !empty($block_user_agent) && false !== stripos($_SERVER['HTTP_USER_AGENT'], $block_user_agent)) { + return Rule::SATISFIED; + } + } + return Rule::NOT_SATISFIED; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/bots/rule-ban-post-blank-headers.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/bots/rule-ban-post-blank-headers.php new file mode 100755 index 00000000..5f046c9a --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/bots/rule-ban-post-blank-headers.php @@ -0,0 +1,44 @@ +name = 'Ban POST requests with blank user-agent and referer'; + $this->family = 'Bots'; + $this->priority = 10; + } + + /** + * Determines whether the rule is active + * + * @return boolean + */ + public function is_active() { + global $aiowps_firewall_config; + return (bool) $aiowps_firewall_config->get_value('aiowps_ban_post_blank_headers'); + } + + /** + * The condition to be satisfied for the rule to apply + * + * @return boolean + */ + public function is_satisfied() { + $this->set_perm_block_reason('firewall_post_blank_user_agent_and_referer'); + return isset($_SERVER['REQUEST_METHOD']) && (0 === strcasecmp($_SERVER['REQUEST_METHOD'], "POST")) && empty($_SERVER['HTTP_USER_AGENT']) && empty($_SERVER['HTTP_REFERER']); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- This is not a WordPress context. Also this only evaluates to a boolean. + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/bots/rule-block-fake-googlebots.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/bots/rule-block-fake-googlebots.php new file mode 100755 index 00000000..a75a252c --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/bots/rule-block-fake-googlebots.php @@ -0,0 +1,101 @@ +name = 'Block fake Googlebots'; + $this->family = 'Bots'; + $this->priority = 0; + } + + /** + * Determines whether the rule is active. + * + * @global Config $aiowps_firewall_config + * + * @return boolean + */ + public function is_active() { + global $aiowps_firewall_config; + return (bool) $aiowps_firewall_config->get_value('aiowps_block_fake_googlebots'); + } + + /** + * The condition to be satisfied for the rule to apply. + * + * @global Config $aiowps_firewall_config + * + * @return boolean + */ + public function is_satisfied() { + global $aiowps_firewall_config; + + $user_agent = (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''); + + if (preg_match('/Googlebot/i', $user_agent, $matches)) { + // If the user agent says it's a Googlebot, start doing checks. + + $ip = \AIOS_Helper::get_user_ip_address(); + + if (empty($ip)) { + return Rule::NOT_SATISFIED; + } + + try { + $name = gethostbyaddr($ip); // Let's get the hostname using the IP address. + + if ($name == $ip || false === $name) { + // gethostbyaddr failed. + $googlebot_ips = $aiowps_firewall_config->get_value('aiowps_googlebot_ip_ranges'); + if (\AIOS_Helper::is_user_ip_address_within_list($googlebot_ips)) { + return Rule::NOT_SATISFIED; + } else { + return Rule::SATISFIED; + } + } + + $host_ip = gethostbyname($name); // Reverse lookup - let's get the IP address using the hostname. + } catch (\Exception $e) { + // gethostbyaddr or gethostbyname not available on site. + $googlebot_ips = $aiowps_firewall_config->get_value('aiowps_googlebot_ip_ranges'); + if (\AIOS_Helper::is_user_ip_address_within_list($googlebot_ips)) { + return Rule::NOT_SATISFIED; + } else { + return Rule::SATISFIED; + } + } catch (\Error $e) { // phpcs:ignore PHPCompatibility.Classes.NewClasses.errorFound -- this won't run on PHP 5.6 so we still want to catch it on other versions + // gethostbyaddr or gethostbyname not available on site. + $googlebot_ips = $aiowps_firewall_config->get_value('aiowps_googlebot_ip_ranges'); + if (\AIOS_Helper::is_user_ip_address_within_list($googlebot_ips)) { + return Rule::NOT_SATISFIED; + } else { + return Rule::SATISFIED; + } + } + + if (preg_match('/^(?:.+\.)?googlebot\.com$/i', $name) || preg_match('/^(?:.+\.)?google\.com$/i', $name) || preg_match('/^(?:.+\.)?googleusercontent\.com$/i', $name)) { + if ($host_ip == $ip) { + return Rule::NOT_SATISFIED; + } else { + return Rule::SATISFIED; + } + } else { + return Rule::SATISFIED; + } + } + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/bruteforce/rule-cookie-prevent-bruteforce.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/bruteforce/rule-cookie-prevent-bruteforce.php new file mode 100755 index 00000000..13ea0c4c --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/bruteforce/rule-cookie-prevent-bruteforce.php @@ -0,0 +1,98 @@ +name = 'Cookie based prevent bruteforce'; + $this->family = 'Bruteforce'; + $this->priority = 0; + } + + /** + * Determines whether the rule is active + * + * @return boolean + */ + public function is_active() { + global $aiowps_firewall_config, $aiowps_firewall_constants; + if ($aiowps_firewall_constants->AIOS_DISABLE_COOKIE_BRUTE_FORCE_PREVENTION) { + return false; + } else { + return (bool) $aiowps_firewall_config->get_value('aios_enable_brute_force_attack_prevention'); + } + } + + /** + * The condition to be satisfied for the rule to apply + * + * @return boolean + */ + public function is_satisfied() { + global $aiowps_firewall_config; + /** + * This rule is not applied at AIOS plugin activation time. + */ + $is_plugins_page = isset($_SERVER['SCRIPT_FILENAME']) && 1 === preg_match('#/wp-admin/(network/)?plugins\.php$#i', $_SERVER['SCRIPT_FILENAME']); + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. A nonce is not available at this point. + $is_activation_action = isset($_GET['action']) && 'activate' === $_GET['action']; + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. A nonce is not available at this point. + $is_target_plugin = isset($_GET['plugin']) && 'all-in-one-wp-security-and-firewall/wp-security.php' === $_GET['plugin']; + + + if ($is_plugins_page && $is_activation_action && $is_target_plugin) { + return Rule::NOT_SATISFIED; + } + + $brute_force_secret_word = $aiowps_firewall_config->get_value('aios_brute_force_secret_word'); + $brute_force_secret_cookie_name = $aiowps_firewall_config->get_value('aios_brute_force_secret_cookie_name'); + $login_page_slug = $aiowps_firewall_config->get_value('aios_login_page_slug'); + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. A nonce is not available at this point. + if (!isset($_GET[$brute_force_secret_word])) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Sanitizing is not required, as we validate the raw input. + $brute_force_secret_cookie_val = isset($_COOKIE[$brute_force_secret_cookie_name]) ? $_COOKIE[$brute_force_secret_cookie_name] : ''; + $pw_protected_exception = $aiowps_firewall_config->get_value('aios_brute_force_attack_prevention_pw_protected_exception'); + $prevent_ajax_exception = $aiowps_firewall_config->get_value('aios_brute_force_attack_prevention_ajax_exception'); + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Sanitizing is not required, as we validate the raw input. + if (!empty($_SERVER['REQUEST_URI']) && !hash_equals($brute_force_secret_cookie_val, \AIOS_Helper::get_hash($brute_force_secret_word))) { + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Sanitizing is not required, as we validate the raw input. + $request_uri = (string) parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); + + // admin section or login page or login custom slug called + $is_admin_or_login = (false != strpos($request_uri, 'wp-admin') || false != strpos($request_uri, 'wp-login') || ('' != $login_page_slug && false != strpos($request_uri, $login_page_slug))) ? 1 : 0; + + // admin side ajax called + $is_admin_ajax_request = ('1' == $prevent_ajax_exception && isset($_SERVER['SCRIPT_NAME']) && ('admin-ajax.php' === basename($_SERVER['SCRIPT_NAME']))) ? 1 : 0; + + // password protected page called + $is_password_protected_access = ('1' == $pw_protected_exception && isset($_GET['action']) && 'postpass' == $_GET['action']) ? 1 : 0; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. A nonce is not available at this point. + + // logout, set password, reset password action called + $is_logout_resetpassword_action = (isset($_GET['action']) && ('logout' == $_GET['action'] || 'rp' == $_GET['action'] || 'resetpass' == $_GET['action'])) ? 1 : 0; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. A nonce is not available at this point. + + // cookie based brute force on and accessing admin without ajax and password protected then redirect + if ($is_admin_or_login && !$is_admin_ajax_request && !$is_password_protected_access && !$is_logout_resetpassword_action) { + $redirect_url = $aiowps_firewall_config->get_value('aios_cookie_based_brute_force_redirect_url'); + $this->location = $redirect_url; + return Rule::SATISFIED; + } + } + } + return Rule::NOT_SATISFIED; + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/general/rule-advanced-character-filter.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/general/rule-advanced-character-filter.php new file mode 100755 index 00000000..61e6f022 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/general/rule-advanced-character-filter.php @@ -0,0 +1,156 @@ +name = 'Advanced character filter'; + $this->family = 'General'; + $this->priority = 10; + } + + /** + * Determines whether the rule is active + * + * @return boolean + */ + public function is_active() { + global $aiowps_firewall_config; + return (bool) $aiowps_firewall_config->get_value('aiowps_advanced_char_string_filter'); + } + + /** + * The condition to be satisfied for the rule to apply + * + * @return boolean + */ + public function is_satisfied() { + + if (empty($_SERVER['REQUEST_URI'])) return Rule::NOT_SATISFIED; + + // ensure we get the request uri without the query string + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Sanitizing will interfere with 6g rules. + $uri = (string) parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); + + return Rule_Utils::contains_pattern($uri, array_merge($this->get_general_characters(), $this->get_common_patterns(), $this->get_specific_exploits())); + } + + /** + * Get the list of 'specific exploits' patterns + * + * @return array + */ + private function get_specific_exploits() { + return array( + '/errors\./i', + '/config\./i', + '/include\./i', + '/display\./i', + '/register\./i', + '/password\./i', + '/maincore\./i', + '/authorize\./i', + '/macromates\./i', + '/head\_auth\./i', + '/submit\_links\./i', + '/change\_action\./i', + '/com\_facileforms\//i', + '/admin\_db\_utilities\./i', + '/admin\.webring\.docs\./i', + '/Table\/Latest\/index\./i', + ); + } + + /** + * Get the list of common patterns + * + * @return array + */ + private function get_common_patterns() { + return array( + '/\_vpi/i', + '/\.inc/i', + '/xAou6/i', + '/db\_name/i', + '/select\(/i', + '/convert\(/i', + '/\/query\//i', + '/ImpEvData/i', + '/\.XMLHTTP/i', + '/proxydeny/i', + '/function\./i', + '/remoteFile/i', + '/servername/i', + '/\&rptmode\=/i', + '/sys\_cpanel/i', + '/db\_connect/i', + '/doeditconfig/i', + '/check\_proxy/i', + '/system\_user/i', + '/\/\(null\)\//i', + '/clientrequest/i', + '/option\_value/i', + '/ref\.outcontrol/i', + ); + } + + /** + * Get the list of general characters + * + * @return array + */ + private function get_general_characters() { + return array( + '/\,/i', + '/\:/i', + '/\;/i', + '/\=/i', + '/\[/i', + '/\]/i', + '/\^/i', + '/\`/i', + '/\{/i', + '/\}/i', + '/\~/i', + '/\"/i', + '/\$/i', + '/\/i', + '/\|/i', + '/\.\./i', + '/\%0/i', + '/\%A/i', + '/\%B/i', + '/\%C/i', + '/\%D/i', + '/\%E/i', + '/\%F/i', + '/\%22/i', + '/\%27/i', + '/\%28/i', + '/\%29/i', + '/\%3C/i', + '/\%3E/i', + '/\%3F/i', + '/\%5B/i', + '/\%5C/i', + '/\%5D/i', + '/\%7B/i', + '/\%7C/i', + '/\%7D/i', + ); + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/general/rule-bad-query-strings.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/general/rule-bad-query-strings.php new file mode 100755 index 00000000..558102e4 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/general/rule-bad-query-strings.php @@ -0,0 +1,56 @@ +name = 'Bad query strings'; + $this->family = 'General'; + $this->priority = 10; + } + + /** + * Determines whether the rule is active + * + * @return boolean + */ + public function is_active() { + global $aiowps_firewall_config; + return (bool) $aiowps_firewall_config->get_value('aiowps_deny_bad_query_strings'); + } + + /** + * The condition to be satisfied for the rule to apply + * + * @return boolean + */ + public function is_satisfied() { + + if (empty($_SERVER['QUERY_STRING'])) return Rule::NOT_SATISFIED; + + $patterns = array( + '/ftp:/i', + '/http:/i', + '/https:/i', + '/mosConfig/i', + '/^.*(globals|encode|loopback).*/i', + "/(\;|'|\"|%22).*(request|insert|union|declare|drop)/i", + ); + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Sanitizing will interfere with 6g rules. + return Rule_Utils::contains_pattern($_SERVER['QUERY_STRING'], $patterns); + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/general/rule-block-xmlrpc.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/general/rule-block-xmlrpc.php new file mode 100755 index 00000000..3dfa24d2 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/general/rule-block-xmlrpc.php @@ -0,0 +1,44 @@ +name = 'Completely block XMLRPC'; + $this->family = 'General'; + $this->priority = 10; + } + + /** + * Determines whether the rule is active + * + * @return boolean + */ + public function is_active() { + global $aiowps_firewall_config; + return (bool) $aiowps_firewall_config->get_value('aiowps_enable_pingback_firewall'); + } + + /** + * The condition to be satisfied for the rule to apply + * + * @return boolean + */ + public function is_satisfied() { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Sanitizing will interfere with 6g rules. + return (isset($_SERVER['SCRIPT_FILENAME']) && 1 === preg_match('/\/xmlrpc\.php$/i', $_SERVER['SCRIPT_FILENAME'])); + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/general/rule-proxy-comment-posting.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/general/rule-proxy-comment-posting.php new file mode 100755 index 00000000..aa61bd31 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/rules/general/rule-proxy-comment-posting.php @@ -0,0 +1,69 @@ +name = 'Proxy comment posting'; + $this->family = 'General'; + $this->priority = 10; + } + + /** + * Determines whether the rule is active + * + * @return boolean + */ + public function is_active() { + global $aiowps_firewall_config; + return (bool) $aiowps_firewall_config->get_value('aiowps_forbid_proxy_comments'); + } + + /** + * The condition to be satisfied for the rule to apply + * + * @return boolean + */ + public function is_satisfied() { + + //Preconditions for the rule + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Sanitizing will interfere with 6g rules. + $is_comment_form = (isset($_SERVER['SCRIPT_FILENAME']) && 1 === preg_match('/\/wp-comments-post\.php$/i', $_SERVER['SCRIPT_FILENAME'])); + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Sanitizing will interfere with 6g rules. + $is_post = (isset($_SERVER['REQUEST_METHOD']) && 0 === strcasecmp($_SERVER['REQUEST_METHOD'], "POST")); + + if (!$is_post || !$is_comment_form) return Rule::NOT_SATISFIED; + + //Headers that are present if a proxy is being used + $headers = array( + 'HTTP_VIA', + 'HTTP_FORWARDED', + 'HTTP_USERAGENT_VIA', + 'HTTP_X_FORWARDED_FOR', + 'HTTP_X_FORWARDED_HOST', + 'HTTP_PROXY_CONNECTION', + 'HTTP_XPROXY_CONNECTION', + 'HTTP_PC_REMOTE_ADDR', + 'HTTP_CLIENT_IP', + ); + + foreach ($headers as $header) { + if (!empty($_SERVER[$header])) return Rule::SATISFIED; + } + + return Rule::NOT_SATISFIED; + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/wp-security-firewall-rule-builder.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/wp-security-firewall-rule-builder.php new file mode 100755 index 00000000..f9791d31 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/wp-security-firewall-rule-builder.php @@ -0,0 +1,46 @@ +is_active()) { + Event::raise('rule_not_active', $rule, $classname); + continue; + } + + Event::raise('rule_active', $rule, $classname); + yield $rule; + } + } + + /** + * Generates the classname for each rule + * + * @return iterable + */ + private static function get_rule_classname() { + $rec_iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator(AIOWPS_FIREWALL_DIR.'/rule/rules/', \FilesystemIterator::SKIP_DOTS)); + + foreach ($rec_iterator as $dir_iterator) { + $matches = array(); + if (preg_match('/^rule-(?.*)\.php$/', $dir_iterator->getFilename(), $matches)) { + yield "AIOWPS\Firewall\Rule_".ucwords(str_replace('-', '_', $matches['rule_name']), '_'); + } + } + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/wp-security-firewall-rule-utils.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/wp-security-firewall-rule-utils.php new file mode 100755 index 00000000..9eb3df9b --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/rule/wp-security-firewall-rule-utils.php @@ -0,0 +1,31 @@ +is_satisfied()) { + + Event::raise('rule_triggered', $this, time()); + $this->do_action(); + + } + + Event::raise('rule_not_triggered', $this, time()); + } + + /** + * Show the rule's name + * + * @return string + */ + public function __toString() { + return $this->name; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/wp-security-firewall-context.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/wp-security-firewall-context.php new file mode 100755 index 00000000..3869aa7f --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/wp-security-firewall-context.php @@ -0,0 +1,104 @@ + $file) { + if (preg_match('/aios-bootstrap\.php$/', $file)) { + return $index; + } + } + return -1; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/wp-security-firewall-loader.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/wp-security-firewall-loader.php new file mode 100755 index 00000000..2fcfe272 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/wp-security-firewall-loader.php @@ -0,0 +1,214 @@ +is_preloader_directly_accessed()) return; + + $this->init(); + + global $aiowps_firewall_constants; + if ($aiowps_firewall_constants->AIOS_NO_FIREWALL) return; + + //Allow list for bypassing PHP rules + if (Allow_List::is_ip_allowed()) return; + + $families = new Family_Collection(Family_Builder::get_families()); + + foreach (Rule_Builder::get_active_rule() as $rule) { + $families->add_rule_to_member($rule); + } + + foreach ($families->get_family() as $member) { + $member->apply_all(); + } + + } catch (Exit_Exception $e) { + $this->log_message($e->getMessage()); + exit(); + } catch (\Exception $e) { + $this->log_message($e->getMessage()); + } catch (\Error $e) { // phpcs:ignore PHPCompatibility.Classes.NewClasses.errorFound -- this won't run on PHP 5.6 so we still want to catch it on other versions + $this->log_message($e->getMessage()); + } + } + + /** + * Performs general initialisation + * + * @return void + */ + public function init() { + + $this->init_includes(); + $this->init_services(); + + new Debug(); + } + + /** + * Detects whether the preloader file (wp-security-firewall.php) was directly accessed + * + * @return boolean + */ + public function is_preloader_directly_accessed() { + return (1 === preg_match('/wp-security-firewall\.php$/', get_included_files()[0])); + } + + /** + * Log our error messages + * + * @param string $message + * @return void + */ + private function log_message($message) { + if (function_exists('do_action')) { + do_action('aios_firewall_loader_log_error', $message, $this); + } + + error_log('AIOS firewall error: ' . $message); + } + + /** + * Initialises our services + * + * @return void + */ + private function init_services() { + + $workspace = $this->get_firewall_workspace(); + + if (empty($workspace)) { + throw new \Exception('unable to locate workspace.'); + } + + $GLOBALS['aiowps_firewall_config'] = new Config($workspace . 'settings.php'); + $GLOBALS['aiowps_firewall_message_store'] = Message_Store::instance(); + $GLOBALS['aiowps_firewall_constants'] = new Constants(); + Allow_List::set_path($workspace.'allowlist.php'); + } + + /** + * Get our workspace directory, i.e., where we save and load data to and from. + * + * @return string + */ + private function get_firewall_workspace() { + global $aiowps_firewall_rules_path; + + $workspace = ''; + + if (!empty($aiowps_firewall_rules_path)) { + $workspace = $aiowps_firewall_rules_path; + } elseif (Context::wordpress_safe()) { + $workspace = \AIOWPSecurity_Utility_Firewall::get_firewall_rules_path(); + } + + return $workspace; + } + + /** + * Registers the autoloader + * + * @return void + */ + private function init_includes() { + + spl_autoload_register(function($class) { + if (0 === strpos($class, "AIOWPS\\Firewall\\")) { //only autoload the firewall's files + + $relative_classname = substr($class, strlen("AIOWPS\\Firewall\\"), strlen($class)-1); + + $classname = str_replace('_', '-', strtolower($relative_classname)); + + $file = "wp-security-firewall-{$classname}.php"; + $rule = "{$classname}.php"; + + $paths = array( + AIOWPS_FIREWALL_DIR."/{$file}", + AIOWPS_FIREWALL_DIR."/family/{$file}", + AIOWPS_FIREWALL_DIR."/rule/{$file}", + AIOWPS_FIREWALL_DIR."/rule/actions/{$classname}.php", + AIOWPS_FIREWALL_DIR."/rule/rules/{$rule}", + AIOWPS_FIREWALL_DIR."/rule/rules/6g/{$rule}", + AIOWPS_FIREWALL_DIR."/rule/rules/bruteforce/{$rule}", + AIOWPS_FIREWALL_DIR."/rule/rules/blacklist/{$rule}", + AIOWPS_FIREWALL_DIR."/rule/rules/general/{$rule}", + AIOWPS_FIREWALL_DIR."/rule/rules/bots/{$rule}", + AIOWPS_FIREWALL_DIR."/libs/{$file}", + AIOWPS_FIREWALL_DIR."/libs/traits/{$classname}.php", + ); + + clearstatcache(); + foreach ($paths as $path) { + if (file_exists($path)) { + include_once($path); + break; + } + } + } + }); + + // Manually include needed files + $classes_dir = dirname(AIOWPS_FIREWALL_DIR); + + $manual_files = array( + $classes_dir.'/wp-security-firewall-resource-unavailable.php', + $classes_dir.'/wp-security-firewall-resource.php', + $classes_dir.'/wp-security-helper.php', + ); + + foreach ($manual_files as $file) { + clearstatcache(); + if (file_exists($file)) include_once $file; + } + + if (Context::wordpress_safe()) { + include_once("{$classes_dir}/wp-security-utility-file.php"); + } + } + + /** + * Gets or creates an instance of this object + * + * @return Loader + */ + public static function get_instance() { + + if (null === self::$instance) { + return new self(); + } + + return self::$instance; + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/wp-security-firewall-utility.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/wp-security-firewall-utility.php new file mode 100755 index 00000000..eb1a2bba --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/firewall/wp-security-firewall-utility.php @@ -0,0 +1,218 @@ +load_firewall(); + define('AIOWPSEC_FIREWALL_DONE', true); +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/grade-system/wp-security-feature-item-manager.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/grade-system/wp-security-feature-item-manager.php new file mode 100755 index 00000000..ac51ee19 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/grade-system/wp-security-feature-item-manager.php @@ -0,0 +1,800 @@ +setup_feature_list(); + $this->initialize_features(); + } + + /** + * This function sets up the feature list + * + * @return void + */ + private function setup_feature_list() { + $feature_list = array( + // Settings menu features + 'wp-generator-meta-tag' => array( + 'name' => __('Remove WP generator meta tag', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_1, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_remove_wp_generator_meta_info' + ) + ), + // User Accounts menu features + 'user-accounts-change-admin-user' => array( + 'name' => __('Change admin username', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_3, + 'level' => $this->sec_level_basic, + 'options' => array( + '' + ), + 'callback' => array($this, 'check_user_accounts_change_admin_user_feature') + ), + 'user-accounts-display-name' => array( + 'name' => __('Change display name', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_1, + 'level' => $this->sec_level_basic, + 'options' => array( + '' + ), + 'callback' => array($this, 'check_user_accounts_display_name_feature') + ), + // User Login menu features + 'user-login-login-lockdown' => array( + 'name' => __('Login lockout', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_4, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_login_lockdown' + ) + ), + 'user-login-force-logout' => array( + 'name' => __('Force logout', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_1, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_forced_logout' + ) + ), + 'hibp' => array( + 'name' => __('HIBP', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_inter, + 'options' => array( + 'aiowps_hibp_user_profile_update', + 'aiowps_http_password_reset', + ) + ), + 'disable-application-password' => array( + 'name' => __('Disable application password', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_inter, + 'options' => array( + 'aiowps_disable_application_password' + ) + ), + 'user-login-lockout-ip-whitelisting' => array( + 'name' => __('Login Lockout IP whitelisting', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_3, + 'level' => $this->sec_level_inter, + 'options' => array( + 'aiowps_lockdown_enable_whitelisting' + ) + ), + // User Registration menu features + 'manually-approve-registrations' => array( + 'name' => __('Registration approval', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_4, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_manual_registration_approval' + ) + ), + 'user-registration-captcha' => array( + 'name' => __('Registration CAPTCHA', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_4, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_registration_page_captcha' + ) + ), + 'registration-honeypot' => array( + 'name' => __('Enable registration honeypot', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_inter, + 'options' => array( + 'aiowps_enable_registration_honeypot' + ) + ), + 'http-authentication-admin-frontend' => array( + 'name' => __('HTTP authentication for admin and frontend', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_http_authentication_admin', + 'aiowps_http_authentication_frontend', + ) + ), + // Database Security menu features + 'db-security-db-prefix' => array( + 'name' => __('Database prefix', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_inter, + 'options' => array( + '' + ), + 'callback' => array($this, 'check_db_security_db_prefix_feature') + ), + // Filesystem Security menu features + 'filesystem-file-permissions' => array( + 'name' => __('File permissions', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_4, + 'level' => $this->sec_level_basic, + 'options' => array( + '' + ), + 'callback' => array($this, 'check_filesystem_permissions_feature') + ), + 'filesystem-file-editing' => array( + 'name' => __('File editing', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_disable_file_editing' + ) + ), + 'auto-delete-wp-files' => array( + 'name' => __('WordPress files access', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_auto_delete_default_wp_files' + ) + ), + // Blacklist Manager menu features + 'blacklist-manager-ip-user-agent-blacklisting' => array( + 'name' => __('IP and user agent blacklisting', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_3, + 'level' => $this->sec_level_advanced, + 'options' => array( + 'aiowps_enable_blacklisting' + ) + ), + // Firewall menu features + 'firewall-basic-rules' => array( + 'name' => __('Enable basic firewall', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_3, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_basic_firewall' + ), + 'feature_condition_callback' => array('AIOWPSecurity_Utility', 'allow_to_write_to_htaccess') + ), + 'firewall-pingback-rules' => array( + 'name' => __('Enable pingback vulnerability protection', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_3, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_pingback_firewall' + ) + ), + 'firewall-block-debug-file-access' => array( + 'name' => __('Block access to debug log file', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_inter, + 'options' => array( + 'aiowps_block_debug_log_file_access' + ), + 'feature_condition_callback' => array('AIOWPSecurity_Utility', 'allow_to_write_to_htaccess') + ), + 'firewall-disable-index-views' => array( + 'name' => __('Disable index views', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_1, + 'level' => $this->sec_level_inter, + 'options' => array( + 'aiowps_disable_index_views' + ), + 'feature_condition_callback' => array('AIOWPSecurity_Utility', 'allow_to_write_to_htaccess') + ), + 'firewall-disable-trace-track' => array( + 'name' => __('Disable trace and track', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_advanced, + 'options' => array( + 'aiowps_disable_trace_and_track' + ), + 'feature_condition_callback' => array('AIOWPSecurity_Utility', 'allow_to_write_to_htaccess') + ), + 'firewall-forbid-proxy-comments' => array( + 'name' => __('Forbid proxy comments', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_advanced, + 'options' => array( + 'aiowps_forbid_proxy_comments' + ) + ), + 'firewall-deny-bad-queries' => array( + 'name' => __('Deny bad queries', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_3, + 'level' => $this->sec_level_advanced, + 'options' => array( + 'aiowps_deny_bad_query_strings' + ) + ), + 'firewall-advanced-character-string-filter' => array( + 'name' => __('Advanced character string filter', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_3, + 'level' => $this->sec_level_advanced, + 'options' => array( + 'aiowps_advanced_char_string_filter' + ) + ), + 'firewall-enable-6g' => array( + 'name' => __('6G firewall', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_4, + 'level' => $this->sec_level_advanced, + 'options' => array( + 'aiowps_enable_6g_firewall', + ) + ), + 'firewall-block-fake-googlebots' => array( + 'name' => __('Block fake Googlebots', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_1, + 'level' => $this->sec_level_advanced, + 'options' => array( + 'aiowps_block_fake_googlebots' + ) + ), + 'prevent-hotlinking' => array( + 'name' => __('Prevent image hotlinking', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_prevent_hotlinking' + ) + ), + 'firewall-enable-404-blocking' => array( + 'name' => __('Enable IP blocking for 404 detection', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_1, + 'level' => $this->sec_level_inter, + 'options' => array( + 'aiowps_enable_404_IP_lockout' + ) + ), + 'firewall-disable-rss-and-atom' => array( + 'name' => __('Disable RSS and ATOM feeds', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_disable_rss_and_atom_feeds' + ) + ), + 'upgrade-unsafe-http-calls' => array( + 'name' => __('Upgrade unsafe HTTP calls', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_inter, + 'options' => array( + 'aiowps_upgrade_unsafe_http_calls' + ) + ), + // Brute Force menu features + 'bf-rename-login-page' => array( + 'name' => __('Enable rename login page', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_inter, + 'options' => array( + 'aiowps_enable_rename_login_page' + ) + ), + 'firewall-enable-brute-force-attack-prevention' => array( + 'name' => __('Enable brute force attack prevention', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_4, + 'level' => $this->sec_level_advanced, + 'options' => array( + 'aiowps_enable_brute_force_attack_prevention' + ) + ), + 'user-login-captcha' => array( + 'name' => __('Login CAPTCHA', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_4, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_login_captcha' + ) + ), + 'lost-password-captcha' => array( + 'name' => __('Lost password CAPTCHA', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_lost_password_captcha' + ) + ), + 'custom-login-captcha' => array( + 'name' => __('Custom login CAPTCHA', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_4, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_custom_login_captcha' + ) + ), + 'password_protected-captcha' => array( + 'name' => __('Password-protected CAPTCHA', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_1, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_password_protected_captcha' + ) + ), + 'whitelist-manager-ip-login-whitelisting' => array( + 'name' => __('Login IP whitelisting', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_3, + 'level' => $this->sec_level_inter, + 'options' => array( + 'aiowps_enable_whitelisting' + ) + ), + 'login-honeypot' => array( + 'name' => __('Enable login honeypot', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_inter, + 'options' => array( + 'aiowps_enable_login_honeypot' + ) + ), + // Spam Prevention menu features + 'comment-form-captcha' => array( + 'name' => __('Comment CAPTCHA', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_4, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_comment_captcha' + ) + ), + 'detect-spambots' => array( + 'name' => __('Detect spambots', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_spambot_detecting' + ) + ), + 'auto-block-spam-ips' => array( + 'name' => __('Auto block spam ips', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_autoblock_spam_ip' + ) + ), + // Scanner menu features + 'scan-file-change-detection' => array( + 'name' => __('File change detection', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_4, + 'level' => $this->sec_level_inter, + 'options' => array( + 'aiowps_enable_automated_fcd_scan' + ) + ), + // Miscellaneous menu features + 'enable-copy-protection' => array( + 'name' => __('Enable Copy Protection', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_1, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_copy_protection' + ) + ), + 'enable-frame-protection' => array( + 'name' => __('Enable iFrame protection', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_1, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_prevent_site_display_inside_frame' + ) + ), + 'disable-users-enumeration' => array( + 'name' => __('Disable users enumeration', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_1, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_prevent_users_enumeration' + ) + ), + 'disallow-unauthorised-requests' => array( + 'name' => __('Disallow unauthorized REST requests', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_1, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_disallow_unauthorized_rest_requests' + ) + ), + 'enable-salt-postfix' => array( + 'name' => __('Enable salt postfix', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_3, + 'level' => $this->sec_level_advanced, + 'options' => array( + 'aiowps_enable_salt_postfix' + ) + ), + // conditional features + 'bp-register-captcha' => array( + 'name' => __('BuddyPress registration CAPTCHA', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_1, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_bp_register_captcha' + ), + 'feature_condition_callback' => array('AIOWPSecurity_Utility', 'is_buddypress_plugin_active'), + ), + 'bbp-new-topic-captcha' => array( + 'name' => __('bbPress new topic CAPTCHA', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_1, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_bbp_new_topic_captcha' + ), + 'feature_condition_callback' => array('AIOWPSecurity_Utility', 'is_bbpress_plugin_active'), + ), + 'woo-login-captcha' => array( + 'name' => __('Woo login CAPTCHA', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_woo_login_captcha' + ), + 'feature_condition_callback' => array('AIOWPSecurity_Utility', 'is_woocommerce_plugin_active'), + ), + 'woo-lostpassword-captcha' => array( + 'name' => __('Woo lost password CAPTCHA', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_woo_lostpassword_captcha' + ), + 'feature_condition_callback' => array('AIOWPSecurity_Utility', 'is_woocommerce_plugin_active'), + ), + 'woo-register-captcha' => array( + 'name' => __('Woo register CAPTCHA', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_woo_register_captcha' + ), + 'feature_condition_callback' => array('AIOWPSecurity_Utility', 'is_woocommerce_plugin_active'), + ), + 'woo-checkout-captcha' => array( + 'name' => __('Woo Checkout CAPTCHA', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_woo_checkout_captcha' + ), + 'feature_condition_callback' => array('AIOWPSecurity_Utility', 'is_woocommerce_plugin_active'), + ), + // Ban POST requests with blank user-agent and referer + 'firewall-ban-post-blank-headers' => array( + 'name' => __('Ban POST requests that have blank user-agent and referer headers', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_2, + 'level' => $this->sec_level_inter, + 'options' => array( + 'aiowps_ban_post_blank_headers' + ) + ), + 'contact-form-7-captcha' => array( + /* translators: %s: Plugin name */ + 'name' => sprintf(__('%s CAPTCHA', 'all-in-one-wp-security-and-firewall'), 'Contact Form 7'), + 'points' => $this->feature_point_1, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enable_contact_form_7_captcha' + ), + 'feature_condition_callback' => array('AIOWPSecurity_Utility', 'is_contact_form_7_plugin_active'), + ), + 'enforce-strong-password' => array( + 'name' => __('Enforce use of strong passwords by users', 'all-in-one-wp-security-and-firewall'), + 'points' => $this->feature_point_1, + 'level' => $this->sec_level_basic, + 'options' => array( + 'aiowps_enforce_strong_password' + ), + ) + ); + + $feature_list = apply_filters('aiowpsecurity_feature_list', $feature_list); + $this->feature_list = array_filter($feature_list, array($this, 'should_add_item')); + } + + /** + * This function will create a feature item object for each feature in the feature list + * + * @return void + */ + private function initialize_features() { + foreach ($this->feature_list as $id => $data) { + $callback = isset($data['callback']) ? $data['callback'] : array($this, 'is_feature_enabled'); + $this->feature_items[$id] = new AIOWPSecurity_Feature_Item($id, $data['name'], $data['points'], $data['level'], $data['options'], $callback); + } + } + + /** + * This function will return the feature item for the passed in ID + * + * @param string $feature_id - the id of the feature item we want to return + * + * @return boolean|AIOWPSecurity_Feature_Item - returns a feature item or false on coding error + */ + public function get_feature_item_by_id($feature_id) { + if (isset($this->feature_items[$feature_id])) return $this->feature_items[$feature_id]; + error_log("AIOS Feature Manager - Feature ID not found (coding error): $feature_id"); + return false; + } + + /** + * Call the callback function associated with the feature item. + * + * @param mixed $feature_item The feature item object. + */ + private function call_feature_callback($feature_item) { + call_user_func($feature_item->callback, $feature_item); + } + + /** + * This function will output the feature details badge HTML + * + * @param string $feature_id - the id of the feature we want to get the badge for + * @param bool $return_instead_of_echo - whether to return the HTML or echo it + * + * @return string|void + */ + public function output_feature_details_badge($feature_id, $return_instead_of_echo = false) { + // Retrieve the feature item by ID + $feature_item = $this->get_feature_item_by_id($feature_id); + + if (!$feature_item) return; + + $this->call_feature_callback($feature_item); + + // Prepare HTML for the feature badge + $max_security_points = $feature_item->item_points; + $current_security_points = $feature_item->is_active() ? $max_security_points : 0; + $security_level = $feature_item->get_security_level_string(); + $protection_level = (0 == $current_security_points) ? 'none' : 'full'; + $status_icon = (0 == $current_security_points) ? 'dashicons-unlock' : 'dashicons-lock'; + + $badge_html = '
'; + $badge_html .= ''; + $badge_html .= ''.$security_level.''; + $badge_html .= ''; + $badge_html .= $current_security_points.'/'.$max_security_points.''; + $badge_html .= '
'; + + if ($return_instead_of_echo) { + return $badge_html; + } else { + echo $badge_html; + } + } + + /** + * This function will calculate the total points for the AJAX save function + * + * @return void + */ + public function calculate_total_feature_points() { + $this->calculate_total_points(); + } + + /** + * This function will setup the feature status and calculate the total points + * + * @return void + */ + public function check_feature_status_and_recalculate_points() { + $this->check_and_set_feature_status(); + $this->calculate_total_points(); + } + + /** + * This function will calculate the total points for the site + * + * @return void + */ + private function calculate_total_points() { + foreach ($this->feature_items as $item) { + if ($item->is_active()) $this->total_points = $this->total_points + intval($item->item_points); + } + } + + /** + * This function will calculate the total achievable points + * + * @return void + */ + private function calculate_total_achievable_points() { + foreach ($this->feature_items as $item) { + $this->total_achievable_points = $this->total_achievable_points + intval($item->item_points); + } + } + + /** + * This function will return the total points for the site + * + * @return int - the total points for the site + */ + public function get_total_site_points() { + if (empty($this->total_points)) $this->calculate_total_points(); + return $this->total_points; + } + + /** + * This function will return the total achievable points + * + * @return int - the total achievable points + */ + public function get_total_achievable_points() { + if (empty($this->total_achievable_points)) $this->calculate_total_achievable_points(); + return $this->total_achievable_points; + } + + /** + * This function will loop over each feature item, checking if it's enabled and setting it's feature status + * + * @return void + */ + private function check_and_set_feature_status() { + foreach ($this->feature_items as $item) { + call_user_func($item->callback, $item); + } + } + + /** + * This function will check if the feature database value is active and set the feature status + * + * @param AIOWPSecurity_Feature_Item $item - the item we want to check is active + * + * @return void + */ + private function is_feature_enabled($item) { + global $aio_wp_security; + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + + $enabled = false; + foreach ($item->feature_options as $option) { + if ('1' == $aiowps_firewall_config->get_value($option) || '1' == $aio_wp_security->configs->get_value($option)) $enabled = true; + } + + if ($enabled) { + $item->set_feature_status($this->feature_active); + } else { + $item->set_feature_status($this->feature_inactive); + } + } + + /** + * This function will check if the default admin user exists and set the feature status + * + * @param AIOWPSecurity_Feature_Item $item - the item we want to check is active + * + * @return void + */ + private function check_user_accounts_change_admin_user_feature($item) { + if (AIOWPSecurity_Utility::check_user_exists('admin')) { + $item->set_feature_status($this->feature_inactive); + } else { + $item->set_feature_status($this->feature_active); + } + } + + /** + * This function will check if the username and nicknames are identical and set the feature status + * + * @param AIOWPSecurity_Feature_Item $item - the item we want to check is active + * + * @return void + */ + private function check_user_accounts_display_name_feature($item) { + if (AIOWPSecurity_Utility::check_identical_login_and_nick_names()) { + $item->set_feature_status($this->feature_inactive); + } else { + $item->set_feature_status($this->feature_active); + } + } + + /** + * This function will check if the default database prefix is in use and set the feature status + * + * @param AIOWPSecurity_Feature_Item $item - the item we want to check is active + * + * @return void + */ + private function check_db_security_db_prefix_feature($item) { + global $wpdb; + $site_id = get_current_blog_id(); + $default_prefix = (1 === $site_id) ? 'wp_' : "wp_{$site_id}_"; + if ($default_prefix === $wpdb->prefix) { + $item->set_feature_status($this->feature_inactive); + } else { + $item->set_feature_status($this->feature_active); + } + } + + /** + * This function will check the filesystem permissions and set the feature status + * + * @param AIOWPSecurity_Feature_Item $item - the item we want to check is active + * + * @return void + */ + private function check_filesystem_permissions_feature($item) { + //TODO + $is_secure = 1; + $files_dirs_to_check = AIOWPSecurity_Utility_File::get_files_and_dirs_to_check(); + + foreach ($files_dirs_to_check as $file_or_dir) { + $actual_perm = AIOWPSecurity_Utility_File::get_file_permission($file_or_dir['path']); + $is_secure = $is_secure*AIOWPSecurity_Utility_File::is_file_permission_secure($file_or_dir['permissions'], $actual_perm); + } + + //Only if all of the files' permissions are deemed secure give this a thumbs up + if (1 == $is_secure) { + $item->set_feature_status($this->feature_active); + } else { + $item->set_feature_status($this->feature_inactive); + } + } + + /** + * This function will check if an item should be added to the feature list + * + * @param array $item - the item we want to check if it should be added + * @return bool + */ + public static function should_add_item($item) { + if (empty($item['feature_condition_callback'])) { + return true; + } elseif (is_callable($item['feature_condition_callback'])) { + return call_user_func($item['feature_condition_callback']); + } else { + error_log("Callback function set but not callable (coding error). Feature: " . $item['name']); + return false; + } + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/grade-system/wp-security-feature-item.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/grade-system/wp-security-feature-item.php new file mode 100755 index 00000000..1ea89f58 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/grade-system/wp-security-feature-item.php @@ -0,0 +1,78 @@ +feature_id = $feature_id; + $this->feature_name = $feature_name; + $this->item_points = $item_points; + $this->security_level = $security_level; + $this->feature_options = $feature_options; + $this->callback = $callback; + } + + /** + * This function will set the status of the feature + * + * @param string $status - the status of the feature + * + * @return void + */ + public function set_feature_status($status) { + $this->feature_status = $status; + } + + /** + * This function will return the string version of the level + * + * @return string - the string value of the level + */ + public function get_security_level_string() { + $level_string = ""; + if ("1" == $this->security_level) { + $level_string = __('Basic', 'all-in-one-wp-security-and-firewall'); + } elseif ("2" == $this->security_level) { + $level_string = __('Intermediate', 'all-in-one-wp-security-and-firewall'); + } elseif ("3" == $this->security_level) { + $level_string = __('Advanced', 'all-in-one-wp-security-and-firewall'); + } + return $level_string; + } + + /** + * This function will return a boolean to indicate if the feature is on or not + * + * @return boolean - true if the feature is on otherwise false + */ + public function is_active() { + return ('active' == $this->feature_status); + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/index.html b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/index.html new file mode 100755 index 00000000..e69de29b diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/index.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/index.php new file mode 100755 index 00000000..a64ea405 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/index.php @@ -0,0 +1,4 @@ +commands = new AIOWPSecurity_Commands(); + } + + /** + * Magic method to pass on the command to AIOWPSecurity_Commands + * + * @param string $name - command name + * @param array $arguments - command parameters + * + * @return array - response + */ + public function __call($name, $arguments) { + if (!is_callable(array($this->commands, $name))) { + return $this->_generic_error_response('aios_no_such_command', $name); + } + + $result = call_user_func_array(array($this->commands, $name), $arguments); + + if (is_wp_error($result)) { + return $this->_generic_error_response($result->get_error_code(), $result->get_error_data()); + } else { + return $this->_response($result); + } + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/updraftcentral.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/updraftcentral.php new file mode 100755 index 00000000..8c0c0370 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/updraftcentral.php @@ -0,0 +1,43 @@ + 'REMOTE_ADDR', + '1' => 'HTTP_CF_CONNECTING_IP', + '2' => 'HTTP_X_FORWARDED_FOR', + '3' => 'HTTP_X_FORWARDED', + '4' => 'HTTP_CLIENT_IP', + '5' => 'HTTP_X_REAL_IP', + '6' => 'HTTP_X_CLUSTER_CLIENT_IP', + ); + } + + /** + * Get AIOS custom admin notice ids. + * + * @return array + */ + public static function custom_admin_notice_ids() { + return array( + 'automated-database-backup', + 'ip-retrieval-settings', + 'load-firewall-resources-failed', + 'end-of-support-php-56', + ); + } + + /** + * Get notice ids for notices that have transformed HTACESS rules to PHP. + * + * @return array notice ids. + */ + public static function htaccess_to_php_feature_notice_ids() { + return array( + 'login-whitelist-disabled-on-upgrade', + 'ip-blacklist-settings-on-upgrade', + 'upgrade-firewall-tab-rules', + ); + } + + /** + * Get locale codes that are more than 2 char long supported by Google ReCaptcha. + * + * @return array + */ + public static function get_google_recaptcha_locale_codes() { + /** + * Google reCaptcha accepts 2 char language codes and also more than 2 char language codes. + * Most are 2 chars in length e.g. 'ar' for Arabic. + * Few are more than 2 char in length e.g 'de-AT' for German (Austria) + * + * Below is the list of more than 2 char language codes supported by Google reCaptcha. + * if determine_locale() detects any of the below we return it, otherwise, + * we would return the 2 letter code. + */ + return array( + 'zh-HK', // Chinese (Hong Kong). + 'zh-CN', // Chinese (Simplified). + 'zh-TW', // Chinese (Traditional). + 'en-GB', // UK. + 'fr-CA', // French (Canadian). + 'de-AT', // German (Austria). + 'de-CH', // German (Switzerland). + 'pt-BR', // Portuguese (Brazil). + 'pt-PT', // Portuguese (Portugal). + ); + } + + /** + * Get IP Lookup services. + * + * @return array + */ + public static function get_ip_lookup_services() { + return array( + 'ipify' => 'http://api.ipify.org/', + 'ipecho' => 'http://ipecho.net/plain', + 'ident' => 'http://ident.me', + 'tnedi' => 'http://tnedi.me', + ); + } + + /** + * Get Reverse IP Lookup services. + * + * @return array + */ + public static function get_reverse_ip_lookup_services() { + return array( + 'ip-api' => 'http://ip-api.com/json/%s', + 'ipinfo' => 'https://ipinfo.io/%s/json' + ); + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-ajax.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-ajax.php new file mode 100755 index 00000000..6e459749 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-ajax.php @@ -0,0 +1,253 @@ +commands_object = new AIOWPSecurity_Commands(); + + add_action('wp_ajax_aios_ajax', array($this, 'handle_ajax_requests')); + add_action('wp_ajax_nopriv_get_antibot_keys', array($this->commands_object, 'get_antibot_keys')); + } + + /** + * Return singleton instance + * + * @return AIOWPSecurity_Ajax Returns AIOWPSecurity_Ajax object + */ + public static function get_instance() { + static $instance = null; + if (null === $instance) { + $instance = new self(); + } + return $instance; + } + + /** + * Handles ajax requests + * + * @return void + */ + public function handle_ajax_requests() { + $this->set_nonce(); + $this->set_subaction(); + $this->set_data(); + + $result = AIOWPSecurity_Utility_Permissions::check_nonce_and_user_cap($this->nonce, 'wp-security-ajax-nonce'); + if (is_wp_error($result)) { + wp_send_json(array( + 'result' => false, + 'error_code' => $result->get_error_code(), + 'error_message' => $result->get_error_message(), + )); + } + + if (is_multisite() && !current_user_can('manage_network_options')) { + if (!$this->is_valid_multisite_command()) { + $this->send_invalid_multisite_command_error_response(); + } + } + + if ($this->is_invalid_command()) { + $this->add_invalid_command_error_log_entry(); + $this->set_invalid_command_error_response(); + } else { + $this->execute_command(); + $this->set_error_response_on_wp_error(); + $this->maybe_set_results_as_null(); + } + + $this->json_encode_results(); + + $json_last_error = json_last_error(); + if ($json_last_error) { + $this->set_error_response_on_json_encode_error($json_last_error); + } + + echo $this->results; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Variable is an array containing escaped data. + die; + } + + /** + * Sets nonce property value + * + * @return void + */ + private function set_nonce() { + // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput -- It's the actual nonce. It does not need sanitizing. + $this->nonce = empty($_POST['nonce']) ? '' : $_POST['nonce']; + } + + /** + * Sets subaction property value + * + * @return void + */ + private function set_subaction() { + // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Nonce already checked. + $this->subaction = empty($_POST['subaction']) ? '' : sanitize_text_field(wp_unslash($_POST['subaction'])); + } + + /** + * Sets data property value + * + * @return void + */ + private function set_data() { + // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Nonce already checked. + $this->data = isset($_POST['data']) ? wp_unslash($_POST['data']) : null; + } + + /** + * Checks whether it is multisite setup and command is valid multisite command + * + * @return bool + */ + private function is_valid_multisite_command() { + /** + * Filters the commands allowed to the sub site admins. Other commands are only available to network admin. Only used in a multisite context. + */ + $allowed_commands = apply_filters('aios_multisite_allowed_commands', array( + 'delete_audit_log', + 'delete_locked_ip_record', + 'clear_debug_logs', + 'unlock_ip', + 'blocked_ip_list_unblock_ip', + 'lock_ip', + 'dismiss_notice', + )); + + return in_array($this->subaction, $allowed_commands); + } + + /** + * Sends the invalid multisite command error response + * + * @return void + */ + private function send_invalid_multisite_command_error_response() { + wp_send_json(array( + 'result' => false, + 'error_code' => 'update_failed', + 'error_message' => __('Options can only be saved by network admin', 'all-in-one-wp-security-and-firewall') + )); + } + + /** + * Checks if applied ajax command is an invalid command or not + * + * @return bool Returns true if ajax command is an invalid command, false otherwise + */ + private function is_invalid_command() { + return !is_callable(array($this->commands_object, $this->subaction)); + } + + /** + * Log an error message for invalid ajax command + * + * @return void + */ + private function add_invalid_command_error_log_entry() { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Part of error reporting. + error_log("AIOS: ajax_handler: no such command (" . $this->subaction . ")"); + } + + /** + * Set `results` property with error response array for invalid ajax command + * + * @return void + */ + private function set_invalid_command_error_response() { + $this->results = array( + 'result' => false, + 'error_code' => 'command_not_found', + /* translators: %s: Subaction */ + 'error_message' => sprintf(__('The command "%s" was not found', 'all-in-one-wp-security-and-firewall'), $this->subaction) + ); + } + + /** + * Execute the ajax command + * + * @return void + */ + private function execute_command() { + $this->results = call_user_func(array($this->commands_object, $this->subaction), $this->data); + } + + /** + * Set `results` property with error message + * + * @return void + */ + private function set_error_response_on_wp_error() { + if (is_wp_error($this->results)) { + $this->results = array( + 'result' => false, + 'error_code' => $this->results->get_error_code(), + 'error_message' => $this->results->get_error_message(), + 'error_data' => $this->results->get_error_data(), + ); + } + } + + /** + * Set `results` property to null, if it is not yet set + * + * @return void + */ + private function maybe_set_results_as_null() { + // if nothing was returned for some reason, set as result null. + if (empty($this->results)) { + $this->results = array( + 'result' => null + ); + } + } + + /** + * Sets `results` property with json encode error + * + * @param int $json_last_error + * + * @return void + */ + private function set_error_response_on_json_encode_error($json_last_error) { + $this->results = array( + 'result' => false, + 'error_code' => $json_last_error, + 'error_message' => 'json_encode error : ' . $json_last_error, + 'error_data' => '', + ); + + $this->results = wp_json_encode($this->results); + } + + /** + * Json encode the `results` property value + * + * @return void + */ + private function json_encode_results() { + $this->results = wp_json_encode($this->results); + } + } + +endif; diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-audit-event-handler.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-audit-event-handler.php new file mode 100755 index 00000000..47a67c20 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-audit-event-handler.php @@ -0,0 +1,159 @@ +add_bulk_events($events); + }, 10, 4); + add_action('aiowps_clean_old_events', array($this, 'delete_old_events'), 10); + + if (!wp_next_scheduled('aiowps_clean_old_events')) { + wp_schedule_event(time(), 'daily', 'aiowps_clean_old_events'); + } + + AIOWPSecurity_Audit_Events::add_event_actions(); + } + + /** + * This function records an event in the audit log + * + * @global AIO_WP_Security $aio_wp_security + * + * @param string $event_type - the event type + * @param array $details - details about the event + * @param string $event_level - the event level + * @param string $username - the username, this is only used if there is no user logged in + * + * @return void + */ + public function record_event($event_type, $details, $event_level = 'info', $username = '') { + + if (!function_exists('wp_get_current_user')) { + global $aio_wp_security; + + $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_Audit_Event_Handler::record_event() called before plugins_loaded hook has run.", 4); + return; + } + + $record_event = apply_filters('aios_audit_log_record_event', true, $event_type, $details, $event_level, $username); + + if (!$record_event) return; + + $user = wp_get_current_user(); + $username = (is_a($user, 'WP_User') && 0 !== $user->ID) ? $user->user_login : $username; + $ip = apply_filters('aios_audit_log_event_user_ip', AIOWPSecurity_Utility_IP::get_user_ip_address()); + $data = apply_filters('aios_audit_log_event_user_country_code', array('ip' => $ip)); + $country_code = isset($data['country_code']) ? $data['country_code'] : ''; + $stacktrace = maybe_serialize(AIOWPSecurity_Utility::normalise_call_stack_args(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_debug_backtrace -- Required for the stacktrace to work. + $network_id = get_current_network_id(); + $site_id = get_current_blog_id(); + $details = wp_json_encode($details, true); + + $this->add_new_event($network_id, $site_id, $username, $ip, $event_level, $event_type, $details, $stacktrace, $country_code); + } + + /** + * This function adds the event to the audit log database table + * + * @param integer $network_id - the id of the current network + * @param integer $site_id - the id of the current site + * @param string $username - the username of the user who triggered the event + * @param string $ip - the IP address of the user + * @param string $event_level - the event level + * @param string $event_type - the event type + * @param string $details - details about the event + * @param string $stacktrace - the event stacktrace + * @param string $country_code - the country code + * + * @return void + */ + private function add_new_event($network_id, $site_id, $username, $ip, $event_level, $event_type, $details, $stacktrace, $country_code) { + global $wpdb; + + $wpdb->query($wpdb->prepare("INSERT INTO ".AIOWPSEC_TBL_AUDIT_LOG." (network_id, site_id, username, ip, level, event_type, details, stacktrace, created, country_code) VALUES (%d, %d, %s, %s, %s, %s, %s, %s, UNIX_TIMESTAMP(), %s)", $network_id, $site_id, $username, $ip, $event_level, $event_type, $details, $stacktrace, $country_code)); // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.NotPrepared -- We can't use %i because our plugin supports wordpress < 6.2. + } + + /** + * This function adds multiple events to the audit log database table + * + * @param array $events - each event in the array must contain the keys (network_id, site_id, username, ip, level, event_type, details, stacktrace and created) + * + * @return void + */ + private function add_bulk_events($events) { + global $wpdb; + + $sql = "INSERT INTO ".AIOWPSEC_TBL_AUDIT_LOG." (network_id, site_id, username, ip, level, event_type, details, stacktrace, created, country_code) VALUES "; + $values = array(); + + foreach ($events as $event) { + $sql .= "(%d, %d, %s, %s, %s, %s, %s, %s, %d, %s),"; + + $record_event = apply_filters('aios_audit_log_record_event', true, $event['event_type'], $event['details'], $event['level'], $event['username']); + if (!$record_event) continue; + + $event['ip'] = apply_filters('aios_audit_log_event_user_ip', $event['ip']); + $data = apply_filters('aios_audit_log_event_user_country_code', array('ip' => $event['ip'])); + $event['country_code'] = isset($data['country_code']) ? $data['country_code'] : ''; + $values[] = $event['network_id']; + $values[] = $event['site_id']; + $values[] = $event['username']; + $values[] = $event['ip']; + $values[] = $event['level']; + $values[] = $event['event_type']; + $values[] = $event['details']; + $values[] = $event['stacktrace']; + $values[] = $event['created']; + $values[] = $event['country_code']; + } + + // remove last ',' character from query + $sql = rtrim($sql, ','); + + $wpdb->query($wpdb->prepare($sql, $values)); // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.NotPrepared -- The sql query is being dynamically built. + } + + /** + * This method will try to delete all audit logs older than 3 months from the database. + * + * @return void + */ + public function delete_old_events() { + global $wpdb; + + $after_days = 90; + + if (defined('AIOWPSEC_PURGE_AUDIT_LOGS_AFTER_DAYS')) { + $after_days = abs(AIOWPSEC_PURGE_AUDIT_LOGS_AFTER_DAYS); + } + + $after_days = empty($after_days) ? 90 : $after_days; + $older_than_date = strtotime("-{$after_days} days", time()); + + $wpdb->query($wpdb->prepare("DELETE FROM ".AIOWPSEC_TBL_AUDIT_LOG." WHERE created < %s", $older_than_date)); // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.NotPrepared -- We can't use %i because our plugin supports wordpress < 6.2. + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-audit-events.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-audit-events.php new file mode 100755 index 00000000..1614470f --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-audit-events.php @@ -0,0 +1,641 @@ + __('Core updated', 'all-in-one-wp-security-and-firewall'), + 'plugin_installed' => __('Plugin installed', 'all-in-one-wp-security-and-firewall'), + 'plugin_activated' => __('Plugin activated', 'all-in-one-wp-security-and-firewall'), + 'plugin_updated' => __('Plugin updated', 'all-in-one-wp-security-and-firewall'), + 'plugin_deactivated' => __('Plugin deactivated', 'all-in-one-wp-security-and-firewall'), + 'plugin_deleted' => __('Plugin deleted', 'all-in-one-wp-security-and-firewall'), + 'theme_installed' => __('Theme installed', 'all-in-one-wp-security-and-firewall'), + 'theme_activated' => __('Theme activated', 'all-in-one-wp-security-and-firewall'), + 'theme_updated' => __('Theme updated', 'all-in-one-wp-security-and-firewall'), + 'theme_deleted' => __('Theme deleted', 'all-in-one-wp-security-and-firewall'), + 'translation_updated' => __('Translation updated', 'all-in-one-wp-security-and-firewall'), + 'entity_changed' => __('Entity changed', 'all-in-one-wp-security-and-firewall'), + 'successful_login' => __('Successful login', 'all-in-one-wp-security-and-firewall'), + 'successful_logout' => __('Successful logout', 'all-in-one-wp-security-and-firewall'), + 'failed_login' => __('Failed login', 'all-in-one-wp-security-and-firewall'), + 'user_registration' => __('User registration', 'all-in-one-wp-security-and-firewall'), + 'user_deleted' => __('User deleted', 'all-in-one-wp-security-and-firewall'), + 'user_removed' => __('User removed from blog', 'all-in-one-wp-security-and-firewall'), + 'table_migration' => __('Table migration', 'all-in-one-wp-security-and-firewall'), + 'rule_triggered' => __('Rule triggered', 'all-in-one-wp-security-and-firewall'), + 'rule_not_triggered' => __('Rule not triggered', 'all-in-one-wp-security-and-firewall'), + 'rule_active' => __('Rule active', 'all-in-one-wp-security-and-firewall'), + 'rule_not_active' => __('Rule not active', 'all-in-one-wp-security-and-firewall'), + 'password_reset' => __('Password reset', 'all-in-one-wp-security-and-firewall'), + ); + } + + /** + * Adds a core updated event to the audit log + * + * @param string $new_version - the wp version we updated to + * + * @return void + */ + public static function core_updated($new_version) { + global $wp_version; + + $details = array( + 'core_updated' => array( + 'old_version' => $wp_version, + 'new_version' => $new_version + ) + ); + do_action('aiowps_record_event', 'core_updated', $details, 'info'); + } + + /** + * Adds a plugin installed event to the audit log + * + * @param WP_Upgrader $upgrader - WP_Upgrader instance + * @param array $hook_extra - Array of bulk item update data + * + * @return void + */ + public static function plugin_installed($upgrader, $hook_extra) { + // If this is empty then we have no way to know if this is a plugin/theme install/update so create an entity changed event + if (empty($hook_extra)) { + self::event_entity_changed($upgrader); + return; + } + if ('plugin' !== $hook_extra['type'] || 'install' !== $hook_extra['action']) return; + self::$installed_plugin_info = $upgrader->new_plugin_data; + self::event_plugin_changed('installed', '', ''); + } + + /** + * Adds a plugin activated event to the audit log + * + * @param string $plugin - Path to the plugin file relative to the plugins directory + * @param boolean $network_activation - Whether to enable the plugin for all sites in the network or just the current site + * + * @return void + */ + public static function plugin_activated($plugin, $network_activation) { + $network = $network_activation ? 'network' : ''; + self::event_plugin_changed('activated', $plugin, $network); + } + + /** + * Adds a plugin updated event to the audit log + * + * @param WP_Upgrader $upgrader - WP_Upgrader instance + * @param array $hook_extra - Array of bulk item update data + * + * @return void + */ + public static function plugin_updated($upgrader, $hook_extra) { + // If this is empty then we have no way to know if this is a plugin/theme install/update so return as we catch this in plugin_installed() + if (empty($hook_extra)) return; + if ('plugin' !== $hook_extra['type'] || 'update' !== $hook_extra['action']) return; + if (isset($hook_extra['plugin'])) { + $plugin = $hook_extra['plugin']; + self::event_plugin_changed('updated', $plugin, ''); + } elseif (isset($hook_extra['plugins'])) { + foreach ($hook_extra['plugins'] as $plugin) { + self::event_plugin_changed('updated', $plugin, ''); + } + } + } + + /** + * Adds a plugin deactivated event to the audit log + * + * @param string $plugin - Path to the plugin file relative to the plugins directory + * @param boolean $network_deactivation - Whether to disable the plugin for all sites in the network or just the current site + * + * @return void + */ + public static function plugin_deactivated($plugin, $network_deactivation) { + $network = $network_deactivation ? 'network' : ''; + self::event_plugin_changed('deactivated', $plugin, $network, 'warning'); + } + + /** + * Records the plugin info of the plugin that is about to be deleted + * + * @param string $plugin - Path to the plugin file relative to the plugins directory + * + * @return void + */ + public static function plugin_delete($plugin) { + $filename = WP_PLUGIN_DIR . '/' . $plugin; + if (!file_exists($filename)) return; + + self::$removed_plugin_info = get_plugin_data($filename); + } + + /** + * Adds a plugin deleted event to the audit log + * + * @param string $plugin - Path to the plugin file relative to the plugins directory + * @param boolean $deleted - Whether the plugin deletion was successful + * + * @return void + */ + public static function plugin_deleted($plugin, $deleted) { + if ($deleted) self::event_plugin_changed('deleted', $plugin, '', 'warning'); + } + + /** + * This function will construct the event details and send it to be recorded + * + * @param string $action - the action taken (activated, deactivated) + * @param string $plugin - Path to the plugin file relative to the plugins directory + * @param string $network - status of if the plugin was network activated/deactivated + * @param string $level - the log level + * + * @return void + */ + private static function event_plugin_changed($action, $plugin, $network, $level = 'info') { + if ('deleted' == $action) { + $info = self::$removed_plugin_info; + } elseif ('installed' == $action) { + $info = self::$installed_plugin_info; + } else { + $filename = WP_PLUGIN_DIR . '/' . $plugin; + if (!file_exists($filename)) return; + $info = get_plugin_data($filename); + } + + $name = empty($info['Name']) ? 'Unknown' : $info['Name']; + $version = empty($info['Version']) ? '0.0.0' : $info['Version']; + + $details = array( + 'plugin' => array( + 'name' => $name, + 'version' => $version, + 'action' => $action, + 'network' => $network + ) + ); + do_action('aiowps_record_event', 'plugin_' . $action, $details, $level); + } + + /** + * Adds a theme installed event to the audit log + * + * @param WP_Upgrader $upgrader - WP_Upgrader instance + * @param array $hook_extra - Array of bulk item update data + * + * @return void + */ + public static function theme_installed($upgrader, $hook_extra) { + // If this is empty then we have no way to know if this is a plugin/theme install/update so return as we catch this in plugin_installed() + if (empty($hook_extra)) return; + if ('theme' !== $hook_extra['type'] || 'install' !== $hook_extra['action']) return; + self::$installed_theme_info = $upgrader->new_theme_data; + self::event_theme_changed('installed', '', ''); + } + + /** + * Adds a theme activated event to the audit log + * + * @param string $new_name - Name of the new active theme + * + * @return void + */ + public static function theme_activated($new_name) { + $details = array( + 'theme' => array( + 'name' => $new_name, + 'action' => 'activated', + ) + ); + do_action('aiowps_record_event', 'theme_activated', $details); + } + + /** + * Adds a theme updated event to the audit log + * + * @param WP_Upgrader $upgrader - WP_Upgrader instance + * @param array $hook_extra - Array of bulk item update data + * + * @return void + */ + public static function theme_updated($upgrader, $hook_extra) { + // If this is empty then we have no way to know if this is a plugin/theme install/update so return as we catch this in plugin_installed() + if (empty($hook_extra)) return; + if ('theme' !== $hook_extra['type'] || 'update' !== $hook_extra['action']) return; + if (isset($hook_extra['theme'])) { + $theme = $hook_extra['theme']; + self::event_theme_changed('updated', $theme, ''); + } elseif (isset($hook_extra['themes'])) { + foreach ($hook_extra['themes'] as $theme) { + self::event_theme_changed('updated', $theme, ''); + } + } + } + + /** + * Records the theme info of the plugin that is about to be deleted + * + * @param string $theme - Path to the theme file relative to the themes directory + * + * @return void + */ + public static function theme_delete($theme) { + $info_object = wp_get_theme($theme); + $info = array( + 'Name' => $info_object->get('Name'), + 'Version' => $info_object->get('Version'), + ); + self::$removed_theme_info = $info; + } + + /** + * Adds a theme deleted event to the audit log + * + * @param string $theme - Path to the theme file relative to the themes directory + * @param boolean $deleted - Whether the theme deletion was successful + * + * @return void + */ + public static function theme_deleted($theme, $deleted) { + if ($deleted) self::event_theme_changed('deleted', $theme, '', 'warning'); + } + + /** + * This function will construct the event details and send it to be recorded + * + * @param string $action - the action taken (activated, deactivated) + * @param string $theme - Path to the theme file relative to the themes directory + * @param string $network - status of if the theme was network activated/deactivated + * @param string $level - the log level + * + * @return void + */ + private static function event_theme_changed($action, $theme, $network, $level = 'info') { + if ('deleted' == $action) { + $info = self::$removed_theme_info; + } elseif ('installed' == $action) { + $info = self::$installed_theme_info; + } else { + $info_object = wp_get_theme($theme); + $info = array( + 'Name' => $info_object->get('Name'), + 'Version' => $info_object->get('Version'), + ); + } + + $name = empty($info['Name']) ? 'Unknown' : $info['Name']; + $version = empty($info['Version']) ? '0.0.0' : $info['Version']; + + $details = array( + 'theme' => array( + 'name' => $name, + 'version' => $version, + 'action' => $action, + 'network' => $network + ) + ); + do_action('aiowps_record_event', 'theme_' . $action, $details, $level); + } + + /** + * Adds a translation updated event to the audit log + * + * @param WP_Upgrader $upgrader - WP_Upgrader instance + * @param array $hook_extra - Array of bulk item update data + * + * @return void + */ + public static function translation_updated($upgrader, $hook_extra) { + + // If this is empty then we have no way to know if this is a plugin/theme/translation install/update so return as we catch this in plugin_installed() + if (empty($hook_extra)) return; + + if ('translation' !== $hook_extra['type'] || 'update' !== $hook_extra['action']) return; + + if (!isset($hook_extra['translations']) || empty($hook_extra['translations'])) return; + + foreach ($hook_extra['translations'] as $info) { + $details = array( + 'translation_updated' => $info + ); + do_action('aiowps_record_event', 'translation_updated', $details, 'info'); + } + } + + /** + * Adds a entity changed event to the audit log + * + * @param WP_Upgrader $upgrader - WP_Upgrader instance + * + * @return void + */ + public static function event_entity_changed($upgrader) { + + $entity = (isset($upgrader->result) && isset($upgrader->result['destination_name'])) ? $upgrader->result['destination_name'] : false; + + $details = array( + 'entity_changed' => array( + 'entity' => $entity, + ) + ); + do_action('aiowps_record_event', 'entity_changed', $details, 'warning'); + } + + /** + * Adds all the firewall rule events to the audit log + * + * @return void + */ + public static function rule_event() { + $aiowps_firewall_message_store = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::MESSAGE_STORE); + $events = array(); + foreach (array('active', 'not_active', 'triggered', 'not_triggered') as $event) { + $data = $aiowps_firewall_message_store->get('rule_'.$event); + + if (empty($data)) continue; + + foreach ($data as $rule) { + + $details = array( + 'firewall_event' => array( + 'event' => $event, + 'rule_name' => $rule['name'], + 'rule_family' => $rule['family'], + ) + ); + + $blog_id = AIOWPSecurity_Utility::get_blog_id_from_request($rule['request']); + + $rule['request'] = apply_filters('aios_audit_filter_request', $rule['request'], $event); + + $events[] = array( + 'network_id' => get_current_network_id(), + 'site_id' => $blog_id, + 'username' => (isset($rule['potential_user']) ? AIOWPSecurity_Utility::verify_username($rule['potential_user']) : false), + 'ip' => $rule['ip'], + 'level' => 'triggered' === $event ? 'warning' : 'info', + 'event_type' => 'rule_'.$event, + 'details' => wp_json_encode($details, true), + 'stacktrace' => (isset($rule['request']) ? print_r($rule['request'], true) : ''), // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_print_r -- PCP warning. Part of AOIS error reporting system. + 'created' => $rule['time'] + ); + } + } + + if (empty($events)) return; + + do_action('aiowps_bulk_record_events', $events); + } + + /** + * Adds a password reset event to the audit log + * + * @param object $user_data - Object containing user's data + */ + public static function password_reset($user_data) { + + $user_login = (false === $user_data) ? 'unknown' : $user_data->user_login; + + $details = array( + 'password_reset' => array( + 'user_login' => $user_login + ) + ); + do_action('aiowps_record_event', 'password_reset', $details, 'warning'); + } + + /** + * Adds a user deleted event to the audit log + * + * @param int $user_id - the id of the deleted user + * @param int|null $reassign - the id of the user to reassign data to or null + * @param object $user_data - Object containing user's data + * + * @return void + */ + public static function user_deleted($user_id, $reassign, $user_data) { + + $user_login = (false === $user_data) ? 'unknown' : $user_data->user_login; + + $details = array( + 'user_deleted' => array( + 'user_id' => $user_id, + 'reassign' => $reassign, + 'user_login' => $user_login + + ) + ); + do_action('aiowps_record_event', 'user_deleted', $details, 'warning'); + } + + /** + * Adds a user removed event to the audit log + * + * @param int $user_id - the id of the removed user + * @param int $blog_id - the id of the blog the user was removed from + * @param int $reassign - the id of the user to reassign data to or null + * + * @return void + */ + public static function user_removed_from_blog($user_id, $blog_id, $reassign) { + $user_data = get_user_by('ID', $user_id); + $user_login = is_a($user_data, 'WP_User') && 0 !== $user_data->ID ? $user_data->user_login : 'unknown'; + + $details = array( + 'user_removed' => array( + 'user_id' => $user_id, + 'blog_id' => $blog_id, + 'reassign' => $reassign, + 'user_login' => $user_login + + ) + ); + do_action('aiowps_record_event', 'user_removed', $details, 'warning'); + } + + /** + * Adds a failed login event to the audit log + * + * @param string $username - the username for the failed login attempt + * + * @return void + */ + public static function event_failed_login($username) { + $user = is_email($username) ? get_user_by('email', $username) : get_user_by('login', $username); + $details = array( + 'failed_login' => array( + 'imported' => false, + 'username' => $username, + 'known' => true, + ) + ); + if (is_a($user, 'WP_User')) { + do_action('aiowps_record_event', 'failed_login', $details, 'warning', $username); + } else { + $details['failed_login']['known'] = false; + do_action('aiowps_record_event', 'failed_login', $details, 'warning', $username); + } + } + + /** + * Adds a user registration event to the audit log + * + * @param integer $user_id - the user ID of the newly registered user + * @param string $type - the type of registration valid values (admin, pending, registered) + * + * @return void + */ + public static function event_user_registration($user_id, $type) { + $registered_user = get_user_by('ID', $user_id); + $registered_username = is_a($registered_user, 'WP_User') && 0 !== $registered_user->ID ? $registered_user->user_login : ''; + + $details = array( + 'user_registration' => array( + 'registered_username' => $registered_username, + 'type' => $type, + ) + ); + + if ('admin' == $type) { + $admin_user = wp_get_current_user(); + $admin_username = is_a($admin_user, 'WP_User') ? $admin_user->user_login : ''; + $details['user_registration']['admin_username'] = $admin_username; + do_action('aiowps_record_event', 'user_registration', $details, 'info'); + } elseif ('pending' == $type) { + do_action('aiowps_record_event', 'user_registration', $details, 'info', $registered_username); + } elseif ('registered' == $type) { + do_action('aiowps_record_event', 'user_registration', $details, 'info', $registered_username); + } + } + + /** + * Adds a successful login event to the audit log + * + * @param string $username - the username for the successful login + * + * @return void + */ + public static function event_successful_login($username) { + $details = array( + 'successful_login' => array( + 'username' => $username, + ) + ); + do_action('aiowps_record_event', 'successful_login', $details, 'info', $username); + } + + /** + * Adds a successful logout event to the audit log + * + * @param string $username - the username for the successful logout + * @param boolean $force_logout - if the logout was a force logout + * + * @return void + */ + public static function event_successful_logout($username, $force_logout = false) { + $details = array( + 'successful_logout' => array( + 'username' => $username, + 'force_logout' => $force_logout ? __('(force logout)', 'all-in-one-wp-security-and-firewall') : '' + ) + ); + do_action('aiowps_record_event', 'successful_logout', $details, 'info', $username); + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-audit-text-handler.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-audit-text-handler.php new file mode 100755 index 00000000..8b1dec19 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-audit-text-handler.php @@ -0,0 +1,238 @@ + $info['event'], + 'rule_name' => $info['rule_name'], + 'rule_family' => $info['rule_family'], + ); + break; + } + + // Add a link to the rule, if present + if (isset($info['location'])) { + $output .= "

".__('Configure this rule', 'all-in-one-wp-security-and-firewall').''; + } + + return is_array($output) ? wp_json_encode($output) : $output; + } + + /** + * Return the text version of 'password_reset' event + * + * @param array $info + * @return string + */ + public static function password_reset_to_text($info) { + /* translators: %s: User login */ + return sprintf(__('Password for user account: `%s` successfully changed', 'all-in-one-wp-security-and-firewall'), $info['user_login']); + } + + /** + * Return the text version of 'user_deleted' event + * + * @param array $info + * @return string + */ + public static function user_deleted_to_text($info) { + if (empty($info['reassign'])) { + /* translators: 1: User login, 2: User ID */ + return sprintf(__('User account: %1$s with ID: `%2$s` has been deleted', 'all-in-one-wp-security-and-firewall'), $info['user_login'], $info['user_id']); + } else { + /* translators: 1: User login, 2: User ID, 3: Reassign */ + return sprintf(__('User account: `%1$s` with ID: `%2$s` has been deleted and all content has been reassigned to user with ID: `%3$s`', 'all-in-one-wp-security-and-firewall'), $info['user_login'], $info['user_id'], $info['reassign']); + } + } + + /** + * Return the text version of 'user_removed' event + * + * @param array $info + * @return string + */ + public static function user_removed_to_text($info) { + if (empty($info['reassign'])) { + /* translators: 1: User login, 2: User ID, 3: Blog ID */ + return sprintf(__('User account: %1$s with ID: `%2$s` has been removed from the blog with ID: `%3$s`', 'all-in-one-wp-security-and-firewall'), $info['user_login'], $info['user_id'], $info['blog_id']); + } else { + /* translators: 1: User login, 2: User ID, 3: Blog ID, 4: Reassign */ + return sprintf(__('User account: `%1$s` with ID: `%2$s` has been removed from the blog with ID: `%3$s` and all content has been reassigned to user with ID: `%4$s`', 'all-in-one-wp-security-and-firewall'), $info['user_login'], $info['user_id'], $info['blog_id'], $info['reassign']); + } + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-base-tasks.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-base-tasks.php new file mode 100755 index 00000000..c5935336 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-base-tasks.php @@ -0,0 +1,43 @@ +get_col("SELECT blog_id FROM $wpdb->blogs"); + foreach ($blog_ids as $blog_id) { + switch_to_blog($blog_id); + static::run_for_a_site(); + restore_current_blog(); + } + } else { + static::run_for_a_site(); + } + } + + /** + * Run uninstallation task for a single site. + * + * This method must be implemented in child classes. + * Since static abstract methods are not allowed in PHP, we enforce it at runtime. + * + * @throws Exception If not overridden in a child class. + * @return void + */ + protected static function run_for_a_site() { + throw new Exception( + sprintf('%s : Child classes must implement run_for_a_site() method.', get_called_class()) + ); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-block-bootstrap.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-block-bootstrap.php new file mode 100755 index 00000000..ca57abef --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-block-bootstrap.php @@ -0,0 +1,207 @@ +file_path); + + if (!isset($info['dirname'])) { + return new WP_Error( + 'file_no_directory', + 'No directory has been set', + $this->file_path + ); + } + + // phpcs:disable WordPress.WP.AlternativeFunctions -- wp_filesystem not recommended for firewall. + if (!is_writable($info['dirname'])) { + return new WP_Error( + 'file_directory_not_writable', + 'The directory has incorrect write permissions. Please double check its permissions and try again.', + $info['dirname'] + ); + } + + return (false !== @file_put_contents($this->file_path, $this->get_contents())); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- ignore this + // phpcs:enable WordPress.WP.AlternativeFunctions -- wp_filesystem not recommended for firewall. + } + + /** + * Checks whether the bootstrap contents are valid + * + * @param string $contents + * @return boolean + */ + protected function is_content_valid($contents) { + + //Ensure we're using the correct version of the file + $version = $this->get_bootstrap_version(); + + if (false === $version) return false; + + if ($version['full_version'] !== $this->version) return false; + + //Ensure the required paths are valid + $regexes = array('/file_exists\((?\'.*\')\)/isU', '/include_once\((?\'.*\')\)/isU'); + $firewall_path_str = $this->get_firewall_path_str(); + + foreach ($regexes as $regex) { + + if (preg_match($regex, $contents, $matches)) { + + if ($firewall_path_str !== $matches['file_path']) return false; + + } + } + + return true; + } + + /** + * Returns the bootstrap version from file + * + * @return array|boolean Array with the version information; false otherwise. + */ + protected function get_bootstrap_version() { + + $contents = @file_get_contents($this->file_path); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- ignore this + + if (false === $contents) return false; + + if (preg_match('/@version (?(?\d{1,})\.(?\d{1,})\.(?\d{1,}))$/m', $contents, $matches)) { + return $matches; + } + + return false; + } + + /** + * Get the firewall path string that contains "__DIR__" for home dir, if plugin dir isn't a symbolic link.. + * + * @return string The firewall path string. + */ + private function get_firewall_path_str() { + $firewall_path = AIOWPSecurity_Utility_Firewall::get_firewall_path(); + $firewall_path_str = $this->get_path_str_for_given_absolute_path($firewall_path); + return $firewall_path_str; + } + + /** + * Get path string to write bootstrap file from given path. + * + * @param string $path a path that we want to write to the bootstrap file. + * @return string The path that can be written in the bootstrap file. + */ + private function get_path_str_for_given_absolute_path($path) { + $home_path = AIOWPSecurity_Utility_File::get_home_path(); + // If the plugin is symbolic linked, then the plugin's firewall path is not started with home_path. + $path_str = (0 === strpos($path, $home_path)) ? "__DIR__.'/".substr($path, strlen($home_path))."'" : "'".$path."'"; + return $path_str; + } + + /** + * Get the firewall rules path string that contains "__DIR__" for home dir, if plugin dir isn't a symbolic link. + * + * @return string The firewall rule path string. + */ + private function get_firewall_rules_path_str() { + $firewall_rules_path = AIOWPSecurity_Utility_Firewall::get_firewall_rules_path(); + $firewall_rules_path_str = $this->get_path_str_for_given_absolute_path($firewall_rules_path); + return $firewall_rules_path_str; + } + + /** + * The regex pattern that demarcates our contents + * + * @return string + */ + protected function get_regex_pattern() { + return '#// Begin AIOWPSEC Firewall(.*)// End AIOWPSEC Firewall#isU'; + } + + /** + * Bootstrap file contents to insert + * + * @return string + */ + public function get_contents() { + $firewall_path_str = $this->get_firewall_path_str(); + $firewall_rules_path_str = $this->get_firewall_rules_path_str(); + + // Any extra data we want to have accessible to the firewall + $data = array( + 'ABSPATH' => wp_normalize_path(ABSPATH) + ); + + $code = "get_warning_message(); + + $directive = AIOWPSecurity_Utility_Firewall::get_already_set_directive(); + + if (!empty($directive) && $directive !== $this->file_path) { + $directive = wp_normalize_path($directive); + $code .= "// Previously set auto_prepend_file\n"; + $code .= "if (file_exists('{$directive}')) {\n"; + $code .= "\tinclude_once('{$directive}');\n"; + $code .= "}\n"; + } + + + $code .= '$GLOBALS[\'aiowps_firewall_rules_path\'] = '.$firewall_rules_path_str.";\n\n"; + + // write any other data we need + $code .= "\$GLOBALS['aiowps_firewall_data'] = array(\n"; + foreach ($data as $name => $value) { + $code .= "\t'{$name}' => '{$value}',\n"; + } + $code .= ");\n\n"; //close data array + + $code .= "// Begin AIOWPSEC Firewall\n"; + $code .= "if (file_exists({$firewall_path_str})) {\n"; + $code .= "\tinclude_once({$firewall_path_str});\n"; + $code .= "}\n"; + $code .= "// End AIOWPSEC Firewall\n"; + + return $code; + } + + /** + * Gets our warning message for users + * + * @return string + */ + protected function get_warning_message() { + + $warning = "/** \n"; + $warning .= " * @version {$this->version}\n"; + $warning .= " * WARNING: Please do not delete this file.\n"; + $warning .= " * \n"; + $warning .= " * This will cause PHP to throw a fatal error and render your site unusable.\n"; + $warning .= " * \n"; + $warning .= " * To safely delete this file, please check both your .user.ini file and your php.ini file and ensure this file is not set in the auto_prepend_file directive.\n"; + $warning .= " * \n"; + $warning .= " * Please ask your web hosting provider if you need guidance with executing the aforementioned steps.\n"; + $warning .= " */\n"; + + return $warning; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-block-file.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-block-file.php new file mode 100755 index 00000000..7561ba9b --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-block-file.php @@ -0,0 +1,202 @@ +file_path = $file_path; + } + + /** + * Insert the contents to the managed file + * + * @return boolean|WP_Error true if success; false if failed + */ + abstract public function insert_contents(); + + /** + * Returns the contents to be inserted into the managed file + * + * @return string + */ + abstract public function get_contents(); + + /** + * Returns the regex pattern that separates our contents from others the file may contain + * + * @return string + */ + abstract protected function get_regex_pattern(); + + /** + * Checks whether the file's contents are valid + * + * @param string $contents + * @return boolean + */ + abstract protected function is_content_valid($contents); + + /** + * Updates the contents of the managed file + * + * @return boolean|WP_Error true if updated; false if not updated + */ + public function update_contents() { + // phpcs:ignore WordPress.WP.AlternativeFunctions -- wp_filesystem not recommended. + if (!is_readable($this->file_path) || !is_writable($this->file_path)) { + return new WP_Error( + 'file_wrong_permissions', + 'The file has incorrect read or write permissions. Please double check its permissions and try again.', + $this->file_path + ); + } + + $contents = @file_get_contents($this->file_path); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- ignore this + + if (false === $contents) { + return new WP_Error( + 'file_unable_to_read', + 'Unable to read the file. Please double check its permissions and try again.', + $this->file_path + ); + } + + $matches = array(); + $match_count = preg_match_all($this->get_regex_pattern(), $contents, $matches); + + if (empty($matches[1]) || false === $match_count) { + return false; + } + + //checks whether an update is required + $requires_update = false; + $match = ''; + foreach ($matches[1] as $match) { + + $requires_update = !$this->is_content_valid($match); + + if (true === $requires_update) { + break; + } + } + + //perform the update + if ($requires_update) { + + $block_removed = $this->remove_contents(); + $block_inserted = $this->insert_contents(); + + return (true === $block_removed && true === $block_inserted); + } + + return false; + } + + /** + * Checks whether the file contains our contents + * + * @return boolean|WP_Error true if found; false if not found + */ + public function contains_contents() { + + clearstatcache(); + if (!file_exists($this->file_path)) { + return new WP_Error( + 'file_does_not_exist', + 'The file does not exist.', + $this->file_path + ); + } + + if (!is_readable($this->file_path)) { + return new WP_Error( + 'file_wrong_permissions', + 'The file has incorrect read permissions. Please double check its permissions and try again.', + $this->file_path + ); + } + + $contents = @file_get_contents($this->file_path); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- ignore this + + if (false === $contents) { + return new WP_Error( + 'file_unable_to_read', + 'Unable to read the file. Please double check its permissions and try again.', + $this->file_path + ); + } + + return (1 === preg_match($this->get_regex_pattern(), $contents)); + } + + /** + * Removes our contents from the file + * + * @return boolean|WP_Error + */ + public function remove_contents() { + + if (!is_readable($this->file_path) || !is_writable($this->file_path)) { + return new WP_Error( + 'file_wrong_permissions', + 'The file has incorrect read or write permissions. Please double check its permissions and try again.', + $this->file_path + ); + } + + $contents = @file_get_contents($this->file_path); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- ignore this + + if (false === $contents) { + return new WP_Error( + 'file_unable_to_read', + 'Unable to read the file. Please double check its permissions and try again.', + $this->file_path + ); + } + + $removed = 0; + $contents = preg_replace($this->get_regex_pattern(), "", $contents, -1, $removed); + + if (null === $contents) { + return new WP_Error( + 'file_unable_to_alter', + 'Unable to alter the file.', + $this->file_path + ); + } + + if (false === @file_put_contents($this->file_path, $contents, LOCK_EX)) { // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- ignore this + return new WP_Error( + 'file_unable_to_write', + 'Unable to write to the file. Please double check its permissions and try again.', + $this->file_path + ); + } + + return $removed > 0; + } + + /** + * By default returns the full path to the file being managed + * + * @return string + */ + public function __toString() { + return $this->file_path; + } + +} //end of class diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-block-htaccess.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-block-htaccess.php new file mode 100755 index 00000000..4673f3f8 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-block-htaccess.php @@ -0,0 +1,91 @@ +file_path + ); + } + + return (false !== @file_put_contents($this->file_path, $this->get_contents(), FILE_APPEND)); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- ignore this + } + + /** + * Checks whether the file's contents are valid + * + * @param string $contents + * @return boolean + */ + protected function is_content_valid($contents) { + + $regex = '/php_value auto_prepend_file \'(.*)\'/isU'; + $bootstrap_path = AIOWPSecurity_Utility_Firewall::get_bootstrap_path(); + + $matches = array(); + + if (preg_match_all($regex, $contents, $matches)) { + $match = ''; + foreach ($matches[1] as $match) { + + if ($bootstrap_path !== $match) { + return false; + } + } + + } else { + return false; + } + + return true; + } + + /** + * The regex pattern that demarcates our contents + * + * @return string + */ + protected function get_regex_pattern() { + return '/\r?\n?# Begin AIOWPSEC Firewall(.*?)# End AIOWPSEC Firewall/is'; + } + + /** + * Our contents; the required apache directives for auto prepending a file + * + * @return string + */ + public function get_contents() { + $bootstrap_path = AIOWPSecurity_Utility_Firewall::get_bootstrap_path(); + + $directives = "\n# Begin AIOWPSEC Firewall\n"; + $directives .= "\t\n"; + $directives .= "\t\tphp_value auto_prepend_file '{$bootstrap_path}'\n"; + $directives .= "\t\n"; + $directives .= "\t\n"; + $directives .= "\t\tphp_value auto_prepend_file '{$bootstrap_path}'\n"; + $directives .= "\t\n"; + $directives .= "\t\n"; + $directives .= "\t\tphp_value auto_prepend_file '{$bootstrap_path}'\n"; + $directives .= "\t\n"; + $directives .= "# End AIOWPSEC Firewall"; + + return $directives; + } + + +} //end of class diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-block-litespeed.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-block-litespeed.php new file mode 100755 index 00000000..4a96f466 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-block-litespeed.php @@ -0,0 +1,29 @@ +\n"; + $directives .= "\t\tphp_value auto_prepend_file '{$bootstrap_path}'\n"; + $directives .= "\t\n"; + $directives .= "\t\n"; + $directives .= "\t\tphp_value auto_prepend_file '{$bootstrap_path}'\n"; + $directives .= "\t\n"; + $directives .= "# End AIOWPSEC Firewall"; + + return $directives; + } + + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-block-muplugin.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-block-muplugin.php new file mode 100755 index 00000000..711d4eaf --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-block-muplugin.php @@ -0,0 +1,93 @@ +file_path); + + if (!isset($info['dirname'])) { + return new WP_Error( + 'file_no_directory', + 'No directory has been set', + $this->file_path + ); + } + + if (false === wp_mkdir_p($info['dirname'])) { + return new WP_Error( + 'file_no_directory_created', + 'Unable to create the directory', + $info['dirname'] + ); + } + + return (false !== @file_put_contents($this->file_path, $this->get_contents())); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.file_system_operations_file_put_contents -- WP_Filesystem is not appropriate here. + } + + /** + * Checks whether the mu-plugin contents are valid + * + * @param string $contents + * @return boolean + */ + protected function is_content_valid($contents) { + + //The regexes we extract the paths from + $regexes = array('/file_exists\(\'(.*)\'\)/isU', '/include_once\(\'(.*)\'\)/isU'); + $regex = ''; + $bootstrap_path = AIOWPSecurity_Utility_Firewall::get_bootstrap_path(); + + foreach ($regexes as $regex) { + $matches = array(); + $result = preg_match($regex, $contents, $matches); + + if (empty($matches[1]) || false === $result) { + continue; + } + + if ($bootstrap_path !== $matches[1]) { + return false; + } + + } + + return true; + } + + /** + * The regex pattern that demarcates our contents + * + * @return string + */ + protected function get_regex_pattern() { + return '#// Begin AIOWPSEC Firewall(.*)// End AIOWPSEC Firewall#isU'; + } + + /** + * Our firewall code to insert + * + * @return string + */ + public function get_contents() { + $bootstrap_path = AIOWPSecurity_Utility_Firewall::get_bootstrap_path(); + + $code = "file_path, $this->get_contents(), FILE_APPEND)); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- ignore this + } + + /** + * Checks whether the user.ini file contents are valid + * + * @param string $contents + * @return boolean + */ + protected function is_content_valid($contents) { + + $regex = '/auto_prepend_file=\'(.*)\'/isU'; + $bootstrap_path = AIOWPSecurity_Utility_Firewall::get_bootstrap_path(); + + $match = array(); + $result = preg_match($regex, $contents, $match); + + if (empty($match[1]) || false === $result) { + return false; + } + + if ($bootstrap_path !== $match[1]) { + return false; + } + + return true; + + } + + /** + * Our regex pattern that demarcates our contents + * + * @return string + */ + protected function get_regex_pattern() { + return '/\r?\n?# Begin AIOWPSEC Firewall(.*?)# End AIOWPSEC Firewall/is'; + } + + /** + * Directives inserted into user.ini + * + * @return string + */ + public function get_contents() { + $bootstrap_path = AIOWPSecurity_Utility_Firewall::get_bootstrap_path(); + + $directive = "\n# Begin AIOWPSEC Firewall\n"; + $directive .= "auto_prepend_file='{$bootstrap_path}'\n"; + $directive .= "# End AIOWPSEC Firewall"; + + return $directive; + } + + /** + * Extends the contains_contents function to check for already set directives + * + * @return boolean|WP_Error + */ + public function contains_contents() { + $contains = parent::contains_contents(); + + if (false === $contains) { + $directive_userini = AIOWPSecurity_Utility_Firewall::get_already_set_directive($this->file_path); + $directive = AIOWPSecurity_Utility_Firewall::get_already_set_directive(); + + if ((AIOWPSecurity_Utility_Firewall::get_bootstrap_path() === $directive) || (AIOWPSecurity_Utility_Firewall::get_bootstrap_path() === $directive_userini)) { + return true; + } + } + + return $contains; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-block-wpconfig.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-block-wpconfig.php new file mode 100755 index 00000000..6fc2cf27 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-block-wpconfig.php @@ -0,0 +1,103 @@ +file_path) || !is_writable($this->file_path)) { + return new WP_Error( + 'file_wrong_permissions', + 'The file has incorrect read or write permissions. Please double check its permissions and try again.', + $this->file_path + ); + } + + //Take a backup of the file first + if (false === AIOWPSecurity_Utility_File::backup_and_rename_wp_config($this->file_path)) { + return new WP_Error( + 'file_unable_to_backup', + 'We were unable to take a backup of your file.', + $this->file_path + ); + } + + $wp_config = file($this->file_path, FILE_IGNORE_NEW_LINES); + + if (false === $wp_config) { + return new WP_Error( + 'file_no_contents', + 'Unable to access the file\'s contents', + $this->file_path + ); + } + + array_shift($wp_config); + array_unshift($wp_config, $this->get_contents()); + + return (false !== @file_put_contents($this->file_path, implode(PHP_EOL, $wp_config), LOCK_EX)); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- ignore this + } + + /** + * Checks the validity of the content + * + * @param string $contents - contents we're checking + * @return boolean true if content is valid; false if invalid + */ + protected function is_content_valid($contents) { + //The regexes we extract the paths from + $regexes = array('/file_exists\(\'(.*)\'\)/isU', '/include_once\(\'(.*)\'\)/isU'); + $regex = ''; + $bootstrap_path = AIOWPSecurity_Utility_Firewall::get_bootstrap_path(); + + foreach ($regexes as $regex) { + $matches = array(); + $result = preg_match($regex, $contents, $matches); + + if (empty($matches[1]) || false === $result) { + continue; + } + + if ($bootstrap_path !== $matches[1]) { + return false; + } + } + + return true; + } + + /** + * The particular regex that demarcates our contents + * + * @return string + */ + protected function get_regex_pattern() { + return '#\r?\n?// Begin AIOWPSEC Firewall(.*?)// End AIOWPSEC Firewall#is'; + } + + /** + * Our firewall code to insert + * + * @return string + */ + public function get_contents() { + $bootstrap_path = AIOWPSecurity_Utility_Firewall::get_bootstrap_path(); + + $code = "prepare('SELECT blocked_ip FROM '.AIOWPSEC_TBL_PERM_BLOCK.' WHERE block_reason=%s', $block_reason); + } + + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $result = $wpdb->get_results($sql, $output_type); + //The result returned by wp function is multi-dim array. Let's return a simple single dimensional array of ip addresses + if (!empty($result)) { + foreach ($result as $item) { + $blocked_ip_array[] = $item['blocked_ip']; + } + } + return $blocked_ip_array; + } + + /** + * Checks if an IP address is blocked permanently according to the database + * + * @param int $ip_address + * + * @return bool + */ + public static function is_ip_blocked($ip_address) { + global $wpdb; + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $blocked_record = $wpdb->get_row($wpdb->prepare('SELECT * FROM '.AIOWPSEC_TBL_PERM_BLOCK.' WHERE blocked_ip=%s', $ip_address)); + return !empty($blocked_record); + } + + /** + * Will add an IP address to the permanent block list + * + * @param int $ip_address + * @param string $reason + * @return bool - TRUE or FALSE on error + */ + public static function add_ip_to_block_list($ip_address, $reason = '') { + global $wpdb, $aio_wp_security; + $user = wp_get_current_user(); + $roles_allowed_to_block_ips = apply_filters('aio_roles_allowed_to_block_ips', array('administrator', 'editor', 'author')); + if ('spam_discard' != $reason && array_intersect($roles_allowed_to_block_ips, $user->roles) && AIOWPSecurity_Utility_IP::get_user_ip_address() == $ip_address) { + return false; + } + + //Check if this IP address is already in the block list + $blocked = AIOWPSecurity_Blocking::is_ip_blocked($ip_address); + $time_now = current_time('mysql'); + if (empty($blocked)) { + //Add this IP to the blocked table + $data = array( + 'blocked_ip'=>$ip_address, + 'block_reason'=>$reason, + 'blocked_date'=>$time_now + ); + $data = apply_filters('aiowps_pre_add_to_permanent_block', $data); + $perm_block_tbl_name = AIOWPSEC_TBL_PERM_BLOCK; + $country_origin = isset($data['country_origin']) ? $data['country_origin'] : ''; + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQLPlaceholders.QuotedSimplePlaceholder, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $sql = $wpdb->prepare("INSERT INTO ".$perm_block_tbl_name." (blocked_ip, block_reason, blocked_date, country_origin, created) VALUES ('%s', '%s', '%s', '%s', UNIX_TIMESTAMP())", $data['blocked_ip'], $data['block_reason'], $data['blocked_date'], $country_origin); + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Ignore. + $res = $wpdb->query($sql); + if (false === $res) { + $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_Blocking::add_ip_to_block_list - Error inserting record into AIOWPSEC_TBL_PERM_BLOCK table for IP ".$ip_address); + return false; + } + return true; + } + return true; + } + + public static function unblock_ip($ip_address) { + global $wpdb; + $where = array('blocked_ip' => $ip_address); + // phpcs:ignore WordPress.DB -- PCP error. Direct call necessary. No caching needed. + $result = $wpdb->delete(AIOWPSEC_TBL_PERM_BLOCK, $where); + return $result; + } + + /** + * Will check the current visitor IP against the blocked table + * If IP present will block the visitor from viewing the site + */ + public static function check_visitor_ip_and_perform_blocking() { + global $aio_wp_security; + $visitor_ip = AIOWPSecurity_Utility_IP::get_user_ip_address(); + $ip_type = WP_Http::is_ip_address($visitor_ip); + if (empty($ip_type)) { + $aio_wp_security->debug_logger->log_debug("do_general_ip_blocking_tasks: ".$visitor_ip." is not a valid IP!", 4); + return; + } + + //Check if this IP address is in the block list + $blocked = AIOWPSecurity_Blocking::is_ip_blocked($visitor_ip); + //TODO - future feature: add blocking whitelist and check + + if (empty($blocked)) { + return; //Visitor IP is not blocked - allow page to load + } else { + //block this visitor!! + $redirect_url = sanitize_url(apply_filters('aios_blocked_request_redirect_url', 'http://127.0.0.1')); + AIOWPSecurity_Utility::redirect_to_url($redirect_url); + } + return; + + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-captcha.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-captcha.php new file mode 100755 index 00000000..8c580dab --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-captcha.php @@ -0,0 +1,941 @@ +upgrade_captcha_options(); + add_action('login_enqueue_scripts', array($this, 'aiowps_login_enqueue')); + add_filter('script_loader_tag', array($this, 'add_cfasync_data_attribute_to_captcha_tag'), 10, 2); + + + if (AIOWPSecurity_Utility::is_contact_form_7_plugin_active() && '1' == $aio_wp_security->configs->get_value('aiowps_enable_contact_form_7_captcha')) { + add_action('wpcf7_admin_init', array($this, 'add_contact_form_7_captcha_tag_generator_button'), 100, 0); + add_filter('wpcf7_contact_form_properties', array($this, 'add_contact_form_7_captcha')); + add_filter('wpcf7_validate', array($this, 'verify_contact_form_7_captcha'), 10, 2); + } + } + + + /** + * This method modifies the script tag output by adding 'data-cfasync="false"' attribute, + * which is used to disable Cloudflare Rocket Loader for the specified captcha script handle. + * + * @param string $tag - The generated HTML tag for the script. + * @param string $handle - The script handle being processed. + * + * @return string The modified HTML tag with 'data-cfasync="false"' if applicable. + */ + public function add_cfasync_data_attribute_to_captcha_tag($tag, $handle) { + global $aio_wp_security; + + // Get the default captcha from AIO WP Security configurations + $default_captcha = $aio_wp_security->configs->get_value('aiowps_default_captcha'); + + // Check if the current script handle matches the default captcha handle + if ($default_captcha === $handle) { + if (!preg_match('/\sdata-cfasync\s*=\s*["\']false["\']/', $tag)) { + // Add 'data-cfasync="false"' attribute to the script tag + $tag = str_replace('src=', 'data-cfasync="false" src=', $tag); + } + } + + // Return the modified or original script tag + return $tag; + } + + /** + * This function handles upgrading captcha options + * + * @return void + */ + private function upgrade_captcha_options() { + global $aio_wp_security; + + if (!empty($aio_wp_security->configs->get_value('aiowps_default_captcha'))) return; + + // Upgrade the default captcha option + if ($aio_wp_security->configs->get_value('aiowps_default_recaptcha')) { + $aio_wp_security->configs->set_value('aiowps_default_recaptcha', ''); + $aio_wp_security->configs->set_value('aiowps_default_captcha', 'google-recaptcha-v2'); + } elseif ('1' == $aio_wp_security->configs->get_value('aiowps_enable_login_captcha') || '1' == $aio_wp_security->configs->get_value('aiowps_enable_registration_page_captcha')) { + $aio_wp_security->configs->set_value('aiowps_default_captcha', 'simple-math'); + } else { + $aio_wp_security->configs->set_value('aiowps_default_captcha', 'none'); + } + } + + /** + * This function will return an array of supported CAPTCHA options + * + * @return array - an array of supported CAPTCHA options + */ + public function get_supported_captchas() { + return array( + 'none' => 'No CAPTCHA', + 'cloudflare-turnstile' => 'Cloudflare Turnstile', + 'google-recaptcha-v2' => 'Google reCAPTCHA V2', + 'simple-math' => 'Simple math CAPTCHA' + ); + } + + /** + * This function will return an array of supported CAPTCHA themes + * + * @return array - an array of supported CAPTCHA themes + */ + public function get_captcha_themes() { + return array( + 'auto' => __('Auto', 'all-in-one-wp-security-and-firewall'), + 'light' => __('Light', 'all-in-one-wp-security-and-firewall'), + 'dark' => __('Dark', 'all-in-one-wp-security-and-firewall'), + ); + } + + /** + * Enqueues the CAPTCHA script for the default CAPTCHA on the standard WP login page + * + * @return void + */ + public function aiowps_login_enqueue() { + global $aio_wp_security; + + if ($aio_wp_security->is_login_lockdown_by_const()) return; + + if ('1' != $aio_wp_security->configs->get_value('aiowps_enable_login_captcha') && '1' != $aio_wp_security->configs->get_value('aiowps_enable_registration_page_captcha')) return; + + $default_captcha = $aio_wp_security->configs->get_value('aiowps_default_captcha'); + + switch ($default_captcha) { + case 'cloudflare-turnstile': + case 'google-recaptcha-v2': + wp_enqueue_script($default_captcha, $this->get_captcha_script_url($default_captcha), array()); + // Below is needed to provide some space for the CAPTCHA form (otherwise it appears partially hidden on RHS) + wp_add_inline_style('login', "#login { width: 340px; }"); + break; + default: + break; + } + } + + /** + * If the user is not on the WooCommerce account page, enqueue the CAPTCHA script in the wp_head for general pages + * Caters for scenarios when CAPTCHA is used on wp comments or custom wp login form pages + * + * @return void + */ + public function add_captcha_script() { + global $aio_wp_security; + + // Do NOT enqueue if this is the main WooCommerce account login page because for WooCommerce page we "explicitly" render the reCAPTCHA widget + $is_woo = false; + + // We don't want to load for Woo account page because we have a special function for this + if (function_exists('is_account_page')) $is_woo = is_account_page(); + + if (!empty($is_woo)) return; + + $default_captcha = $aio_wp_security->configs->get_value('aiowps_default_captcha'); + + switch ($default_captcha) { + case 'cloudflare-turnstile': + case 'google-recaptcha-v2': + wp_enqueue_script($default_captcha, $this->get_captcha_script_url($default_captcha), array()); + break; + default: + break; + } + } + + /** + * Renders CAPTCHA on form produced by the wp_login_form() function, ie, custom wp login form + * + * @param string $cust_html_code + * + * @return string + */ + public function insert_captcha_custom_login($cust_html_code) { + global $aio_wp_security; + + if ($aio_wp_security->is_login_lockdown_by_const()) return ''; + + $default_captcha = $aio_wp_security->configs->get_value('aiowps_default_captcha'); + + switch ($default_captcha) { + case 'cloudflare-turnstile': + case 'google-recaptcha-v2': + $cust_html_code .= $this->get_captcha_form($default_captcha, 0, true); + return $cust_html_code; + break; + case 'simple-math': + $maths_captcha_input_id = uniqid('aiowps-captcha-answer-'); // Generate a unique DOM-safe ID for the maths captcha input field to avoid duplicate IDs (when multiple forms appear on the same page). + $cap_form = '

'; + $cap_form .= '

'; + $maths_question_output = $aio_wp_security->captcha_obj->generate_maths_question($maths_captcha_input_id); + $cap_form .= $maths_question_output . '

'; + + $cust_html_code .= $cap_form; + return $cust_html_code; + break; + default: + return ''; + break; + } + } + + /** + * Inserts captcha into the password-protected page form. + * + * @param string $cust_html_code The HTML code for the password form. + * @return string The modified HTML code with the captcha inserted. + */ + public function insert_captcha_password_protected($cust_html_code) { + global $post, $aio_wp_security; + + $loginurl = esc_url(site_url('/wp-login.php?action=postpass')); + + $label = 'pwbox-' . empty($post->ID) ? rand() : $post->ID; + $default_captcha = $aio_wp_security->configs->get_value('aiowps_default_captcha'); + + $cust_html_code = '
+
+ + + '; + switch ($default_captcha) { + case 'cloudflare-turnstile': + case 'google-recaptcha-v2': + $cust_html_code .= $this->get_captcha_form($default_captcha, 0, true); + $this->add_captcha_script(); + break; + case 'simple-math': + $maths_captcha_input_id = uniqid('aiowps-captcha-answer-'); // Generate a unique DOM-safe ID for the maths captcha input field to avoid duplicate IDs (when multiple forms appear on the same page). + $captcha_form = '

'; + $captcha_form .= '

'; + $maths_question_output = $aio_wp_security->captcha_obj->generate_maths_question($maths_captcha_input_id); + $captcha_form .= $maths_question_output . '

'; + $cust_html_code .= $captcha_form; + break; + default: + break; + } + $cust_html_code .= ' +
+
'; + return $cust_html_code; + } + + /** + * Validates the password form on password protected pages with captcha. + * + * @return void + */ + public function validate_password_protected_password_form_with_captcha() { + // Check password protected page captcha + $verify = $this->verify_captcha_submit(); + if (!$verify) { + wp_die(__('Captcha verification failed.', 'all-in-one-wp-security-and-firewall'). ' ' . __('Please try again.', 'all-in-one-wp-security-and-firewall')); + } + } + + /** + * Insert CAPTCHA question form on WooCommerce my account page forms or other forms. + * + * This function determines the type of CAPTCHA to display based on the configured default CAPTCHA type. + * It handles special cases for WooCommerce "my account" page where both login and register forms need + * CAPTCHAs rendered explicitly. For other forms, it renders CAPTCHA normally. + * + * @global object $aio_wp_security The global instance of the aio_wp_security class, which holds configuration settings. + * + * @return void + */ + public function insert_captcha_question_form() { + global $aio_wp_security; + + $default_captcha = $aio_wp_security->configs->get_value('aiowps_default_captcha'); + + switch ($default_captcha) { + case 'cloudflare-turnstile': + case 'google-recaptcha-v2': + // WooCommerce "my account" page needs special consideration, ie, + // need to display two CAPTCHA forms on same page (for login and register forms) + // For this case we use the "explicit" CAPTCHA display + $calling_hook = current_filter(); + if ('woocommerce_login_form' == $calling_hook || 'woocommerce_lostpassword_form' == $calling_hook || 'woocommerce_after_checkout_billing_form' == $calling_hook) { + $this->get_captcha_form($default_captcha, 1); + return; + } + + if ('woocommerce_register_form' == $calling_hook) { + $this->get_captcha_form($default_captcha, 1); + return; + } + + // For all other forms simply display CAPTCHA as normal + $this->display_captcha_form($default_captcha); + break; + case 'simple-math': + // Display plain maths CAPTCHA form + $this->display_captcha_form($default_captcha); + break; + default: + break; + } + } + + /** + * For WooCommerce my account page - display two separate CAPTCHA forms "explicitly" + * + * @return void + */ + public function print_captcha_api_woo() { + global $aio_wp_security; + + + //captcha should only show for woo account and checkout page + if ((function_exists('is_account_page') && !is_account_page()) && (function_exists('is_checkout') && !is_checkout()) && !apply_filters('aios_print_captcha_api_woo', false)) return; + + $default_captcha = $aio_wp_security->configs->get_value('aiowps_default_captcha'); + + if ('cloudflare-turnstile' == $default_captcha) : + $site_key = esc_html($aio_wp_security->configs->get_value('aiowps_turnstile_site_key')); + ?> + + configs->get_value('aiowps_recaptcha_site_key')); + ?> + + + configs->get_value('aiowps_enable_bp_register_captcha') == '1' && defined('BP_VERSION')) { + //if buddy press feature active add action hook so buddy press can display our errors properly on bp registration form + do_action('bp_aiowps-captcha-answer_errors'); + } + + switch ($default_captcha) { + case 'cloudflare-turnstile': + if ('1' == $aio_wp_security->configs->get_value('aios_cloudflare_turnstile_invalid_configuration')) return; + if ($return_instead_of_echo) return $this->get_captcha_form($default_captcha, 0, $return_instead_of_echo); + $this->get_captcha_form($default_captcha); + break; + case 'google-recaptcha-v2': + if ('1' == $aio_wp_security->configs->get_value('aios_google_recaptcha_invalid_configuration')) return; + if ($return_instead_of_echo) return $this->get_captcha_form($default_captcha, 0, $return_instead_of_echo); + $this->get_captcha_form($default_captcha); + break; + case 'simple-math': + $maths_captcha_input_id = uniqid('aiowps-captcha-answer-'); // Generate a unique DOM-safe ID for the maths captcha input field to avoid duplicate IDs (when multiple forms appear on the same page). + $cap_form = '

'; + $cap_form .= '

'; + $maths_question_output = $this->generate_maths_question($maths_captcha_input_id); + $cap_form .= $maths_question_output . '

'; + if ($return_instead_of_echo) return $cap_form; + echo $cap_form; + break; + } + } + + /** + * It generates a random math problem, stores the answer in the database, and returns the math problem + * + * @param string $maths_captcha_input_id A unique identifier used for the captcha input field's ID attribute to prevent duplicate IDs in the DOM (e.g., when multiple forms exist on a page). + * + * @return string - contains the HTML for the captcha. + */ + private function generate_maths_question($maths_captcha_input_id) { + global $aio_wp_security; + //For now we will only do plus, minus, multiplication + $equation_string = ''; + $operator_type = array('+', '−', '×'); + + $operand_display = array('word', 'number'); + + //let's now generate an equation + $operator = $operator_type[rand(0, 2)]; + + if ('×' === $operator) { + //Don't make the question too hard if multiplication + $first_digit = rand(1, 5); + $second_digit = rand(1, 5); + } else { + $first_digit = rand(1, 20); + $second_digit = rand(1, 20); + } + + if ('word' == $operand_display[rand(0, 1)]) { + $first_operand = $this->number_word_mapping($first_digit); + } else { + $first_operand = $first_digit; + } + + if ('word' == $operand_display[rand(0, 1)]) { + $second_operand = $this->number_word_mapping($second_digit); + } else { + $second_operand = $second_digit; + } + + //Let's calculate the result and construct the equation string + if ('+' === $operator) { + //Addition + $result = $first_digit+$second_digit; + $equation_string .= $first_operand . ' ' . $operator . ' ' . $second_operand . ' = '; + } elseif ('−' === $operator) { + //Subtraction + //If we are going to be negative let's swap operands around + if ($first_digit < $second_digit) { + $equation_string .= $second_operand . ' ' . $operator . ' ' . $first_operand . ' = '; + $result = $second_digit-$first_digit; + } else { + $equation_string .= $first_operand . ' ' . $operator . ' ' . $second_operand . ' = '; + $result = $first_digit-$second_digit; + } + } elseif ('×' === $operator) { + //Multiplication + $equation_string .= $first_operand . ' ' . $operator . ' ' . $second_operand . ' = '; + $result = $first_digit*$second_digit; + } + + //Let's encode correct answer + $captcha_secret_string = $aio_wp_security->configs->get_value('aiowps_captcha_secret_key'); + $current_time = time(); + $enc_result = base64_encode($current_time.$captcha_secret_string.$result); + $random_str = AIOWPSecurity_Utility::generate_alpha_numeric_random_string(10); + if (is_multisite()) { + update_site_option('aiowps_captcha_string_info_'.$random_str, $enc_result); + update_site_option('aiowps_captcha_string_info_time_'.$random_str, $current_time); + } else { + update_option('aiowps_captcha_string_info_'.$random_str, $enc_result, false); + update_option('aiowps_captcha_string_info_time_'.$random_str, $current_time, false); + } + $equation_string .= ''; + $equation_string .= ''; + $equation_string .= ''; + return $equation_string; + } + + /** + * This function takes a number and returns the word that represents that number + * + * @param integer $num - the number we want to map to a word + * + * @return string - the mapped word + */ + private function number_word_mapping($num) { + $number_map = array( + 1 => __('one', 'all-in-one-wp-security-and-firewall'), + 2 => __('two', 'all-in-one-wp-security-and-firewall'), + 3 => __('three', 'all-in-one-wp-security-and-firewall'), + 4 => __('four', 'all-in-one-wp-security-and-firewall'), + 5 => __('five', 'all-in-one-wp-security-and-firewall'), + 6 => __('six', 'all-in-one-wp-security-and-firewall'), + 7 => __('seven', 'all-in-one-wp-security-and-firewall'), + 8 => __('eight', 'all-in-one-wp-security-and-firewall'), + 9 => __('nine', 'all-in-one-wp-security-and-firewall'), + 10 => __('ten', 'all-in-one-wp-security-and-firewall'), + 11 => __('eleven', 'all-in-one-wp-security-and-firewall'), + 12 => __('twelve', 'all-in-one-wp-security-and-firewall'), + 13 => __('thirteen', 'all-in-one-wp-security-and-firewall'), + 14 => __('fourteen', 'all-in-one-wp-security-and-firewall'), + 15 => __('fifteen', 'all-in-one-wp-security-and-firewall'), + 16 => __('sixteen', 'all-in-one-wp-security-and-firewall'), + 17 => __('seventeen', 'all-in-one-wp-security-and-firewall'), + 18 => __('eighteen', 'all-in-one-wp-security-and-firewall'), + 19 => __('nineteen', 'all-in-one-wp-security-and-firewall'), + 20 => __('twenty', 'all-in-one-wp-security-and-firewall'), + ); + return $number_map[$num]; + } + + /** + * This function will return the CAPTCHA script URL + * + * @param string $default_captcha - the default CAPTCHA + * + * @return string - the CAPTCHA script URL + */ + private function get_captcha_script_url($default_captcha) { + $url = ''; + switch ($default_captcha) { + case 'cloudflare-turnstile': + $url = 'https://challenges.cloudflare.com/turnstile/v0/api.js'; + break; + case 'google-recaptcha-v2': + $url = 'https://www.google.com/recaptcha/api.js?hl=' . $this->get_google_recaptcha_compatible_site_locale(); + break; + default: + break; + } + + return $url; + } + + /** + * This function will return the CAPTCHA form + * + * @param string $default_captcha - the default CAPTCHA + * @param integer $include_wc_id - the WooCommerce form id to include, if 0 no id is included if 1 dynamic id included + * @param boolean $return_instead_of_echo - if we should return the form rather than echo it to page + * + * @return string - can return the CAPTCHA form + */ + public function get_captcha_form($default_captcha, $include_wc_id = 0, $return_instead_of_echo = false) { + global $aio_wp_security; + static $aios_wc_element_id; + $captcha_form = ''; + $captcha_data_callback = ''; + $wc_form_id = !empty($include_wc_id) ? 'id="woo_recaptcha_'.(++$aios_wc_element_id).'"' : ''; + $captcha_data_callback = apply_filters('aios_captcha_data_callback', false) ? ' data-callback="data_callback"' : ''; + + switch ($default_captcha) { + case 'cloudflare-turnstile': + $site_key = esc_html($aio_wp_security->configs->get_value('aiowps_turnstile_site_key')); + $turnstile_theme = esc_html($aio_wp_security->configs->get_value('aiowps_turnstile_theme')); + if (empty($turnstile_theme)) $turnstile_theme = 'auto'; + $captcha_form = '
'; + break; + case 'google-recaptcha-v2': + $site_key = esc_html($aio_wp_security->configs->get_value('aiowps_recaptcha_site_key')); + $captcha_form = '
'; + break; + default: + return ''; + break; + } + + if ($return_instead_of_echo) return $captcha_form; + echo $captcha_form; + } + + /** + * Verifies the math or Google reCAPTCHA v2 forms + * Returns TRUE if correct answer. + * Returns FALSE on wrong CAPTCHA result or missing data. + * + * @return boolean + */ + public function verify_captcha_submit() { + global $aio_wp_security; + + $default_captcha = $aio_wp_security->configs->get_value('aiowps_default_captcha'); + + switch ($default_captcha) { + case 'cloudflare-turnstile': + // Cloudflare Turnstile enabled + if ('1' == $aio_wp_security->configs->get_value('aios_cloudflare_turnstile_invalid_configuration')) return true; + + // Expected CAPTCHA field in $_POST but got none! + if (!array_key_exists('cf-turnstile-response', $_POST)) return false; + + $cf_turnstile_response = isset($_POST['cf-turnstile-response']) ? stripslashes($_POST['cf-turnstile-response']) : ''; + $verify_captcha = $this->verify_turnstile_recaptcha($cf_turnstile_response); + return $verify_captcha; + break; + case 'google-recaptcha-v2': + // Google reCAPTCHA enabled + if ('1' == $aio_wp_security->configs->get_value('aios_google_recaptcha_invalid_configuration')) return true; + + // Expected CAPTCHA field in $_POST but got none! + if (!array_key_exists('g-recaptcha-response', $_POST)) return false; + + $g_recaptcha_response = isset($_POST['g-recaptcha-response']) ? stripslashes($_POST['g-recaptcha-response']) : ''; + $verify_captcha = $this->verify_google_recaptcha($g_recaptcha_response); + return $verify_captcha; + break; + case 'simple-math': + // Math CAPTCHA is enabled + if (!array_key_exists('aiowps-captcha-answer', $_POST)) return false; + $captcha_answer = isset($_POST['aiowps-captcha-answer']) ? stripslashes($_POST['aiowps-captcha-answer']) : ''; + + $verify_captcha = $this->verify_math_captcha_answer($captcha_answer); + return $verify_captcha; + break; + default: + return true; + break; + } + } + + /** + * Verifies the math CAPTCHA answer entered by the user + * + * @param type $captcha_answer + * + * @return boolean + */ + private function verify_math_captcha_answer($captcha_answer = '') { + global $aio_wp_security; + $captcha_secret_string = $aio_wp_security->configs->get_value('aiowps_captcha_secret_key'); + $captcha_temp_string = sanitize_text_field($_POST['aiowps-captcha-temp-string']); + $submitted_encoded_string = base64_encode($captcha_temp_string.$captcha_secret_string.$captcha_answer); + $trans_handle = sanitize_text_field($_POST['aiowps-captcha-string-info']); + if (is_multisite()) { + $captcha_string_info_option = get_site_option('aiowps_captcha_string_info_'.$trans_handle); + } else { + $captcha_string_info_option = get_option('aiowps_captcha_string_info_'.$trans_handle); + } + if ($submitted_encoded_string === $captcha_string_info_option) { + return true; + } else { + return false; // wrong answer was entered + } + } + + /** + * Send a query to Cloudflare API to verify Turnstile submission + * + * @param string $resp_token + * + * @return boolean + */ + private function verify_turnstile_recaptcha($resp_token = '') { + global $aio_wp_security; + + $url = $this->cloudflare_verify_turnstile_url; + $secret = $aio_wp_security->configs->get_value('aiowps_turnstile_secret_key'); + return $this->verify_captcha_response($url, $secret, $resp_token); + } + + /** + * Send a query to Google API to verify reCAPTCHA submission + * + * @param string $resp_token + * + * @return boolean + */ + private function verify_google_recaptcha($resp_token = '') { + global $aio_wp_security; + + $url = $this->google_verify_recaptcha_url; + $secret = $aio_wp_security->configs->get_value('aiowps_recaptcha_secret_key'); + return $this->verify_captcha_response($url, $secret, $resp_token); + } + + /** + * This function sends a remote request to verify the captcha response. + * + * @param string $url - The URL to the CAPTCHA API. + * @param string $secret - The secret key you got from the CAPTCHA provider. + * @param string $resp_token - The value of the CAPTCHA response form field. + * + * @return boolean - true if valid otherwise false + */ + private function verify_captcha_response($url, $secret, $resp_token) { + + $is_humanoid = false; + + if (empty($resp_token)) return $is_humanoid; + + $ip_address = AIOWPSecurity_Utility_IP::get_user_ip_address(); + $response = wp_safe_remote_post($url, array( + 'body' => array( + 'secret' => $secret, + 'response' => $resp_token, + 'remoteip' => $ip_address, + ), + )); + + if (wp_remote_retrieve_response_code($response) != 200) return $is_humanoid; + + $response = wp_remote_retrieve_body($response); + $response = json_decode($response, true); + + if (isset($response['success']) && true == $response['success']) $is_humanoid = true; + + // We did not get a success response so check for the "timeout-or-duplicate" error code because it's possible we have sent this request a second time if another plugin has recalled the WP authentication code and this error code means the captcha has already been solved so return success + if (isset($response['error-codes']) && in_array('timeout-or-duplicate', $response['error-codes'])) $is_humanoid = true; + + return $is_humanoid; + } + + /** + * Get site locale code for Google reCaptcha. + * + * @return string The site locale code. + */ + private function get_google_recaptcha_compatible_site_locale() { + $google_recaptcha_locale_codes = AIOS_Abstracted_Ids::get_google_recaptcha_locale_codes(); + $locale = str_replace('_', '-', determine_locale()); + + if (in_array($locale, $google_recaptcha_locale_codes, true)) { + return $locale; + } + + // Return 2 letter locale code. + $locale = explode('-', $locale); + return $locale[0]; + } + + /** + * Verify Cloudflare Turnstile configuration. + * + * @param String $site_key + * @param String $secret_key + * + * @return Boolean + */ + public function cloudflare_turnstile_verify_configuration($site_key, $secret_key) { + if (empty($site_key) || empty($secret_key)) return false; + return true; + } + + /** + * Verify Google reCAPTCHA configuration. + * + * @param String $site_key + * @param String $secret_key + * + * @return Boolean + */ + public function google_recaptcha_verify_configuration($site_key, $secret_key) { + $site_key_verify_params = array('k' => $site_key, 'size' => 'checkbox'); + $site_key_verify_url = esc_url(add_query_arg($site_key_verify_params, 'https://www.google.com/recaptcha/api2/anchor')); + $site_key_verify_response_body = wp_remote_retrieve_body(wp_remote_get($site_key_verify_url)); + + $secret_key_verify_params = array('secret' => $secret_key); + $secret_key_verify_url = esc_url(add_query_arg($secret_key_verify_params, $this->google_verify_recaptcha_url)); + $secret_key_verify_response_body = wp_remote_retrieve_body(wp_remote_get($secret_key_verify_url)); + $secret_key_verify_json = json_decode($secret_key_verify_response_body, true); + + if (false !== strpos($site_key_verify_response_body, 'Invalid site key') || is_null($secret_key_verify_json) || (isset($secret_key_verify_json['error-codes']) && in_array('invalid-input-secret', $secret_key_verify_json['error-codes']))) { + return false; + } else { + return true; + } + } + + /** + * This function adds captcha to contact form 7 + * + * @param array $form_properties - this is the array containing properties for the form + * + * @return array $form_properties - containing the edited form with the captcha if everything is set + */ + public function add_contact_form_7_captcha($form_properties) { + global $aio_wp_security; + + if (!class_exists('WPCF7_RECAPTCHA') || is_admin()) return $form_properties; // if wpc7_recaptcha does not exist or the call is from the admin page + + $recaptcha_service = WPCF7_RECAPTCHA::get_instance(); + + // if recaptcha is active return form + if ($recaptcha_service->is_active()) return $form_properties; + + $default_captcha = $aio_wp_security->configs->get_value('aiowps_default_captcha'); + + // check if default captcha configuration is correct + if (!$this->verify_captcha_configuration($default_captcha)) { + $aio_wp_security->debug_logger->log_debug("The captcha $default_captcha is not correctly configured", 4); + return $form_properties; + } + $form = isset($form_properties['form']) ? $form_properties['form'] : ''; + if (empty($form)) return $form_properties; + + // enqueue script + wp_enqueue_script($default_captcha, $this->get_captcha_script_url($default_captcha), array()); + + $field = $this->display_captcha_form($default_captcha, true); + $field .= ""; // add validation field for the captcha + $captcha_shortcode = sprintf('[%s]', AIOWPSEC_CAPTCHA_SHORTCODE); + + if (false !== strpos($form, $captcha_shortcode)) { + $replacement_string = $captcha_shortcode; + } else { + $replacement_string = '[submit'; + // if shortcode doesn't exist in form then use the submit button as placement for the captcha + if (false !== stripos($form, $replacement_string)) { + $field .= $replacement_string; + } else { + $pattern = '/]+type\s*=\s*(["\']?)submit\\1[^>]*>/i'; + + if (preg_match($pattern, $form, $matches)) { + $field .= $matches[0]; + $replacement_string = $matches[0]; + } + } + } + // replace first occurence of replacement string + $form = preg_replace('/' . preg_quote($replacement_string, '/') . '/', $field, $form, 1); + $form_properties['form'] = $form; + + return $form_properties; + } + + /** + * This verifies contact form 7 captcha + * + * @param WPCF7_Validation $result - This is the form result from contact form 7 plugin + * @return WPCF7_Validation - The validation for a contact form 7 form + */ + public function verify_contact_form_7_captcha($result) { + if (!class_exists('WPCF7_Submission') || !class_exists('WPCF7_RECAPTCHA')) return $result; + + $recaptcha_service = WPCF7_RECAPTCHA::get_instance(); + // if recaptcha is active return result + if ($recaptcha_service->is_active()) return $result; + + $post = WPCF7_Submission::get_instance(); + $message = __('Your CAPTCHA answer was incorrect - please try again.', 'all-in-one-wp-security-and-firewall'); + + if (!empty($post)) { + $data = $post->get_posted_data(); + $field_name = $this->get_contact_form_7_captcha_post_field_name(); + + if (empty($field_name) || false === array_key_exists($field_name, $data)) return $result; // if field name is empty or field doesn't exist return + + if (empty($data[$field_name])) { + $result->invalidate(array('type' => 'captcha', 'name' => 'aiowps-captcha'), $message); + return $result; + } + + $verify = $this->verify_captcha_submit(); + if (!$verify) { + $result->invalidate(array('type' => 'captcha', 'name' => 'aiowps-captcha'), $message); + return $result; + } + } + + return $result; + } + + /** + * This function gets the field name for the captcha + * + * @return string - The field name for the CAPTCHA if the feature is activated, an empty string if it's not + */ + private function get_contact_form_7_captcha_post_field_name() { + global $aio_wp_security; + + $default_captcha = $aio_wp_security->configs->get_value('aiowps_default_captcha'); + $field = ''; + + switch ($default_captcha) { + case 'cloudflare-turnstile': + $field = 'cf-turnstile-response'; + break; + case 'google-recaptcha-v2': + $field = 'g-recaptcha-response'; + break; + case 'simple-math': + $field = 'aiowps-captcha-answer'; + break; + } + + return $field; + } + + /** + * This checks if the default captcha is configured correctly + * + * @param string $default_captcha - the default CAPTCHA + * + * @return bool - True if the captcha configuration is correct, otherwise false. + */ + public function verify_captcha_configuration($default_captcha) { + global $aio_wp_security; + + if (empty($default_captcha)) return false; + + $verify = true; + + switch ($default_captcha) { + case 'cloudflare-turnstile': + $verify = $this->cloudflare_turnstile_verify_configuration($aio_wp_security->configs->get_value('aiowps_turnstile_site_key'), $aio_wp_security->configs->get_value('aiowps_turnstile_secret_key')); + break; + case 'google-recaptcha-v2': + $verify = $this->google_recaptcha_verify_configuration($aio_wp_security->configs->get_value('aiowps_recaptcha_site_key'), $aio_wp_security->configs->get_value('aiowps_recaptcha_secret_key')); + break; + } + + return $verify; + } + + /** + * This function adds the aiowps contact form 7 CAPTCHA + * + * @return void + */ + public function add_contact_form_7_captcha_tag_generator_button() { + if (!class_exists('WPCF7_TagGenerator')) return; + + $tag_generator = WPCF7_TagGenerator::get_instance(); + $tag_generator->add('aios-captcha', sprintf(__('%s captcha', 'all-in-one-wp-security-and-firewall'), 'aios'), array($this, 'contact_form_7_tag_generator_button'), ''); + } + + /** + * This function is the callback for adding the captcha tag + * + * @return void + */ + public function contact_form_7_tag_generator_button() { + $type = AIOWPSEC_CAPTCHA_SHORTCODE; + ?> +
+
+ +
+
+
+ +
+ +
+
+ verify_captcha_submit()) { + $errors[] = sprintf(__('%s: Your answer was incorrect - please try again.', 'all-in-one-wp-security-and-firewall'), '' . __('ERROR', 'all-in-one-wp-security-and-firewall') . ''); + } + + return $errors; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-cleanup.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-cleanup.php new file mode 100755 index 00000000..f3345fd8 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-cleanup.php @@ -0,0 +1,48 @@ +aiowps_feature_mgr)) return true; + + $this->aiowps_feature_mgr = new AIOWPSecurity_Feature_Item_Manager(); + + $initialized = true; + + return true; + } + + /** + * Retrieves the feature manager object. + * + * This method initializes the feature manager if necessary and returns the + * AIOWPSecurity_Feature_Item_Manager instance. If the initialization fails or + * the feature manager object is empty, it returns a WP_Error. + * + * @return AIOWPSecurity_Feature_Item_Manager|WP_Error + */ + private function get_feature_mgr_object() { + + $do_init = $this->feature_mgr_init(); + + if (true === $do_init && !empty($this->aiowps_feature_mgr)) return $this->aiowps_feature_mgr; + + return new WP_Error('not_initialized', __('The feature item manager could not be initialized.', 'all-in-one-wp-security-and-firewall')); + } + + /** + * Get IP address of given method. + * + * @param array $data - the request data + * + * @return array|WP_Error - an array response or a WP_Error if there was an error + */ + public function get_ip_address_of_given_method($data) { + $ip_method_id = $data['ip_retrieve_method']; + $ip_retrieve_methods = AIOS_Abstracted_Ids::get_ip_retrieve_methods(); + if (isset($ip_retrieve_methods[$ip_method_id])) { + return array( + 'ip_address' => isset($_SERVER[$ip_retrieve_methods[$ip_method_id]]) ? sanitize_text_field(wp_unslash($_SERVER[$ip_retrieve_methods[$ip_method_id]])) : '', + ); + } else { + return new WP_Error('aios-invalid-ip-retrieve-method', __('Invalid IP retrieve method.', 'all-in-one-wp-security-and-firewall')); + } + die; + } + + /** + * Dismiss a notice + * + * @param array $data - the request data contains the notice to dismiss + * + * @return array + */ + public function dismiss_notice($data) { + global $aio_wp_security; + + $time_now = $aio_wp_security->notices->get_time_now(); + + if (in_array($data['notice'], array('dismissdashnotice', 'dismiss_season'))) { + $aio_wp_security->configs->set_value($data['notice'], $time_now + (366 * 86400)); + } elseif (in_array($data['notice'], array('dismiss_page_notice_until', 'dismiss_notice'))) { + $aio_wp_security->configs->set_value($data['notice'], $time_now + (84 * 86400)); + } elseif ('dismiss_review_notice' == $data['notice']) { + if (empty($data['dismiss_forever'])) { + $aio_wp_security->configs->set_value($data['notice'], $time_now + (84 * 86400)); + } else { + $aio_wp_security->configs->set_value($data['notice'], $time_now + (100 * 365.25 * 86400)); + } + } elseif ('dismiss_automated_database_backup_notice' == $data['notice']) { + $aio_wp_security->delete_automated_backup_configs(); + } elseif ('dismiss_ip_retrieval_settings_notice' == $data['notice']) { + $aio_wp_security->configs->set_value($data['notice'], 1); + } elseif ('dismiss_ip_retrieval_settings_notice' == $data['notice']) { + $aio_wp_security->configs->set_value('aiowps_is_login_whitelist_disabled_on_upgrade', 1); + } elseif ('dismiss_login_whitelist_disabled_on_upgrade_notice' == $data['notice']) { + if (isset($data['turn_it_back_on']) && '1' == $data['turn_it_back_on']) { + $aio_wp_security->configs->set_value('aiowps_enable_whitelisting', '1'); + } + $aio_wp_security->configs->delete_value('aiowps_is_login_whitelist_disabled_on_upgrade'); + } elseif ('dismiss_ip_blacklist_notice' == $data['notice']) { + if (isset($data['turn_it_back_on']) && '1' == $data['turn_it_back_on']) { + $aio_wp_security->configs->set_value('aiowps_enable_blacklisting', '1'); + AIOWPSecurity_Configure_Settings::set_blacklist_ip_firewall_configs(); + AIOWPSecurity_Configure_Settings::set_user_agent_firewall_configs(); + } + $aio_wp_security->configs->delete_value('aiowps_is_ip_blacklist_settings_notice_on_upgrade'); + } elseif ('dismiss_firewall_settings_disabled_on_upgrade_notice' == $data['notice']) { + $is_reactivated = (isset($data['turn_it_back_on']) && '1' == $data['turn_it_back_on']); + if ($is_reactivated) { + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + $active_settings = $aio_wp_security->configs->get_value('aiowps_firewall_active_upgrade'); + + if (!empty($active_settings)) { + $active_settings = json_decode($active_settings); + if (!empty($active_settings)) { + foreach ($active_settings as $setting) { + $aiowps_firewall_config->set_value($setting, true); + } + } + } + } + + $aio_wp_security->configs->delete_value('aiowps_firewall_active_upgrade'); + } elseif ('php_56_eol_dismiss_forever' == $data['notice']) { + $aio_wp_security->configs->set_value('php_56_eol_dismiss_forever', $time_now + (100 * 365.25 * 86400)); + } + + + $aio_wp_security->configs->save_config(); + + return array(); + } + + + /** + * This is a helper function to save settings options using key/value pairs + * + * @param array $options - An array of options to save to the config + * @param null $callback - A callback function to call when the options are saved + * + * @return bool + */ + public function save_settings($options, $callback = null) { + global $aio_wp_security; + + $aiowps_feature_mgr = $this->get_feature_mgr_object(); + if (is_wp_error($aiowps_feature_mgr)) return false; + + + foreach ($options as $key => $value) { + $aio_wp_security->configs->set_value($key, $value); + } + //commit the config changes + $aio_wp_security->configs->save_config(); + + if (is_callable($callback)) { + call_user_func($callback, $options); + } + + $aiowps_feature_mgr->calculate_total_feature_points(); + + return true; + } + + /** + * This is a helper function to get the output feature details badge + * + * @param string $feature_id - the id of the feature we want to get the badge for + * + * @return string + */ + public function get_feature_details_badge($feature_id) { + $aiowps_feature_mgr = $this->get_feature_mgr_object(); + if (is_wp_error($aiowps_feature_mgr)) return ''; + return $aiowps_feature_mgr->output_feature_details_badge($feature_id, true); + } + + /** + * Retrieves the IDs and HTML content for features. + * + * This method processes an array of features and returns an associative array containing + * the IDs and corresponding HTML content for each feature badge. + * + * @param array $features - An array containing the features to retrieve IDs and HTML for. + * + * @return array An associative array containing the IDs and HTML content for each feature badge. + */ + public function get_features_id_and_html($features) { + $result = array(); + foreach ($features as $feature) { + $result[] = array( + 'id' => '#' . $feature . '-badge', + 'html' => $this->get_feature_details_badge($feature) + ); + } + + return $result; + } + + /** + * Prepares and returns a structured response for AJAX commands. + * + * @param bool $success Indicates whether the operation was successful (true for success, false for failure). + * @param string|bool $message The message to include in the response (optional). + * If false, no message is passed with the response. + * If empty string, it defaults to a success or error message based on the $success flag. + * @param array $args Optional. An associative array of additional response data, such as badges, info, values, or content. + * + * @return array The constructed response array containing status, message, and any additional data from $args. + */ + public function handle_response($success, $message = '', $args = array()) { + $response = array( + 'status' => $success ? 'success' : 'error', + ); + + if (false !== $message) { + $response['message'] = $this->get_message($success, $message); + } + + $allowed_keys = array('badges', 'info', 'values', 'content', 'extra_args'); + foreach ($allowed_keys as $key) { + if (!empty($args[$key])) { + $response[$key] = 'badges' === $key ? $this->get_features_id_and_html($args[$key]) : $args[$key]; + } + } + + return $response; + } + + /** + * Get the appropriate message based on success flag and provided message. + * + * @param bool $success Indicates whether the operation was successful. + * @param string $message The provided message. + * + * @return string The final message to be used in the response. + */ + private function get_message($success, $message) { + if ('' === $message) { + return $success ? __('The settings have been successfully updated.', 'all-in-one-wp-security-and-firewall') : __('The settings update was unsuccessful.', 'all-in-one-wp-security-and-firewall'); + } + return $message; + } + + /** + * Get antibot keys for the spam detection + * + * @return array + */ + public function get_antibot_keys() { + global $aio_wp_security; + + $response = array( + 'status' => 'success', + 'data' => array(), + ); + + // phpcs:ignore WordPress.Security.NonceVerification.Missing -- PCP warning. It is the nonce. + $nonce = empty($_POST['nonce']) ? '' : sanitize_key(wp_unslash($_POST['nonce'])); + if (!wp_verify_nonce($nonce, 'wp-security-ajax-nonce')) { + $response['status'] = false; + $response['error_code'] = 'invalid_nonce'; + $response['error_message'] = 'Invalid nonce (wp-security-ajax-nonce) provided for this action.'; + } else { + $key_map_arr = AIOWPSecurity_Comment::generate_antibot_keys(true); + $response['data'] = $key_map_arr[0]; + if ('1' == $aio_wp_security->configs->get_value('aiowps_spambot_detect_usecookies')) { + AIOWPSecurity_Comment::insert_antibot_keys_in_cookie(); + } + } + + echo wp_json_encode($response); + exit; + } + + /** + * This function will send the diagnostic report email + * + * @param array $data - the request data + * + * @return array + */ + public function send_report_email($data) { + global $aio_wp_security; + + // Sanitize the email address first. + $sanitized_email = !empty($data['report_email']) ? sanitize_email($data['report_email']) : ''; + + if ('' === $sanitized_email || !is_email($sanitized_email)) { + return array( + 'status' => 'error', + 'message' => __('Invalid email address.', 'all-in-one-wp-security-and-firewall'), + ); + } + + $result = $aio_wp_security->debug_obj->send_report($sanitized_email, wp_kses_post(html_entity_decode($data['report_sections']))); + + if ($result) { + return array( + 'status' => 'success', + 'message' => __('The diagnostic report has been sent successfully.', 'all-in-one-wp-security-and-firewall'), + ); + } + + return array( + 'status' => 'error', + 'message' => __('There was an error sending the diagnostic report.', 'all-in-one-wp-security-and-firewall'), + ); + } + + /** + * Returns an array of translations used by the AIOS plugin. Primarily used for UpdraftCentral consumption. + * + * @param array $params - The parameters passed to the function. + * + * @return array - The AIOS translations array + */ + public function get_js_translation($params) { + $translations = array(); + + if (isset($params['return_formatted_response'])) { + return array( + 'error' => false, + 'data' => array( + 'translations' => $translations, + ) + ); + } + + return $translations; + } + + /** + * Get multiple widgets data. Primarily used for UpdraftCentral consumption. + * + * @param array $args - The arguments containing the widgets to retrieve data for. + * + * @return array - An array containing error status and data for each widget. + */ + public function get_widgets_data($args) { + // Widgets. + $widgets = isset($args['widgets']) ? $args['widgets'] : array(); + + // Return early if no widgets supplied. + if (!is_array($widgets) || empty($widgets)) { + return array('error' => false, 'data' => array()); + } + + // Get the data for each widget. + $data = array(); + + // Loop through the widgets and get their data. + foreach ($widgets as $widget) { + $method = 'get_' . $widget . '_data'; + + if (method_exists($this, $method)) { + $data[$widget] = $this->$method($args); + } + } + + return array('error' => false, 'data' => $data); + } + + /** + * Get the AIOS premium upsell data for UDC widget. + * + * @return array + */ + public function get_is_premium_data() { + $is_premium = AIOWPSecurity_Utility_Permissions::is_premium_installed(); + $upgrade_to_premium_data = array(); + + if (false === $is_premium) { + $upgrade_to_premium_data = array( + 'heading' => __('AIOS premium', 'all-in-one-wp-security-and-firewall'), + 'checklist' => array( + __('Advanced malware scanning', 'all-in-one-wp-security-and-firewall'), + __('Real-time response time monitoring', 'all-in-one-wp-security-and-firewall'), + __('Custom two-factor authentication', 'all-in-one-wp-security-and-firewall'), + __('404 error protection & bot blocking', 'all-in-one-wp-security-and-firewall'), + __('Country-based traffic blocking', 'all-in-one-wp-security-and-firewall'), + __('Country whitelist management', 'all-in-one-wp-security-and-firewall'), + __('Guaranteed premium support', 'all-in-one-wp-security-and-firewall'), + ), + 'cta' => array( + 'text' => __('Upgrade Now', 'all-in-one-wp-security-and-firewall'), + 'url' => 'https://teamupdraft.com/all-in-one-security/pricing/', + ), + ); + } + + return array( + 'is_premium' => $is_premium, + 'upgrade_to_premium_data' => $upgrade_to_premium_data, + ); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-comment.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-comment.php new file mode 100755 index 00000000..014654bd --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-comment.php @@ -0,0 +1,216 @@ +configs->get_value('aiowps_enable_trash_spam_comments') && absint($aio_wp_security->configs->get_value('aiowps_trash_spam_comments_after_days'))) { + $date_before = absint($aio_wp_security->configs->get_value('aiowps_trash_spam_comments_after_days')).' days ago'; + $comment_ids = get_comments(array( + 'fields' => 'ids', + 'status' => 'spam', + 'date_query' => array( + array( + 'before' => $date_before, + 'inclusive' => true, + ), + ) + )); + + if (!empty($comment_ids)) { + foreach ($comment_ids as $comment_id) { + wp_trash_comment($comment_id); + } + } + } + } + + /** + * Delete ip from aiowps_permanent_block table once the comment's spam status changed. + * + * @param object $comment_data comment object. + */ + public function comment_spam_status_change($comment_data) { + global $wpdb, $aio_wp_security; + $comment_ip = $comment_data->comment_author_IP; + // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- Direct query necessary. No caching required. + $total_spam_comment = $wpdb->get_var( + $wpdb->prepare("SELECT COUNT(*) FROM {$wpdb->comments} WHERE comment_author_IP = %s AND comment_approved = 'spam'", $comment_ip) + ); + $min_comment_before_block = $aio_wp_security->configs->get_value('aiowps_spam_ip_min_comments_block'); + if ($total_spam_comment < $min_comment_before_block) { + $where = array('blocked_ip' => $comment_ip, 'block_reason' => 'spam'); + // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- Direct query necessary. No caching required. + $wpdb->delete(AIOWPSEC_TBL_PERM_BLOCK, $where, array('%s')); + } + } + + /** + * Checks if comment posted by spambot. + * + * @return boolean. + */ + public static function is_comment_spam_detected() { + $return = false; + if (!is_user_logged_in()) { + if (empty($_SERVER['HTTP_REFERER']) || false === stristr(sanitize_url(wp_unslash($_SERVER['HTTP_REFERER'])), wp_parse_url(home_url(), PHP_URL_HOST)) || empty($_SERVER['HTTP_USER_AGENT'])) { + $return = true; + } elseif (self::is_bot_detected()) { + $return = true; + } + } + return apply_filters('aiowps_is_comment_spam_detected', $return); + } + + /** + * Check if bot posted comment form based on form posted fields and cookie values + * + * @return boolean + */ + public static function is_bot_detected() { + global $aio_wp_security; + $return = false; + $key_map_arr = self::generate_antibot_keys(); + foreach ($key_map_arr[0] as $key) { + // phpcs:ignore WordPress.Security.NonceVerification.Missing -- PCP warning. Nonce checked in earlier function. + if (empty($_POST[$key[0]]) || sanitize_text_field(wp_unslash($_POST[$key[0]])) != $key[1]) { + $return = true; + break; + } + } + if (!$return && '1' == $aio_wp_security->configs->get_value('aiowps_spambot_detect_usecookies')) { + foreach ($key_map_arr[1] as $key) { + if (AIOWPSecurity_Utility::get_cookie_value($key[0]) != $key[1]) { + $return = true; + break; + } + } + } + return apply_filters('aios_is_bot_detected', $return); + } + + /** + * Set cookies in browser for antibot check + * + * @return void + */ + public static function insert_antibot_keys_in_cookie() { + $key_map_arr = self::generate_antibot_keys(); + $expiry_seconds = AIOS_UPDATE_ANTIBOT_KEYS_AFTER_DAYS * 86400; + if (!empty($key_map_arr[1])) { + foreach ($key_map_arr[1] as $key) { + AIOWPSecurity_Utility::set_cookie_value($key[0], $key[1], $expiry_seconds); + } + } + } + + /** + * Comment Form to post back hidden fields for antibot check + * + * @return string + */ + public static function insert_antibot_keys_in_comment_form() { + $html_antibot_hidden_fields = '

%1$s

'; + $antibot_hidden_fields = ''; + $key_map_arr = self::generate_antibot_keys(); + foreach ($key_map_arr[0] as $key) { + $antibot_hidden_fields .=''; + } + if (isset($key_map_arr[2])) { + $antibot_hidden_fields .=''; + } + wp_register_script('aios-front-js', AIO_WP_SECURITY_URL. '/js/wp-security-front-script.js', array('jquery'), AIO_WP_SECURITY_VERSION, true); + wp_enqueue_script('aios-front-js'); + wp_localize_script('aios-front-js', 'AIOS_FRONT', array( + 'ajaxurl' => admin_url('admin-ajax.php'), // URL to wp-admin/admin-ajax.php to process the request + 'ajax_nonce' => wp_create_nonce('wp-security-ajax-nonce'), + )); + $html_antibot_hidden_fields = sprintf($html_antibot_hidden_fields, $antibot_hidden_fields); + return $html_antibot_hidden_fields; + } + + /** + * Get antibot key-value pairs to check on post back + * + * @param boolean $update generate and save in database + * + * @return array + */ + public static function generate_antibot_keys($update = false) { + $key_map_arr = get_site_option('aios_antibot_key_map_info'); + if (!$update && is_array($key_map_arr)) { + return $key_map_arr; + } + if ($update && is_array($key_map_arr) && isset($key_map_arr[2]) && $key_map_arr[2] > time()) { + return $key_map_arr; + } + $key_map_arr = array(); + + // values for to check post back key + $max = wp_rand(2, 4); + for ($i = 1; $i <= $max; $i++) { + $string1 = AIOWPSecurity_Utility::generate_alpha_numeric_random_string(8); + $string2 = AIOWPSecurity_Utility::generate_alpha_numeric_random_string(12); + $key_map_arr[0][] = array($string1, $string2); + } + + // values for to check for cookie back key + $max = wp_rand(2, 4); + for ($i = 1; $i <= $max; $i++) { + $string1 = AIOWPSecurity_Utility::generate_alpha_numeric_random_string(8); + $string2 = AIOWPSecurity_Utility::generate_alpha_numeric_random_string(12); + $key_map_arr[1][] = array($string1, $string2); + } + // expiration time of keys + $current_time = time(); + $key_map_arr[2] = (($current_time - ($current_time % 86400)) + AIOS_UPDATE_ANTIBOT_KEYS_AFTER_DAYS * 86400); + update_site_option('aios_antibot_key_map_info', $key_map_arr); + return $key_map_arr; + } + + /** + * Update antibot key-value pairs to rotate values so it is not valid forever + * + * @return void + */ + public function update_antibot_keys() { + if ((intval(gmdate('z')) % AIOS_UPDATE_ANTIBOT_KEYS_AFTER_DAYS) == 0) self::generate_antibot_keys(true); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-config.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-config.php new file mode 100755 index 00000000..cc48759d --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-config.php @@ -0,0 +1,109 @@ +configs = get_option('aio_wp_security_configs'); + } + + public function get_value($key) { + return isset($this->configs[$key]) ? $this->configs[$key] : ''; + } + + /** + * Gets for main site config value for a given $key. + * + * @param string $key + * + * @return string|array + */ + public function get_site_value($key) { + if (is_multisite() && !is_main_site()) { + $mainsite_aio_config = get_blog_option(get_main_site_id(), 'aio_wp_security_configs'); + return isset($mainsite_aio_config[$key]) ? $mainsite_aio_config[$key] : ''; + } else { + return $this->get_value($key); + } + } + + /** + * Sets a given config $value for a given $key. + * + * @param string $key + * @param mixed $value + * @param boolean $save_config - Whether or not to also save the $configs array to the database. + * + * @return boolean + */ + public function set_value($key, $value, $save_config = false) { + $this->configs[$key] = $value; + + if ($save_config) { + return $this->save_config(); + } else { + return true; + } + } + + public function add_value($key, $value) { + if (!is_array($this->configs)) { + $this->configs = array(); + } + + if (array_key_exists($key, $this->configs)) { + //Don't update the value for this key + } else {//It is safe to update the value for this key + $this->configs[$key] = $value; + } + } + + /** + * Save configuration that are set. + * + * @return boolean True on save config, Otherwise false. + */ + public function save_config() { + return update_option('aio_wp_security_configs', $this->configs); + } + + /** + * Remove key element from config. + * + * @param String $key config key + * + * @return boolean True if removed, otherwise false. + */ + public function delete_value($key) { + if (!is_array($this->configs)) { + $this->configs = array(); + } + + if (array_key_exists($key, $this->configs)) { + unset($this->configs[$key]); + if (!isset($this->configs[$key])) { + return true; + } + } + + return false; + } + + public static function get_instance() { + if (empty(self::$_this)) { + self::$_this = new AIOWPSecurity_Config(); + self::$_this->load_config(); + return self::$_this; + } + return self::$_this; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-configure-settings.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-configure-settings.php new file mode 100755 index 00000000..e8280513 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-configure-settings.php @@ -0,0 +1,739 @@ +configs->set_value('aiowps_enable_debug', '');//Checkbox + + //PHP backtrace + $aio_wp_security->configs->set_value('aiowps_enable_php_backtrace_in_email', '');//Checkbox + + //WP Generator Meta Tag feature + $aio_wp_security->configs->set_value('aiowps_remove_wp_generator_meta_info', '');//Checkbox + + //Prevent Image Hotlinks + $aio_wp_security->configs->set_value('aiowps_prevent_hotlinking', '');//Checkbox + //General Settings Page + + //User password feature + + //Lockout feature + $aio_wp_security->configs->set_value('aiowps_enable_login_lockdown', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_allow_unlock_requests', '1'); // Checkbox + $aio_wp_security->configs->set_value('aiowps_max_login_attempts', '3'); + $aio_wp_security->configs->set_value('aiowps_retry_time_period', '5'); + $aio_wp_security->configs->set_value('aiowps_lockout_time_length', '5'); + $aio_wp_security->configs->set_value('aiowps_max_lockout_time_length', '60'); + $aio_wp_security->configs->set_value('aiowps_set_generic_login_msg', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_enable_email_notify', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_email_address', $blog_email_address);//text field + $aio_wp_security->configs->set_value('aiowps_enable_forced_logout', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_logout_time_period', '60'); + $aio_wp_security->configs->set_value('aiowps_enable_invalid_username_lockdown', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_instantly_lockout_specific_usernames', array()); // Textarea (list of strings) + $aio_wp_security->configs->set_value('aiowps_unlock_request_secret_key', AIOWPSecurity_Utility::generate_alpha_numeric_random_string(20));//Hidden secret value which will be used to do some unlock request processing. This will be assigned a random string generated when lockdown settings saved + $aio_wp_security->configs->set_value('aiowps_lockdown_enable_whitelisting', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_lockdown_allowed_ip_addresses', ''); + + // HTTP authentication + $aio_wp_security->configs->set_value('aiowps_http_authentication_admin', ''); // Checkbox + $aio_wp_security->configs->set_value('aiowps_http_authentication_frontend', ''); // Checkbox + $aio_wp_security->configs->set_value('aiowps_http_authentication_username', 'root'); + $aio_wp_security->configs->set_value('aiowps_http_authentication_password', 'password'); + $aio_wp_security->configs->set_value('aiowps_http_authentication_failure_message', '

Unauthorized

'); + + // CAPTCHA feature + $aio_wp_security->configs->set_value('aiowps_default_captcha', ''); + $aio_wp_security->configs->set_value('aiowps_enable_login_captcha', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_enable_custom_login_captcha', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_enable_password_protected_captcha', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_enable_woo_login_captcha', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_enable_woo_lostpassword_captcha', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_enable_woo_register_captcha', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_enable_woo_checkout_captcha', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_enable_lost_password_captcha', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_enable_contact_form_7_captcha', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_captcha_secret_key', AIOWPSecurity_Utility::generate_alpha_numeric_random_string(20)); // Hidden secret value which will be used to do some CAPTCHA processing. This will be assigned a random string generated when CAPTCHA settings saved + + //Login Whitelist feature + $aio_wp_security->configs->set_value('aiowps_enable_whitelisting', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_allowed_ip_addresses', ''); + + //User registration + $aio_wp_security->configs->set_value('aiowps_enable_manual_registration_approval', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_enable_registration_page_captcha', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_enable_registration_honeypot', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_enforce_strong_password', '');//Checkbox + + //DB Security feature + //$aio_wp_security->configs->set_value('aiowps_new_manual_db_pefix', ''); //text field + $aio_wp_security->configs->set_value('aiowps_enable_random_prefix', '');//Checkbox + + //Filesystem Security feature + AIOWPSecurity_Utility::enable_file_edits(); + $aio_wp_security->configs->set_value('aiowps_disable_file_editing', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_prevent_default_wp_file_access', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_auto_delete_default_wp_files', ''); // Checkbox + $aio_wp_security->configs->set_value('aiowps_system_log_file', 'error_log'); + + //Blacklist feature + $aio_wp_security->configs->set_value('aiowps_enable_blacklisting', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_banned_ip_addresses', ''); + $aio_wp_security->configs->set_value('aiowps_banned_user_agents', ''); + + //Firewall features + $aio_wp_security->configs->set_value('aiowps_enable_basic_firewall', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_max_file_upload_size', AIOS_FIREWALL_MAX_FILE_UPLOAD_LIMIT_MB); //Default + $aio_wp_security->configs->set_value('aiowps_disable_xmlrpc_pingback_methods', '');//Checkbox - Disables only pingback methods in XMLRPC functionality + $aio_wp_security->configs->set_value('aiowps_disable_rss_and_atom_feeds', ''); // Checkbox + $aio_wp_security->configs->set_value('aiowps_block_debug_log_file_access', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_disable_index_views', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_disable_trace_and_track', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_enable_5g_firewall', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_enable_6g_firewall', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_enable_custom_rules', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_place_custom_rules_at_top', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_custom_rules', ''); + + // Upgrade unsafe HTTP calls + $aio_wp_security->configs->set_value('aiowps_upgrade_unsafe_http_calls', ''); // Checkbox + $aio_wp_security->configs->set_value('aiowps_upgrade_unsafe_http_calls_url_exceptions', ''); + + //404 detection + $aio_wp_security->configs->set_value('aiowps_enable_404_logging', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_enable_404_IP_lockout', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_404_lockout_time_length', '60'); + $aio_wp_security->configs->set_value('aiowps_404_lock_redirect_url', 'http://127.0.0.1'); + + //Brute Force features + $aio_wp_security->configs->set_value('aiowps_enable_rename_login_page', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_enable_login_honeypot', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_disable_application_password', '');//Checkbox + + $aio_wp_security->configs->set_value('aiowps_enable_brute_force_attack_prevention', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_brute_force_secret_word', ''); + $aio_wp_security->configs->set_value('aiowps_cookie_brute_test', ''); + $aio_wp_security->configs->set_value('aiowps_cookie_based_brute_force_redirect_url', 'http://127.0.0.1'); + $aio_wp_security->configs->set_value('aiowps_brute_force_attack_prevention_pw_protected_exception', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_brute_force_attack_prevention_ajax_exception', '');//Checkbox + + //Maintenance menu - Visitor lockout feature + $aio_wp_security->configs->set_value('aiowps_site_lockout', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_site_lockout_msg', '');//Text area/msg box + + // Spam prevention menu + $aio_wp_security->configs->set_value('aiowps_enable_comment_captcha', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_enable_autoblock_spam_ip', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_spam_ip_min_comments_block', ''); + $aio_wp_security->configs->set_value('aiowps_enable_bp_register_captcha', ''); + $aio_wp_security->configs->set_value('aiowps_enable_bbp_new_topic_captcha', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_enable_spambot_detecting', ''); + $aio_wp_security->configs->set_value('aiowps_spambot_detect_usecookies', ''); + $aio_wp_security->configs->set_value('aiowps_spam_comments_should', ''); + + $aio_wp_security->configs->set_value('aiowps_enable_trash_spam_comments', ''); + $aio_wp_security->configs->set_value('aiowps_trash_spam_comments_after_days', '14'); + + //Filescan features + //File change detection feature + $aio_wp_security->configs->set_value('aiowps_enable_automated_fcd_scan', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_fcd_scan_frequency', '4'); + $aio_wp_security->configs->set_value('aiowps_fcd_scan_interval', '2'); //Dropdown box where (0,1,2) => (hours,days,weeks) + $aio_wp_security->configs->set_value('aiowps_fcd_exclude_filetypes', ''); + $aio_wp_security->configs->set_value('aiowps_fcd_exclude_files', ''); + $aio_wp_security->configs->set_value('aiowps_send_fcd_scan_email', '');//Checkbox + $aio_wp_security->configs->set_value('aiowps_fcd_scan_email_address', $blog_email_address); + $aio_wp_security->configs->set_value('aiowps_fcds_change_detected', false); //used to display a global alert on site when file change detected + + //Misc Options + //Copy protection feature + $aio_wp_security->configs->set_value('aiowps_copy_protection', '');//Checkbox + //Prevent others from displaying your site in iframe + $aio_wp_security->configs->set_value('aiowps_prevent_site_display_inside_frame', '');//Checkbox + //Prevent users enumeration + $aio_wp_security->configs->set_value('aiowps_prevent_users_enumeration', '');//Checkbox + + //REST API Security + $aio_wp_security->configs->set_value('aiowps_disallow_unauthorized_rest_requests', '');//Checkbox + $aio_wp_security->configs->set_value('aios_roles_disallowed_rest_requests', array()); + $aio_wp_security->configs->set_value('aios_whitelisted_rest_routes', array()); + + // IP retrieval setting + $aio_wp_security->configs->set_value('aiowps_ip_retrieve_method', '0'); // Default is $_SERVER['REMOTE_ADDR'] + + // Cloudflare Turnstile + $aio_wp_security->configs->set_value('aiowps_turnstile_site_key', ''); + $aio_wp_security->configs->set_value('aiowps_turnstile_secret_key', ''); + + // Google reCAPTCHA + $aio_wp_security->configs->set_value('aiowps_recaptcha_site_key', ''); + $aio_wp_security->configs->set_value('aiowps_recaptcha_secret_key', ''); + $aio_wp_security->configs->set_value('aiowps_default_recaptcha', ''); // Not used since 5.1.2 + + // Deactivation Handler + $aio_wp_security->configs->set_value('aiowps_on_uninstall_delete_db_tables', '1'); //Checkbox + $aio_wp_security->configs->set_value('aiowps_on_uninstall_delete_configs', '1'); //Checkbox + + // Reset the PHP 5.6 end of support notice + $aio_wp_security->configs->delete_value('php_56_eol_dismiss_forever'); + + //TODO - keep adding default options for any fields that require it + + if (is_main_site()) { + $aiowps_firewall_config->set_value('aiowps_enable_pingback_firewall', false);//Checkbox - blocks all access to XMLRPC + $aiowps_firewall_config->set_value('aiowps_forbid_proxy_comments', false);//Checkbox + $aiowps_firewall_config->set_value('aiowps_deny_bad_query_strings', false);//Checkbox + $aiowps_firewall_config->set_value('aiowps_advanced_char_string_filter', false);//Checkbox + $aiowps_firewall_config->set_value('aiowps_ban_post_blank_headers', false); // Checkbox + $aiowps_firewall_config->set_value('aiowps_block_fake_googlebots', false); // Checkbox + $aiowps_firewall_config->set_value('aiowps_googlebot_ip_ranges', array()); + + self::turn_off_all_6g_firewall_configs(); + self::set_cookie_based_bruteforce_firewall_configs(); + self::set_user_agent_firewall_configs(); + self::set_ip_retrieve_method_configs(); + self::set_blacklist_ip_firewall_configs(); + } + + // Save it + return $aio_wp_security->configs->save_config(); + } + + /** + * Add config settings. + * + * @return Void + */ + public static function add_option_values() { + + global $aio_wp_security; + + $blog_email_address = get_bloginfo('admin_email'); //Get the blog admin email address - we will use as the default value + + $aio_wp_security->configs->load_config(); + + //Debug + $aio_wp_security->configs->add_value('aiowps_enable_debug', '');//Checkbox + + //PHP backtrace + $aio_wp_security->configs->add_value('aiowps_enable_php_backtrace_in_email', '');//Checkbox + + //WP Generator Meta Tag feature + $aio_wp_security->configs->add_value('aiowps_remove_wp_generator_meta_info', '');//Checkbox + + //Prevent Image Hotlinks + $aio_wp_security->configs->add_value('aiowps_prevent_hotlinking', '');//Checkbox + + //General Settings Page + + //User password feature + + //Lockout feature + $aio_wp_security->configs->add_value('aiowps_enable_login_lockdown', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_allow_unlock_requests', '1'); // Checkbox + $aio_wp_security->configs->add_value('aiowps_max_login_attempts', '3'); + $aio_wp_security->configs->add_value('aiowps_retry_time_period', '5'); + $aio_wp_security->configs->add_value('aiowps_lockout_time_length', '5'); + $aio_wp_security->configs->add_value('aiowps_max_lockout_time_length', '60'); + $aio_wp_security->configs->add_value('aiowps_set_generic_login_msg', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_enable_email_notify', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_email_address', $blog_email_address);//text field + $aio_wp_security->configs->add_value('aiowps_enable_forced_logout', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_logout_time_period', '60'); + $aio_wp_security->configs->add_value('aiowps_enable_invalid_username_lockdown', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_instantly_lockout_specific_usernames', array()); // Textarea (list of strings) + $aio_wp_security->configs->add_value('aiowps_unlock_request_secret_key', AIOWPSecurity_Utility::generate_alpha_numeric_random_string(20));//Hidden secret value which will be used to do some unlock request processing. This will be assigned a random string generated when lockdown settings saved + $aio_wp_security->configs->add_value('aiowps_lockdown_enable_whitelisting', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_lockdown_allowed_ip_addresses', ''); + + // HTTP authentication + $aio_wp_security->configs->add_value('aiowps_http_authentication_admin', ''); // Checkbox + $aio_wp_security->configs->add_value('aiowps_http_authentication_frontend', ''); // Checkbox + $aio_wp_security->configs->add_value('aiowps_http_authentication_username', 'root'); + $aio_wp_security->configs->add_value('aiowps_http_authentication_password', 'password'); + $aio_wp_security->configs->add_value('aiowps_http_authentication_failure_message', '

Unauthorized

'); + + //Login Whitelist feature + $aio_wp_security->configs->add_value('aiowps_enable_whitelisting', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_allowed_ip_addresses', ''); + + // CAPTCHA feature + $aio_wp_security->configs->add_value('aiowps_default_captcha', ''); + $aio_wp_security->configs->add_value('aiowps_enable_login_captcha', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_enable_custom_login_captcha', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_enable_password_protected_captcha', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_enable_woo_login_captcha', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_enable_woo_register_captcha', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_enable_woo_checkout_captcha', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_enable_woo_lostpassword_captcha', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_enable_contact_form_7_captcha', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_captcha_secret_key', AIOWPSecurity_Utility::generate_alpha_numeric_random_string(20)); // Hidden secret value which will be used to do some CAPTCHA processing. This will be assigned a random string generated when CAPTCHA settings saved + + //User registration + $aio_wp_security->configs->add_value('aiowps_enable_manual_registration_approval', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_enable_registration_page_captcha', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_enable_registration_honeypot', ''); // Checkbox + $aio_wp_security->configs->add_value('aiowps_enforce_strong_password', ''); // Checkbox + + //DB Security feature + //$aio_wp_security->configs->add_value('aiowps_new_manual_db_pefix', ''); //text field + $aio_wp_security->configs->add_value('aiowps_enable_random_prefix', '');//Checkbox + + //Filesystem Security feature + $aio_wp_security->configs->add_value('aiowps_disable_file_editing', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_prevent_default_wp_file_access', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_auto_delete_default_wp_files', ''); // Checkbox + $aio_wp_security->configs->add_value('aiowps_system_log_file', 'error_log'); + + //Blacklist feature + $aio_wp_security->configs->add_value('aiowps_enable_blacklisting', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_banned_ip_addresses', ''); + + //Firewall features + $aio_wp_security->configs->add_value('aiowps_enable_basic_firewall', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_max_file_upload_size', AIOS_FIREWALL_MAX_FILE_UPLOAD_LIMIT_MB); + $aio_wp_security->configs->add_value('aiowps_disable_xmlrpc_pingback_methods', '');//Checkbox - Disables only pingback methods in XMLRPC functionality + $aio_wp_security->configs->add_value('aiowps_disable_rss_and_atom_feeds', ''); // Checkbox + $aio_wp_security->configs->add_value('aiowps_block_debug_log_file_access', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_disable_index_views', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_disable_trace_and_track', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_enable_5g_firewall', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_enable_6g_firewall', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_enable_custom_rules', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_place_custom_rules_at_top', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_custom_rules', ''); + + // Upgrade unsafe HTTP calls + $aio_wp_security->configs->add_value('aiowps_upgrade_unsafe_http_calls', ''); // Checkbox + $aio_wp_security->configs->add_value('aiowps_upgrade_unsafe_http_calls_url_exceptions', ''); + + //404 detection + $aio_wp_security->configs->add_value('aiowps_enable_404_logging', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_enable_404_IP_lockout', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_404_lockout_time_length', '60'); + $aio_wp_security->configs->add_value('aiowps_404_lock_redirect_url', 'http://127.0.0.1'); + + //Brute Force features + $aio_wp_security->configs->add_value('aiowps_enable_rename_login_page', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_enable_login_honeypot', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_disable_application_password', ''); // Checkbox + + $aio_wp_security->configs->add_value('aiowps_enable_brute_force_attack_prevention', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_brute_force_secret_word', ''); + $aio_wp_security->configs->add_value('aiowps_cookie_brute_test', ''); + $aio_wp_security->configs->add_value('aiowps_cookie_based_brute_force_redirect_url', 'http://127.0.0.1'); + $aio_wp_security->configs->add_value('aiowps_brute_force_attack_prevention_pw_protected_exception', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_brute_force_attack_prevention_ajax_exception', '');//Checkbox + + //Maintenance menu - Visitor lockout feature + $aio_wp_security->configs->add_value('aiowps_site_lockout', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_site_lockout_msg', '');//Text area/msg box + + // Spam prevention menu + $aio_wp_security->configs->add_value('aiowps_enable_spambot_blocking', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_enable_comment_captcha', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_spam_ip_min_comments_block', ''); + $aio_wp_security->configs->add_value('aiowps_enable_bp_register_captcha', ''); + $aio_wp_security->configs->add_value('aiowps_enable_bbp_new_topic_captcha', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_enable_spambot_detecting', ''); + $aio_wp_security->configs->add_value('aiowps_spambot_detect_usecookies', ''); + $aio_wp_security->configs->add_value('aiowps_spam_comments_should', ''); + $aio_wp_security->configs->add_value('aiowps_enable_trash_spam_comments', ''); + $aio_wp_security->configs->add_value('aiowps_trash_spam_comments_after_days', '14'); + + //Filescan features + //File change detection feature + $aio_wp_security->configs->add_value('aiowps_enable_automated_fcd_scan', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_fcd_scan_frequency', '4'); + $aio_wp_security->configs->add_value('aiowps_fcd_scan_interval', '2'); //Dropdown box where (0,1,2) => (hours,days,weeks) + $aio_wp_security->configs->add_value('aiowps_fcd_exclude_filetypes', ''); + $aio_wp_security->configs->add_value('aiowps_fcd_exclude_files', ''); + $aio_wp_security->configs->add_value('aiowps_send_fcd_scan_email', '');//Checkbox + $aio_wp_security->configs->add_value('aiowps_fcd_scan_email_address', $blog_email_address); + $aio_wp_security->configs->add_value('aiowps_fcds_change_detected', false); //used to display a global alert on site when file change detected + + //Misc Options + //Copy protection feature + $aio_wp_security->configs->add_value('aiowps_copy_protection', '');//Checkbox + //Prevent others from displaying your site in iframe + $aio_wp_security->configs->add_value('aiowps_prevent_site_display_inside_frame', '');//Checkbox + //Prevent users enumeration + $aio_wp_security->configs->add_value('aiowps_prevent_users_enumeration', '');//Checkbox + + //REST API Security + $aio_wp_security->configs->add_value('aiowps_disallow_unauthorized_rest_requests', '');//Checkbox + $aio_wp_security->configs->add_value('aios_roles_disallowed_rest_requests', array()); + $aio_wp_security->configs->add_value('aios_whitelisted_rest_routes', array()); + + // IP retrieval setting + // Commented the below code line because the IP retrieve method will be configured when the AIOS plugin is activated for the first time. + // $aio_wp_security->configs->add_value('aiowps_ip_retrieve_method', '0'); // Default is $_SERVER['REMOTE_ADDR'] + + // Cloudflare Turnstile + $aio_wp_security->configs->add_value('aiowps_turnstile_site_key', ''); + $aio_wp_security->configs->add_value('aiowps_turnstile_secret_key', ''); + + // Google reCAPTCHA + $aio_wp_security->configs->add_value('aiowps_recaptcha_site_key', ''); + $aio_wp_security->configs->add_value('aiowps_recaptcha_secret_key', ''); + $aio_wp_security->configs->add_value('aiowps_default_recaptcha', ''); // Not used since 5.1.2 + + // Deactivation Handler + $aio_wp_security->configs->add_value('aiowps_on_uninstall_delete_db_tables', '1'); //Checkbox + $aio_wp_security->configs->add_value('aiowps_on_uninstall_delete_configs', '1'); //Checkbox + + $aio_wp_security->configs->add_value('installed-at', current_time('timestamp', true)); + + //TODO - keep adding default options for any fields that require it + + //Save it + $aio_wp_security->configs->save_config(); + + // For Cookie based brute force prevention backward compatibility + if (!headers_sent() && '1' == $aio_wp_security->configs->get_value('aiowps_enable_brute_force_attack_prevention')) { + $brute_force_secret_word = $aio_wp_security->configs->get_value('aiowps_brute_force_secret_word'); + if (empty($brute_force_secret_word)) { + $brute_force_secret_word = AIOS_DEFAULT_BRUTE_FORCE_FEATURE_SECRET_WORD; + } + AIOWPSecurity_Utility::set_cookie_value(AIOWPSecurity_Utility::get_brute_force_secret_cookie_name(), AIOS_Helper::get_hash($brute_force_secret_word)); + } + + // Login whitelisting started to work on non-apache server from db_version 1.9.5 + if (is_main_site() && version_compare(get_option('aiowpsec_db_version'), '1.9.6', '<') && '1' == $aio_wp_security->configs->get_value('aiowps_enable_whitelisting') && !empty($aio_wp_security->configs->get_value('aiowps_allowed_ip_addresses'))) { + $aio_wp_security->configs->set_value('aiowps_enable_whitelisting', '0'); + $aio_wp_security->configs->set_value('aiowps_is_login_whitelist_disabled_on_upgrade', '1'); + $aio_wp_security->configs->save_config(); + } + + if (is_main_site() && version_compare(get_option('aiowpsec_db_version'), '2.0.0', '<') && '1' == $aio_wp_security->configs->get_value('aiowps_enable_blacklisting') && !empty($aio_wp_security->configs->get_value('aiowps_banned_ip_addresses')) && (false !== strpos($aio_wp_security->configs->get_value('aiowps_banned_ip_addresses'), '*') || false !== strpos($aio_wp_security->configs->get_value('aiowps_banned_ip_addresses'), '/'))) { + $aio_wp_security->configs->set_value('aiowps_enable_blacklisting', '0'); + $aio_wp_security->configs->set_value('aiowps_is_ip_blacklist_settings_notice_on_upgrade', '1'); + $aio_wp_security->configs->save_config(); + self::set_user_agent_firewall_configs(); + self::send_blacklist_manager_disabled_email(); + } + + if (is_main_site() && version_compare(get_option('aiowpsec_db_version'), '2.0.0', '<') && '1' == $aio_wp_security->configs->get_value('aiowps_enable_spambot_blocking')) { + $aio_wp_security->configs->set_value('aiowps_enable_spambot_detecting', '1'); + $aio_wp_security->configs->set_value('aiowps_spambot_detect_usecookies', ''); + $aio_wp_security->configs->set_value('aiowps_spam_comments_should', '0'); + $aio_wp_security->configs->save_config(); + } + + + if (is_main_site() && version_compare(get_option('aiowpsec_db_version'), '2.0.3', '<')) { + $aio_wp_security->configs->set_value('aiowps_enable_pingback_firewall', '0');//Checkbox - blocks all access to XMLRPC + $aio_wp_security->configs->set_value('aiowps_forbid_proxy_comments', '0');//Checkbox + $aio_wp_security->configs->set_value('aiowps_deny_bad_query_strings', '0');//Checkbox + $aio_wp_security->configs->set_value('aiowps_advanced_char_string_filter', '0');//Checkbox + $aio_wp_security->configs->save_config(); + } + + if (is_main_site()) { + AIOWPSecurity_Utility_Htaccess::write_to_htaccess(false); + } + + // Add expiration for antibot keys for previous versions + if (version_compare(get_option('aiowpsec_db_version'), '2.1.1', '<')) { + AIOWPSecurity_Comment::generate_antibot_keys(true); + } + + // Add ContactForm7 related authentication scheme for salt postfix + if (version_compare(get_option('aiowpsec_db_version'), '2.1.4', '<') && '1' == $aio_wp_security->configs->get_value('aiowps_enable_salt_postfix')) { + $salt_postfixes = $aio_wp_security->configs->get_value('aiowps_salt_postfixes'); + $salt_postfixes['wpcf7_submission'] = wp_generate_password(64, true, true); + $aio_wp_security->configs->set_value('aiowps_salt_postfixes', $salt_postfixes, true); + } + } + + /** + * Method to update the plugin db version. + * + * @return void + */ + public static function update_aiowpsec_db_version() { + update_option('aiowpsec_db_version', AIO_WP_SECURITY_DB_VERSION); + } + + /** + * Upgrades from the old config to the firewall's config + * + * @return void + */ + public static function upgrade_basic_firewall_rules_configs() { + global $aio_wp_security; + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + + $settings = array( + 'aiowps_enable_pingback_firewall', + 'aiowps_forbid_proxy_comments', + 'aiowps_deny_bad_query_strings', + 'aiowps_advanced_char_string_filter', + ); + + // The settings that have been activated by the user + $active = array(); + + foreach ($settings as $setting) { + if (('1' === $aio_wp_security->configs->get_value($setting))) { + $active[] = $setting; + $aiowps_firewall_config->set_value($setting, false); + $aio_wp_security->configs->delete_value($setting); + $aio_wp_security->configs->save_config(); + } + + } + + if (!empty($active)) { + $aio_wp_security->configs->set_value('aiowps_firewall_active_upgrade', wp_json_encode($active)); + $aio_wp_security->configs->save_config(); + self::send_basic_firewall_upgrade_email(); + } + } + + /** + * Send an email notifying that the upgraded settings have been disabled + * + * @return void + */ + private static function send_basic_firewall_upgrade_email() { + global $aio_wp_security; + $dashboard_link = 'admin.php?page=aiowpsec'; + $dashboard_link = is_multisite() ? network_admin_url($dashboard_link) : admin_url($dashboard_link); + $subject = __('Basic firewall settings disabled', 'all-in-one-wp-security-and-firewall'); + /* translators: %s: Dashboard link. */ + $email_msg = __('Our basic firewall rules have been upgraded and to prevent any unexpected site issues we have disabled the features.', 'all-in-one-wp-security-and-firewall') . "\n\n" . __('You can enable the features again by logging into your WordPress dashboard.', 'all-in-one-wp-security-and-firewall') . "\n\n" .sprintf(__('Go to dashboard: %s', 'all-in-one-wp-security-and-firewall'), $dashboard_link) . "\n\n" . __('Once logged in you will see a notification where you can decide on which course of action you wish to take.', 'all-in-one-wp-security-and-firewall') . "\n"; + $email = get_bloginfo('admin_email'); + if (false === wp_mail($email, $subject, $email_msg)) { + $aio_wp_security->debug_logger->log_debug("Basic firewall rules notification email failed to send to " . $email, 4); + } + } + + /** + * This function send blacklist ip manager disabled email. + * + * @return void + */ + public static function send_blacklist_manager_disabled_email() { + global $aio_wp_security; + $dashboard_link = 'admin.php?page=aiowpsec'; + $dashboard_link = is_multisite() ? network_admin_url($dashboard_link) : admin_url($dashboard_link); + $subject = '['. get_option('siteurl'). '] '. __('Blacklist manager disabled notification', 'all-in-one-wp-security-and-firewall'); + /* translators: %s: Dashboard link */ + $email_msg = __('The blacklist manager feature has been updated and to prevent any unexpected site lockouts we have disabled the feature.', 'all-in-one-wp-security-and-firewall') . "\n\n" . __('You can enable the feature again by logging into your WordPress dashboard.', 'all-in-one-wp-security-and-firewall') . "\n\n" .sprintf(__('Go to dashboard: %s', 'all-in-one-wp-security-and-firewall'), $dashboard_link) . "\n\n" . __('Once logged in before turning the blacklist manger on please double check your settings to ensure you have not entered your own details.', 'all-in-one-wp-security-and-firewall') . "\n"; + $email = get_bloginfo('admin_email'); + $mail_sent = wp_mail($email, $subject, $email_msg); + if (false === $mail_sent) { + $aio_wp_security->debug_logger->log_debug("Blacklist IP manager disabled notification email failed to send to " . $email, 4); + } + } + + /** + * Firewall configs set based on version. + * + * @return void + */ + public static function set_firewall_configs() { + if (is_main_site()) { + $firewall_version = get_option('aiowpsec_firewall_version'); + if (version_compare($firewall_version, '1.0.1', '<')) { + self::set_cookie_based_bruteforce_firewall_configs(); + } + if (version_compare($firewall_version, '1.0.3', '<')) { + self::set_ip_retrieve_method_configs(); + } + if (version_compare($firewall_version, '1.0.4', '<')) { + self::set_blacklist_ip_firewall_configs(); + } + if (version_compare($firewall_version, '1.0.5', '<')) { + self::upgrade_basic_firewall_rules_configs(); + } + if (version_compare($firewall_version, '1.0.6', '<')) { //1.0.2 set but here making sure the blank user agent is not saved in settings.php which may show a 403 error due to not empty user agent check removed from the rule + self::set_user_agent_firewall_configs(); + } + if (version_compare($firewall_version, '1.0.8', '<')) { + self::port_block_fake_googlebots_config(); + } + } + update_option('aiowpsec_firewall_version', AIO_WP_SECURITY_FIREWALL_VERSION); + } + + /** + * Blacklist IP firewall configs set. + * + * @return void. + */ + public static function set_blacklist_ip_firewall_configs() { + global $aio_wp_security; + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + $aiowps_firewall_config->set_value('aiowps_ip_retrieve_method', $aio_wp_security->configs->get_value('aiowps_ip_retrieve_method')); + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_blacklisting') && !empty($aio_wp_security->configs->get_value('aiowps_banned_ip_addresses'))) { + $aiowps_firewall_config->set_value('aiowps_blacklist_ips', explode("\n", preg_replace("/\r/", "", trim($aio_wp_security->configs->get_value('aiowps_banned_ip_addresses'))))); + } else { + $aiowps_firewall_config->set_value('aiowps_blacklist_ips', array()); + } + } + + /** + * Cookie based bruteforce firewall configs set. + * + * @return void. + */ + public static function set_cookie_based_bruteforce_firewall_configs() { + global $aio_wp_security; + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + + $aiowps_firewall_config->set_value('aios_enable_rename_login_page', $aio_wp_security->configs->get_value('aiowps_enable_rename_login_page')); + + $aiowps_firewall_config->set_value('aios_login_page_slug', $aio_wp_security->configs->get_value('aiowps_login_page_slug')); + + $aios_enable_brute_force_attack_prevention = $aio_wp_security->configs->get_value('aiowps_enable_brute_force_attack_prevention'); + $aiowps_firewall_config->set_value('aios_enable_brute_force_attack_prevention', $aios_enable_brute_force_attack_prevention); + + $aiowps_firewall_config->set_value('aios_brute_force_secret_word', $aio_wp_security->configs->get_value('aiowps_brute_force_secret_word')); + + $aiowps_firewall_config->set_value('aios_cookie_based_brute_force_redirect_url', $aio_wp_security->configs->get_value('aiowps_cookie_based_brute_force_redirect_url')); + + $aiowps_firewall_config->set_value('aios_brute_force_attack_prevention_pw_protected_exception', $aio_wp_security->configs->get_value('aiowps_brute_force_attack_prevention_pw_protected_exception')); + + $aiowps_firewall_config->set_value('aios_brute_force_attack_prevention_ajax_exception', $aio_wp_security->configs->get_value('aiowps_brute_force_attack_prevention_ajax_exception')); + + $aiowps_firewall_config->set_value('aios_brute_force_secret_cookie_name', AIOWPSecurity_Utility::get_brute_force_secret_cookie_name()); + } + + /** + * User agent firewall configs set. + * + * @return void. + */ + public static function set_user_agent_firewall_configs() { + global $aio_wp_security; + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_blacklisting') && !empty($aio_wp_security->configs->get_value('aiowps_banned_user_agents'))) { + $aiowps_firewall_config->set_value('aiowps_blacklist_user_agents', explode("\n", preg_replace("/\r/", "", trim($aio_wp_security->configs->get_value('aiowps_banned_user_agents'))))); + } else { + $aiowps_firewall_config->set_value('aiowps_blacklist_user_agents', array()); + } + } + + /** + * Port block fake Googlebots config to firewall config. + * + * @global AIO_WP_Security $aio_wp_security + * @global AIOWPS\Firewall\Config $aiowps_firewall_config + * + * @return void + */ + private static function port_block_fake_googlebots_config() { + global $aio_wp_security; + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + + if ('1' == $aio_wp_security->configs->get_value('aiowps_block_fake_googlebots')) { + $aiowps_firewall_config->set_value('aiowps_block_fake_googlebots', true); + + $validated_ip_list_array = AIOWPSecurity_Utility::get_googlebot_ip_ranges(); + + if (!is_wp_error($validated_ip_list_array)) { + $aiowps_firewall_config->set_value('aiowps_googlebot_ip_ranges', $validated_ip_list_array); + } + } else { + $aiowps_firewall_config->set_value('aiowps_block_fake_googlebots', false); + } + } + + /** + * IP retrieve method configs set. + * + * @return void. + */ + public static function set_ip_retrieve_method_configs() { + global $aio_wp_security; + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + $aiowps_firewall_config->set_value('aios_ip_retrieve_method', $aio_wp_security->configs->get_value('aiowps_ip_retrieve_method')); + } + + /** + * Turn off all security features. + * + * @return void. + */ + public static function turn_off_all_security_features() { + global $aio_wp_security; + AIOWPSecurity_Configure_Settings::set_default_settings(); + + //Refresh the .htaccess file based on the new settings + $serverType = AIOWPSecurity_Utility::get_server_type(); + if (!in_array($serverType, array('-1', 'nginx', 'iis'))) { + $res = AIOWPSecurity_Utility_Htaccess::write_to_htaccess(); + } else { + $res = true; + } + if (!$res) { + $aio_wp_security->debug_logger->log_debug(__METHOD__ . " - Could not write to the .htaccess file. Please check the file permissions.", 4); + } + } + + /** + * Turn off 6g firewall configs. + * + * @return void. + */ + public static function turn_off_all_6g_firewall_configs() { + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + $aiowps_firewall_config->set_value('aiowps_6g_block_request_methods', array()); + $aiowps_firewall_config->set_value('aiowps_6g_block_query', false); + $aiowps_firewall_config->set_value('aiowps_6g_block_request', false); + $aiowps_firewall_config->set_value('aiowps_6g_block_referrers', false); + $aiowps_firewall_config->set_value('aiowps_6g_block_agents', false); + } + + + /** + * Turn off all firewall configs. + * + * @return void. + */ + public static function turn_off_firewall_configs() { + global $aiowps_firewall_config, $aio_wp_security; + $aio_wp_security->configs->set_value('aiowps_disable_xmlrpc_pingback_methods', ''); + $aio_wp_security->configs->set_value('aiowps_disable_rss_and_atom_feeds', ''); + $aio_wp_security->configs->set_value('aiowps_enable_basic_firewall', ''); + $aio_wp_security->configs->set_value('aiowps_max_file_upload_size', AIOS_FIREWALL_MAX_FILE_UPLOAD_LIMIT_MB); //Default + $aio_wp_security->configs->set_value('aiowps_block_debug_log_file_access', ''); + $aio_wp_security->configs->set_value('aiowps_disable_index_views', ''); + $aio_wp_security->configs->set_value('aiowps_disable_trace_and_track', ''); + $aio_wp_security->configs->set_value('aiowps_enable_blacklisting', ''); + $aio_wp_security->configs->set_value('aiowps_enable_5g_firewall', ''); + $aio_wp_security->configs->set_value('aiowps_disallow_unauthorized_rest_requests', ''); + $aio_wp_security->configs->save_config(); + + self::turn_off_all_6g_firewall_configs(); + $aiowps_firewall_config->set_value('aiowps_enable_pingback_firewall', false); + $aiowps_firewall_config->set_value('aiowps_forbid_proxy_comments', false); + $aiowps_firewall_config->set_value('aiowps_deny_bad_query_strings', false); + $aiowps_firewall_config->set_value('aiowps_advanced_char_string_filter', false); + $aiowps_firewall_config->set_value('aiowps_ban_post_blank_headers', false); + $aiowps_firewall_config->set_value('aiowps_block_fake_googlebots', false); + $aiowps_firewall_config->set_value('aiowps_googlebot_ip_ranges', array()); + $aiowps_firewall_config->set_value('aiowps_blacklist_user_agents', array()); + $aiowps_firewall_config->set_value('aiowps_blacklist_ips', array()); + Allow_List::add_ips(array()); // Remove firewall whitelisted IPs + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-cronjob-handler.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-cronjob-handler.php new file mode 100755 index 00000000..fa566e3a --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-cronjob-handler.php @@ -0,0 +1,157 @@ + 900, // 15 * 60 + 'display' => __('Every 15 minutes', 'all-in-one-wp-security-and-firewall') + ); + return $schedules; + } + + /** + * Run cron event every 5 minute. + * + * @return void + */ + public function aios_15_minutes_cron_event() { + global $aio_wp_security; + + if (!class_exists('Updraft_Semaphore_3_0')) { + require_once(AIO_WP_SECURITY_PATH.'/vendor/team-updraft/common-libs/src/updraft-semaphore/class-updraft-semaphore.php'); + } + + $fifteen_minutes_cron_semaphore = new Updraft_Semaphore_3_0('aios_15_minutes_cron_event', 60); + + if ($fifteen_minutes_cron_semaphore->lock(2)) { + try { + $aio_wp_security->user_login_obj->send_login_lockout_emails(); + } catch (Exception $e) { + $log_message = 'Exception ('.get_class($e).') occurred during the 5 minutes cron event action call: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')'; + $aio_wp_security->debug_logger->log_debug($log_message, 4); + // @codingStandardsIgnoreLine + } catch (Error $e) { + $log_message = 'PHP Fatal error ('.get_class($e).') occurred during the the 5 minutes cron event action call. Error Message: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')'; + $aio_wp_security->debug_logger->log_debug($log_message, 4); + } + + $fifteen_minutes_cron_semaphore->release(); + } else { + $aio_wp_security->debug_logger->log_debug('The 15 minutes cron event lock could not get the lock.'); + } + } + + public function aiowps_hourly_cron_event_handler() { + //Do stuff that needs checking hourly + AIOWPSecurity_Comment::trash_spam_comments(); + do_action('aiowps_perform_fcd_scan_tasks'); + do_action('delete_expired_logged_in_users_event'); + } + + /** + * Run daily cron event + * + * @return void + */ + public function aiowps_daily_cron_event_handler() { + do_action('aiowps_perform_db_cleanup_tasks'); + do_action('aiowps_purge_old_debug_logs'); + do_action('aiowps_send_lockout_email'); + do_action('aios_perform_update_antibot_keys'); + do_action('aios_update_googlebot_ip_ranges'); + } + + /** + * Purges debug logs older than 90 days + * The 90 days can be modified using the constant AIOWPSEC_PURGE_DEBUG_LOGS_AFTER_DAYS + * + * @return void + */ + public function purge_old_debug_logs() { + + global $wpdb, $aio_wp_security; + + $debug_tbl_name = AIOWPSEC_TBL_DEBUG_LOG; + $after_days = 90; + + if (defined('AIOWPSEC_PURGE_DEBUG_LOGS_AFTER_DAYS')) { + $after_days = abs(AIOWPSEC_PURGE_DEBUG_LOGS_AFTER_DAYS); + } + + $after_days = empty($after_days) ? 90 : $after_days; + $older_than_date_time = strtotime('-' . $after_days . ' days', time()); + + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore + $ret = $wpdb->query($wpdb->prepare('DELETE FROM ' . $debug_tbl_name . ' WHERE logtime < %s', $older_than_date_time)); + if (false === $ret) { + $error_msg = empty($wpdb->last_error) ? 'Could not receive the reason for the failure' : $wpdb->last_error; + $aio_wp_security->debug_logger->log_debug_cron("Failed to purge older debug logs : {$error_msg}", 4); + } + } + /** + * Send email notification to an user who has flag is_lockout_email_sent is 0. + * + * @return Void + */ + public function send_lockout_email() { + global $aio_wp_security; + $aio_wp_security->user_login_obj->send_login_lockout_emails(); + } + + /** + * Update Googlebot IP ranges for the firewall configuration. + * + * This function updates the Googlebot IP ranges in the firewall configuration. + * It checks if the 'Block fake Googlebots' feature is enabled and then retrieves + * the validated Googlebot IP ranges. If the IP ranges are retrieved successfully, + * they are saved to the firewall configuration. If there is an error in retrieving + * the IP ranges, a debug message is logged. + * + * @global object $aio_wp_security The main AIO WP Security object. + * @global object $aiowps_firewall_config The AIO WP Security firewall configuration object. + * + * @return void + */ + public function aios_update_googlebot_ip_ranges() { + global $aio_wp_security; + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + + if ($aiowps_firewall_config->get_value('aiowps_block_fake_googlebots')) { + $validated_ip_list_array = AIOWPSecurity_Utility::get_googlebot_ip_ranges(); + + if (is_wp_error($validated_ip_list_array)) { + $aio_wp_security->debug_logger->log_debug('The attempt to save the IP addresses failed, because it was not possible to validate the Googlebot IP addresses: ' . $validated_ip_list_array->get_error_message(), 4); + } + + $aiowps_firewall_config->set_value('aiowps_googlebot_ip_ranges', $validated_ip_list_array); + } + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-deactivation-tasks.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-deactivation-tasks.php new file mode 100755 index 00000000..66e1ba4c --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-deactivation-tasks.php @@ -0,0 +1,47 @@ +configs->load_config(); + + if (is_main_site()) { + // Remove all firewall and other .htaccess rules and remove all settings from .htaccess file that were added by this plugin. + AIOWPSecurity_Utility_Htaccess::delete_from_htaccess(); + + // Remove user meta info so next activation if force logout on it do not logs user out + AIOWPSecurity_User_Login::remove_login_activity(); + + // Deactivate PHP-based firewall. + AIOWPSecurity_Utility_Firewall::remove_firewall(); + } + + self::clear_cron_events(); + } + + /** + * Helper function which clears aiowps cron events + */ + private static function clear_cron_events() { + wp_clear_scheduled_hook('aiowps_hourly_cron_event'); + wp_clear_scheduled_hook('aiowps_daily_cron_event'); + wp_clear_scheduled_hook('aios_15_minutes_cron_event'); + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-debug-logger.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-debug-logger.php new file mode 100755 index 00000000..f844c280 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-debug-logger.php @@ -0,0 +1,100 @@ +debug_logger->log_debug("Log messaged goes here"); + */ +if (!defined('ABSPATH')) { + exit;//Exit if accessed directly +} + +class AIOWPSecurity_Logger { + + private $debug_enabled = false; + + private $debug_readable_level = array('SUCCESS','STATUS','NOTICE','WARNING','FAILURE','CRITICAL'); + + public function __construct($debug_enabled) { + $this->debug_enabled = $debug_enabled; + } + + /** + * Translates the level code to its readable form + * + * @param integer $level_code - The level code to translate (e.g: 2) + * @return string - The level as its readable value (e.g: NOTICE) + */ + private function get_readable_level_from_code($level_code) { + return isset($this->debug_readable_level[$level_code]) ? $this->debug_readable_level[$level_code] : 'UNKNOWN'; + } + + /** + * Clears the debug logs + * + * @return int|WP_Error the amount of records deleted or WP_Error if query failed + */ + public function clear_logs() { + global $wpdb; + + $debug_log_tbl = AIOWPSEC_TBL_DEBUG_LOG; + + if (is_super_admin()) { + $ret = $wpdb->query("DELETE FROM $debug_log_tbl"); // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- We can't use %i because our plugin supports wordpress < 6.2. + } else { + $ret = $wpdb->query($wpdb->prepare("DELETE FROM $debug_log_tbl WHERE site_id = %d", get_current_blog_id())); // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- We can't use %i because our plugin supports wordpress < 6.2. + } + + if (false === $ret) { + $error_msg = empty($wpdb->last_error) ? __('Unable to get the reason why', 'all-in-one-wp-security-and-firewall') : $wpdb->last_error; + $ret = new WP_Error('db_unable_delete', __('Unable to clear the logs', 'all-in-one-wp-security-and-firewall'), $error_msg); + } + + return $ret; + } + + /** + * Logs the debug messages to the database + * + * @param string $message - The main debug message + * @param integer $level_code - The level code which indicates the severity of the message + * @param string $type - The type of debug message. Separates general debug messages from those generated by the cron, for example. + * @return void + */ + public function log_debug($message, $level_code = 0, $type = 'debug') { + + if (!$this->debug_enabled) { + return; + } + + global $wpdb; + $debug_tbl_name = AIOWPSEC_TBL_DEBUG_LOG; + + $data = array( + 'created' => current_time('mysql'), + 'level' => $this->get_readable_level_from_code($level_code), + 'network_id' => get_current_network_id(), + 'site_id' => get_current_blog_id(), + 'message' => $message, + 'type' => $type, + ); + + $ret = $wpdb->query($wpdb->prepare("INSERT INTO ".$debug_tbl_name." (created, logtime, level, network_id, site_id, message, type) VALUES (%s, UNIX_TIMESTAMP(), %s, %d, %d, %s, %s)", $data['created'], $data['level'], $data['network_id'], $data['site_id'], $data['message'], $data['type'])); // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.NotPrepared -- We can't use %i because our plugin supports wordpress < 6.2. + if (false === $ret) { + $error_msg = empty($wpdb->last_error) ? 'Could not write to the debug log' : $wpdb->last_error; + error_log("All In One WP Security : {$error_msg}"); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- We can't replace error_log with our debug logger here because the debug logger has failed. + } + } + + /** + * Logs the debug messages that relate to the cron + * + * @param string $message - The main debug message + * @param integer $level_code - The level code which indicates the severity of the message + * @return void + */ + public function log_debug_cron($message, $level_code = 0) { + $this->log_debug($message, $level_code, 'cron_debug'); + } + + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-debug.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-debug.php new file mode 100755 index 00000000..203c7671 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-debug.php @@ -0,0 +1,588 @@ + 'get_aios_info', + 'Server information' => 'get_server_info', + 'WordPress information' => 'get_wordpress_info', + 'PHP information' => 'get_php_info', + 'Database information' => 'get_database_info', + 'Plugin information' => 'get_plugins_list', + 'Must-use plugin information' => 'get_mu_plugins_list', + 'Drop-in information' => 'get_dropin_plugins_list', + 'Theme information' => 'get_themes_list', + 'IP detection methods' => 'get_ip_detection_methods', + 'Cron information' => 'get_cron_jobs_list', + ); + + /** + * Constructor + * + * @return void + */ + public function __construct() { + add_action('aiowp_security_additional_report_actions', array($this, 'add_sender_report_actions')); + } + + /** + * Get AIOS Information + * + * @return array AIOS information + */ + private static function get_aios_info() { + + $aios_info = array( + 'AIOS plugin version' => AIO_WP_SECURITY_VERSION, + 'AIOS DB version' => AIO_WP_SECURITY_DB_VERSION, + 'AIOS firewall version' => AIO_WP_SECURITY_FIREWALL_VERSION, + 'AIOS Premium installed' => AIOWPSecurity_Utility_Permissions::is_premium_installed() ? 'Yes' : 'No', + ); + + if (AIOWPSecurity_Utility_Permissions::is_premium_installed()) { + $aios_info['AIOS Premium version'] = AIOWPS_PREMIUM_VERSION; + } + + return apply_filters('aiowp_security_get_aios_info', $aios_info); + } + + /** + * Get Server Information + * + * @return array Server information + */ + private static function get_server_info() { + + $server_info = array( + 'Operating system' => php_uname('s') . ' ' . php_uname('r'), + 'Server' => $_SERVER['SERVER_SOFTWARE'], + 'Memory usage' => AIOWPSecurity_Utility::convert_numeric_size_to_text(memory_get_peak_usage(true)), + ); + + if (function_exists('disk_total_space')) { + $server_info = array_merge($server_info, array( + 'Total space' => AIOWPSecurity_Utility::convert_numeric_size_to_text(disk_total_space('/')), + 'Used space' => AIOWPSecurity_Utility::convert_numeric_size_to_text(disk_total_space('/') - disk_free_space('/')), + )); + } + return apply_filters('aiowp_security_get_server_info', $server_info); + } + + /** + * Get PHP Information + * + * @return array PHP information + */ + private static function get_php_info() { + + $php_info = array( + 'PHP version' => phpversion(), + 'PHP expose php' => ini_get('expose_php') ? 'Active' : 'Inactive', + 'PHP allow url fopen' => ini_get('allow_url_fopen') ? 'Active' : 'Inactive', + 'PHP memory limit' => ini_get('memory_limit'), + 'PHP upload max filesize' => ini_get('upload_max_filesize'), + 'PHP post max size' => ini_get('post_max_size'), + 'PHP max execution time' => ini_get('max_execution_time'), + 'PHP max input time' => ini_get('max_input_time'), + 'Process owner' => (function_exists('posix_geteuid') && function_exists('posix_getpwuid')) ? posix_getpwuid(posix_geteuid())['name'] : 'Unknown', + 'OpenSSL support' => extension_loaded('openssl') ? 'OK' : 'Not Installed', + 'OpenSSL version' => extension_loaded('openssl') ? OPENSSL_VERSION_TEXT : 'Unknown', + 'cURL support' => function_exists('curl_init') ? 'OK' : 'Not Installed', + 'cURL features code' => function_exists('curl_version') ? curl_version()['features'] : 'Unknown', + 'cURL host' => function_exists('curl_version') ? curl_version()['host'] : 'Unknown', + 'cURL support protocols' => function_exists('curl_version') ? implode(', ', curl_version()['protocols']) : 'Unknown', + 'cURL SSL version' => function_exists('curl_version') ? curl_version()['ssl_version'] : 'Unknown', + 'cURL libz version' => function_exists('curl_version') ? curl_version()['libz_version'] : 'Unknown', + 'Checking display_errors' => ini_get('display_errors') ? 'Enabled' : 'Disabled', + ); + + return apply_filters('aiowp_security_get_php_info', $php_info); + } + + /** + * Retrieves detailed information about the WordPress configuration. + * + * @return array WordPress configuration information + */ + private static function get_wordpress_info() { + + // Include version.php to retrieve the actual WordPress version + require_once ABSPATH . WPINC . '/version.php'; + + global $wp_version; + + $wp_info = array( + 'WordPress version' => $wp_version, + 'Multisite' => is_multisite() ? 'Yes' : 'No', // Checking if the site is multisite + 'ABSPATH' => ABSPATH, + 'WP_DEBUG' => (defined('WP_DEBUG') && WP_DEBUG) ? 'On' : 'Off', + 'WP_DEBUG_LOG' => (defined('WP_DEBUG_LOG') && WP_DEBUG_LOG) ? 'Enabled' : 'Disabled', + 'WP_DEBUG_DISPLAY' => (defined('WP_DEBUG_DISPLAY') && WP_DEBUG_DISPLAY) ? 'Enabled' : 'Disabled', + 'SCRIPT_DEBUG' => (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG) ? 'On' : 'Off', + 'SAVEQUERIES' => (defined('SAVEQUERIES') && SAVEQUERIES) ? 'On' : 'Off', + 'DB_CHARSET' => defined('DB_CHARSET') ? DB_CHARSET : '(not set)', + 'DB_COLLATE' => defined('DB_COLLATE') ? DB_COLLATE : '(not set)', + 'WP_SITEURL' => defined('WP_SITEURL') ? WP_SITEURL : '(not set)', + 'WP_HOME' => defined('WP_HOME') ? WP_HOME : '(not set)', + 'WP_CONTENT_DIR' => defined('WP_CONTENT_DIR') ? WP_CONTENT_DIR : '(not set)', + 'WP_CONTENT_URL' => defined('WP_CONTENT_URL') ? WP_CONTENT_URL : '(not set)', + 'WP_PLUGIN_DIR' => defined('WP_PLUGIN_DIR') ? WP_PLUGIN_DIR : '(not set)', + 'WP_LANG_DIR' => defined('WP_LANG_DIR') ? WP_LANG_DIR : '(not set)', + 'WPLANG' => defined('WPLANG') ? WPLANG : '(not set)', + 'UPLOADS' => defined('UPLOADS') ? UPLOADS : '(not set)', + 'TEMPLATEPATH' => defined('TEMPLATEPATH') ? TEMPLATEPATH : '(not set)', + 'STYLESHEETPATH' => defined('STYLESHEETPATH') ? STYLESHEETPATH : '(not set)', + 'AUTOSAVE_INTERVAL' => defined('AUTOSAVE_INTERVAL') ? AUTOSAVE_INTERVAL : '', + 'WP_POST_REVISIONS' => defined('WP_POST_REVISIONS') ? WP_POST_REVISIONS : 'Unlimited', + 'COOKIE_DOMAIN' => defined('COOKIE_DOMAIN') ? COOKIE_DOMAIN : '(not set)', + 'COOKIEPATH' => defined('COOKIEPATH') ? COOKIEPATH : '/', + 'SITECOOKIEPATH' => defined('SITECOOKIEPATH') ? SITECOOKIEPATH : '/', + 'ADMIN_COOKIE_PATH' => defined('ADMIN_COOKIE_PATH') ? ADMIN_COOKIE_PATH : '/', + 'PLUGINS_COOKIE_PATH' => defined('PLUGINS_COOKIE_PATH') ? PLUGINS_COOKIE_PATH : '/wp-content/plugins', + 'NOBLOGREDIRECT' => defined('NOBLOGREDIRECT') ? NOBLOGREDIRECT : '(not set)', + 'CONCATENATE_SCRIPTS' => defined('CONCATENATE_SCRIPTS') ? (CONCATENATE_SCRIPTS ? 'Yes' : 'No') : 'No', // Checking if CONCATENATE_SCRIPTS is defined + 'WP_MEMORY_LIMIT' => defined('WP_MEMORY_LIMIT') ? WP_MEMORY_LIMIT : '', + 'WP_MAX_MEMORY_LIMIT' => defined('WP_MAX_MEMORY_LIMIT') ? WP_MAX_MEMORY_LIMIT : '', + 'WP_CACHE' => defined('WP_CACHE') ? (WP_CACHE ? 'Enabled' : 'Disabled') : 'Disabled', + 'CUSTOM_USER_TABLE' => defined('CUSTOM_USER_TABLE') ? CUSTOM_USER_TABLE : '(not set)', + 'CUSTOM_USER_META_TABLE' => defined('CUSTOM_USER_META_TABLE') ? CUSTOM_USER_META_TABLE : '(not set)', + 'FS_CHMOD_DIR' => defined('FS_CHMOD_DIR') ? FS_CHMOD_DIR : '(not set)', + 'FS_CHMOD_FILE' => defined('FS_CHMOD_FILE') ? FS_CHMOD_FILE : '(not set)', + 'ALTERNATE_WP_CRON' => defined('ALTERNATE_WP_CRON') ? (ALTERNATE_WP_CRON ? 'Enabled' : 'Disabled') : 'Disabled', + 'DISABLE_WP_CRON' => defined('DISABLE_WP_CRON') ? (DISABLE_WP_CRON ? 'Cron is disabled' : 'Cron is enabled') : 'Cron is enabled', + 'WP_CRON_LOCK_TIMEOUT' => defined('WP_CRON_LOCK_TIMEOUT') ? WP_CRON_LOCK_TIMEOUT : '', + 'EMPTY_TRASH_DAYS' => defined('EMPTY_TRASH_DAYS') ? EMPTY_TRASH_DAYS : '', + 'WP_ALLOW_REPAIR' => defined('WP_ALLOW_REPAIR') ? (WP_ALLOW_REPAIR ? 'Enabled' : 'Disabled') : 'Disabled', + 'DO_NOT_UPGRADE_GLOBAL_TABLES' => defined('DO_NOT_UPGRADE_GLOBAL_TABLES') ? (DO_NOT_UPGRADE_GLOBAL_TABLES ? 'Yes' : 'No') : 'No', // Checking if DO_NOT_UPGRADE_GLOBAL_TABLES is defined + 'DISALLOW_FILE_EDIT' => defined('DISALLOW_FILE_EDIT') ? (DISALLOW_FILE_EDIT ? 'Yes' : 'No') : 'No', // Checking if DISALLOW_FILE_EDIT is defined + 'DISALLOW_FILE_MODS' => defined('DISALLOW_FILE_MODS') ? (DISALLOW_FILE_MODS ? 'Yes' : 'No') : 'No', // Checking if DISALLOW_FILE_MODS is defined + 'IMAGE_EDIT_OVERWRITE' => defined('IMAGE_EDIT_OVERWRITE') ? (IMAGE_EDIT_OVERWRITE ? 'Yes' : 'No') : 'No', // Checking if IMAGE_EDIT_OVERWRITE is defined + 'FORCE_SSL_ADMIN' => defined('FORCE_SSL_ADMIN') ? (FORCE_SSL_ADMIN ? 'Yes' : 'No') : 'No', // Checking if FORCE_SSL_ADMIN is defined + 'WP_HTTP_BLOCK_EXTERNAL' => defined('WP_HTTP_BLOCK_EXTERNAL') ? (WP_HTTP_BLOCK_EXTERNAL ? 'Yes' : 'No') : 'No', // Checking if WP_HTTP_BLOCK_EXTERNAL is defined + 'WP_ACCESSIBLE_HOSTS' => defined('WP_ACCESSIBLE_HOSTS') ? WP_ACCESSIBLE_HOSTS : '(not set)', + 'WP_AUTO_UPDATE_CORE' => defined('WP_AUTO_UPDATE_CORE') ? WP_AUTO_UPDATE_CORE : 'Default', + 'WP_PROXY_HOST' => defined('WP_PROXY_HOST') ? WP_PROXY_HOST : '(not set)', + 'WP_PROXY_PORT' => defined('WP_PROXY_PORT') ? WP_PROXY_PORT : '(not set)', + 'MULTISITE' => defined('MULTISITE') ? (MULTISITE ? 'Yes' : 'No') : 'No', // Checking if MULTISITE is defined + 'WP_ALLOW_MULTISITE' => defined('WP_ALLOW_MULTISITE') ? (WP_ALLOW_MULTISITE ? 'Yes' : 'No') : 'No', // Checking if WP_ALLOW_MULTISITE is defined + 'SUNRISE' => defined('SUNRISE') ? (SUNRISE ? 'Yes' : 'No') : 'No', // Checking if SUNRISE is defined + 'SUBDOMAIN_INSTALL' => defined('SUBDOMAIN_INSTALL') ? (SUBDOMAIN_INSTALL ? 'Yes' : 'No') : 'No', // Checking if SUBDOMAIN_INSTALL is defined + 'VHOST' => defined('VHOST') ? (VHOST ? 'Yes' : 'No') : 'No', // Checking if VHOST is defined + 'DOMAIN_CURRENT_SITE' => defined('DOMAIN_CURRENT_SITE') ? DOMAIN_CURRENT_SITE : '(not set)', + 'PATH_CURRENT_SITE' => defined('PATH_CURRENT_SITE') ? PATH_CURRENT_SITE : '(not set)', + 'BLOG_ID_CURRENT_SITE' => defined('BLOG_ID_CURRENT_SITE') ? BLOG_ID_CURRENT_SITE : '(not set)', + 'WP_DISABLE_FATAL_ERROR_HANDLER' => defined('WP_DISABLE_FATAL_ERROR_HANDLER') ? (WP_DISABLE_FATAL_ERROR_HANDLER ? 'Yes' : 'No') : 'No', // Checking if WP_DISABLE_FATAL_ERROR_HANDLER is defined + 'AUTOMATIC_UPDATER_DISABLED' => defined('AUTOMATIC_UPDATER_DISABLED') ? (AUTOMATIC_UPDATER_DISABLED ? 'Yes' : 'No') : 'No' // Checking if AUTOMATIC_UPDATER_DISABLED is defined + ); + + return apply_filters('aiowp_security_get_wordpress_info', $wp_info); + } + + /** + * Get a list of active and inactive plugins. + * + * @return array List of plugins with their status (active/inactive). + */ + private static function get_plugins_list() { + $plugins = get_plugins(); + $active_plugins = get_option('active_plugins', array()); + + $plugins_list = array(); + + if (empty($plugins)) { + return array('No plugins found' => '-'); + } + + foreach ($plugins as $plugin_path => $plugin_info) { + $plugin_slug = strtolower(basename($plugin_path, '.php')); + $plugin_status = in_array($plugin_path, $active_plugins) ? 'Active' : 'Inactive'; + $plugin_version = $plugin_info['Version']; + $plugin_name = $plugin_info['Name']; + + $plugin_key = "$plugin_name ($plugin_slug) [$plugin_version]"; + + $plugins_list[$plugin_key] = $plugin_status; + } + + return apply_filters('aiowp_security_get_plugins_info', $plugins_list); + } + + /** + * Get a list of themes with their status (active/inactive), version, and slug. + * + * @return array List of themes. + */ + private static function get_themes_list() { + $themes = wp_get_themes(); + $active_theme = wp_get_theme(); + $themes_list = array(); + + if (empty($themes)) { + return array('No themes found' => '-'); + } + + foreach ($themes as $theme_slug => $theme_info) { + $theme_name = $theme_info->get('Name'); + $theme_version = $theme_info->get('Version'); + $theme_status = $theme_info->get_stylesheet() === $active_theme->get_stylesheet() ? 'Active' : 'Inactive'; + + $theme_key = "$theme_name ($theme_slug) [$theme_version]"; + $themes_list[$theme_key] = $theme_status; + } + + return apply_filters('aiowp_security_get_themes_info', $themes_list); + } + + /** + * Get database information + * + * @return array Database information + */ + private static function get_database_info() { + global $wpdb; + + $database_info = array( + 'Database version' => $wpdb->db_version(), + 'DELETE' => self::check_mysql_privilege('DELETE'), + 'INSERT' => self::check_mysql_privilege('INSERT'), + 'UPDATE' => self::check_mysql_privilege('UPDATE'), + 'SELECT' => self::check_mysql_privilege('SELECT'), + 'CREATE TABLE' => self::check_mysql_privilege('CREATE TABLE'), + 'ALTER TABLE' => self::check_mysql_privilege('ALTER TABLE'), + 'DROP' => self::check_mysql_privilege('DROP'), + 'TRUNCATE' => self::check_mysql_privilege('TRUNCATE') + ); + + return apply_filters('aiowp_security_get_database_info', $database_info); + } + + /** + * Get a list of Must Use (MU) plugins. + * + * @return array List of MU plugins. + */ + private static function get_mu_plugins_list() { + $mu_plugins = get_mu_plugins(); + $mu_plugins_list = array(); + + if (empty($mu_plugins)) { + return array('No Must-use plugins found' => '-'); + } + + foreach ($mu_plugins as $mu_plugin_path => $mu_plugin_info) { + $mu_plugin_slug = basename($mu_plugin_path, '.php'); + $mu_plugin_version = $mu_plugin_info['Version']; + $mu_plugin_name = $mu_plugin_info['Name']; + + $mu_plugin_key = "$mu_plugin_name ($mu_plugin_slug) [$mu_plugin_version]"; + + $mu_plugins_list[$mu_plugin_key] = 'Active'; + } + + return apply_filters('aiowp_security_get_mu_plugins_info', $mu_plugins_list); + } + + /** + * Get a list of drop-in plugins. + * + * @return array List of drop-in plugins. + */ + private static function get_dropin_plugins_list() { + $dropins = _get_dropins(); + $dropins_list = array(); + + if ('' === $dropins) { + return array('No drop-in plugins found' => '-'); + } + + foreach ($dropins as $dropin_file => $dropin_info) { + $dropin_status = true === $dropin_info[1] ? 'Active' : 'Inactive'; + $dropin_description = $dropin_info[0]; + + $dropin_key = "$dropin_file [$dropin_description]"; + $dropins_list[$dropin_key] = $dropin_status; + } + + return apply_filters('aiowp_security_get_dropin_plugins_info', $dropins_list); + } + + /** + * Get a list of cron jobs scheduled in WordPress. + * + * @return array List of cron jobs. + */ + public static function get_cron_jobs_list() { + $cron_jobs = _get_cron_array(); + $cron_jobs_list = array(); + + $failed_jobs = 0; + + if (empty($cron_jobs)) { + return array(); // Return an empty array if no cron jobs are found. + } + + $current_timestamp = time(); + $cron_jobs_list['Failed cron jobs'] = $failed_jobs; + foreach ($cron_jobs as $timestamp => $cron_events) { + foreach ($cron_events as $event_hook => $event_data) { + foreach ($event_data as $schedule => $callback) { + if ($timestamp < $current_timestamp) { + $failed_jobs++; + } + $schedule = $callback['schedule']; + $cron_jobs_list[$event_hook] = $schedule; + } + } + } + + return apply_filters('aiowp_security_get_cron_jobs_info', $cron_jobs_list); + } + + /** + * Get debug log + * + * @param bool $html Whether to return the debug log as HTML + * + * @return string Debug log + */ + private static function get_debug_log($html = false) { + global $wpdb, $aio_wp_security; + + if ('1' === $aio_wp_security->configs->get_value('aiowps_enable_debug')) { + + $debug_log_tbl = AIOWPSEC_TBL_DEBUG_LOG; + + $where_sql = is_super_admin() ? '' : 'WHERE site_id = %d'; + $query = "SELECT * FROM {$debug_log_tbl} {$where_sql} ORDER BY id DESC LIMIT 100"; + + $debug_logs = is_super_admin() ? $wpdb->get_results($query, ARRAY_A) : $wpdb->get_results($wpdb->prepare($query, get_current_blog_id()), ARRAY_A); + + if ($html) { + $debug_log = "

Debug log

"; + } else { + $debug_log = "\n --- Debug log --- \n\n"; + } + + foreach ($debug_logs as $log) { + $date_time = esc_html($log['created']); + $level = esc_html($log['level']); + $message = esc_html($log['message']); + $type = esc_html($log['type']); + + if ($html) { + $debug_log .= "Only the most recent 100 logs are displayed
"; + $debug_log .= "Date and time: $date_time
"; + $debug_log .= "Level: $level
"; + $debug_log .= "Message: $message
"; + $debug_log .= "Type: $type

"; + } else { + $debug_log .= "Only the most recent 100 logs are displayed.\n"; + $debug_log .= "Date and time: $date_time\n"; + $debug_log .= "Level: $level\n"; + $debug_log .= "Message: $message\n"; + $debug_log .= "Type: $type\n\n"; + } + } + + return apply_filters('aiowp_security_get_debug_log_info', $debug_log); + } + } + + /** + * Get the IP address detection methods and their status + * + * @return array IP detection methods and their status + */ + private static function get_ip_detection_methods() { + global $aio_wp_security; + $ip_detection_methods = AIOS_Abstracted_Ids::get_ip_retrieve_methods(); + + $active_method = $aio_wp_security->configs->get_site_value('aiowps_ip_retrieve_method'); // In a multisite network, this setting is available for the main site only. + $active_method = empty($active_method) ? 0 : (int) $active_method; + + $ip_detection_list = array(); + + foreach ($ip_detection_methods as $method => $variable) { + $status = ($method === $active_method) ? ' - ' . __('status', 'all-in-one-wp-security-and-firewall') . ': ' . __('On', 'all-in-one-wp-security-and-firewall') : ''; + $ip_address = (!empty($_SERVER[$variable])) ? $_SERVER[$variable] : ''; + $ip_detection_list[$variable] = __('IP', 'all-in-one-wp-security-and-firewall') . ': ' . $ip_address . $status; + } + + return $ip_detection_list; + } + + /** + * Check if the current MySQL user has the specified privilege + * + * @param string $privilege Privilege to check + * + * @return string 'OK' if the user has the privilege, 'Not OK' otherwise + */ + private static function check_mysql_privilege($privilege) { + global $wpdb; + $grants = $wpdb->get_results("SHOW GRANTS FOR CURRENT_USER", ARRAY_N); + foreach ($grants as $grant) { + foreach ($grant as $grant_string) { + if (strpos(strtoupper($grant_string), 'ALL PRIVILEGES') !== false || strpos(strtoupper($grant_string), strtoupper($privilege)) !== false) { + return 'OK'; + } + } + } + return 'Not OK'; + } + + /** + * Generate the debug report + * + * @return string Debug report + */ + public static function generate_report() { + + $data = ''; + $section_content = array(); + + foreach (self::$sections as $title => $method) { + $section_title = esc_html($title); + $section_content = self::$method(); + + // Check if the section content is empty, and handle accordingly. + if (empty($section_content)) { + $section_content = array('No data available'); + } + + $data .= AIOWPSecurity_Reporting::generate_report_sections('table', $section_content, $section_title); + } + + return $data; + } + + /** + * Generate a report for the diagnostics page + * + * @param string $title The title of the report + * + * @return string Report textarea + */ + public static function generate_report_textarea($title) { + $main_content = ''; + + $report_content = $title . "\n\n===================================\n"; + + foreach (self::$sections as $title => $method) { + $section_title = esc_html($title); + $section_content = self::$method(); + $main_content .= AIOWPSecurity_Reporting::generate_report_sections('text', $section_content, $section_title); + } + + $main_content .= self::get_debug_log(); + + $report_content = apply_filters('aiowp_security_generate_report_content', $report_content . $main_content); + + $escaped_content = esc_textarea($report_content); + + return ''; + } + + /** + * Generate sender action button and field + * + * @return string sender action button and email field + */ + public static function add_sender_report_actions() { + $report_sections = ''; + foreach (self::$sections as $title => $method) { + $section_title = esc_html($title); + $section_content = self::$method(); + $report_sections .= AIOWPSecurity_Reporting::generate_report_sections('table', $section_content, $section_title); + } + $encoded_report_sections = htmlentities($report_sections); + + $data = '

'; + $data .= '

'; + $data .= ''; + $data .= ''; + $data .= '
'; + + // Allow only safe HTML in the response + echo wp_kses($data, array( + 'div' => array(), + 'form' => array( + 'action' => true, + 'method' => true, + ), + 'input' => array( + 'type' => true, + 'id' => true, + 'placeholder' => true, + 'value' => true, + 'required' => true, + ), + 'button' => array( + 'class' => true, + 'id' => true, + ), + 'br' => array(), + )); + } + + /** + * Get the current user email if admin or the site admin email + * + * @return string The email address + */ + private static function get_current_user_email() { + $user = wp_get_current_user(); + if ($user && in_array('administrator', (array) $user->roles, true)) { + return $user->user_email; + } else { + return get_option('admin_email'); + } + } + + /** + * Send the report email + * + * @global AIO_WP_Security $aio_wp_security + * + * @param string $email The email address to send the report to. + * @param string $sections The report sections html. + * + * @return boolean True if the email was sent successfully, false otherwise + */ + public static function send_report($email, $sections) { + global $aio_wp_security; + + $report = ''; + $report .= '

' . esc_html('All-In-One Security diagnostics report') . '

'; + + $site_name = esc_html(get_bloginfo('name')); + $report .= '

' . 'Site name' . ': ' . $site_name . "

"; + + $site_url = esc_url(get_bloginfo('url')); + $report .= '

' . 'Site URL' . ': ' . '' . $site_url . '

'; + + $current_datetime = date_i18n(get_option('date_format') . ' ' . get_option('time_format')); + $report .= '

' . 'Date and time' . ': ' . $current_datetime . "

"; + + $report .= $sections; + + $report .= self::get_debug_log(true); + + $report .= '

' . esc_html('This report was generated by the All-In-One Security plugin.') . '

'; + $subject = esc_html('All-In-One Security - diagnostic report'); + + $result = $aio_wp_security->sender_obj->send_email($email, $subject, $report); + + return $result; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-file-scan.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-file-scan.php new file mode 100755 index 00000000..cbc1ec83 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-file-scan.php @@ -0,0 +1,381 @@ +configs->get_value('aiowps_fcd_filename'); + if (empty($fcd_filename)) { + // means that we haven't done a scan before, or, + // the fcd file containing the results doesn't exist + $random_suffix = AIOWPSecurity_Utility::generate_alpha_numeric_random_string(10); + $fcd_filename = 'aiowps_fcd_data_' . $random_suffix; + $aio_wp_security->configs->set_value('aiowps_fcd_filename', $fcd_filename, true); + } + + $fcd_data = self::get_fcd_data(); // get previous scan data if any + + if (false === $fcd_data) { + // an error occurred so return + return false; + } + + $scanned_data = $this->do_file_change_scan(); + + if (empty($fcd_data)) { + $this->save_fcd_data($scanned_data); + $scan_result['initial_scan'] = '1'; + return $scan_result; + } else { + + $scan_result = $this->compare_scan_data($fcd_data['file_scan_data'], $scanned_data); + + $scan_result['initial_scan'] = ''; + $this->save_fcd_data($scanned_data, $scan_result); + if (!empty($scan_result['files_added']) || !empty($scan_result['files_removed']) || !empty($scan_result['files_changed'])) { + //This means there was a change detected + $aio_wp_security->configs->set_value('aiowps_fcds_change_detected', true, true); + $aio_wp_security->debug_logger->log_debug(__METHOD__ . " - change to filesystem detected!"); + + $this->aiowps_send_file_change_alert_email($scan_result); //Send file change scan results via email if applicable + } else { + //Reset the change flag + $aio_wp_security->configs->set_value('aiowps_fcds_change_detected', false, true); + } + return $scan_result; + } + } + + /** + * Send email with notification about file changes detected by last scan. + * + * @global AIO_WP_Security $aio_wp_security + * @param array $scan_result Array with scan result returned by compare_scan_data() method. + */ + public function aiowps_send_file_change_alert_email($scan_result) { + global $aio_wp_security; + if ('1' == $aio_wp_security->configs->get_value('aiowps_send_fcd_scan_email')) { + $subject = __('All In One WP Security - File change detected', 'all-in-one-wp-security-and-firewall') . ' ' . AIOWPSecurity_Utility::convert_timestamp(null, 'l, F jS, Y \a\\t g:i a'); + //$attachment = array(); + $message = __('A file change was detected on your system for site URL', 'all-in-one-wp-security-and-firewall') . ' ' . network_site_url() . __('. Scan was generated on', 'all-in-one-wp-security-and-firewall') . ' ' . AIOWPSecurity_Utility::convert_timestamp(null, 'l, F jS, Y \a\\t g:i a'); + $message .= "\r\n\r\n".__('A summary of the scan results is shown below:', 'all-in-one-wp-security-and-firewall'); + $message .= "\r\n\r\n"; + $message .= self::get_file_change_summary($scan_result); + $message .= "\r\n".__('Login to your site to view the scan details.', 'all-in-one-wp-security-and-firewall'); + + // Get the email address(es). + $addresses = AIOWPSecurity_Utility::get_array_from_textarea_val($aio_wp_security->configs->get_value('aiowps_fcd_scan_email_address')); + // If no explicit email address(es) are given, send email to site admin. + $to = empty($addresses) ? array(get_site_option('admin_email')) : $addresses; + if (!wp_mail($to, $subject, $message)) { + $aio_wp_security->debug_logger->log_debug(__METHOD__ . " - File change notification email failed to send.", 4); + } + + } + } + + /** + * This function is called via the following filter 'aiowps_perform_fcd_scan_tasks' and will start the file scan + * + * @return void + */ + public function aiowps_scheduled_fcd_scan_handler() { + global $aio_wp_security; + + if ('1' != $aio_wp_security->configs->get_value('aiowps_enable_automated_fcd_scan')) return; + + $aio_wp_security->debug_logger->log_debug_cron(__METHOD__ . " - Scheduled fcd_scan is enabled. Checking now to see if scan needs to be done..."); + + $current_time = time(); + + $next_fcd_scan_time = self::get_next_scheduled_scan(); + + if ($next_fcd_scan_time <= $current_time) { + // It's time to do a filescan + $result = $this->execute_file_change_detection_scan(); + if (false === $result) { + $aio_wp_security->debug_logger->log_debug(__METHOD__ . " - Scheduled filescan operation failed.", 4); + } else { + $aio_wp_security->configs->set_value('aiowps_last_fcd_scan_time', $current_time, true); + } + } + + } + + /** + * This function will get the next scheduled scan timestamp and return it + * + * @return int|bool - the next scheduled scan timestamp, or false if the scheduled scan is not setup + */ + public static function get_next_scheduled_scan() { + global $aio_wp_security; + + if ('1' != $aio_wp_security->configs->get_value('aiowps_enable_automated_fcd_scan')) return false; + + $fcd_scan_frequency = $aio_wp_security->configs->get_value('aiowps_fcd_scan_frequency'); // Number of hours or days or months interval + $interval_setting = $aio_wp_security->configs->get_value('aiowps_fcd_scan_interval'); // Hours/Days/Months + switch ($interval_setting) { + case '0': + $interval = 'hours'; + break; + case '1': + $interval = 'days'; + break; + case '2': + $interval = 'weeks'; + break; + } + $last_fcd_scan_time = $aio_wp_security->configs->get_value('aiowps_last_fcd_scan_time'); + if (null == $last_fcd_scan_time) { + // Set the last scan time to now so it can trigger for the next scheduled period + $last_fcd_scan_time = time(); + $aio_wp_security->configs->set_value('aiowps_last_fcd_scan_time', $last_fcd_scan_time, true); + } elseif (is_string($last_fcd_scan_time)) { + $last_fcd_scan_time = strtotime($last_fcd_scan_time); + $aio_wp_security->configs->set_value('aiowps_last_fcd_scan_time', $last_fcd_scan_time, true); + } + $next_fcd_scan_time = strtotime("+".abs($fcd_scan_frequency).$interval, $last_fcd_scan_time); + + return $next_fcd_scan_time; + } + + /** + * Get the last filechange detection data which is stored in the special file. + * + * @global AIO_WP_Security $aio_wp_security + * @return bool|array - false on failure, array on success + */ + public static function get_fcd_data() { + // phpcs:disable WordPress.WP.AlternativeFunctions -- Silence wp_filesystem method suggestion. We cannot use that method. + global $aio_wp_security; + $aiowps_backup_dir = WP_CONTENT_DIR.'/'.AIO_WP_SECURITY_BACKUPS_DIR_NAME; + + $fcd_filename = $aio_wp_security->configs->get_value('aiowps_fcd_filename'); + if (empty($fcd_filename)) { + // means that we haven't done a scan before, or, + // the fcd file containing the results doesn't exist + $random_suffix = AIOWPSecurity_Utility::generate_alpha_numeric_random_string(10); + $fcd_filename = 'aiowps_fcd_data_' . $random_suffix; + $aio_wp_security->configs->set_value('aiowps_fcd_filename', $fcd_filename, true); + } + $results_file = $aiowps_backup_dir. '/'. $fcd_filename; + + if (!is_file($results_file)) { + if (is_dir($results_file)) { + $new_dir_name = $results_file . '_backup'; + rename($results_file, $new_dir_name); //Rename the folder to create backup of the folder. This condition should not really happen, but if it does (user sets some non-sensible value), then it's better to not nuke the existing folder + } + $fp = @fopen($results_file, 'w'); //open for write - will create file if doesn't exist + return array(); + } + + if (empty(filesize($results_file))) { + return array(); // if newly created file return empty array + } + + $fp = @fopen($results_file, 'r'); //open for read and write - will create file if doesn't exist + if (false === $fp) { + // Error + $aio_wp_security->debug_logger->log_debug(__METHOD__ . " - fopen returned false when opening fcd data file"); + return false; + } + + $contents = fread($fp, filesize($results_file)); + fclose($fp); + if (false === $contents) { + // Error + $aio_wp_security->debug_logger->log_debug(__METHOD__ . " - fread returned false when reading fcd data file"); + return false; + } else { + + $fcd_file_contents = json_decode($contents, true); + if (isset($fcd_file_contents['file_scan_data'])) { + return $fcd_file_contents; + } else { + return array(); + } + + } + + // phpcs:enable WordPress.WP.AlternativeFunctions -- Silence wp_filesystem method suggestion. We cannot use that method. + } + + /** + * Recursively scan the entire $start_dir directory and return file size + * and last modified date of every regular file. Ignore files and file + * types specified in file scanner settings. + * + * @global AIO_WP_Security $aio_wp_security + * @param string $start_dir + * @return array + */ + public function do_file_change_scan($start_dir = ABSPATH) { + global $aio_wp_security; + $filescan_data = array(); + // Iterator key is absolute file path, iterator value is SplFileInfo object, + // iteration skips '..' and '.' records, because we're not interested in directories. + $dit = new RecursiveDirectoryIterator($start_dir, FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS); + $rit = new RecursiveIteratorIterator($dit, RecursiveIteratorIterator::SELF_FIRST, RecursiveIteratorIterator::CATCH_GET_CHILD); + + // Grab files/directories to skip + $files_to_skip = AIOWPSecurity_Utility::explode_trim_filter_empty($aio_wp_security->configs->get_value('aiowps_fcd_exclude_files')); + // Grab (lowercased) file types to skip + $file_types_to_skip = AIOWPSecurity_Utility::explode_trim_filter_empty(strtolower($aio_wp_security->configs->get_value('aiowps_fcd_exclude_filetypes'))); + + $start_dir_length = strlen($start_dir); + + foreach ($rit as $filename => $fileinfo) { + + if (!file_exists($filename) || is_dir($filename)) { + continue; // if file doesn't exist or is a directory move on to next iteration + } + + if ($fileinfo->getFilename() == 'wp-security-log-cron-job.txt' || $fileinfo->getFilename() == 'wp-security-log.txt') { + continue; // Skip AIOS log files + } + + // Let's omit any file types from the scan which were specified in the settings if necessary + if (!empty($file_types_to_skip)) { + //$current_file_ext = strtolower($fileinfo->getExtension()); //getExtension() only available on PHP 5.3.6 or higher + $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); + if (in_array($ext, $file_types_to_skip)) { + continue; + } + } + + // Let's omit specific files or directories from the scan which were specified in the settings + if (!empty($files_to_skip)) { + + $skip_this = false; + foreach ($files_to_skip as $f_or_dir) { + // Expect files/dirs to be specified relatively to $start_dir, + // so start searching at $start_dir_length offset. + if (strpos($filename, $f_or_dir, $start_dir_length) !== false) { + $skip_this = true; + break; // ! + } + } + if ($skip_this) { + continue; + } + } + + $filescan_data[$filename] = array( + 'last_modified' => $fileinfo->getMTime(), + 'filesize' => $fileinfo->getSize(), + ); + + } + return $filescan_data; + } + + public function compare_scan_data($last_scan_data, $new_scanned_data) { + // Identify new files added: get all files which are in the new scan but not present in the old scan + $files_added = @array_diff_key($new_scanned_data, $last_scan_data); + // Identify files deleted: get all files which are in the old scan but not present in the new scan + $files_removed = @array_diff_key($last_scan_data, $new_scanned_data); + // Identify existing files: get all files which are in new scan, but were not added + $files_kept = @array_diff_key($new_scanned_data, $files_added); + + $files_changed = array(); + + // Loop through existing files and determine, if they have been changed + foreach ($files_kept as $filename => $new_scan_meta) { + $last_scan_meta = $last_scan_data[$filename]; + // Check filesize and last_modified values + if (($new_scan_meta['last_modified'] !== $last_scan_meta['last_modified']) || ($new_scan_meta['filesize'] !== $last_scan_meta['filesize'])) { + $files_changed[$filename] = $new_scan_meta; + } + } + + // Create single array of all changes + return array( + 'files_added' => $files_added, + 'files_removed' => $files_removed, + 'files_changed' => $files_changed, + ); + } + + public static function get_file_change_summary($scan_result) { + $scan_summary = ""; + if (!empty($scan_result['files_added'])) { + //Output of files added + $scan_summary .= "\r\n".__('The following files were added to your host', 'all-in-one-wp-security-and-firewall').":\r\n"; + foreach ($scan_result['files_added'] as $key => $value) { + $scan_summary .= "\r\n".$key.' ('.__('modified on:', 'all-in-one-wp-security-and-firewall'). ' ' . AIOWPSecurity_Utility::convert_timestamp($value['last_modified']).')'; + } + $scan_summary .= "\r\n======================================\r\n"; + } + if (!empty($scan_result['files_removed'])) { + //Output of files removed + $scan_summary .= "\r\n".__('The following files were removed from your host', 'all-in-one-wp-security-and-firewall').":\r\n"; + foreach ($scan_result['files_removed'] as $key => $value) { + $scan_summary .= "\r\n".$key.' ('.__('modified on:', 'all-in-one-wp-security-and-firewall'). ' ' . AIOWPSecurity_Utility::convert_timestamp($value['last_modified']).')'; + } + $scan_summary .= "\r\n======================================\r\n"; + } + + if (!empty($scan_result['files_changed'])) { + //Output of files changed + $scan_summary .= "\r\n".__('The following files were changed on your host', 'all-in-one-wp-security-and-firewall').":\r\n"; + foreach ($scan_result['files_changed'] as $key => $value) { + $scan_summary .= "\r\n".$key.' ('.__('modified on:', 'all-in-one-wp-security-and-firewall'). ' ' . AIOWPSecurity_Utility::convert_timestamp($value['last_modified']).')'; + } + $scan_summary .= "\r\n======================================\r\n"; + } + + return $scan_summary; + } + + /** + * Saves file change detection data into a special file + * + * @global AIO_WP_Security $aio_wp_security + * @param type $scanned_data + * @param type $scan_result + * @return boolean + */ + public function save_fcd_data($scanned_data, $scan_result = array()) { + global $aio_wp_security; + + $date_time = current_time('mysql'); + $data = array('date_time' => $date_time, 'file_scan_data' => $scanned_data, 'last_scan_result' => $scan_result); + + $fcd_filename = $aio_wp_security->configs->get_value('aiowps_fcd_filename'); + $aiowps_backup_dir = WP_CONTENT_DIR.'/'.AIO_WP_SECURITY_BACKUPS_DIR_NAME; + + if (!AIOWPSecurity_Utility_File::create_dir($aiowps_backup_dir)) { + $aio_wp_security->debug_logger->log_debug(__METHOD__ . " - Creation of DB backup directory failed!", 4); + return false; + } + + // phpcs:disable WordPress.WP.AlternativeFunctions -- Silence wp_filesystem method suggestion. We cannot use that method. + $results_file = $aiowps_backup_dir. '/'. $fcd_filename; + $fp = fopen($results_file, 'w'); + fwrite($fp, json_encode($data)); + fclose($fp); + // phpcs:enable WordPress.WP.AlternativeFunctions -- Silence wp_filesystem method suggestion. We cannot use that method. + + return true; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-firewall-resource-unavailable.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-firewall-resource-unavailable.php new file mode 100755 index 00000000..923b1ec9 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-firewall-resource-unavailable.php @@ -0,0 +1,74 @@ +resource = $resource; + do_action('aios_firewall_unavailable_resource', $this->resource); + } + + /** + * Handles call operation on an unavailable firewall resource. + * + * @param string $name + * @param array $arguments + * + * @return void + */ + public function __call($name, $arguments) { + do_action('aios_firewall_unavailable_resource_method_call', $this->resource, $name, $arguments); + } + + /** + * Handles call operation on an unavailable static firewall resource. + * + * @param string $name + * @param array $arguments + * + * @return void + */ + public static function __callStatic($name, $arguments) { + do_action('aios_firewall_unavailable_resource_static_method_call', $name, $arguments); + } + + /** + * Handles get operation on an unavailable firewall resource. + * + * @param string $name + * + * @return void + */ + public function __get($name) { + do_action('aios_firewall_unavailable_resource_get_property', $this->resource, $name); + } + + /** + * Handles set operation on an unavailable firewall resource. + * + * @param string $name + * @param mixed $value + * + * @return void + */ + public function __set($name, $value) { + do_action('aios_firewall_unavailable_resource_set_property', $this->resource, $name, $value); + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-firewall-resource.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-firewall-resource.php new file mode 100755 index 00000000..a00df11a --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-firewall-resource.php @@ -0,0 +1,53 @@ +configs->get_value('aiowps_disable_xmlrpc_pingback_methods')) { + add_filter('xmlrpc_methods', array($this, 'aiowps_disable_xmlrpc_pingback_methods')); + add_filter('wp_headers', array($this, 'aiowps_remove_x_pingback_header')); + } + + if ('1' == $aio_wp_security->configs->get_value('aiowps_disable_rss_and_atom_feeds')) { + add_action('do_feed', array($this, 'block_feed'), 1); + add_action('do_feed_rdf', array($this, 'block_feed'), 1); + add_action('do_feed_rss', array($this, 'block_feed'), 1); + add_action('do_feed_rss2', array($this, 'block_feed'), 1); + add_action('do_feed_atom', array($this, 'block_feed'), 1); + add_action('do_feed_rss2_comments', array($this, 'block_feed'), 1); + add_action('do_feed_atom_comments', array($this, 'block_feed'), 1); + + remove_action('wp_head', 'feed_links_extra', 3); + remove_action('wp_head', 'feed_links', 2); + } + + // Check permanent block list and block if applicable (ie, do PHP blocking) + if (!is_user_logged_in()) { + AIOWPSecurity_Blocking::check_visitor_ip_and_perform_blocking(); + } + + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_spambot_detecting') && '0' == $aio_wp_security->configs->get_value('aiowps_spam_comments_should')) { + add_action('pre_comment_on_post', array($this, 'spam_detecting_and_process_comments_discard'), 10, 2); //this hook gets fired before comment is added + } + + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_spambot_detecting') && '1' == $aio_wp_security->configs->get_value('aiowps_spam_comments_should')) { + add_filter('pre_comment_approved', array($this, 'spam_detecting_and_process_comments_mark_spam'), 10, 2); //this hook filters a comments approval status before it is set + } + + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_autoblock_spam_ip')) { + add_action('comment_post', array($this, 'spam_detect_process_comment_post'), 10, 2); //this hook gets fired just after comment is saved to DB + add_action('transition_comment_status', array($this, 'process_transition_comment_status'), 10, 3); //this hook gets fired when a comment's status changes + } + + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_rename_login_page')) { + add_action('widgets_init', array($this, 'remove_standard_wp_meta_widget')); + add_filter('retrieve_password_message', array($this, 'decode_reset_pw_msg'), 10, 4); //Fix for non decoded html entities in password reset link + // Gravity form preview exposed renamed login page when called auth_redirect + add_filter('login_url', array($this, 'login_url_reauth_redirect'), 10, 3); + } + + if (AIOWPSecurity_Utility_Permissions::has_manage_cap() && is_admin()) { + if ('1' == $aio_wp_security->configs->get_value('aios_google_recaptcha_invalid_configuration')) { + add_action('all_admin_notices', array($this, 'google_recaptcha_notice')); + } + + if (is_main_site() && is_super_admin()) { + add_action('all_admin_notices', array($this, 'do_firewall_notice')); + add_action('admin_post_aiowps_firewall_setup', array(AIOWPSecurity_Firewall_Setup_Notice::get_instance(), 'handle_setup_form')); + add_action('admin_post_aiowps_firewall_downgrade', array(AIOWPSecurity_Firewall_Setup_Notice::get_instance(), 'handle_downgrade_protection_form')); + add_action('admin_post_aiowps_firewall_setup_dismiss', array(AIOWPSecurity_Firewall_Setup_Notice::get_instance(), 'handle_dismiss_form')); + } + } + + /** + * Send X-Frame-Options: SAMEORIGIN in HTTP header + */ + if ('1' == $aio_wp_security->configs->get_value('aiowps_prevent_site_display_inside_frame')) { + add_action('template_redirect', 'send_frame_options_header'); + } + + if ('1' == $aio_wp_security->configs->get_value('aiowps_remove_wp_generator_meta_info')) { + add_filter('the_generator', array($this,'remove_wp_generator_meta_info')); + add_filter('style_loader_src', array($this,'remove_wp_css_js_meta_info')); + add_filter('script_loader_src', array($this,'remove_wp_css_js_meta_info')); + } + + // For the cookie based brute force prevention feature + // Already logged in user should not redirected to brute_force_redirect_url in any case so added condition !is_user_logged_in() + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_brute_force_attack_prevention')) { + $bfcf_secret_word = $aio_wp_security->configs->get_value('aiowps_brute_force_secret_word'); + if (isset($_GET[$bfcf_secret_word])) { + AIOWPSecurity_Utility_IP::check_login_whitelist_and_forbid(); + + // If URL contains secret word in query param then set cookie and then redirect to the login page + AIOWPSecurity_Utility::set_cookie_value(AIOWPSecurity_Utility::get_brute_force_secret_cookie_name(), AIOS_Helper::get_hash($bfcf_secret_word)); + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_rename_login_page') && !is_user_logged_in()) { + $login_url = home_url((get_option('permalink_structure') ? '' : '?') . $aio_wp_security->configs->get_value('aiowps_login_page_slug')); + AIOWPSecurity_Utility::redirect_to_url($login_url); + } elseif (!is_user_logged_in()) { + AIOWPSecurity_Utility::redirect_to_url(AIOWPSEC_WP_URL.'/wp-admin'); + } + } + } + // Stop users enumeration feature + if (1 == $aio_wp_security->configs->get_value('aiowps_prevent_users_enumeration')) { + include_once(AIO_WP_SECURITY_PATH.'/other-includes/wp-security-stop-users-enumeration.php'); + add_filter('rest_request_before_callbacks', array($this, 'rest_request_before_callbacks'), 10, 1); + add_filter('oembed_response_data', array($this, 'oembed_response_data'), 10, 1); + } + + // REST API security + if ($aio_wp_security->configs->get_value('aiowps_disallow_unauthorized_rest_requests') == 1) { + add_action('rest_api_init', array($this, 'check_rest_api_requests'), 10, 1); + } + + // For user unlock request feature + if (isset($_POST['aiowps_unlock_request']) || isset($_POST['aiowps_wp_submit_unlock_request'])) { + nocache_headers(); + remove_action('wp_head', 'head_addons', 7); + include_once(AIO_WP_SECURITY_PATH.'/other-includes/wp-security-unlock-request.php'); + exit(); + } + + if (isset($_GET['aiowps_auth_key'])) { + //If URL contains unlock key in query param then process the request + $unlock_key = sanitize_text_field($_GET['aiowps_auth_key']); + AIOWPSecurity_User_Login::process_unlock_request($unlock_key); + } + + // For honeypot feature + if (isset($_POST['aio_special_field'])) { + $special_field_value = sanitize_text_field($_POST['aio_special_field']); + if (!empty($special_field_value)) { + //This means a robot has submitted the login form! + //Redirect back to its localhost + AIOWPSecurity_Utility::redirect_to_url('http://127.0.0.1'); + } + } + + // For 404 IP lockout feature + if ($aio_wp_security->configs->get_value('aiowps_enable_404_IP_lockout') == '1') { + if (!is_user_logged_in() || !current_user_can('administrator')) { + $this->do_404_lockout_tasks(); + } + } + + + // For login CAPTCHA feature + if ($aio_wp_security->configs->get_value('aiowps_enable_login_captcha') == '1') { + if (!is_user_logged_in()) { + add_action('login_form', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); + if (AIOWPSecurity_Utility::is_memberpress_plugin_active()) { + add_action('mepr-login-form-before-submit', array($aio_wp_security->captcha_obj, 'add_captcha_script')); + add_action('mepr-login-form-before-submit', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); // for memberpress login form + } + } + } + + // For woo form CAPTCHA features + if ($aio_wp_security->configs->get_value('aiowps_enable_woo_login_captcha') == '1') { + if (!is_user_logged_in()) { + add_action('woocommerce_login_form', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); + } + if (isset($_POST['woocommerce-login-nonce'])) { + add_filter('woocommerce_process_login_errors', array($this, 'aiowps_validate_woo_login_or_reg_captcha'), 10, 3); + } + } + + if ($aio_wp_security->configs->get_value('aiowps_enable_woo_register_captcha') == '1') { + if (!is_user_logged_in()) { + add_action('woocommerce_register_form', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); + } + + if (isset($_POST['woocommerce-register-nonce'])) { + add_filter('woocommerce_process_registration_errors', array($this, 'aiowps_validate_woo_login_or_reg_captcha'), 10, 3); + } + } + + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_woo_checkout_captcha') && !is_user_logged_in()) { + add_action('woocommerce_after_checkout_billing_form', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); + add_action('woocommerce_after_checkout_validation', array($this, 'aiowps_validate_woo_checkout_captcha'), 10, 2); + } + + if ($aio_wp_security->configs->get_value('aiowps_enable_woo_lostpassword_captcha') == '1') { + if (!is_user_logged_in()) { + add_action('woocommerce_lostpassword_form', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); + } + if (isset($_POST['woocommerce-lost-password-nonce'])) { + add_action('lostpassword_post', array($this, 'process_woo_lost_password_form_post')); + } + } + + // For bbPress new topic form CAPTCHA + if ($aio_wp_security->configs->get_value('aiowps_enable_bbp_new_topic_captcha') == '1') { + if (!is_user_logged_in()) { + add_action('bbp_theme_before_topic_form_submit_wrapper', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); + } + } + + // For custom login form CAPTCHA feature, ie, when wp_login_form() function is used to generate login form + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_custom_login_captcha') && !is_user_logged_in()) { + add_filter('login_form_middle', array($aio_wp_security->captcha_obj, 'insert_captcha_custom_login'), 10, 2); //For cases where the WP wp_login_form() function is used + add_filter('login_form_bottom', array($aio_wp_security->captcha_obj, 'add_captcha_script'), 20); + } + + // For password protected pages CAPTCHA feature + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_password_protected_captcha')) { + add_filter('the_password_form', array($aio_wp_security->captcha_obj, 'insert_captcha_password_protected')); + add_action('login_form_postpass', array($aio_wp_security->captcha_obj, 'validate_password_protected_password_form_with_captcha')); + } + + // For honeypot feature + if ($aio_wp_security->configs->get_value('aiowps_enable_login_honeypot') == '1') { + if (!is_user_logged_in()) { + add_action('login_form', array($this, 'insert_honeypot_hidden_field')); + } + } + + // For registration honeypot feature + if ($aio_wp_security->configs->get_value('aiowps_enable_registration_honeypot') == '1') { + if (!is_user_logged_in()) { + add_action('register_form', array($this, 'insert_honeypot_hidden_field')); + } + } + + // For disable application password feature hide generate password + if ('1' == $aio_wp_security->configs->get_value('aiowps_disable_application_password')) { + add_filter('wp_is_application_passwords_available', '__return_false'); + add_action('edit_user_profile', array($this, 'show_disabled_application_password_message')); + add_action('show_user_profile', array($this, 'show_disabled_application_password_message')); + + // Override the wp_die handler for app passwords were disabled. + if (!empty($_SERVER['SCRIPT_FILENAME']) && ABSPATH . 'wp-admin/authorize-application.php' == $_SERVER['SCRIPT_FILENAME']) { + add_filter('wp_die_handler', function () { + return function ($message, $title, $args) { + if ('Application passwords are not available.' == $message) { + $message = htmlspecialchars(__('Application passwords have been disabled by All-In-One Security plugin.', 'all-in-one-wp-security-and-firewall')); + } + _default_wp_die_handler($message, $title, $args); + }; + }, 10, 1); + } + } + + // For lost password CAPTCHA feature + if ($aio_wp_security->configs->get_value('aiowps_enable_lost_password_captcha') == '1') { + if (!is_user_logged_in()) { + add_action('lostpassword_form', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); + add_action('lostpassword_post', array($this, 'process_lost_password_form_post')); + + if (AIOWPSecurity_Utility::is_memberpress_plugin_active()) { + add_action('mepr-forgot-password-form', array($aio_wp_security->captcha_obj, 'add_captcha_script')); + add_action('mepr-forgot-password-form', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); // for memberpress forgot password form + add_filter('mepr-validate-forgot-password', array($aio_wp_security->captcha_obj, 'verify_memberpress_form')); // for memberpress forgot password form + } + } + } + + // For registration manual approval feature + if ($aio_wp_security->configs->get_value('aiowps_enable_manual_registration_approval') == '1') { + add_filter('wp_login_errors', array($this, 'modify_registration_page_messages'), 10, 2); + } + + // For registration page CAPTCHA feature + if (is_multisite()) { + $blog_id = get_current_blog_id(); + switch_to_blog($blog_id); + if ($aio_wp_security->configs->get_value('aiowps_enable_registration_page_captcha') == '1') { + if (!is_user_logged_in()) { + add_action('signup_extra_fields', array($this, 'insert_captcha_question_form_multi')); + //add_action('preprocess_signup_form', array($this, 'process_signup_form_multi')); + add_filter('wpmu_validate_user_signup', array($this, 'process_signup_form_multi')); + } + } + restore_current_blog(); + } else { + if ($aio_wp_security->configs->get_value('aiowps_enable_registration_page_captcha') == '1') { + if (!is_user_logged_in()) { + add_action('register_form', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); + } + } + } + + if ($aio_wp_security->configs->get_value('aiowps_enable_registration_page_captcha') == '1') { + if (AIOWPSecurity_Utility::is_memberpress_plugin_active()) { + add_action('mepr-checkout-after-password-fields', array($aio_wp_security->captcha_obj, 'add_captcha_script')); + add_action('mepr-checkout-after-password-fields', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); // for memberpress register form + add_filter('mepr-validate-signup', array($aio_wp_security->captcha_obj, 'verify_memberpress_form')); // for memberpress register form + } + } + + // For comment CAPTCHA feature or custom login form CAPTCHA + if (is_multisite()) { + $blog_id = get_current_blog_id(); + switch_to_blog($blog_id); + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_comment_captcha') && !is_user_logged_in()) { + add_action('comment_form_after_fields', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form'), 1); + add_action('comment_form_after_fields', array($aio_wp_security->captcha_obj, 'add_captcha_script'), 10); + add_filter('preprocess_comment', array($this, 'process_comment_post')); + } + restore_current_blog(); + } else { + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_comment_captcha') && !is_user_logged_in()) { + add_action('comment_form_after_fields', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form'), 1); + add_action('comment_form_after_fields', array($aio_wp_security->captcha_obj, 'add_captcha_script'), 10); + add_filter('preprocess_comment', array($this, 'process_comment_post')); + } + } + + // For BuddyPress registration CAPTCHA feature + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_bp_register_captcha')) { + add_action('bp_before_registration_submit_buttons', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); + add_action('bp_before_registration_submit_buttons', array($aio_wp_security->captcha_obj, 'add_captcha_script'), 10); + add_action('bp_signup_validate', array($this, 'buddy_press_signup_validate_captcha')); + } + + // For 404 event logging + if ($aio_wp_security->configs->get_value('aiowps_enable_404_logging') == '1') { + add_action('template_redirect', array($this, 'check_404_event')); + } + + // For antibot post page set cookies. + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_spambot_detecting') && !is_user_logged_in()) { + if ('1' == $aio_wp_security->configs->get_value('aiowps_spambot_detect_usecookies')) { + add_action('template_redirect', array($this, 'post_antibot_cookie')); + } + add_filter('comment_form_submit_field', array($this, 'comment_form_submit_field'), 10, 1); + } + + // For delete readme.html and wp-config-sample.php. + if ('1' == $aio_wp_security->configs->get_value('aiowps_auto_delete_default_wp_files')) { + add_action('upgrader_process_complete', array($this, 'delete_unneeded_files_after_upgrade'), 10, 2); + } + + // filter php firewall templates array + add_filter('aiowps_modify_php_firewall_rules_template', array($this, 'filter_templates'), 10, 1); + + // For HTTP authentication. + if ('1' == $aio_wp_security->configs->get_value('aiowps_http_authentication_admin') || '1' == $aio_wp_security->configs->get_value('aiowps_http_authentication_frontend')) { + $this->http_authentication(); + } + + // for enforcing strong passwords + if ('1' == $aio_wp_security->configs->get_value('aiowps_enforce_strong_password')) { + wp_register_script('remove-weak-pw', AIO_WP_SECURITY_URL.'/js/remove-weak-pw.js', array('jquery'), AIO_WP_SECURITY_VERSION, true); + wp_enqueue_script('remove-weak-pw'); + } + + // For HIBP. + if ('1' == $aio_wp_security->configs->get_site_value('aiowps_hibp_user_profile_update')) { + add_action('user_profile_update_errors', 'AIOS_HIBP::user_profile_update_check', 1, 3); + } + + if ('1' == $aio_wp_security->configs->get_site_value('aiowps_http_password_reset')) { + add_action('validate_password_reset', 'AIOS_HIBP::password_reset_check', 1, 2); + } + + // For Upgrade unsafe HTTP calls. + if ('1' == $aio_wp_security->configs->get_site_value('aiowps_upgrade_unsafe_http_calls')) { + add_filter('http_request_reject_unsafe_urls', array($this, 'http_request_reject_unsafe_urls'), 10, 2); + } + + // Add more tasks that need to be executed at init time + + add_filter('aiowps_modify_captcha_settings_template', array($this, 'filter_captcha_settings_templates'), 10, 1); + } // end _construct() + + public function aiowps_disable_xmlrpc_pingback_methods($methods) { + unset($methods['pingback.ping']); + unset($methods['pingback.extensions.getPingbacks']); + return $methods; + } + + public function aiowps_remove_x_pingback_header($headers) { + unset($headers['X-Pingback']); + return $headers; + } + + /** + * Blocks feed by redirecting user to home url. + * + * @return Void + */ + public function block_feed() { + wp_redirect(home_url()); + } + + /** + * Spam detection and discard comment. + * + * @param int $comment_post_id + * + * @return void + */ + public function spam_detecting_and_process_comments_discard($comment_post_id) { + $is_comment_should_not_allowed = AIOWPSecurity_Comment::is_comment_spam_detected(); + if ($is_comment_should_not_allowed) { + $this->spam_discard_auto_block_ip(); + $comments = get_comments(array('number' => '1', 'post_id' => $comment_post_id)); + if ($comments) { + $loc = get_comment_link($comments[0]->comment_ID); + } else { + $loc = get_permalink($comment_post_id) . '#spam-comment-msg'; + } + wp_safe_redirect($loc); + exit; + } + } + + /** + * Block IP for spam discard after minimum comments reached. + * + * @return void + */ + public function spam_discard_auto_block_ip() { + global $aio_wp_security, $wpdb; + + if ('1' != $aio_wp_security->configs->get_value('aiowps_enable_autoblock_spam_ip')) return; + + AIOWPSecurity_Utility::event_logger('spam_discard'); + $comment_ip = AIOWPSecurity_Utility_IP::get_user_ip_address(); + $spam_count = $wpdb->get_var($wpdb->prepare("SELECT COUNT(id) FROM ".AIOWPSEC_TBL_EVENTS." WHERE ip_or_host = %s AND event_type=%s", $comment_ip, 'spam_discard')); + $min_comment_before_block = $aio_wp_security->configs->get_value('aiowps_spam_ip_min_comments_block'); + if (!empty($min_comment_before_block) && $spam_count > $min_comment_before_block) { + AIOWPSecurity_Blocking::add_ip_to_block_list($comment_ip, 'spam_discard'); + } + } + + /** + * Spam detection and mark as spam comment. + * + * @param string $approved + * + * @return string status + */ + public function spam_detecting_and_process_comments_mark_spam($approved) { + return AIOWPSecurity_Comment::is_comment_spam_detected() ? 'spam' : $approved; + } + + public function spam_detect_process_comment_post($comment_id, $comment_approved) { + if ("spam" === $comment_approved) { + $this->block_comment_ip($comment_id); + } + + } + + public function process_transition_comment_status($new_status, $old_status, $comment) { + if ('spam' == $new_status) { + $this->block_comment_ip($comment->comment_ID); + } + + } + + /** + * Will check auto-spam blocking settings and will add IP to blocked table accordingly + * + * @param int $comment_id + */ + public function block_comment_ip($comment_id) { + global $aio_wp_security, $wpdb; + $comment_obj = get_comment($comment_id); + $comment_ip = $comment_obj->comment_author_IP; + //Get number of spam comments from this IP + $sql = $wpdb->prepare("SELECT * FROM $wpdb->comments + WHERE comment_approved = 'spam' + AND comment_author_IP = %s + ", $comment_ip); + $comment_data = $wpdb->get_results($sql, ARRAY_A); + $spam_count = count($comment_data); + $min_comment_before_block = $aio_wp_security->configs->get_value('aiowps_spam_ip_min_comments_block'); + if (!empty($min_comment_before_block) && $spam_count >= ($min_comment_before_block - 1)) { + AIOWPSecurity_Blocking::add_ip_to_block_list($comment_ip, 'spam'); + } + } + + public function remove_standard_wp_meta_widget() { + unregister_widget('WP_Widget_Meta'); + } + + public function remove_wp_generator_meta_info() { + return ''; + } + + /** + * This function removes wp meta info from style and script src + * + * @param string|null $src - the src for the style or script + * @return string + */ + public function remove_wp_css_js_meta_info($src) { + global $wp_version; + static $wp_version_hash = null; // Cache hash value for all function calls + + if (empty($src)) return ''; + + // Replace only version number of assets with WP version + if (strpos($src, 'ver=' . $wp_version) !== false) { + if (!$wp_version_hash) { + $wp_version_hash = wp_hash($wp_version); + } + // Replace version number with computed hash + $src = add_query_arg('ver', $wp_version_hash, $src); + } + return $src; + } + + public function do_404_lockout_tasks() { + global $aio_wp_security; + $redirect_url = $aio_wp_security->configs->get_value('aiowps_404_lock_redirect_url'); //This is the redirect URL for blocked users + + $visitor_ip = AIOWPSecurity_Utility_IP::get_user_ip_address(); + + $is_locked = AIOWPSecurity_Utility::check_locked_ip($visitor_ip, '404'); + + if ($is_locked) { + //redirect blocked user to configured URL + AIOWPSecurity_Utility::redirect_to_url($redirect_url); + } else { + //allow through + } + } + + public function insert_captcha_question_form_multi() { + global $aio_wp_security; + $default_captcha = $aio_wp_security->configs->get_value('aiowps_default_captcha'); + $aio_wp_security->captcha_obj->display_captcha_form($default_captcha); + } + + public function process_signup_form_multi($result) { + global $aio_wp_security; + // Check if CAPTCHA enabled + $verify_captcha = $aio_wp_security->captcha_obj->verify_captcha_submit(); + if (false === $verify_captcha) { + // wrong answer was entered + $result['errors']->add('generic', __('ERROR: Your answer was incorrect - please try again.', 'all-in-one-wp-security-and-firewall')); + } + return $result; + } + + /** + * This function echos a honeypot hidden field into login or register form + * + * @return void + */ + public function insert_honeypot_hidden_field() { + $honey_input = '

'; + $honey_input .= '

'; + echo $honey_input; + } + + /** + * Shows application password disabled message on user edit profile page. + * If logged user is admin showing the Change Setting option. + * + * @return void + */ + public function show_disabled_application_password_message() { + if (is_user_logged_in() && is_admin()) { + $disabled_message = '

'.__('Application passwords', 'all-in-one-wp-security-and-firewall').'

'; + $disabled_message .= ''; + $disabled_message .= ''; + $disabled_message .= ''; + $disabled_message .= ''; + $disabled_message .= ''; + $disabled_message .= ''; + $disabled_message .= ''; + $disabled_message .= ''; + echo $disabled_message; + } + } + + public function process_comment_post($comment) { + global $aio_wp_security; + if (is_user_logged_in()) { + return $comment; + } + + // Don't process CAPTCHA for comment replies inside admin menu + if (isset($_REQUEST['action']) && 'replyto-comment' == $_REQUEST['action'] && (check_ajax_referer('replyto-comment', '_ajax_nonce', false) || check_ajax_referer('replyto-comment', '_ajax_nonce-replyto-comment', false))) { + return $comment; + } + + // Don't do CAPTCHA for pingback/trackback + if ('' != $comment['comment_type'] && 'comment' != $comment['comment_type'] && 'review' != $comment['comment_type']) { + return $comment; + } + + $verify_captcha = $aio_wp_security->captcha_obj->verify_captcha_submit(); + if (false === $verify_captcha) { + //Wrong answer + wp_die(__('Error: You entered an incorrect CAPTCHA answer, please go back and try again.', 'all-in-one-wp-security-and-firewall')); + } else { + return($comment); + } + } + + /** + * Process the main Wordpress account lost password login form post + * Called by wp hook "lostpassword_post" + */ + public function process_lost_password_form_post() { + global $aio_wp_security; + + // Workaround - the WooCommerce lost password form also uses the same "lostpassword_post" hook. + // We don't want to process woo forms here so ignore if this is a woo lost password $_POST + if (!array_key_exists('woocommerce-lost-password-nonce', $_POST)) { + $verify_captcha = $aio_wp_security->captcha_obj->verify_captcha_submit(); + if (false === $verify_captcha) { + add_filter('allow_password_reset', array($this, 'add_lostpassword_captcha_error_msg')); + } + } + } + + public function add_lostpassword_captcha_error_msg() { + //Insert an error just before the password reset process kicks in + return new WP_Error('aiowps_captcha_error', __('ERROR: Your answer was incorrect - please try again.', 'all-in-one-wp-security-and-firewall')); + } + + public function check_404_event() { + if (is_404()) { + //This means a 404 event has occurred - let's log it! + AIOWPSecurity_Utility::event_logger('404'); + } + + } + + /** + * Deletes unneeded default WP files if they're regenerated after core upgrade. + * + * @param WP_Upgrader $upgrader + * @param array $hook_extra + * + * @return void + */ + public function delete_unneeded_files_after_upgrade($upgrader, $hook_extra) { + if (empty($hook_extra)) { + return; + } + + if (isset($hook_extra['action']) && 'update' == $hook_extra['action'] && isset($hook_extra['type']) && 'core' == $hook_extra['type']) { + AIOWPSecurity_Utility::delete_unneeded_default_files(); + } + } + + /** + * Sends WWW-Authenticate header for frontend or admin protection according to user configuration. + * + * @global AIO_WP_Security $aio_wp_security + * + * @return void + */ + private function http_authentication() { + global $aio_wp_security; + + if (defined('AIOS_DISABLE_HTTP_AUTHENTICATION') && AIOS_DISABLE_HTTP_AUTHENTICATION) return; + + $request_uri = isset($_SERVER['REQUEST_URI']) ? wp_parse_url(urldecode($_SERVER['REQUEST_URI'])) : ''; + + $request_path = isset($request_uri['path']) ? $request_uri['path'] : ''; + $request_query = isset($request_uri['query']) ? $request_uri['query'] : ''; + + $non_logged_in_admin_ajax_request = !is_user_logged_in() && defined('DOING_AJAX') && DOING_AJAX; + + // Can't use defined('REST_REQUEST') && REST_REQUEST because REST_REQUEST isn't defined until after init. + $logged_in_rest_request = is_user_logged_in() && (1 === preg_match('/^\/'.rest_get_url_prefix().'(?:\/.*)?$/', $request_path) || 1 === preg_match('/^rest_route=.+$/', $request_query)); + + $is_login_page = 'wp-login.php' == $GLOBALS['pagenow']; + + if ('cli' == PHP_SAPI || (defined('WP_CLI') && WP_CLI)) { + // CLI + return; + } elseif ((is_admin() && !$non_logged_in_admin_ajax_request) || $logged_in_rest_request || $is_login_page) { + // Admin + if ('1' != $aio_wp_security->configs->get_value('aiowps_http_authentication_admin')) { + return; + } + } else { + // Frontend + if ('1' != $aio_wp_security->configs->get_value('aiowps_http_authentication_frontend')) { + return; + } + } + + $username = $aio_wp_security->configs->get_value('aiowps_http_authentication_username'); + $password = $aio_wp_security->configs->get_value('aiowps_http_authentication_password'); + + // Check that the user hasn't already logged in with credentials. + if (!(isset($_SERVER['PHP_AUTH_USER']) && $_SERVER['PHP_AUTH_USER'] == $username && isset($_SERVER['PHP_AUTH_PW']) && $_SERVER['PHP_AUTH_PW'] == $password)) { + header('WWW-Authenticate: Basic charset="UTF-8"'); + header('HTTP/1.0 401 Unauthorized'); + + // Show failure message when the user clicks on the cancel button of the login prompt. + $aiowps_failure_message = $aio_wp_security->configs->get_value('aiowps_http_authentication_failure_message'); + $aiowps_failure_message_raw = html_entity_decode($aiowps_failure_message, ENT_COMPAT, 'UTF-8'); + echo $aiowps_failure_message_raw; + exit; + } + } + + /** + * Filters whether to pass URLs through wp_http_validate_url() in an HTTP request based on whether the url is in the url exceptions config. + * + * @global AIO_WP_Security $aio_wp_security + * + * @param bool $pass_url Whether to pass URLs through wp_http_validate_url(). Default false. + * @param string $url The request URL. + * + * @return bool + */ + public function http_request_reject_unsafe_urls($pass_url, $url) { + global $aio_wp_security; + + if ($pass_url) { + return true; + } + + $parsed_url = parse_url($url); // phpcs:ignore WordPress.WP.AlternativeFunctions.parse_url_parse_url -- Using the same function as WordPress in order to not preclude URLs that would be allowed by WordPress. + + if (empty($parsed_url['scheme'])) { // The same weak sanity check used by the WordPress wp_remote_* functions. + return false; + } + + if (empty($parsed_url['host']) || in_array($parsed_url['host'], array('localhost', '127.0.0.1', '[::1]'))) { + return false; + } + + $upgrade_unsafe_http_calls_url_exceptions = $aio_wp_security->configs->get_site_value('aiowps_upgrade_unsafe_http_calls_url_exceptions'); + + if (!empty($upgrade_unsafe_http_calls_url_exceptions)) { + foreach (preg_split('/\R/', $upgrade_unsafe_http_calls_url_exceptions) as $exempt_url) { + $exempt_url = sanitize_url($exempt_url); + + if (empty($exempt_url)) { + continue; + } + + if (0 === strpos($exempt_url, '#')) { + continue; + } + + if ($url === $exempt_url) { + return false; + } + } + } + + return true; + } + + public function buddy_press_signup_validate_captcha() { + global $bp, $aio_wp_security; + // Check CAPTCHA if required + $verify_captcha = $aio_wp_security->captcha_obj->verify_captcha_submit(); + if (false === $verify_captcha) { + // wrong answer was entered + $bp->signup->errors['aiowps-captcha-answer'] = __('Your CAPTCHA answer was incorrect - please try again.', 'all-in-one-wp-security-and-firewall'); + } + return; + } + + public function aiowps_validate_woo_login_or_reg_captcha($errors) { + global $aio_wp_security; + $locked = $aio_wp_security->user_login_obj->check_locked_user(); + if (!empty($locked)) { + $errors->add('authentication_failed', __('ERROR: Your IP address is currently locked please contact the administrator!', 'all-in-one-wp-security-and-firewall')); + return $errors; + } + + $verify_captcha = $aio_wp_security->captcha_obj->verify_captcha_submit(); + if (false === $verify_captcha) { + // wrong answer was entered + $errors->add('authentication_failed', __('ERROR: Your answer was incorrect - please try again.', 'all-in-one-wp-security-and-firewall')); + } + return $errors; + + } + + /** + * Process the WooCommerce checkout validation + * Called by WooCommerce hook "woocommerce_after_checkout_validation" + * + * @param array $data An array of posted data + * @param WP_ERROR $errors Validation errors + */ + public function aiowps_validate_woo_checkout_captcha($data, $errors) { + global $aio_wp_security; + $locked = $aio_wp_security->user_login_obj->check_locked_user(); + if (!empty($locked)) { + /* translators: %s: Error notification with strong HTML tag. */ + $errors->add('authentication_failed', sprintf(__('%s: Your IP address is currently locked.', 'all-in-one-wp-security-and-firewall') . ' ' . __('Please contact the administrator.', 'all-in-one-wp-security-and-firewall'), '' . __('ERROR', 'all-in-one-wp-security-and-firewall') . '')); + return $errors; + } + + $verify_captcha = $aio_wp_security->captcha_obj->verify_captcha_submit(); + if (false === $verify_captcha) { + // wrong answer was entered + /* translators: %s: Error notification with strong HTML tag. */ + $errors->add('authentication_failed', sprintf(__('%s: Your answer was incorrect - please try again.', 'all-in-one-wp-security-and-firewall'), '' . __('ERROR', 'all-in-one-wp-security-and-firewall') . '')); + } + return $errors; + + } + + /** + * Process the WooCommerce lost password login form post + * Called by wp hook "lostpassword_post" + */ + public function process_woo_lost_password_form_post() { + global $aio_wp_security; + + if (isset($_POST['woocommerce-lost-password-nonce'])) { + $verify_captcha = $aio_wp_security->captcha_obj->verify_captcha_submit(); + if (false === $verify_captcha) { + add_filter('allow_password_reset', array($this, 'add_lostpassword_captcha_error_msg')); + } + } + } + + /** + * Displays a notice message if the entered recatcha site key is wrong. + */ + public function google_recaptcha_notice() { + global $aio_wp_security; + + if (($aio_wp_security->is_admin_dashboard_page() || $aio_wp_security->is_plugin_admin_page() || $aio_wp_security->is_aiowps_admin_page()) && !$aio_wp_security->is_aiowps_google_recaptcha_tab_page()) { + $recaptcha_tab_url = 'admin.php?page='.AIOWPSEC_BRUTE_FORCE_MENU_SLUG.'&tab=login-captcha'; + echo '

'; + /* translators: %s: Admin Dashboard > WP Security > Brute Force > Login CAPTCHA Tab Link */ + printf(__('Your Google reCAPTCHA configuration is invalid.', 'all-in-one-wp-security-and-firewall').' '.__('Please enter the correct reCAPTCHA keys %s to use the Google reCAPTCHA feature.', 'all-in-one-wp-security-and-firewall'), ''.__('here', 'all-in-one-wp-security-and-firewall').''); + echo '

'; + } + } + + /** + * This is a fix for cases when the password reset URL in the email was not decoding all html entities properly + * + * @param string $message + * @return string + */ + public function decode_reset_pw_msg($message) { + $message = html_entity_decode($message); + return $message; + } + + public function modify_registration_page_messages($errors) { + if (isset($_GET['checkemail']) && 'registered' == $_GET['checkemail']) { + if (is_wp_error($errors)) { + $errors->remove('registered'); + $pending_approval_msg = __('Your registration is pending approval.', 'all-in-one-wp-security-and-firewall'); + $pending_approval_msg = apply_filters('aiowps_pending_registration_message', $pending_approval_msg); + $errors->add('registered', $pending_approval_msg, array('registered' => 'message')); + } + } + return $errors; + } + + /** + * Checks for REST API requests + * Below uses the "rest_api_init" action hook to check for REST requests. + * It will block "unauthorized" requests whilst allowing genuine requests. + * REST route will not be blocked if route is whitelisted or user is logged in and user role is allowed. + * + * @return void + */ + public function check_rest_api_requests() { + global $aio_wp_security; + + $is_whitelisted_route = false; + $rest_route = AIOWPSecurity_Utility::get_rest_route(); + + if (empty($rest_route)) return; //rest_api_init is called getting rest server for non rest endpoint. example /wp-admin/post-new.php. WordPress 6.5.0 has wp_is_serving_rest_request we can not use. + + $aios_whitelisted_rest_routes = apply_filters('aios_whitelisted_rest_routes', $aio_wp_security->configs->get_value('aios_whitelisted_rest_routes')); + foreach ($aios_whitelisted_rest_routes as $whitelisted_rest_route) { + $whitelisted_rest_route = preg_quote($whitelisted_rest_route, '/'); + // The 'wc/' rest route to match for white listed 'wc' not the 'wc-admin/' or other having wc + if (preg_match('/^'.$whitelisted_rest_route.'\//i', $rest_route)) { + $is_whitelisted_route = true; + } + } + + $rest_user = wp_get_current_user(); + $is_disallowed_role = !empty($rest_user->roles) && !empty(array_intersect($rest_user->roles, $aio_wp_security->configs->get_value('aios_roles_disallowed_rest_requests'))) ? true : false; + + if (!$is_whitelisted_route && (empty($rest_user->ID) || $is_disallowed_role)) { + $error_message = apply_filters('aiowps_rest_api_error_message', __('You are not authorized to perform this action.', 'all-in-one-wp-security-and-firewall')); + $aio_wp_security->debug_logger->log_debug('REST API request '.$rest_route.' was blocked, If this was unintentional whitelist "' . explode('/', $rest_route)[0] . '" the REST route.', 4); + wp_die($error_message, '', 403); + } + } + + /** + * Shows the firewall notice + * + * @return void + */ + public function do_firewall_notice() { + + $firewall_setup = AIOWPSecurity_Firewall_Setup_Notice::get_instance(); + $firewall_setup->start_firewall_setup(); + + } + + /** + * Called by the WP filter rest_request_before_callbacks + * + * @param WP_REST_Response $response + * + * @return WP_REST_Response|WP_Error $response + */ + public function rest_request_before_callbacks($response) { + $rest_route = !empty($_GET['rest_route']) ? $_GET['rest_route'] : (empty($_SERVER['REQUEST_URI']) ? '' : (string) parse_url(urldecode($_SERVER['REQUEST_URI']), PHP_URL_PATH)); + $rest_route = trim($rest_route, '/'); + if ('' != $rest_route && !current_user_can('edit_others_posts')) { + if (preg_match('/wp\/v2\/users$/i', $rest_route)) { + $error = new WP_Error('aios_user_lists_forbidden', __('Listing users is forbidden.', 'all-in-one-wp-security-and-firewall'), array('status' => 403)); + $response = rest_ensure_response($error); + } elseif (preg_match('/wp\/v2\/users\/+(\d+)$/i', $rest_route, $matches)) { + $id = empty($matches) ? 0 : (int) $matches[1]; + if (get_current_user_id() !== $id) { + $error = new WP_Error('aios_user_details_forbidden', __('Accessing user details is forbidden.', 'all-in-one-wp-security-and-firewall'), array('status' => 403)); + $response = rest_ensure_response($error); + } + } + } + return $response; + } + + /** + * Called by the WP filter oembed_response_data + * + * @param Array $data + * + * @return Array $data + */ + public function oembed_response_data($data) { + unset($data['author_name']); + unset($data['author_url']); + return $data; + } + + /** + * Sets the antibot cookie for post page comment form + * + * @return void + */ + public function post_antibot_cookie() { + if (is_single()) { + AIOWPSecurity_Comment::insert_antibot_keys_in_cookie(); + } + } + + /** + * Sets the hidden fields html code for post page comment form + * + * @param string $submit_field HTML markup for the submit field + * + * @return string + */ + public function comment_form_submit_field($submit_field) { + return $submit_field . " " . AIOWPSecurity_Comment::insert_antibot_keys_in_comment_form(); + } + + /** + * Filters the captcha settings templates based on specific conditions. + * + * This function checks if certain conditions (like login lockdown) are active, and filters the templates accordingly. + * If a template contains a display condition callback, it ensures the callback is callable and invokes it to determine + * whether the template should be included in the result. + * + * @param array $templates An array of captcha setting templates to filter. + * + * @return array The filtered array of captcha setting templates. + */ + public function filter_captcha_settings_templates($templates) { + global $aio_wp_security; + + if (empty($templates) || $aio_wp_security->is_login_lockdown_by_const()) return array(); + + return $this->filter_templates($templates); + } + + + /** + * Filters the provided templates array based on a specified callback condition. + * + * This function applies a filter to the input templates array, checking for each template + * if a 'display_condition_callback' is set and callable. If the condition passes, the template is retained. + * + * @param array $templates An array of templates to filter. Each template should have a 'display_condition_callback' key. + * + * @return array Filtered array of templates where the 'display_condition_callback' is valid. + */ + public function filter_templates($templates) { + if (empty($templates)) return array(); + + return array_filter($templates, function ($template) { + return AIOWPSecurity_Utility::apply_callback_filter($template, 'display_condition_callback'); + }); + } + + /** + * This filter stops exposed renamed login URL using auth_redirect + * + * @param string|null $login_url The login URL. Not HTML-encoded. + * @param string $redirect The path to redirect to on login, if supplied. + * @param bool $force_reauth Whether to force reauthorization, even if a cookie is present. + * + * @return string The filtered login URL. + */ + public function login_url_reauth_redirect($login_url, $redirect, $force_reauth) { + // Ensure $login_url is a string to avoid deprecation warnings. + $login_url = isset($login_url) ? $login_url : ''; + + if (true === $force_reauth && !empty($redirect)) { + wp_die( + esc_html__('You do not have permission to access this page.', 'all-in-one-wp-security-and-firewall') . ' ' . + esc_html__('Please log in and try again.', 'all-in-one-wp-security-and-firewall'), + 403 + ); + } + + return $login_url; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-helper.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-helper.php new file mode 100755 index 00000000..767875f1 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-helper.php @@ -0,0 +1,345 @@ +::' + * @return string + */ + public static function get_firewall_rule_location($rule) { + //normalise key + $rule = strtolower($rule); + + $basic_firewall = array( + 'completely block xmlrpc::general' => 'page=aiowpsec_firewall', + ); + $additional_firewall = array( + 'advanced character filter::general' => 'page=aiowpsec_firewall&tab=additional-firewall', + 'bad query strings::general' => 'page=aiowpsec_firewall&tab=additional-firewall', + 'proxy comment posting::general' => 'page=aiowpsec_firewall&tab=additional-firewall', + ); + $bruteforce = array( + 'cookie based prevent bruteforce::bruteforce' => 'page=aiowpsec_brute_force&tab=cookie-based-brute-force-prevention', + ); + $blacklist = array( + 'blocked ips::blacklist' => 'page=aiowpsec_blacklist', + 'blocked user agents::blacklist' => 'page=aiowpsec_blacklist', + ); + $firewall_6g = array( + 'block request methods::6g' => 'page=aiowpsec_firewall&tab=6g-firewall', + 'block query strings::6g' => 'page=aiowpsec_firewall&tab=6g-firewall', + 'block referrer strings::6g' => 'page=aiowpsec_firewall&tab=6g-firewall', + 'block request strings::6g' => 'page=aiowpsec_firewall&tab=6g-firewall', + 'block user-agents::6g' => 'page=aiowpsec_firewall&tab=6g-firewall', + ); + + // merge all the locations to one + $locations = array_merge($firewall_6g, $blacklist, $bruteforce, $basic_firewall, $additional_firewall); + return isset($locations[$rule]) ? $locations[$rule] : ''; + } + + /** + * Get server detected visitor IP Address. + * + * @return String visitor IP Address. + */ + public static function get_server_detected_user_ip_address() { + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + + // check if user configured custom IP retrieval method + $ip_method_id = empty($aiowps_firewall_config) ? '' : $aiowps_firewall_config->get_value('aios_ip_retrieve_method'); + + $visitor_ip = ''; + $ip_retrieve_methods = AIOS_Abstracted_Ids::get_ip_retrieve_methods(); + + if (empty($ip_method_id) || !isset($ip_retrieve_methods[$ip_method_id])) { + $ip_method_id = 0; + } + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- WordPress API cannot be used here as it's loaded independently of WordPress + $visitor_ip = isset($_SERVER[$ip_retrieve_methods[$ip_method_id]]) ? $_SERVER[$ip_retrieve_methods[$ip_method_id]] : ''; + + // Check if multiple IPs were given - these will be present as comma-separated list + if (preg_match('/^([^,]+),/', $visitor_ip, $matches)) $visitor_ip = $matches[1]; + + // Now remove port portion if ipv4 address with port, for ipv6 it was making issue so using fiter_var valid ip checked first. + if (!filter_var($visitor_ip, FILTER_VALIDATE_IP) && preg_match('/(.+):\d+$/', $visitor_ip, $matches)) $visitor_ip = $matches[1]; + + if (!filter_var($visitor_ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) && !filter_var($visitor_ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- WordPress API cannot be used here as it's loaded independently of WordPress + $visitor_ip = empty($_SERVER['REMOTE_ADDR']) ? '' : $_SERVER['REMOTE_ADDR']; + } + + return $visitor_ip; + } + + /** + * Get user IP Address. + * + * @return string User IP Address. + */ + public static function get_user_ip_address() { + static $visitor_ip; + if (isset($visitor_ip)) { + //already set in the page request + return $visitor_ip; + } + + $visitor_ip = self::get_server_detected_user_ip_address(); + + if (in_array($visitor_ip, array('', '127.0.0.1', '::1'))) { + $external_ip_address = self::get_external_ip_address(); + if (false != $external_ip_address) { + $visitor_ip = $external_ip_address; + } + } + + return $visitor_ip; + } + + /** + * Check user IP Address is with in list. + * + * @param array $ip_address_list + * + * @return boolean. + */ + public static function is_user_ip_address_within_list($ip_address_list) { + + if (!(include_once AIOWPS_FIREWALL_DIR.'/../../vendor/mlocati/ip-lib/ip-lib.php')) { + throw new \Exception("AIOS_Helper::is_user_ip_address_within_list failed to load ip-lib.php"); + } + + if (empty($ip_address_list)) return false; + + $user_ip = self::get_user_ip_address(); + $user_ip_address = \IPLib\Factory::parseAddressString($user_ip); + if (null != $user_ip_address) { + $user_ip_address_type = $user_ip_address->getAddressType(); + $user_ipv4_address_parsed = (6 == $user_ip_address_type) ? $user_ip_address->toIPv4() : $user_ip_address; + // linear search used to compare ips list. + foreach ($ip_address_list as $ip_address) { + if (preg_match("/\/|\*/", $ip_address)) { // checks user ipadress with in range of ip range. + $range = \IPLib\Factory::parseRangeString($ip_address); + if (null != $range && $range->contains($user_ip_address)) return true; + } elseif ($ip_address == $user_ip) { + return true; + } elseif (null != $user_ipv4_address_parsed) { // check for ip matches if ipv6 to ipv4 or vice versa + $ip_address_parsed = \IPLib\Factory::parseAddressString($ip_address); + if (null != $ip_address_parsed) { + $ip_address_parsed_type = $ip_address_parsed->getAddressType(); + $ipv4_address_parsed = (6 == $ip_address_parsed_type) ? $ip_address_parsed->toIPv4() : $ip_address_parsed; + if ((string) $user_ipv4_address_parsed == (string) $ipv4_address_parsed) return true; + } + } + } + } + return false; + } + + /** + * Get user IP Address using an external service. + * This can be used as a fallback for users on localhost where + * get_ip_address() will be a local IP and non-geolocatable. + * + * @return string|boolean external ip address if from one of lookup service gets response otherwise false. + */ + public static function get_external_ip_address() { + $aiowps_firewall_constants = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONSTANTS); + $external_ip_address = false; + + //Running from cronjob REQUEST_URI is empty or DOING_CRON, if from command line cli is PHP_SAPI, constant set by user + if (empty($_SERVER['REQUEST_URI']) || (defined('DOING_CRON') && DOING_CRON) || 'cli' == PHP_SAPI || $aiowps_firewall_constants->AIOS_DISABLE_EXTERNAL_IP_ADDR) return $external_ip_address; + + $ip_lookup_services = AIOS_Abstracted_Ids::get_ip_lookup_services(); + $ip_lookup_services_keys = array_keys($ip_lookup_services); + shuffle($ip_lookup_services_keys); + + foreach ($ip_lookup_services_keys as $service_name) { + $service_endpoint = $ip_lookup_services[$service_name]; + $response = self::request_remote($service_endpoint); + if (!empty($response) && filter_var($response, FILTER_VALIDATE_IP)) { + $external_ip_address = $response; + break; + } + } + return $external_ip_address; + } + + /** + * Remote url request. + * + * @global \AIOWPS\Firewall\Constants $aiowps_firewall_constants + * + * @param string $url url to be requested. + * @param array $args request args array. + * + * @return string response. + */ + public static function request_remote($url, $args = array()) { + $aiowps_firewall_constants = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONSTANTS); + $response = ''; + $aiowps_firewall_utility = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::UTILITY); + $root = $aiowps_firewall_utility::get_root_dir(); + $includes = isset($aiowps_firewall_constants->WPINC) ? $aiowps_firewall_constants->WPINC : 'wp-includes'; + + //WP 6.2+ the request library updated to 2.0.5, class and interface files/directory moved and namespaced name used. + if (!class_exists('WpOrg\Requests\Autoload')) { + if (file_exists($root . $includes . '/Requests/src/Autoload.php')) { + require_once($root . $includes . '/Requests/src/Autoload.php'); + WpOrg\Requests\Autoload::register(); + WpOrg\Requests\Requests::set_certificate_path($root . $includes . '/certificates/ca-bundle.crt'); + } elseif (!class_exists('Requests') && file_exists($root . $includes . '/class-requests.php')) { + require_once($root . $includes . '/class-requests.php'); + Requests::register_autoloader(); + Requests::set_certificate_path($root . $includes . '/certificates/ca-bundle.crt'); + } + } + $timeout = isset($aiowps_firewall_constants->AIOS_REQUEST_TIMEOUT) ? $aiowps_firewall_constants->AIOS_REQUEST_TIMEOUT : 4; + + try { + $headers = isset($args['headers']) ? $args['headers'] : array(); + $data = isset($args['body']) ? $args['body'] : array(); + $method = isset($args['method']) ? $args['method'] : 'GET'; + $options = array('timeout' => $timeout); + //WP 6.2+ the request library 2.0.5 namespaced name WpOrg\Requests\Requests instead just Requests + if (class_exists('WpOrg\Requests\Requests')) { + $request_response = WpOrg\Requests\Requests::request($url, $headers, $data, $method, $options); + } elseif (class_exists('Requests')) { + $request_response = Requests::request($url, $headers, $data, $method, $options); + } + $response = $request_response->body; + } catch (\Exception $e) { + $error_message = $e->getMessage(); + // timed out exception ignore it. + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- PCP warning. Part of AIOS error reporting. + if (!preg_match('/timed out/i', $error_message)) error_log('AIOS_Helper::request_remote exception - ' . $error_message); + } catch (\Error $e) { // phpcs:ignore PHPCompatibility.Classes.NewClasses.errorFound -- this won't run on PHP 5.6 so we still want to catch it on other versions + error_log('AIOS_Helper::request_remote error - ' . $e->getMessage()); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- PCP warning. Part of AIOS error reporting. + } + + if (empty($response) && ini_get('allow_url_fopen')) { + // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents -- Cannot use WP API since Firewall is loaded outside WordPress. + $response = @file_get_contents($url, false, stream_context_create(array('http' => array("timeout" => $timeout)))); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- ignore this to silence request failed warning for IP lookup services + } + return $response; + } + + /** + * Performs reverse IP lookup for the given IP address + * + * @param string $ip_address - IP address to perform reverse lookup + * + * @return array - Reverse lookup data + */ + public static function get_ip_reverse_lookup($ip_address) { + global $aio_wp_security; + $reverse_lookup_data = array(); + $ip_reverse_lookup_services = AIOS_Abstracted_Ids::get_reverse_ip_lookup_services(); + $ip_reverse_lookup_services_keys = array_keys($ip_reverse_lookup_services); + shuffle($ip_reverse_lookup_services_keys); + + foreach ($ip_reverse_lookup_services_keys as $service_name) { + $endpoint = $ip_reverse_lookup_services[$service_name]; + $url = sprintf($endpoint, $ip_address); + $response = wp_safe_remote_get($url, array( 'timeout' => 2 )); + + if (!is_wp_error($response) && $response['body']) { + $data = json_decode($response['body'], true); + if (!$data) { + $aio_wp_security->debug_logger->log_debug("Error decoding IP lookup result", 4); + return $reverse_lookup_data; + } + switch ($service_name) { + case 'ip-api': + $fields_to_copy = array('org', 'as'); + foreach ($fields_to_copy as $field) { + $reverse_lookup_data[$field] = empty($data[$field]) ? null : $data[$field]; + } + break; + case 'ipinfo': + $reverse_lookup_data['org'] = empty($data['org']) ? null : $data['org']; + $reverse_lookup_data['as'] = $reverse_lookup_data['org']; + break; + default: + break; + } + + $reverse_lookup_data = apply_filters('aiowps_login_lockdown_lookup_result', $reverse_lookup_data, $data, $service_name); + break; + } + } + + return $reverse_lookup_data; + } + + /** + * Gets hash of given string using auth Authentication scheme + * + * @param string $data - Plain text to hash. + * + * @return string - Hash of $data + */ + public static function get_hash($data) { + $aiowps_firewall_constants = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONSTANTS); + $salt = $aiowps_firewall_constants->AUTH_KEY.$aiowps_firewall_constants->AUTH_SALT; + return hash_hmac('md5', $data, $salt); + } + + /** + * Set a message for a specific context. + * + * @param string $context The unique context identifier for the message. + * @param string $message The message to store for the given context. + * @param string $type The message type to store for the given context. + * + * @return void + */ + public static function set_message($context, $message, $type = 'info') { + self::$messages[$context] = array('message' => $message, 'type' => $type); + } + + /** + * Get a message for a specific context. + * + * @param string $context The unique context identifier for the message. + * + * @return array|null The message for the given context, or null if not found. + */ + public static function get_message($context) { + return isset(self::$messages[$context]) ? self::$messages[$context] : null; + } + + /** + * Clear messages (optional, for cleanup purposes). + * + * @return void + */ + public static function clear_messages() { + self::$messages = array(); + } + + /** + * This function checks if the current request is an UpdraftCentral request by looking for a specific constant. + * + * @return boolean - True if the request is from UpdraftCentral, false otherwise. + */ + public static function is_updraft_central_request() { + return defined('UPDRAFTCENTRAL_COMMAND') && UPDRAFTCENTRAL_COMMAND; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-hibp.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-hibp.php new file mode 100755 index 00000000..06c34bfe --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-hibp.php @@ -0,0 +1,83 @@ +debug_logger->log_debug('Failed to query the HIBP api: ' . $response_body->get_error_message(), 4); + return false; + } + + $response_body_array = explode("\n", $response_body); + + foreach ($response_body_array as $suffix_and_count) { + $suffix = explode(':', $suffix_and_count)[0]; + + if (strtolower($suffix) == $password_hash_suffix) { + return true; + } + } + + return false; + } + + /** + * Checks if a password has been pwned when updating a user profile. + * + * @param WP_Error $errors + * @param bool $update + * @param stdClass $user + * + * @return void + */ + public static function user_profile_update_check(&$errors, $update, &$user) { + // Use get_error_code() instead of has_errors() for backward compatibility with WP 5.0. + if ($errors->get_error_code() || empty($user->user_pass)) { + return; + } + + if (self::password_is_pwned($user->user_pass)) { + $errors->add('pass', __('Error: This password has been exposed in a data breach, according to Have I Been Pwned (HIBP).')); + } + } + + /** + * Checks if a password has been pwned when resetting a password. + * + * @param WP_Error $errors + * + * @return void + */ + public static function password_reset_check($errors) { + // Use get_error_code() instead of has_errors() for backward compatibility with WP 5.0. + if ($errors->get_error_code() || !isset($_POST['pass1']) || empty($_POST['pass1'])) { + return; + } + + if (self::password_is_pwned($_POST['pass1'])) { + $errors->add('pass', __('Error: This password has been exposed in a data breach, according to Have I Been Pwned (HIBP).')); + } + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-installer.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-installer.php new file mode 100755 index 00000000..4dc6d8c9 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-installer.php @@ -0,0 +1,498 @@ + array( + 'clean_audit_log_stacktraces', + ), + '2.0.9' => array( + 'update_table_column_to_timestamp', + ), + '2.0.10' => array( + 'delete_aiowps_temp_configs_option', + ), + '2.1.4' => array( + 'update_tables_to_innodb', + ) + ); + + /** + * Run installer function. + * + * @return void + */ + public static function run_installer() { + global $wpdb; + if (function_exists('is_multisite') && is_multisite() && is_main_site()) { + // check if it is a network activation - if so, run the activation function for each blog id + $blogids = $wpdb->get_col("SELECT blog_id FROM $wpdb->blogs"); // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- There doesn't seem to be a documented alternative. Possible alternative get_sites(array('fields' => 'ids', 'number' => 0) but 'number' => 0 is not documented. + foreach ($blogids as $blog_id) { + switch_to_blog($blog_id); + AIOWPSecurity_Installer::create_db_tables(); + AIOWPSecurity_Installer::migrate_db_tables(); + AIOWPSecurity_Installer::check_tasks(); + AIOWPSecurity_Configure_Settings::add_option_values(); + AIOWPSecurity_Configure_Settings::update_aiowpsec_db_version(); + restore_current_blog(); + } + } else { + AIOWPSecurity_Installer::create_db_tables(); + AIOWPSecurity_Installer::migrate_db_tables(); + AIOWPSecurity_Installer::check_tasks(); + AIOWPSecurity_Configure_Settings::add_option_values(); + AIOWPSecurity_Configure_Settings::update_aiowpsec_db_version(); + } + + AIOWPSecurity_Installer::create_db_backup_dir(); // Create a backup dir in the WP uploads directory. + } + + /** + * See if any database tasks need to be run, and perform them if so. + * + * @return void + */ + public static function check_tasks() { + $our_version = AIO_WP_SECURITY_DB_VERSION; + $db_version = get_option('aiowpsec_db_version'); + // database tasks not need to be run if first time install - false check added + if (false != $db_version && version_compare($our_version, $db_version, '>')) { + foreach (self::$db_tasks as $version => $updates) { + if (version_compare($version, $db_version, '>')) { + foreach ($updates as $update) { + call_user_func(array(__CLASS__, $update)); + } + } + } + } + } + + public static function create_db_tables() { + global $wpdb; + + if (!function_exists('dbDelta')) { + require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); + } + + if (function_exists('is_multisite') && is_multisite()) { + /* + * FIX for multisite table creation case: + * Although each table name is defined in a constant inside the wp-security-core.php, + * we need to do this step for multisite case because we need to refresh the $wpdb->prefix value + * otherwise it will contain the original blog id and not the current id we need. + * + */ + $lockout_tbl_name = $wpdb->prefix.'aiowps_login_lockdown'; + $aiowps_global_meta_tbl_name = $wpdb->prefix.'aiowps_global_meta'; + $aiowps_event_tbl_name = $wpdb->prefix.'aiowps_events'; + $perm_block_tbl_name = $wpdb->prefix.'aiowps_permanent_block'; + } else { + $lockout_tbl_name = AIOWPSEC_TBL_LOGIN_LOCKOUT; + $aiowps_global_meta_tbl_name = AIOWPSEC_TBL_GLOBAL_META_DATA; + $aiowps_event_tbl_name = AIOWPSEC_TBL_EVENTS; + $perm_block_tbl_name = AIOWPSEC_TBL_PERM_BLOCK; + } + + $message_store_log_tbl_name = AIOWPSEC_TBL_MESSAGE_STORE; + $audit_log_tbl_name = AIOWPSEC_TBL_AUDIT_LOG; + $debug_log_tbl_name = AIOWPSEC_TBL_DEBUG_LOG; + $logged_in_users_tbl_name = AIOWPSEC_TBL_LOGGED_IN_USERS; + + $charset_collate = ''; + if (!empty($wpdb->charset)) { + $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset"; + } else { + $charset_collate = "DEFAULT CHARSET=utf8"; + } + if (!empty($wpdb->collate)) { + $charset_collate .= " COLLATE $wpdb->collate"; + } + + $ld_tbl_sql = "CREATE TABLE " . $lockout_tbl_name . " ( + id bigint(20) NOT NULL AUTO_INCREMENT, + user_id bigint(20) NOT NULL, + user_login VARCHAR(150) NOT NULL, + lockdown_date datetime NOT NULL DEFAULT '1000-10-10 10:00:00', + created INTEGER UNSIGNED, + release_date datetime NOT NULL DEFAULT '1000-10-10 10:00:00', + released INTEGER UNSIGNED, + failed_login_ip varchar(100) NOT NULL DEFAULT '', + lock_reason varchar(128) NOT NULL DEFAULT '', + unlock_key varchar(128) NOT NULL DEFAULT '', + is_lockout_email_sent tinyint(1) NOT NULL DEFAULT '1', + backtrace_log text NOT NULL, + ip_lookup_result LONGTEXT DEFAULT NULL, + PRIMARY KEY (id), + KEY failed_login_ip (failed_login_ip), + KEY is_lockout_email_sent (is_lockout_email_sent), + KEY unlock_key (unlock_key) + ) ENGINE=InnoDB " . $charset_collate . ";"; + dbDelta($ld_tbl_sql); + + $gm_tbl_sql = "CREATE TABLE " . $aiowps_global_meta_tbl_name . " ( + meta_id bigint(20) NOT NULL auto_increment, + date_time datetime NOT NULL default '1000-10-10 10:00:00', + created INTEGER UNSIGNED, + meta_key1 varchar(255) NOT NULL, + meta_key2 varchar(255) NOT NULL, + meta_key3 varchar(255) NOT NULL, + meta_key4 varchar(255) NOT NULL, + meta_key5 varchar(255) NOT NULL, + meta_value1 varchar(255) NOT NULL, + meta_value2 text NOT NULL, + meta_value3 text NOT NULL, + meta_value4 longtext NOT NULL, + meta_value5 longtext NOT NULL, + PRIMARY KEY (meta_id) + ) ENGINE=InnoDB " . $charset_collate . ";"; + dbDelta($gm_tbl_sql); + + $evt_tbl_sql = "CREATE TABLE " . $aiowps_event_tbl_name . " ( + id bigint(20) NOT NULL AUTO_INCREMENT, + event_type VARCHAR(150) NOT NULL DEFAULT '', + username VARCHAR(150), + user_id bigint(20), + event_date datetime NOT NULL DEFAULT '1000-10-10 10:00:00', + created INTEGER UNSIGNED, + ip_or_host varchar(100), + referer_info varchar(255), + url varchar(255), + country_code varchar(50), + event_data longtext, + PRIMARY KEY (id) + ) ENGINE=InnoDB " . $charset_collate . ";"; + dbDelta($evt_tbl_sql); + + $pb_tbl_sql = "CREATE TABLE " . $perm_block_tbl_name . " ( + id bigint(20) NOT NULL AUTO_INCREMENT, + blocked_ip varchar(100) NOT NULL DEFAULT '', + block_reason varchar(128) NOT NULL DEFAULT '', + country_origin varchar(50) NOT NULL DEFAULT '', + blocked_date datetime NOT NULL DEFAULT '1000-10-10 10:00:00', + created INTEGER UNSIGNED, + unblock tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (id), + KEY blocked_ip (blocked_ip) + ) ENGINE=InnoDB " . $charset_collate . ";"; + dbDelta($pb_tbl_sql); + + $audit_log_tbl_sql = "CREATE TABLE " . $audit_log_tbl_name . " ( + id bigint(20) NOT NULL AUTO_INCREMENT, + network_id bigint(20) NOT NULL DEFAULT '0', + site_id bigint(20) NOT NULL DEFAULT '0', + username varchar(60) NOT NULL DEFAULT '', + ip VARCHAR(45) NOT NULL DEFAULT '', + level varchar(25) NOT NULL DEFAULT '', + event_type varchar(25) NOT NULL DEFAULT '', + details text NOT NULL, + stacktrace text NOT NULL, + created INTEGER UNSIGNED, + country_code varchar(50), + PRIMARY KEY (id), + INDEX username (username), + INDEX ip (ip), + INDEX level (level), + INDEX event_type (event_type) + ) ENGINE=InnoDB " . $charset_collate . ";"; + dbDelta($audit_log_tbl_sql); + + $debug_log_tbl_sql = "CREATE TABLE " . $debug_log_tbl_name . " ( + id bigint(20) NOT NULL AUTO_INCREMENT, + created datetime NOT NULL DEFAULT '1000-10-10 10:00:00', + logtime INTEGER UNSIGNED, + level varchar(25) NOT NULL DEFAULT '', + network_id bigint(20) NOT NULL DEFAULT '0', + site_id bigint(20) NOT NULL DEFAULT '0', + message text NOT NULL, + type varchar(25) NOT NULL DEFAULT '', + PRIMARY KEY (id) + ) ENGINE=InnoDB " . $charset_collate . ";"; + dbDelta($debug_log_tbl_sql); + + $liu_tbl_sql = "CREATE TABLE " . $logged_in_users_tbl_name . " ( + id bigint(20) NOT NULL AUTO_INCREMENT, + user_id bigint(20) NOT NULL, + username varchar(60) NOT NULL DEFAULT '', + ip_address varchar(45) NOT NULL DEFAULT '', + site_id bigint(20) NOT NULL, + created integer UNSIGNED, + expires integer UNSIGNED, + PRIMARY KEY (id), + UNIQUE KEY unique_user_id (user_id), + INDEX created (created), + INDEX expires (expires), + INDEX user_id (user_id), + INDEX site_id (site_id) + ) ENGINE=InnoDB " . $charset_collate . ";"; + dbDelta($liu_tbl_sql); + + $message_store_log_tbl_sql = "CREATE TABLE " . $message_store_log_tbl_name . " ( + id bigint(20) NOT NULL AUTO_INCREMENT, + message_key text NOT NULL, + message_value text NOT NULL, + created INTEGER UNSIGNED, + PRIMARY KEY (id) + ) ENGINE=InnoDB " . $charset_collate . ";"; + dbDelta($message_store_log_tbl_sql); + } + + /** + * This function will handle any database table migrations + * + * @return void + */ + public static function migrate_db_tables() { + global $wpdb; + + if (function_exists('is_multisite') && is_multisite()) { + /* + * FIX for multisite table creation case: + * Although each table name is defined in a constant inside the wp-security-core.php, + * we need to do this step for multisite case because we need to refresh the $wpdb->prefix value + * otherwise it will contain the original blog id and not the current id we need. + * + */ + $failed_login_tbl_name = $wpdb->prefix.'aiowps_failed_logins'; + $login_activity_tbl_name = $wpdb->prefix.'aiowps_login_activity'; + + } else { + $failed_login_tbl_name = AIOWPSEC_TBL_FAILED_LOGINS; + $login_activity_tbl_name = AIOWPSEC_TBL_USER_LOGIN_ACTIVITY; + } + + $audit_log_tbl_name = AIOWPSEC_TBL_AUDIT_LOG; + $network_id = get_current_network_id(); + $site_id = get_current_blog_id(); + + $table_exists = $wpdb->get_var($wpdb->prepare('SHOW TABLES LIKE %s', $wpdb->esc_like($failed_login_tbl_name))); // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- There doesn't seem to be an alternative. + if ($table_exists) { + $import_details = array( + 'failed_login' => array( + 'imported' => true, + ) + ); + $import_details = wp_json_encode($import_details, true); + $table_migration_details = array( + 'table_migration' => array( + 'success' => true, + 'from_table' => $failed_login_tbl_name, + 'to_table' => $audit_log_tbl_name + ) + ); + + if (false === $wpdb->query($wpdb->prepare("INSERT INTO $audit_log_tbl_name (network_id, site_id, username, ip, level, event_type, details, stacktrace, created) SELECT %d AS network_id, %d AS site_id, fl.user_login AS username, fl.login_attempt_ip AS ip, 'warning' AS level, 'Failed login' AS event_type, %s AS details, '' AS stacktrace, UNIX_TIMESTAMP(fl.failed_login_date) AS created FROM $failed_login_tbl_name fl", $network_id, $site_id, $import_details))) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- We can't use %i because our plugin supports wordpress < 6.2. + $table_migration_details['table_migration']['success'] = false; + do_action('aiowps_record_event', 'table_migration', $table_migration_details, 'error'); + } else { + do_action('aiowps_record_event', 'table_migration', $table_migration_details, 'info'); + $wpdb->query("DROP TABLE IF EXISTS `$failed_login_tbl_name`"); // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- We can't use %i because our plugin supports wordpress < 6.2. + } + } + + $table_exists = $wpdb->get_var($wpdb->prepare('SHOW TABLES LIKE %s', $wpdb->esc_like($login_activity_tbl_name))); // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- There doesn't seem to be an alternative. + if ($table_exists) { + $wpdb->query("DROP TABLE IF EXISTS `$login_activity_tbl_name`"); // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- We can't use %i because our plugin supports wordpress < 6.2. + } + } + + /** + * This function will run SQL to clean sensitive information from the audit log table stacktrace + * + * @return void + */ + public static function clean_audit_log_stacktraces() { + global $wpdb; + $wpdb->query("UPDATE ".AIOWPSEC_TBL_AUDIT_LOG." SET stacktrace = '' WHERE event_type = 'failed_login' OR event_type = 'successful_login' OR event_type = 'user_registration'"); // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.NotPrepared -- We can't use %i because our plugin supports wordpress < 6.2. + } + + /** + * This function will update the table datetime column to timestamp with backward compability + * + * @return void + */ + public static function update_table_column_to_timestamp() { + $db_version = get_option('aiowpsec_db_version', '1.0'); + if (version_compare('2.0.8', $db_version, '>')) { + self::update_column_to_timestamp(AIOWPSEC_TBL_EVENTS, 'event_date', 'created'); + self::update_column_to_timestamp(AIOWPSEC_TBL_LOGIN_LOCKOUT, 'lockdown_date', 'created'); + self::update_column_to_timestamp(AIOWPSEC_TBL_LOGIN_LOCKOUT, 'release_date', 'released'); + } + + if (version_compare('2.0.9', $db_version, '>')) { + self::update_column_to_timestamp(AIOWPSEC_TBL_PERM_BLOCK, 'blocked_date', 'created'); + self::update_column_to_timestamp(AIOWPSEC_TBL_GLOBAL_META_DATA, 'date_time', 'created'); + self::update_column_to_timestamp(AIOWPSEC_TBL_DEBUG_LOG, 'created', 'logtime'); + } + } + + /** + * Update the table column to UTC timestamp not depending on the timezone of the user or server settings + * + * @global wpdb $wpdb + * + * @param string $table_name + * @param string $field_datetime + * @param string $field_timestamp + * + * @return boolean - returns the rows updated or not + */ + public static function update_column_to_timestamp($table_name, $field_datetime, $field_timestamp) { + global $wpdb; + //MySQL UNIX_TIMESTAMP will convert datetime based on local timezone not UTC + $offset = $wpdb->get_var("SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP())"); // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- There doesn't seem to be an alternative. + if (AIOWPSEC_TBL_PERM_BLOCK == $table_name || AIOWPSEC_TBL_GLOBAL_META_DATA == $table_name || AIOWPSEC_TBL_DEBUG_LOG == $table_name) { + //User local settings date time saved offset timezone needs to removed for UTC correct value + $offset += AIOWPSecurity_Utility::get_wp_timezone()->getOffset(new DateTime('now', new DateTimeZone('UTC'))); + } + if (function_exists('is_multisite') && is_multisite() && AIOWPSEC_TBL_EVENTS == $table_name) { + $table_name = $wpdb->prefix.'aiowps_events'; + } elseif (function_exists('is_multisite') && is_multisite() && AIOWPSEC_TBL_LOGIN_LOCKOUT == $table_name) { + $table_name = $wpdb->prefix.'aiowps_login_lockdown'; + } elseif (function_exists('is_multisite') && is_multisite() && AIOWPSEC_TBL_PERM_BLOCK == $table_name) { + $table_name = $wpdb->prefix.'aiowps_permanent_block'; + } elseif (function_exists('is_multisite') && is_multisite() && AIOWPSEC_TBL_GLOBAL_META_DATA == $table_name) { + $table_name = $wpdb->prefix.'aiowps_global_meta'; + } elseif (function_exists('is_multisite') && is_multisite() && AIOWPSEC_TBL_DEBUG_LOG == $table_name) { + $table_name = $wpdb->prefix.'aiowps_debug_log'; + } + //offset to make sure UTC timestamp updated + $wpdb->query($wpdb->prepare("UPDATE $table_name SET $field_timestamp = (UNIX_TIMESTAMP($field_datetime) - %d)", $offset)); // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- We can't use %i because our plugin supports wordpress < 6.2. + } + + /** + * Deletes the aiowps_temp_configs option if present. + * + * @return void + */ + public static function delete_aiowps_temp_configs_option() { + delete_option('aiowps_temp_configs'); + } + + /** + * Alters all of the AIOS tables to use InnoDB. + * + * @global wpdb $wpdb + * + * @return void + */ + public static function update_tables_to_innodb() { + global $wpdb; + + if (function_exists('is_multisite') && is_multisite()) { + /* + * FIX for multisite table creation case: + * Although each table name is defined in a constant inside the wp-security-core.php, + * we need to do this step for multisite case because we need to refresh the $wpdb->prefix value + * otherwise it will contain the original blog id and not the current id we need. + * + */ + $lockout_tbl_name = $wpdb->prefix.'aiowps_login_lockdown'; + $aiowps_global_meta_tbl_name = $wpdb->prefix.'aiowps_global_meta'; + $aiowps_event_tbl_name = $wpdb->prefix.'aiowps_events'; + $perm_block_tbl_name = $wpdb->prefix.'aiowps_permanent_block'; + } else { + $lockout_tbl_name = AIOWPSEC_TBL_LOGIN_LOCKOUT; + $aiowps_global_meta_tbl_name = AIOWPSEC_TBL_GLOBAL_META_DATA; + $aiowps_event_tbl_name = AIOWPSEC_TBL_EVENTS; + $perm_block_tbl_name = AIOWPSEC_TBL_PERM_BLOCK; + } + + $message_store_log_tbl_name = AIOWPSEC_TBL_MESSAGE_STORE; + $audit_log_tbl_name = AIOWPSEC_TBL_AUDIT_LOG; + $debug_log_tbl_name = AIOWPSEC_TBL_DEBUG_LOG; + $logged_in_users_tbl_name = AIOWPSEC_TBL_LOGGED_IN_USERS; + + // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- No alternative. + $wpdb->query('ALTER TABLE ' . $lockout_tbl_name . ' ENGINE=InnoDB'); + $wpdb->query('ALTER TABLE ' . $aiowps_global_meta_tbl_name . ' ENGINE=InnoDB'); + $wpdb->query('ALTER TABLE ' . $aiowps_event_tbl_name . ' ENGINE=InnoDB'); + $wpdb->query('ALTER TABLE ' . $perm_block_tbl_name . ' ENGINE=InnoDB'); + $wpdb->query('ALTER TABLE ' . $audit_log_tbl_name . ' ENGINE=InnoDB'); + $wpdb->query('ALTER TABLE ' . $debug_log_tbl_name . ' ENGINE=InnoDB'); + $wpdb->query('ALTER TABLE ' . $logged_in_users_tbl_name . ' ENGINE=InnoDB'); + $wpdb->query('ALTER TABLE ' . $message_store_log_tbl_name . ' ENGINE=InnoDB'); + // phpcs:enable WordPress.DB.DirectDatabaseQuery + } + + public static function create_db_backup_dir() { + global $aio_wp_security; + // phpcs:disable WordPress.WP.AlternativeFunctions -- WP_Filesystem is not appropriate here. + //Create our folder in the "wp-content" directory + $aiowps_dir = WP_CONTENT_DIR . '/' . AIO_WP_SECURITY_BACKUPS_DIR_NAME; + if (!is_dir($aiowps_dir) && is_writable(WP_CONTENT_DIR)) { + mkdir($aiowps_dir, 0755, true); + //Let's also create an empty index.html file in this folder + $index_file = $aiowps_dir . '/index.html'; + $handle = fopen($index_file, 'w'); //or die('Cannot open file: '.$index_file); + fclose($handle); + } + $server_type = AIOWPSecurity_Utility::get_server_type(); + //Only create .htaccess if server is the right type + if ('apache' == $server_type || 'litespeed' == $server_type) { + $file = $aiowps_dir . '/.htaccess'; + if (!file_exists($file)) { + //Create an .htacces file + //Write some rules which will only allow people originating from wp admin page to download the DB backup + $rules = ''; + $rules .= 'order deny,allow' . PHP_EOL; + $rules .= 'deny from all' . PHP_EOL; + $write_result = file_put_contents($file, $rules); + if (false === $write_result) { + $aio_wp_security->debug_logger->log_debug("Creation of .htaccess file in " . AIO_WP_SECURITY_BACKUPS_DIR_NAME . " directory failed!", 4); + } + } + } + // phpcs:enable WordPress.WP.AlternativeFunctions -- WP_Filesystem is not appropriate here. + } + + /** + * Setup AIOS cron tasks. + * Handles both single and multi-site (NW activation) cases. + * + * @global type $wpdb + * + * @return Void + */ + public static function set_cron_tasks_upon_activation() { + require_once(__DIR__.'/wp-security-cronjob-handler.php'); + // It is required because we are going to schedule a 15-minute cron event upon activation. + add_filter('cron_schedules', array('AIOWPSecurity_Cronjob_Handler', 'cron_schedules')); + if (is_multisite() && is_main_site()) { + global $wpdb; + // check if it is a network activation + $blogids = $wpdb->get_col("SELECT blog_id FROM $wpdb->blogs"); // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- There doesn't seem to be a documented alternative. Possible alternative get_sites(array('fields' => 'ids', 'number' => 0) but 'number' => 0 is not documented. + foreach ($blogids as $blog_id) { + switch_to_blog($blog_id); + AIOWPSecurity_Installer::schedule_cron_events(); + do_action('aiowps_activation_complete'); + restore_current_blog(); + } + } else { + AIOWPSecurity_Installer::schedule_cron_events(); + do_action('aiowps_activation_complete'); + } + } + + /** + * Helper function for scheduling AIOS cron events. + * + * @return Void + */ + public static function schedule_cron_events() { + if (!wp_next_scheduled('aios_15_minutes_cron_event')) { + wp_schedule_event(time(), 'aios-every-15-minutes', 'aios_15_minutes_cron_event'); //schedule a 15 minutes cron event + } + if (!wp_next_scheduled('aiowps_hourly_cron_event')) { + wp_schedule_event(time(), 'hourly', 'aiowps_hourly_cron_event'); //schedule an hourly cron event + } + if (!wp_next_scheduled('aiowps_daily_cron_event')) { + wp_schedule_event(time(), 'daily', 'aiowps_daily_cron_event'); //schedule an daily cron event + } + if (!wp_next_scheduled('aiowps_weekly_cron_event')) { + wp_schedule_event(time(), 'weekly', 'aiowps_weekly_cron_event'); //schedule an daily cron event + } + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-notices.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-notices.php new file mode 100755 index 00000000..d8f36244 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-notices.php @@ -0,0 +1,739 @@ +debug_logger->log_debug('Notice rendering error: ' . $e->getMessage(), 4); + return esc_html__('An error occurred while rendering this notice, please enable and check your debug log.', 'all-in-one-wp-security-and-firewall'); + } + } + + + /** + * Returns array_merge of notices from parent and notices in $child_notice_content. + * + * @return Array + */ + protected function populate_notices_content() { + global $aio_wp_security; + $parent_notice_content = parent::populate_notices_content(); + + /* translators: 1. HTML text. 2. HTML text, 3. HTML text. */ + $sale_description = $this->safe_sprintf(__('Get %1$s with %2$s. %3$s, downtime, and response time issues.', 'all-in-one-wp-security-and-firewall'), '' . __('added protection', 'all-in-one-wp-security-and-firewall') . '', '' . __('Premium', 'all-in-one-wp-security-and-firewall') . '', '' . __('Scan your site for malware', 'all-in-one-wp-security-and-firewall') . ''); + + /* translators: %s: HTML text. */ + $sale_description .= ' ' . $this->safe_sprintf(__('Block traffic by country of origin, get advanced two-factor authentication, %s, and more.', 'all-in-one-wp-security-and-firewall'), '' . __('added protection', 'all-in-one-wp-security-and-firewall') . '', '' . __('Premium', 'all-in-one-wp-security-and-firewall') . '', '' . __('Scan your site for malware', 'all-in-one-wp-security-and-firewall') . ''); + + // Build text for firewall rules that have been upgraded + $firewall_upgrade_text = '

' . + esc_html__('The All in One Security plugin has deactivated some of the firewall settings that you had activated.', 'all-in-one-wp-security-and-firewall') . + '

'; + $firewall_upgrade_text .= '

' . + esc_html__('We have upgraded the following settings so that they are now part of the PHP firewall instead of .htaccess directives:', 'all-in-one-wp-security-and-firewall') . + '

'; + $firewall_upgrade_text .= '
    '; + + $active_settings = $aio_wp_security->configs->get_value('aiowps_firewall_active_upgrade'); + + if (!empty($active_settings)) { + $active_settings = json_decode($active_settings); + if (!empty($active_settings)) { + + foreach ($active_settings as $setting) { + switch ($setting) { + case 'aiowps_enable_pingback_firewall': + $firewall_upgrade_text .= '
  • ' . esc_html__('Completely block xmlrpc.php', 'all-in-one-wp-security-and-firewall').'
  • '; + break; + case 'aiowps_forbid_proxy_comments': + $firewall_upgrade_text .= '
  • ' . esc_html__('Forbid proxy comment posting', 'all-in-one-wp-security-and-firewall').'
  • '; + break; + case 'aiowps_deny_bad_query_strings': + $firewall_upgrade_text .= '
  • ' . esc_html__('Deny bad query strings', 'all-in-one-wp-security-and-firewall').'
  • '; + break; + case 'aiowps_advanced_char_string_filter': + $firewall_upgrade_text .= '
  • ' . esc_html__('Advanced character filter', 'all-in-one-wp-security-and-firewall').'
  • '; + break; + default: + continue 2; + } + } + } + } else { + $firewall_upgrade_text .= '

    ' . esc_html__('None of the settings that have been upgraded were active.', 'all-in-one-wp-security-and-firewall').'

    '; + } + + $firewall_upgrade_text .= '
'; + $firewall_upgrade_text .= '

' . esc_html__('What would you like to do?', 'all-in-one-wp-security-and-firewall') .'

'; + + $login_whitelist_notice_text = '

' . + esc_html__('The All in One Security plugin has disabled the login whitelist setting that you have enabled in the past.', 'all-in-one-wp-security-and-firewall') . + '

' . + '

'; + if (AIOWPSecurity_Utility::is_apache_server()) { + $login_whitelist_notice_text .= esc_html__('Your website is running on an Apache webserver, the login whitelisting might not be functional until the recent update of AIOS (because it relied upon Apache-specific module features).', 'all-in-one-wp-security-and-firewall'); + } else { + $login_whitelist_notice_text .= esc_html__('Your website is running on a non-Apache webserver, so the login whitelisting was not functional until the recent update of AIOS (because it relied upon Apache-specific features).', 'all-in-one-wp-security-and-firewall'); + } + $login_whitelist_notice_text .= ' ' . esc_html__('It began working with AIOS version 5.0.8.', 'all-in-one-wp-security-and-firewall') . ' ' . esc_html__('We have disabled it so that your login page will not be blocked unexpectedly.', 'all-in-one-wp-security-and-firewall') . + '

'; + + $allowed_ip_addresses = explode("\n", $aio_wp_security->configs->get_value('aiowps_allowed_ip_addresses')); + $allowed_ip_addresses = array_map('trim', $allowed_ip_addresses); + $login_whitelist_notice_text .= '

' . + esc_html__('Whitelisted login IP address(es):', 'all-in-one-wp-security-and-firewall') . ' ' . htmlspecialchars(implode(', ', $allowed_ip_addresses)) . + '

' . + '

' . + esc_html__('Would you like to re-enable login whitelisting?', 'all-in-one-wp-security-and-firewall') . + '

'; + + $child_notice_content = array( + // Upgrade AIOS backup to UDP backup in the 5.0.0 version + 'automated-database-backup' => array( + 'title' => esc_html__('Removed database backup feature from the All-In-One Security plugin', 'all-in-one-wp-security-and-firewall'), + 'text' => '

' . + esc_html__('Beginning with version 5.0.0, AIOS has replaced the AIOS backup method with the superior UpdraftPlus method.', 'all-in-one-wp-security-and-firewall') . ' '. + esc_html__('It remains free and is fully supported by the UpdraftPlus team.', 'all-in-one-wp-security-and-firewall') . + '

' . + '

' . + esc_html__('You are seeing this notice because you have previously set up automated database backups in AIOS.', 'all-in-one-wp-security-and-firewall') . ' ' . + esc_html__('Would you like to set up scheduled backups with UpdraftPlus?', 'all-in-one-wp-security-and-firewall') . + '

', + 'button_link' => add_query_arg(array( + 'page' => 'aiowpsec_database', + 'tab' => 'database-backup', + ), admin_url('admin.php')) . '#automated-scheduled-backups-heading', + 'button_meta' => esc_html__('Setup UpdraftPlus backup plugin', 'all-in-one-wp-security-and-firewall'), + 'dismiss_time' => 'dismiss_automated_database_backup_notice', + 'supported_positions' => array('automated-database-backup'), + 'validity_function' => 'should_show_automated_database_backup_notice', + ), + 'ip-retrieval-settings' => array( + 'title' => esc_html__('Important: set up your IP address detection settings', 'all-in-one-wp-security-and-firewall'), + 'text' => '

' . + esc_html__("The All in One Security plugin couldn't be certain about the correct method to detect the IP address for your site visitors with your currently-configured IP address detection settings.", 'all-in-one-wp-security-and-firewall') . ' '. + esc_html__('It is important for your security to set the IP address detection settings properly.', 'all-in-one-wp-security-and-firewall') . + '

' . + '

' . + esc_html__('Please go to the settings and set them now.', 'all-in-one-wp-security-and-firewall') . + '

', + 'button_link' => add_query_arg(array( + 'page' => 'aiowpsec_settings', + 'tab' => 'advanced-settings', + ), admin_url('admin.php')) . '#automated-scheduled-backups-heading', + 'button_meta' => esc_html__('Setup IP address detection settings', 'all-in-one-wp-security-and-firewall'), + 'dismiss_time' => 'dismiss_ip_retrieval_settings_notice', + 'supported_positions' => array('ip-retrieval-settings'), + 'validity_function' => 'should_show_ip_retrieval_settings_notice', + ), + 'load-firewall-resources-failed' => array( + 'title' => '', + 'text' => '

' . + esc_html__('Failed to load the firewall resources.', 'all-in-one-wp-security-and-firewall') . ' ' . + esc_html__('The firewall won\'t operate correctly.', 'all-in-one-wp-security-and-firewall') . + '

', + 'dismiss_time' => '', + 'supported_positions' => array('load-firewall-resources-failed'), + 'validity_function' => 'should_show_load_firewall_resources_failed_notice', + ), + 'end-of-support-php-56' => array( + 'title' => esc_html__('AIOS PHP 5.6 support will end soon', 'all-in-one-wp-security-and-firewall'), + 'text' => $this->get_end_of_support_php_56_text(), + 'dismiss_time' => 'php_56_eol_dismiss_forever', + 'supported_positions' => array('end-of-support-php-56'), + 'validity_function' => 'should_show_end_of_support_php_56', + ), + 'upgrade-firewall-tab-rules' => array( + 'title' => esc_html__('Important: Disabled firewall settings', 'all-in-one-wp-security-and-firewall'), + 'text' => $firewall_upgrade_text, + 'button_link' => add_query_arg(array( + 'page' => esc_html(AIOWPSEC_FIREWALL_MENU_SLUG), + 'tab' => 'basic-firewall', + ), admin_url('admin.php')), + 'action_button_text' => esc_html__('Reactivate', 'all-in-one-wp-security-and-firewall'), + 'button_meta' => esc_html__('Configure manually', 'all-in-one-wp-security-and-firewall'), + 'dismiss_time' => 'dismiss_firewall_settings_disabled_on_upgrade_notice', + 'supported_positions' => array('upgrade-firewall-tab-rules'), + 'dismiss_text' => esc_html__('Keep deactivated', 'all-in-one-wp-security-and-firewall'), + 'validity_function' => 'should_show_upgrade_firewall_settings_notice', + ), + 'ip-blacklist-settings-on-upgrade' => array( + 'title' => esc_html__('Important: Blacklist manager disabled', 'all-in-one-wp-security-and-firewall'), + 'text' => '

' . + esc_html__("The blacklist manager feature has been disabled to prevent any unexpected site lockouts.", 'all-in-one-wp-security-and-firewall') . + '

' . + '

' . + esc_html__("This feature will block any IP address or range listed in its settings, please double check your own details are not included before turning it back on.", 'all-in-one-wp-security-and-firewall') . + '

' , + 'button_link' => add_query_arg(array( + 'page' => esc_html(AIOWPSEC_FIREWALL_MENU_SLUG), + 'tab' => 'blacklist' + ), admin_url('admin.php')) . '#poststuff', + 'action_button_text' => 'Turn it on', + 'button_meta' => esc_html__('Edit the settings', 'all-in-one-wp-security-and-firewall'), + 'dismiss_time' => 'dismiss_ip_blacklist_notice', + 'dismiss_text' => 'Keep it off', + 'supported_positions' => array('ip-blacklist-settings-on-upgrade'), + 'validity_function' => 'should_show_ip_blacklist_settings_on_upgrade', + ), + 'login-whitelist-disabled-on-upgrade' => array( + 'title' => esc_html__('Important: Disabled login whitelist setting', 'all-in-one-wp-security-and-firewall'), + 'text' => $login_whitelist_notice_text, + 'button_link' => add_query_arg(array( + 'page' => esc_html(AIOWPSEC_BRUTE_FORCE_MENU_SLUG), + 'tab' => 'login-whitelist', + ), admin_url('admin.php')) . '#poststuff', + 'action_button_text' => esc_html__('Turn it back on', 'all-in-one-wp-security-and-firewall'), + 'button_meta' => esc_html__('Edit the settings', 'all-in-one-wp-security-and-firewall'), + 'dismiss_time' => 'dismiss_login_whitelist_disabled_on_upgrade_notice', + 'supported_positions' => array('login-whitelist-disabled-on-upgrade'), + 'dismiss_text' => esc_html__('Keep it off', 'all-in-one-wp-security-and-firewall'), + 'validity_function' => 'should_show_login_whitelist_disabled_on_upgrade_notice', + ), + 'rate_plugin' => array( + 'text' => $this->safe_sprintf(esc_html__('We noticed AIOS has kept your site safe for a while.', 'all-in-one-wp-security-and-firewall') . ' ' . esc_html__('If you like us, please consider leaving a positive review.', 'all-in-one-wp-security-and-firewall'). ' ' . esc_html__('If you have any issues or questions, please contact %s.', 'all-in-one-wp-security-and-firewall'), '' . esc_html__('support', 'all-in-one-wp-security-and-firewall').'') . '
' . esc_html__('Thank you so much!', 'all-in-one-wp-security-and-firewall') . '

- ' . esc_html__('All-In-One Security (AIOS)', 'all-in-one-wp-security-and-firewall').'', + 'image' => 'plugin-logos/aios-icon.png', + 'button_link' => 'https://wordpress.org/support/plugin/all-in-one-wp-security-and-firewall/reviews/?rate=5#new-post', + 'button_meta' => 'review', + 'dismiss_time' => 'dismiss_review_notice', + 'supported_positions' => $this->dashboard_top, + 'validity_function' => 'show_rate_notice' + ), + 'updraftplus' => array( + 'prefix' => '', + 'title' => esc_html__('Enhance your security even more by backing up your site', 'all-in-one-wp-security-and-firewall'), + 'text' => esc_html__('UpdraftPlus is the world\'s most trusted backup plugin.', 'all-in-one-wp-security-and-firewall') . ' ' . esc_html__('From the owners of All-In-One Security (AIOS).', 'all-in-one-wp-security-and-firewall'), + 'image' => 'plugin-logos/updraftplus-icon.png', + 'button_link' => 'https://wordpress.org/plugins/updraftplus/', + 'button_meta' => 'updraftplus', + 'dismiss_time' => 'dismiss_page_notice_until', + 'supported_positions' => $this->dashboard_top_or_report, + 'validity_function' => 'updraftplus_not_installed', + ), + 'wp-optimize' => array( + 'prefix' => '', + 'title' => esc_html__('Speed up your site', 'all-in-one-wp-security-and-firewall'), + 'text' => esc_html__("After you've secured your site, we recommend you install our WP-Optimize plugin to streamline it for better website performance.", 'all-in-one-wp-security-and-firewall'), + 'image' => 'plugin-logos/wp-optimize-icon.png', + 'button_link' => 'https://wordpress.org/plugins/wp-optimize/', + 'button_meta' => 'wp-optimize', + 'dismiss_time' => 'dismiss_notice', + 'supported_positions' => $this->anywhere, + 'validity_function' => 'wp_optimize_not_installed', + ), + + // The sale adverts content starts here + 'blackfriday' => array( + 'prefix' => '', + 'title' => esc_html__('20% off - Black Friday Sale', 'all-in-one-wp-security-and-firewall'), + 'text' => $sale_description, + 'text2' => esc_html__('at checkout.', 'all-in-one-wp-security-and-firewall') . ' ' . esc_html__('Hurry, offer ends 2 December.', 'all-in-one-wp-security-and-firewall') . '', + 'image' => 'notices/sale_20.png', + 'button_text' => sprintf(__('Save 20%% with code %s', 'all-in-one-wp-security-and-firewall'), 'blackfridaysale2025'), + 'button_link' => add_query_arg( + array( + 'utm_source' => 'aios-plugin', + 'utm_medium' => 'referral', + 'utm_campaign' => 'bf25-aios-plugin-banner', + 'utm_content' => 'bf-sale', + 'utm_creative_format' => 'advert', + ), + 'https://teamupdraft.com/plugin-black-friday/?utm_source=aios-plugin&utm_medium=referral&utm_campaign=bf25-aios-plugin-banner&utm_content=bf-sale&utm_creative_format=advert'), + 'campaign' => 'blackfriday', + 'button_meta' => 'inline', + 'dismiss_time' => 'dismiss_season', + // 'discount_code' => '‘bf22aiosupgrade’', + 'valid_from' => '2025-11-14 00:00:00', + 'valid_to' => '2025-12-02 23:59:59', + 'supported_positions' => $this->dashboard_top_or_report, + ) + ); + + return array_merge($parent_notice_content, $child_notice_content); + } + + /** + * Decides whether to show the automated database backup notice. + * + * @return Boolean True if the automated database notice should be shown, otherwise false. + */ + protected function should_show_automated_database_backup_notice() { + if ($this->is_database_backup_admin_page_tab()) { + return false; + } + + if (defined('AIOS_FORCE_AUTOMATED_DATABASE_BACKUP_NOTICE') && AIOS_FORCE_AUTOMATED_DATABASE_BACKUP_NOTICE) { + return true; + } + + if ($this->is_updraftplus_plugin_active() && $this->is_schedule_database_backup_set_in_updraftplus()) { + return false; + } + + global $aio_wp_security; + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_automated_backups')) { + return true; + } + + return false; + } + + /** + * Determines whether to show the PHP 5.6 end of support notice + * + * @return boolean + */ + protected function should_show_end_of_support_php_56() { + return version_compare(PHP_VERSION, '7.0.0', '<'); + } + + /** + * Gets the text to display with the PHP 5.6 end of support notice + * + * @return string + */ + protected function get_end_of_support_php_56_text() { + $text = '

' . esc_html__('AIOS will end support for PHP 5.6 on the 1st September 2025.', 'all-in-one-wp-security-and-firewall') . '

'; + + $text .= '

' . esc_html__('PHP 5.6 is outdated and no longer receives security updates.', 'all-in-one-wp-security-and-firewall') . ' ' . esc_html__('To keep things secure and compatible with modern WordPress standards, AIOS will move to a minimum requirement of PHP 7.0.', 'all-in-one-wp-security-and-firewall') . '

'; + + $text .= '

' . esc_html__('After the 1st September 2025, AIOS may not operate correctly on PHP versions below 7.0.', 'all-in-one-wp-security-and-firewall') . '

'; + + $text .= '

' . esc_html__('If you require help upgrading your PHP version, please contact your hosting provider.', 'all-in-one-wp-security-and-firewall') . '

'; + + return $text; + } + + /** + * Decides whether to show the load firewall resources failed notice. + * + * @return boolean + */ + protected function should_show_load_firewall_resources_failed_notice() { + return !AIOS_Firewall_Resource::all_loaded(); + } + + /** + * Determines whether to show the notice which handles the firewall settings notice + * + * @return boolean + */ + protected function should_show_upgrade_firewall_settings_notice() { + if (!is_main_site()) { + return false; + } + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- No nonce to check. + $is_firewall_page = ('admin.php' == $GLOBALS['pagenow'] && isset($_GET['page']) && AIOWPSEC_FIREWALL_MENU_SLUG == $_GET['page']); + if ($is_firewall_page) return false; + + global $aio_wp_security; + + $active_settings = $aio_wp_security->configs->get_value('aiowps_firewall_active_upgrade'); + + if (empty($active_settings)) return false; + + $active_settings = json_decode($active_settings); + + if (empty($active_settings)) return false; + + return true; + } + + /** + * Whether the current page is the AIOS database backup admin page + * + * @return Boolean True if the current page is the AIOS database backup admin page, otherwise false. + */ + private function is_database_backup_admin_page_tab() { + return $this->is_database_security_admin_page() && $this->is_database_backup_tab(); + } + + /** + * Whether the current page is the database security admin page. + * + * @return Boolean True if the current page is the database security admin page, otherwise false. + */ + private function is_database_security_admin_page() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- No nonce to check. + return ('admin.php' == $GLOBALS['pagenow'] && isset($_GET['page']) && 'aiowpsec_database' == $_GET['page']); + } + + /** + * Whether the current tab is the database backup tab. + * + * @return Boolean True if the current tab is the database backup tab, otherwise false. + */ + private function is_database_backup_tab() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- No nonce to check. + return (isset($_GET['tab']) && 'database-backup' == $_GET['tab']); + } + + /** + * Decides whether to show the IP address detection settings notice. + * + * @return Boolean True if the IP address detection settings notice should be shown, otherwise false. + */ + protected function should_show_ip_retrieval_settings_notice() { + if (!is_main_site()) { + return false; + } + + if ($this->is_ip_settings_admin_page_tab()) { + return false; + } + + if (defined('AIOS_FORCE_IP_RETRIEVAL_SETTINGS_NOTICE') && AIOS_FORCE_IP_RETRIEVAL_SETTINGS_NOTICE) { + return true; + } + + global $aio_wp_security; + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + + // Is notice dismissed. + if ('1' == $aio_wp_security->configs->get_value('dismiss_ip_retrieval_settings_notice')) { + return false; + } + + $configured_ip_method_id = $aio_wp_security->configs->get_value('aiowps_ip_retrieve_method'); + + if (AIOWPSecurity_Utility_IP::is_server_suitable_ip_methods_give_same_ip_address()) { + if ('' === $configured_ip_method_id) { + $server_suitable_ip_methods = AIOWPSecurity_Utility_IP::get_server_suitable_ip_methods(); + $most_suitable_ip_method = reset($server_suitable_ip_methods); + if (!empty($most_suitable_ip_method)) { + $most_suitable_ip_method_id = array_search($most_suitable_ip_method, AIOS_Abstracted_Ids::get_ip_retrieve_methods()); + $aio_wp_security->configs->set_value('aiowps_ip_retrieve_method', $most_suitable_ip_method_id); + $aiowps_firewall_config->set_value('aios_ip_retrieve_method', $most_suitable_ip_method_id, true); + } + } + + return false; + } + + // If the IP retrieval method is not set. + $configured_ip_method_id = $aio_wp_security->configs->get_value('aiowps_ip_retrieve_method'); + if ('' === $configured_ip_method_id) { + return true; + } + + $server_user_ip_address = AIOS_Helper::get_server_detected_user_ip_address(); + return empty($server_user_ip_address); + } + + /** + * Whether the current page is the AIOS IP retrieval admin page + * + * @return Boolean True if the current page is the AIOS database backup admin page, otherwise false. + */ + private function is_ip_settings_admin_page_tab() { + return $this->is_settings_admin_page() && $this->is_advanced_settings_tab(); + } + + /** + * Whether the current page is the AIOS settings admin page + * + * @return Boolean True if the current page is the AIOS settings admin page, otherwise false. + */ + private function is_settings_admin_page() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- No nonce to check. + return ('admin.php' == $GLOBALS['pagenow'] && isset($_GET['page']) && 'aiowpsec_settings' == $_GET['page']); + } + + /** + * Whether the current tab is the advanced settings tab. + * + * @return Boolean True if the current tab is the advanced settings tab, otherwise false. + */ + private function is_advanced_settings_tab() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- No nonce to check. + return (isset($_GET['tab']) && 'advanced-settings' == $_GET['tab']); + } + + /** + * Check whether the UpdraftPlus plugin is active or not. + * + * @return bool True if the UpdraftPlus plugin is active, otherwise false. + */ + private function is_updraftplus_plugin_active() { + return class_exists('UpdraftPlus'); + } + + /** + * Check whether the database backup scheduled in the UpdraftPlus plugin. + * + * @return bool + */ + private function is_schedule_database_backup_set_in_updraftplus() { + $updraft_interval_database_option_val = get_option('updraft_interval_database', ''); + if (empty($updraft_interval_database_option_val) || 'manual' == $updraft_interval_database_option_val) { + return false; + } + + return true; + } + + /** + * Decides whether to show the IP Blacklist settings notice. + * + * @return Boolean True if the IP Blacklist settings notice should be shown, otherwise false. + */ + protected function should_show_ip_blacklist_settings_on_upgrade() { + if (!is_main_site()) { + return false; + } + + if ($this->is_blacklist_admin_page()) { + return false; + } + + global $aio_wp_security; + + if ('1' == $aio_wp_security->configs->get_value('aiowps_is_ip_blacklist_settings_notice_on_upgrade')) { + return true; + } + + return false; + } + + /** + * Whether the current page is the AIOS blacklist admin page + * + * @return Boolean True if the current page is the AIOS blacklist admin page, otherwise false. + */ + private function is_blacklist_admin_page() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- No nonce to check. + return ('admin.php' == $GLOBALS['pagenow'] && isset($_GET['page']) && AIOWPSEC_FIREWALL_MENU_SLUG == $_GET['page'] && isset($_GET['tab']) && 'blacklist' == $_GET['tab']); + } + + /** + * Decides whether to show the IP address detection settings notice. + * + * @return Boolean True if the IP address detection settings notice should be shown, otherwise false. + */ + protected function should_show_login_whitelist_disabled_on_upgrade_notice() { + if (!is_main_site()) { + return false; + } + + if ($this->is_login_whitelist_admin_page_tab()) { + return false; + } + + if (defined('AIOS_FORCE_LOGIN_WHITELIST_DISABLED_ON_UPGRADE_NOTICE') && AIOS_FORCE_LOGIN_WHITELIST_DISABLED_ON_UPGRADE_NOTICE) { + return true; + } + + global $aio_wp_security; + + if ('1' == $aio_wp_security->configs->get_value('aiowps_is_login_whitelist_disabled_on_upgrade') && '1' != $aio_wp_security->configs->get_value('aiowps_enable_whitelisting')) { + return true; + } + + return false; + } + + /** + * Whether the current page is the AIOS IP retrieval admin page + * + * @return Boolean True if the current page is the AIOS database backup admin page, otherwise false. + */ + private function is_login_whitelist_admin_page_tab() { + return $this->is_brute_force_admin_page() && $this->is_login_whitelist_tab(); + } + + /** + * Whether the current page is the AIOS settings admin page + * + * @return Boolean True if the current page is the AIOS settings admin page, otherwise false. + */ + private function is_brute_force_admin_page() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- No nonce to check. + return ('admin.php' == $GLOBALS['pagenow'] && isset($_GET['page']) && AIOWPSEC_BRUTE_FORCE_MENU_SLUG == $_GET['page']); + } + + /** + * Whether the current tab is the advanced settings tab. + * + * @return Boolean True if the current tab is the advanced settings tab, otherwise false. + */ + private function is_login_whitelist_tab() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- No nonce to check. + return (isset($_GET['tab']) && 'login-whitelist' == $_GET['tab']); + } + + /** + * Call this method to setup the notices + */ + public function notices_init() { + if ($this->initialized) return; + $this->initialized = true; + $this->notices_content = $this->populate_notices_content(); + + $enqueue_version = (defined('WP_DEBUG') && WP_DEBUG) ? AIO_WP_SECURITY_VERSION.'.'.time() : AIO_WP_SECURITY_VERSION; + wp_enqueue_style('aiowpsec-admin-notices-css', AIO_WP_SECURITY_URL.'/css/wp-security-notices.css', array(), $enqueue_version); + } + + /** + * Get AIOS Plugin installation timestamp. + * + * @return integer AIOS Plugin installation timestamp. + */ + public function get_aiowps_plugin_installed_timestamp() { + $installed_at = @filemtime(AIO_WP_SECURITY_PATH.'/index.html'); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- ignore warning as we handle it below + if (false === $installed_at) { + global $aio_wp_security; + $installed_at = (int) $aio_wp_security->configs->get_value('installed-at'); + } + $installed_at = apply_filters('aiowps_plugin_installed_timestamp', $installed_at); + return $installed_at; + } + + /** + * This function will check if we should display the rate notice or not + * + * @return boolean - to indicate if we should show the notice or not + */ + protected function show_rate_notice() { + $installed_at = $this->get_aiowps_plugin_installed_timestamp(); + $time_now = $this->get_time_now(); + $installed_for = $time_now - $installed_at; + + if ($installed_at && $installed_for > 28*86400) { + return true; + } + + return false; + } + + /** + * Checks if UpdraftPlus is installed(returns false) or not(returns true). + * + * @return Boolean + */ + protected function updraftplus_not_installed() { + if (!function_exists('get_plugins')) include_once(ABSPATH.'wp-admin/includes/plugin.php'); + $plugins = get_plugins(); + + foreach ($plugins as $value) { + if ('updraftplus' == $value['TextDomain']) { + return false; + } + } + return true; + } + + /** + * Checks if WP-Optimize is installed(returns false) or not(returns true). + * + * @return Boolean + */ + protected function wp_optimize_not_installed() { + if (!function_exists('get_plugins')) include_once(ABSPATH.'wp-admin/includes/plugin.php'); + $plugins = get_plugins(); + + foreach ($plugins as $value) { + if ('wp-optimize' == $value['TextDomain']) { + return false; + } + } + return true; + } + + /** + * Determines whether to prepare a seasonal notice(returns true) or not(returns false). + * + * @param Array $notice_data - all data for the notice + * + * @return Boolean + */ + protected function skip_seasonal_notices($notice_data) { + $time_now = $this->get_time_now(); + $valid_from = strtotime($notice_data['valid_from']); + $valid_to = strtotime($notice_data['valid_to']); + $dismiss = $this->check_notice_dismissed($notice_data['dismiss_time']); + if (($time_now >= $valid_from && $time_now <= $valid_to) && !$dismiss) { + // return true so that we return this notice to be displayed + return true; + } + + return false; + } + + /** + * Get timestamp that is considered as current timestamp for notice. + * + * @return integer timestamp that should be consider as a current time. + */ + public function get_time_now() { + $time_now = defined('AIOWPSECURITY_NOTICES_FORCE_TIME') ? AIOWPSECURITY_NOTICES_FORCE_TIME : time(); + return $time_now; + } + + /** + * Checks whether a notice is dismissed(returns true) or not(returns false). + * + * @param String $dismiss_time - dismiss time id for the notice + * + * @return boolean + */ + protected function check_notice_dismissed($dismiss_time) { + $time_now = $this->get_time_now(); + + global $aio_wp_security; + $dismiss = ($time_now < (int) $aio_wp_security->configs->get_value($dismiss_time)); + + return $dismiss; + } + + /** + * Renders or returns a notice. + * + * @param Boolean|String $advert_information - all data for the notice + * @param Boolean $return_instead_of_echo - whether to return the notice(true) or render it to the page(false) + * @param String $position - notice position + * + * @return Void|String + */ + protected function render_specified_notice($advert_information, $return_instead_of_echo = false, $position = 'top') { + + if ('bottom' == $position) { + $template_file = 'bottom-notice.php'; + } elseif ('report' == $position) { + $template_file = 'report.php'; + } elseif ('report-plain' == $position) { + $template_file = 'report-plain.php'; + } elseif (in_array($position, AIOS_Abstracted_Ids::custom_admin_notice_ids())) { + $template_file = 'custom-notice.php'; + } elseif (in_array($position, AIOS_Abstracted_Ids::htaccess_to_php_feature_notice_ids())) { + $template_file = 'htaccess-to-php-feature-notice.php'; + } else { + $template_file = 'horizontal-notice.php'; + } + + global $aio_wp_security; + return $aio_wp_security->include_template('notices/'.$template_file, $return_instead_of_echo, $advert_information); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-process-renamed-login-page.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-process-renamed-login-page.php new file mode 100755 index 00000000..5a28ef4e --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-process-renamed-login-page.php @@ -0,0 +1,293 @@ +aiowps_filter_wp_login_file($url); + } + + public function aiowps_wp_redirect($location) { + return $this->aiowps_filter_wp_login_file($location); + } + + /** + * Filter register link on the login page + * + * @param string $registration_url + * @return string + */ + public function register_link($registration_url) { + return $this->aiowps_filter_wp_login_file($registration_url); + } + + /** + * Filter confirm link so we hide the secret login slug in the export_personal_data email + * + * @param string $email_text + * @param string $email_data + * @return string + */ + public function aiowps_user_request_email_content($email_text, $email_data) { + global $aio_wp_security; + if (isset($email_data['request']) && isset($email_data['request']->action_name)) { + if ('export_personal_data' == $email_data['request']->action_name) { + $confirm_url = $email_data['confirm_url']; + $login_slug = $aio_wp_security->configs->get_value('aiowps_login_page_slug'); + if (get_option('permalink_structure')) { + $new_confirm_url = str_replace($login_slug, 'wp-login.php', $confirm_url); + } else { + $search_pattern = '?'.$login_slug.'&action'; + $new_confirm_url = str_replace($search_pattern, '/wp-login.php/?action', $confirm_url); + } + + $email_text_modified = str_replace('###CONFIRM_URL###', esc_url_raw($new_confirm_url), $email_text); + return $email_text_modified; + } + } + return $email_text; + } + + /** + * Filter all login url strings on the login page + * + * @param string $url + * @return string + */ + public function aiowps_filter_wp_login_file($url) { + if (strpos($url, 'wp-login.php') !== false) { + $args = explode('?', $url); + if (isset($args[1])) { + if (strpos($args[1], 'action=postpass') !== false) { + return $url; //Don't reveal the secret URL in the post password action url + } + parse_str($args[1], $args); + $url = esc_url(add_query_arg($args, AIOWPSecurity_Process_Renamed_Login_Page::new_login_url())); + $url = html_entity_decode($url); + } elseif (isset($_SERVER['REQUEST_URI']) && stripos(urldecode(sanitize_url(wp_unslash($_SERVER['REQUEST_URI']))), 'wp-admin/install.php')) { + return $url; + } else { + $url = AIOWPSecurity_Process_Renamed_Login_Page::new_login_url(); + } + } + return $url; + } + + /** + * Login page renamed related tasks, do not allow access if not logged with rename login page. + * + * @return void + */ + public static function renamed_login_init_tasks() { + // Bail if the host cron job is running by running the command "php wp-cron.php" + // The $_SERVER['REQUEST_URI'] is undefined when running a PHP file from the command line. + // for `wp plugin list` it will be empty so showing Not available instead plugin list. + if (empty($_SERVER['REQUEST_URI']) || defined('WP_CLI') || 'cli' == PHP_SAPI || wp_doing_cron() || wp_doing_ajax()) { + return; + } + + global $aio_wp_security; + + //The following will process the native wordpress post password protection form + //Normally this is done by wp-login.php file but we cannot use that since the login page has been renamed + + // Bots with URLs like: /index.php?action[]=aaaa will return an array here. It needs to be a string. + $action = (isset($_GET['action']) && is_string($_GET['action'])) ? sanitize_text_field(wp_unslash($_GET['action'])) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- No nonce available. + // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing -- No nonce available. + if (isset($_POST['post_password']) && 'postpass' == $action) { + + // Check if the captcha is enabled for the password protected pages and process validation if the login page was renamed + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_password_protected_captcha')) { + $aio_wp_security->captcha_obj->validate_password_protected_password_form_with_captcha(); + } + + require_once ABSPATH . 'wp-includes/class-phpass.php'; + $hasher = new PasswordHash(8, true); + + /** + * Filter the life span of the post password cookie. + * + * By default, the cookie expires 10 days from creation. To turn this + * into a session cookie, return 0. + * + * @since 3.7.0 + * + * @param int $expires The expiry time, as passed to setcookie(). + */ + $expire = apply_filters('post_password_expires', time() + 10 * DAY_IN_SECONDS); + // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- No nonce available, not recommended to sanitize passwords. + setcookie('wp-postpass_' . COOKIEHASH, $hasher->HashPassword(wp_unslash($_POST['post_password'])), $expire, COOKIEPATH, COOKIE_DOMAIN, is_ssl(), true); + + wp_safe_redirect(wp_get_referer()); + exit(); + } + + //case where someone attempting to reach wp-admin + if (is_admin() && !is_user_logged_in() && (isset($_SERVER["SCRIPT_FILENAME"]) ? basename(sanitize_text_field(wp_unslash($_SERVER["SCRIPT_FILENAME"]))) : '') !== 'admin-post.php') { + //Fix to prevent fatal error caused by some themes and Yoast SEO + do_action('aiowps_before_wp_die_renamed_login'); + wp_die(esc_html__('You do not have permission to access this page.', 'all-in-one-wp-security-and-firewall') . ' ' . esc_html__('Please log in and try again.', 'all-in-one-wp-security-and-firewall'), 403); + } + + //case where someone attempting to reach wp-login + if (isset($_SERVER['REQUEST_URI']) && stripos(urldecode(sanitize_url(wp_unslash($_SERVER['REQUEST_URI']))), 'wp-login.php') && !is_user_logged_in()) { + + // Handle export personal data request for rename login case + if (isset($_GET['request_id'])) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce available. + $request_id = (int) sanitize_text_field(wp_unslash($_GET['request_id'])); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce available. + $result = ''; + if (isset($_GET['confirm_key'])) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce available. + $key = sanitize_text_field(wp_unslash($_GET['confirm_key'])); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce available. + $result = wp_validate_user_request_key($request_id, $key); + } else { + $result = new WP_Error('invalid_key', esc_html__('Invalid key', 'all-in-one-wp-security-and-firewall')); + } + + if (is_wp_error($result)) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. $result is WPError object with sanitized strings. + wp_die($result); + } elseif (!empty($result)) { + _wp_privacy_account_request_confirmed($request_id); + $message = _wp_privacy_account_request_confirmed_message($request_id); + login_header(__('User action confirmed.', 'all-in-one-wp-security-and-firewall'), $message); + login_footer(); + exit; + } + } + + //Check if the maintenance (lockout) mode is active - if so prevent access to site by not displaying 404 page! + if ($aio_wp_security->configs->get_value('aiowps_site_lockout') == '1') { + AIOWPSecurity_WP_Loaded_Tasks::site_lockout_tasks(); + } else { + AIOWPSecurity_Process_Renamed_Login_Page::aiowps_set_404(); + } + } + + //case where someone attempting to reach the standard register or signup pages + $request_uri = urldecode(sanitize_url(wp_unslash($_SERVER['REQUEST_URI']))); + if ('' !== $request_uri && stripos($request_uri, 'wp-register.php') || '' !== $request_uri && stripos($request_uri, 'wp-signup.php')) { + //Check if the maintenance (lockout) mode is active - if so prevent access to site by not displaying 404 page! + if ('1' == $aio_wp_security->configs->get_value('aiowps_site_lockout')) { + AIOWPSecurity_WP_Loaded_Tasks::site_lockout_tasks(); + } else { + AIOWPSecurity_Process_Renamed_Login_Page::aiowps_set_404(); + } + } + + $login_slug = $aio_wp_security->configs->get_value('aiowps_login_page_slug'); + + if (self::is_renamed_login_page_requested($login_slug)) { + if (empty($action) && is_user_logged_in()) { + //if user is already logged in but tries to access the renamed login page, send them to the dashboard + // or to requested redirect-page, filtered in 'login_redirect'. + if (isset($_REQUEST['redirect_to'])) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce available. + $redirect_to = wp_sanitize_redirect(wp_unslash($_REQUEST['redirect_to'])); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce available. + $redirect_to = wp_validate_redirect($redirect_to, apply_filters('wp_safe_redirect_fallback', admin_url(), 302)); + $requested_redirect_to = $redirect_to; + } else { + $redirect_to = admin_url(); + $requested_redirect_to = ''; + } + $redirect_to = apply_filters('login_redirect', $redirect_to, $requested_redirect_to, wp_get_current_user()); + AIOWPSecurity_Utility::redirect_to_url($redirect_to); + } else { + global $wp_version; + do_action('aiowps_rename_login_load'); + // logout action called by WooCommerce does not apply the login whitelist which shows a 403 error for the customer + if (!(isset($_GET['action']) && 'logout' == $_GET['action'])) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce available. + AIOWPSecurity_Utility_IP::check_login_whitelist_and_forbid(); + } + + status_header(200); + if (version_compare($wp_version, '6.6', '>=')) { + require_once(AIO_WP_SECURITY_PATH . '/other-includes/wp-security-rename-login-feature.php'); + } elseif (version_compare($wp_version, '5.7', '>=')) { + require_once(AIO_WP_SECURITY_PATH . '/other-includes/wp-security-rename-login-feature-pre-6-6.php'); + } elseif (version_compare($wp_version, '5.2', '>=')) { + require_once(AIO_WP_SECURITY_PATH . '/other-includes/wp-security-rename-login-feature-pre-5-7.php'); + } else { + require_once(AIO_WP_SECURITY_PATH . '/other-includes/wp-security-rename-login-feature-pre-5-2.php'); + } + + die; + } + } + } + + public static function new_login_url() { + global $aio_wp_security; + $login_slug = $aio_wp_security->configs->get_value('aiowps_login_page_slug'); + if (get_option('permalink_structure')) { + return trailingslashit(trailingslashit(home_url()) . $login_slug); + } else { + return trailingslashit(site_url()) . '?' . $login_slug; + } + } + + public static function aiowps_set_404() { + global $wp_query; + do_action('aiowps_before_set_404'); // This hook is for themes which produce a fatal error when the rename login feature is enabled and someone visits "wp-admin" slug directly + + status_header(404); + $wp_query->set_404(); + do_action('template_redirect'); // Trigger 'template_redirect' to allow third-party plugins to intercept and inject custom logic before rendering the fallback template. + + $template = get_404_template(); + if (empty($template)) $template = get_index_template(); + $template = apply_filters('template_include', $template); + if ($template) include($template); + die; + } + + /** + * Check renamed login page is requested + * + * @param string $login_slug Renamed loginpage slug + * + * @return boolean + */ + public static function is_renamed_login_page_requested($login_slug) { + + if (empty($_SERVER['REQUEST_URI'])) return false; + + $parsed_url_path = isset($_SERVER['REQUEST_URI']) ? wp_parse_url(sanitize_url(wp_unslash($_SERVER['REQUEST_URI'])), PHP_URL_PATH) : ''; + $home_url_with_slug = home_url($login_slug, 'relative'); + + /* + * Compatibility fix for WPML, TranslatePress plugin + */ + if (function_exists('wpml_object_id') || function_exists('trp_enable_translatepress')) { + $home_url_with_slug = home_url($login_slug); + $parsed_home_url_with_slug = wp_parse_url($home_url_with_slug); + $home_url_with_slug = $parsed_home_url_with_slug['path']; //this will return just the path minus the protocol and host + } + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce available. + if (untrailingslashit($parsed_url_path) === $home_url_with_slug || (!get_option('permalink_structure') && isset($_GET[$login_slug]))) { + return true; + } + + return false; + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-reporting.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-reporting.php new file mode 100755 index 00000000..b5bf996d --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-reporting.php @@ -0,0 +1,60 @@ + $value) { + $sanitized_key = esc_html($key); + $sanitized_value = esc_html($value); + $sanitized_section_content[$sanitized_key] = $sanitized_value; + } + + if ('text' === $output_format) { + $data .= "\n --- $section_title --- \n\n"; + $data .= self::output_section_data($sanitized_section_content); + $data .= "\n===================================\n"; + } elseif ('table' === $output_format) { + $data .= '
'; + $data .= '

'; + $data .= '
'; + $data .= apply_filters('aiowp_security_report_section_content', AIOWPSecurity_Utility_UI::format_data_as_table($sanitized_section_content)); + $data .= '
'; + $data .= '
'; + } + + $data = apply_filters('aiowp_security_generate_report_section_below', $data); + + return $data; + } + + /** + * Output the section data + * + * @param array $section_data Section data to output + * + * @return string Section data + */ + private static function output_section_data($section_data = array()) { + $output = ''; + foreach ($section_data as $key => $value) { + $output .= "$key - $value\n"; + } + return $output; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-sender-service.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-sender-service.php new file mode 100755 index 00000000..794a7600 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-sender-service.php @@ -0,0 +1,29 @@ +configs->set_value('aiowps_enable_basic_firewall', '1', true); + + //Now let's write the applicable rules to the .htaccess file + if (AIOWPSecurity_Utility::allow_to_write_to_htaccess()) { + $res = AIOWPSecurity_Utility_Htaccess::write_to_htaccess(); + } else { + $res = true; + } + + if ($res) { + $msg['updated'] = __('Settings were successfully saved.', 'all-in-one-wp-security-and-firewall'); + } else { + /* translators: %s: .htaccess path */ + $msg['error'] = sprintf(__('Could not write to the %s file.', 'all-in-one-wp-security-and-firewall'), AIOWPSecurity_Utility_File::get_home_path().'.htaccess') . ' ' . __('Please check the file permissions.', 'all-in-one-wp-security-and-firewall'); + } + return $msg; + } + + /** + * Disable all security features. + * + * @return array messages + */ + public static function disable_all_security_features() { + $msg = array(); + AIOWPSecurity_Configure_Settings::turn_off_all_security_features(); + + //Now let's clear the applicable rules from the .htaccess file + if (AIOWPSecurity_Utility::allow_to_write_to_htaccess()) { + $res = AIOWPSecurity_Utility_Htaccess::write_to_htaccess(); + } else { + $res = true; + } + + //Now let's revert the disable editing setting in the wp-config.php file if necessary + $res2 = AIOWPSecurity_Utility::enable_file_edits(); + + if ($res) { + $msg['updated'] = __('All the security features have been disabled successfully.', 'all-in-one-wp-security-and-firewall'); + } else { + /* translators: %s: .htaccess path */ + $msg['error'][] = sprintf(__('Could not write to the %s file.', 'all-in-one-wp-security-and-firewall'), AIOWPSecurity_Utility_File::get_home_path().'.htaccess') . ' ' . sprintf(__('Please restore it manually using the restore functionality in the "%s" tab.', 'all-in-one-wp-security-and-firewall'), '.htaccess ' . __('file', 'all-in-one-wp-security-and-firewall')); + } + + if (!$res2) { + /* translators: %s: wp-config.php path */ + $msg['error'][] = sprintf(__('Could not write to the %s file.', 'all-in-one-wp-security-and-firewall'), AIOWPSecurity_Utility_File::get_home_path().'wp-config.php') . ' ' . sprintf(__('Please restore it manually using the restore functionality in the "%s" tab.', 'all-in-one-wp-security-and-firewall'), 'wp-config.php ' . __('file', 'all-in-one-wp-security-and-firewall')); + } + return $msg; + } + + /** + * Disable all firewall rules. + * + * @return array messages + */ + public static function disable_all_firewall_rules() { + $msg = array(); + AIOWPSecurity_Configure_Settings::turn_off_firewall_configs(); + + //Now let's clear the applicable rules from the .htaccess file + if (AIOWPSecurity_Utility::allow_to_write_to_htaccess()) { + $res = AIOWPSecurity_Utility_Htaccess::write_to_htaccess(); + } else { + $res = true; + } + + if ($res) { + $msg['updated'] = __('All firewall rules have been disabled successfully.', 'all-in-one-wp-security-and-firewall'); + } else { + /* translators: %s: .htaccess path, %s file tab name. */ + $msg['error'] = sprintf(__('Could not write to the %s file.', 'all-in-one-wp-security-and-firewall'), AIOWPSecurity_Utility_File::get_home_path().'.htaccess') . ' ' . sprintf(__('Please restore it manually using the restore functionality in the "%s" tab.', 'all-in-one-wp-security-and-firewall'), '.htaccess ' . __('file', 'all-in-one-wp-security-and-firewall')); + } + return $msg; + } + + /** + * Reset all settings. + * + * @return array messages + */ + public static function reset_all_settings() { + $msg = array(); + if (!class_exists('AIOWPSecurity_Reset_Settings')) { + include(AIO_WP_SECURITY_PATH . '/admin/wp-security-reset-settings.php'); + } + $reset_option_res = AIOWPSecurity_Reset_Settings::reset_options(); + if (AIOWPSecurity_Utility::allow_to_write_to_htaccess()) { + $delete_htaccess = AIOWPSecurity_Reset_Settings::delete_htaccess(); + } else { + $delete_htaccess = true; + } + AIOWPSecurity_Reset_Settings::reset_db_tables(); + // AIOS premium and other plugin related config settings are reset by adding below action. + do_action('aios_reset_all_settings'); + + if (false === $reset_option_res && false === $delete_htaccess) { + $msg['error'] = __('Deletion of aio_wp_security_configs option and .htaccess directives failed.', 'all-in-one-wp-security-and-firewall'); + } elseif (false === $reset_option_res) { + $msg['error'] = __('Reset of aio_wp_security_configs option failed.', 'all-in-one-wp-security-and-firewall'); + } elseif (false === $delete_htaccess) { + $msg['error'] = __('Deletion of .htaccess directives failed.', 'all-in-one-wp-security-and-firewall'); + } else { + $msg['updated'] = __('All settings have been successfully reset.', 'all-in-one-wp-security-and-firewall'); + } + return $msg; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-two-factor-login.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-two-factor-login.php new file mode 100755 index 00000000..91729b0b --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-two-factor-login.php @@ -0,0 +1,201 @@ +is_incompatible_plugin_active()) return; + + if (!function_exists('mcrypt_get_iv_size') && !function_exists('openssl_cipher_iv_length')) { + add_action('all_admin_notices', array($this, 'admin_notice_missing_mcrypt_and_openssl')); + return; + } + + $this->is_tfa_integrated = true; + + // Run at a priority ensuring that this will be after AIOS has registered its translation domain + add_action('init', array($this, 'plugin_text_domain_loaded'), 11); + + add_action('admin_menu', array($this, 'menu_entry_for_user'), 30); + $this->version = AIO_WP_SECURITY_VERSION; + $this->set_user_settings_page_slug(AIOWPSEC_TWO_FACTOR_AUTH_MENU_SLUG); + + $this->set_plugin_translate_url('https://translate.wordpress.org/projects/wp-plugins/all-in-one-wp-security-and-firewall/'); + $this->set_site_wide_administration_url(admin_url('admin.php?page=aiowpsec_settings&tab=two-factor-authentication')); + $this->set_premium_version_url('https://teamupdraft.com/all-in-one-security/pricing/?utm_source=aios-plugin&utm_medium=referral&utm_campaign=paac&utm_content=emergency-codes-feature&utm_creative_format=text'); + $this->set_faq_url('https://wordpress.org/plugins/all-in-one-wp-security-and-firewall/#faq'); + parent::__construct(); + } + + /** + * Runs upon the WP action init (once the text domain has been loaded) + */ + public function plugin_text_domain_loaded() { + $this->set_settings_page_heading(__('Two factor authentication - Admin settings', 'all-in-one-wp-security-and-firewall')); + } + + /** + * Detect plugins that cause us to self-deactivate + * + * @return Boolean|String + */ + private function is_incompatible_plugin_active() { + + if (defined('WORDFENCE_LS_VERSION')) return 'Wordfence Login Security'; + + $active_plugins = $this->get_active_plugins(); + foreach ($active_plugins as $plugin_file_rel_to_plugins_dir) { + $temp_plugin_file_name = substr($plugin_file_rel_to_plugins_dir, strpos($plugin_file_rel_to_plugins_dir, '/') + 1); + if ('wordfence-login-security.php' == $temp_plugin_file_name) { + return 'Wordfence Login Security'; + } + if ('wordfence.php' == $temp_plugin_file_name) { + return 'Wordfence'; + } + } + return false; + } + + /** + * Gets an array of plugins active on either the current site, or site-wide + * + * @return Array - a list of plugin paths (relative to the plugin directory) + */ + private function get_active_plugins() { + + // Gets all active plugins on the current site + $active_plugins = get_option('active_plugins'); + + if (is_multisite()) { + $network_active_plugins = get_site_option('active_sitewide_plugins'); + if (!empty($network_active_plugins)) { + $network_active_plugins = array_keys($network_active_plugins); + $active_plugins = array_merge($active_plugins, $network_active_plugins); + } + } + + return $active_plugins; + } + + /** + * Runs upon the WP actions admin_menu and network_admin_menu + */ + public function menu_entry_for_user() { + + global $current_user; + if ($this->is_activated_for_user($current_user->ID)) { + if (!AIOWPSecurity_Utility_Permissions::has_manage_cap()) { + $menu_icon_url = AIO_WP_SECURITY_URL . '/images/aios-plugin-icon.svg'; + add_menu_page(__('AIOS', 'all-in-one-wp-security-and-firewall'), __('AIOS', 'all-in-one-wp-security-and-firewall'), apply_filters('aios_management_permission', 'manage_options'), AIOWPSEC_MAIN_MENU_SLUG, '', $menu_icon_url); + } + add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, __('Two Factor Auth', 'all-in-one-wp-security-and-firewall'), __('Two Factor Auth', 'all-in-one-wp-security-and-firewall'), 'read', AIOWPSEC_TWO_FACTOR_AUTH_MENU_SLUG, array($this, 'show_dashboard_user_settings_page')); + } + } + + /** + * AIOS settings based user IP address + * + * @return string IP address + */ + public function aios_set_user_ip_address() { + return AIOS_Helper::get_user_ip_address(); + } + + /** + * Builds Two Factor Authentication tab + * + * @param array $tabs array that contain tab name and call back function + * @return array Returns all tabs with callback function name + */ + public function add_two_factor_setting_tab($tabs = array()) { + if (!AIOWPSecurity_Utility_Permissions::has_manage_cap()) return; + + $tabs['two-factor-authentication'] = array( + 'title' => __('Two factor authentication', 'all-in-one-wp-security-and-firewall'), + 'render_callback' => array($this, 'render_two_factor_authentication'), + 'display_condition_callback' => 'is_main_site', + ); + return $tabs; + } + + /** + * Display the Two Factor Authentication tab & handle the operations + */ + public function render_two_factor_authentication() { + $plugin = $this->is_incompatible_plugin_active(); + if (false !== $plugin) { + global $aio_wp_security; + $aio_wp_security->include_template('admin/incompatible-plugin.php', false, array( + 'incompatible_plugin' => $plugin, + )); + return; + } + + $this->show_admin_settings_page(); + } + + /** + * Include the admin settings page code. + */ + public function show_admin_settings_page() { + + if (!is_admin() || !AIOWPSecurity_Utility_Permissions::has_manage_cap()) return; + + // Check if there are any settings errors and display them (this is needed because the forms from this template submit to the TFA options page not AIOS, so we need to grab them and output them manually). + $settings_errors = get_settings_errors(); + foreach ($settings_errors as $error) { + $type = 'success' == $error['type'] ? 'updated' : 'error'; + $this->show_admin_warning($error['message'], $type); + } + + // The value for totp_controller is already set by versions of the TFA plugin after 3 Oct 2022 + $this->include_template('admin-settings.php', array( + 'totp_controller' => $this->get_controller('totp'), + 'settings_page_heading' => $this->get_settings_page_heading(), + 'admin_settings_links' => array(), + )); + } + + /** + * Runs conditionally on the WP action all_admin_notices. + */ + public function admin_notice_missing_mcrypt_and_openssl() { + $this->show_admin_warning(''.__('PHP OpenSSL or mcrypt module required', 'all-in-one-wp-security-and-firewall').'
'.__('The All-In-One Security plugin\'s Two Factor Authentication module requires either the PHP openssl (preferred) or mcrypt module to be installed.', 'all-in-one-wp-security-and-firewall') . ' ' . __('Please ask your web hosting company to install one of them.', 'all-in-one-wp-security-and-firewall'), 'error'); + } +} + +if (false === AIOWPSecurity_Utility::is_incompatible_tfa_premium_version_active() && false === AIOWPSecurity_Utility::is_tfa_or_self_plugin_activating()) { + $GLOBALS['simba_two_factor_authentication'] = new AIO_WP_Security_Simba_Two_Factor_Authentication_Plugin(); +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-uninstallation-tasks.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-uninstallation-tasks.php new file mode 100755 index 00000000..8c70157b --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-uninstallation-tasks.php @@ -0,0 +1,83 @@ +prefix.'aiowps_login_lockdown', + $wpdb->prefix.'aiowps_failed_logins', + $wpdb->prefix.'aiowps_login_activity', + $wpdb->prefix.'aiowps_global_meta', + $wpdb->prefix.'aiowps_events', + $wpdb->prefix.'aiowps_permanent_block', + $wpdb->prefix.'aiowps_debug_log', + $wpdb->prefix.'aiowps_audit_log', + $wpdb->prefix.'aiowps_logged_in_users', + $wpdb->prefix.'aiowps_message_store', + ); + + $aio_wp_security->configs->load_config(); + + // check and drop database tables + if ('1' == $aio_wp_security->configs->get_value('aiowps_on_uninstall_delete_db_tables')) { + foreach ($database_tables as $table_name) { + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $wpdb->query("DROP TABLE IF EXISTS `$table_name`"); + } + } + + // check and delete configurations + if ('1' == $aio_wp_security->configs->get_value('aiowps_on_uninstall_delete_configs')) { + if (is_main_site()) { + $firewall_rules_path = AIOWPSecurity_Utility_Firewall::get_firewall_rules_path(); + AIOWPSecurity_Utility_File::remove_local_directory($firewall_rules_path); + + delete_metadata('user', '0', 'aiowps_account_status', '', true); + delete_metadata('user', '0', 'aiowps_registrant_ip', '', true); + } + + delete_option('aio_wp_security_configs'); + delete_option('aiowpsec_db_version'); + delete_option('aiowpsec_firewall_version'); + delete_option('aios_antibot_key_map_info'); + } + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-user-login.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-user-login.php new file mode 100755 index 00000000..a809416d --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-user-login.php @@ -0,0 +1,1022 @@ +key_login_msg = 'aiowps_login_msg_id'; + // As a first authentication step, check if user's IP is locked. + add_filter('authenticate', array($this, 'block_ip_if_locked'), 1, 1); + // Check whether user needs to be manually approved after default WordPress authenticate hooks (with priority 20). + add_filter('authenticate', array($this, 'check_manual_registration_approval'), 30, 1); + // Check login CAPTCHA + if ($aio_wp_security->configs->get_value('aiowps_enable_login_captcha')) { + add_filter('authenticate', array($this, 'check_captcha'), 20, 1); + } + // As a last authentication step, perform post authentication steps + add_filter('authenticate', array($this, 'post_authenticate'), 100, 3); + add_action('aiowps_force_logout_check', array($this, 'aiowps_force_logout_action_handler')); + add_action('wp_logout', array($this, 'wp_logout_action_handler'), 10, 1); + add_filter('login_message', array($this, 'aiowps_login_message')); //WP filter to add or modify messages on the login page + + // Display disable lockdown message + if (is_admin() && AIOWPSecurity_Utility_Permissions::has_manage_cap() && $aio_wp_security->is_login_lockdown_by_const() && $this->is_admin_page_to_display_disable_login_lockdown_by_const_notice()) { + add_action('all_admin_notices', array($this, 'disable_login_lockdown_by_const_notice')); + } + + add_action('set_auth_cookie', array($this, 'handle_logged_in_user'), 10, 4); + + //cron job to remove expired users from logged_in table + add_action('delete_expired_logged_in_users_event', array($this, 'delete_expired_logged_in_users')); + + add_filter('retrieve_password_message', array($this, 'aiowps_retrieve_password_message'), 10, 1); + } + + /** + * Check whether the admin page is to display disable login lockdown by const notice. + * + * @return boolean True if the notice will be displayed, Otherwise false. + */ + private function is_admin_page_to_display_disable_login_lockdown_by_const_notice() { + global $pagenow; + if (in_array($pagenow, array('index.php', 'plugins.php'))) { + return true; + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. Ignore. + } elseif (('admin.php' == $pagenow && isset($_GET['page']) && false !== strpos(sanitize_title(wp_unslash($_GET['page'])), AIOWPSEC_MENU_SLUG_PREFIX)) && !$this->is_locked_ip_addresses_tab_admin_page()) { + return true; + } + return false; + } + + /** + * Check whether the admin page is Locked IP Addresses Tab page. + * + * @return boolean True if is Locked IP Addresses Tab page, Otherwise false. + */ + private function is_locked_ip_addresses_tab_admin_page() { + global $pagenow; + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce. + return ('admin.php' == $pagenow && isset($_GET['page']) && 'aiowpsec' == $_GET['page'] && isset($_GET['tab']) && 'locked-ip' == $_GET['tab']); + } + + /** + * Displays admin to disable lockdown message. + * + * @return Void + */ + public function disable_login_lockdown_by_const_notice() { + + if (!AIOWPSecurity_Utility_Permissions::has_manage_cap()) { + return; + } + + echo '
+

'. + esc_html__('You have disabled login lockout by defining the AIOS_DISABLE_LOGIN_LOCKOUT constant value as true, and the login lockout setting has enabled it.', 'all-in-one-wp-security-and-firewall') . ' ' . + /* translators: 1: Locked IP Addresses admin page link */ + sprintf(esc_html__('Delete your login lockout IP from %s and define the AIOS_DISABLE_LOGIN_LOCKOUT constant value as false.', 'all-in-one-wp-security-and-firewall'), + '' . esc_html__('Locked IP addresses', 'all-in-one-wp-security-and-firewall') . '' + ). + '

+
'; + } + + /** + * Terminate the execution via wp_die with 503 status code, if current + * user's IP is currently locked. + * + * @global AIO_WP_Security $aio_wp_security + * @param WP_Error|WP_User $user + * @return WP_User + */ + public function block_ip_if_locked($user) { + global $aio_wp_security; + + // Allow users to login when disable AIOWPS_DISABLE_LOCK_DOWN defined true + if ($aio_wp_security->is_login_lockdown_by_const()) { + return $user; + } + + $user_locked = $this->check_locked_user(); + if (null != $user_locked) { + $aio_wp_security->debug_logger->log_debug("Login attempt from blocked IP range - ".$user_locked['failed_login_ip'], 2); + // Allow the error message to be filtered. + /* translators: %s: Error notification with strong HTML tag. */ + $error_msg = apply_filters('aiowps_ip_blocked_error_msg', sprintf(__('%s: Access from your IP address has been blocked for security reasons.', 'all-in-one-wp-security-and-firewall'), '' . __('ERROR', 'all-in-one-wp-security-and-firewall') . '') . ' ' . __('Please contact the administrator.', 'all-in-one-wp-security-and-firewall')); + // If unlock requests are allowed, add the "Request Unlock" button to the message. + $unlock_form = ''; + if ($aio_wp_security->configs->get_value('aiowps_allow_unlock_requests') == '1') { + $unlock_form = $this->get_unlock_request_form(); + $error_msg .= $unlock_form; + } + $error_msg = apply_filters('aiowps_ip_blocked_output_page', $error_msg, $unlock_form); //filter the complete output of the locked page + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP Error. Can not escape form html inside $error_msg. + wp_die($error_msg, esc_html__('Service temporarily unavailable', 'all-in-one-wp-security-and-firewall'), 503); + } else { + return $user; + } + } + + /** + * Check login CAPTCHA (if enabled). + * + * @global AIO_WP_Security $aio_wp_security + * @param WP_Error|WP_User $user + * @return WP_Error|WP_User + */ + public function check_captcha($user) { + global $aio_wp_security; + if (is_wp_error($user) || $aio_wp_security->is_login_lockdown_by_const()) { + // Authentication has failed already at some earlier step. + return $user; + } + + // phpcs:ignore WordPress.Security.NonceVerification.Missing -- PCP warning. No nonce. + if (! (isset($_POST['log']) && isset($_POST['pwd']))) { + // XML-RPC authentication (not via wp-login.php), nothing to do here. + return $user; + } + + if ($aio_wp_security->configs->get_value('aiowps_enable_login_captcha') != '1') { + // CAPTCHA not enabled, nothing to do here. + return $user; + } + + /* translators: %s: Error notification with strong HTML tag. */ + $captcha_error = new WP_Error('authentication_failed', sprintf(__('%s: Your answer was incorrect - please try again.', 'all-in-one-wp-security-and-firewall'), '' . __('ERROR', 'all-in-one-wp-security-and-firewall') . '')); + $verify_captcha = $aio_wp_security->captcha_obj->verify_captcha_submit(); + if (false === $verify_captcha) { + return $captcha_error; + } + return $user; + } + + /** + * Check, whether $user needs to be manually approved by site admin yet. + * + * @global AIO_WP_Security $aio_wp_security + * @param WP_Error|WP_User $user + * @return WP_Error|WP_User + */ + public function check_manual_registration_approval($user) { + global $aio_wp_security; + if (!($user instanceof WP_User)) { + // Not a WP_User - nothing to do here. + return $user; + } + //Check if auto pending new account status feature is enabled + if ($aio_wp_security->configs->get_value('aiowps_enable_manual_registration_approval') == '1') { + $aiowps_account_status = get_user_meta($user->ID, 'aiowps_account_status', true); + if ('pending' == $aiowps_account_status) { + // Account needs to be activated yet + /* translators: %s: Notification with strong HTML tag. */ + return new WP_Error('account_pending', sprintf(__('%s: Your account is currently not active.', 'all-in-one-wp-security-and-firewall'), '' . __('ACCOUNT PENDING', 'all-in-one-wp-security-and-firewall') . '') . ' '. __('An administrator needs to activate your account before you can login.', 'all-in-one-wp-security-and-firewall')); + } + } + return $user; + } + + /** + * Handle post authentication steps (in case of failed login): + * - increment number of failed logins for $username + * - (optionally) lock the user + * - (optionally) display a generic error message + * + * @global AIO_WP_Security $aio_wp_security + * @param WP_Error|WP_User $user + * @param string $username + * @param string $password + * @return WP_Error|WP_User + */ + public function post_authenticate($user, $username, $password) { + global $aio_wp_security; + if (!is_wp_error($user)) { + // Authentication has been successful, there's nothing to do here. + return $user; + } + if (empty($username) || empty($password)) { + // Neither log nor block login attempts with empty username or password. + return $user; + } + if ($user->get_error_code() === 'account_pending') { + // Neither log nor block users attempting to log in before their registration is approved. + return $user; + } + // Login failed for non-trivial reason + AIOWPSecurity_Audit_Events::event_failed_login($username); + if ($aio_wp_security->configs->get_value('aiowps_enable_login_lockdown') == '1') { + $is_whitelisted = false; + //check if lockout whitelist enabled + if ($aio_wp_security->configs->get_value('aiowps_lockdown_enable_whitelisting') == '1') { + $whitelisted_ips = $aio_wp_security->configs->get_value('aiowps_lockdown_allowed_ip_addresses'); + $is_whitelisted = AIOWPSecurity_Utility_IP::is_userip_whitelisted($whitelisted_ips); + } + + if (false === $is_whitelisted) { + // Too many failed logins from user's IP? + $login_attempts_permitted = absint($aio_wp_security->configs->get_value('aiowps_max_login_attempts')); + $too_many_failed_logins = $login_attempts_permitted <= $this->get_login_fail_count(); + + // Is an invalid username or email the reason for login error? + $invalid_username = ($user->get_error_code() === 'invalid_username' || $user->get_error_code() == 'invalid_email'); + // Should an invalid username be immediately locked? + $invalid_username_lockdown = $aio_wp_security->configs->get_value('aiowps_enable_invalid_username_lockdown') == '1'; + $lock_invalid_username = $invalid_username && $invalid_username_lockdown; + + // Should an invalid username be blocked as per blacklist? + $instant_lockout_users_list = $aio_wp_security->configs->get_value('aiowps_instantly_lockout_specific_usernames'); + if (!is_array($instant_lockout_users_list)) { + $instant_lockout_users_list = array(); + } + $username_blacklisted = $invalid_username && in_array($username, $instant_lockout_users_list); + + $lock_reasons = array(); + if ($too_many_failed_logins) { + $lock_reasons[] = 'too_many_failed_logins'; + } + if ($lock_invalid_username) { + $lock_reasons[] = 'invalid_username'; + } + if ($username_blacklisted) { + $lock_reasons[] = 'username_blacklisted'; + } + if ($lock_reasons) { + $this->lock_the_user($username, implode(',', $lock_reasons)); + } + } + } + + if ($aio_wp_security->configs->get_value('aiowps_set_generic_login_msg') == '1') { + // Return generic error message if configured + return new WP_Error('authentication_failed', __('ERROR: Invalid login credentials.', 'all-in-one-wp-security-and-firewall')); + } + return $user; + } + /** + * This function queries the aiowps_login_lockdown table. + * If the release_date has not expired AND the current visitor IP addr matches + * it will return a record + */ + public function check_locked_user() { + global $wpdb; + $login_lockdown_table = AIOWPSEC_TBL_LOGIN_LOCKOUT; + $ip = AIOWPSecurity_Utility_IP::get_user_ip_address(); //Get the IP address of user + if (empty($ip)) return false; + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $locked_user = $wpdb->get_row($wpdb->prepare("SELECT * FROM $login_lockdown_table WHERE `released` > UNIX_TIMESTAMP() AND `failed_login_ip` = %s", $ip), ARRAY_A); + return $locked_user; + } + /** + * This function queries the aiowps_audit_log table and returns the number of failures for current IP range within allowed failure period + */ + public function get_login_fail_count() { + + global $wpdb, $aio_wp_security; + + $audit_log_table = AIOWPSEC_TBL_AUDIT_LOG; + $login_retry_interval = $aio_wp_security->configs->get_value('aiowps_retry_time_period') * 60; + $now = time(); + $ip = AIOWPSecurity_Utility_IP::get_user_ip_address(); // Get the users IP address + + if (empty($ip)) return false; + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $login_failures = $wpdb->get_var("SELECT COUNT(ID) FROM $audit_log_table " . "WHERE created + " . esc_sql($login_retry_interval) . " > '" . esc_sql($now) . "' AND " . "ip = '" . esc_sql($ip) . "' AND event_type = 'failed_login'"); + return $login_failures; + } + + /** + * Get lockout time dynamically multiplied with default lockout time + * + * @return Integer get lockout time length. + */ + public function get_dynamic_lockout_time_length() { + global $aio_wp_security; + + $login_fail_count = $this->get_login_fail_count(); + $lockout_time_default = $aio_wp_security->configs->get_value('aiowps_lockout_time_length'); + if (!is_numeric($lockout_time_default)) { + $lockout_time_default = 5; + } + $lockout_time_max = $aio_wp_security->configs->get_value('aiowps_max_lockout_time_length'); + if (!is_numeric($lockout_time_max)) { + $lockout_time_max = 60; + } + $lockout_time_length = (int) ($login_fail_count > 0 ? (3 * $lockout_time_default * ($login_fail_count + 1)) : $lockout_time_default); + + return $lockout_time_length >= $lockout_time_max ? $lockout_time_max : $lockout_time_length; + } + + /** + * Adds an entry to the `aiowps_login_lockdown` table. + * + * @param string $username User's username or email + * @param string $lock_reason + * @param bool $is_lockout_email_sent flag for lockout email send + */ + public function lock_the_user($username, $lock_reason = 'login_fail', $is_lockout_email_sent = 0) { + global $aio_wp_security; + $login_lockdown_table = AIOWPSEC_TBL_LOGIN_LOCKOUT; + $lock_minutes = $this->get_dynamic_lockout_time_length(); + $ip = AIOWPSecurity_Utility_IP::get_user_ip_address(); //Get the IP address of user + if (empty($ip)) return; + $ip_range = AIOWPSecurity_Utility_IP::get_sanitized_ip_range($ip); //Get the IP range of the current user + $user = is_email($username) ? get_user_by('email', $username) : get_user_by('login', $username); //Returns WP_User object if exists + $ip_range = apply_filters('aiowps_before_lockdown', $ip_range); + if ($user) { + //If the login attempt was made using a valid user set variables for DB storage later on + $user_id = $user->ID; + } else { + //If the login attempt was made using a non-existent user then let's set user_id to blank and record the attempted user login name for DB storage later on + $user_id = 0; + } + + $lock_time = current_time('mysql', true); + $date = new DateTime($lock_time); + $add_interval = 'PT'.absint($lock_minutes).'M'; + $date->add(new DateInterval($add_interval)); + $release_time = $date->format('Y-m-d H:i:s'); + $backtrace_log = ''; + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_php_backtrace_in_email')) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_debug_backtrace, PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection -- PCP and compatibility warnings. Safe to ignore. + $backtrace_log = AIOWPSecurity_Utility::normalise_call_stack_args(debug_backtrace()); + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_print_r -- PCP warning. Ignore. + $backtrace_log = print_r($backtrace_log, true); + } + $is_lockout_email_sent = (1 == $aio_wp_security->configs->get_value('aiowps_enable_email_notify') ? 0 : -1); + $ip_lookup_result = AIOS_Helper::get_ip_reverse_lookup($ip); + $ip_lookup_result = wp_json_encode($ip_lookup_result); + if (false === $ip_lookup_result) $ip_lookup_result = null; + + $lock_seconds = $lock_minutes * MINUTE_IN_SECONDS; + + $data = array( + 'user_id' => $user_id, + 'user_login' => $username, + 'lockdown_date' => $lock_time, + 'release_date' => $release_time, + 'failed_login_IP' => $ip, + 'lock_reason' => $lock_reason, + 'is_lockout_email_sent' => $is_lockout_email_sent, + 'backtrace_log' => $backtrace_log, + 'ip_lookup_result' => $ip_lookup_result, + 'lock_seconds' => $lock_seconds + ); + + $result = AIOWPSecurity_Utility::add_lockout($data); + + if (false === $result) { + $aio_wp_security->debug_logger->log_debug("Error inserting record into ".$login_lockdown_table, 4); + } else { + do_action('aiowps_lockdown_event', $ip_range, $username); + $aio_wp_security->debug_logger->log_debug("The following IP address range has been locked out for exceeding the maximum login attempts: ".$ip_range, 2); + } + } + + /** + * Send IP Lock notification. + * + * @param Array $lockout_ips_list have username, ip_range, ip + * @param String $backtrace_filepath + * + * @return Boolean True if mail sent otherwise false. + */ + private function send_ip_lock_notification_email($lockout_ips_list = array(), $backtrace_filepath = '') { + global $aio_wp_security; + $send_mail = false; + if (0 != count($lockout_ips_list)) { + $email_notification_enabled = $aio_wp_security->configs->get_value('aiowps_enable_email_notify'); + if (1 == $email_notification_enabled) { + $to_email_address = AIOWPSecurity_Utility::get_array_from_textarea_val($aio_wp_security->configs->get_value('aiowps_email_address')); + if (empty($to_email_address)) { + $to_email_address = array(get_site_option('admin_email')); + } + $subject = '['.get_option('home').'] '. __('Site Lockout Notification', 'all-in-one-wp-security-and-firewall'); + $email_msg = __('User login lockout events had occurred due to too many failed login attempts or invalid username:', 'all-in-one-wp-security-and-firewall')."\n\n"; + + foreach ($lockout_ips_list as $lockout_ip) { + /* translators: %s: User name. */ + $email_msg .= sprintf(__('Username: %s', 'all-in-one-wp-security-and-firewall'), $lockout_ip['username']) . "\n"; + + /* translators: %s: IP Address. */ + $email_msg .= sprintf(__('IP address: %s', 'all-in-one-wp-security-and-firewall'), $lockout_ip['ip']) . "\n"; + if ('' != $lockout_ip['ip_range']) { + /* translators: %s: IP Range. */ + $email_msg .= sprintf(__('IP range: %s', 'all-in-one-wp-security-and-firewall'), $lockout_ip['ip_range']) . '.*' . "\n"; + } + if (!empty($lockout_ip['ip_lookup_result'])) { + $ip_lookup_result = json_decode($lockout_ip['ip_lookup_result'], true); + + $org = empty($ip_lookup_result['org']) ? __('Not Found', 'all-in-one-wp-security-and-firewall') : $ip_lookup_result['org']; + $as = empty($ip_lookup_result['as']) ? __('Not Found', 'all-in-one-wp-security-and-firewall') : $ip_lookup_result['as']; + + /* translators: %s: Org. */ + $email_msg .= sprintf(__('Org: %s', 'all-in-one-wp-security-and-firewall'), $org) . "\n"; + /* translators: %s: AS. */ + $email_msg .= sprintf(__('AS: %s', 'all-in-one-wp-security-and-firewall'), $as) . "\n"; + + $email_msg = apply_filters('aiowps_login_lockdown_email_message', $email_msg, $ip_lookup_result); + } + $email_msg .= "\n"; + } + + $email_msg .= __("Log into your site WordPress administration panel to see the duration of the lockout or to unlock the user.", 'all-in-one-wp-security-and-firewall') . "\n"; + + $email_header = ''; + $send_mail = wp_mail($to_email_address, $subject, $email_msg, $email_header, $backtrace_filepath); + + if (false === $send_mail) { + $ips_list = implode(', ', wp_list_pluck($lockout_ips_list, 'ip')); + $aio_wp_security->debug_logger->log_debug("Lockout notification email failed to send to " . implode(', ', $to_email_address) . " for IPs ".$ips_list, 4); + } + } + } + return $send_mail; + } + + /** + * Generates and returns an unlock request link which will be used to send to the user. + * + * @global type $wpdb + * @global AIO_WP_Security $aio_wp_security + * @param type $ip_range + * @return string or false on failure + */ + public static function generate_unlock_request_link($ip_range) { + //Get the locked user row from locout table + global $wpdb, $aio_wp_security; + $unlock_link = ''; + $lockout_table_name = AIOWPSEC_TBL_LOGIN_LOCKOUT; + $secret_rand_key = (md5(uniqid(wp_rand(), true))); + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP wanting. Ignore. + $res = $wpdb->query($wpdb->prepare("UPDATE $lockout_table_name SET unlock_key = %s WHERE released > UNIX_TIMESTAMP() AND failed_login_ip LIKE %s", $secret_rand_key, "%" . esc_sql($ip_range) . "%")); + if (null == $res) { + $aio_wp_security->debug_logger->log_debug("No locked user found with IP range ".$ip_range, 4); + return false; + } else { + // Check if unlock request or submitted from a WooCommerce account login page + if (isset($_POST['aiowps-woo-login'])) { // phpcs:ignore WordPress.Security.NonceVerification.Missing -- PCP warning. No nonce. + $date_time = current_time('mysql'); + $data = array('date_time' => $date_time, 'meta_key1' => 'woo_unlock_request_key', 'meta_value1' => $secret_rand_key); + $aiowps_global_meta_tbl_name = AIOWPSEC_TBL_GLOBAL_META_DATA; + // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.QuotedSimplePlaceholder, WordPress.DB.PreparedSQL.NotPrepared -- PCP error. Direct query required. Table name cannot be prepared pre WP 6.2. + $sql = $wpdb->prepare("INSERT INTO ".$aiowps_global_meta_tbl_name." (date_time, meta_key1, meta_value1, created) VALUES ('%s', '%s', '%s', UNIX_TIMESTAMP())", $data['date_time'], $data['meta_key1'], $data['meta_value1']); + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Prepared above. + $result = $wpdb->query($sql); + if (false === $result) { + $aio_wp_security->debug_logger->log_debug("generate_unlock_request_link() - Error inserting woo_unlock_request_key to AIOWPSEC_TBL_GLOBAL_META_DATA table for secret key ".$secret_rand_key, 4); + } + } + $query_param = array('aiowps_auth_key' => $secret_rand_key); + $wp_site_url = AIOWPSEC_WP_URL; + $unlock_link = esc_url(add_query_arg($query_param, $wp_site_url)); + } + return $unlock_link; + } + + /** + * This function will process an unlock request when someone clicks on the special URL + * It will check if the special random code matches that in lockdown table for the relevant user + * If so, it will unlock the user + * + * @param string $unlock_key + * @return void + */ + public static function process_unlock_request($unlock_key) { + global $wpdb, $aio_wp_security; + $lockout_table_name = AIOWPSEC_TBL_LOGIN_LOCKOUT; + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- PCP error. Direct query required. Table name cannot be prepared pre WP 6.2. + $unlock_command = $wpdb->prepare("UPDATE ".$lockout_table_name." SET released = UNIX_TIMESTAMP() WHERE unlock_key = %s", $unlock_key); + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Prepared above. + $result = $wpdb->query($unlock_command); + if (false === $result) { + $aio_wp_security->debug_logger->log_debug("Error unlocking user with unlock_key ".$unlock_key, 4); + } else { + // Now check if this unlock operation is for a WooCommerce login + $aiowps_global_meta_tbl_name = AIOWPSEC_TBL_GLOBAL_META_DATA; + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- PCP error. Direct query required. Table name cannot be prepared pre WP 6.2. + $sql = $wpdb->prepare("SELECT * FROM $aiowps_global_meta_tbl_name WHERE meta_key1=%s AND meta_value1=%s", 'woo_unlock_request_key', $unlock_key); + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Prepared above. + $woo_result = $wpdb->get_row($sql, OBJECT); + if (empty($woo_result)) { + $woo_unlock = false; + } else { + $woo_unlock = true; + } + if ($aio_wp_security->configs->get_value('aiowps_enable_rename_login_page')=='1') { + if (get_option('permalink_structure')) { + $home_url = trailingslashit(home_url()); + } else { + $home_url = trailingslashit(home_url()) . '?'; + } + if ($woo_unlock) { + $login_url = wc_get_page_permalink('myaccount'); //redirect to woo login page if applicable + //Now let's cleanup after ourselves and delete the woo-related row in the AIOWPSEC_TBL_GLOBAL_META_DATA table + // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore + $delete = $wpdb->delete($aiowps_global_meta_tbl_name, array('meta_key1' => 'woo_unlock_request_key', 'meta_value1' => $unlock_key)); + if (false === $delete) { + $aio_wp_security->debug_logger->log_debug("process_unlock_request(): Error deleting row from AIOWPSEC_TBL_GLOBAL_META_DATA for meta_key1=woo_unlock_request_key and meta_value1=".$unlock_key, 4); + } + } else { + $login_url = $home_url.$aio_wp_security->configs->get_value('aiowps_login_page_slug'); + } + + AIOWPSecurity_Utility::redirect_to_url($login_url); + } else { + AIOWPSecurity_Utility::redirect_to_url(wp_login_url()); + } + } + } + + /** + * This function sends an unlock request email to a locked out user + * + * @param string $email + * @param string $unlock_link + * @return void + */ + public static function send_unlock_request_email($email, $unlock_link) { + global $aio_wp_security; + $subject = '['.network_site_url().'] '. __('Unlock request notification', 'all-in-one-wp-security-and-firewall'); + /* translators: 1: Email 2: Link */ + $email_msg = sprintf(__('You have requested for the account with email address %s to be unlocked.', 'all-in-one-wp-security-and-firewall') . ' ' . __('Please press the link below to unlock your account:', 'all-in-one-wp-security-and-firewall'), $email) . "\n" . sprintf(__('Unlock link: %s', 'all-in-one-wp-security-and-firewall'), $unlock_link) . "\n\n" . __('After pressing the above link you will be able to login to the WordPress administration panel.', 'all-in-one-wp-security-and-firewall') . "\n"; + + $sendMail = wp_mail($email, $subject, $email_msg); + if (false === $sendMail) { + $aio_wp_security->debug_logger->log_debug("Unlock Request Notification email failed to send to " . $email, 4); + } + } + + /** + * Check the settings and log the user after the configured time period + * + * @param bool $return_url Optional. If true, the function returns the logout URL with a nonce. + * Otherwise, it redirects to the logout URL. Default is false. + * + * @return void|string + */ + public function aiowps_force_logout_action_handler($return_url = false) { + global $aio_wp_security; + //$aio_wp_security->debug_logger->log_debug("Force Logout - Checking if any user need to be logged out..."); + //if this feature is enabled then do something + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_forced_logout')) { + if (is_user_logged_in()) { + $current_user = wp_get_current_user(); + $user_id = $current_user->ID; + $current_time = current_time('mysql', true); + $login_time = $this->get_wp_user_aiowps_last_login_time($user_id); + if (empty($login_time)) { + return; + } + $diff = strtotime($current_time) - strtotime($login_time); + $logout_time_interval_value = $aio_wp_security->configs->get_value('aiowps_logout_time_period'); + $logout_time_interval_val_seconds = $logout_time_interval_value * 60; + if ($diff > $logout_time_interval_val_seconds) { + $aio_wp_security->debug_logger->log_debug("Force Logout - This user logged in more than (".$logout_time_interval_value.") minutes ago. Doing a force log out for the user with username: ".$current_user->user_login); + $this->wp_logout_action_handler($user_id); //this will register the logout time/date in the logout_date column + + + $curr_page_url = AIOWPSecurity_Utility::get_current_page_url(); + $after_logout_payload = array('redirect_to' => $curr_page_url, 'msg' => $this->key_login_msg.'=session_expired'); + //Save some of the logout redirect data to a transient + is_multisite() ? set_site_transient('aiowps_logout_payload', $after_logout_payload, 30 * 60) : set_transient('aiowps_logout_payload', $after_logout_payload, 30 * 60); + $logout_url = AIOWPSEC_WP_URL.'?aiowpsec_do_log_out=1'; + $logout_url = AIOWPSecurity_Utility::add_query_data_to_url($logout_url, 'al_additional_data', '1'); + $logout_url_with_nonce = html_entity_decode(wp_nonce_url($logout_url, 'aio_logout')); + if ($return_url) { + return $logout_url_with_nonce; + } + AIOWPSecurity_Utility::redirect_to_url($logout_url_with_nonce); + } + } + } + } + + /** + * Get last logged in time of given user id. + * + * @param integer $user_id + * @return mixed Last login time. False for an invalid $user_id (non-numeric, zero, or negative value). An empty string if a valid but non-existing user ID is passed. + */ + public function get_wp_user_aiowps_last_login_time($user_id) { + $last_login = apply_filters('aiowps_get_last_login_time', get_user_meta($user_id, 'aiowps_last_login_time', true), $user_id); + return $last_login; + } + + /** + * Updates the last login time in user meta, the login activity table. + * + * @global wpdb $wpdb + * @global AIO_WP_Security $aio_wp_security + * + * @param string $user_login + * @param WP_User $user + * + * @return void + */ + private static function update_login_activity($user_login, $user) { + AIOWPSecurity_Audit_Events::event_successful_login($user_login); + $login_date_time = current_time('mysql', true); + + update_user_meta($user->ID, 'aiowps_last_login_time', $login_date_time); //store last login time in meta table + } + + /** + * Remove the last login time for all users from meta table on deactivation. + * + * @return void + */ + public static function remove_login_activity() { + delete_metadata('user', '0', 'aiowps_last_login_time', '', true); //remove from meta table for all users last login time + } + + public static function wp_login_action_handler($user_login, $user = '') { + global $aio_wp_security; + + if ('' == $user) { + //Try and get user object + $user = get_user_by('login', $user_login); //This should return WP_User obj + if (!$user) { + $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_User_Login::wp_login_action_handler: Unable to get WP_User object for login ".$user_login, 4); + return; + } + } + + if (is_super_admin($user->ID)) { + $logging_into_correct_site = true; + } else { + $user_sites = get_blogs_of_user($user->ID); + + $current_site_id = get_current_blog_id(); + + $logging_into_correct_site = false; + + foreach ($user_sites as $site) { + if ($site->userblog_id == $current_site_id) { + $logging_into_correct_site = true; + break; + } + } + } + + if ($logging_into_correct_site) { + self::update_login_activity($user_login, $user); + } else { + $user_primary_site = get_active_blog_for_user($user->ID); + switch_to_blog($user_primary_site->blog_id); + self::update_login_activity($user_login, $user); + + restore_current_blog(); + } + } + + /** + * Handles logout events and modifies the login activity record for the current user. + * + * @param int $user_id - ID of user logging out + * @param boolean $force_logout - if user is force logged out + * + * @return void + */ + public function wp_logout_action_handler($user_id, $force_logout = false) { + global $aio_wp_security; + $user = get_userdata($user_id); + + if (false === $user) { + $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_User_Login::wp_logout_action_handler: Unable to get WP_User object", 4); + return; + } + + $this->delete_logged_in_user($user->ID); + + if (is_super_admin($user->ID)) { + $logging_out_of_correct_site = true; + } else { + $user_sites = get_blogs_of_user($user->ID); + + $current_site_id = get_current_blog_id(); + + $logging_out_of_correct_site = false; + + foreach ($user_sites as $site) { + if ($site->userblog_id == $current_site_id) { + $logging_out_of_correct_site = true; + break; + } + } + } + + if ($logging_out_of_correct_site) { + AIOWPSecurity_Audit_Events::event_successful_logout($user->user_login, $force_logout); + } else { + $user_primary_site = get_active_blog_for_user($user->ID); + switch_to_blog($user_primary_site->blog_id); + AIOWPSecurity_Audit_Events::event_successful_logout($user->user_login, $force_logout); + + restore_current_blog(); + } + } + + /** + * The handler for the WP "login_message" filter + * Adds custom messages to the other messages that appear above the login form. + * + * NOTE: This method is automatically called by WordPress for displaying + * text above the login form. + * + * @param string $message the output from earlier login_message filters + * @return string + */ + public function aiowps_login_message($message = '') { + global $aio_wp_security; + $msg = ''; + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- No nonce. + if (isset($_GET[$this->key_login_msg]) && !empty($_GET[$this->key_login_msg])) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- No nonce. + $logout_msg = wp_strip_all_tags(sanitize_title(wp_unslash($_GET[$this->key_login_msg]))); + } + if (!empty($logout_msg)) { + switch ($logout_msg) { + case 'session_expired': + /* translators: %s: Minute count */ + $msg = sprintf(__('Your session has expired because it has been over %d minutes since your last login.', 'all-in-one-wp-security-and-firewall'), $aio_wp_security->configs->get_value('aiowps_logout_time_period')); + $msg .= ' ' . __('Please log back in to continue.', 'all-in-one-wp-security-and-firewall'); + break; + case 'admin_user_changed': + $msg = __('You were logged out because you just changed the "admin" username.', 'all-in-one-wp-security-and-firewall'); + $msg .= ' ' . __('Please log back in to continue.', 'all-in-one-wp-security-and-firewall'); + break; + default: + } + } + if (!empty($msg)) { + $msg = htmlspecialchars($msg, ENT_QUOTES, 'UTF-8'); + $message .= ''; + } + return $message; + } + /** + * This function will generate an unlock request form to be inserted inside + * error message when user gets locked out. + * + * @return string + */ + public function get_unlock_request_form() { + global $aio_wp_security; + $unlock_request_form = ''; + //Let's encode some hidden data and make a form + $unlock_secret_string = $aio_wp_security->configs->get_value('aiowps_unlock_request_secret_key'); + $current_time = time(); + $enc_result = base64_encode($current_time.$unlock_secret_string); + $unlock_request_form .= '
'; + $unlock_request_form .= ''; + // phpcs:ignore WordPress.Security.NonceVerification.Missing -- No nonce. + if (isset($_POST['woocommerce-login-nonce'])) { + $unlock_request_form .= ''; + } + $unlock_request_form .= '
'; + return $unlock_request_form; + } + + /** + * Returns all logged in users for specific subsite of multisite installation. + * + * @param bool $sitewide - checks if logged in users should be fetched sitewide + * + * @return array + */ + public static function get_logged_in_users($sitewide = true) { + global $wpdb; + + $logged_in_users_table = AIOWPSEC_TBL_LOGGED_IN_USERS; + if ($sitewide) { + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $users_online = $wpdb->get_results("SELECT * FROM `{$logged_in_users_table}`", 'ARRAY_A'); + } else { + $current_blog_id = get_current_blog_id(); + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $users_online = $wpdb->get_results($wpdb->prepare("SELECT * FROM `{$logged_in_users_table}` WHERE site_id = %d", $current_blog_id), 'ARRAY_A'); + } + + if (empty($users_online)) return array(); + + return $users_online; + } + + /** + * Send email notification to an user that has flag is_lockout_email_sent is 0. + * + * @return Void + */ + public function send_login_lockout_emails() { + global $wpdb, $aio_wp_security; + // if user enabled notification email then only have to send + $email_notification_enabled = $aio_wp_security->configs->get_value('aiowps_enable_email_notify'); + if (0 == $email_notification_enabled) { + return; + } + // get recent lockout records on top to notify + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- PCP error. Direct query required. + $sql = $wpdb->prepare('SELECT id, user_login, failed_login_ip, backtrace_log, ip_lookup_result FROM ' .AIOWPSEC_TBL_LOGIN_LOCKOUT. ' WHERE is_lockout_email_sent = %d ORDER BY id DESC', 0); + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Prepared above. + $result = $wpdb->get_results($sql); + if (empty($result)) { + return; + } + $login_lockout_ids_send_emails = array(); + $lockout_ips_backtrace_log = array(); + $lockout_ips_list = array(); + $backtrace_filepath = ''; + foreach ($result as $row) { + $ip_range = AIOWPSecurity_Utility_IP::get_sanitized_ip_range($row->failed_login_ip); + $lockout_ips_list[] = array('username' => $row->user_login, 'ip' => $row->failed_login_ip, 'ip_range' => $ip_range, 'ip_lookup_result' => $row->ip_lookup_result); + $login_lockout_ids_send_emails[] = $row->id; + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_php_backtrace_in_email') && '' != $row->backtrace_log) { + $lockout_ips_backtrace_log[] = array('backtrace_log' => $row->backtrace_log); + } + } + + if (0 != count($lockout_ips_backtrace_log)) { + $backtrace_filepath = AIOWPSecurity_Utility::login_lockdown_email_backtrace_log_file($lockout_ips_backtrace_log); + } + + $this->send_ip_lock_notification_email($lockout_ips_list, $backtrace_filepath); + + if ('' != $backtrace_filepath) { + wp_delete_file($backtrace_filepath); + } + + if (!empty($login_lockout_ids_send_emails)) { + $aio_wp_security->debug_logger->log_debug(sprintf('The IP lock notification emails of login lockout ids [%s] are sent.', implode(', ', $login_lockout_ids_send_emails)), 4); + // update all email to as sent. + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- PCP error. Direct query required. Table name cannot be prepared pre WP 6.2. + $sql = $wpdb->prepare('UPDATE '.AIOWPSEC_TBL_LOGIN_LOCKOUT.' SET is_lockout_email_sent = %d WHERE is_lockout_email_sent = %d', 1, 0); + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Prepared above. + $update_result = $wpdb->query($sql); + if (false === $update_result) { + $error_msg = empty($wpdb->last_error) ? 'Could not receive the reason for the failure' : $wpdb->last_error; + $aio_wp_security->debug_logger->log_debug_cron("Lockout email flag is not updated in database due to error: {$error_msg}", 4); + } + } + } + + /** + * Stores logged-in user in the logged_in_user table + * + * @param int $user_id - id of user logging in + * @param int $expiration - expiration timestamp of cookie + * + * @return void + */ + public function store_logged_in_user($user_id, $expiration) { + global $wpdb, $aio_wp_security; + + $logged_in_users_table = AIOWPSEC_TBL_LOGGED_IN_USERS; + $ip_address = AIOWPSecurity_Utility_IP::get_user_ip_address(); + $userdata = get_userdata($user_id); + $username = $userdata->user_login; + $login_time = time(); + + // Check if a record with the given user_id already exists + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP error. Direct query required. Table name cannot be prepared pre WP 6.2. + $existing_record = $wpdb->get_row($wpdb->prepare("SELECT * FROM " . $logged_in_users_table . " WHERE user_id = %d", $user_id)); + + if ($existing_record) { + // Update the existing record + // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $result = $wpdb->update( + $logged_in_users_table, + array( + 'ip_address' => $ip_address, + 'site_id' => get_current_blog_id(), + 'username' => $username, + 'expires' => $expiration + ), + array('user_id' => $user_id) + ); + } else { + // Create a new record + // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $result = $wpdb->insert( + $logged_in_users_table, + array( + 'user_id' => $user_id, + 'ip_address' => $ip_address, + 'expires' => $expiration, + 'site_id' => get_current_blog_id(), + 'username' => $username, + 'created' => $login_time + ) + ); + } + + if (false === $result) { + $generic_error_message = $existing_record ? "Error updating record in " . $logged_in_users_table : "Error inserting record into ".$logged_in_users_table; + $error_message = empty($wpdb->last_error) ? $generic_error_message : $wpdb->last_error; + $aio_wp_security->debug_logger->log_debug($error_message, 4); + } + } + + /** + * Handles the data coming from the 'set_auth_cookie' hook + * + * @param string $auth_cookie - the generated auth_cookie + * @param int $expire - expiration timestamp of cookie if remember is marked + * @param int $expiration - expiration timestamp of cookie + * @param int $user_id - id of user logging in + * + * @return void + */ + public function handle_logged_in_user($auth_cookie, $expire, $expiration, $user_id) { + + if (empty($auth_cookie)) return; //check if auth cookie is empty, meaning login was not successful + $expiration = $expire > 0 ? $expire : $expiration; + + if (is_multisite() && !is_super_admin()) { + $user_blog = get_active_blog_for_user($user_id); + switch_to_blog($user_blog->blog_id); // switch to user blog incase they try to log in from wrong subsite + + $this->store_logged_in_user($user_id, $expiration); + restore_current_blog(); + } else { + $this->store_logged_in_user($user_id, $expiration); + } + } + + /** + * Deletes logged-in user from the logged_in_user table + * + * @param int $user_id + * @return bool + */ + public function delete_logged_in_user($user_id) { + global $wpdb, $aio_wp_security; + + $logged_in_users_table = AIOWPSEC_TBL_LOGGED_IN_USERS; + + if (empty($user_id)) return true; + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $result = $wpdb->delete( + $logged_in_users_table, + array('user_id' => $user_id) + ); + + + if (false === $result) { + $error_message = empty($wpdb->last_error) ? "Error deleting record from " . $logged_in_users_table : $wpdb->last_error; + $aio_wp_security->debug_logger->log_debug($error_message, 4); + } + + return $result; + } + + /** + * Cron job function for removing data with expired session from the logged-in user table + * + * @return void + */ + public function delete_expired_logged_in_users() { + global $wpdb, $aio_wp_security; + $logged_in_users_table = AIOWPSEC_TBL_LOGGED_IN_USERS; + + // Delete data with expired cookie + // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- PCP warning. Direct query required, + $result = $wpdb->query( + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- PCP error. Direct query required. Table name cannot be prepared pre WP 6.2. + $wpdb->prepare("DELETE FROM " . $logged_in_users_table . " WHERE expires < %d", time()) + ); + + if (false === $result) { + $error_message = empty($wpdb->last_error) ? "Error deleting records from ".$logged_in_users_table : $wpdb->last_error; + $aio_wp_security->debug_logger->log_debug($error_message, 4); + } + } + + /** + * This function rewrites the password reset message + * + * @param string $message - The password reset email message to be edited + * + * @return string - Email message to be sent for password reset + */ + public function aiowps_retrieve_password_message($message) { + $ip = AIOWPSecurity_Utility_IP::get_user_ip_address(); //Get the IP address of user + + // Find the position of the IP Address string in the message + $ip_string = isset($_SERVER['REMOTE_ADDR']) ? rest_is_ip_address(wp_unslash($_SERVER['REMOTE_ADDR'])) : ''; + $ip_pos = strpos($message, $ip_string); + + // If the IP Address string is found in the message and not the same as AIOWPS ip, replace it with the replacement string + if (false !== $ip_pos && $ip !== $ip_string) { + $replacement = "$ip.\r\n\r\n"; + $message = substr_replace($message, $replacement, $ip_pos); + } + + return $message; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-user-registration.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-user-registration.php new file mode 100755 index 00000000..879b2dfe --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-user-registration.php @@ -0,0 +1,100 @@ +configs->get_value('aiowps_enable_manual_registration_approval') == '1') { + add_filter("woocommerce_registration_auth_new_customer", array($this, 'aios_registration_auth_new_customer')); + } + + if ($aio_wp_security->configs->get_value('aiowps_enable_registration_page_captcha') == '1') { + add_filter('registration_errors', array($this, 'aiowps_validate_registration_with_captcha'), 10, 3); + } + } + + /** + * This public function will add a special meta string in the users table + * Meta field name: 'aiowps_account_status' + * Meta field value: 'pending' + * + * @param int $user_id + * @return void + */ + public function aiowps_user_registration_action_handler($user_id) { + global $aio_wp_security; + //Check if auto pending new account status feature is enabled + if ($aio_wp_security->configs->get_value('aiowps_enable_manual_registration_approval') == '1') { + if (AIOWPSecurity_Utility_Permissions::has_manage_cap() || (defined('WP_CLI') && WP_CLI)) { + AIOWPSecurity_Audit_Events::event_user_registration($user_id, 'admin'); + return; //if the user has been added from admin side don't put in pending state + } + $res = add_user_meta($user_id, 'aiowps_account_status', 'pending'); + if (!$res) { + $aio_wp_security->debug_logger->log_debug("aiowps_user_registration_action_handler: Error adding user meta data: aiowps_account_status", 4); + } + $user_ip_address = AIOWPSecurity_Utility_IP::get_user_ip_address(); + $res = add_user_meta($user_id, 'aiowps_registrant_ip', $user_ip_address); + if (!$res) { + $aio_wp_security->debug_logger->log_debug("aiowps_user_registration_action_handler: Error adding user meta data: aiowps_registrant_ip", 4); + } + AIOWPSecurity_Audit_Events::event_user_registration($user_id, 'pending'); + } else { + if (AIOWPSecurity_Utility_Permissions::has_manage_cap()) { + AIOWPSecurity_Audit_Events::event_user_registration($user_id, 'admin'); + } else { + AIOWPSecurity_Audit_Events::event_user_registration($user_id, 'registered'); + } + } + } + + /** + * This public function will set the special meta string in the usermeta table so that the account becomes active + * Meta field name: 'aiowps_account_status' + * Meta field values: 'active', 'pending', etc + * + * @param int $user_id + * @param string $status + * @return void + */ + public function aiowps_set_user_account_status($user_id, $status) { + global $aio_wp_security; + $res = update_user_meta($user_id, 'aiowps_account_status', $status); + if (!$res) { + $aio_wp_security->debug_logger->log_debug("aiowps_set_user_account_status: Error updating user meta data: aiowps_account_status", 4); + } + } + + public function aiowps_validate_registration_with_captcha($errors) { + global $aio_wp_security; + + $locked = $aio_wp_security->user_login_obj->check_locked_user(); + if (null == $locked) { + //user is not locked continue + } else { + $errors->add('authentication_failed', __('ERROR: You are not allowed to register because your IP address is currently locked!', 'all-in-one-wp-security-and-firewall')); + return $errors; + } + $verify_captcha = $aio_wp_security->captcha_obj->verify_captcha_submit(); + if (false === $verify_captcha) { + // wrong answer was entered + $errors->add('authentication_failed', __('ERROR: Your answer was incorrect - please try again.', 'all-in-one-wp-security-and-firewall')); + return $errors; + } + return $errors; + } + + /** + * This function serves the purpose of preventing login in certain plugins that enable user registration, such as WooCommerce and others. + * + * @return bool Returns false means do not authenticate on registration + */ + public function aios_registration_auth_new_customer() { + return false; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-api.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-api.php new file mode 100755 index 00000000..02860efa --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-api.php @@ -0,0 +1,121 @@ +debug_logger->log_debug("AIOWPSecurity_Utility_API::make_api_request() - Invalid request method. Only GET and POST are supported.", 4); + return new WP_Error('aios_api_invalid_method', 'Invalid request method. Only GET and POST are supported.'); + } + + // Validate the URL + if ('' !== $url && !filter_var($url, FILTER_VALIDATE_URL)) { + $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_Utility_API::make_api_request() - Invalid or missing request URL.", 4); + return new WP_Error('aios_api_invalid_url', 'Invalid or missing request URL.'); + } + + // Set up default arguments + $default_args = array( + 'headers' => array(), + 'body' => array(), + 'timeout' => 10, + ); + + // Merge default arguments with provided arguments + $request_args = wp_parse_args($args, $default_args); + + // Make the request + if ('POST' === $method) { + $response = wp_remote_post($url, $request_args); + } else { + $response = wp_remote_get($url, $request_args); + } + + // Check for errors + if (is_wp_error($response)) { + // Get error code and message + $error_code = $response->get_error_code(); + $error_message = $response->get_error_message(); + $error_data = $response->get_error_data(); // Optional additional error data + + // Log the error details + $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_Utility_API::make_api_request() | Response error - Code: {$error_code}, Message: {$error_message}", 4); + + // Log any additional error data (could be useful for debugging) + if ($error_data) { + if (is_array($error_data) || is_object($error_data)) { + $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_Utility_API::make_api_request() | Response error - Additional Error Data: " . json_encode($error_data), 4); + } else { + $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_Utility_API::make_api_request() | Response error - Additional Error Data: {$error_data}", 4); + } + } + + return $response; + } + + // Get the response body + $response_body = wp_remote_retrieve_body($response); + + // Check for JSON response + $content_type = wp_remote_retrieve_header($response, 'content-type'); + if (false !== strpos($content_type, 'application/json')) { + + // Decode the response body if it's JSON + $decoded_body = json_decode($response_body, true); + + // Log JSON decoding error if any + if (JSON_ERROR_NONE !== json_last_error()) { + $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_Utility_API::make_api_request() - JSON decode error: " . json_last_error_msg(), 4); + return new WP_Error('aios_api_json_decode_error', json_last_error_msg()); + } + + // Return the decoded JSON response body + return $decoded_body; + } + + // Return raw response body if it's not JSON + return $response_body; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-file.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-file.php new file mode 100755 index 00000000..07d1b6a7 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-file.php @@ -0,0 +1,522 @@ + 'root directory', 'path' => ABSPATH, 'permissions' => '0755'), + array('name' => 'wp-includes/', 'path' => ABSPATH."wp-includes", 'permissions' => '0755'), + array('name' => '.htaccess', 'path' => $home_path.".htaccess", 'permissions' => '0644'), + array('name' => 'wp-admin/index.php', 'path' => ABSPATH."wp-admin/index.php", 'permissions' => '0644'), + array('name' => 'wp-admin/js/', 'path' => ABSPATH."wp-admin/js/", 'permissions' => '0755'), + array('name' => 'wp-content/themes/', 'path' => WP_CONTENT_DIR."/themes", 'permissions' => '0755'), + array('name' => 'wp-content/plugins/', 'path' => WP_PLUGIN_DIR, 'permissions' => '0755'), + array('name' => 'wp-admin/', 'path' => ABSPATH."wp-admin", 'permissions' => '0755'), + array('name' => 'wp-content/', 'path' => WP_CONTENT_DIR, 'permissions' => '0755'), + array('name' => 'wp-config.php', 'path' => $wp_config_path, 'permissions' => '0640'), + //Add as many files or dirs as needed by following the convention above + ); + + return apply_filters('aiowpsecurity_file_permission_list', $file_list); + } + + /** + * Returns full path to mu-plugin directory + * + * @return string + */ + public static function get_mu_plugin_dir() { + return WPMU_PLUGIN_DIR; + } + + /** + * Returns path to wp-config + * + * @return string + */ + public static function get_wp_config_file_path() { + $wp_config_file = ABSPATH . 'wp-config.php'; + if (file_exists($wp_config_file)) { + return $wp_config_file; + } elseif (file_exists(dirname(ABSPATH) . '/wp-config.php')) { + return dirname(ABSPATH) . '/wp-config.php'; + } + return $wp_config_file; + } + + public static function write_content_to_file($file_path, $new_contents) { + // Get the file permissions so we can revert back to it when we are done + $permissions = octdec(substr(sprintf('%o', fileperms($file_path)), -4)); + @chmod($file_path, 0777); + if (is_writeable($file_path)) { + $handle = fopen($file_path, 'w'); + foreach ($new_contents as $line) { + fwrite($handle, $line); + } + fclose($handle); + @chmod($file_path, $permissions); //Let's change the file back to it's original permission setting + return true; + } else { + return false; + } + } + + public static function backup_and_rename_wp_config($src_file_path, $prefix = 'backup') { + global $aio_wp_security; + + //Check to see if the main "backups" directory exists - create it otherwise + $aiowps_backup_dir = WP_CONTENT_DIR.'/'.AIO_WP_SECURITY_BACKUPS_DIR_NAME; + if (!AIOWPSecurity_Utility_File::create_dir($aiowps_backup_dir)) { + $aio_wp_security->debug_logger->log_debug("backup_and_rename_wp_config - Creation of backup directory failed!", 4); + return false; + } + + $src_parts = pathinfo($src_file_path); + $backup_file_name = $prefix . '.' . $src_parts['basename']; + + $backup_file_path = $aiowps_backup_dir . '/' . $backup_file_name; + if (!copy($src_file_path, $backup_file_path)) { + //Failed to make a backup copy + return false; + } + return true; + } + + /** + * Backs up and renames the .htaccess file. + * + * This function creates a backup of the specified .htaccess file by copying it + * to a designated backup directory with a randomly generated filename. + * + * @param string $src_file_path The path to the source .htaccess file to be backed up. + * + * @return string|false The name of the backup file on success, or false on failure. + */ + public static function backup_and_rename_htaccess($src_file_path) { + global $aio_wp_security; + + // Define the backup directory path + $aiowps_backup_dir = WP_CONTENT_DIR . '/' . AIO_WP_SECURITY_BACKUPS_DIR_NAME; + + // Ensure the backup directory exists or create it + if (!AIOWPSecurity_Utility_File::create_dir($aiowps_backup_dir)) { + $aio_wp_security->debug_logger->log_debug("backup_and_rename_htaccess - Creation of backup directory failed!", 4); + return false; + } + + // Generate a random prefix for the backup file name + $random_prefix = AIOWPSecurity_Utility::generate_alpha_numeric_random_string(10); + $backup_file_name = $random_prefix . '_htaccess_backup'; + + // Define the backup file path + $backup_file_path = $aiowps_backup_dir . '/' . $backup_file_name .'.txt'; + + // Copy the source file to the backup location + if (!copy($src_file_path, $backup_file_path)) { + // Failed to make a backup copy + return false; + } + + // Return the backup file name on success + return $backup_file_name; + } + + /** + * This function will perform a recursive search for files in the path that match the passed in pattern + * + * @param string $pattern - the file pattern to search for + * @param integer $flags - flags to apply on the search + * @param string $path - the path we want to search + * + * @return boolean|array - an array of files matching the pattern or false if there was an error (directory traversal in path) or none found + */ + public static function recursive_file_search($pattern = '*', $flags = 0, $path = '') { + $paths = glob($path.'*', GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT); + if (false === $paths) { + return false; + } + $files = glob($path.$pattern, $flags); + if (false === $files) { + return false; + } + foreach ($paths as $path) { + $files = array_merge($files, AIOWPSecurity_Utility_File::recursive_file_search($pattern, $flags, $path)); + } + return $files; + } + + /** + * Useful when wanting to echo file contents to screen with
tags + * + * @param string $src_file + * @return string + */ + public static function get_file_contents_with_br($src_file) { + $file_contents = file_get_contents($src_file); + return nl2br($file_contents); + } + + /** + * Useful when wanting to echo file contents inside textarea + * + * @param string $src_file + * @return string + */ + public static function get_file_contents($src_file) { + $file_contents = file_get_contents($src_file); + return $file_contents; + } + + /** + * Returns the file's permission value eg, "0755" + * + * @param string $filepath + * @return string + */ + public static function get_file_permission($filepath) { + if (!function_exists('fileperms')) { + $perms = '-1'; + } else { + clearstatcache(); + $perms = substr(sprintf("%o", @fileperms($filepath)), -4); + } + return $perms; + } + + /** + * Checks if a write operation is possible for the file in question + * + * @param string $filepath + * @return boolean + */ + public static function is_file_writable($filepath) { + $test_string = ""; //We will attempt to append an empty string at the end of the file for the test + $write_result = @file_put_contents($filepath, $test_string, FILE_APPEND | LOCK_EX); + if (false === $write_result) { + return false; + } else { + return true; + } + } + + /** + * This function will compare the current permission value for a file or dir with the recommended value. + * It will compare the individual "execute", "write" and "read" bits for the "public", "group" and "owner" permissions. + * If the permissions for an actual bit value are greater than the recommended value it returns '0' (=less secure) + * Otherwise it returns '1' which means it is secure + * Accepts permission value parameters in octal, ie, "0777" or "777" + * + * @param string $recommended + * @param string $actual + * @return boolean + */ + public static function is_file_permission_secure($recommended, $actual) { + $result = 1; //initialize return result + + //Check "public" permissions + $public_value_actual = substr($actual, -1, 1); //get dec value for actual public permission + $public_value_rec = substr($recommended, -1, 1); //get dec value for recommended public permission + + $pva_bin = sprintf('%04b', $public_value_actual); //Convert value to binary + $pvr_bin = sprintf('%04b', $public_value_rec); //Convert value to binary + //Compare the "executable" bit values for the public actual versus the recommended + if (substr($pva_bin, -1, 1)<=substr($pvr_bin, -1, 1)) { + //The "execute" bit is the same or less as the recommended value + $result = 1*$result; + } else { + //The "execute" bit is switched on for the actual value - meaning it is less secure + $result = 0*$result; + } + + //Compare the "write" bit values for the public actual versus the recommended + if (substr($pva_bin, -2, 1)<=substr($pvr_bin, -2, 1)) { + //The "write" bit is the same or less as the recommended value + $result = 1*$result; + } else { + //The "write" bit is switched on for the actual value - meaning it is less secure + $result = 0*$result; + } + + //Compare the "read" bit values for the public actual versus the recommended + if (substr($pva_bin, -3, 1)<=substr($pvr_bin, -3, 1)) { + //The "read" bit is the same or less as the recommended value + $result = 1*$result; + } else { + //The "read" bit is switched on for the actual value - meaning it is less secure + $result = 0*$result; + } + + //Check "group" permissions + $group_value_actual = substr($actual, -2, 1); + $group_value_rec = substr($recommended, -2, 1); + $gva_bin = sprintf('%04b', $group_value_actual); //Convert value to binary + $gvr_bin = sprintf('%04b', $group_value_rec); //Convert value to binary + + //Compare the "executable" bit values for the group actual versus the recommended + if (substr($gva_bin, -1, 1)<=substr($gvr_bin, -1, 1)) { + //The "execute" bit is the same or less as the recommended value + $result = 1*$result; + } else { + //The "execute" bit is switched on for the actual value - meaning it is less secure + $result = 0*$result; + } + + //Compare the "write" bit values for the public actual versus the recommended + if (substr($gva_bin, -2, 1)<=substr($gvr_bin, -2, 1)) { + //The "write" bit is the same or less as the recommended value + $result = 1*$result; + } else { + //The "write" bit is switched on for the actual value - meaning it is less secure + $result = 0*$result; + } + + //Compare the "read" bit values for the public actual versus the recommended + if (substr($gva_bin, -3, 1)<=substr($gvr_bin, -3, 1)) { + //The "read" bit is the same or less as the recommended value + $result = 1*$result; + } else { + //The "read" bit is switched on for the actual value - meaning it is less secure + $result = 0*$result; + } + + //Check "owner" permissions + $owner_value_actual = substr($actual, -3, 1); + $owner_value_rec = substr($recommended, -3, 1); + $ova_bin = sprintf('%04b', $owner_value_actual); //Convert value to binary + $ovr_bin = sprintf('%04b', $owner_value_rec); //Convert value to binary + + //Compare the "executable" bit values for the group actual versus the recommended + if (substr($ova_bin, -1, 1)<=substr($ovr_bin, -1, 1)) { + //The "execute" bit is the same or less as the recommended value + $result = 1*$result; + } else { + //The "execute" bit is switched on for the actual value - meaning it is less secure + $result = 0*$result; + } + + //Compare the "write" bit values for the public actual versus the recommended + if (substr($ova_bin, -2, 1)<=substr($ovr_bin, -2, 1)) { + //The "write" bit is the same or less as the recommended value + $result = 1*$result; + } else { + //The "write" bit is switched on for the actual value - meaning it is less secure + $result = 0*$result; + } + + //Compare the "read" bit values for the public actual versus the recommended + if (substr($ova_bin, -3, 1)<=substr($ovr_bin, -3, 1)) { + //The "read" bit is the same or less as the recommended value + $result = 1*$result; + } else { + //The "read" bit is switched on for the actual value - meaning it is less secure + $result = 0*$result; + } + + return $result; + } + + /** + * Checks if a directory exists and creates one if it does not + * + * @param string $dirpath + * @return boolean + */ + public static function create_dir($dirpath = '') { + $res = true; + if ('' != $dirpath) { + //TODO - maybe add some checks to make sure someone is not passing a path with a filename, ie, something which has "." at the end + //$path_parts = pathinfo($dirpath); + //$dirpath = $path_parts['dirname'] . '/' . $path_parts['basename']; + if (!file_exists($dirpath)) { + $res = mkdir($dirpath, 0755); + } + } + return $res; + } + + /** + * Remove a directory from the local filesystem + * + * @param string $dir - the directory + * @param boolean $contents_only - if set to true, then do not remove the directory, but only empty it of contents + * + * @return boolean - success/failure + */ + public static function remove_local_directory($dir, $contents_only = false) { + + $handle = opendir($dir); + if ($handle) { + while (false !== ($entry = readdir($handle))) { + if ('.' !== $entry && '..' !== $entry) { + if (is_dir($dir.'/'.$entry)) { + self::remove_local_directory($dir.'/'.$entry, false); + } else { + @unlink($dir.'/'.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- ignore warning and proceed to try and remove the rest of the files + } + } + } + if (is_resource($handle)) closedir($handle); + } + + return $contents_only ? true : rmdir($dir); + } + + /** + * Get home path. + * + * @return string + */ + public static function get_home_path() { + // Make the scope of $wp_file_descriptions global, so that when wp-admin/includes/file.php assigns to it, it is adjusting the global variable as intended + global $wp_file_descriptions; // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- We need to make this global see above comment + if (!function_exists('get_home_path')) require_once(ABSPATH. '/wp-admin/includes/file.php'); + return wp_normalize_path(get_home_path()); + } + + /** + * Check if wp config file. + * + * @param string $file_contents File contents + * + * @return bool + */ + public static function check_if_wp_config_contents($file_contents) { + return !empty($file_contents) && preg_match("/define\(\s*['\"]DB_NAME['\"]/i", $file_contents); + } + + /** + * Check if valid aios settings text + * + * @param string $text - Settings text + * + * @return boolean + */ + public static function check_is_aiowps_settings($text) { + return (false !== strpos($text, 'aiowps_enable_login_lockdown')); + } + + /** + * Checks if valid AIOS settings file contents and returns contents as string + * + * @param string $file_contents File contents + * + * @return int|string + */ + public static function check_if_valid_aiowps_settings_content($file_contents) { + // Check a known AIOS config strings to see if it is contained within this file + return !empty($file_contents) && self::check_is_aiowps_settings($file_contents); + } + + /** + * Scans WP key core files and directory permissions and populates a wp wide_fat table + * Displays a red background entry with a "Fix" button for permissions which are "777" + * Displays a yellow background entry with a "Fix" button for permissions which are less secure than the recommended + * Displays a green entry for permissions which are as secure or better than the recommended + * + * @param string $name - file name + * @param string $path - file path + * @param string $recommended - file permission + * + * @return void + */ + public static function show_wp_filesystem_permission_status($name, $path, $recommended) { + $fix = false; + $configmod = self::get_file_permission($path); + if (self::is_file_world_writable($configmod)) { + $trclass = "aio_table_row_red"; // Display a red background if permissions are set as least secure ("777") + $fix = true; + } elseif ($configmod != $recommended) { + // $res = $this->is_file_permission_secure($recommended, $configmod); + $res = self::is_file_permission_secure($recommended, $configmod); + if ($res) { + $trclass = "aio_table_row_green"; //If the current permissions are even tighter than recommended then display a green row + } else { + $trclass = "aio_table_row_yellow"; // Display a yellow background if permissions are set to something different than recommended + $fix = true; + } + } else { + $trclass = "aio_table_row_green"; + } + echo ""; + echo '' . $name . '' . ""; + echo '' . $path . ""; + echo '' . $configmod . ''; + echo '' . $recommended . ''; + if ($fix) { + echo ' + + '; + } else { + echo ''.__('No action required', 'all-in-one-wp-security-and-firewall').''; + } + echo ""; + } + + /** + * Checks if the given file permissions indicate that the file is world-writable. + * + * This function accepts a string representation of file permissions (in octal format) + * and checks if the write bit is set for 'others' (world). It ensures the string + * is 4 characters long by prepending a '0' if necessary and then extracts and + * evaluates the last digit to determine if the file is world-writable. + * + * @param string $permissions The file permissions in octal format (e.g., "0777", "0755"). + * @return bool Returns true if the file is world-writable, otherwise false. + */ + public static function is_file_world_writable($permissions) { + if (strlen($permissions) == 3) { + $permissions = '0' . $permissions; + } + + // Get the 'others' permissions (last digit) + $others_permissions = (int) substr($permissions, -1); + + // Check if the write bit (2) is set for 'others' + return (bool) ($others_permissions & 0x2); + } + + /** + * Read the larger file and get last 100 lines etc in an efficient way + * + * @param string $filepath - file path + * @param integer $offset - offest to start reading the file from that line + * @param integer $num - number of lines to read + * @param boolean $reverse - return in reverse order + * + * @return array|boolean - file lines + */ + public static function read_file_lines($filepath, $offset = 0, $num = 10, $reverse = false) { + global $aio_wp_security; + try { + $file = new \SplFileObject($filepath, 'r'); + if (-1 == $offset) { + $file->seek(PHP_INT_MAX); // PHP_INT_MAX to seeek to last line + $last_line = $file->key(); + $offset = $last_line > $num ? $last_line - $num : 0; + } + $lines = new \LimitIterator($file, $offset, $offset + $num); + $lines_arr = iterator_to_array($lines); + if ($reverse) $lines_arr = array_reverse($lines_arr); + return $lines_arr; + } catch (\Exception $e) { + $aio_wp_security->debug_logger->log_debug("AIOS - Unable to read file: ". $filepath . " - " .$e->getMessage(), 4); + } + return false; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-firewall.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-firewall.php new file mode 100755 index 00000000..9aa6a970 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-firewall.php @@ -0,0 +1,238 @@ +debug_logger->log_debug($exception->getMessage(), 4); + return ''; + } catch (Error $error) { // phpcs:ignore PHPCompatibility.Classes.NewClasses.errorFound -- this won't run on PHP 5.6 so we still want to catch it on other versions + $aio_wp_security->debug_logger->log_debug($error->getMessage(), 4); + return ''; + } + } + } else { + $directive = ini_get('auto_prepend_file'); + if (false !== $directive) { + return $directive; + } + } + + return ''; + } + + /** + * Returns the file that's necessary to load our firewall + * + * @return AIOWPSecurity_Block_File|null file needed to load the firewall + */ + public static function get_server_file() { + $server_type = AIOWPSecurity_Utility::get_server_type(); + $is_cgi = false; + $sapi = PHP_SAPI; + + if (false !== stripos($sapi, 'cgi')) { + $is_cgi = true; + } + + if (AIOWPSecurity_Utility::UNSUPPORTED_SERVER_TYPE === $server_type) { + return self::MANUAL_SETUP; + + } elseif (false === $is_cgi && 'apache' === $server_type) { + $htpath = path_join(AIOWPSecurity_Utility_File::get_home_path(), '.htaccess'); + return new AIOWPSecurity_Block_Htaccess($htpath); + + } elseif ('litespeed' === $server_type || 'litespeed' === $sapi) { + $htpath = path_join(AIOWPSecurity_Utility_File::get_home_path(), '.htaccess'); + return new AIOWPSecurity_Block_Litespeed($htpath); + + } else { + $userini = path_join(AIOWPSecurity_Utility_File::get_home_path(), '.user.ini'); + return new AIOWPSecurity_Block_Userini($userini); + } + + } + + /** + * Checks whether the firewall has been setup + * + * @return boolean + */ + public static function is_firewall_setup() { + $is_in_bootstrap = (true === self::get_bootstrap_file()->contains_contents()); + + $files = array( + self::get_server_file(), + self::get_wpconfig_file(), + self::get_muplugin_file(), + ); + + foreach ($files as $file) { + if (AIOWPSecurity_Utility_Firewall::MANUAL_SETUP === $file) continue; + + if ($is_in_bootstrap && (true === $file->contains_contents())) return true; + } + + return false; + } + + /** + * Attempts to remove our firewall. + * + * @return void + */ + public static function remove_firewall() { + global $aio_wp_security; + + $firewall_files = array( + 'server' => AIOWPSecurity_Utility_Firewall::get_server_file(), + 'bootstrap' => AIOWPSecurity_Utility_Firewall::get_bootstrap_file(), + 'wpconfig' => AIOWPSecurity_Utility_Firewall::get_wpconfig_file(), + 'muplugin' => AIOWPSecurity_Utility_Firewall::get_muplugin_file(), + ); + + foreach ($firewall_files as $file) { + if (AIOWPSecurity_Utility_Firewall::MANUAL_SETUP === $file) { + continue; + } + + if (true === $file->contains_contents()) { + + $removed = $file->remove_contents(); + + if (is_wp_error($removed)) { + $error_message = $removed->get_error_message(); + $error_message .= ' - '; + $error_message .= $removed->get_error_data(); + $aio_wp_security->debug_logger->log_debug($error_message, 4); + } + } + } + + //Delete our mu-plugin, if it's created + clearstatcache(); + $muplugin_path = $firewall_files['muplugin']; + if (file_exists($muplugin_path)) { + @wp_delete_file($muplugin_path); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- ignore this + } + + $aio_wp_security->configs->set_value('aios_firewall_dismiss', false, true); + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-htaccess.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-htaccess.php new file mode 100755 index 00000000..0b6bd5f4 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-htaccess.php @@ -0,0 +1,726 @@ + 1) return false; + } + + return true; + } + + /** + * This function checks if .htaccess file exists and is readable + * + * @param string $htaccess - The path to .htaccess file + * @return boolean + */ + public static function htaccess_exist_and_readable($htaccess) { + global $aio_wp_security; + + if (!file_exists($htaccess)) { + $aio_wp_security->debug_logger->log_debug("The .htaccess file is missing", 4); + return false; + } elseif (!is_readable($htaccess)) { + $aio_wp_security->debug_logger->log_debug("The .htaccess file exists, but it is not readable.", 4); + return false; + } + return true; + } + + /** + * Write all active rules to .htaccess file. + * + * @param boolean $show_error - if the error should be shown + * + * @return boolean True on success, false on failure. + */ + public static function write_to_htaccess($show_error = true) { + global $aio_wp_security; + + if (!class_exists('AIOWPSecurity_Admin_Menu')) { + include_once AIO_WP_SECURITY_PATH . '/admin/wp-security-admin-menu.php'; + } + + // figure out what server is being used + $serverType = AIOWPSecurity_Utility::get_server_type(); + + if (in_array($serverType, array('-1', 'nginx', 'iis')) && !defined('WP_CLI')) { + if ($show_error) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('The .htaccess file is not supported by your web server.', 'all-in-one-wp-security-and-firewall'), !$show_error); + } + $aio_wp_security->debug_logger->log_debug("Unable to write to .htaccess - server type not supported.", 4); + return false; // unable to write to the file + } + + $home_path = AIOWPSecurity_Utility_File::get_home_path(); + $htaccess = $home_path . '.htaccess'; + if (!self::htaccess_exist_and_readable($htaccess)) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('The .htaccess file either does not exist or is unreadable', 'all-in-one-wp-security-and-firewall'), !$show_error); + $aio_wp_security->debug_logger->log_debug("The .htaccess file either does not exist or is unreadable", 4); + return false; + } // check the existence of the file and if its readable + + // confirm the hataccess has valid markers + if (!self::htaccess_has_valid_markers($htaccess)) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('The .htaccess file contains invalid content, please manually verify the file contents', 'all-in-one-wp-security-and-firewall'), !$show_error); + $aio_wp_security->debug_logger->log_debug("Unable to edit the .htaccess file as it contains invalid content, please manually verify the file contents", 4); + return false; + } + + AIOWPSecurity_Utility_File::backup_and_rename_htaccess($htaccess); + + // creating a copy of htaccess file to work on + $temp_htaccess = $home_path.'.htaccess_temp'; + if (!copy($htaccess, $temp_htaccess)) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('A copy of the .htaccess file could not be created', 'all-in-one-wp-security-and-firewall'), !$show_error); + $aio_wp_security->debug_logger->log_debug("Write operation on .htaccess file failed, unable to create a copy of the file", 4); + return false; + } + + // clean up old rules first + if (-1 == AIOWPSecurity_Utility_Htaccess::delete_from_htaccess($temp_htaccess)) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(__("Unable to delete plugin's content from .htaccess file.", 'all-in-one-wp-security-and-firewall'), !$show_error); + $aio_wp_security->debug_logger->log_debug("Unable to delete plugin's content from .htaccess file.", 4); + return false; //unable to write to the file + } + + + $ht = explode("\n", implode('', file($temp_htaccess))); // parse each line of file into array + + $rules = AIOWPSecurity_Utility_Htaccess::getrules(); + + $rulesarray = explode("\n", $rules); + $rulesarray = apply_filters('aiowps_htaccess_rules_before_writing', $rulesarray); + $contents = array_merge($rulesarray, $ht); + + $f = @fopen($temp_htaccess, 'w+'); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- ignore warning as we try to handle it below + if (!$f) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('Write operation on .htaccess failed.', 'all-in-one-wp-security-and-firewall'), !$show_error); + $aio_wp_security->debug_logger->log_debug("Write operation on .htaccess failed.", 4); + return false; //we can't write to the file + } + + $blank = false; + + // write each line to file + foreach ($contents as $insertline) { + if (trim($insertline) == '') { + if (false == $blank) { + fwrite($f, "\n" . trim($insertline)); + } + $blank = true; + } else { + $blank = false; + fwrite($f, "\n" . trim($insertline)); + } + } + if (is_resource($f)) @fclose($f); + + // before writing into the live htaccess confirm the markers still valid + if (!self::htaccess_has_valid_markers($temp_htaccess)) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('The .htaccess file has invalid content, please manually verify that the file is properly formatted', 'all-in-one-wp-security-and-firewall'), !$show_error); + $aio_wp_security->debug_logger->log_debug("The .htaccess file has invalid content, please manually verify that the file is properly formatted", 4); + return false; + } + + // copy the changes from the temp htaccess into the live htaccess from here + if (!copy($temp_htaccess, $htaccess)) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('An error has occurred while writing to the .htaccess file.', 'all-in-one-wp-security-and-firewall'), !$show_error); + $aio_wp_security->debug_logger->log_debug("Failed to write to the .htaccess file", 4); + return false; + } + // Remove the temp htaccess file created + unlink($temp_htaccess); + + return true; //success + } + + /** + * This function will delete the code which has been added to the .htaccess file by this plugin + * It will try to find the comment markers "# BEGIN All In One WP Security" and "# END All In One WP Security" and delete contents in between + * + * @param string $htaccess - The htaccess file path to manipulate + * @param string $section - All in One Security + * @return Integer {-1,1} -1 for failure, 1 for success. + */ + public static function delete_from_htaccess($htaccess = '', $section = 'All In One WP Security') { + + if (empty($htaccess)) { + $home_path = AIOWPSecurity_Utility_File::get_home_path(); + $htaccess = $home_path . '.htaccess'; + } + + if (!file_exists($htaccess)) { + $ht = @fopen($htaccess, 'a+');// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- ignore warning as we try to handle it below + if (false === $ht) { + global $aio_wp_security; + $aio_wp_security->debug_logger->log_debug('Failed to create .htaccess file', 4); + return -1; + } + if (is_resource($ht)) @fclose($ht); + } + + // Bug Fix: On some environments such as windows (xampp) this function was clobbering the non-aiowps-related .htaccess contents for certain cases. + // In some cases when WordPress saves the .htaccess file (eg, when saving permalink settings), + // the line endings differ from the expected "\n" endings. (WordPress saves with "\n" (UNIX style) but "\n" may be set as "\r\n" (WIN/DOS)) + // In this case exploding via "\n" may not yield the result we expect. + // Therefore we need to do the following extra checks. + $ht_contents_imploded = implode('', file($htaccess)); + if (empty($ht_contents_imploded)) { + return 1; + } elseif (strstr($ht_contents_imploded, "\n")) { + $ht_contents = explode("\n", $ht_contents_imploded); //parse each line of file into array + } elseif (strstr($ht_contents_imploded, "\r")) { + $ht_contents = explode("\r", $ht_contents_imploded); //parse each line of file into array + } elseif (strstr($ht_contents_imploded, "\r\n")) { + $ht_contents = explode("\r\n", $ht_contents_imploded); //parse each line of file into array + } + + if ($ht_contents) { //as long as there are lines in the file + $state = true; + $f = @fopen($htaccess, 'w+'); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- ignore warning as we try to handle it below + if (!$f) { + @chmod($htaccess, 0644);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- ignore warning as we try to handle it below + $f = @fopen($htaccess, 'w+'); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- ignore warning as we try to handle it below + if (!$f) return -1; + } + + foreach ($ht_contents as $markerline) { //for each line in the file + if (strpos($markerline, '# BEGIN ' . $section) !== false) { //if we're at the beginning of the section + $state = false; + } + if (true == $state) { //as long as we're not in the section keep writing + fwrite($f, trim($markerline) . "\n"); + } + if (strpos($markerline, '# END ' . $section) !== false) { //see if we're at the end of the section + $state = true; + } + } + if (is_resource($f)) @fclose($f); + return 1; + } + return 1; + } + + public static function getrules() { + global $aio_wp_security; + $rules = ""; + $rules .= AIOWPSecurity_Utility_Htaccess::getrules_basic_htaccess(); + $rules .= AIOWPSecurity_Utility_Htaccess::getrules_block_debug_log_access_htaccess(); + $rules .= AIOWPSecurity_Utility_Htaccess::getrules_disable_index_views(); + $rules .= AIOWPSecurity_Utility_Htaccess::getrules_disable_trace_and_track(); + $rules .= AIOWPSecurity_Utility_Htaccess::getrules_5g_blacklist(); + $rules .= AIOWPSecurity_Utility_Htaccess::prevent_image_hotlinks(); + $custom_rules = AIOWPSecurity_Utility_Htaccess::getrules_custom_rules(); + if ($aio_wp_security->configs->get_value('aiowps_place_custom_rules_at_top')=='1') { + $rules = $custom_rules . $rules; + } else { + $rules .= $custom_rules; + } + + //TODO: The following utility functions are ready to use when we write the menu pages for these features + + //Add more functions for features as needed + //$rules .= AIOWPSecurity_Utility_Htaccess::getrules_somefeature(); + + //Add outer markers if we have rules + if ('' != $rules) { + $rules = "# BEGIN All In One WP Security" . "\n" . $rules . "# END All In One WP Security" . "\n"; + } + + return $rules; + } + + /** + * TODO - info + */ + public static function getrules_basic_htaccess() { + global $aio_wp_security; + + $rules = ''; + if ($aio_wp_security->configs->get_value('aiowps_enable_basic_firewall') == '1') { + $rules .= AIOWPSecurity_Utility_Htaccess::$basic_htaccess_rules_marker_start . "\n"; //Add feature marker start + //protect the htaccess file - this is done by default with apache config file but we are including it here for good measure + $rules .= self::create_apache2_access_denied_rule('.htaccess'); + + //disable the server signature + $rules .= 'ServerSignature Off' . "\n"; + + //limit file upload size + $upload_limit = $aio_wp_security->configs->get_value('aiowps_max_file_upload_size'); + //Shouldn't be empty but just in case + $upload_limit = empty($upload_limit) ? AIOS_FIREWALL_MAX_FILE_UPLOAD_LIMIT_MB : $upload_limit; + $upload_limit = $upload_limit * 1024 * 1024; // Convert from MB to Bytes - approx but close enough + + $rules .= 'LimitRequestBody '.$upload_limit . "\n"; + + // protect wpconfig.php. + $rules .= self::create_apache2_access_denied_rule('wp-config.php'); + + $rules .= AIOWPSecurity_Utility_Htaccess::$basic_htaccess_rules_marker_end . "\n"; //Add feature marker end + } + return $rules; + } + + public static function getrules_block_debug_log_access_htaccess() { + global $aio_wp_security; + + $rules = ''; + if ($aio_wp_security->configs->get_value('aiowps_block_debug_log_file_access') == '1') { + $rules .= AIOWPSecurity_Utility_Htaccess::$debug_log_block_htaccess_rules_marker_start . "\n"; //Add feature marker start + $rules .= self::create_apache2_access_denied_rule('debug.log'); + $rules .= AIOWPSecurity_Utility_Htaccess::$debug_log_block_htaccess_rules_marker_end . "\n"; //Add feature marker end + } + return $rules; + } + + /** + * This function will disable directory listings for all directories, add this line to the + * site’s root .htaccess file. + * NOTE: AllowOverride must be enabled in the httpd.conf file for this to work! + */ + public static function getrules_disable_index_views() { + global $aio_wp_security; + $rules = ''; + if ($aio_wp_security->configs->get_value('aiowps_disable_index_views') == '1') { + $rules .= AIOWPSecurity_Utility_Htaccess::$disable_index_views_marker_start . "\n"; //Add feature marker start + $rules .= 'Options -Indexes' . "\n"; + $rules .= AIOWPSecurity_Utility_Htaccess::$disable_index_views_marker_end . "\n"; //Add feature marker end + } + + return $rules; + } + + /** + * This function will write rules to disable trace and track. + * HTTP Trace attack (XST) can be used to return header requests + * and grab cookies and other information and is used along with + * a cross site scripting attacks (XSS) + */ + public static function getrules_disable_trace_and_track() { + global $aio_wp_security; + $rules = ''; + if ($aio_wp_security->configs->get_value('aiowps_disable_trace_and_track') == '1') { + $rules .= AIOWPSecurity_Utility_Htaccess::$disable_trace_track_marker_start . "\n"; //Add feature marker start + $rules .= '' . "\n"; + $rules .= 'RewriteEngine On' . "\n"; + $rules .= 'RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)' . "\n"; + $rules .= 'RewriteRule .* - [F]' . "\n"; + $rules .= '' . "\n"; + $rules .= AIOWPSecurity_Utility_Htaccess::$disable_trace_track_marker_end . "\n"; //Add feature marker end + } + + return $rules; + } + + + /** + * This function contains the rules for the 5G blacklist produced by Jeff Starr from perishablepress.com + * NOTE: Since Jeff regularly updates and evolves his blacklist rules, ie, 5G->6G->7G.... we will update this function to reflect the latest blacklist release + */ + public static function getrules_5g_blacklist() { + global $aio_wp_security; + $rules = ''; + if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_5g_firewall')) { + $rules .= AIOWPSecurity_Utility_Htaccess::$five_g_blacklist_marker_start . "\n"; //Add feature marker start + + $rules .= '# 5G BLACKLIST/FIREWALL (2013) + # @ http://perishablepress.com/5g-blacklist-2013/ + + # 5G:[QUERY STRINGS] + + RewriteEngine On + RewriteBase / + RewriteCond %{QUERY_STRING} (\"|%22).*(<|>|%3) [NC,OR] + RewriteCond %{QUERY_STRING} (javascript:).*(\;) [NC,OR] + RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3) [NC,OR] + RewriteCond %{QUERY_STRING} (\\\|\.\./|`|=\'$|=%27$) [NC,OR] + RewriteCond %{QUERY_STRING} (\;|\'|\"|%22).*(union|select|insert|drop|update|md5|benchmark|or|and|if) [NC,OR] + RewriteCond %{QUERY_STRING} (base64_encode|localhost|mosconfig) [NC,OR] + RewriteCond %{QUERY_STRING} (boot\.ini|echo.*kae|etc/passwd) [NC,OR] + RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|\[|%) [NC] + RewriteRule .* - [F] + + + # 5G:[USER AGENTS] + + # SetEnvIfNoCase User-Agent ^$ keep_out + SetEnvIfNoCase User-Agent (binlar|casper|cmsworldmap|comodo|diavol|dotbot|feedfinder|flicky|ia_archiver|jakarta|kmccrew|nutch|planetwork|purebot|pycurl|skygrid|sucker|turnit|vikspider|zmeu) keep_out + + Order Allow,Deny + Allow from all + Deny from env=keep_out + + + + # 5G:[REQUEST STRINGS] + + RedirectMatch 403 (https?|ftp|php)\:// + RedirectMatch 403 /(https?|ima|ucp)/ + RedirectMatch 403 /(Permanent|Better)$ + RedirectMatch 403 (\=\\\\\\\'|\=\\\%27|/\\\\\\\'/?|\)\.css\()$ + RedirectMatch 403 (\,|\)\+|/\,/|\{0\}|\(/\(|\.\.\.|\+\+\+|\||\\\\\"\\\\\") + RedirectMatch 403 \.(cgi|asp|aspx|cfg|dll|exe|jsp|mdb|sql|ini|rar)$ + RedirectMatch 403 /(contac|fpw|install|pingserver|register)\.php$ + RedirectMatch 403 (base64|crossdomain|localhost|wwwroot|e107\_) + RedirectMatch 403 (eval\(|\_vti\_|\(null\)|echo.*kae|config\.xml) + RedirectMatch 403 \.well\-known/host\-meta + RedirectMatch 403 /function\.array\-rand + RedirectMatch 403 \)\;\$\(this\)\.html\( + RedirectMatch 403 proc/self/environ + RedirectMatch 403 msnbot\.htm\)\.\_ + RedirectMatch 403 /ref\.outcontrol + RedirectMatch 403 com\_cropimage + RedirectMatch 403 indonesia\.htm + RedirectMatch 403 \{\$itemURL\} + RedirectMatch 403 function\(\) + RedirectMatch 403 labels\.rdf + RedirectMatch 403 /playing.php + RedirectMatch 403 muieblackcat + + + # 5G:[REQUEST METHOD] + + RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) + RewriteRule .* - [F] + ' . "\n"; + $rules .= AIOWPSecurity_Utility_Htaccess::$five_g_blacklist_marker_end . "\n"; //Add feature marker end + } + + return $rules; + } + + /** + * This function will write some directives to prevent image hotlinking + */ + public static function prevent_image_hotlinks() { + global $aio_wp_security; + $rules = ''; + if ($aio_wp_security->configs->get_value('aiowps_prevent_hotlinking') == '1') { + $url_string = AIOWPSecurity_Utility_Htaccess::return_regularized_url(AIOWPSEC_WP_HOME_URL); + if (false == $url_string) { + $url_string = AIOWPSEC_WP_HOME_URL; + } + $rules .= AIOWPSecurity_Utility_Htaccess::$prevent_image_hotlinks_marker_start . "\n"; //Add feature marker start + $rules .= '' . "\n"; + $rules .= 'RewriteEngine On' . "\n"; + $rules .= 'RewriteCond %{HTTP_REFERER} !^$' . "\n"; + $rules .= 'RewriteCond %{REQUEST_FILENAME} -f' . "\n"; + $rules .= 'RewriteCond %{REQUEST_FILENAME} \.(gif|jpe?g?|png)$ [NC]' . "\n"; + $rules .= 'RewriteCond %{HTTP_REFERER} !^' . $url_string . ' [NC]' . "\n"; + $rules .= 'RewriteRule \.(gif|jpe?g?|png)$ - [F,NC,L]' . "\n"; + $rules .= '' . "\n"; + $rules .= AIOWPSecurity_Utility_Htaccess::$prevent_image_hotlinks_marker_end . "\n"; //Add feature marker end + } + + return $rules; + } + + /** + * This function will write any custom htaccess rules into the server's .htaccess file + * + * @return string + */ + public static function getrules_custom_rules() { + global $aio_wp_security; + $rules = ''; + if ($aio_wp_security->configs->get_value('aiowps_enable_custom_rules') == '1') { + $custom_rules = $aio_wp_security->configs->get_value('aiowps_custom_rules'); + $rules .= AIOWPSecurity_Utility_Htaccess::$custom_rules_marker_start . "\n"; //Add feature marker start + $rules .= $custom_rules . "\n"; + $rules .= AIOWPSecurity_Utility_Htaccess::$custom_rules_marker_end . "\n"; //Add feature marker end + } + + return $rules; + } + + /** + * This function will do a quick check to see if a file's contents are actually .htaccess specific. + * At the moment it will look for the following tag somewhere in the file - "# BEGIN WordPress" + * If it finds the tag it will deem the file as being .htaccess specific. + * This was written to supplement the .htaccess restore functionality + * + * @param string $file_contents - the contents of the .htaccess file + * + * @return boolean + */ + public static function check_if_htaccess_contents($file_contents) { + $is_htaccess = false; + + if (false === $file_contents || strlen($file_contents) == 0) { + return -1; + } + + if ((strpos($file_contents, '# BEGIN WordPress') !== false) || (strpos($file_contents, '# BEGIN') !== false)) { + $is_htaccess = true; // It appears that we have some sort of .htaccess file + } else { + //see if we're at the end of the section + $is_htaccess = false; + } + + if ($is_htaccess) { + return 1; + } else { + return -1; + } + } + + /** + * This function will take a URL string and convert it to a form useful for using in htaccess rules. + * Example: If URL passed to function = "http://www.mysite.com" + * Result = "http(s)?://(.*)?mysite\.com" + * + * @param string $url + * @return string + */ + public static function return_regularized_url($url) { + if (filter_var($url, FILTER_VALIDATE_URL)) { + $xyz = explode('.', $url); + $y = ''; + if (count($xyz) > 1) { + $j = 1; + foreach ($xyz as $x) { + if (strpos($x, 'www') !== false) { + $y .= str_replace('www', '(.*)?', $x); + } elseif (1 == $j) { + $y .= $x; + } elseif ($j > 1) { + $y .= '\.' . $x; + } + $j++; + } + //Now replace the "http" with "http(s)?" to cover both secure and non-secure + if (strpos($y, 'https') !== false) { + $y = str_replace('https', 'http(s)?', $y); + } elseif (strpos($y, 'http') !== false) { + $y = str_replace('http', 'http(s)?', $y); + } + return $y; + } else { + return $url; + } + } else { + return false; + } + } + + /** + * Returns a string with directive that contains rules + * to effectively block access to any file that has basename matching + * $filename under Apache webserver. + * + * @link http://httpd.apache.org/docs/current/mod/core.html#files + * + * @param string $filename + * @return string + */ + protected static function create_apache2_access_denied_rule($filename) { + return << + + Require all denied + + + Order deny,allow + Deny from all + + + +END; + // Keep the empty line at the end of heredoc string, + // otherwise the string will not end with end-of-line character! + } + + + /** + * Convert an array of optionally asterisk-masked or partial IPv4 addresses + * into network/netmask notation. Netmask value for a "full" IP is not + * added (see example below) + * + * Example: + * In: array('1.2.3.4', '5.6', '7.8.9.*') + * Out: array('1.2.3.4', '5.6.0.0/16', '7.8.9.0/24') + * + * Simple validation is performed: + * In: array('1.2.3.4.5', 'abc', '1.2.xyz.4') + * Out: array() + * + * Simple sanitization is performed: + * In: array('6.7.*.9') + * Out: array('6.7.0.0/16') + * + * @param array $ips + * @return array + */ + protected static function add_netmask($ips = array()) { + + $output = array(); + if (empty($ips)) return array(); + foreach ($ips as $ip) { + //Check if ipv6 + if (strpos($ip, ':') !== false) { + //for now support whole ipv6 and CIDR range. + $checked_ip = AIOWPSecurity_Utility_IP::is_ipv6_address_or_ipv6_range($ip); + if (false != $checked_ip) { + $output[] = $ip; + } + } + + $parts = explode('.', $ip); + + // Skip any IP that is empty, has more parts than expected or has + // a non-numeric first part. + if (empty($parts) || (count($parts) > 4) || !is_numeric($parts[0])) { + continue; + } + + $ip_out = array($parts[0]); + $netmask = 8; + + for ($i = 1, $force_zero = false; ($i < 4) && $ip_out; $i++) { + if ($force_zero || !isset($parts[$i]) || ('' === $parts[$i]) || ('*' === $parts[$i])) { + $ip_out[$i] = '0'; + $force_zero = true; // Forces all subsequent parts to be a zero + } elseif (is_numeric($parts[$i])) { + $ip_out[$i] = $parts[$i]; + $netmask += 8; + } else { + // Invalid IP part detected, invalidate entire IP + $ip_out = false; + } + } + + if ($ip_out) { + // Glue IP back together, add netmask if IP denotes a subnet, store for output. + $output[] = implode('.', $ip_out) . (($netmask < 32) ? ('/' . $netmask) : ''); + } + } + + return $output; + } + + public static function get_htaccess_path() { + $home_path = AIOWPSecurity_Utility_File::get_home_path(); + return $home_path . '.htaccess'; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-ip-address.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-ip-address.php new file mode 100755 index 00000000..26418dd4 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-ip-address.php @@ -0,0 +1,220 @@ +debug_logger->log_debug("AIOWPSecurity_Utility_IP - Invalid IP received ".$ip, 4); + } + return $ip_range; + } + + + public static function create_ip_list_array_from_string_with_newline($ip_addresses) { + $ip_list_array = preg_split("/\R/", $ip_addresses); + return $ip_list_array; + } + + /** + * Returns IPv6 ip address or IPv6 range if valid + * + * @param string $item possible IPv6 ip address or IPv6 range + * @return string|boolean $checked_ip trimmed IPv6 ip address or IPv6 range if given input is valid otherwise false. + */ + public static function is_ipv6_address_or_ipv6_range($item) { + $checked_ip = false; + $res = WP_Http::is_ip_address($item); + if ('6' == $res && class_exists('WpOrg\Requests\Ipv6') && WpOrg\Requests\Ipv6::check_ipv6($item)) { + $checked_ip = trim($item); + } elseif ('6' == $res && class_exists('Requests_IPv6') && Requests_IPv6::check_ipv6($item)) { + $checked_ip = trim($item); + } else { + //ipv6 - range check for valid CIDR range + $item_ip_range = explode('/', $item); + $ip_part_valid = filter_var($item_ip_range[0], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6); + //1 - 164 range of the IPv6 subnect masking as per CISCO propersed change from 128. + if (2 == count($item_ip_range) && $ip_part_valid && $item_ip_range[1] >= 1 && $item_ip_range[1] <= 164) { + $checked_ip = trim($item); + } + } + return $checked_ip; + } + + /** + * Validates IP or IP range + * + * @param array $ip_list_array + * @param string $list_type + * @return array|WP_Error + */ + public static function validate_ip_list($ip_list_array, $list_type = '') { + $errors = ''; + + $current_user_ip = AIOWPSecurity_Utility_IP::get_user_ip_address(); + + //validate list + $submitted_ips = $ip_list_array; + $list = array(); + if (!(include_once AIO_WP_SECURITY_PATH.'/vendor/mlocati/ip-lib/ip-lib.php')) { + throw new \Exception("AIOWPSecurity_Utility_IP::validate_ip_list failed to load ip-lib.php"); + } + + if (!empty($submitted_ips)) { + foreach ($submitted_ips as $item) { + $item = sanitize_text_field($item); + + // Skip items that are comments (start with #) + if (strpos($item, '#') === 0) { + $list[] = trim($item); + continue; + } + + if (strlen($item) > 0) { + $ip_address = \IPLib\Factory::addressFromString($item); + $ip_address_range = \IPLib\Factory::rangeFromString($item); + if (null == $ip_address && null == $ip_address_range) { + /* translators: %s: IP Address */ + $errors .= "\n" . sprintf(__('%s is not a valid IP address format.', 'all-in-one-wp-security-and-firewall'), $item); + } + + if (strlen($item) > 4 && !in_array($item, $list)) { + if ($item == $current_user_ip && 'blacklist' == $list_type) { + //You can't ban your own IP + $errors .= "\n".__('You cannot ban your own IP address:', 'all-in-one-wp-security-and-firewall') . ' ' . $item; + } else { + $list[] = trim($item); + } + } + } + } + } else { + //This function was called with an empty IP address array list + } + + if (strlen($errors) > 0) { + return new WP_Error('invalid_ips', trim($errors)); + } + + if (sizeof($list) >= 1) return array_unique($list, SORT_STRING); + + return array(); + } + + /** + * If login whitelist enabled and the user IP is not whitelisted, Then forbid access. + * + * @return void + */ + public static function check_login_whitelist_and_forbid() { + if (defined('AIOS_DISABLE_LOGIN_WHITELIST') && AIOS_DISABLE_LOGIN_WHITELIST) { + return; + } + + global $aio_wp_security; + + if ('1' != $aio_wp_security->configs->get_value('aiowps_enable_whitelisting')) { + return; + } + + $whitelisted_ips = $aio_wp_security->configs->get_value('aiowps_allowed_ip_addresses'); + $is_whitelisted = AIOWPSecurity_Utility_IP::is_userip_whitelisted($whitelisted_ips); + + if ($is_whitelisted) { + return; + } + + header('HTTP/1.1 403 Forbidden'); + exit(); + } + + /** + * Checks if user IP address matches against the specified whitelist of IP addresses or IP ranges + * + * @param type $whitelisted_ips (newline separated string of IPs) + * @return boolean + */ + public static function is_userip_whitelisted($whitelisted_ips) { + if (empty($whitelisted_ips)) return false; + + $ip_list_array = AIOWPSecurity_Utility_IP::create_ip_list_array_from_string_with_newline($whitelisted_ips); + if (empty($ip_list_array)) return false; + + return AIOS_Helper::is_user_ip_address_within_list($ip_list_array); + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-permissions.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-permissions.php new file mode 100755 index 00000000..a198848b --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-permissions.php @@ -0,0 +1,65 @@ +role_names as $id => $name) { + $user_roles[$id] = translate_user_role($name); + } + return $user_roles; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-ui.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-ui.php new file mode 100755 index 00000000..de7d361f --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility-ui.php @@ -0,0 +1,129 @@ + $value) { + $other_attributes .= $attribute . '="' . esc_attr($value) . '" '; + } + } + ?> + + + + + + +
+ + include_template('info/ip-address-ip-range-info.php'); ?> + + '; + + // Check if an array is multidimensional + $is_multi_dimensional = function($array) { + if (!is_array($array)) { + return false; + } + foreach ($array as $item) { + if (is_array($item)) { + return true; + } + } + return false; + }; + + // Check if the input data is a multidimensional array + if ($is_multi_dimensional($data)) { + // Add table headers based on the keys of the first array element + $table_html .= ''; + foreach (array_keys($data[0]) as $header) { + $table_html .= '' . esc_html($header) . ''; + } + $table_html .= ''; + + // Recursively format the multidimensional array + $table_html .= self::format_data_recursive($data); + } else { + // If the input data is not a multidimensional array, treat it as a single key-value pair + $table_html .= self::format_data_recursive(array($data)); + } + + $table_html .= ''; + + return $table_html; + } + + /** + * Recursively format data as a table + * + * @param array $data Data to be formatted + * + * @return string Formatted data as a table + */ + private static function format_data_recursive($data) { + $html = ''; + foreach ($data as $key => $value) { + if (is_array($value)) { + // If the value is an array, recursively format it + $html .= self::format_data_recursive($value); + } else { + // If the value is not an array, format it as a table row + $escaped_key = esc_html($key); + $escaped_value = esc_html($value); + $html .= '' . $escaped_key . '' . $escaped_value . ''; + } + } + return $html; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility.php new file mode 100755 index 00000000..7a1a9837 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-utility.php @@ -0,0 +1,1578 @@ +Error! The URL value is empty. Please specify a correct URL value to redirect to!"; + exit; + } + if (!headers_sent()) { + header('Location: ' . $url); + } else { + echo ''; + } + if ('1' == $exit) { + exit; + } + } + + /** + * Checks if a particular username exists in the WP Users table + * + * @global type $wpdb + * @param type $username + * @return boolean + */ + public static function check_user_exists($username) { + global $wpdb; + + //if username is empty just return false + if ('' == $username) { + return false; + } + + //If multisite + if (is_multisite()) { + $blog_id = get_current_blog_id(); + $admin_users = get_users('blog_id=' . $blog_id . '&orderby=login&role=administrator'); + foreach ($admin_users as $user) { + if ($user->user_login == $username) { + return true; + } + } + return false; + } + + //check users table + $sanitized_username = sanitize_user($username); + // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- PCP warning. Direct query required + $user_login = $wpdb->get_var( + $wpdb->prepare("SELECT user_login FROM $wpdb->users WHERE user_login=%s", $sanitized_username) + ); + + if ($user_login == $sanitized_username) { + return true; + } else { + //make sure that the sanitized username is an integer before comparing it to the users table's ID column + $sanitized_username_is_an_integer = (1 === preg_match('/^\d+$/', $sanitized_username)); + if ($sanitized_username_is_an_integer) { + // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- PCP warning. Direct query required + $userid = $wpdb->get_var( + $wpdb->prepare("SELECT ID FROM $wpdb->users WHERE ID=%d", intval($sanitized_username)) + ); + return ($userid == $sanitized_username); + } else { + return false; + } + } + } + + /** + * This function will return a list of user accounts which have login and nick names which are identical + * + * @global type $wpdb + * @return type + */ + public static function check_identical_login_and_nick_names() { + global $wpdb; + // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- PCP warning. Direct query required. + $accounts_found = $wpdb->get_results("SELECT ID,user_login FROM `" . $wpdb->users . "` WHERE user_login<=>display_name;", ARRAY_A); + return $accounts_found; + } + + + public static function add_query_data_to_url($url, $name, $value) { + if (strpos($url, '?') === false) { + $url .= '?'; + } else { + $url .= '&'; + } + $url .= $name . '=' . urlencode($value); + return $url; + } + + + /** + * Generates a random alpha-numeric number + * + * @param type $string_length + * @return string + */ + public static function generate_alpha_numeric_random_string($string_length) { + //Characters present in table prefix + $allowed_chars = 'abcdefghijklmnopqrstuvwxyz0123456789'; + $string = ''; + //Generate random string + for ($i = 0; $i < $string_length; $i++) { + $string .= $allowed_chars[wp_rand(0, strlen($allowed_chars) - 1)]; + } + return $string; + } + + + /** + * Generates a random string using a-z characters + * + * @param type $string_length + * @return string + */ + public static function generate_alpha_random_string($string_length) { + //Characters present in table prefix + $allowed_chars = 'abcdefghijklmnopqrstuvwxyz'; + $string = ''; + //Generate random string + for ($i = 0; $i < $string_length; $i++) { + $string .= $allowed_chars[wp_rand(0, strlen($allowed_chars) - 1)]; + } + return $string; + } + + /** + * Sets cookie + * + * @param type $cookie_name + * @param type $cookie_value + * @param type $expiry_seconds + * @param type $path + * @param string $cookie_domain + */ + public static function set_cookie_value($cookie_name, $cookie_value, $expiry_seconds = 86400, $path = '/', $cookie_domain = '') { + $expiry_time = time() + intval($expiry_seconds); + if (empty($cookie_domain)) { + $cookie_domain = COOKIE_DOMAIN; + } + return setcookie($cookie_name, $cookie_value, $expiry_time, $path, $cookie_domain, is_ssl(), true); + } + + /** + * Get brute force secret cookie name. + * + * @return String Brute force secret cookie name. + */ + public static function get_brute_force_secret_cookie_name() { + return 'aios_brute_force_secret_' . COOKIEHASH; + } + + /** + * Gets cookie + * + * @param type $cookie_name + * @return string + */ + public static function get_cookie_value($cookie_name) { + if (isset($_COOKIE[$cookie_name])) { + return sanitize_text_field(wp_unslash($_COOKIE[$cookie_name])); + } + return ""; + } + + /** + * Checks if installation is multisite or not. + * + * @return Boolean True if the site is network multisite, false otherwise. + */ + public static function is_multisite_install() { + return function_exists('is_multisite') && is_multisite(); + } + + /** + * This is a general yellow box message for when we want to suppress a feature's config items on multisite because current user is not super admin. + * + * @return void + */ + public static function display_multisite_super_admin_message() { + echo '
'; + echo '

' . esc_html__('The plugin has detected that you are using a Multi-Site WordPress installation.', 'all-in-one-wp-security-and-firewall') . '

+

' . esc_html__('Some features on this page can only be configured by the "superadmin".', 'all-in-one-wp-security-and-firewall') . '

'; + echo '
'; + } + + /** + * Modifies the wp-config.php file to disable PHP file editing from the admin panel + * This function will add the following code: + * define('DISALLOW_FILE_EDIT', false); + * + * NOTE: This function will firstly check if the above code already exists + * and it will modify the bool value, otherwise it will insert the code mentioned above + * + * @global type $aio_wp_security + * @return boolean + */ + public static function disable_file_edits() { + global $aio_wp_security; + $edit_file_config_entry_exists = false; + + //Config file path + $config_file = AIOWPSecurity_Utility_File::get_wp_config_file_path(); + + //Get wp-config.php file contents so we can check if the "DISALLOW_FILE_EDIT" variable already exists + $config_contents = file($config_file); + + foreach ($config_contents as $line_num => $line) { + if (strpos($line, "'DISALLOW_FILE_EDIT', false")) { + $config_contents[$line_num] = str_replace('false', 'true', $line); + $edit_file_config_entry_exists = true; + //$this->show_msg_updated(__('Settings Saved - The ability to edit PHP files via the admin the panel has been DISABLED.', 'all-in-one-wp-security-and-firewall')); + } elseif (strpos($line, "'DISALLOW_FILE_EDIT', true")) { + $edit_file_config_entry_exists = true; + //$this->show_msg_updated(__('Your system config file is already configured to disallow PHP file editing.', 'all-in-one-wp-security-and-firewall')); + return true; + + } + + //For wp-config.php files originating from early WP versions we will remove the closing php tag + if (strpos($line, "?>") !== false) { + $config_contents[$line_num] = str_replace("?>", "", $line); + } + } + + if (!$edit_file_config_entry_exists) { + //Construct the config code which we will insert into wp-config.php + $new_snippet = '//Disable File Edits' . PHP_EOL; + $new_snippet .= 'if (!defined(\'DISALLOW_FILE_EDIT\')) { define(\'DISALLOW_FILE_EDIT\', true); }'; + $config_contents[] = $new_snippet; //Append the new snippet to the end of the array + } + + //Make a backup of the config file + if (!AIOWPSecurity_Utility_File::backup_and_rename_wp_config($config_file)) { + AIOWPSecurity_Admin_Menu::show_msg_error_st(__('Failed to make a backup of the wp-config.php file.', 'all-in-one-wp-security-and-firewall') . ' ' . __('This operation will not go ahead.', 'all-in-one-wp-security-and-firewall')); + //$aio_wp_security->debug_logger->log_debug("Disable PHP File Edit - Failed to make a backup of the wp-config.php file.",4); + return false; + } else { + //$this->show_msg_updated(__('A backup copy of your wp-config.php file was created successfully....', 'all-in-one-wp-security-and-firewall')); + } + + //Now let's modify the wp-config.php file + if (AIOWPSecurity_Utility_File::write_content_to_file($config_file, $config_contents)) { + //$this->show_msg_updated(__('Settings Saved - Your system is now configured to not allow PHP file editing.', 'all-in-one-wp-security-and-firewall')); + return true; + } else { + //$this->show_msg_error(__('Operation failed! Unable to modify wp-config.php file!', 'all-in-one-wp-security-and-firewall')); + $aio_wp_security->debug_logger->log_debug("Disable PHP File Edit - Unable to modify wp-config.php", 4); + return false; + } + } + + /** + * Modifies the wp-config.php file to allow PHP file editing from the admin panel + * This func will modify the following code by replacing "true" with "false": + * define('DISALLOW_FILE_EDIT', true); + * + * @global type $aio_wp_security + * @return boolean + */ + public static function enable_file_edits() { + $edit_file_config_entry_exists = false; + + //Config file path + $config_file = AIOWPSecurity_Utility_File::get_wp_config_file_path(); + + //Get wp-config.php file contents + $config_contents = file($config_file); + foreach ($config_contents as $line_num => $line) { + if (strpos($line, "'DISALLOW_FILE_EDIT', true")) { + $config_contents[$line_num] = str_replace('true', 'false', $line); + $edit_file_config_entry_exists = true; + } elseif (strpos($line, "'DISALLOW_FILE_EDIT', false")) { + $edit_file_config_entry_exists = true; + //$this->show_msg_updated(__('Your system config file is already configured to allow PHP file editing.', 'all-in-one-wp-security-and-firewall')); + return true; + } + } + + if (!$edit_file_config_entry_exists) { + //if the DISALLOW_FILE_EDIT settings don't exist in wp-config.php then we don't need to do anything + //$this->show_msg_updated(__('Your system config file is already configured to allow PHP file editing.', 'all-in-one-wp-security-and-firewall')); + return true; + } else { + //Now let's modify the wp-config.php file + if (AIOWPSecurity_Utility_File::write_content_to_file($config_file, $config_contents)) { + //$this->show_msg_updated(__('Settings Saved - Your system is now configured to allow PHP file editing.', 'all-in-one-wp-security-and-firewall')); + return true; + } else { + //$this->show_msg_error(__('Operation failed! Unable to modify wp-config.php file!', 'all-in-one-wp-security-and-firewall')); + //$aio_wp_security->debug_logger->log_debug("Disable PHP File Edit - Unable to modify wp-config.php",4); + return false; + } + } + } + + + /** + * Inserts event logs to the database + * For now we are using for 404 events but in future will expand for other events + * Event types: 404 (...add more as we expand this) + * + * @param string $event_type :Event type, eg, 404 (see below for list of event types) + * @param string $username (optional): username + * @return bool + */ + public static function event_logger($event_type, $username = '') { + global $wpdb, $aio_wp_security; + + //Some initialising + $url = ''; + $referer_info = ''; + + $events_table_name = AIOWPSEC_TBL_EVENTS; + + $ip_or_host = AIOWPSecurity_Utility_IP::get_user_ip_address(); //Get the IP address of user + $username = sanitize_user($username); + $user = get_user_by('login', $username); //Returns WP_User object if exists + if ($user) { + //If valid user set variables for DB storage later on + $user_id = (absint($user->ID) > 0) ? $user->ID : 0; + } else { + //If the login attempt was made using a non-existent user then let's set user_id to blank and record the attempted user login name for DB storage later on + $user_id = 0; + } + + if ('404' == $event_type || 'spam_discard' == $event_type) { + //if 404 event get some relevant data + $url = isset($_SERVER['REQUEST_URI']) ? sanitize_text_field(wp_unslash($_SERVER['REQUEST_URI'])) : ''; + $referer_info = isset($_SERVER['HTTP_REFERER']) ? sanitize_text_field(wp_unslash($_SERVER['HTTP_REFERER'])) : ''; + } + + $current_time = current_time('mysql', true); + $data = array( + 'event_type' => $event_type, + 'username' => $username, + 'user_id' => $user_id, + 'event_date' => $current_time, + 'ip_or_host' => $ip_or_host, + 'referer_info' => $referer_info, + 'url' => $url, + 'event_data' => '', + ); + + $data = apply_filters('aiowps_filter_event_logger_data', $data); + //log to database + $country_code = isset($data['country_code']) ? $data['country_code'] : ''; + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- PCP error. irect query required. Table name cannot be prepared pre WP 6.2. + $sql = $wpdb->prepare("INSERT INTO ".$events_table_name." (event_type, username, user_id, event_date, ip_or_host, referer_info, url, event_data, country_code, created) VALUES (%s, %s, %d, %s, %s, %s, %s, %s, %s, UNIX_TIMESTAMP())", $data['event_type'], $data['username'], $data['user_id'], $data['event_date'], $data['ip_or_host'], $data['referer_info'], $data['url'], $data['event_data'], $country_code); + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.NotPrepared -- PCP warning. Query prepared above. + $result = $wpdb->query($sql); + if (false === $result) { + $aio_wp_security->debug_logger->log_debug("event_logger: Error inserting record into " . $events_table_name, 4);//Log the highly unlikely event of DB error + return false; + } + return true; + } + + /** + * Checks if an IP address is locked. + * + * @param string $ip The IP address to be checked. + * @param string $lock_reason Optional. Defaults to any lockout reason if not provided. + * + * @return bool True if locked, false otherwise. + **/ + public static function check_locked_ip($ip, $lock_reason = null) { + global $wpdb; + $login_lockdown_table = AIOWPSEC_TBL_LOGIN_LOCKOUT; + + if (null === $lock_reason) { + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $locked_ip = $wpdb->get_row($wpdb->prepare("SELECT * FROM `$login_lockdown_table` WHERE released > UNIX_TIMESTAMP() AND failed_login_ip = %s", $ip), ARRAY_A); + } else { + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $locked_ip = $wpdb->get_row($wpdb->prepare("SELECT * FROM `$login_lockdown_table` WHERE released > UNIX_TIMESTAMP() AND failed_login_ip = %s AND lock_reason = %s", $ip, $lock_reason), ARRAY_A); + } + + return null != $locked_ip; + } + + /** + * Check if an IP address is blacklisted. + * + * @param string $ip The IP address to check. + * @return bool True if the IP address is blacklisted, false otherwise. + */ + public static function check_blacklist_ip($ip) { + global $aio_wp_security; + $blacklisted_ips = $aio_wp_security->configs->get_value('aiowps_banned_ip_addresses'); + $blacklisted_ips_array = explode("\n", $blacklisted_ips); + if (in_array($ip, $blacklisted_ips_array)) { + return true; + } else { + return false; + } + } + + /** + * Returns list of IP addresses locked out + * + * @global type $wpdb + * @return array of addresses found or false otherwise + */ + public static function get_locked_ips() { + global $wpdb; + $login_lockdown_table = AIOWPSEC_TBL_LOGIN_LOCKOUT; + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $locked_ips = $wpdb->get_results("SELECT * FROM $login_lockdown_table WHERE released > UNIX_TIMESTAMP()", ARRAY_A); + if (empty($locked_ips)) { + return false; + } else { + return $locked_ips; + } + } + + + /** + * Locks an IP address - Adds an entry to the AIOWPSEC_TBL_LOGIN_LOCKOUT table. + * + * @global wpdb $wpdb + * @global AIO_WP_Security $aio_wp_security + * + * @param String $ip + * @param String $lock_reason + * @param String $username + * + * @return Void + */ + public static function lock_ip($ip, $lock_reason, $username = '') { + global $wpdb, $aio_wp_security; + $login_lockdown_table = AIOWPSEC_TBL_LOGIN_LOCKOUT; + + if ('404' == $lock_reason) { + + // Query for existing lockouts record with that ip and 404 reason. + $existing_lock_query = $wpdb->prepare( + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- PCP warning. Direct query required. Table name cannot be prepared pre WP 6.2. + "SELECT * FROM {$login_lockdown_table} WHERE failed_login_IP = %s AND lock_reason = %s AND released > UNIX_TIMESTAMP() LIMIT 1", + $ip, + $lock_reason + ); + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.NotPrepared -- PCP warning. Prepared above. + $existing_lock_count = $wpdb->get_var($existing_lock_query); + + if ($existing_lock_count) return; // IP is already blocked for '404', return. + + $lock_minutes = $aio_wp_security->configs->get_value('aiowps_404_lockout_time_length'); + } elseif ('audit-log' == $lock_reason) { + $lock_minutes = 24 * 60; + } else { + $lock_minutes = $aio_wp_security->user_login_obj->get_dynamic_lockout_time_length(); + } + + $username = sanitize_user($username); + $user = get_user_by('login', $username); //Returns WP_User object if exists + + if (false == $user) { + // Not logged in. + $username = ''; + $user_id = 0; + } else { + // Logged in. + $username = sanitize_user($user->user_login); + $user_id = $user->ID; + } + + $ip = esc_sql($ip); + + $lock_seconds = $lock_minutes * MINUTE_IN_SECONDS; + $lock_time = current_time('mysql', true); + $ip_lookup_result = AIOS_Helper::get_ip_reverse_lookup($ip); + $ip_lookup_result = wp_json_encode($ip_lookup_result); + if (false === $ip_lookup_result) $ip_lookup_result = null; + + $release_time = gmdate('Y-m-d H:i:s', time() + ($lock_seconds)); + $data = array( + 'user_id' => $user_id, + 'user_login' => $username, + 'lockdown_date' => $lock_time, + 'release_date' => $release_time, + 'failed_login_IP' => $ip, + 'lock_reason' => $lock_reason, + 'lock_seconds' => $lock_seconds, + 'ip_lookup_result' => $ip_lookup_result + ); + + $result = AIOWPSecurity_Utility::add_lockout($data); + + if (false === $result) { + $error_msg = empty($wpdb->last_error) ? "lock_ip: Error inserting record into " . $login_lockdown_table : $wpdb->last_error; + $aio_wp_security->debug_logger->log_debug($error_msg, 4);//Log the highly unlikely event of DB error + } + } + + /** + * Adds an entry to the AIOWPSEC_TBL_LOGIN_LOCKOUT table. + * + * @global wpdb $wpdb + * + * @param Array $data + * + * @return Boolean + */ + public static function add_lockout($data) { + global $wpdb; + if (!isset($data['is_lockout_email_sent'])) $data['is_lockout_email_sent'] = 0; + if (!isset($data['backtrace_log'])) $data['backtrace_log'] = ''; + if (!isset($data['ip_lookup_result'])) $data['ip_lookup_result'] = ''; + $login_lockdown_table = AIOWPSEC_TBL_LOGIN_LOCKOUT; + // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.QuotedSimplePlaceholder, WordPress.DB.PreparedSQL.NotPrepared -- PCP error. Direct query required. Table name cannot be prepared pre WP 6.2. + $sql = $wpdb->prepare("INSERT INTO ".$login_lockdown_table." (user_id, user_login, lockdown_date, created, release_date, released, failed_login_IP, lock_reason, is_lockout_email_sent, backtrace_log, ip_lookup_result) VALUES ('%d', '%s', '%s', UNIX_TIMESTAMP(), '%s', UNIX_TIMESTAMP()+%d, '%s', '%s', '%d', '%s', '%s')", $data['user_id'], $data['user_login'], $data['lockdown_date'], $data['release_date'], $data['lock_seconds'], $data['failed_login_IP'], $data['lock_reason'], $data['is_lockout_email_sent'], $data['backtrace_log'], $data['ip_lookup_result']); + // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.NotPrepared -- PCP warning. Prepared above. + $result = $wpdb->query($sql); + return $result; + } + + /** + * Returns an array of blog_ids for a multisite install + * + * @global type $wpdb + * @global type $wpdb + * @return array or empty array if not multisite + */ + public static function get_blog_ids() { + global $wpdb; + if (is_multisite()) { + global $wpdb; + // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- PCP warning. Direct query required. + $blog_ids = $wpdb->get_col("SELECT blog_id FROM " . $wpdb->prefix . "blogs"); + } else { + $blog_ids = array(); + } + return $blog_ids; + } + + /** + * Purges old records of table + * + * @global type $wpdb WP Database object + * @global type $aio_wp_security AIO WP Security object + * @param type $table_name Table name + * @param type $purge_records_after_days Records after days to be deleted + * @param type $date_field Date field of table + * @return void + */ + public static function purge_table_records($table_name, $purge_records_after_days, $date_field) { + global $wpdb, $aio_wp_security; + + $older_than_date_time = strtotime('-' . $purge_records_after_days . ' days', time()); + if ('created' != $date_field) $older_than_date_time = gmdate('Y-m-d H:i:s', $older_than_date_time); + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- PCP error. Direct query required. Table name cannot be prepared pre WP 6.2. + $sql = $wpdb->prepare('DELETE FROM ' . $table_name . ' WHERE '.$date_field.' < %s', $older_than_date_time); + // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.NotPrepared -- PCP warning. Prepared above. + $ret_deleted = $wpdb->query($sql); + if (false === $ret_deleted) { + $err_db = !empty($wpdb->last_error) ? ' ('.$wpdb->last_error.' - '.$wpdb->last_query.')' : ''; + // Status level 4 indicates failure status. + $aio_wp_security->debug_logger->log_debug_cron('Purge records error - failed to purge older records for ' . $table_name . '.' . $err_db, 4); + } else { + $aio_wp_security->debug_logger->log_debug_cron(sprintf('Purge records - %d records were deleted for ' . $table_name . '.', $ret_deleted)); + } + } + + /** + * This function will delete the oldest rows from a table which are over the max amount of rows specified + * + * @global type $wpdb WP Database object + * @global type $aio_wp_security AIO WP Security object + * @param type $table_name Table name + * @param type $max_rows More than max to be deleted + * @param type $id_field Primary field of table + * @return bool + */ + public static function cleanup_table($table_name, $max_rows = '10000', $id_field = 'id') { + global $wpdb, $aio_wp_security; + + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $num_rows = $wpdb->get_var("select count(*) from $table_name"); + $result = true; + if ($num_rows > $max_rows) { + //if the table has more than max entries delete oldest rows + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- PCP error. Direct query necessary. Table name cannot be prepared pre WP 6.2. + $del_sql = $wpdb->prepare("DELETE FROM $table_name WHERE ".$id_field." <= (SELECT ".$id_field." FROM (SELECT ".$id_field." FROM $table_name ORDER BY ".$id_field." DESC LIMIT 1 OFFSET $max_rows) foo_tmp)"); + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQLPlaceholders.LikeWildcardsInQuery -- PCP warning. Prepared above. + $result = $wpdb->query($del_sql); + if (false === $result) { + $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_Utility::cleanup_table failed for table name: " . $table_name, 4); + } + } + return (false === $result) ? false : true; + } + + /** + * Add backquotes to tables and db-names in SQL queries. Taken from phpMyAdmin. + * + * @param string $a_name - the table name + * @return string - the quoted table name + */ + public static function backquote($a_name) { + if (!empty($a_name) && '*' != $a_name) { + if (is_array($a_name)) { + $result = array(); + foreach ($a_name as $key => $val) { + $result[$key] = '`'.$val.'`'; + } + return $result; + } else { + return '`'.$a_name.'`'; + } + } else { + return $a_name; + } + } + + /** + * Replace the first, and only the first, instance within a string + * + * @param String $needle - the search term + * @param String $replace - the replacement term + * @param String $haystack - the string to replace within + * + * @return String - the filtered string + */ + public static function str_replace_once($needle, $replace, $haystack) { + $pos = strpos($haystack, $needle); + return (false !== $pos) ? substr_replace($haystack, $replace, $pos, strlen($needle)) : $haystack; + } + + /** + * Delete expired CAPTCHA info option + * + * Note: A unique instance these option is created everytime the login page is loaded with CAPTCHA enabled + * This function will help prune the options table of old expired entries. + * + * @global wpdb $wpdb + */ + public static function delete_expired_captcha_options() { + global $wpdb; + $current_unix_time = current_time('timestamp', true); + $previous_hour = $current_unix_time - 3600; + $tbl = is_multisite() ? $wpdb->sitemeta : $wpdb->prefix . 'options'; + $key_name = is_multisite() ? 'meta_key' : 'option_name'; + $key_val = is_multisite() ? 'meta_value' : 'option_value'; + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.LikeWildcardsInQuery -- PCP warning. Direct query required. Table name cannot be prepared pre WP 6.2. + $query = $wpdb->prepare("SELECT * FROM {$tbl} WHERE {$key_name} LIKE 'aiowps_captcha_string_info_time_%' AND {$key_val} < %s", $previous_hour); + // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.NotPrepared -- PCP warning. Prepared above. + $res = $wpdb->get_results($query, ARRAY_A); + if (!empty($res)) { + foreach ($res as $item) { + $option_name = $item[$key_name]; + if (is_multisite()) { + delete_site_option($option_name); + delete_site_option(str_replace('time_', '', $option_name)); + } else { + delete_option($option_name); + delete_option(str_replace('time_', '', $option_name)); + } + } + } + } + + /** + * Get server type. + * + * @return string|integer Server type or -1 if server is not supported + */ + public static function get_server_type() { + if (!isset($_SERVER['SERVER_SOFTWARE'])) { + return apply_filters('aios_server_type', -1); + } + + // Figure out what server they're using. + $server_software = strtolower(sanitize_text_field(wp_unslash(($_SERVER['SERVER_SOFTWARE'])))); + + if (strstr($server_software, 'apache')) { + $server_type = 'apache'; + } elseif (strstr($server_software, 'nginx')) { + $server_type = 'nginx'; + } elseif (strstr($server_software, 'litespeed')) { + $server_type = 'litespeed'; + } elseif (strstr($server_software, 'iis')) { + $server_type = 'iis'; + } elseif (strstr($server_software, 'lighttpd')) { + $server_type = 'lighttpd'; + } else { // Unsupported server + $server_type = -1; + } + + return apply_filters('aios_server_type', $server_type); + } + + /** + * Checks if the string exists in the array key value of the provided array. + * If it doesn't exist, it returns the first key element from the valid values. + * + * @param type $to_check + * @param type $valid_values + * @return type + */ + public static function sanitize_value_by_array($to_check, $valid_values) { + $keys = array_keys($valid_values); + $keys = array_map('strtolower', $keys); + if (in_array(strtolower($to_check), $keys)) { + return $to_check; + } + return reset($keys); //Return the first element from the valid values + } + + /** + * Get textarea string from array or string. + * + * @param String|Array $vals value to render as textarea val + * @return String value to render in textarea. + */ + public static function get_textarea_str_val($vals) { + if (empty($vals)) { + return ''; + } + + if (is_array($vals)) { + return implode("\n", array_filter(array_map('trim', $vals))); + } + + return $vals; + } + + /** + * Get array from textarea val. + * + * @param String|Array $vals value from textarea val + * @return Array value to from textarea value. + */ + public static function get_array_from_textarea_val($vals) { + if (empty($vals)) { + return array(); + } + + if (is_array($vals)) { + return $vals; + } + + return array_filter(array_map('trim', explode("\n", $vals))); + } + + /** + * Partially or fully masks a string using '*' to replace original characters + * + * @param type string $str + * @param type int $chars_unmasked + * @return type string + */ + public static function mask_string($str, $chars_unmasked = 0) { + $str_length = strlen($str); + $chars_unmasked = absint($chars_unmasked); + + if (0 == $chars_unmasked) { + if (8 < $str_length) { + // mask all but last 4 characters + return preg_replace("/(.{4}$)(*SKIP)(*F)|(.)/u", "*", $str); + } elseif (3 < $str_length) { + // mask all but last 2 characters + return preg_replace("/(.{2}$)(*SKIP)(*F)|(.)/u", "*", $str); + } else { + // return whole string masked + return str_pad("", $str_length, "*", STR_PAD_LEFT); + } + } + if ($chars_unmasked >= $str_length) return $str; + return preg_replace("/(.{".$chars_unmasked."}$)(*SKIP)(*F)|(.)/u", "*", $str); + } + + /** + * Create a php backtrace log file for login lockdown email + * + * @param Array $logs + * @global AIO_WP_Security $aio_wp_security + * @return string + */ + public static function login_lockdown_email_backtrace_log_file($logs = array()) { + global $aio_wp_security; + + $temp_dir = get_temp_dir(); + $backtrace_filename = wp_unique_filename($temp_dir, 'log_backtrace_' . time() . '.txt'); + $backtrace_filepath = $temp_dir.$backtrace_filename; + if (count($logs) > 0) { + $dbg = ""; + foreach ($logs as $log) { + $dbg.= "############ BACKTRACE STARTS ########\n"; + $dbg.= $log['backtrace_log']; + $dbg.= "############ BACKTRACE ENDS ########\n\n"; + } + } else { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_debug_backtrace, PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection -- PCP and compatibility warnings. Safe to ignore. + $dbg = debug_backtrace(); + } + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_print_r -- PCP warning. Ignore + $is_log_file_written = file_put_contents($backtrace_filepath, print_r($dbg, true)); + if ($is_log_file_written) { + return $backtrace_filepath; + } else { + $aio_wp_security->debug_logger->log_debug("Error in writing php backtrace file " . $backtrace_filepath . " to attach in email.", 4); + return ''; + } + } + + /** + * Normalise call stacks by clearing out unnecessary objects from their arguments list, leaving only the first arguments as a string. The call stacks should be one that is generated by debug_backtrace() function. + * + * @param array $backtrace The output of the debug_backtrace() function + * @return array An array of associative arrays after being normalised + */ + public static function normalise_call_stack_args($backtrace) { + foreach ($backtrace as $index => $element) { + if (!isset($element['args']) || !is_array($element['args']) || !isset($element['args'][0])) $backtrace[$index]['args'] = array(''); + foreach ($backtrace[$index]['args'] as $key => $arg) { + if (is_object($arg)) { + $backtrace[$index]['args'][$key] = array(get_class($backtrace[$index]['args'][$key])); + } elseif (!is_string($arg)) { + $backtrace[$index]['args'][$key] = array(''); + } + } + + if ('apply_filters' == $backtrace[$index]['function'] && 'authenticate' == $backtrace[$index]['args'][0]) { + $backtrace[$index]['args'] = array('authenticate'); + } + + if ('do_action' == $backtrace[$index]['function'] && 'password_reset' == $backtrace[$index]['args'][0]) { + $backtrace[$index]['args'] = array('password_reset'); + } + + $keys_to_filter = array('wp_create_user', 'wpmu_create_user', 'wp_authenticate', 'post_authenticate', 'reset_password'); + if (in_array($backtrace[$index]['function'], $keys_to_filter)) { + $backtrace[$index]['args'] = array(); + } + } + return $backtrace; + } + + /** + * Check whether the WooCommerce plugin is active. + * + * @return Boolean True if the WooCommerce plugin is active, otherwise false. + */ + public static function is_woocommerce_plugin_active() { + return is_plugin_active('woocommerce/woocommerce.php'); + } + + /** + * Check whether incompatible TFA premium plugin version active. + * + * @return boolean True if the incompatible TFA premium plugin version active, otherwise false. + */ + public static function is_incompatible_tfa_premium_version_active() { + if (!function_exists('get_plugin_data')) { + require_once(ABSPATH . '/wp-admin/includes/plugin.php'); + } + + $active_plugins = wp_get_active_and_valid_plugins(); + + foreach ($active_plugins as $plugin_file) { + if ('two-factor-login.php' == basename($plugin_file) && is_dir(dirname($plugin_file) . '/simba-tfa/premium') && version_compare(get_plugin_data($plugin_file, false, false)['Version'], AIOS_TFA_PREMIUM_LATEST_INCOMPATIBLE_VERSION, '<=')) { + return true; + } + } + + return false; + } + + /** + * Check whether TFA plugin activating. + * + * @return boolean True if the TFA plugin activating, otherwise false. + */ + public static function is_tfa_or_self_plugin_activating() { + // The $GLOBALS['pagenow'] doesn't set in the network admin plugins page and it throws the warning "Notice: Undefined index: pagenow in ..." so we can't use it. + // https://core.trac.wordpress.org/ticket/42656 + return is_admin() && + isset($_SERVER['PHP_SELF']) && preg_match('#/wp-admin/plugins.php$#i', sanitize_text_field(wp_unslash($_SERVER['PHP_SELF']))) && isset($_GET['plugin']) && (preg_match("/\/two-factor-login.php/", sanitize_text_field(wp_unslash($_GET['plugin']))) || preg_match("/all-in-one-wp-security-and-firewall/", sanitize_text_field(wp_unslash($_GET['plugin'])))); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. Ignore. + } + + /** + * Check whether the site is running on localhost or not. + * + * @return Boolean True if the site is on localhost, otherwise false. + */ + public static function is_localhost() { + if (defined('AIOS_IS_LOCALHOST')) { + return AIOS_IS_LOCALHOST; + } + + if (empty($_SERVER['REMOTE_ADDR'])) { + return false; + } + return in_array($_SERVER['REMOTE_ADDR'], array('127.0.0.1', '::1')) ? true : false; + } + + /** + * Get server software. + * + * @return string Server software or empty. + */ + public static function get_server_software() { + static $server_software; + if (!isset($server_software)) { + $server_software = (isset($_SERVER['SERVER_SOFTWARE']) ? sanitize_text_field(wp_unslash($_SERVER['SERVER_SOFTWARE'])) : ''); + } + return $server_software; + } + + /** + * Check whether the server is apache or not. + * + * @return Boolean True the server is apache, otherwise false. + */ + public static function is_apache_server() { + return (false !== strpos(self::get_server_software(), 'Apache')); + } + + /** + * Change salt postfixes. + * + * @return boolean True if the salt postfixes are changed otherwise false. + */ + public static function change_salt_postfixes() { + global $aio_wp_security; + + $salt_postfixes_scheme = array('auth', 'secure_auth', 'logged_in', 'nonce', 'wpcf7_submission'); + $salt_postfixes_scheme = apply_filters('aios_salt_postfixes_scheme', $salt_postfixes_scheme); + $salt_postfixes = array(); + foreach ($salt_postfixes_scheme as $scheme) { + $salt_postfixes[$scheme] = wp_generate_password(64, true, true); + } + return $aio_wp_security->configs->set_value('aiowps_salt_postfixes', $salt_postfixes, true); + } + + /** + * This function checks to see if there is a display condition for the item and if so runs it otherwise it returns true to display the item + * + * @param array $item_info - the item information array + * + * @return boolean - true if the item should be displayed or false to hide it + */ + public static function should_display_item($item_info) { + if (!empty($item_info['display_condition_callback']) && is_callable($item_info['display_condition_callback'])) { + return call_user_func($item_info['display_condition_callback']); + } elseif (!empty($item_info['display_condition_callback']) && !is_callable($item_info['display_condition_callback'])) { + $item = isset($item_info['page_title']) ? $item_info['page_title'] : ''; + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- PCP warning. Ignore. + error_log("Callback function set but not callable (coding error). Item: " . $item); + return false; + } + return true; + } + + /** + * Verify the username is valid based on logged_in cookie information + * + * @see https://developer.wordpress.org/reference/functions/wp_validate_auth_cookie/ + * @param string $info - Cookie info + * @param int $grace - A grace period for the expiration in seconds + * @return string - Username if valid; blank string otherwise + */ + public static function verify_username($info, $grace = 3600) { + + if (!is_string($info)) return ''; + + $elements = wp_parse_auth_cookie($info, 'logged_in'); + + if (empty($elements)) return ''; + + $username = $elements['username']; + $expiration = $elements['expiration']; + $token = $elements['token']; + $hmac = $elements['hmac']; + $scheme = $elements['scheme']; + + // Add a grace period to the expiration check since there may be a delay in processing the user data + if (!empty($grace) && ($expiration + absint($grace)) < time()) return ''; + + $user = get_user_by('login', $username); + + if (false === $user) return ''; + + $pass_frag = substr($user->user_pass, 8, 4); + + $key = wp_hash($username . '|' . $pass_frag . '|' . $expiration . '|' . $token, $scheme); + + // Use sha1, if sha256 is not available + $algo = function_exists('hash') ? 'sha256' : 'sha1'; + $hash = hash_hmac($algo, $username . '|' . $expiration . '|' . $token, $key); + + if (hash_equals($hash, $hmac)) { + return $username; + } + + return ''; + } + + /** + * Get the blog ID from the provided request + * + * @param array $request + * @return int - returns the blog_id or 0 if it cannot be found + */ + public static function get_blog_id_from_request($request) { + + if (!is_multisite()) return get_current_blog_id(); + + $can_get_blog_id = isset($request['REQUEST_SCHEME']) && isset($request['HTTP_HOST']) && isset($request['REQUEST_URI']); + if (!$can_get_blog_id) return 0; + + $site_url = $request['REQUEST_SCHEME'].'://'.$request['HTTP_HOST'].$request['REQUEST_URI']; + $components = wp_parse_url(trailingslashit($site_url)); + + $can_get_blog_id = isset($components['host']) && isset($components['path']); + if (!$can_get_blog_id) return 0; + + $default_path = defined('PATH_CURRENT_SITE') ? constant('PATH_CURRENT_SITE') : '/'; + + $domain = $components['host']; + $path = SUBDOMAIN_INSTALL ? $default_path : ($default_path === $components['path'] ? $components['path'] : '/'.explode('/', $components['path'])[1].'/'); + + $blog_id = get_blog_id_from_url($domain, $path); + + // On a subdirectory installation, if the blog_id cannot be found for the subdirectory given, we assume it's a path belonging to the main site + // So use the main site's blog_id. + if (0 === $blog_id && !SUBDOMAIN_INSTALL) $blog_id = get_blog_id_from_url($domain, $default_path); + + return $blog_id; + } + + /** + * Checks if the bbPress plugin is active. + * + * @return Boolean True if the bbPress plugin is active, otherwise false. + */ + public static function is_bbpress_plugin_active() { + return is_plugin_active('bbpress/bbpress.php'); + } + + /** + * Checks if the Buddypress plugin is active. + * + * @return Boolean True if the Buddypress plugin is active, otherwise false. + */ + public static function is_buddypress_plugin_active() { + return is_plugin_active('buddypress/bp-loader.php'); + } + + /** + * Checks if the Contact Form 7 plugin is active. + * + * @return Boolean - True if the Contact Form 7 plugin is active, otherwise false. + */ + public static function is_contact_form_7_plugin_active() { + return is_plugin_active('contact-form-7/wp-contact-form-7.php'); + } + + /** + * Checks if the Memberpress plugin is active. + * + * @return Boolean - True if the Memberpress plugin is active, otherwise false. + */ + public static function is_memberpress_plugin_active() { + return is_plugin_active('memberpress/memberpress.php'); + } + + /** + * Retrieves and returns current WP general settings date time format. + * + * @return string + */ + public static function get_wp_datetime_format() { + return get_option('date_format') . ' ' . get_option('time_format'); + } + + /** + * This function gets the timezone of the site as a DateTimeZone object + * + * @see https://developer.wordpress.org/reference/functions/wp_timezone/ + * + * @return DateTimeZone - the timezone of the site as a DateTimeZone object + */ + public static function get_wp_timezone() { + return new DateTimeZone(self::get_wp_timezone_string()); + } + + /** + * This function gets the timezone of the site as a string + * + * @see https://developer.wordpress.org/reference/functions/wp_timezone_string/ + * + * @return string - PHP timezone name or a ±HH:MM offset + */ + public static function get_wp_timezone_string() { + $timezone_string = get_option('timezone_string'); + + if ($timezone_string) return $timezone_string; + + $offset = (float) get_option('gmt_offset'); + $hours = (int) $offset; + $minutes = ($offset - $hours); + $sign = ($offset < 0) ? '-' : '+'; + $abs_hour = abs($hours); + $abs_mins = abs($minutes * 60); + $tz_offset = sprintf('%s%02d:%02d', $sign, $abs_hour, $abs_mins); + + return $tz_offset; + } + + /** + * Converts a Unix timestamp to WP general settings timezone and format. It will also translate with wp_date if available. + * + * @param string $timestamp Optional. Will default to time() if not provided. + * @param string $format Optional. Will default to WP general settings format if not provided. + * + * @return string + */ + public static function convert_timestamp($timestamp = null, $format = null) { + + if (!$format) $format = self::get_wp_datetime_format(); + + if (!$timestamp) $timestamp = time(); + + return function_exists('wp_date') ? wp_date($format, $timestamp) : get_date_from_gmt(gmdate('Y-m-d H:i:s', $timestamp), $format); + } + + /** + * Deletes unneeded default WP files. + * + * @global AIO_WP_Security $aio_wp_security + * + * @param bool $echo_results + * + * @return array + */ + public static function delete_unneeded_default_files($echo_results = false) { + global $aio_wp_security; + + $files = array('readme.html', 'wp-config-sample.php', 'license.txt'); + $info = array(); + $error = array(); + foreach ($files as $file_name) { + $file_path = ABSPATH . $file_name; + + if (file_exists($file_path)) { + if (@wp_delete_file($file_path)) { + /* translators: %s: File name */ + $success_message = sprintf(__('Successfully deleted the %s file.', 'all-in-one-wp-security-and-firewall'), $file_name); + $aio_wp_security->debug_logger->log_debug($success_message, 0); + + if ($echo_results) { + AIOWPSecurity_Admin_Menu::show_msg_updated_st($success_message); + } + } else { + /* translators: %s: File name */ + $failure_message = sprintf(__('Failed to delete the %s file.', 'all-in-one-wp-security-and-firewall'), $file_name) . ' ' . sprintf(__('Check the file/directory permissions at: %s', 'all-in-one-wp-security-and-firewall'), $file_path); + $error[] = $file_name; + $aio_wp_security->debug_logger->log_debug($failure_message, 4); + + if ($echo_results) { + AIOWPSecurity_Admin_Menu::show_msg_error_st($failure_message); + } + } + } else { + /* translators: %s: File name */ + $message = sprintf(__('The %s file has already been deleted.', 'all-in-one-wp-security-and-firewall'), $file_name); + $info[] = $message; + $aio_wp_security->debug_logger->log_debug($message, 0); + + if ($echo_results) { + AIOWPSecurity_Admin_Menu::show_msg_updated_st($message); + } + } + } + + + return array( + 'info' => $info, + 'error' => empty($error) ? '' : implode(', ', $error) + ); + } + + /** + * Convert a number of bytes into a suitable textual string + * + * @param Integer $size - the number of bytes + * + * @return String - the resulting textual string + */ + public static function convert_numeric_size_to_text($size) { + if ($size > 1073741824) { + return round($size / 1073741824, 1).' GB'; + } elseif ($size > 1048576) { + return round($size / 1048576, 1).' MB'; + } elseif ($size > 1024) { + return round($size / 1024, 1).' KB'; + } else { + return round($size, 1).' B'; + } + } + + /** + * Updates the Googlebot IP ranges config. + * + * @return array|WP_Error + */ + public static function get_googlebot_ip_ranges() { + $response = wp_safe_remote_get('https://developers.google.com/static/search/apis/ipranges/googlebot.json'); + + $body = wp_remote_retrieve_body($response); + $json_array = json_decode($body, true); + + $ip_list_array = array(); + + foreach ($json_array['prefixes'] as $prefix) { + $ip_list_array[] = array_key_exists('ipv4Prefix', $prefix) ? $prefix['ipv4Prefix'] : $prefix['ipv6Prefix']; + } + + return AIOWPSecurity_Utility_IP::validate_ip_list($ip_list_array, 'whitelist'); + } + + /** + * This function creates and outputs the csv file for download + * + * @param array $items - the content + * @param array $export_keys - the keys for the content + * @param string $filename - the filename + * + * @return void + */ + public static function output_csv($items, $export_keys, $filename = 'data.csv') { + header("Content-Type: text/csv; charset=utf-8"); + header("Content-Disposition: attachment; filename=".$filename); + header("Pragma: no-cache"); + header("Expires: 0"); + $output = fopen('php://output', 'w'); //open output stream + + fputcsv($output, $export_keys, ',', '"', '\\'); // let's put column names first + + foreach ($items as $item) { + $csv_line = array(); + + foreach ($export_keys as $key => $value) { + if (isset($item[$key])) { + $csv_line[] = ('created' == $key) ? AIOWPSecurity_Utility::convert_timestamp($item[$key]) : $item[$key]; + } + } + fputcsv($output, $csv_line, ',', '"', '\\'); + } + } + + /** + * Check if a user is a member of the current blog ID in a multisite environment. + * + * @param int $user_id - User Id to check. + * + * @return bool Whether the user is a member of the current blog ID. + */ + public static function is_user_member_of_blog($user_id) { + $current_user_id = get_current_user_id(); + + if (is_multisite() && !is_super_admin($current_user_id)) { + $blog_id = get_current_blog_id(); + return is_user_member_of_blog($user_id, $blog_id); + } + + // Non-multisite or super admin, consider the user a member + return true; + } + + /** + * Blacklists an IP address. + * + * @global AIO_WP_Security $aio_wp_security + * @global AIOWPS\Firewall\Config $aiowps_firewall_config + * + * @param string $ip The IP address to be blacklisted. + * + * @return void|WP_Error + */ + public static function blacklist_ip($ip) { + global $aio_wp_security; + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + + $blacklisted_ip_addresses = $aio_wp_security->configs->get_value('aiowps_banned_ip_addresses'); + + $ip_list_array = AIOWPSecurity_Utility_IP::create_ip_list_array_from_string_with_newline($blacklisted_ip_addresses); + $ip_list_array[] = $ip; + + $validated_ip_list_array = AIOWPSecurity_Utility_IP::validate_ip_list($ip_list_array, 'blacklist'); + + if (is_wp_error($validated_ip_list_array)) { + return $validated_ip_list_array; + } else { + $banned_ip_data = implode("\n", $validated_ip_list_array); + + $aio_wp_security->configs->set_value('aiowps_enable_blacklisting', '1'); // Force blacklist feature to be enabled. + $aio_wp_security->configs->set_value('aiowps_banned_ip_addresses', $banned_ip_data); + $aio_wp_security->configs->save_config(); + + $aiowps_firewall_config->set_value('aiowps_blacklist_ips', $validated_ip_list_array); + } + } + + /** + * Unlocks an IP address. + * + * @global wpdb $wpdb + * + * @param string $ip The IP address to be blacklisted. + * + * @return boolean + */ + public static function unlock_ip($ip) { + global $wpdb; + + $lockout_table = AIOWPSEC_TBL_LOGIN_LOCKOUT; + + // Unlock single record. + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery -- PCP warning. Ignore. + $result = $wpdb->query($wpdb->prepare("UPDATE $lockout_table SET `released` = UNIX_TIMESTAMP() WHERE `failed_login_ip` = %s", $ip)); + + return null != $result; + } + + /** + * Unblacklists an IP address. + * + * @global AIO_WP_Security $aio_wp_security + * @global AIOWPS\Firewall\Config $aiowps_firewall_config + * + * @param string $ip The IP address to be unblacklisted. + * + * @return boolean + */ + public static function unblacklist_ip($ip) { + global $aio_wp_security; + $aiowps_firewall_config = AIOS_Firewall_Resource::request(AIOS_Firewall_Resource::CONFIG); + + $blacklisted_ip_addresses = $aio_wp_security->configs->get_value('aiowps_banned_ip_addresses'); + + $ip_list_array = AIOWPSecurity_Utility_IP::create_ip_list_array_from_string_with_newline($blacklisted_ip_addresses); + + if (!in_array($ip, $ip_list_array)) { + return false; + } + + $ip_list_array = array_diff($ip_list_array, array($ip)); + + $banned_ip_data = implode("\n", $ip_list_array); + + $aio_wp_security->configs->set_value('aiowps_banned_ip_addresses', $banned_ip_data); + $aio_wp_security->configs->save_config(); + + $aiowps_firewall_config->set_value('aiowps_blacklist_ips', $ip_list_array); + + return true; + } + + /** + * Determines if the .htaccess file can be written to. + * + * This function checks if the current user has the necessary permissions + * (is the main site and super admin) and whether the server type is supported + * for writing to the .htaccess file. It prevents modifications on unsupported + * server types such as Nginx and IIS. + * + * @return bool True if .htaccess can be written to, false otherwise. + */ + public static function allow_to_write_to_htaccess() { + if (!AIOWPSecurity_Utility_Permissions::is_main_site_and_super_admin()) return false; + $serverType = self::get_server_type(); + + return !in_array($serverType, array('-1', 'nginx', 'iis')); + } + + /** + * Render the 5G Legacy Tab. + * + * This function checks if the current site is the main site and if the user is a super admin. + * If these conditions are met, it checks whether the 5G firewall is enabled or not. + * + * @global object $aio_wp_security The global instance of the All-In-One WP Security & Firewall plugin. + * + * @return bool returns true if the 5G firewall is enabled, false otherwise. + */ + public static function render_5g_legacy_tab() { + global $aio_wp_security; + if (!AIOWPSecurity_Utility_Permissions::is_main_site_and_super_admin()) return false; + + return '1' == $aio_wp_security->configs->get_value('aiowps_enable_5g_firewall'); + } + + /** + * Filters an array item based on a specified callback key. + * + * This function checks if a specified callback is present and callable within the array item. + * If the callback is callable, it executes the callback and returns the result. + * If the callback is set but not callable, it logs an error and returns false. + * If no callback is set, the function returns true. + * + * @param array $item The array item to filter. + * @param string $callback_key The key in the array to check for a callable function. + * + * @return bool|mixed Returns the result of the callback if callable, false if the callback is not callable, + * or true if no callback is set. + */ + public static function apply_callback_filter($item, $callback_key) { + if (isset($item[$callback_key])) { + if (is_callable($item[$callback_key])) { + return call_user_func($item[$callback_key]); + } else { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- PCP warning. Required for AIOS error reporting. + error_log("Callback function set but not callable (coding error)"); + return false; + } + } else { + return true; + } + } + + /** + * Checks if other specific form-related plugins are active. + * + * @return bool Returns `true` if any of the specified plugins (bbPress, BuddyPress, + * or Contact Form 7) are active, or `false` if none of them are active. + */ + public static function is_other_form_plugins_active() { + return self::is_bbpress_plugin_active() || self::is_buddypress_plugin_active() || self::is_contact_form_7_plugin_active(); + } + + /** + * Unserialize data while maintaining compatibility across PHP versions due to different number of arguments required by PHP's "unserialize" function + * + * @param string $serialized_data Data to be unserialized, should be one that is already serialized + * @param boolean|array $allowed_classes Either an array of class names which should be accepted, false to accept no classes, or true to accept all classes + * @param integer $max_depth The maximum depth of structures permitted during unserialization, and is intended to prevent stack overflows + * + * @return mixed Unserialized data can be any of types (integer, float, boolean, string, array or object) + */ + public static function unserialize($serialized_data, $allowed_classes = false, $max_depth = 0) { + if (version_compare(PHP_VERSION, '7.0', '<')) { + $result = unserialize($serialized_data); + } else { + $result = unserialize($serialized_data, array('allowed_classes' => $allowed_classes, 'max_depth' => $max_depth)); // phpcs:ignore PHPCompatibility.FunctionUse.NewFunctionParameters.unserialize_optionsFound -- This is the method used to unserialize data instead of the default unserialize method + } + return $result; + } + + /** + * Gets the rest route starting with namespace from the REST API endpoint + * It excludes rest url prefix 'wp-json' and multisite folder from the endpoint + * For example 'wc/store/v1/cart', 'contact-form-7/v1/contact-forms/45/feedback' + * + * @return string rest route starting with namespace + */ + public static function get_rest_route() { + $rest_route = !empty($_GET['rest_route']) ? sanitize_text_field(stripslashes($_GET['rest_route'])) : ''; + // If route is not found in query parameter, extract from REQUEST_URI + if (empty($rest_route)) { + $request_uri = !empty($_SERVER['REQUEST_URI']) ? urldecode($_SERVER['REQUEST_URI']) : ''; + $parsed_url = parse_url(trim($request_uri, '/')); + $path = isset($parsed_url['path']) ? $parsed_url['path'] : ''; + if (false !== strpos($path, rest_get_url_prefix())) { + $path = preg_replace('/index\.php\//', '', $path); // index.php from path removed. + $rest_route = preg_replace('/(.*)\/?'.rest_get_url_prefix().'\/?/', '', $path); // wp-json rest prefix and multisite folder excluded + $rest_route = trim($rest_route, '/'); + if (empty($rest_route)) $rest_route = '/'; // "wp-json" rest request without name space called. + } else { + $rest_route = ''; + } + } + return $rest_route; + } + + /** + * Get the registered namespace for REST routes end points 'wc', 'contact-form-7' + * + * @return array namespace. + */ + public static function get_rest_namespaces() { + $rest_server = rest_get_server(); + $namespaces = $rest_server->get_namespaces(); + $rest_route_namespaces = array(); + foreach ($namespaces as $namesapce) { + $rest_route_namespaces[] = explode('/', $namesapce)[0]; // Namespace 'wc' only to consider instead 'wc/v1', 'wc/v2', 'wc/v3', 'wc/store' + } + $route_namespaces = array_unique($rest_route_namespaces); + sort($route_namespaces); + return $route_namespaces; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-wp-footer-content.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-wp-footer-content.php new file mode 100755 index 00000000..97bf1dde --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/classes/wp-security-wp-footer-content.php @@ -0,0 +1,57 @@ +configs->get_value('aiowps_enable_woo_login_captcha') || '1' == $aio_wp_security->configs->get_value('aiowps_enable_woo_register_captcha') || '1' == $aio_wp_security->configs->get_value('aiowps_enable_woo_checkout_captcha') || '1' == $aio_wp_security->configs->get_value('aiowps_enable_woo_lostpassword_captcha')) { + $aio_wp_security->captcha_obj->print_captcha_api_woo(); + } + } + + // Activate the copy protection feature for non-admin users + $copy_protection_active = $aio_wp_security->configs->get_value('aiowps_copy_protection') == '1'; + if ($copy_protection_active && !AIOWPSecurity_Utility_Permissions::has_manage_cap()) { + $this->output_copy_protection_code(); + } + + //TODO - add other footer output content here + } + + public function output_copy_protection_code() { + ?> + + + configs->get_value('aiowps_enable_rename_login_page') == '1') { + include_once(AIO_WP_SECURITY_PATH . '/classes/wp-security-process-renamed-login-page.php'); + new AIOWPSecurity_Process_Renamed_Login_Page(); + AIOWPSecurity_Process_Renamed_Login_Page::renamed_login_init_tasks(); + } else { + add_action('login_init', array($this, 'aiowps_login_init')); + } + + $this->do_lockout_tasks(); + + do_action('aiowps_wp_loaded_tasks_end', $this); + + } + + /** + * Perform lockout task if it is applicable. + * + * @return void + */ + private function do_lockout_tasks() { + global $aio_wp_security; + + if (1 != $aio_wp_security->configs->get_value('aiowps_site_lockout')) { + return; + } + + if ('admin-ajax.php' == $GLOBALS['pagenow']) { + return; + } + + // Show login screen to all non-logged in users. + if ('wp-login.php' == $GLOBALS['pagenow']) { + return; + } + + // WP CLI and cronjob do not required site lockout. + if ((defined('DOING_CRON') && DOING_CRON) || 'cli' == PHP_SAPI) { + return; + } + + // The lockout message should not be displayed to an administrator user. + if (is_user_logged_in() && current_user_can('manage_options')) { + return; + } + + // Non administrator users to lockout accessing admin area. + if (is_user_logged_in() && !current_user_can('manage_options') && is_admin()) { + wp_redirect(home_url()); + } + + // Non-logged in users try access admin area, redirect to login page. + if (is_admin()) { + return; + } + + self::site_lockout_tasks(); + } + + /** + * Render lockout output. + * + * @return void + */ + public static function site_lockout_tasks() { + $lockout_output = apply_filters('aiowps_site_lockout_output', ''); + if (empty($lockout_output)) { + nocache_headers(); + header("HTTP/1.0 503 Service Unavailable"); + remove_action('wp_head', 'head_addons', 7); + $template = apply_filters('aiowps_site_lockout_template_include', AIO_WP_SECURITY_PATH . '/other-includes/wp-security-visitor-lockout-page.php'); + include_once($template); + } else { + echo wp_kses_post($lockout_output); + } + + exit(); + } + + public static function aiowps_login_init() { + //if user is logged in and tries to access login page - redirect them to wp-admin + //this will prevent issues such as the following: + //https://wordpress.org/support/topic/already-logged-in-no-captcha + if (is_user_logged_in()) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce. + $redirect_to = (isset($_REQUEST['redirect_to'])) ? sanitize_text_field(wp_unslash($_REQUEST['redirect_to'])) : admin_url(); + wp_safe_redirect($redirect_to); + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- PCP warning. No nonce. + } elseif (!(isset($_GET['action']) && 'postpass' == $_GET['action'])) { + AIOWPSecurity_Utility_IP::check_login_whitelist_and_forbid(); + } + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/css/index.html b/wp-content/plugins/all-in-one-wp-security-and-firewall/css/index.html new file mode 100755 index 00000000..e69de29b diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/css/wp-security-admin-styles.css b/wp-content/plugins/all-in-one-wp-security-and-firewall/css/wp-security-admin-styles.css new file mode 100755 index 00000000..4ffeaaa6 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/css/wp-security-admin-styles.css @@ -0,0 +1,1211 @@ +.aio_bold { + font-weight: bold; +} + +.aio_half_width { + width: 50%; +} + +.aio_one_third_width { + width: 33%; +} + +.aio_width_80 { + width: 80%; +} + +.aio_max_500 { + max-width: 500px; +} + +.aio_spacer_15 { + margin-top: 15px; +} + +.aio_spacer_10_tb { + margin: 10px 0; +} + +.aio_spacer_10_tblr { + margin: 10px; +} + +.aio_clear_float { + clear: both; +} + +.aio_float_left { + float: left; +} + +.aio_padding_10 { + padding: 10px !important; +} + +.aio_section_separator_1 { + border-bottom: 1px solid #DEDEDE; + height: 10px; +} + +.aiowps_admin_ul_grp1 { + list-style: circle; + padding: 0 0 0 30px; +} + +.aio_grey_box { + margin: 10px 0 15px 0; + background-color: #ECECEC; + border: 1px solid #CFCFCF; + padding: 0 0 0 1em; +} + +.aio_yellow_box { + margin: 10px 0 15px 0; + background-color: #FFFFE0; + border-color: #E6DB55; + border-radius: 3px; + border-style: solid; + border-width: 1px; + padding: 0 0 0 1em; +} + +.aio_blue_box { + margin: 10px 0 15px 0; + background-color: #F0F9FF; + border-color: #16B; + color: #16B; + border-radius: 3px; + border-style: solid; + border-width: 1px; + padding: 0 0 0 1em; + line-height: 20px; + overflow-wrap: break-word; +} + +.aio_green_box { + margin: 10px 0 15px 0; + background-color: #CCF4D6; + border-color: #059B53; + color: #043B14; + border-radius: 3px; + border-style: solid; + border-width: 1px; + padding: 0 1em; +} + +.aio_red_box { + margin: 10px 0 15px 0; + background-color: #FFEBE8; + border-color: #C00; + color: #333; + border-radius: 3px; + border-style: solid; + border-width: 1px; + padding: 0 1em; +} + +.aio_orange_box { + margin: 10px 0 15px 0; + background-color: #FFB900; + border-color: #D64500; + border-radius: 3px; + border-style: solid; + border-width: 1px; + padding: 0 1em; +} + +.aio_success_with_icon { + background-image: url("../images/success.png"); + background-repeat: no-repeat; + color: #529901; + padding-left: 20px; + font-size: 14px; +} + +.aio_error_with_icon { + color: #F00; + background-image: url("../images/error.png"); + background-repeat: no-repeat; + padding-left: 20px; + font-size: 14px; +} + +.aio_info_with_icon { + background-image: url("../images/info-icon.png"); + background-repeat: no-repeat; + color: #16B; + padding-left: 20px; + font-size: 14px; +} + +.file_permission_table { + margin: 20px 0; +} + +.file_permission_table thead tr th { + background: #CCC; +} + +.file_permission_table td { + padding: 7px; + font-family: "Courier 10 Pitch",courier,monospace; + color: #262626; + border-bottom: 1px solid #F2F2F2; + border-top: none; +} + +.aio_table_row_red { + background-color: #FD6D73; +} + +.aio_table_row_yellow { + background-color: #F5E679; +} + +.aio_table_row_green { + background-color: #C8F18B; +} + +.aiowps_loading_1 { + margin: 0 5px; +} + +.aio_text_area_file_output { + background: none repeat scroll 0 0 #F9F9F9; + font-family: consolas,monaco,monospace; + font-size: 12px; + outline: 0 none; +} + +.aiowps_more_info_anchor { + display: inline-block; + background-color: #D9D9D9; + color: #21759B; + font: 0.9em/1.455em "Lucida Grande","Lucida Sans Unicode",tahoma,verdana,sans-serif; + text-decoration: none; + padding: 3px 5px; +} + +.aiowps_more_info_anchor:hover { + color: #333; + cursor: pointer; +} + +.aiowps_more_info_toggle_char { + display: inline-block; + margin-right: 3px; + padding: 0 3px; + text-align: center; + background-color: #EDEDED; + width: 10px; +} + +.aiowps_more_info_body { + margin: 10px 0 15px 0; + background-color: #FFFFE0; + border-color: #E6DB55; + border-radius: 3px; + border-style: solid; + border-width: 1px; + padding: 0 0 0 1em; +} + +.aiowps_dashboard_box_small { + float: left; + max-width: 350px; + margin-right: 15px; +} + +#canvas-holder { + width: 300px; + margin: auto; + padding-top: 20px; +} + +#website-strength-text { + text-align: center !important; + font-size: 1.5em !important; + padding-bottom: 20px !important; +} + +#security_strength_chart_div table { + margin-right: auto !important; + margin-left: auto !important; +} + +.aiowps_dashboard_widget_footer { + background-color: #E6E6E6; + padding: 10px; +} + +.aiowps_feature_status_bar { + display: block; + float: left; + width: 120px; + height: 26px; + position: relative; + background: rgba(0, 0, 0, 0.25); + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.3), 0 1px rgba(255, 255, 255, 0.1); /* phpcs:ignore Squiz.CSS.ForbiddenStyles.FoundWithAlternative -- This is a fallback for older browsers */ + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.3), 0 1px rgba(255, 255, 255, 0.1); +} + +.aiowps_feature_status_name { + width: 50%; + font-weight: bold; + float: left; + padding: 5px 10px 5px 0; +} + +.aiowps_feature_status_label { + display: block; + float: left; + padding: 4px; + text-align: center; + width: 52px; + color: #F7F7F7; + font-weight: bold; + text-transform: uppercase; +} + +.aiowps_feature_status_on { + color: #043B14; + background: #65BD63; + border-radius: 3px; + background-image: -webkit-linear-gradient(top, #9DD993, #65BD63); /* phpcs:ignore Squiz.CSS.DuplicateStyleDefinition.Found -- For Safari and Chrome */ + background-image: -moz-linear-gradient(top, #9DD993, #65BD63); /* phpcs:ignore Squiz.CSS.DuplicateStyleDefinition.Found -- For Mozilla */ + background-image: -o-linear-gradient(top, #9DD993, #65BD63); /* phpcs:ignore Squiz.CSS.DuplicateStyleDefinition.Found -- For Opera */ + background-image: linear-gradient(top bottom, #9DD993, #65BD63); /* phpcs:ignore Squiz.CSS.DuplicateStyleDefinition.Found -- Previous definitions are for outdated browsers */ + -webkit-box-shadow: inset 0 1px rgba(255, 255, 255, 0.5), 0 0 2px rgba(0, 0, 0, 0.2); /* phpcs:ignore Squiz.CSS.ForbiddenStyles.FoundWithAlternative -- This is a fallback for older browsers */ + box-shadow: inset 0 1px rgba(255, 255, 255, 0.5), 0 0 2px rgba(0, 0, 0, 0.2); +} + +.aiowps_feature_status_off { + color: #4D0000; + background: #BD6363; + border-radius: 3px; + background-image: -webkit-linear-gradient(top, #D99393, #BD6363); /* phpcs:ignore Squiz.CSS.DuplicateStyleDefinition.Found -- For Safari and Chrome */ + background-image: -moz-linear-gradient(top, #D99393, #BD6363); /* phpcs:ignore Squiz.CSS.DuplicateStyleDefinition.Found -- For Mozilla */ + background-image: -o-linear-gradient(top, #D99393, #BD6363); /* phpcs:ignore Squiz.CSS.DuplicateStyleDefinition.Found -- For Opera */ + background-image: linear-gradient(top bottom, #D99393, #BD6363); /* phpcs:ignore Squiz.CSS.DuplicateStyleDefinition.Found -- Previous definitions are for outdated browsers */ + -webkit-box-shadow: inset 0 1px rgba(255, 255, 255, 0.5), 0 0 2px rgba(0, 0, 0, 0.2); /* phpcs:ignore Squiz.CSS.ForbiddenStyles.FoundWithAlternative -- This is a fallback for older browsers */ + box-shadow: inset 0 1px rgba(255, 255, 255, 0.5), 0 0 2px rgba(0, 0, 0, 0.2); +} + +.aiowps_features_grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + grid-gap: 0 10px; + margin: 10px 0; +} + +.aiowps_critical_feature_link, +.aiowps_critical_feature_link:hover { + text-decoration: none; + color: inherit; +} + +.aiowps_critical_feature_status_container { + display: flex; + align-items: center; + padding: 5px 8px; + min-height: 30px; + transition: all 0.2s ease; +} + +.aiowps_critical_feature_status_name { + flex: 1.5; + font-weight: bold; + margin-right: 8px; +} + +.aiowps_feature_status_circle { + width: 24px; + height: 24px; + display: flex; + justify-content: center; + align-items: center; + flex: 1; +} + +.aiowps_feature_status_circle_on, +.aiowps_feature_status_circle_off { + width: 16px; + height: 16px; + border-radius: 50%; + transition: transform 0.2s ease; +} + +.aiowps_feature_status_circle_on { + background-color: #4CD964; +} + +.aiowps_feature_status_circle_off { + background-color: #E4584F; +} + +.aiowps_critical_feature_status_container:hover .aiowps_feature_status_circle_on, +.aiowps_critical_feature_status_container:hover .aiowps_feature_status_circle_off { + transform: scale(1.1); +} + +@media (max-width: 768px) { + + .aiowps_features_grid { + grid-template-columns: 1fr; + } + +} + +.aiowps_feature_details_badge { + width: 100%; + font-size: 14px; +} + +.aiowps_feature_details_badge_difficulty, .aiowps_feature_details_badge_points { + display: inline-block; + padding: 7px; +} + +.aiowps_feature_details_badge_difficulty { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + margin-right: 0; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4); +} + +.aiowps_feature_details_badge_points { + background: #F1F1F1; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + margin-left: -3px; +} + +.aiowps_feature_protection_none { + background: #6D797A; + color: #FFF; +} + +.aiowps_feature_protection_full { + background: #5C3682; + color: #FFF; +} + +#aiowps_pw_tool_main { + padding-top: 10px; +} + +.aiowps_password_tool_field { + padding: 20px 0; +} + +#aiowps_password_crack_info_text, #aiowps_password_hibp_info_text { + display: none; + line-height: 1.16667em; + max-width: 40%; +} + +#aiowps_password_crack_time_calculation { + line-height: 1.16667em; + color: darkorange; +} + +/* bootstrap type labels */ +.aiowps_dashboard_table { + table-layout: fixed; +} + +.aiowps-label-danger { + background-color: #D9534F; +} + +.aiowps-label-warning { + background-color: #F0AD4E; +} + +.aiowps-label-primary { + background-color: #337AB7; +} + +.aiowps-label-success { + background-color: #5CB85C; +} + +.aiowps-label { + border-radius: 0.25em; + color: #FFF; + display: inline; + font-size: 75%; + font-weight: 700; + line-height: 1; + padding: 0.2em 0.6em 0.3em; + text-align: center; + vertical-align: baseline; + white-space: nowrap; +} + +/* Fix for wp list table nav buttons style messed up in 5.1 */ +.tablenav .tablenav-pages .pagination-links a { + display: inline-block; + padding: 4px 5px 6px 5px; + font-size: 16px; + line-height: 1; + text-align: center; + text-decoration: none; + min-width: 17px; + border: 1px solid #CCC; + background: #F7F7F7; +} + +svg > g > g.google-visualization-tooltip { + pointer-events: none; +} + +.wp-security_page_aiowpsec_settings h2, .wp-security_page_aiowpsec_settings #poststuff h2 { + padding-left: 0; +} + +.aio_hidden { + display: none; +} + +/* Fix for WordPress thickbox not respecting the set width and height */ +/* Open issue for 8 years : https://core.trac.wordpress.org/ticket/27473 */ +#TB_ajaxContent { + width: 95% !important; + height: 95% !important; +} + +.aiowps_switch { + position: relative; + display: inline-block; + width: 38px; + height: 18px; + margin-right: 6px; + box-sizing: border-box; +} + +.aiowps_switch input { + opacity: 0; + width: 0; + height: 0; +} + +.aiowps_switch .aiowps_slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #F2F4F5; + transition: 0.2s; + /* Rounded sliders */ +} + +.aiowps_switch .aiowps_slider::before { + position: absolute; + content: ""; + height: 8px; + width: 8px; + left: 2px; + bottom: 2px; + background-color: #555D66; + border: 1px solid #555D66; + transition: all 0.2s; +} + +.aiowps_switch .aiowps_slider::after { + content: ""; + display: block; + position: absolute; + height: 4px; + width: 3px; + right: 4px; + top: 4px; + border-radius: 50%; + border: 1px solid #72777C; + box-sizing: content-box; +} + +.aiowps_switch .aiowps_slider.round { + border-radius: 23px; + border: 2px solid #555D66; +} + +.aiowps_switch .aiowps_slider.round::before { + border-radius: 50%; +} + +.aiowps_switch input:checked + .aiowps_slider { + background: #5C3682; + border-color: #6F30C9; +} + +.aiowps_switch input:checked + .aiowps_slider::before { + background: #FFF; + border-color: #FFF; + transform: translatex(20px); +} + +.aiowps_switch input:checked + .aiowps_slider::after { + content: ""; + display: block; + position: absolute; + height: 6px; + width: 2px; + left: 7px; + top: 4px; + background: #FFF; + border: none; +} + +.aiowps_switch input:disabled + .aiowps_slider, +.aiowps_switch input:disabled:checked + .aiowps_slider { + background: rgba(85, 93, 102, 0.5); + border-color: #555D66; + opacity: 0.3; +} + +.aiowps_switch input:focus + .aiowps_slider { + box-shadow: 0 0 0 2px #F2F4F5, 0 0 0 3px #555D66; +} + +.aiowps_switch input:disabled { + display: none; + /* Hide default HTML checkbox when it's disabled*/ +} + +.aiowps_next_scheduled_scan_wrapper { + display: flex; + background: #FFF; + justify-items: center; + flex-wrap: wrap; +} + +.aiowps_next_scheduled_scan_wrapper > div { + width: 50%; + background: #FFF; + height: auto; + padding: 33px; + box-sizing: border-box; +} + +.aiowps_next_scheduled_entity { + width: 50%; + display: inline-block; + float: left; +} + +.aiowps_next_scheduled_entity .dashicons { + color: #CCC; + font-size: 20px; +} + +.aiowps_next_scheduled_entity strong { + font-size: 20px; +} + +.aiowps_next_scheduled_heading { + margin-bottom: 10px; +} + +.aiowps_time_now_wrapper { + margin-top: 68px; + width: 100%; +} + +.aiowps_time_now_label, .aiowps_time_now { + display: inline-block; + padding: 7px; +} + +.aiowps_time_now_label { + background: #6D797A; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + color: #FFF; + margin-right: 0; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4); +} + +.aiowps_time_now { + background: #F1F1F1; + color: #3C434A; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + margin-left: -3px; +} + +.aiowps_scan_btn_wrapper { + text-align: center; + border-left: 1px solid #F1F1F1; + justify-content: center; + align-items: center; +} + +.aiowps_scan_btn_wrapper .button-large { + font-size: 1.3em !important; +} + +.aiowps_next_scheduled_date_time { + color: #46A84B; +} + +#aiowps_activejobs_table { + overflow: hidden; + width: 100%; + background: #FAFAFA; + padding: 0; +} + +#aiowps_activejobs_table p { + text-align: center; +} + +#aiowps_previous_scan_wrapper { + overflow: hidden; + width: 100%; + background: #FAFAFA; + padding: 0; +} + +.aiowps_table_container { + max-height: 300px; + overflow-y: scroll; + margin-top: 20px; + border: 1px solid #C3C4C7; +} + +.aiowps_scan_result_table { + width: 100%; + border: none !important; +} + +.aiowps_scan_result_table_header { + position: sticky; + top: 0; + background-color: #FFF; + z-index: 1; +} + +.aiowps_spinner.spinner { + padding-left: 25px; + float: none; +} + +.aiowps_spinner.spinner.visible { + visibility: visible; + width: auto; +} + +.button-link.aios-toggle-advanced-options { + text-decoration: none; +} + +.button-link.aios-toggle-advanced-options:hover { + background-color: #FFF; +} + +.button-link.aios-toggle-advanced-options:focus { + background-color: #FFF; +} + +button.button-link.aios-toggle-advanced-options.advanced-options-disabled, button.button-link.aios-toggle-advanced-options.advanced-options-disabled span.dashicons-arrow-down-alt2:before { + color: #A7AAAD!important; + box-shadow: none!important; + cursor: default; + transform: none!important; +} + +.aios-toggle-advanced-options { + display: block; + width: 100%; + margin-left: -20px; + margin-right: -20px; + padding-left: 20px; + padding-right: 20px; + position: relative; + text-decoration: none; +} + +.aios-toggle-advanced-options span.text { + background: #FFF; + z-index: 1; + position: relative; + padding-right: 5px; +} + +.aios-toggle-advanced-options span.dashicons { + text-decoration: none; + font-size: 16px; + height: 16px; + vertical-align: middle; + transition: .2s all; + color: #444; +} + +.aios-toggle-advanced-options.opened::before { + content: ''; + border-top: 1px solid #CCC; + width: calc(100% + 13px); + position: absolute; + top: 16px; + left: -5px; +} + +.aios-toggle-advanced-options.opened span.dashicons { + transform: rotate(180deg); +} + +.aios-toggle-advanced-options.opened .aios-toggle-advanced-options__text-hide { + display: inline-block; +} + +.aios-toggle-advanced-options.opened .aios-toggle-advanced-options__text-show { + display: none; +} + +.aios-toggle-advanced-options .aios-toggle-advanced-options__text-show { + display: inline-block; +} + +.aios-toggle-advanced-options .aios-toggle-advanced-options__text-hide { + display: none; +} + +.aios-advanced-options-panel { + display: none; +} + +.aios-toggle-advanced-options.opened + div.aios-advanced-options-panel { + display: block; +} + +.aios-advanced-options-panel h3 { + font-size: 14px; + display: inline-block; +} + +.aios-advanced-options-panel span.dashicons.dashicons-editor-help { + vertical-align: middle; + margin-bottom: 10px; +} + +[data-tooltip] { + cursor: pointer; + position: relative; +} + +[data-tooltip]:hover[data-tooltip]::before, [data-tooltip]:hover[data-tooltip]::after { + visibility: visible; + filter: opacity(100); + opacity: 1; + pointer-events: all; +} + +[data-tooltip]::before, [data-tooltip]::after { + visibility: hidden; + filter: opacity(0); + opacity: 0; + pointer-events: none; +} + +[data-tooltip]::before { + position: absolute; + bottom: 150%; + left: 50%; + margin-bottom: 5px; + margin-left: -110px; + padding: 12px; + width: 275px; + z-index: 9999; + border-radius: 3px; + background-color: hsla(0,0%,20%,0.95); + color: #FFF; + content: attr(data-tooltip); + text-align: center; + font-size: .85rem; + font-weight: 400; + line-height: 1.4; +} + +[data-tooltip]::after { + position: absolute; + bottom: 150%; + left: 50%; + margin-left: -5px; + width: 0; + border-top: 5px solid hsla(0,0%,20%,0.9); + border-right: 5px solid transparent; + border-left: 5px solid transparent; + content: " "; + font-size: 0; + line-height: 0; +} + +.dep-warning { + background-color: #EED202; + padding: 1.2em; + margin-right: 20px; + margin-left: 20px; + margin-top: 10px; + line-height: 1.2em; + color: #111E2A; +} + +.dep-warning span { + vertical-align: middle; +} + +@media only screen and (max-width: 782px) { + + .aiowps_next_scheduled_scan_wrapper > .aiowps_scan_btn_wrapper { + padding-top: 0; + } + + .aiowps_next_scheduled_scan_wrapper { + flex-direction: column; + } + + .aiowps_next_scheduled_scan_wrapper > div { + width: 100%; + } + + #aiowps_manual_fcd_scan { + margin: 0; + display: block; + width: 100%; + } + +} + +@media screen and (max-width: 600px) { + + .aiowps_next_scheduled_entity { + float: none; + width: 100%; + margin-bottom: 2em; + } + + .aiowps_time_now_wrapper { + margin-top: 0; + } + +} + +.details.column-details { + max-height: 100px; + overflow-y: auto; + overflow-x: hidden; + display: block; + word-wrap: break-word; +} + +.blockUI.blockOverlay.ui-widget-overlay { + background: #000; +} + +.aios_success_popup { + text-align: center; + padding-bottom: 30px; +} + +.aios_success_popup > .dashicons { + font-size: 100px; + width: 100px; + height: 100px; + line-height: 100px; + padding: 0; + border-radius: 50%; + margin-top: 30px; + display: block; + margin-left: auto; + margin-right: auto; + background: #E2E6E5; +} + +.aios_success_popup > .dashicons.dashicons-yes { + text-indent: -5px; +} + +.aios_success_popup.success > .dashicons { + color: #008000; +} + +.aios_success_popup.warning > .dashicons { + color: #888; +} + +.aios_success_popup--message { + padding: 20px; +} + +.button.aios-close-overlay .dashicons { + text-decoration: none; + font-size: 20px; + margin-left: -5px; + padding: 0; + transform: translatey(5px); +} + +.aios_saving_popup img { + animation-name: aios_blink; + animation-duration: 610ms; + animation-iteration-count: infinite; + animation-direction: alternate; + animation-timing-function: ease-out; +} + +.aios-modal-info { + text-align: justify; + display: inline-block; +} + +@keyframes aios_blink { + + from { + opacity: 1; + transform: scale(1); + } + + to { + opacity: 0.4; + transform: scale(0.85); + } + +} + +#aios_ajax_moreoptions { + max-height: 150px; /* Set the maximum height */ + overflow-y: auto; + overflow-x: hidden; + padding: 6px 10px; + margin: 4px 16px 6px 16px; +} + +.aios_password_meter { + width: 100%; +} + +.aios_meter_bar { + width: 40%; + background-color: #EEE; + border-radius: 10px; + overflow: hidden; + height: 10px; + margin: 10px 10px 0 0; +} + +#aios_meter_fill { + height: 100%; + width: 0; + background-color: #F00; + border-radius: 5px; + transition: width 0.5s ease-in-out; +} + +#aiowps_password_test { + width: 40%; +} + +.simbaotp_qr_container img { + border-collapse: collapse; + max-width: 150px; + width: 100%; + max-height: 150px; +} + +.aiowps-postbox-container { + display: flex; + background: #FFF; + border: 1px solid #D3D3D3; + padding: 5px; +} + +.aiowps-postbox-container .postbox { + border: none; + box-shadow: none; +} + +.aiowps-postbox-container h4 { + margin: 1em 0; + padding: 5px; +} + +.aiowps-postbox-container .aiowps_switch_container .aiowps_more_info_anchor { + margin: 10px 0px; + display: block; + position: relative; + width: fit-content; +} + +.aiowps-rule-list { + list-style: none; + max-height: 450px; + overflow-y: auto; + padding: 5px; + border-top: 0.5px solid #D3D3D3; + margin-bottom: 0; +} + +.aiowps-rule-list li { + padding: 5px 0px; + display: flex; + justify-content: space-between; + margin-bottom: unset; +} + +.aiowps-rule-list li .aiowps-rule-title { + cursor: pointer; + padding: 10px 5px; + border-radius: 3px; + width: 100%; +} + +.aiowps-rule-list li:not(:last-child) { + border-bottom: 0.5px solid #D3D3D3; +} + +.aiowps-rule-list li .aiowps-rule-title:hover { + background: #F8F9FA; +} + +.aiowps-active .aiowps-rule-title { + font-weight: bold; + background: #5C3682 !important; + color: #FFF !important; +} + +.aiowps-rules { + margin-right: 5px; + width: 20%; + border-right: 1px solid #D3D3D3; +} + +.aiowps-settings { + width: 80%; +} + +#aiowps-rule-search { + position: relative; + display: flex; + align-items: center; +} + +#aiowps-rule-search .aiowps-search { + flex: 1; + background-image: none; + position: relative; + padding-right: 25px; + padding-left: 25px; + display: inline-flex; + align-items: center; + align-items: -moz-center; /* phpcs:ignore Squiz.CSS.DuplicateStyleDefinition.Found -- For Mozilla */ + -webkit-align-items: center; + width: fill-available; + width: -webkit-fill-available; /* phpcs:ignore Squiz.CSS.DuplicateStyleDefinition.Found -- For Safari & Chrome */ + width: -moz-available; /* phpcs:ignore Squiz.CSS.DuplicateStyleDefinition.Found -- For Mozilla */ + max-width: fill-available; + max-width: -webkit-fill-available; /* phpcs:ignore Squiz.CSS.DuplicateStyleDefinition.Found -- For Safari & Chrome */ + max-width: -moz-available; /* phpcs:ignore Squiz.CSS.DuplicateStyleDefinition.Found -- For Mozilla */ + margin-right: 5px; +} + +#aiowps-rule-search .dashicons-search { + font-family: dashicons; + font-size: 18px; + line-height: 1; + font-weight: 400; + font-style: normal; + display: inline-block; + text-transform: none; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + position: absolute; + vertical-align: middle; + margin-right: 5px; + top: 50%; + left: 5px; + z-index: 999; + transform: translatey(-50%); +} + +#aiowps-rule-search .clear-search { + position: absolute; + right: 10px; + top: 50%; + transform: translatey(-50%); + cursor: pointer; +} + +#aiowps-rule-search .clear-search:hover { + color: #000; +} + +.aiowps-actions { + background: #FFF; + min-height: 60px; + margin-top: 0px; + border: 1px solid #D3D3D3; + border-top: none; + align-content: center; + padding-right: 15px; + text-align: right; + text-align: -webkit-right; /* phpcs:ignore Squiz.CSS.DuplicateStyleDefinition.Found -- For Safari & Chrome */ + text-align: -moz-right; /* phpcs:ignore Squiz.CSS.DuplicateStyleDefinition.Found -- For Mozilla */ + justify-content: end; + align-items: center; + display: flex; +} + +@media only screen and (max-width: 768px) { + + .aiowps-postbox-container { + flex-direction: column; + } + + .aiowps-settings { + width: 100%; + } + + .aiowps-rules { + width: 100%; + margin-bottom: 10px; + border-right: none; + border-bottom: 1px solid #D3D3D3; + } + + .aiowps-rule-list { + max-height: 390px; + } + +} + +#simba-tfa-admin-wrapper form { + padding: 10px; + position: relative; + min-width: 255px; + border: 1px solid #C3C4C7; + box-shadow: 0 1px 1px rgba(0, 0, 0, .04); + background: #FFF; +} + +.aios-data-table { + border-collapse: collapse; + width: 100%; +} + +.aios-data-table td, .aios-data-table th { + border: 1px solid #DDD; + padding: 8px; +} + +.aios-data-table tr:nth-child(even) { + background-color: #F2F2F2; +} + +.aios-data-table tr:hover { + background-color: #DDD; +} \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/css/wp-security-notices.css b/wp-content/plugins/all-in-one-wp-security-and-firewall/css/wp-security-notices.css new file mode 100755 index 00000000..88a6e74d --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/css/wp-security-notices.css @@ -0,0 +1,121 @@ +/* CSS for adverts */ + +.aiowps_notice_container { + height: auto; + overflow: hidden; +} + +.aiowps_review_notice_container { + padding: 12px; + display: flex; +} + +.aiowps_advert_button_container { + margin-bottom: 10px; + display: flex; + align-items: center; +} + +.aiowps_advert_button_container .dashicons { + margin-left: 10px; +} + +.aiowps_advert_content_left { + float: none; + width: 65px; + padding-top: 9px; + margin-right: 9px; +} + +.aiowps_advert_content_left_extra { + float: none; + width: 100px; + padding-right: 15px; + display: flex; + align-items: center; +} + +.updraft_advert_content_left img { + min-height: 72px; + min-width: 72px; +} + +.aiowps_advert_content_right { + float: none; + width: auto; + overflow: hidden; + font-size: 16px; +} + +.updraft_advert_content_right p { + font-size: 16px !important; +} + +.aiowps_advert_bottom { + margin: 10px 0; + padding: 10px; + font-size: 140%; + background-color: rgb(255, 255, 255); + border-color: #E6DB55; + border: 1px solid; + border-radius: 4px; +} + +.aiowps_advert_dismiss { + float: right; + font-size: 13px; + font-weight: normal; +} + +h3.aiowps_advert_heading { + margin-top: 5px !important; + margin-bottom: 5px !important; +} + +h4.aiowps_advert_heading { + margin-top: 2px !important; + margin-bottom: 3px !important; +} + +.aiowps_center_content { + text-align: center; + margin-bottom: 5px; +} + +.aiowps_text_center { + text-align: center; +} + +#aiowps-dashnotice #aiowps-dashnotice_wrapper ul { + list-style: disc inside; + text-indent: -18px; + margin-left: 18px; +} + +@media screen and (min-width: 560px) { + + .aiowps_advert_content_left, .aiowps_advert_content_left_extra { + float: left; + } + +} + +#aiowps-notice-logo { + border: 0; + float: right; + width: 150px; + height: auto; + margin-right: 10px; + margin-top: 10px; +} + +@media (min-width: 768px) { + + #aiowps-notice-logo { + width: 250px; + height: auto; + margin-right: 40px; + margin-top: 40px; + } + +} \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/css/wp-security-premium-upgrade.css b/wp-content/plugins/all-in-one-wp-security-and-firewall/css/wp-security-premium-upgrade.css new file mode 100755 index 00000000..afc9b5d8 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/css/wp-security-premium-upgrade.css @@ -0,0 +1,241 @@ +.aiowps_col { + display: block; + float: left; + margin: 1% 0 1% 1%; +} + +.aiowps_col:first-child { + margin-left: 0; +} + +.aiowps_half_width { + width: 48%; +} + +@media screen and (max-width: 768px) { + + .aiowps_col { + margin: 1% 0; + } + + .aiowps_half_width { + width: 100%; + } + +} + +img.addons { + display: block; + margin-left: auto; + margin-right: auto; + margin-bottom: 20px; + max-width: 40%; + max-height: 100%; +} + +.postbox.aiowps-tab-postbox { + padding: 25px; +} + +.aiowps-plugin-family__plugins { + display: -ms-flexbox; + display: flex; /* phpcs:ignore Squiz.CSS.DuplicateStyleDefinition.Found -- first definition is for IE */ + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding-left: 1px; + padding-bottom: 1px; +} + +.aiowps-plugin-family__plugin { + -ms-flex: auto; + flex: auto; + width: 100%; + padding: 30px; + box-sizing: border-box; + border: 1px solid #E3E4E7; + margin-left: -1px; + margin-bottom: -1px; +} + +@media (min-width: 782px) { + + .aiowps-plugin-family__plugin { + width: 50%; + } + + .aiowps-plugin-family__free .aiowps-plugin-family__plugin { + width: 100%; + } + +} + +@media (max-width: 1300px) { + + .aiowps-plugin-family__free .aiowps-plugin-family__plugin { + width: 50%; + } + +} + +@media (max-width: 782px) { + + .aiowps-plugin-family__free .aiowps-plugin-family__plugin { + width: 100%; + } + +} + +.aiowps_feature_cont { + width: 64.5%; +} + +.aiowps_plugin_family_cont { + width: 34.5%; +} + +@media (max-width: 1300px) { + + .aiowps_feature_cont, + .aiowps_plugin_family_cont { + width: 100%; + float: none; + margin: 0; + } + +} + +.aiowps_feature_cont header, +.aiowps_plugin_family_cont header { + padding: 20px; +} + +@media (max-width: 1300px) { + + .aiowps_feature_cont header, + .aiowps_plugin_family_cont header { + padding: 40px; + } + +} + +.aiowps_feature_cont header p, +.aiowps_plugin_family_cont header p { + margin-bottom: 0; +} + +.aiowps_feat_table, +.aiowps_feat_table td { + border: 0; + border-collapse: collapse; + background-color: #FFF; + font-size: 120%; + text-align: center; +} + +.aiowps_feat_table td { + border: 1px solid #F1F1F1; + border-bottom-width: 4px; + padding: 15px; +} + +.aiowps_feat_table td:nth-child(2), +.aiowps_feat_table td:nth-child(3) { + background: rgba(241, 241, 241, 0.38); +} + +.aiowps_feat_table p { + padding: 0 10px; + margin: 5px 0; + font-size: 13px; +} + +.aiowps_feat_table h4 { + padding-left: 10px; + margin: 5px 0; +} + +.aiowps_feat_table .dashicons { + width: 25px; + height: 25px; + font-size: 25px; + line-height: 1; +} + +.aiowps_feat_table .dashicons-yes { + color: #008000; +} + +.aiowps_feat_table .dashicons-no-alt { + color: #FD0000; +} + +.aiowps_feat_table tr td.aiowps-feature-text { + text-align: left; +} + +.aiowps_feat_table tr.aiowps-main-feature-row td { + background: #F1F1F1; + border-bottom-color: #FAFAFA; +} + +.aiowps-premium-image { + display: none; +} + +@media screen and (min-width: 720px) { + + .aiowps-premium-image { + display: block; + float: left; + padding: 16px 18px; + width: 64px; + height: auto; + } + +} + +@media screen and (min-width: 1220px) { + + .aiowps_feat_table td:nth-child(2), + .aiowps_feat_table td:nth-child(3) { + width: 110px; + } + +} + +.other-plugin-title { + text-decoration: none; +} + +@media screen and (max-width: 782px) { + + table.aiowps_feat_table { + display: block; + } + + table.aiowps_feat_table tr { + display: -ms-flexbox; + display: flex; /* phpcs:ignore Squiz.CSS.DuplicateStyleDefinition.Found -- first definition is for IE */ + -ms-flex-wrap: wrap; + flex-wrap: wrap; + } + + table.aiowps_feat_table td { + display: block; + } + + table.aiowps_feat_table td:first-child { + width: 100%; + border-bottom: 0; + } + + table.aiowps_feat_table td:not(:first-child) { + width: 50%; + box-sizing: border-box; + } + + table.aiowps_feat_table td:first-child:empty { + display: none; + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/css/wp-security-site-lockout-page.css b/wp-content/plugins/all-in-one-wp-security-and-firewall/css/wp-security-site-lockout-page.css new file mode 100755 index 00000000..05c07768 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/css/wp-security-site-lockout-page.css @@ -0,0 +1,20 @@ +body { + background-color: #404040 !important; +} + +.aiowps-site-lockout-box { + margin-right: auto; + margin-left: auto; + max-width: 800px; + margin-top: 100px; + padding: 30px; + border: 2px solid #FFE20A; +} + +.aiowps-site-lockout-msg { + color: #FFE20A; + font-size: 48px; + font-weight: bold; + text-align: center; +} + diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/aios-plugin-icon.svg b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/aios-plugin-icon.svg new file mode 100755 index 00000000..b10e4032 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/aios-plugin-icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/error.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/error.png new file mode 100755 index 00000000..cf4526e8 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/error.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/index.html b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/index.html new file mode 100755 index 00000000..e69de29b diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/info-icon.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/info-icon.png new file mode 100755 index 00000000..40d49cdb Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/info-icon.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/loading.gif b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/loading.gif new file mode 100755 index 00000000..5b33f7e5 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/loading.gif differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/black_friday.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/black_friday.png new file mode 100755 index 00000000..96beec18 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/black_friday.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/new_year.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/new_year.png new file mode 100755 index 00000000..88c14921 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/new_year.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/sale_20.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/sale_20.png new file mode 100755 index 00000000..8c30ddc8 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/sale_20.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/sale_blackfriday.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/sale_blackfriday.png new file mode 100755 index 00000000..36915c17 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/sale_blackfriday.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/sale_collection.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/sale_collection.png new file mode 100755 index 00000000..d89d0f88 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/sale_collection.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/sale_newyear.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/sale_newyear.png new file mode 100755 index 00000000..30abfbc5 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/sale_newyear.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/sale_spring.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/sale_spring.png new file mode 100755 index 00000000..aadb99c9 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/sale_spring.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/sale_summer.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/sale_summer.png new file mode 100755 index 00000000..aaf73f29 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/sale_summer.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/spring.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/spring.png new file mode 100755 index 00000000..59f50d7c Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/spring.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/summer.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/summer.png new file mode 100755 index 00000000..b66dfb78 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/notices/summer.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-icon.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-icon.png new file mode 100755 index 00000000..932f1299 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-icon.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-icon2.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-icon2.png new file mode 100755 index 00000000..f3bec023 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-icon2.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/aios-icon.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/aios-icon.png new file mode 100755 index 00000000..dd698a64 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/aios-icon.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/aios-logo.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/aios-logo.png new file mode 100755 index 00000000..56faf020 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/aios-logo.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/aios-premium.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/aios-premium.png new file mode 100755 index 00000000..1dcc19c4 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/aios-premium.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/aios_logo_wide.svg b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/aios_logo_wide.svg new file mode 100755 index 00000000..124f34c4 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/aios_logo_wide.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/easy-updates-manager-logo.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/easy-updates-manager-logo.png new file mode 100755 index 00000000..198079d0 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/easy-updates-manager-logo.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/easy-updates-manager-logo.svg b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/easy-updates-manager-logo.svg new file mode 100755 index 00000000..a54510aa --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/easy-updates-manager-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/icon-aios-rgb.svg b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/icon-aios-rgb.svg new file mode 100755 index 00000000..ba055857 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/icon-aios-rgb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/internal-link-juicer-logo-sm.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/internal-link-juicer-logo-sm.png new file mode 100755 index 00000000..255cce64 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/internal-link-juicer-logo-sm.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/internal-link-juicer-logo-sm.svg b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/internal-link-juicer-logo-sm.svg new file mode 100755 index 00000000..bde039fc --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/internal-link-juicer-logo-sm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/updraft-central.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/updraft-central.png new file mode 100755 index 00000000..6925087c Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/updraft-central.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/updraft_logo.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/updraft_logo.png new file mode 100755 index 00000000..da85de5c Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/updraft_logo.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/updraftcentral-logo.svg b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/updraftcentral-logo.svg new file mode 100755 index 00000000..09039972 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/updraftcentral-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/updraftplus-icon.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/updraftplus-icon.png new file mode 100755 index 00000000..068071df Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/updraftplus-icon.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/updraftplus_logo.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/updraftplus_logo.png new file mode 100755 index 00000000..f4b4ceae Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/updraftplus_logo.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/updraftplus_logo.svg b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/updraftplus_logo.svg new file mode 100755 index 00000000..d7f9e00a --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/updraftplus_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/wp-optimize-icon.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/wp-optimize-icon.png new file mode 100755 index 00000000..d3bbb85c Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/wp-optimize-icon.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/wp-optimize.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/wp-optimize.png new file mode 100755 index 00000000..5f2ee981 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/wp-optimize.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/wp-optimize.svg b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/wp-optimize.svg new file mode 100755 index 00000000..4f23a1a1 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/wp-optimize.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/wp-overnight-sm.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/wp-overnight-sm.png new file mode 100755 index 00000000..55151984 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/wp-overnight-sm.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/wpgetapi-sm.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/wpgetapi-sm.png new file mode 100755 index 00000000..75bbee3c Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/plugin-logos/wpgetapi-sm.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/shield-info-icon-36.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/shield-info-icon-36.png new file mode 100755 index 00000000..cb2fc9a0 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/shield-info-icon-36.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/shield-security-icon-36.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/shield-security-icon-36.png new file mode 100755 index 00000000..1b81dc21 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/shield-security-icon-36.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/success.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/success.png new file mode 100755 index 00000000..6bd8724f Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/success.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/images/ud_smile.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/ud_smile.png new file mode 100755 index 00000000..894ee002 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/images/ud_smile.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/blockui/jquery.blockUI.js b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/blockui/jquery.blockUI.js new file mode 100755 index 00000000..475d1370 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/blockui/jquery.blockUI.js @@ -0,0 +1,620 @@ +/*! + * jQuery blockUI plugin + * Version 2.70.0-2014.11.23 + * Requires jQuery v1.7 or later + * + * Examples at: http://malsup.com/jquery/block/ + * Copyright (c) 2007-2013 M. Alsup + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Thanks to Amir-Hossein Sobhi for some excellent contributions! + */ + +;(function() { +/*jshint eqeqeq:false curly:false latedef:false */ +"use strict"; + + function setup($) { + $.fn._fadeIn = $.fn.fadeIn; + + var noOp = $.noop || function() {}; + + // this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle + // confusing userAgent strings on Vista) + var msie = /MSIE/.test(navigator.userAgent); + var ie6 = /MSIE 6.0/.test(navigator.userAgent) && ! /MSIE 8.0/.test(navigator.userAgent); + var mode = document.documentMode || 0; + var setExpr = $.isFunction( document.createElement('div').style.setExpression ); + + // global $ methods for blocking/unblocking the entire page + $.blockUI = function(opts) { install(window, opts); }; + $.unblockUI = function(opts) { remove(window, opts); }; + + // convenience method for quick growl-like notifications (http://www.google.com/search?q=growl) + $.growlUI = function(title, message, timeout, onClose) { + var $m = $('
'); + if (title) $m.append('

'+title+'

'); + if (message) $m.append('

'+message+'

'); + if (timeout === undefined) timeout = 3000; + + // Added by konapun: Set timeout to 30 seconds if this growl is moused over, like normal toast notifications + var callBlock = function(opts) { + opts = opts || {}; + + $.blockUI({ + message: $m, + fadeIn : typeof opts.fadeIn !== 'undefined' ? opts.fadeIn : 700, + fadeOut: typeof opts.fadeOut !== 'undefined' ? opts.fadeOut : 1000, + timeout: typeof opts.timeout !== 'undefined' ? opts.timeout : timeout, + centerY: false, + showOverlay: false, + onUnblock: onClose, + css: $.blockUI.defaults.growlCSS + }); + }; + + callBlock(); + var nonmousedOpacity = $m.css('opacity'); + $m.mouseover(function() { + callBlock({ + fadeIn: 0, + timeout: 30000 + }); + + var displayBlock = $('.blockMsg'); + displayBlock.stop(); // cancel fadeout if it has started + displayBlock.fadeTo(300, 1); // make it easier to read the message by removing transparency + }).mouseout(function() { + $('.blockMsg').fadeOut(1000); + }); + // End konapun additions + }; + + // plugin method for blocking element content + $.fn.block = function(opts) { + if ( this[0] === window ) { + $.blockUI( opts ); + return this; + } + var fullOpts = $.extend({}, $.blockUI.defaults, opts || {}); + this.each(function() { + var $el = $(this); + if (fullOpts.ignoreIfBlocked && $el.data('blockUI.isBlocked')) + return; + $el.unblock({ fadeOut: 0 }); + }); + + return this.each(function() { + if ($.css(this,'position') == 'static') { + this.style.position = 'relative'; + $(this).data('blockUI.static', true); + } + this.style.zoom = 1; // force 'hasLayout' in ie + install(this, opts); + }); + }; + + // plugin method for unblocking element content + $.fn.unblock = function(opts) { + if ( this[0] === window ) { + $.unblockUI( opts ); + return this; + } + return this.each(function() { + remove(this, opts); + }); + }; + + $.blockUI.version = 2.70; // 2nd generation blocking at no extra cost! + + // override these in your code to change the default behavior and style + $.blockUI.defaults = { + // message displayed when blocking (use null for no message) + message: '

Please wait...

', + + title: null, // title string; only used when theme == true + draggable: true, // only used when theme == true (requires jquery-ui.js to be loaded) + + theme: false, // set to true to use with jQuery UI themes + + // styles for the message when blocking; if you wish to disable + // these and use an external stylesheet then do this in your code: + // $.blockUI.defaults.css = {}; + css: { + padding: 0, + margin: 0, + width: '30%', + top: '40%', + left: '35%', + textAlign: 'center', + color: '#000', + border: '3px solid #aaa', + backgroundColor:'#fff', + cursor: 'wait' + }, + + // minimal style set used when themes are used + themedCSS: { + width: '30%', + top: '40%', + left: '35%' + }, + + // styles for the overlay + overlayCSS: { + backgroundColor: '#000', + opacity: 0.6, + cursor: 'wait' + }, + + // style to replace wait cursor before unblocking to correct issue + // of lingering wait cursor + cursorReset: 'default', + + // styles applied when using $.growlUI + growlCSS: { + width: '350px', + top: '10px', + left: '', + right: '10px', + border: 'none', + padding: '5px', + opacity: 0.6, + cursor: 'default', + color: '#fff', + backgroundColor: '#000', + '-webkit-border-radius':'10px', + '-moz-border-radius': '10px', + 'border-radius': '10px' + }, + + // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w + // (hat tip to Jorge H. N. de Vasconcelos) + /*jshint scripturl:true */ + iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank', + + // force usage of iframe in non-IE browsers (handy for blocking applets) + forceIframe: false, + + // z-index for the blocking overlay + baseZ: 1000, + + // set these to true to have the message automatically centered + centerX: true, // <-- only effects element blocking (page block controlled via css above) + centerY: true, + + // allow body element to be stetched in ie6; this makes blocking look better + // on "short" pages. disable if you wish to prevent changes to the body height + allowBodyStretch: true, + + // enable if you want key and mouse events to be disabled for content that is blocked + bindEvents: true, + + // be default blockUI will supress tab navigation from leaving blocking content + // (if bindEvents is true) + constrainTabKey: true, + + // fadeIn time in millis; set to 0 to disable fadeIn on block + fadeIn: 200, + + // fadeOut time in millis; set to 0 to disable fadeOut on unblock + fadeOut: 400, + + // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock + timeout: 0, + + // disable if you don't want to show the overlay + showOverlay: true, + + // if true, focus will be placed in the first available input field when + // page blocking + focusInput: true, + + // elements that can receive focus + focusableElements: ':input:enabled:visible', + + // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity) + // no longer needed in 2012 + // applyPlatformOpacityRules: true, + + // callback method invoked when fadeIn has completed and blocking message is visible + onBlock: null, + + // callback method invoked when unblocking has completed; the callback is + // passed the element that has been unblocked (which is the window object for page + // blocks) and the options that were passed to the unblock call: + // onUnblock(element, options) + onUnblock: null, + + // callback method invoked when the overlay area is clicked. + // setting this will turn the cursor to a pointer, otherwise cursor defined in overlayCss will be used. + onOverlayClick: null, + + // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493 + quirksmodeOffsetHack: 4, + + // class name of the message block + blockMsgClass: 'blockMsg', + + // if it is already blocked, then ignore it (don't unblock and reblock) + ignoreIfBlocked: false + }; + + // private data and functions follow... + + var pageBlock = null; + var pageBlockEls = []; + + function install(el, opts) { + var css, themedCSS; + var full = (el == window); + var msg = (opts && opts.message !== undefined ? opts.message : undefined); + opts = $.extend({}, $.blockUI.defaults, opts || {}); + + if (opts.ignoreIfBlocked && $(el).data('blockUI.isBlocked')) + return; + + opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {}); + css = $.extend({}, $.blockUI.defaults.css, opts.css || {}); + if (opts.onOverlayClick) + opts.overlayCSS.cursor = 'pointer'; + + themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {}); + msg = msg === undefined ? opts.message : msg; + + // remove the current block (if there is one) + if (full && pageBlock) + remove(window, {fadeOut:0}); + + // if an existing element is being used as the blocking content then we capture + // its current place in the DOM (and current display style) so we can restore + // it when we unblock + if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) { + var node = msg.jquery ? msg[0] : msg; + var data = {}; + $(el).data('blockUI.history', data); + data.el = node; + data.parent = node.parentNode; + data.display = node.style.display; + data.position = node.style.position; + if (data.parent) + data.parent.removeChild(node); + } + + $(el).data('blockUI.onUnblock', opts.onUnblock); + var z = opts.baseZ; + + // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform; + // layer1 is the iframe layer which is used to supress bleed through of underlying content + // layer2 is the overlay layer which has opacity and a wait cursor (by default) + // layer3 is the message content that is displayed while blocking + var lyr1, lyr2, lyr3, s; + if (msie || opts.forceIframe) + lyr1 = $(''); + else + lyr1 = $(''); + + if (opts.theme) + lyr2 = $(''); + else + lyr2 = $(''); + + if (opts.theme && full) { + s = ''; + } + else if (opts.theme) { + s = ''; + } + else if (full) { + s = ''; + } + else { + s = ''; + } + lyr3 = $(s); + + // if we have a message, style it + if (msg) { + if (opts.theme) { + lyr3.css(themedCSS); + lyr3.addClass('ui-widget-content'); + } + else + lyr3.css(css); + } + + // style the overlay + if (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/) + lyr2.css(opts.overlayCSS); + lyr2.css('position', full ? 'fixed' : 'absolute'); + + // make iframe layer transparent in IE + if (msie || opts.forceIframe) + lyr1.css('opacity',0.0); + + //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el); + var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el); + $.each(layers, function() { + this.appendTo($par); + }); + + if (opts.theme && opts.draggable && $.fn.draggable) { + lyr3.draggable({ + handle: '.ui-dialog-titlebar', + cancel: 'li' + }); + } + + // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling) + var expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0); + if (ie6 || expr) { + // give body 100% height + if (full && opts.allowBodyStretch && $.support.boxModel) + $('html,body').css('height','100%'); + + // fix ie6 issue when blocked element has a border width + if ((ie6 || !$.support.boxModel) && !full) { + var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth'); + var fixT = t ? '(0 - '+t+')' : 0; + var fixL = l ? '(0 - '+l+')' : 0; + } + + // simulate fixed position + $.each(layers, function(i,o) { + var s = o[0].style; + s.position = 'absolute'; + if (i < 2) { + if (full) + s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"'); + else + s.setExpression('height','this.parentNode.offsetHeight + "px"'); + if (full) + s.setExpression('width','jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"'); + else + s.setExpression('width','this.parentNode.offsetWidth + "px"'); + if (fixL) s.setExpression('left', fixL); + if (fixT) s.setExpression('top', fixT); + } + else if (opts.centerY) { + if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"'); + s.marginTop = 0; + } + else if (!opts.centerY && full) { + var top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0; + var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"'; + s.setExpression('top',expression); + } + }); + } + + // show the message + if (msg) { + if (opts.theme) + lyr3.find('.ui-widget-content').append(msg); + else + lyr3.append(msg); + if (msg.jquery || msg.nodeType) + $(msg).show(); + } + + if ((msie || opts.forceIframe) && opts.showOverlay) + lyr1.show(); // opacity is zero + if (opts.fadeIn) { + var cb = opts.onBlock ? opts.onBlock : noOp; + var cb1 = (opts.showOverlay && !msg) ? cb : noOp; + var cb2 = msg ? cb : noOp; + if (opts.showOverlay) + lyr2._fadeIn(opts.fadeIn, cb1); + if (msg) + lyr3._fadeIn(opts.fadeIn, cb2); + } + else { + if (opts.showOverlay) + lyr2.show(); + if (msg) + lyr3.show(); + if (opts.onBlock) + opts.onBlock.bind(lyr3)(); + } + + // bind key and mouse events + bind(1, el, opts); + + if (full) { + pageBlock = lyr3[0]; + pageBlockEls = $(opts.focusableElements,pageBlock); + if (opts.focusInput) + setTimeout(focus, 20); + } + else + center(lyr3[0], opts.centerX, opts.centerY); + + if (opts.timeout) { + // auto-unblock + var to = setTimeout(function() { + if (full) + $.unblockUI(opts); + else + $(el).unblock(opts); + }, opts.timeout); + $(el).data('blockUI.timeout', to); + } + } + + // remove the block + function remove(el, opts) { + var count; + var full = (el == window); + var $el = $(el); + var data = $el.data('blockUI.history'); + var to = $el.data('blockUI.timeout'); + if (to) { + clearTimeout(to); + $el.removeData('blockUI.timeout'); + } + opts = $.extend({}, $.blockUI.defaults, opts || {}); + bind(0, el, opts); // unbind events + + if (opts.onUnblock === null) { + opts.onUnblock = $el.data('blockUI.onUnblock'); + $el.removeData('blockUI.onUnblock'); + } + + var els; + if (full) // crazy selector to handle odd field errors in ie6/7 + els = $('body').children().filter('.blockUI').add('body > .blockUI'); + else + els = $el.find('>.blockUI'); + + // fix cursor issue + if ( opts.cursorReset ) { + if ( els.length > 1 ) + els[1].style.cursor = opts.cursorReset; + if ( els.length > 2 ) + els[2].style.cursor = opts.cursorReset; + } + + if (full) + pageBlock = pageBlockEls = null; + + if (opts.fadeOut) { + count = els.length; + els.stop().fadeOut(opts.fadeOut, function() { + if ( --count === 0) + reset(els,data,opts,el); + }); + } + else + reset(els, data, opts, el); + } + + // move blocking element back into the DOM where it started + function reset(els,data,opts,el) { + var $el = $(el); + if ( $el.data('blockUI.isBlocked') ) + return; + + els.each(function(i,o) { + // remove via DOM calls so we don't lose event handlers + if (this.parentNode) + this.parentNode.removeChild(this); + }); + + if (data && data.el) { + data.el.style.display = data.display; + data.el.style.position = data.position; + data.el.style.cursor = 'default'; // #59 + if (data.parent) + data.parent.appendChild(data.el); + $el.removeData('blockUI.history'); + } + + if ($el.data('blockUI.static')) { + $el.css('position', 'static'); // #22 + } + + if (typeof opts.onUnblock == 'function') + opts.onUnblock(el,opts); + + // fix issue in Safari 6 where block artifacts remain until reflow + var body = $(document.body), w = body.width(), cssW = body[0].style.width; + body.width(w-1).width(w); + body[0].style.width = cssW; + } + + // bind/unbind the handler + function bind(b, el, opts) { + var full = el == window, $el = $(el); + + // don't bother unbinding if there is nothing to unbind + if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked'))) + return; + + $el.data('blockUI.isBlocked', b); + + // don't bind events when overlay is not in use or if bindEvents is false + if (!full || !opts.bindEvents || (b && !opts.showOverlay)) + return; + + // bind anchors and inputs for mouse and key events + var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove'; + if (b) + $(document).bind(events, opts, handler); + else + $(document).unbind(events, handler); + + // former impl... + // var $e = $('a,:input'); + // b ? $e.bind(events, opts, handler) : $e.unbind(events, handler); + } + + // event handler to suppress keyboard/mouse events when blocking + function handler(e) { + // allow tab navigation (conditionally) + if (e.type === 'keydown' && e.keyCode && e.keyCode == 9) { + if (pageBlock && e.data.constrainTabKey) { + var els = pageBlockEls; + var fwd = !e.shiftKey && e.target === els[els.length-1]; + var back = e.shiftKey && e.target === els[0]; + if (fwd || back) { + setTimeout(function(){focus(back);},10); + return false; + } + } + } + var opts = e.data; + var target = $(e.target); + if (target.hasClass('blockOverlay') && opts.onOverlayClick) + opts.onOverlayClick(e); + + // allow events within the message content + if (target.parents('div.' + opts.blockMsgClass).length > 0) + return true; + + // allow events for content that is not being blocked + return target.parents().children().filter('div.blockUI').length === 0; + } + + function focus(back) { + if (!pageBlockEls) + return; + var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0]; + if (e) + e.focus(); + } + + function center(el, x, y) { + var p = el.parentNode, s = el.style; + var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth'); + var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth'); + if (x) s.left = l > 0 ? (l+'px') : '0'; + if (y) s.top = t > 0 ? (t+'px') : '0'; + } + + function sz(el, p) { + return parseInt($.css(el,p),10)||0; + } + + } + + + /*global define:true */ + if (typeof define === 'function' && define.amd && define.amd.jQuery) { + define(['jquery'], setup); + } else { + setup(jQuery); + } + +})(); diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/chartjs/Chart.bundle.min.js b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/chartjs/Chart.bundle.min.js new file mode 100755 index 00000000..7134d267 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/chartjs/Chart.bundle.min.js @@ -0,0 +1,7 @@ +/*! + * Chart.js v2.9.4 + * https://www.chartjs.org + * (c) 2020 Chart.js Contributors + * Released under the MIT License + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Chart=e()}(this,(function(){"use strict";"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function t(){throw new Error("Dynamic requires are not currently supported by rollup-plugin-commonjs")}function e(t,e){return t(e={exports:{}},e.exports),e.exports}var n={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},i=e((function(t){var e={};for(var i in n)n.hasOwnProperty(i)&&(e[n[i]]=i);var a=t.exports={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};for(var r in a)if(a.hasOwnProperty(r)){if(!("channels"in a[r]))throw new Error("missing channels property: "+r);if(!("labels"in a[r]))throw new Error("missing channel labels property: "+r);if(a[r].labels.length!==a[r].channels)throw new Error("channel and label counts mismatch: "+r);var o=a[r].channels,s=a[r].labels;delete a[r].channels,delete a[r].labels,Object.defineProperty(a[r],"channels",{value:o}),Object.defineProperty(a[r],"labels",{value:s})}a.rgb.hsl=function(t){var e,n,i=t[0]/255,a=t[1]/255,r=t[2]/255,o=Math.min(i,a,r),s=Math.max(i,a,r),l=s-o;return s===o?e=0:i===s?e=(a-r)/l:a===s?e=2+(r-i)/l:r===s&&(e=4+(i-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),n=(o+s)/2,[e,100*(s===o?0:n<=.5?l/(s+o):l/(2-s-o)),100*n]},a.rgb.hsv=function(t){var e,n,i,a,r,o=t[0]/255,s=t[1]/255,l=t[2]/255,u=Math.max(o,s,l),d=u-Math.min(o,s,l),h=function(t){return(u-t)/6/d+.5};return 0===d?a=r=0:(r=d/u,e=h(o),n=h(s),i=h(l),o===u?a=i-n:s===u?a=1/3+e-i:l===u&&(a=2/3+n-e),a<0?a+=1:a>1&&(a-=1)),[360*a,100*r,100*u]},a.rgb.hwb=function(t){var e=t[0],n=t[1],i=t[2];return[a.rgb.hsl(t)[0],100*(1/255*Math.min(e,Math.min(n,i))),100*(i=1-1/255*Math.max(e,Math.max(n,i)))]},a.rgb.cmyk=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255;return[100*((1-n-(e=Math.min(1-n,1-i,1-a)))/(1-e)||0),100*((1-i-e)/(1-e)||0),100*((1-a-e)/(1-e)||0),100*e]},a.rgb.keyword=function(t){var i=e[t];if(i)return i;var a,r,o,s=1/0;for(var l in n)if(n.hasOwnProperty(l)){var u=n[l],d=(r=t,o=u,Math.pow(r[0]-o[0],2)+Math.pow(r[1]-o[1],2)+Math.pow(r[2]-o[2],2));d.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.1805*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]},a.rgb.lab=function(t){var e=a.rgb.xyz(t),n=e[0],i=e[1],r=e[2];return i/=100,r/=108.883,n=(n/=95.047)>.008856?Math.pow(n,1/3):7.787*n+16/116,[116*(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116)-16,500*(n-i),200*(i-(r=r>.008856?Math.pow(r,1/3):7.787*r+16/116))]},a.hsl.rgb=function(t){var e,n,i,a,r,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0===s)return[r=255*l,r,r];e=2*l-(n=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var u=0;u<3;u++)(i=o+1/3*-(u-1))<0&&i++,i>1&&i--,r=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*r;return a},a.hsl.hsv=function(t){var e=t[0],n=t[1]/100,i=t[2]/100,a=n,r=Math.max(i,.01);return n*=(i*=2)<=1?i:2-i,a*=r<=1?r:2-r,[e,100*(0===i?2*a/(r+a):2*n/(i+n)),100*((i+n)/2)]},a.hsv.rgb=function(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,r=e-Math.floor(e),o=255*i*(1-n),s=255*i*(1-n*r),l=255*i*(1-n*(1-r));switch(i*=255,a){case 0:return[i,l,o];case 1:return[s,i,o];case 2:return[o,i,l];case 3:return[o,s,i];case 4:return[l,o,i];case 5:return[i,o,s]}},a.hsv.hsl=function(t){var e,n,i,a=t[0],r=t[1]/100,o=t[2]/100,s=Math.max(o,.01);return i=(2-r)*o,n=r*s,[a,100*(n=(n/=(e=(2-r)*s)<=1?e:2-e)||0),100*(i/=2)]},a.hwb.rgb=function(t){var e,n,i,a,r,o,s,l=t[0]/360,u=t[1]/100,d=t[2]/100,h=u+d;switch(h>1&&(u/=h,d/=h),i=6*l-(e=Math.floor(6*l)),0!=(1&e)&&(i=1-i),a=u+i*((n=1-d)-u),e){default:case 6:case 0:r=n,o=a,s=u;break;case 1:r=a,o=n,s=u;break;case 2:r=u,o=n,s=a;break;case 3:r=u,o=a,s=n;break;case 4:r=a,o=u,s=n;break;case 5:r=n,o=u,s=a}return[255*r,255*o,255*s]},a.cmyk.rgb=function(t){var e=t[0]/100,n=t[1]/100,i=t[2]/100,a=t[3]/100;return[255*(1-Math.min(1,e*(1-a)+a)),255*(1-Math.min(1,n*(1-a)+a)),255*(1-Math.min(1,i*(1-a)+a))]},a.xyz.rgb=function(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100;return n=-.9689*a+1.8758*r+.0415*o,i=.0557*a+-.204*r+1.057*o,e=(e=3.2406*a+-1.5372*r+-.4986*o)>.0031308?1.055*Math.pow(e,1/2.4)-.055:12.92*e,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:12.92*n,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:12.92*i,[255*(e=Math.min(Math.max(0,e),1)),255*(n=Math.min(Math.max(0,n),1)),255*(i=Math.min(Math.max(0,i),1))]},a.xyz.lab=function(t){var e=t[0],n=t[1],i=t[2];return n/=100,i/=108.883,e=(e/=95.047)>.008856?Math.pow(e,1/3):7.787*e+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(e-n),200*(n-(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116))]},a.lab.xyz=function(t){var e,n,i,a=t[0];e=t[1]/500+(n=(a+16)/116),i=n-t[2]/200;var r=Math.pow(n,3),o=Math.pow(e,3),s=Math.pow(i,3);return n=r>.008856?r:(n-16/116)/7.787,e=o>.008856?o:(e-16/116)/7.787,i=s>.008856?s:(i-16/116)/7.787,[e*=95.047,n*=100,i*=108.883]},a.lab.lch=function(t){var e,n=t[0],i=t[1],a=t[2];return(e=360*Math.atan2(a,i)/2/Math.PI)<0&&(e+=360),[n,Math.sqrt(i*i+a*a),e]},a.lch.lab=function(t){var e,n=t[0],i=t[1];return e=t[2]/360*2*Math.PI,[n,i*Math.cos(e),i*Math.sin(e)]},a.rgb.ansi16=function(t){var e=t[0],n=t[1],i=t[2],r=1 in arguments?arguments[1]:a.rgb.hsv(t)[2];if(0===(r=Math.round(r/50)))return 30;var o=30+(Math.round(i/255)<<2|Math.round(n/255)<<1|Math.round(e/255));return 2===r&&(o+=60),o},a.hsv.ansi16=function(t){return a.rgb.ansi16(a.hsv.rgb(t),t[2])},a.rgb.ansi256=function(t){var e=t[0],n=t[1],i=t[2];return e===n&&n===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(n/255*5)+Math.round(i/255*5)},a.ansi16.rgb=function(t){var e=t%10;if(0===e||7===e)return t>50&&(e+=3.5),[e=e/10.5*255,e,e];var n=.5*(1+~~(t>50));return[(1&e)*n*255,(e>>1&1)*n*255,(e>>2&1)*n*255]},a.ansi256.rgb=function(t){if(t>=232){var e=10*(t-232)+8;return[e,e,e]}var n;return t-=16,[Math.floor(t/36)/5*255,Math.floor((n=t%36)/6)/5*255,n%6/5*255]},a.rgb.hex=function(t){var e=(((255&Math.round(t[0]))<<16)+((255&Math.round(t[1]))<<8)+(255&Math.round(t[2]))).toString(16).toUpperCase();return"000000".substring(e.length)+e},a.hex.rgb=function(t){var e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];var n=e[0];3===e[0].length&&(n=n.split("").map((function(t){return t+t})).join(""));var i=parseInt(n,16);return[i>>16&255,i>>8&255,255&i]},a.rgb.hcg=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255,r=Math.max(Math.max(n,i),a),o=Math.min(Math.min(n,i),a),s=r-o;return e=s<=0?0:r===n?(i-a)/s%6:r===i?2+(a-n)/s:4+(n-i)/s+4,e/=6,[360*(e%=1),100*s,100*(s<1?o/(1-s):0)]},a.hsl.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=1,a=0;return(i=n<.5?2*e*n:2*e*(1-n))<1&&(a=(n-.5*i)/(1-i)),[t[0],100*i,100*a]},a.hsv.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=e*n,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.hcg.rgb=function(t){var e=t[0]/360,n=t[1]/100,i=t[2]/100;if(0===n)return[255*i,255*i,255*i];var a,r=[0,0,0],o=e%1*6,s=o%1,l=1-s;switch(Math.floor(o)){case 0:r[0]=1,r[1]=s,r[2]=0;break;case 1:r[0]=l,r[1]=1,r[2]=0;break;case 2:r[0]=0,r[1]=1,r[2]=s;break;case 3:r[0]=0,r[1]=l,r[2]=1;break;case 4:r[0]=s,r[1]=0,r[2]=1;break;default:r[0]=1,r[1]=0,r[2]=l}return a=(1-n)*i,[255*(n*r[0]+a),255*(n*r[1]+a),255*(n*r[2]+a)]},a.hcg.hsv=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e),i=0;return n>0&&(i=e/n),[t[0],100*i,100*n]},a.hcg.hsl=function(t){var e=t[1]/100,n=t[2]/100*(1-e)+.5*e,i=0;return n>0&&n<.5?i=e/(2*n):n>=.5&&n<1&&(i=e/(2*(1-n))),[t[0],100*i,100*n]},a.hcg.hwb=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e);return[t[0],100*(n-e),100*(1-n)]},a.hwb.hcg=function(t){var e=t[1]/100,n=1-t[2]/100,i=n-e,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]},a.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]},a.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]},a.gray.hsl=a.gray.hsv=function(t){return[0,0,t[0]]},a.gray.hwb=function(t){return[0,100,t[0]]},a.gray.cmyk=function(t){return[0,0,0,t[0]]},a.gray.lab=function(t){return[t[0],0,0]},a.gray.hex=function(t){var e=255&Math.round(t[0]/100*255),n=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(n.length)+n},a.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}}));i.rgb,i.hsl,i.hsv,i.hwb,i.cmyk,i.xyz,i.lab,i.lch,i.hex,i.keyword,i.ansi16,i.ansi256,i.hcg,i.apple,i.gray;function a(t){var e=function(){for(var t={},e=Object.keys(i),n=e.length,a=0;a1&&(e=Array.prototype.slice.call(arguments));var n=t(e);if("object"==typeof n)for(var i=n.length,a=0;a1&&(e=Array.prototype.slice.call(arguments)),t(e))};return"conversion"in t&&(e.conversion=t.conversion),e}(i)}))}));var l=s,u={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},d={getRgba:h,getHsla:c,getRgb:function(t){var e=h(t);return e&&e.slice(0,3)},getHsl:function(t){var e=c(t);return e&&e.slice(0,3)},getHwb:f,getAlpha:function(t){var e=h(t);if(e)return e[3];if(e=c(t))return e[3];if(e=f(t))return e[3]},hexString:function(t,e){e=void 0!==e&&3===t.length?e:t[3];return"#"+b(t[0])+b(t[1])+b(t[2])+(e>=0&&e<1?b(Math.round(255*e)):"")},rgbString:function(t,e){if(e<1||t[3]&&t[3]<1)return g(t,e);return"rgb("+t[0]+", "+t[1]+", "+t[2]+")"},rgbaString:g,percentString:function(t,e){if(e<1||t[3]&&t[3]<1)return m(t,e);var n=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgb("+n+"%, "+i+"%, "+a+"%)"},percentaString:m,hslString:function(t,e){if(e<1||t[3]&&t[3]<1)return p(t,e);return"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"},hslaString:p,hwbString:function(t,e){void 0===e&&(e=void 0!==t[3]?t[3]:1);return"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"},keyword:function(t){return y[t.slice(0,3)]}};function h(t){if(t){var e=[0,0,0],n=1,i=t.match(/^#([a-fA-F0-9]{3,4})$/i),a="";if(i){a=(i=i[1])[3];for(var r=0;rn?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=t,i=void 0===e?.5:e,a=2*i-1,r=this.alpha()-n.alpha(),o=((a*r==-1?a:(a+r)/(1+a*r))+1)/2,s=1-o;return this.rgb(o*this.red()+s*n.red(),o*this.green()+s*n.green(),o*this.blue()+s*n.blue()).alpha(this.alpha()*i+n.alpha()*(1-i))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new _,i=this.values,a=n.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],"[object Array]"===(e={}.toString.call(t))?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return n}},_.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},_.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},_.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i=0;a--)e.call(n,t[a],a);else for(a=0;a=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),-i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n))},easeOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},easeInOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:2==(t/=.5)?1:(n||(n=.45),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),t<1?i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*-.5:i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-C.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*C.easeInBounce(2*t):.5*C.easeOutBounce(2*t-1)+.5}},P={effects:C};D.easingEffects=C;var T=Math.PI,O=T/180,A=2*T,F=T/2,I=T/4,L=2*T/3,R={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,n,i,a,r){if(r){var o=Math.min(r,a/2,i/2),s=e+o,l=n+o,u=e+i-o,d=n+a-o;t.moveTo(e,l),se.left-1e-6&&t.xe.top-1e-6&&t.y0&&this.requestAnimationFrame()},advance:function(){for(var t,e,n,i,a=this.animations,r=0;r=n?(B.callback(t.onAnimationComplete,[t],e),e.animating=!1,a.splice(r,1)):++r}},tt=B.options.resolve,et=["push","pop","shift","splice","unshift"];function nt(t,e){var n=t._chartjs;if(n){var i=n.listeners,a=i.indexOf(e);-1!==a&&i.splice(a,1),i.length>0||(et.forEach((function(e){delete t[e]})),delete t._chartjs)}}var it=function(t,e){this.initialize(t,e)};B.extend(it.prototype,{datasetElementType:null,dataElementType:null,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth"],_dataElementOptions:["backgroundColor","borderColor","borderWidth","pointStyle"],initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements(),n._type=n.getMeta().type},updateIndex:function(t){this.index=t},linkScales:function(){var t=this.getMeta(),e=this.chart,n=e.scales,i=this.getDataset(),a=e.options.scales;null!==t.xAxisID&&t.xAxisID in n&&!i.xAxisID||(t.xAxisID=i.xAxisID||a.xAxes[0].id),null!==t.yAxisID&&t.yAxisID in n&&!i.yAxisID||(t.yAxisID=i.yAxisID||a.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this._update(!0)},destroy:function(){this._data&&nt(this._data,this)},createMetaDataset:function(){var t=this.datasetElementType;return t&&new t({_chart:this.chart,_datasetIndex:this.index})},createMetaData:function(t){var e=this.dataElementType;return e&&new e({_chart:this.chart,_datasetIndex:this.index,_index:t})},addElements:function(){var t,e,n=this.getMeta(),i=this.getDataset().data||[],a=n.data;for(t=0,e=i.length;tn&&this.insertElements(n,i-n)},insertElements:function(t,e){for(var n=0;na?(r=a/e.innerRadius,t.arc(o,s,e.innerRadius-a,i+r,n-r,!0)):t.arc(o,s,a,i+Math.PI/2,n-Math.PI/2),t.closePath(),t.clip()}function st(t,e,n){var i="inner"===e.borderAlign;i?(t.lineWidth=2*e.borderWidth,t.lineJoin="round"):(t.lineWidth=e.borderWidth,t.lineJoin="bevel"),n.fullCircles&&function(t,e,n,i){var a,r=n.endAngle;for(i&&(n.endAngle=n.startAngle+rt,ot(t,n),n.endAngle=r,n.endAngle===n.startAngle&&n.fullCircles&&(n.endAngle+=rt,n.fullCircles--)),t.beginPath(),t.arc(n.x,n.y,n.innerRadius,n.startAngle+rt,n.startAngle,!0),a=0;as;)a-=rt;for(;a=o&&a<=s,u=r>=n.innerRadius&&r<=n.outerRadius;return l&&u}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t,e=this._chart.ctx,n=this._view,i="inner"===n.borderAlign?.33:0,a={x:n.x,y:n.y,innerRadius:n.innerRadius,outerRadius:Math.max(n.outerRadius-i,0),pixelMargin:i,startAngle:n.startAngle,endAngle:n.endAngle,fullCircles:Math.floor(n.circumference/rt)};if(e.save(),e.fillStyle=n.backgroundColor,e.strokeStyle=n.borderColor,a.fullCircles){for(a.endAngle=a.startAngle+rt,e.beginPath(),e.arc(a.x,a.y,a.outerRadius,a.startAngle,a.endAngle),e.arc(a.x,a.y,a.innerRadius,a.endAngle,a.startAngle,!0),e.closePath(),t=0;tt.x&&(e=yt(e,"left","right")):t.basen?n:i,r:l.right||a<0?0:a>e?e:a,b:l.bottom||r<0?0:r>n?n:r,l:l.left||o<0?0:o>e?e:o}}function _t(t,e,n){var i=null===e,a=null===n,r=!(!t||i&&a)&&bt(t);return r&&(i||e>=r.left&&e<=r.right)&&(a||n>=r.top&&n<=r.bottom)}Y._set("global",{elements:{rectangle:{backgroundColor:pt,borderColor:pt,borderSkipped:"bottom",borderWidth:0}}});var wt=X.extend({_type:"rectangle",draw:function(){var t=this._chart.ctx,e=this._view,n=function(t){var e=bt(t),n=e.right-e.left,i=e.bottom-e.top,a=xt(t,n/2,i/2);return{outer:{x:e.left,y:e.top,w:n,h:i},inner:{x:e.left+a.l,y:e.top+a.t,w:n-a.l-a.r,h:i-a.t-a.b}}}(e),i=n.outer,a=n.inner;t.fillStyle=e.backgroundColor,t.fillRect(i.x,i.y,i.w,i.h),i.w===a.w&&i.h===a.h||(t.save(),t.beginPath(),t.rect(i.x,i.y,i.w,i.h),t.clip(),t.fillStyle=e.borderColor,t.rect(a.x,a.y,a.w,a.h),t.fill("evenodd"),t.restore())},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){return _t(this._view,t,e)},inLabelRange:function(t,e){var n=this._view;return vt(n)?_t(n,t,null):_t(n,null,e)},inXRange:function(t){return _t(this._view,t,null)},inYRange:function(t){return _t(this._view,null,t)},getCenterPoint:function(){var t,e,n=this._view;return vt(n)?(t=n.x,e=(n.y+n.base)/2):(t=(n.x+n.base)/2,e=n.y),{x:t,y:e}},getArea:function(){var t=this._view;return vt(t)?t.width*Math.abs(t.y-t.base):t.height*Math.abs(t.x-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}}),kt={},Mt=lt,St=ht,Dt=mt,Ct=wt;kt.Arc=Mt,kt.Line=St,kt.Point=Dt,kt.Rectangle=Ct;var Pt=B._deprecated,Tt=B.valueOrDefault;function Ot(t,e,n){var i,a,r=n.barThickness,o=e.stackCount,s=e.pixels[t],l=B.isNullOrUndef(r)?function(t,e){var n,i,a,r,o=t._length;for(a=1,r=e.length;a0?Math.min(o,Math.abs(i-n)):o,n=i;return o}(e.scale,e.pixels):-1;return B.isNullOrUndef(r)?(i=l*n.categoryPercentage,a=n.barPercentage):(i=r*o,a=1),{chunk:i/o,ratio:a,start:s-i/2}}Y._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}}),Y._set("global",{datasets:{bar:{categoryPercentage:.8,barPercentage:.9}}});var At=at.extend({dataElementType:kt.Rectangle,_dataElementOptions:["backgroundColor","borderColor","borderSkipped","borderWidth","barPercentage","barThickness","categoryPercentage","maxBarThickness","minBarLength"],initialize:function(){var t,e,n=this;at.prototype.initialize.apply(n,arguments),(t=n.getMeta()).stack=n.getDataset().stack,t.bar=!0,e=n._getIndexScale().options,Pt("bar chart",e.barPercentage,"scales.[x/y]Axes.barPercentage","dataset.barPercentage"),Pt("bar chart",e.barThickness,"scales.[x/y]Axes.barThickness","dataset.barThickness"),Pt("bar chart",e.categoryPercentage,"scales.[x/y]Axes.categoryPercentage","dataset.categoryPercentage"),Pt("bar chart",n._getValueScale().options.minBarLength,"scales.[x/y]Axes.minBarLength","dataset.minBarLength"),Pt("bar chart",e.maxBarThickness,"scales.[x/y]Axes.maxBarThickness","dataset.maxBarThickness")},update:function(t){var e,n,i=this.getMeta().data;for(this._ruler=this.getRuler(),e=0,n=i.length;e=0&&m.min>=0?m.min:m.max,x=void 0===m.start?m.end:m.max>=0&&m.min>=0?m.max-m.min:m.min-m.max,_=g.length;if(v||void 0===v&&void 0!==b)for(i=0;i<_&&(a=g[i]).index!==t;++i)a.stack===b&&(r=void 0===(u=h._parseValue(f[a.index].data[e])).start?u.end:u.min>=0&&u.max>=0?u.max:u.min,(m.min<0&&r<0||m.max>=0&&r>0)&&(y+=r));return o=h.getPixelForValue(y),l=(s=h.getPixelForValue(y+x))-o,void 0!==p&&Math.abs(l)=0&&!c||x<0&&c?o-p:o+p),{size:l,base:o,head:s,center:s+l/2}},calculateBarIndexPixels:function(t,e,n,i){var a="flex"===i.barThickness?function(t,e,n){var i,a=e.pixels,r=a[t],o=t>0?a[t-1]:null,s=t=Nt?-Wt:b<-Nt?Wt:0)+p,x=Math.cos(b),_=Math.sin(b),w=Math.cos(y),k=Math.sin(y),M=b<=0&&y>=0||y>=Wt,S=b<=Yt&&y>=Yt||y>=Wt+Yt,D=b<=-Yt&&y>=-Yt||y>=Nt+Yt,C=b===-Nt||y>=Nt?-1:Math.min(x,x*m,w,w*m),P=D?-1:Math.min(_,_*m,k,k*m),T=M?1:Math.max(x,x*m,w,w*m),O=S?1:Math.max(_,_*m,k,k*m);u=(T-C)/2,d=(O-P)/2,h=-(T+C)/2,c=-(O+P)/2}for(i=0,a=g.length;i0&&!isNaN(t)?Wt*(Math.abs(t)/e):0},getMaxBorderWidth:function(t){var e,n,i,a,r,o,s,l,u=0,d=this.chart;if(!t)for(e=0,n=d.data.datasets.length;e(u=s>u?s:u)?l:u);return u},setHoverStyle:function(t){var e=t._model,n=t._options,i=B.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=Rt(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Rt(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Rt(n.hoverBorderWidth,n.borderWidth)},_getRingWeightOffset:function(t){for(var e=0,n=0;n0&&Bt(l[t-1]._model,s)&&(n.controlPointPreviousX=u(n.controlPointPreviousX,s.left,s.right),n.controlPointPreviousY=u(n.controlPointPreviousY,s.top,s.bottom)),t0&&(r=t.getDatasetMeta(r[0]._datasetIndex).data),r},"x-axis":function(t,e){return re(t,e,{intersect:!1})},point:function(t,e){return ne(t,te(e,t))},nearest:function(t,e,n){var i=te(e,t);n.axis=n.axis||"xy";var a=ae(n.axis);return ie(t,i,n.intersect,a)},x:function(t,e,n){var i=te(e,t),a=[],r=!1;return ee(t,(function(t){t.inXRange(i.x)&&a.push(t),t.inRange(i.x,i.y)&&(r=!0)})),n.intersect&&!r&&(a=[]),a},y:function(t,e,n){var i=te(e,t),a=[],r=!1;return ee(t,(function(t){t.inYRange(i.y)&&a.push(t),t.inRange(i.x,i.y)&&(r=!0)})),n.intersect&&!r&&(a=[]),a}}},se=B.extend;function le(t,e){return B.where(t,(function(t){return t.pos===e}))}function ue(t,e){return t.sort((function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i.index-a.index:i.weight-a.weight}))}function de(t,e,n,i){return Math.max(t[n],e[n])+Math.max(t[i],e[i])}function he(t,e,n){var i,a,r=n.box,o=t.maxPadding;if(n.size&&(t[n.pos]-=n.size),n.size=n.horizontal?r.height:r.width,t[n.pos]+=n.size,r.getPadding){var s=r.getPadding();o.top=Math.max(o.top,s.top),o.left=Math.max(o.left,s.left),o.bottom=Math.max(o.bottom,s.bottom),o.right=Math.max(o.right,s.right)}if(i=e.outerWidth-de(o,t,"left","right"),a=e.outerHeight-de(o,t,"top","bottom"),i!==t.w||a!==t.h){t.w=i,t.h=a;var l=n.horizontal?[i,t.w]:[a,t.h];return!(l[0]===l[1]||isNaN(l[0])&&isNaN(l[1]))}}function ce(t,e){var n=e.maxPadding;function i(t){var i={left:0,top:0,right:0,bottom:0};return t.forEach((function(t){i[t]=Math.max(e[t],n[t])})),i}return i(t?["left","right"]:["top","bottom"])}function fe(t,e,n){var i,a,r,o,s,l,u=[];for(i=0,a=t.length;idiv{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}"}))&&me.default||me,be="$chartjs",ye="chartjs-size-monitor",xe="chartjs-render-monitor",_e="chartjs-render-animation",we=["animationstart","webkitAnimationStart"],ke={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function Me(t,e){var n=B.getStyle(t,e),i=n&&n.match(/^(\d+)(\.\d+)?px$/);return i?Number(i[1]):void 0}var Se=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};function De(t,e,n){t.addEventListener(e,n,Se)}function Ce(t,e,n){t.removeEventListener(e,n,Se)}function Pe(t,e,n,i,a){return{type:t,chart:e,native:a||null,x:void 0!==n?n:null,y:void 0!==i?i:null}}function Te(t){var e=document.createElement("div");return e.className=t||"",e}function Oe(t,e,n){var i,a,r,o,s=t[be]||(t[be]={}),l=s.resizer=function(t){var e=Te(ye),n=Te(ye+"-expand"),i=Te(ye+"-shrink");n.appendChild(Te()),i.appendChild(Te()),e.appendChild(n),e.appendChild(i),e._reset=function(){n.scrollLeft=1e6,n.scrollTop=1e6,i.scrollLeft=1e6,i.scrollTop=1e6};var a=function(){e._reset(),t()};return De(n,"scroll",a.bind(n,"expand")),De(i,"scroll",a.bind(i,"shrink")),e}((i=function(){if(s.resizer){var i=n.options.maintainAspectRatio&&t.parentNode,a=i?i.clientWidth:0;e(Pe("resize",n)),i&&i.clientWidth0){var r=t[0];r.label?n=r.label:r.xLabel?n=r.xLabel:a>0&&r.index-1?t.split("\n"):t}function He(t){var e=Y.global;return{xPadding:t.xPadding,yPadding:t.yPadding,xAlign:t.xAlign,yAlign:t.yAlign,rtl:t.rtl,textDirection:t.textDirection,bodyFontColor:t.bodyFontColor,_bodyFontFamily:We(t.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:We(t.bodyFontStyle,e.defaultFontStyle),_bodyAlign:t.bodyAlign,bodyFontSize:We(t.bodyFontSize,e.defaultFontSize),bodySpacing:t.bodySpacing,titleFontColor:t.titleFontColor,_titleFontFamily:We(t.titleFontFamily,e.defaultFontFamily),_titleFontStyle:We(t.titleFontStyle,e.defaultFontStyle),titleFontSize:We(t.titleFontSize,e.defaultFontSize),_titleAlign:t.titleAlign,titleSpacing:t.titleSpacing,titleMarginBottom:t.titleMarginBottom,footerFontColor:t.footerFontColor,_footerFontFamily:We(t.footerFontFamily,e.defaultFontFamily),_footerFontStyle:We(t.footerFontStyle,e.defaultFontStyle),footerFontSize:We(t.footerFontSize,e.defaultFontSize),_footerAlign:t.footerAlign,footerSpacing:t.footerSpacing,footerMarginTop:t.footerMarginTop,caretSize:t.caretSize,cornerRadius:t.cornerRadius,backgroundColor:t.backgroundColor,opacity:0,legendColorBackground:t.multiKeyBackground,displayColors:t.displayColors,borderColor:t.borderColor,borderWidth:t.borderWidth}}function Be(t,e){return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-t.xPadding:t.x+t.xPadding}function je(t){return Ee([],Ve(t))}var Ue=X.extend({initialize:function(){this._model=He(this._options),this._lastActive=[]},getTitle:function(){var t=this,e=t._options,n=e.callbacks,i=n.beforeTitle.apply(t,arguments),a=n.title.apply(t,arguments),r=n.afterTitle.apply(t,arguments),o=[];return o=Ee(o,Ve(i)),o=Ee(o,Ve(a)),o=Ee(o,Ve(r))},getBeforeBody:function(){return je(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(t,e){var n=this,i=n._options.callbacks,a=[];return B.each(t,(function(t){var r={before:[],lines:[],after:[]};Ee(r.before,Ve(i.beforeLabel.call(n,t,e))),Ee(r.lines,i.label.call(n,t,e)),Ee(r.after,Ve(i.afterLabel.call(n,t,e))),a.push(r)})),a},getAfterBody:function(){return je(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var t=this,e=t._options.callbacks,n=e.beforeFooter.apply(t,arguments),i=e.footer.apply(t,arguments),a=e.afterFooter.apply(t,arguments),r=[];return r=Ee(r,Ve(n)),r=Ee(r,Ve(i)),r=Ee(r,Ve(a))},update:function(t){var e,n,i,a,r,o,s,l,u,d,h=this,c=h._options,f=h._model,g=h._model=He(c),m=h._active,p=h._data,v={xAlign:f.xAlign,yAlign:f.yAlign},b={x:f.x,y:f.y},y={width:f.width,height:f.height},x={x:f.caretX,y:f.caretY};if(m.length){g.opacity=1;var _=[],w=[];x=ze[c.position].call(h,m,h._eventPosition);var k=[];for(e=0,n=m.length;ei.width&&(a=i.width-e.width),a<0&&(a=0)),"top"===d?r+=h:r-="bottom"===d?e.height+h:e.height/2,"center"===d?"left"===u?a+=h:"right"===u&&(a-=h):"left"===u?a-=c:"right"===u&&(a+=c),{x:a,y:r}}(g,y,v=function(t,e){var n,i,a,r,o,s=t._model,l=t._chart,u=t._chart.chartArea,d="center",h="center";s.yl.height-e.height&&(h="bottom");var c=(u.left+u.right)/2,f=(u.top+u.bottom)/2;"center"===h?(n=function(t){return t<=c},i=function(t){return t>c}):(n=function(t){return t<=e.width/2},i=function(t){return t>=l.width-e.width/2}),a=function(t){return t+e.width+s.caretSize+s.caretPadding>l.width},r=function(t){return t-e.width-s.caretSize-s.caretPadding<0},o=function(t){return t<=f?"top":"bottom"},n(s.x)?(d="left",a(s.x)&&(d="center",h=o(s.y))):i(s.x)&&(d="right",r(s.x)&&(d="center",h=o(s.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:d,yAlign:g.yAlign?g.yAlign:h}}(this,y),h._chart)}else g.opacity=0;return g.xAlign=v.xAlign,g.yAlign=v.yAlign,g.x=b.x,g.y=b.y,g.width=y.width,g.height=y.height,g.caretX=x.x,g.caretY=x.y,h._model=g,t&&c.custom&&c.custom.call(h,g),h},drawCaret:function(t,e){var n=this._chart.ctx,i=this._view,a=this.getCaretPosition(t,e,i);n.lineTo(a.x1,a.y1),n.lineTo(a.x2,a.y2),n.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,n){var i,a,r,o,s,l,u=n.caretSize,d=n.cornerRadius,h=n.xAlign,c=n.yAlign,f=t.x,g=t.y,m=e.width,p=e.height;if("center"===c)s=g+p/2,"left"===h?(a=(i=f)-u,r=i,o=s+u,l=s-u):(a=(i=f+m)+u,r=i,o=s-u,l=s+u);else if("left"===h?(i=(a=f+d+u)-u,r=a+u):"right"===h?(i=(a=f+m-d-u)-u,r=a+u):(i=(a=n.caretX)-u,r=a+u),"top"===c)s=(o=g)-u,l=o;else{s=(o=g+p)+u,l=o;var v=r;r=i,i=v}return{x1:i,x2:a,x3:r,y1:o,y2:s,y3:l}},drawTitle:function(t,e,n){var i,a,r,o=e.title,s=o.length;if(s){var l=Ye(e.rtl,e.x,e.width);for(t.x=Be(e,e._titleAlign),n.textAlign=l.textAlign(e._titleAlign),n.textBaseline="middle",i=e.titleFontSize,a=e.titleSpacing,n.fillStyle=e.titleFontColor,n.font=B.fontString(i,e._titleFontStyle,e._titleFontFamily),r=0;r0&&n.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,r=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&r&&(t.save(),t.globalAlpha=a,this.drawBackground(i,e,t,n),i.y+=e.yPadding,B.rtl.overrideTextDirection(t,e.textDirection),this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),B.rtl.restoreTextDirection(t,e.textDirection),t.restore())}},handleEvent:function(t){var e,n=this,i=n._options;return n._lastActive=n._lastActive||[],"mouseout"===t.type?n._active=[]:(n._active=n._chart.getElementsAtEventForMode(t,i.mode,i),i.reverse&&n._active.reverse()),(e=!B.arrayEquals(n._active,n._lastActive))&&(n._lastActive=n._active,(i.enabled||i.custom)&&(n._eventPosition={x:t.x,y:t.y},n.update(!0),n.pivot())),e}}),Ge=ze,qe=Ue;qe.positioners=Ge;var Ze=B.valueOrDefault;function $e(){return B.merge(Object.create(null),[].slice.call(arguments),{merger:function(t,e,n,i){if("xAxes"===t||"yAxes"===t){var a,r,o,s=n[t].length;for(e[t]||(e[t]=[]),a=0;a=e[t].length&&e[t].push({}),!e[t][a].type||o.type&&o.type!==e[t][a].type?B.merge(e[t][a],[Ne.getScaleDefaults(r),o]):B.merge(e[t][a],o)}else B._merger(t,e,n,i)}})}function Xe(){return B.merge(Object.create(null),[].slice.call(arguments),{merger:function(t,e,n,i){var a=e[t]||Object.create(null),r=n[t];"scales"===t?e[t]=$e(a,r):"scale"===t?e[t]=B.merge(a,[Ne.getScaleDefaults(r.type),r]):B._merger(t,e,n,i)}})}function Ke(t){var e=t.options;B.each(t.scales,(function(e){pe.removeBox(t,e)})),e=Xe(Y.global,Y[t.config.type],e),t.options=t.config.options=e,t.ensureScalesHaveIDs(),t.buildOrUpdateScales(),t.tooltip._options=e.tooltips,t.tooltip.initialize()}function Je(t,e,n){var i,a=function(t){return t.id===i};do{i=e+n++}while(B.findIndex(t,a)>=0);return i}function Qe(t){return"top"===t||"bottom"===t}function tn(t,e){return function(n,i){return n[t]===i[t]?n[e]-i[e]:n[t]-i[t]}}Y._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var en=function(t,e){return this.construct(t,e),this};B.extend(en.prototype,{construct:function(t,e){var n=this;e=function(t){var e=(t=t||Object.create(null)).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=Xe(Y.global,Y[t.type],t.options||{}),t}(e);var i=Le.acquireContext(t,e),a=i&&i.canvas,r=a&&a.height,o=a&&a.width;n.id=B.uid(),n.ctx=i,n.canvas=a,n.config=e,n.width=o,n.height=r,n.aspectRatio=r?o/r:null,n.options=e.options,n._bufferedRender=!1,n._layers=[],n.chart=n,n.controller=n,en.instances[n.id]=n,Object.defineProperty(n,"data",{get:function(){return n.config.data},set:function(t){n.config.data=t}}),i&&a?(n.initialize(),n.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return Re.notify(t,"beforeInit"),B.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.initToolTip(),Re.notify(t,"afterInit"),t},clear:function(){return B.canvas.clear(this),this},stop:function(){return Q.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,a=n.maintainAspectRatio&&e.aspectRatio||null,r=Math.max(0,Math.floor(B.getMaximumWidth(i))),o=Math.max(0,Math.floor(a?r/a:B.getMaximumHeight(i)));if((e.width!==r||e.height!==o)&&(i.width=e.width=r,i.height=e.height=o,i.style.width=r+"px",i.style.height=o+"px",B.retinaScale(e,n.devicePixelRatio),!t)){var s={width:r,height:o};Re.notify(e,"resize",[s]),n.onResize&&n.onResize(e,s),e.stop(),e.update({duration:n.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;B.each(e.xAxes,(function(t,n){t.id||(t.id=Je(e.xAxes,"x-axis-",n))})),B.each(e.yAxes,(function(t,n){t.id||(t.id=Je(e.yAxes,"y-axis-",n))})),n&&(n.id=n.id||"scale")},buildOrUpdateScales:function(){var t=this,e=t.options,n=t.scales||{},i=[],a=Object.keys(n).reduce((function(t,e){return t[e]=!1,t}),{});e.scales&&(i=i.concat((e.scales.xAxes||[]).map((function(t){return{options:t,dtype:"category",dposition:"bottom"}})),(e.scales.yAxes||[]).map((function(t){return{options:t,dtype:"linear",dposition:"left"}})))),e.scale&&i.push({options:e.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),B.each(i,(function(e){var i=e.options,r=i.id,o=Ze(i.type,e.dtype);Qe(i.position)!==Qe(e.dposition)&&(i.position=e.dposition),a[r]=!0;var s=null;if(r in n&&n[r].type===o)(s=n[r]).options=i,s.ctx=t.ctx,s.chart=t;else{var l=Ne.getScaleConstructor(o);if(!l)return;s=new l({id:r,type:o,options:i,ctx:t.ctx,chart:t}),n[s.id]=s}s.mergeTicksOptions(),e.isDefault&&(t.scale=s)})),B.each(a,(function(t,e){t||delete n[e]})),t.scales=n,Ne.addScalesToLayout(this)},buildOrUpdateControllers:function(){var t,e,n=this,i=[],a=n.data.datasets;for(t=0,e=a.length;t=0;--n)this.drawDataset(e[n],t);Re.notify(this,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var n={meta:t,index:t.index,easingValue:e};!1!==Re.notify(this,"beforeDatasetDraw",[n])&&(t.controller.draw(e),Re.notify(this,"afterDatasetDraw",[n]))},_drawTooltip:function(t){var e=this.tooltip,n={tooltip:e,easingValue:t};!1!==Re.notify(this,"beforeTooltipDraw",[n])&&(e.draw(),Re.notify(this,"afterTooltipDraw",[n]))},getElementAtEvent:function(t){return oe.modes.single(this,t)},getElementsAtEvent:function(t){return oe.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return oe.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,n){var i=oe.modes[e];return"function"==typeof i?i(this,t,n):[]},getDatasetAtEvent:function(t){return oe.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this.data.datasets[t];e._meta||(e._meta={});var n=e._meta[this.id];return n||(n=e._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e.order||0,index:t}),n},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e3?n[2]-n[1]:n[1]-n[0];Math.abs(i)>1&&t!==Math.floor(t)&&(i=t-Math.floor(t));var a=B.log10(Math.abs(i)),r="";if(0!==t)if(Math.max(Math.abs(n[0]),Math.abs(n[n.length-1]))<1e-4){var o=B.log10(Math.abs(t)),s=Math.floor(o)-Math.floor(a);s=Math.max(Math.min(s,20),0),r=t.toExponential(s)}else{var l=-1*Math.floor(a);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r},logarithmic:function(t,e,n){var i=t/Math.pow(10,Math.floor(B.log10(t)));return 0===t?"0":1===i||2===i||5===i||0===e||e===n.length-1?t.toExponential():""}}},ln=B.isArray,un=B.isNullOrUndef,dn=B.valueOrDefault,hn=B.valueAtIndexOrDefault;function cn(t,e,n){var i,a=t.getTicks().length,r=Math.min(e,a-1),o=t.getPixelForTick(r),s=t._startPixel,l=t._endPixel;if(!(n&&(i=1===a?Math.max(o-s,l-o):0===e?(t.getPixelForTick(1)-o)/2:(o-t.getPixelForTick(r-1))/2,(o+=rl+1e-6)))return o}function fn(t,e,n,i){var a,r,o,s,l,u,d,h,c,f,g,m,p,v=n.length,b=[],y=[],x=[],_=0,w=0;for(a=0;ae){for(n=0;n=c||d<=1||!s.isHorizontal()?s.labelRotation=h:(e=(t=s._getLabelSizes()).widest.width,n=t.highest.height-t.highest.offset,i=Math.min(s.maxWidth,s.chart.width-e),e+6>(a=l.offset?s.maxWidth/d:i/(d-1))&&(a=i/(d-(l.offset?.5:1)),r=s.maxHeight-gn(l.gridLines)-u.padding-mn(l.scaleLabel),o=Math.sqrt(e*e+n*n),f=B.toDegrees(Math.min(Math.asin(Math.min((t.highest.height+6)/a,1)),Math.asin(Math.min(r/o,1))-Math.asin(n/o))),f=Math.max(h,Math.min(c,f))),s.labelRotation=f)},afterCalculateTickRotation:function(){B.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){B.callback(this.options.beforeFit,[this])},fit:function(){var t=this,e=t.minSize={width:0,height:0},n=t.chart,i=t.options,a=i.ticks,r=i.scaleLabel,o=i.gridLines,s=t._isVisible(),l="bottom"===i.position,u=t.isHorizontal();if(u?e.width=t.maxWidth:s&&(e.width=gn(o)+mn(r)),u?s&&(e.height=gn(o)+mn(r)):e.height=t.maxHeight,a.display&&s){var d=vn(a),h=t._getLabelSizes(),c=h.first,f=h.last,g=h.widest,m=h.highest,p=.4*d.minor.lineHeight,v=a.padding;if(u){var b=0!==t.labelRotation,y=B.toRadians(t.labelRotation),x=Math.cos(y),_=Math.sin(y),w=_*g.width+x*(m.height-(b?m.offset:0))+(b?0:p);e.height=Math.min(t.maxHeight,e.height+w+v);var k,M,S=t.getPixelForTick(0)-t.left,D=t.right-t.getPixelForTick(t.getTicks().length-1);b?(k=l?x*c.width+_*c.offset:_*(c.height-c.offset),M=l?_*(f.height-f.offset):x*f.width+_*f.offset):(k=c.width/2,M=f.width/2),t.paddingLeft=Math.max((k-S)*t.width/(t.width-S),0)+3,t.paddingRight=Math.max((M-D)*t.width/(t.width-D),0)+3}else{var C=a.mirror?0:g.width+v+p;e.width=Math.min(t.maxWidth,e.width+C),t.paddingTop=c.height/2,t.paddingBottom=f.height/2}}t.handleMargins(),u?(t.width=t._length=n.width-t.margins.left-t.margins.right,t.height=e.height):(t.width=e.width,t.height=t._length=n.height-t.margins.top-t.margins.bottom)},handleMargins:function(){var t=this;t.margins&&(t.margins.left=Math.max(t.paddingLeft,t.margins.left),t.margins.top=Math.max(t.paddingTop,t.margins.top),t.margins.right=Math.max(t.paddingRight,t.margins.right),t.margins.bottom=Math.max(t.paddingBottom,t.margins.bottom))},afterFit:function(){B.callback(this.options.afterFit,[this])},isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(un(t))return NaN;if(("number"==typeof t||t instanceof Number)&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},_convertTicksToLabels:function(t){var e,n,i,a=this;for(a.ticks=t.map((function(t){return t.value})),a.beforeTickToLabelConversion(),e=a.convertTicksToLabels(t)||a.ticks,a.afterTickToLabelConversion(),n=0,i=t.length;nn-1?null:this.getPixelForDecimal(t*i+(e?i/2:0))},getPixelForDecimal:function(t){return this._reversePixels&&(t=1-t),this._startPixel+t*this._length},getDecimalForPixel:function(t){var e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this.min,e=this.max;return this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0},_autoSkip:function(t){var e,n,i,a,r=this.options.ticks,o=this._length,s=r.maxTicksLimit||o/this._tickSize()+1,l=r.major.enabled?function(t){var e,n,i=[];for(e=0,n=t.length;es)return function(t,e,n){var i,a,r=0,o=e[0];for(n=Math.ceil(n),i=0;iu)return r;return Math.max(u,1)}(l,t,0,s),u>0){for(e=0,n=u-1;e1?(h-d)/(u-1):null,yn(t,i,B.isNullOrUndef(a)?0:d-a,d),yn(t,i,h,B.isNullOrUndef(a)?t.length:h+a),bn(t)}return yn(t,i),bn(t)},_tickSize:function(){var t=this.options.ticks,e=B.toRadians(this.labelRotation),n=Math.abs(Math.cos(e)),i=Math.abs(Math.sin(e)),a=this._getLabelSizes(),r=t.autoSkipPadding||0,o=a?a.widest.width+r:0,s=a?a.highest.height+r:0;return this.isHorizontal()?s*n>o*i?o/n:s/i:s*i=0&&(o=t),void 0!==r&&(t=n.indexOf(r))>=0&&(s=t),e.minIndex=o,e.maxIndex=s,e.min=n[o],e.max=n[s]},buildTicks:function(){var t=this._getLabels(),e=this.minIndex,n=this.maxIndex;this.ticks=0===e&&n===t.length-1?t:t.slice(e,n+1)},getLabelForIndex:function(t,e){var n=this.chart;return n.getDatasetMeta(e).controller._getValueScaleId()===this.id?this.getRightValue(n.data.datasets[e].data[t]):this._getLabels()[t]},_configure:function(){var t=this,e=t.options.offset,n=t.ticks;_n.prototype._configure.call(t),t.isHorizontal()||(t._reversePixels=!t._reversePixels),n&&(t._startValue=t.minIndex-(e?.5:0),t._valueRange=Math.max(n.length-(e?0:1),1))},getPixelForValue:function(t,e,n){var i,a,r,o=this;return wn(e)||wn(n)||(t=o.chart.data.datasets[n].data[e]),wn(t)||(i=o.isHorizontal()?t.x:t.y),(void 0!==i||void 0!==t&&isNaN(e))&&(a=o._getLabels(),t=B.valueOrDefault(i,t),e=-1!==(r=a.indexOf(t))?r:e,isNaN(e)&&(e=t)),o.getPixelForDecimal((e-o._startValue)/o._valueRange)},getPixelForTick:function(t){var e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t],t+this.minIndex)},getValueForPixel:function(t){var e=Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange);return Math.min(Math.max(e,0),this.ticks.length-1)},getBasePixel:function(){return this.bottom}}),Mn={position:"bottom"};kn._defaults=Mn;var Sn=B.noop,Dn=B.isNullOrUndef;var Cn=_n.extend({getRightValue:function(t){return"string"==typeof t?+t:_n.prototype.getRightValue.call(this,t)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var n=B.sign(t.min),i=B.sign(t.max);n<0&&i<0?t.max=0:n>0&&i>0&&(t.min=0)}var a=void 0!==e.min||void 0!==e.suggestedMin,r=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),a!==r&&t.min>=t.max&&(a?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:function(){var t,e=this.options.ticks,n=e.stepSize,i=e.maxTicksLimit;return n?t=Math.ceil(this.max/n)-Math.floor(this.min/n)+1:(t=this._computeTickLimit(),i=i||11),i&&(t=Math.min(i,t)),t},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:Sn,buildTicks:function(){var t=this,e=t.options.ticks,n=t.getTickLimit(),i={maxTicks:n=Math.max(2,n),min:e.min,max:e.max,precision:e.precision,stepSize:B.valueOrDefault(e.fixedStepSize,e.stepSize)},a=t.ticks=function(t,e){var n,i,a,r,o=[],s=t.stepSize,l=s||1,u=t.maxTicks-1,d=t.min,h=t.max,c=t.precision,f=e.min,g=e.max,m=B.niceNum((g-f)/u/l)*l;if(m<1e-14&&Dn(d)&&Dn(h))return[f,g];(r=Math.ceil(g/m)-Math.floor(f/m))>u&&(m=B.niceNum(r*m/u/l)*l),s||Dn(c)?n=Math.pow(10,B._decimalPlaces(m)):(n=Math.pow(10,c),m=Math.ceil(m*n)/n),i=Math.floor(f/m)*m,a=Math.ceil(g/m)*m,s&&(!Dn(d)&&B.almostWhole(d/m,m/1e3)&&(i=d),!Dn(h)&&B.almostWhole(h/m,m/1e3)&&(a=h)),r=(a-i)/m,r=B.almostEquals(r,Math.round(r),m/1e3)?Math.round(r):Math.ceil(r),i=Math.round(i*n)/n,a=Math.round(a*n)/n,o.push(Dn(d)?i:d);for(var p=1;pe.length-1?null:this.getPixelForValue(e[t])}}),Fn=Pn;An._defaults=Fn;var In=B.valueOrDefault,Ln=B.math.log10;var Rn={position:"left",ticks:{callback:sn.formatters.logarithmic}};function Nn(t,e){return B.isFinite(t)&&t>=0?t:e}var Wn=_n.extend({determineDataLimits:function(){var t,e,n,i,a,r,o=this,s=o.options,l=o.chart,u=l.data.datasets,d=o.isHorizontal();function h(t){return d?t.xAxisID===o.id:t.yAxisID===o.id}o.min=Number.POSITIVE_INFINITY,o.max=Number.NEGATIVE_INFINITY,o.minNotZero=Number.POSITIVE_INFINITY;var c=s.stacked;if(void 0===c)for(t=0;t0){var e=B.min(t),n=B.max(t);o.min=Math.min(o.min,e),o.max=Math.max(o.max,n)}}))}else for(t=0;t0?t.minNotZero=t.min:t.max<1?t.minNotZero=Math.pow(10,Math.floor(Ln(t.max))):t.minNotZero=1)},buildTicks:function(){var t=this,e=t.options.ticks,n=!t.isHorizontal(),i={min:Nn(e.min),max:Nn(e.max)},a=t.ticks=function(t,e){var n,i,a=[],r=In(t.min,Math.pow(10,Math.floor(Ln(e.min)))),o=Math.floor(Ln(e.max)),s=Math.ceil(e.max/Math.pow(10,o));0===r?(n=Math.floor(Ln(e.minNotZero)),i=Math.floor(e.minNotZero/Math.pow(10,n)),a.push(r),r=i*Math.pow(10,n)):(n=Math.floor(Ln(r)),i=Math.floor(r/Math.pow(10,n)));var l=n<0?Math.pow(10,Math.abs(n)):1;do{a.push(r),10===++i&&(i=1,l=++n>=0?1:l),r=Math.round(i*Math.pow(10,n)*l)/l}while(ne.length-1?null:this.getPixelForValue(e[t])},_getFirstTickValue:function(t){var e=Math.floor(Ln(t));return Math.floor(t/Math.pow(10,e))*Math.pow(10,e)},_configure:function(){var t=this,e=t.min,n=0;_n.prototype._configure.call(t),0===e&&(e=t._getFirstTickValue(t.minNotZero),n=In(t.options.ticks.fontSize,Y.global.defaultFontSize)/t._length),t._startValue=Ln(e),t._valueOffset=n,t._valueRange=(Ln(t.max)-Ln(e))/(1-n)},getPixelForValue:function(t){var e=this,n=0;return(t=+e.getRightValue(t))>e.min&&t>0&&(n=(Ln(t)-e._startValue)/e._valueRange+e._valueOffset),e.getPixelForDecimal(n)},getValueForPixel:function(t){var e=this,n=e.getDecimalForPixel(t);return 0===n&&0===e.min?0:Math.pow(10,e._startValue+(n-e._valueOffset)*e._valueRange)}}),Yn=Rn;Wn._defaults=Yn;var zn=B.valueOrDefault,En=B.valueAtIndexOrDefault,Vn=B.options.resolve,Hn={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,borderDash:[],borderDashOffset:0},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:sn.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(t){return t}}};function Bn(t){var e=t.ticks;return e.display&&t.display?zn(e.fontSize,Y.global.defaultFontSize)+2*e.backdropPaddingY:0}function jn(t,e,n,i,a){return t===i||t===a?{start:e-n/2,end:e+n/2}:ta?{start:e-n,end:e}:{start:e,end:e+n}}function Un(t){return 0===t||180===t?"center":t<180?"left":"right"}function Gn(t,e,n,i){var a,r,o=n.y+i/2;if(B.isArray(e))for(a=0,r=e.length;a270||t<90)&&(n.y-=e.h)}function Zn(t){return B.isNumber(t)?t:0}var $n=Cn.extend({setDimensions:function(){var t=this;t.width=t.maxWidth,t.height=t.maxHeight,t.paddingTop=Bn(t.options)/2,t.xCenter=Math.floor(t.width/2),t.yCenter=Math.floor((t.height-t.paddingTop)/2),t.drawingArea=Math.min(t.height-t.paddingTop,t.width)/2},determineDataLimits:function(){var t=this,e=t.chart,n=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;B.each(e.data.datasets,(function(a,r){if(e.isDatasetVisible(r)){var o=e.getDatasetMeta(r);B.each(a.data,(function(e,a){var r=+t.getRightValue(e);isNaN(r)||o.data[a].hidden||(n=Math.min(r,n),i=Math.max(r,i))}))}})),t.min=n===Number.POSITIVE_INFINITY?0:n,t.max=i===Number.NEGATIVE_INFINITY?0:i,t.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/Bn(this.options))},convertTicksToLabels:function(){var t=this;Cn.prototype.convertTicksToLabels.call(t),t.pointLabels=t.chart.data.labels.map((function(){var e=B.callback(t.options.pointLabels.callback,arguments,t);return e||0===e?e:""}))},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t=this.options;t.display&&t.pointLabels.display?function(t){var e,n,i,a=B.options._parseFont(t.options.pointLabels),r={l:0,r:t.width,t:0,b:t.height-t.paddingTop},o={};t.ctx.font=a.string,t._pointLabelSizes=[];var s,l,u,d=t.chart.data.labels.length;for(e=0;er.r&&(r.r=f.end,o.r=h),g.startr.b&&(r.b=g.end,o.b=h)}t.setReductions(t.drawingArea,r,o)}(this):this.setCenterPoint(0,0,0,0)},setReductions:function(t,e,n){var i=this,a=e.l/Math.sin(n.l),r=Math.max(e.r-i.width,0)/Math.sin(n.r),o=-e.t/Math.cos(n.t),s=-Math.max(e.b-(i.height-i.paddingTop),0)/Math.cos(n.b);a=Zn(a),r=Zn(r),o=Zn(o),s=Zn(s),i.drawingArea=Math.min(Math.floor(t-(a+r)/2),Math.floor(t-(o+s)/2)),i.setCenterPoint(a,r,o,s)},setCenterPoint:function(t,e,n,i){var a=this,r=a.width-e-a.drawingArea,o=t+a.drawingArea,s=n+a.drawingArea,l=a.height-a.paddingTop-i-a.drawingArea;a.xCenter=Math.floor((o+r)/2+a.left),a.yCenter=Math.floor((s+l)/2+a.top+a.paddingTop)},getIndexAngle:function(t){var e=this.chart,n=(t*(360/e.data.labels.length)+((e.options||{}).startAngle||0))%360;return(n<0?n+360:n)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){var e=this;if(B.isNullOrUndef(t))return NaN;var n=e.drawingArea/(e.max-e.min);return e.options.ticks.reverse?(e.max-t)*n:(t-e.min)*n},getPointPosition:function(t,e){var n=this.getIndexAngle(t)-Math.PI/2;return{x:Math.cos(n)*e+this.xCenter,y:Math.sin(n)*e+this.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(t){var e=this.min,n=this.max;return this.getPointPositionForValue(t||0,this.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0)},_drawGrid:function(){var t,e,n,i=this,a=i.ctx,r=i.options,o=r.gridLines,s=r.angleLines,l=zn(s.lineWidth,o.lineWidth),u=zn(s.color,o.color);if(r.pointLabels.display&&function(t){var e=t.ctx,n=t.options,i=n.pointLabels,a=Bn(n),r=t.getDistanceFromCenterForValue(n.ticks.reverse?t.min:t.max),o=B.options._parseFont(i);e.save(),e.font=o.string,e.textBaseline="middle";for(var s=t.chart.data.labels.length-1;s>=0;s--){var l=0===s?a/2:0,u=t.getPointPosition(s,r+l+5),d=En(i.fontColor,s,Y.global.defaultFontColor);e.fillStyle=d;var h=t.getIndexAngle(s),c=B.toDegrees(h);e.textAlign=Un(c),qn(c,t._pointLabelSizes[s],u),Gn(e,t.pointLabels[s],u,o.lineHeight)}e.restore()}(i),o.display&&B.each(i.ticks,(function(t,n){0!==n&&(e=i.getDistanceFromCenterForValue(i.ticksAsNumbers[n]),function(t,e,n,i){var a,r=t.ctx,o=e.circular,s=t.chart.data.labels.length,l=En(e.color,i-1),u=En(e.lineWidth,i-1);if((o||s)&&l&&u){if(r.save(),r.strokeStyle=l,r.lineWidth=u,r.setLineDash&&(r.setLineDash(e.borderDash||[]),r.lineDashOffset=e.borderDashOffset||0),r.beginPath(),o)r.arc(t.xCenter,t.yCenter,n,0,2*Math.PI);else{a=t.getPointPosition(0,n),r.moveTo(a.x,a.y);for(var d=1;d=0;t--)e=i.getDistanceFromCenterForValue(r.ticks.reverse?i.min:i.max),n=i.getPointPosition(t,e),a.beginPath(),a.moveTo(i.xCenter,i.yCenter),a.lineTo(n.x,n.y),a.stroke();a.restore()}},_drawLabels:function(){var t=this,e=t.ctx,n=t.options.ticks;if(n.display){var i,a,r=t.getIndexAngle(0),o=B.options._parseFont(n),s=zn(n.fontColor,Y.global.defaultFontColor);e.save(),e.font=o.string,e.translate(t.xCenter,t.yCenter),e.rotate(r),e.textAlign="center",e.textBaseline="middle",B.each(t.ticks,(function(r,l){(0!==l||n.reverse)&&(i=t.getDistanceFromCenterForValue(t.ticksAsNumbers[l]),n.showLabelBackdrop&&(a=e.measureText(r).width,e.fillStyle=n.backdropColor,e.fillRect(-a/2-n.backdropPaddingX,-i-o.size/2-n.backdropPaddingY,a+2*n.backdropPaddingX,o.size+2*n.backdropPaddingY)),e.fillStyle=s,e.fillText(r,0,-i))})),e.restore()}},_drawTitle:B.noop}),Xn=Hn;$n._defaults=Xn;var Kn=B._deprecated,Jn=B.options.resolve,Qn=B.valueOrDefault,ti=Number.MIN_SAFE_INTEGER||-9007199254740991,ei=Number.MAX_SAFE_INTEGER||9007199254740991,ni={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ii=Object.keys(ni);function ai(t,e){return t-e}function ri(t){return B.valueOrDefault(t.time.min,t.ticks.min)}function oi(t){return B.valueOrDefault(t.time.max,t.ticks.max)}function si(t,e,n,i){var a=function(t,e,n){for(var i,a,r,o=0,s=t.length-1;o>=0&&o<=s;){if(a=t[(i=o+s>>1)-1]||null,r=t[i],!a)return{lo:null,hi:r};if(r[e]n))return{lo:a,hi:r};s=i-1}}return{lo:r,hi:null}}(t,e,n),r=a.lo?a.hi?a.lo:t[t.length-2]:t[0],o=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=o[e]-r[e],l=s?(n-r[e])/s:0,u=(o[i]-r[i])*l;return r[i]+u}function li(t,e){var n=t._adapter,i=t.options.time,a=i.parser,r=a||i.format,o=e;return"function"==typeof a&&(o=a(o)),B.isFinite(o)||(o="string"==typeof r?n.parse(o,r):n.parse(o)),null!==o?+o:(a||"function"!=typeof r||(o=r(e),B.isFinite(o)||(o=n.parse(o))),o)}function ui(t,e){if(B.isNullOrUndef(e))return null;var n=t.options.time,i=li(t,t.getRightValue(e));return null===i?i:(n.round&&(i=+t._adapter.startOf(i,n.round)),i)}function di(t,e,n,i){var a,r,o,s=ii.length;for(a=ii.indexOf(t);a=0&&(e[r].major=!0);return e}(t,r,o,n):r}var ci=_n.extend({initialize:function(){this.mergeTicksOptions(),_n.prototype.initialize.call(this)},update:function(){var t=this,e=t.options,n=e.time||(e.time={}),i=t._adapter=new on._date(e.adapters.date);return Kn("time scale",n.format,"time.format","time.parser"),Kn("time scale",n.min,"time.min","ticks.min"),Kn("time scale",n.max,"time.max","ticks.max"),B.mergeIf(n.displayFormats,i.formats()),_n.prototype.update.apply(t,arguments)},getRightValue:function(t){return t&&void 0!==t.t&&(t=t.t),_n.prototype.getRightValue.call(this,t)},determineDataLimits:function(){var t,e,n,i,a,r,o,s=this,l=s.chart,u=s._adapter,d=s.options,h=d.time.unit||"day",c=ei,f=ti,g=[],m=[],p=[],v=s._getLabels();for(t=0,n=v.length;t1?function(t){var e,n,i,a={},r=[];for(e=0,n=t.length;e1e5*u)throw e+" and "+n+" are too far apart with stepSize of "+u+" "+l;for(a=h;a=a&&n<=r&&d.push(n);return i.min=a,i.max=r,i._unit=l.unit||(s.autoSkip?di(l.minUnit,i.min,i.max,h):function(t,e,n,i,a){var r,o;for(r=ii.length-1;r>=ii.indexOf(n);r--)if(o=ii[r],ni[o].common&&t._adapter.diff(a,i,o)>=e-1)return o;return ii[n?ii.indexOf(n):0]}(i,d.length,l.minUnit,i.min,i.max)),i._majorUnit=s.major.enabled&&"year"!==i._unit?function(t){for(var e=ii.indexOf(t)+1,n=ii.length;ee&&s=0&&t0?s:1}}),fi={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};ci._defaults=fi;var gi={category:kn,linear:An,logarithmic:Wn,radialLinear:$n,time:ci},mi=e((function(e,n){e.exports=function(){var n,i;function a(){return n.apply(null,arguments)}function r(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function o(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function s(t){return void 0===t}function l(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function u(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function d(t,e){var n,i=[];for(n=0;n>>0,i=0;i0)for(n=0;n=0?n?"+":"":"-")+Math.pow(10,Math.max(0,a)).toString().substr(1)+i}var E=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,V=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,H={},B={};function j(t,e,n,i){var a=i;"string"==typeof i&&(a=function(){return this[i]()}),t&&(B[t]=a),e&&(B[e[0]]=function(){return z(a.apply(this,arguments),e[1],e[2])}),n&&(B[n]=function(){return this.localeData().ordinal(a.apply(this,arguments),t)})}function U(t,e){return t.isValid()?(e=G(e,t.localeData()),H[e]=H[e]||function(t){var e,n,i,a=t.match(E);for(e=0,n=a.length;e=0&&V.test(t);)t=t.replace(V,i),V.lastIndex=0,n-=1;return t}var q=/\d/,Z=/\d\d/,$=/\d{3}/,X=/\d{4}/,K=/[+-]?\d{6}/,J=/\d\d?/,Q=/\d\d\d\d?/,tt=/\d\d\d\d\d\d?/,et=/\d{1,3}/,nt=/\d{1,4}/,it=/[+-]?\d{1,6}/,at=/\d+/,rt=/[+-]?\d+/,ot=/Z|[+-]\d\d:?\d\d/gi,st=/Z|[+-]\d\d(?::?\d\d)?/gi,lt=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,ut={};function dt(t,e,n){ut[t]=O(e)?e:function(t,i){return t&&n?n:e}}function ht(t,e){return h(ut,t)?ut[t](e._strict,e._locale):new RegExp(ct(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,(function(t,e,n,i,a){return e||n||i||a}))))}function ct(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var ft={};function gt(t,e){var n,i=e;for("string"==typeof t&&(t=[t]),l(e)&&(i=function(t,n){n[e]=k(t)}),n=0;n68?1900:2e3)};var Pt,Tt=Ot("FullYear",!0);function Ot(t,e){return function(n){return null!=n?(Ft(this,t,n),a.updateOffset(this,e),this):At(this,t)}}function At(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function Ft(t,e,n){t.isValid()&&!isNaN(n)&&("FullYear"===e&&Ct(t.year())&&1===t.month()&&29===t.date()?t._d["set"+(t._isUTC?"UTC":"")+e](n,t.month(),It(n,t.month())):t._d["set"+(t._isUTC?"UTC":"")+e](n))}function It(t,e){if(isNaN(t)||isNaN(e))return NaN;var n=function(t,e){return(t%e+e)%e}(e,12);return t+=(e-n)/12,1===n?Ct(t)?29:28:31-n%7%2}Pt=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e=0?(s=new Date(t+400,e,n,i,a,r,o),isFinite(s.getFullYear())&&s.setFullYear(t)):s=new Date(t,e,n,i,a,r,o),s}function jt(t){var e;if(t<100&&t>=0){var n=Array.prototype.slice.call(arguments);n[0]=t+400,e=new Date(Date.UTC.apply(null,n)),isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t)}else e=new Date(Date.UTC.apply(null,arguments));return e}function Ut(t,e,n){var i=7+e-n;return-(7+jt(t,0,i).getUTCDay()-e)%7+i-1}function Gt(t,e,n,i,a){var r,o,s=1+7*(e-1)+(7+n-i)%7+Ut(t,i,a);return s<=0?o=Dt(r=t-1)+s:s>Dt(t)?(r=t+1,o=s-Dt(t)):(r=t,o=s),{year:r,dayOfYear:o}}function qt(t,e,n){var i,a,r=Ut(t.year(),e,n),o=Math.floor((t.dayOfYear()-r-1)/7)+1;return o<1?i=o+Zt(a=t.year()-1,e,n):o>Zt(t.year(),e,n)?(i=o-Zt(t.year(),e,n),a=t.year()+1):(a=t.year(),i=o),{week:i,year:a}}function Zt(t,e,n){var i=Ut(t,e,n),a=Ut(t+1,e,n);return(Dt(t)-i+a)/7}function $t(t,e){return t.slice(e,7).concat(t.slice(0,e))}j("w",["ww",2],"wo","week"),j("W",["WW",2],"Wo","isoWeek"),L("week","w"),L("isoWeek","W"),Y("week",5),Y("isoWeek",5),dt("w",J),dt("ww",J,Z),dt("W",J),dt("WW",J,Z),mt(["w","ww","W","WW"],(function(t,e,n,i){e[i.substr(0,1)]=k(t)})),j("d",0,"do","day"),j("dd",0,0,(function(t){return this.localeData().weekdaysMin(this,t)})),j("ddd",0,0,(function(t){return this.localeData().weekdaysShort(this,t)})),j("dddd",0,0,(function(t){return this.localeData().weekdays(this,t)})),j("e",0,0,"weekday"),j("E",0,0,"isoWeekday"),L("day","d"),L("weekday","e"),L("isoWeekday","E"),Y("day",11),Y("weekday",11),Y("isoWeekday",11),dt("d",J),dt("e",J),dt("E",J),dt("dd",(function(t,e){return e.weekdaysMinRegex(t)})),dt("ddd",(function(t,e){return e.weekdaysShortRegex(t)})),dt("dddd",(function(t,e){return e.weekdaysRegex(t)})),mt(["dd","ddd","dddd"],(function(t,e,n,i){var a=n._locale.weekdaysParse(t,i,n._strict);null!=a?e.d=a:g(n).invalidWeekday=t})),mt(["d","e","E"],(function(t,e,n,i){e[i]=k(t)}));var Xt="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Kt="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Jt="Su_Mo_Tu_We_Th_Fr_Sa".split("_");function Qt(t,e,n){var i,a,r,o=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)r=f([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===e?-1!==(a=Pt.call(this._weekdaysParse,o))?a:null:"ddd"===e?-1!==(a=Pt.call(this._shortWeekdaysParse,o))?a:null:-1!==(a=Pt.call(this._minWeekdaysParse,o))?a:null:"dddd"===e?-1!==(a=Pt.call(this._weekdaysParse,o))?a:-1!==(a=Pt.call(this._shortWeekdaysParse,o))?a:-1!==(a=Pt.call(this._minWeekdaysParse,o))?a:null:"ddd"===e?-1!==(a=Pt.call(this._shortWeekdaysParse,o))?a:-1!==(a=Pt.call(this._weekdaysParse,o))?a:-1!==(a=Pt.call(this._minWeekdaysParse,o))?a:null:-1!==(a=Pt.call(this._minWeekdaysParse,o))?a:-1!==(a=Pt.call(this._weekdaysParse,o))?a:-1!==(a=Pt.call(this._shortWeekdaysParse,o))?a:null}var te=lt,ee=lt,ne=lt;function ie(){function t(t,e){return e.length-t.length}var e,n,i,a,r,o=[],s=[],l=[],u=[];for(e=0;e<7;e++)n=f([2e3,1]).day(e),i=this.weekdaysMin(n,""),a=this.weekdaysShort(n,""),r=this.weekdays(n,""),o.push(i),s.push(a),l.push(r),u.push(i),u.push(a),u.push(r);for(o.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)s[e]=ct(s[e]),l[e]=ct(l[e]),u[e]=ct(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function ae(){return this.hours()%12||12}function re(t,e){j(t,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)}))}function oe(t,e){return e._meridiemParse}j("H",["HH",2],0,"hour"),j("h",["hh",2],0,ae),j("k",["kk",2],0,(function(){return this.hours()||24})),j("hmm",0,0,(function(){return""+ae.apply(this)+z(this.minutes(),2)})),j("hmmss",0,0,(function(){return""+ae.apply(this)+z(this.minutes(),2)+z(this.seconds(),2)})),j("Hmm",0,0,(function(){return""+this.hours()+z(this.minutes(),2)})),j("Hmmss",0,0,(function(){return""+this.hours()+z(this.minutes(),2)+z(this.seconds(),2)})),re("a",!0),re("A",!1),L("hour","h"),Y("hour",13),dt("a",oe),dt("A",oe),dt("H",J),dt("h",J),dt("k",J),dt("HH",J,Z),dt("hh",J,Z),dt("kk",J,Z),dt("hmm",Q),dt("hmmss",tt),dt("Hmm",Q),dt("Hmmss",tt),gt(["H","HH"],xt),gt(["k","kk"],(function(t,e,n){var i=k(t);e[xt]=24===i?0:i})),gt(["a","A"],(function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t})),gt(["h","hh"],(function(t,e,n){e[xt]=k(t),g(n).bigHour=!0})),gt("hmm",(function(t,e,n){var i=t.length-2;e[xt]=k(t.substr(0,i)),e[_t]=k(t.substr(i)),g(n).bigHour=!0})),gt("hmmss",(function(t,e,n){var i=t.length-4,a=t.length-2;e[xt]=k(t.substr(0,i)),e[_t]=k(t.substr(i,2)),e[wt]=k(t.substr(a)),g(n).bigHour=!0})),gt("Hmm",(function(t,e,n){var i=t.length-2;e[xt]=k(t.substr(0,i)),e[_t]=k(t.substr(i))})),gt("Hmmss",(function(t,e,n){var i=t.length-4,a=t.length-2;e[xt]=k(t.substr(0,i)),e[_t]=k(t.substr(i,2)),e[wt]=k(t.substr(a))}));var se,le=Ot("Hours",!0),ue={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Rt,monthsShort:Nt,week:{dow:0,doy:6},weekdays:Xt,weekdaysMin:Jt,weekdaysShort:Kt,meridiemParse:/[ap]\.?m?\.?/i},de={},he={};function ce(t){return t?t.toLowerCase().replace("_","-"):t}function fe(n){var i=null;if(!de[n]&&e&&e.exports)try{i=se._abbr,t(),ge(i)}catch(t){}return de[n]}function ge(t,e){var n;return t&&((n=s(e)?pe(t):me(t,e))?se=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),se._abbr}function me(t,e){if(null!==e){var n,i=ue;if(e.abbr=t,null!=de[t])T("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=de[t]._config;else if(null!=e.parentLocale)if(null!=de[e.parentLocale])i=de[e.parentLocale]._config;else{if(null==(n=fe(e.parentLocale)))return he[e.parentLocale]||(he[e.parentLocale]=[]),he[e.parentLocale].push({name:t,config:e}),null;i=n._config}return de[t]=new F(A(i,e)),he[t]&&he[t].forEach((function(t){me(t.name,t.config)})),ge(t),de[t]}return delete de[t],null}function pe(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return se;if(!r(t)){if(e=fe(t))return e;t=[t]}return function(t){for(var e,n,i,a,r=0;r0;){if(i=fe(a.slice(0,e).join("-")))return i;if(n&&n.length>=e&&M(a,n,!0)>=e-1)break;e--}r++}return se}(t)}function ve(t){var e,n=t._a;return n&&-2===g(t).overflow&&(e=n[bt]<0||n[bt]>11?bt:n[yt]<1||n[yt]>It(n[vt],n[bt])?yt:n[xt]<0||n[xt]>24||24===n[xt]&&(0!==n[_t]||0!==n[wt]||0!==n[kt])?xt:n[_t]<0||n[_t]>59?_t:n[wt]<0||n[wt]>59?wt:n[kt]<0||n[kt]>999?kt:-1,g(t)._overflowDayOfYear&&(eyt)&&(e=yt),g(t)._overflowWeeks&&-1===e&&(e=Mt),g(t)._overflowWeekday&&-1===e&&(e=St),g(t).overflow=e),t}function be(t,e,n){return null!=t?t:null!=e?e:n}function ye(t){var e,n,i,r,o,s=[];if(!t._d){for(i=function(t){var e=new Date(a.now());return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}(t),t._w&&null==t._a[yt]&&null==t._a[bt]&&function(t){var e,n,i,a,r,o,s,l;if(null!=(e=t._w).GG||null!=e.W||null!=e.E)r=1,o=4,n=be(e.GG,t._a[vt],qt(Le(),1,4).year),i=be(e.W,1),((a=be(e.E,1))<1||a>7)&&(l=!0);else{r=t._locale._week.dow,o=t._locale._week.doy;var u=qt(Le(),r,o);n=be(e.gg,t._a[vt],u.year),i=be(e.w,u.week),null!=e.d?((a=e.d)<0||a>6)&&(l=!0):null!=e.e?(a=e.e+r,(e.e<0||e.e>6)&&(l=!0)):a=r}i<1||i>Zt(n,r,o)?g(t)._overflowWeeks=!0:null!=l?g(t)._overflowWeekday=!0:(s=Gt(n,i,a,r,o),t._a[vt]=s.year,t._dayOfYear=s.dayOfYear)}(t),null!=t._dayOfYear&&(o=be(t._a[vt],i[vt]),(t._dayOfYear>Dt(o)||0===t._dayOfYear)&&(g(t)._overflowDayOfYear=!0),n=jt(o,0,t._dayOfYear),t._a[bt]=n.getUTCMonth(),t._a[yt]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=s[e]=i[e];for(;e<7;e++)t._a[e]=s[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[xt]&&0===t._a[_t]&&0===t._a[wt]&&0===t._a[kt]&&(t._nextDay=!0,t._a[xt]=0),t._d=(t._useUTC?jt:Bt).apply(null,s),r=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[xt]=24),t._w&&void 0!==t._w.d&&t._w.d!==r&&(g(t).weekdayMismatch=!0)}}var xe=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,_e=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,we=/Z|[+-]\d\d(?::?\d\d)?/,ke=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Me=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Se=/^\/?Date\((\-?\d+)/i;function De(t){var e,n,i,a,r,o,s=t._i,l=xe.exec(s)||_e.exec(s);if(l){for(g(t).iso=!0,e=0,n=ke.length;e0&&g(t).unusedInput.push(o),s=s.slice(s.indexOf(n)+n.length),u+=n.length),B[r]?(n?g(t).empty=!1:g(t).unusedTokens.push(r),pt(r,n,t)):t._strict&&!n&&g(t).unusedTokens.push(r);g(t).charsLeftOver=l-u,s.length>0&&g(t).unusedInput.push(s),t._a[xt]<=12&&!0===g(t).bigHour&&t._a[xt]>0&&(g(t).bigHour=void 0),g(t).parsedDateParts=t._a.slice(0),g(t).meridiem=t._meridiem,t._a[xt]=function(t,e,n){var i;return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?((i=t.isPM(n))&&e<12&&(e+=12),i||12!==e||(e=0),e):e}(t._locale,t._a[xt],t._meridiem),ye(t),ve(t)}else Oe(t);else De(t)}function Fe(t){var e=t._i,n=t._f;return t._locale=t._locale||pe(t._l),null===e||void 0===n&&""===e?p({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),_(e)?new x(ve(e)):(u(e)?t._d=e:r(n)?function(t){var e,n,i,a,r;if(0===t._f.length)return g(t).invalidFormat=!0,void(t._d=new Date(NaN));for(a=0;athis?this:t:p()}));function We(t,e){var n,i;if(1===e.length&&r(e[0])&&(e=e[0]),!e.length)return Le();for(n=e[0],i=1;i=0?new Date(t+400,e,n)-hn:new Date(t,e,n).valueOf()}function gn(t,e,n){return t<100&&t>=0?Date.UTC(t+400,e,n)-hn:Date.UTC(t,e,n)}function mn(t,e){j(0,[t,t.length],0,e)}function pn(t,e,n,i,a){var r;return null==t?qt(this,i,a).year:(e>(r=Zt(t,i,a))&&(e=r),vn.call(this,t,e,n,i,a))}function vn(t,e,n,i,a){var r=Gt(t,e,n,i,a),o=jt(r.year,0,r.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}j(0,["gg",2],0,(function(){return this.weekYear()%100})),j(0,["GG",2],0,(function(){return this.isoWeekYear()%100})),mn("gggg","weekYear"),mn("ggggg","weekYear"),mn("GGGG","isoWeekYear"),mn("GGGGG","isoWeekYear"),L("weekYear","gg"),L("isoWeekYear","GG"),Y("weekYear",1),Y("isoWeekYear",1),dt("G",rt),dt("g",rt),dt("GG",J,Z),dt("gg",J,Z),dt("GGGG",nt,X),dt("gggg",nt,X),dt("GGGGG",it,K),dt("ggggg",it,K),mt(["gggg","ggggg","GGGG","GGGGG"],(function(t,e,n,i){e[i.substr(0,2)]=k(t)})),mt(["gg","GG"],(function(t,e,n,i){e[i]=a.parseTwoDigitYear(t)})),j("Q",0,"Qo","quarter"),L("quarter","Q"),Y("quarter",7),dt("Q",q),gt("Q",(function(t,e){e[bt]=3*(k(t)-1)})),j("D",["DD",2],"Do","date"),L("date","D"),Y("date",9),dt("D",J),dt("DD",J,Z),dt("Do",(function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient})),gt(["D","DD"],yt),gt("Do",(function(t,e){e[yt]=k(t.match(J)[0])}));var bn=Ot("Date",!0);j("DDD",["DDDD",3],"DDDo","dayOfYear"),L("dayOfYear","DDD"),Y("dayOfYear",4),dt("DDD",et),dt("DDDD",$),gt(["DDD","DDDD"],(function(t,e,n){n._dayOfYear=k(t)})),j("m",["mm",2],0,"minute"),L("minute","m"),Y("minute",14),dt("m",J),dt("mm",J,Z),gt(["m","mm"],_t);var yn=Ot("Minutes",!1);j("s",["ss",2],0,"second"),L("second","s"),Y("second",15),dt("s",J),dt("ss",J,Z),gt(["s","ss"],wt);var xn,_n=Ot("Seconds",!1);for(j("S",0,0,(function(){return~~(this.millisecond()/100)})),j(0,["SS",2],0,(function(){return~~(this.millisecond()/10)})),j(0,["SSS",3],0,"millisecond"),j(0,["SSSS",4],0,(function(){return 10*this.millisecond()})),j(0,["SSSSS",5],0,(function(){return 100*this.millisecond()})),j(0,["SSSSSS",6],0,(function(){return 1e3*this.millisecond()})),j(0,["SSSSSSS",7],0,(function(){return 1e4*this.millisecond()})),j(0,["SSSSSSSS",8],0,(function(){return 1e5*this.millisecond()})),j(0,["SSSSSSSSS",9],0,(function(){return 1e6*this.millisecond()})),L("millisecond","ms"),Y("millisecond",16),dt("S",et,q),dt("SS",et,Z),dt("SSS",et,$),xn="SSSS";xn.length<=9;xn+="S")dt(xn,at);function wn(t,e){e[kt]=k(1e3*("0."+t))}for(xn="S";xn.length<=9;xn+="S")gt(xn,wn);var kn=Ot("Milliseconds",!1);j("z",0,0,"zoneAbbr"),j("zz",0,0,"zoneName");var Mn=x.prototype;function Sn(t){return t}Mn.add=en,Mn.calendar=function(t,e){var n=t||Le(),i=Ue(n,this).startOf("day"),r=a.calendarFormat(this,i)||"sameElse",o=e&&(O(e[r])?e[r].call(this,n):e[r]);return this.format(o||this.localeData().calendar(r,this,Le(n)))},Mn.clone=function(){return new x(this)},Mn.diff=function(t,e,n){var i,a,r;if(!this.isValid())return NaN;if(!(i=Ue(t,this)).isValid())return NaN;switch(a=6e4*(i.utcOffset()-this.utcOffset()),e=R(e)){case"year":r=an(this,i)/12;break;case"month":r=an(this,i);break;case"quarter":r=an(this,i)/3;break;case"second":r=(this-i)/1e3;break;case"minute":r=(this-i)/6e4;break;case"hour":r=(this-i)/36e5;break;case"day":r=(this-i-a)/864e5;break;case"week":r=(this-i-a)/6048e5;break;default:r=this-i}return n?r:w(r)},Mn.endOf=function(t){var e;if(void 0===(t=R(t))||"millisecond"===t||!this.isValid())return this;var n=this._isUTC?gn:fn;switch(t){case"year":e=n(this.year()+1,0,1)-1;break;case"quarter":e=n(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":e=n(this.year(),this.month()+1,1)-1;break;case"week":e=n(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":e=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":e=n(this.year(),this.month(),this.date()+1)-1;break;case"hour":e=this._d.valueOf(),e+=dn-cn(e+(this._isUTC?0:this.utcOffset()*un),dn)-1;break;case"minute":e=this._d.valueOf(),e+=un-cn(e,un)-1;break;case"second":e=this._d.valueOf(),e+=ln-cn(e,ln)-1}return this._d.setTime(e),a.updateOffset(this,!0),this},Mn.format=function(t){t||(t=this.isUtc()?a.defaultFormatUtc:a.defaultFormat);var e=U(this,t);return this.localeData().postformat(e)},Mn.from=function(t,e){return this.isValid()&&(_(t)&&t.isValid()||Le(t).isValid())?Xe({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},Mn.fromNow=function(t){return this.from(Le(),t)},Mn.to=function(t,e){return this.isValid()&&(_(t)&&t.isValid()||Le(t).isValid())?Xe({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},Mn.toNow=function(t){return this.to(Le(),t)},Mn.get=function(t){return O(this[t=R(t)])?this[t]():this},Mn.invalidAt=function(){return g(this).overflow},Mn.isAfter=function(t,e){var n=_(t)?t:Le(t);return!(!this.isValid()||!n.isValid())&&("millisecond"===(e=R(e)||"millisecond")?this.valueOf()>n.valueOf():n.valueOf()9999?U(n,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):O(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",U(n,"Z")):U(n,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},Mn.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var n="["+t+'("]',i=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",a=e+'[")]';return this.format(n+i+"-MM-DD[T]HH:mm:ss.SSS"+a)},Mn.toJSON=function(){return this.isValid()?this.toISOString():null},Mn.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},Mn.unix=function(){return Math.floor(this.valueOf()/1e3)},Mn.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},Mn.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},Mn.year=Tt,Mn.isLeapYear=function(){return Ct(this.year())},Mn.weekYear=function(t){return pn.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},Mn.isoWeekYear=function(t){return pn.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)},Mn.quarter=Mn.quarters=function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},Mn.month=zt,Mn.daysInMonth=function(){return It(this.year(),this.month())},Mn.week=Mn.weeks=function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},Mn.isoWeek=Mn.isoWeeks=function(t){var e=qt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},Mn.weeksInYear=function(){var t=this.localeData()._week;return Zt(this.year(),t.dow,t.doy)},Mn.isoWeeksInYear=function(){return Zt(this.year(),1,4)},Mn.date=bn,Mn.day=Mn.days=function(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=function(t,e){return"string"!=typeof t?t:isNaN(t)?"number"==typeof(t=e.weekdaysParse(t))?t:null:parseInt(t,10)}(t,this.localeData()),this.add(t-e,"d")):e},Mn.weekday=function(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},Mn.isoWeekday=function(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=function(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7},Mn.dayOfYear=function(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},Mn.hour=Mn.hours=le,Mn.minute=Mn.minutes=yn,Mn.second=Mn.seconds=_n,Mn.millisecond=Mn.milliseconds=kn,Mn.utcOffset=function(t,e,n){var i,r=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if("string"==typeof t){if(null===(t=je(st,t)))return this}else Math.abs(t)<16&&!n&&(t*=60);return!this._isUTC&&e&&(i=Ge(this)),this._offset=t,this._isUTC=!0,null!=i&&this.add(i,"m"),r!==t&&(!e||this._changeInProgress?tn(this,Xe(t-r,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?r:Ge(this)},Mn.utc=function(t){return this.utcOffset(0,t)},Mn.local=function(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(Ge(this),"m")),this},Mn.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var t=je(ot,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this},Mn.hasAlignedHourOffset=function(t){return!!this.isValid()&&(t=t?Le(t).utcOffset():0,(this.utcOffset()-t)%60==0)},Mn.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},Mn.isLocal=function(){return!!this.isValid()&&!this._isUTC},Mn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},Mn.isUtc=qe,Mn.isUTC=qe,Mn.zoneAbbr=function(){return this._isUTC?"UTC":""},Mn.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},Mn.dates=D("dates accessor is deprecated. Use date instead.",bn),Mn.months=D("months accessor is deprecated. Use month instead",zt),Mn.years=D("years accessor is deprecated. Use year instead",Tt),Mn.zone=D("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",(function(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()})),Mn.isDSTShifted=D("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",(function(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(b(t,this),(t=Fe(t))._a){var e=t._isUTC?f(t._a):Le(t._a);this._isDSTShifted=this.isValid()&&M(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}));var Dn=F.prototype;function Cn(t,e,n,i){var a=pe(),r=f().set(i,e);return a[n](r,t)}function Pn(t,e,n){if(l(t)&&(e=t,t=void 0),t=t||"",null!=e)return Cn(t,e,n,"month");var i,a=[];for(i=0;i<12;i++)a[i]=Cn(t,i,n,"month");return a}function Tn(t,e,n,i){"boolean"==typeof t?(l(e)&&(n=e,e=void 0),e=e||""):(n=e=t,t=!1,l(e)&&(n=e,e=void 0),e=e||"");var a,r=pe(),o=t?r._week.dow:0;if(null!=n)return Cn(e,(n+o)%7,i,"day");var s=[];for(a=0;a<7;a++)s[a]=Cn(e,(a+o)%7,i,"day");return s}Dn.calendar=function(t,e,n){var i=this._calendar[t]||this._calendar.sameElse;return O(i)?i.call(e,n):i},Dn.longDateFormat=function(t){var e=this._longDateFormat[t],n=this._longDateFormat[t.toUpperCase()];return e||!n?e:(this._longDateFormat[t]=n.replace(/MMMM|MM|DD|dddd/g,(function(t){return t.slice(1)})),this._longDateFormat[t])},Dn.invalidDate=function(){return this._invalidDate},Dn.ordinal=function(t){return this._ordinal.replace("%d",t)},Dn.preparse=Sn,Dn.postformat=Sn,Dn.relativeTime=function(t,e,n,i){var a=this._relativeTime[n];return O(a)?a(t,e,n,i):a.replace(/%d/i,t)},Dn.pastFuture=function(t,e){var n=this._relativeTime[t>0?"future":"past"];return O(n)?n(e):n.replace(/%s/i,e)},Dn.set=function(t){var e,n;for(n in t)O(e=t[n])?this[n]=e:this["_"+n]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},Dn.months=function(t,e){return t?r(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||Lt).test(e)?"format":"standalone"][t.month()]:r(this._months)?this._months:this._months.standalone},Dn.monthsShort=function(t,e){return t?r(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[Lt.test(e)?"format":"standalone"][t.month()]:r(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},Dn.monthsParse=function(t,e,n){var i,a,r;if(this._monthsParseExact)return Wt.call(this,t,e,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),i=0;i<12;i++){if(a=f([2e3,i]),n&&!this._longMonthsParse[i]&&(this._longMonthsParse[i]=new RegExp("^"+this.months(a,"").replace(".","")+"$","i"),this._shortMonthsParse[i]=new RegExp("^"+this.monthsShort(a,"").replace(".","")+"$","i")),n||this._monthsParse[i]||(r="^"+this.months(a,"")+"|^"+this.monthsShort(a,""),this._monthsParse[i]=new RegExp(r.replace(".",""),"i")),n&&"MMMM"===e&&this._longMonthsParse[i].test(t))return i;if(n&&"MMM"===e&&this._shortMonthsParse[i].test(t))return i;if(!n&&this._monthsParse[i].test(t))return i}},Dn.monthsRegex=function(t){return this._monthsParseExact?(h(this,"_monthsRegex")||Ht.call(this),t?this._monthsStrictRegex:this._monthsRegex):(h(this,"_monthsRegex")||(this._monthsRegex=Vt),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)},Dn.monthsShortRegex=function(t){return this._monthsParseExact?(h(this,"_monthsRegex")||Ht.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(h(this,"_monthsShortRegex")||(this._monthsShortRegex=Et),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)},Dn.week=function(t){return qt(t,this._week.dow,this._week.doy).week},Dn.firstDayOfYear=function(){return this._week.doy},Dn.firstDayOfWeek=function(){return this._week.dow},Dn.weekdays=function(t,e){var n=r(this._weekdays)?this._weekdays:this._weekdays[t&&!0!==t&&this._weekdays.isFormat.test(e)?"format":"standalone"];return!0===t?$t(n,this._week.dow):t?n[t.day()]:n},Dn.weekdaysMin=function(t){return!0===t?$t(this._weekdaysMin,this._week.dow):t?this._weekdaysMin[t.day()]:this._weekdaysMin},Dn.weekdaysShort=function(t){return!0===t?$t(this._weekdaysShort,this._week.dow):t?this._weekdaysShort[t.day()]:this._weekdaysShort},Dn.weekdaysParse=function(t,e,n){var i,a,r;if(this._weekdaysParseExact)return Qt.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(a=f([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(a,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(a,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(a,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[i]||(r="^"+this.weekdays(a,"")+"|^"+this.weekdaysShort(a,"")+"|^"+this.weekdaysMin(a,""),this._weekdaysParse[i]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&"ddd"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&"dd"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}},Dn.weekdaysRegex=function(t){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||ie.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(h(this,"_weekdaysRegex")||(this._weekdaysRegex=te),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)},Dn.weekdaysShortRegex=function(t){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||ie.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(h(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=ee),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},Dn.weekdaysMinRegex=function(t){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||ie.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(h(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=ne),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},Dn.isPM=function(t){return"p"===(t+"").toLowerCase().charAt(0)},Dn.meridiem=function(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"},ge("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===k(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}}),a.lang=D("moment.lang is deprecated. Use moment.locale instead.",ge),a.langData=D("moment.langData is deprecated. Use moment.localeData instead.",pe);var On=Math.abs;function An(t,e,n,i){var a=Xe(e,n);return t._milliseconds+=i*a._milliseconds,t._days+=i*a._days,t._months+=i*a._months,t._bubble()}function Fn(t){return t<0?Math.floor(t):Math.ceil(t)}function In(t){return 4800*t/146097}function Ln(t){return 146097*t/4800}function Rn(t){return function(){return this.as(t)}}var Nn=Rn("ms"),Wn=Rn("s"),Yn=Rn("m"),zn=Rn("h"),En=Rn("d"),Vn=Rn("w"),Hn=Rn("M"),Bn=Rn("Q"),jn=Rn("y");function Un(t){return function(){return this.isValid()?this._data[t]:NaN}}var Gn=Un("milliseconds"),qn=Un("seconds"),Zn=Un("minutes"),$n=Un("hours"),Xn=Un("days"),Kn=Un("months"),Jn=Un("years"),Qn=Math.round,ti={ss:44,s:45,m:45,h:22,d:26,M:11};function ei(t,e,n,i,a){return a.relativeTime(e||1,!!n,t,i)}var ni=Math.abs;function ii(t){return(t>0)-(t<0)||+t}function ai(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n=ni(this._milliseconds)/1e3,i=ni(this._days),a=ni(this._months);t=w(n/60),e=w(t/60),n%=60,t%=60;var r=w(a/12),o=a%=12,s=i,l=e,u=t,d=n?n.toFixed(3).replace(/\.?0+$/,""):"",h=this.asSeconds();if(!h)return"P0D";var c=h<0?"-":"",f=ii(this._months)!==ii(h)?"-":"",g=ii(this._days)!==ii(h)?"-":"",m=ii(this._milliseconds)!==ii(h)?"-":"";return c+"P"+(r?f+r+"Y":"")+(o?f+o+"M":"")+(s?g+s+"D":"")+(l||u||d?"T":"")+(l?m+l+"H":"")+(u?m+u+"M":"")+(d?m+d+"S":"")}var ri=ze.prototype;return ri.isValid=function(){return this._isValid},ri.abs=function(){var t=this._data;return this._milliseconds=On(this._milliseconds),this._days=On(this._days),this._months=On(this._months),t.milliseconds=On(t.milliseconds),t.seconds=On(t.seconds),t.minutes=On(t.minutes),t.hours=On(t.hours),t.months=On(t.months),t.years=On(t.years),this},ri.add=function(t,e){return An(this,t,e,1)},ri.subtract=function(t,e){return An(this,t,e,-1)},ri.as=function(t){if(!this.isValid())return NaN;var e,n,i=this._milliseconds;if("month"===(t=R(t))||"quarter"===t||"year"===t)switch(e=this._days+i/864e5,n=this._months+In(e),t){case"month":return n;case"quarter":return n/3;case"year":return n/12}else switch(e=this._days+Math.round(Ln(this._months)),t){case"week":return e/7+i/6048e5;case"day":return e+i/864e5;case"hour":return 24*e+i/36e5;case"minute":return 1440*e+i/6e4;case"second":return 86400*e+i/1e3;case"millisecond":return Math.floor(864e5*e)+i;default:throw new Error("Unknown unit "+t)}},ri.asMilliseconds=Nn,ri.asSeconds=Wn,ri.asMinutes=Yn,ri.asHours=zn,ri.asDays=En,ri.asWeeks=Vn,ri.asMonths=Hn,ri.asQuarters=Bn,ri.asYears=jn,ri.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12):NaN},ri._bubble=function(){var t,e,n,i,a,r=this._milliseconds,o=this._days,s=this._months,l=this._data;return r>=0&&o>=0&&s>=0||r<=0&&o<=0&&s<=0||(r+=864e5*Fn(Ln(s)+o),o=0,s=0),l.milliseconds=r%1e3,t=w(r/1e3),l.seconds=t%60,e=w(t/60),l.minutes=e%60,n=w(e/60),l.hours=n%24,o+=w(n/24),a=w(In(o)),s+=a,o-=Fn(Ln(a)),i=w(s/12),s%=12,l.days=o,l.months=s,l.years=i,this},ri.clone=function(){return Xe(this)},ri.get=function(t){return t=R(t),this.isValid()?this[t+"s"]():NaN},ri.milliseconds=Gn,ri.seconds=qn,ri.minutes=Zn,ri.hours=$n,ri.days=Xn,ri.weeks=function(){return w(this.days()/7)},ri.months=Kn,ri.years=Jn,ri.humanize=function(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),n=function(t,e,n){var i=Xe(t).abs(),a=Qn(i.as("s")),r=Qn(i.as("m")),o=Qn(i.as("h")),s=Qn(i.as("d")),l=Qn(i.as("M")),u=Qn(i.as("y")),d=a<=ti.ss&&["s",a]||a0,d[4]=n,ei.apply(null,d)}(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)},ri.toISOString=ai,ri.toString=ai,ri.toJSON=ai,ri.locale=rn,ri.localeData=sn,ri.toIsoString=D("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",ai),ri.lang=on,j("X",0,0,"unix"),j("x",0,0,"valueOf"),dt("x",rt),dt("X",/[+-]?\d+(\.\d{1,3})?/),gt("X",(function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))})),gt("x",(function(t,e,n){n._d=new Date(k(t))})),a.version="2.24.0",n=Le,a.fn=Mn,a.min=function(){return We("isBefore",[].slice.call(arguments,0))},a.max=function(){return We("isAfter",[].slice.call(arguments,0))},a.now=function(){return Date.now?Date.now():+new Date},a.utc=f,a.unix=function(t){return Le(1e3*t)},a.months=function(t,e){return Pn(t,e,"months")},a.isDate=u,a.locale=ge,a.invalid=p,a.duration=Xe,a.isMoment=_,a.weekdays=function(t,e,n){return Tn(t,e,n,"weekdays")},a.parseZone=function(){return Le.apply(null,arguments).parseZone()},a.localeData=pe,a.isDuration=Ee,a.monthsShort=function(t,e){return Pn(t,e,"monthsShort")},a.weekdaysMin=function(t,e,n){return Tn(t,e,n,"weekdaysMin")},a.defineLocale=me,a.updateLocale=function(t,e){if(null!=e){var n,i,a=ue;null!=(i=fe(t))&&(a=i._config),e=A(a,e),(n=new F(e)).parentLocale=de[t],de[t]=n,ge(t)}else null!=de[t]&&(null!=de[t].parentLocale?de[t]=de[t].parentLocale:null!=de[t]&&delete de[t]);return de[t]},a.locales=function(){return C(de)},a.weekdaysShort=function(t,e,n){return Tn(t,e,n,"weekdaysShort")},a.normalizeUnits=R,a.relativeTimeRounding=function(t){return void 0===t?Qn:"function"==typeof t&&(Qn=t,!0)},a.relativeTimeThreshold=function(t,e){return void 0!==ti[t]&&(void 0===e?ti[t]:(ti[t]=e,"s"===t&&(ti.ss=e-1),!0))},a.calendarFormat=function(t,e){var n=t.diff(e,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},a.prototype=Mn,a.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},a}()})),pi={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};on._date.override("function"==typeof mi?{_id:"moment",formats:function(){return pi},parse:function(t,e){return"string"==typeof t&&"string"==typeof e?t=mi(t,e):t instanceof mi||(t=mi(t)),t.isValid()?t.valueOf():null},format:function(t,e){return mi(t).format(e)},add:function(t,e,n){return mi(t).add(e,n).valueOf()},diff:function(t,e,n){return mi(t).diff(mi(e),n)},startOf:function(t,e,n){return t=mi(t),"isoWeek"===e?t.isoWeekday(n).valueOf():t.startOf(e).valueOf()},endOf:function(t,e){return mi(t).endOf(e).valueOf()},_create:function(t){return mi(t)}}:{}),Y._set("global",{plugins:{filler:{propagate:!0}}});var vi={dataset:function(t){var e=t.fill,n=t.chart,i=n.getDatasetMeta(e),a=i&&n.isDatasetVisible(e)&&i.dataset._children||[],r=a.length||0;return r?function(t,e){return e=n)&&i;switch(r){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return r;default:return!1}}function yi(t){return(t.el._scale||{}).getPointPositionForValue?function(t){var e,n,i,a,r,o=t.el._scale,s=o.options,l=o.chart.data.labels.length,u=t.fill,d=[];if(!l)return null;for(e=s.ticks.reverse?o.max:o.min,n=s.ticks.reverse?o.min:o.max,i=o.getPointPositionForValue(0,e),a=0;a0;--r)B.canvas.lineTo(t,n[r],n[r-1],!0);else for(o=n[0].cx,s=n[0].cy,l=Math.sqrt(Math.pow(n[0].x-o,2)+Math.pow(n[0].y-s,2)),r=a-1;r>0;--r)t.arc(o,s,l,n[r].angle,n[r-1].angle,!0)}}function Mi(t,e,n,i,a,r){var o,s,l,u,d,h,c,f,g=e.length,m=i.spanGaps,p=[],v=[],b=0,y=0;for(t.beginPath(),o=0,s=g;o=0;--n)(e=l[n].$filler)&&e.visible&&(a=(i=e.el)._view,r=i._children||[],o=e.mapper,s=a.backgroundColor||Y.global.defaultColor,o&&s&&r.length&&(B.canvas.clipArea(u,t.chartArea),Mi(u,r,o,a,s,i._loop),B.canvas.unclipArea(u)))}},Di=B.rtl.getRtlAdapter,Ci=B.noop,Pi=B.valueOrDefault;function Ti(t,e){return t.usePointStyle&&t.boxWidth>e?e:t.boxWidth}Y._set("global",{legend:{display:!0,position:"top",align:"center",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var n=e.datasetIndex,i=this.chart,a=i.getDatasetMeta(n);a.hidden=null===a.hidden?!i.data.datasets[n].hidden:null,i.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data.datasets,n=t.options.legend||{},i=n.labels&&n.labels.usePointStyle;return t._getSortedDatasetMetas().map((function(n){var a=n.controller.getStyle(i?0:void 0);return{text:e[n.index].label,fillStyle:a.backgroundColor,hidden:!t.isDatasetVisible(n.index),lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:a.borderWidth,strokeStyle:a.borderColor,pointStyle:a.pointStyle,rotation:a.rotation,datasetIndex:n.index}}),this)}}},legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data.datasets;for(a.setAttribute("class",t.id+"-legend"),e=0,n=r.length;el.width)&&(h+=o+n.padding,d[d.length-(e>0?0:1)]=0),s[e]={left:0,top:0,width:i,height:o},d[d.length-1]+=i+n.padding})),l.height+=h}else{var c=n.padding,f=t.columnWidths=[],g=t.columnHeights=[],m=n.padding,p=0,v=0;B.each(t.legendItems,(function(t,e){var i=Ti(n,o)+o/2+a.measureText(t.text).width;e>0&&v+o+2*c>l.height&&(m+=p+n.padding,f.push(p),g.push(v),p=0,v=0),p=Math.max(p,i),v+=o+c,s[e]={left:0,top:0,width:i,height:o}})),m+=p,f.push(p),g.push(v),l.width+=m}t.width=l.width,t.height=l.height}else t.width=l.width=t.height=l.height=0},afterFit:Ci,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,e=t.options,n=e.labels,i=Y.global,a=i.defaultColor,r=i.elements.line,o=t.height,s=t.columnHeights,l=t.width,u=t.lineWidths;if(e.display){var d,h=Di(e.rtl,t.left,t.minSize.width),c=t.ctx,f=Pi(n.fontColor,i.defaultFontColor),g=B.options._parseFont(n),m=g.size;c.textAlign=h.textAlign("left"),c.textBaseline="middle",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=g.string;var p=Ti(n,m),v=t.legendHitBoxes,b=function(t,i){switch(e.align){case"start":return n.padding;case"end":return t-i;default:return(t-i+n.padding)/2}},y=t.isHorizontal();d=y?{x:t.left+b(l,u[0]),y:t.top+n.padding,line:0}:{x:t.left+n.padding,y:t.top+b(o,s[0]),line:0},B.rtl.overrideTextDirection(t.ctx,e.textDirection);var x=m+n.padding;B.each(t.legendItems,(function(e,i){var f=c.measureText(e.text).width,g=p+m/2+f,_=d.x,w=d.y;h.setWidth(t.minSize.width),y?i>0&&_+g+n.padding>t.left+t.minSize.width&&(w=d.y+=x,d.line++,_=d.x=t.left+b(l,u[d.line])):i>0&&w+x>t.top+t.minSize.height&&(_=d.x=_+t.columnWidths[d.line]+n.padding,d.line++,w=d.y=t.top+b(o,s[d.line]));var k=h.x(_);!function(t,e,i){if(!(isNaN(p)||p<=0)){c.save();var o=Pi(i.lineWidth,r.borderWidth);if(c.fillStyle=Pi(i.fillStyle,a),c.lineCap=Pi(i.lineCap,r.borderCapStyle),c.lineDashOffset=Pi(i.lineDashOffset,r.borderDashOffset),c.lineJoin=Pi(i.lineJoin,r.borderJoinStyle),c.lineWidth=o,c.strokeStyle=Pi(i.strokeStyle,a),c.setLineDash&&c.setLineDash(Pi(i.lineDash,r.borderDash)),n&&n.usePointStyle){var s=p*Math.SQRT2/2,l=h.xPlus(t,p/2),u=e+m/2;B.canvas.drawPoint(c,i.pointStyle,s,l,u,i.rotation)}else c.fillRect(h.leftForLtr(t,p),e,p,m),0!==o&&c.strokeRect(h.leftForLtr(t,p),e,p,m);c.restore()}}(k,w,e),v[i].left=h.leftForLtr(k,v[i].width),v[i].top=w,function(t,e,n,i){var a=m/2,r=h.xPlus(t,p+a),o=e+a;c.fillText(n.text,r,o),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(r,o),c.lineTo(h.xPlus(r,i),o),c.stroke())}(k,w,e,f),y?d.x+=g+n.padding:d.y+=x})),B.rtl.restoreTextDirection(t.ctx,e.textDirection)}},_getLegendItemAt:function(t,e){var n,i,a,r=this;if(t>=r.left&&t<=r.right&&e>=r.top&&e<=r.bottom)for(a=r.legendHitBoxes,n=0;n=(i=a[n]).left&&t<=i.left+i.width&&e>=i.top&&e<=i.top+i.height)return r.legendItems[n];return null},handleEvent:function(t){var e,n=this,i=n.options,a="mouseup"===t.type?"click":t.type;if("mousemove"===a){if(!i.onHover&&!i.onLeave)return}else{if("click"!==a)return;if(!i.onClick)return}e=n._getLegendItemAt(t.x,t.y),"click"===a?e&&i.onClick&&i.onClick.call(n,t.native,e):(i.onLeave&&e!==n._hoveredItem&&(n._hoveredItem&&i.onLeave.call(n,t.native,n._hoveredItem),n._hoveredItem=e),i.onHover&&e&&i.onHover.call(n,t.native,e))}});function Ai(t,e){var n=new Oi({ctx:t.ctx,options:e,chart:t});pe.configure(t,n,e),pe.addBox(t,n),t.legend=n}var Fi={id:"legend",_element:Oi,beforeInit:function(t){var e=t.options.legend;e&&Ai(t,e)},beforeUpdate:function(t){var e=t.options.legend,n=t.legend;e?(B.mergeIf(e,Y.global.legend),n?(pe.configure(t,n,e),n.options=e):Ai(t,e)):n&&(pe.removeBox(t,n),delete t.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}},Ii=B.noop;Y._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var Li=X.extend({initialize:function(t){B.extend(this,t),this.legendHitBoxes=[]},beforeUpdate:Ii,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:Ii,beforeSetDimensions:Ii,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:Ii,beforeBuildLabels:Ii,buildLabels:Ii,afterBuildLabels:Ii,beforeFit:Ii,fit:function(){var t,e=this,n=e.options,i=e.minSize={},a=e.isHorizontal();n.display?(t=(B.isArray(n.text)?n.text.length:1)*B.options._parseFont(n).lineHeight+2*n.padding,e.width=i.width=a?e.maxWidth:t,e.height=i.height=a?t:e.maxHeight):e.width=i.width=e.height=i.height=0},afterFit:Ii,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,n=t.options;if(n.display){var i,a,r,o=B.options._parseFont(n),s=o.lineHeight,l=s/2+n.padding,u=0,d=t.top,h=t.left,c=t.bottom,f=t.right;e.fillStyle=B.valueOrDefault(n.fontColor,Y.global.defaultFontColor),e.font=o.string,t.isHorizontal()?(a=h+(f-h)/2,r=d+l,i=f-h):(a="left"===n.position?h+l:f-l,r=d+(c-d)/2,i=c-d,u=Math.PI*("left"===n.position?-.5:.5)),e.save(),e.translate(a,r),e.rotate(u),e.textAlign="center",e.textBaseline="middle";var g=n.text;if(B.isArray(g))for(var m=0,p=0;p=0;i--){var a=t[i];if(e(a))return a}},B.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},B.almostEquals=function(t,e,n){return Math.abs(t-e)=t},B.max=function(t){return t.reduce((function(t,e){return isNaN(e)?t:Math.max(t,e)}),Number.NEGATIVE_INFINITY)},B.min=function(t){return t.reduce((function(t,e){return isNaN(e)?t:Math.min(t,e)}),Number.POSITIVE_INFINITY)},B.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0===(t=+t)||isNaN(t)?t:t>0?1:-1},B.toRadians=function(t){return t*(Math.PI/180)},B.toDegrees=function(t){return t*(180/Math.PI)},B._decimalPlaces=function(t){if(B.isFinite(t)){for(var e=1,n=0;Math.round(t*e)/e!==t;)e*=10,n++;return n}},B.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),r=Math.atan2(i,n);return r<-.5*Math.PI&&(r+=2*Math.PI),{angle:r,distance:a}},B.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},B.aliasPixel=function(t){return t%2==0?0:.5},B._alignPixel=function(t,e,n){var i=t.currentDevicePixelRatio,a=n/2;return Math.round((e-a)*i)/i+a},B.splineCurve=function(t,e,n,i){var a=t.skip?e:t,r=e,o=n.skip?e:n,s=Math.sqrt(Math.pow(r.x-a.x,2)+Math.pow(r.y-a.y,2)),l=Math.sqrt(Math.pow(o.x-r.x,2)+Math.pow(o.y-r.y,2)),u=s/(s+l),d=l/(s+l),h=i*(u=isNaN(u)?0:u),c=i*(d=isNaN(d)?0:d);return{previous:{x:r.x-h*(o.x-a.x),y:r.y-h*(o.y-a.y)},next:{x:r.x+c*(o.x-a.x),y:r.y+c*(o.y-a.y)}}},B.EPSILON=Number.EPSILON||1e-14,B.splineCurveMonotone=function(t){var e,n,i,a,r,o,s,l,u,d=(t||[]).map((function(t){return{model:t._model,deltaK:0,mK:0}})),h=d.length;for(e=0;e0?d[e-1]:null,(a=e0?d[e-1]:null,a=e=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},B.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},B.niceNum=function(t,e){var n=Math.floor(B.log10(t)),i=t/Math.pow(10,n);return(e?i<1.5?1:i<3?2:i<7?5:10:i<=1?1:i<=2?2:i<=5?5:10)*Math.pow(10,n)},B.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},B.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,r=t.target||t.srcElement,o=r.getBoundingClientRect(),s=a.touches;s&&s.length>0?(n=s[0].clientX,i=s[0].clientY):(n=a.clientX,i=a.clientY);var l=parseFloat(B.getStyle(r,"padding-left")),u=parseFloat(B.getStyle(r,"padding-top")),d=parseFloat(B.getStyle(r,"padding-right")),h=parseFloat(B.getStyle(r,"padding-bottom")),c=o.right-o.left-l-d,f=o.bottom-o.top-u-h;return{x:n=Math.round((n-o.left-l)/c*r.width/e.currentDevicePixelRatio),y:i=Math.round((i-o.top-u)/f*r.height/e.currentDevicePixelRatio)}},B.getConstraintWidth=function(t){return n(t,"max-width","clientWidth")},B.getConstraintHeight=function(t){return n(t,"max-height","clientHeight")},B._calculatePadding=function(t,e,n){return(e=B.getStyle(t,e)).indexOf("%")>-1?n*parseInt(e,10)/100:parseInt(e,10)},B._getParentNode=function(t){var e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e},B.getMaximumWidth=function(t){var e=B._getParentNode(t);if(!e)return t.clientWidth;var n=e.clientWidth,i=n-B._calculatePadding(e,"padding-left",n)-B._calculatePadding(e,"padding-right",n),a=B.getConstraintWidth(t);return isNaN(a)?i:Math.min(i,a)},B.getMaximumHeight=function(t){var e=B._getParentNode(t);if(!e)return t.clientHeight;var n=e.clientHeight,i=n-B._calculatePadding(e,"padding-top",n)-B._calculatePadding(e,"padding-bottom",n),a=B.getConstraintHeight(t);return isNaN(a)?i:Math.min(i,a)},B.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},B.retinaScale=function(t,e){var n=t.currentDevicePixelRatio=e||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==n){var i=t.canvas,a=t.height,r=t.width;i.height=a*n,i.width=r*n,t.ctx.scale(n,n),i.style.height||i.style.width||(i.style.height=a+"px",i.style.width=r+"px")}},B.fontString=function(t,e,n){return e+" "+t+"px "+n},B.longestText=function(t,e,n,i){var a=(i=i||{}).data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var o,s,l,u,d,h=0,c=n.length;for(o=0;on.length){for(o=0;oi&&(i=r),i},B.numberOfLabelLines=function(t){var e=1;return B.each(t,(function(t){B.isArray(t)&&t.length>e&&(e=t.length)})),e},B.color=w?function(t){return t instanceof CanvasGradient&&(t=Y.global.defaultColor),w(t)}:function(t){return console.error("Color.js not found!"),t},B.getHoverColor=function(t){return t instanceof CanvasPattern||t instanceof CanvasGradient?t:B.color(t).saturate(.5).darken(.1).rgbString()}}(),nn._adapters=on,nn.Animation=J,nn.animationService=Q,nn.controllers=Qt,nn.DatasetController=at,nn.defaults=Y,nn.Element=X,nn.elements=kt,nn.Interaction=oe,nn.layouts=pe,nn.platform=Le,nn.plugins=Re,nn.Scale=_n,nn.scaleService=Ne,nn.Ticks=sn,nn.Tooltip=qe,nn.helpers.each(gi,(function(t,e){nn.scaleService.registerScaleType(e,t,t._defaults)})),Ni)Ni.hasOwnProperty(Ei)&&nn.plugins.register(Ni[Ei]);nn.platform.initialize();var Vi=nn;return"undefined"!=typeof window&&(window.Chart=nn),nn.Chart=nn,nn.Legend=Ni.legend._element,nn.Title=Ni.title._element,nn.pluginService=nn.plugins,nn.PluginBase=nn.Element.extend({}),nn.canvasHelpers=nn.helpers.canvas,nn.layoutService=nn.layouts,nn.LinearScaleBase=Cn,nn.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],(function(t){nn[t]=function(e,n){return new nn(e,nn.helpers.merge(n||{},{type:t.charAt(0).toLowerCase()+t.slice(1)}))}})),Vi})); diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/chartjs/chartjs-gauge.min.js b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/chartjs/chartjs-gauge.min.js new file mode 100755 index 00000000..96ccfd0c --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/chartjs/chartjs-gauge.min.js @@ -0,0 +1,7 @@ +/*! + * chartjs-gauge.js v0.3.0 + * https://github.com/haiiaaa/chartjs-gauge/ + * (c) 2021 chartjs-gauge.js Contributors + * Released under the MIT License + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("chart.js")):"function"==typeof define&&define.amd?define(["chart.js"],e):(t=t||self).Gauge=e(t.Chart)}(this,(function(t){"use strict";function e(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function r(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,a)}return r}(t=t&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t).defaults._set("gauge",{needle:{radiusPercentage:2,widthPercentage:3.2,lengthPercentage:80,color:"rgba(0, 0, 0, 1)"},valueLabel:{display:!0,formatter:null,color:"rgba(255, 255, 255, 1)",backgroundColor:"rgba(0, 0, 0, 1)",borderRadius:5,padding:{top:5,right:5,bottom:5,left:5},bottomMarginPercentage:5},animation:{duration:1e3,animateRotate:!0,animateScale:!1},cutoutPercentage:50,rotation:-Math.PI,circumference:Math.PI,legend:{display:!1},tooltips:{enabled:!1}});var a=t.controllers.doughnut.extend({getValuePercent:function(t,e){var r=t.minValue,a=t.data,n=r||0;return(e-n)/((a[a.length-1]||1)-n)},getWidth:function(t){return t.chartArea.right-t.chartArea.left},getTranslation:function(t){var e=t.chartArea,r=t.offsetX,a=t.offsetY;return{dx:(e.left+e.right)/2+r,dy:(e.top+e.bottom)/2+a}},getAngle:function(t){var e=t.chart,r=t.valuePercent,a=e.options;return a.rotation+a.circumference*r},drawNeedle:function(t){this.chart.animating||(t=1);var e=this.chart,r=e.ctx,a=e.config,n=e.innerRadius,i=e.outerRadius,o=a.data.datasets[this.index],l=this.getMeta().previous,c=a.options.needle,s=c.radiusPercentage,u=c.widthPercentage,h=c.lengthPercentage,d=c.color,g=this.getWidth(this.chart),f=s/100*g,p=u/100*g,b=h/100*(i-n)+n,P=this.getTranslation(this.chart),v=P.dx,m=P.dy,y=this.getAngle({chart:this.chart,valuePercent:l.valuePercent}),x=y+(this.getAngle({chart:this.chart,valuePercent:this.getValuePercent(o,o.value)})-y)*t;r.save(),r.translate(v,m),r.rotate(x),r.fillStyle=d,r.beginPath(),r.ellipse(0,0,f,f,0,0,2*Math.PI),r.fill(),r.beginPath(),r.moveTo(0,p/2),r.lineTo(b,0),r.lineTo(0,-p/2),r.fill(),r.restore()},drawValueLabel:function(e){if(this.chart.config.options.valueLabel.display){var r=this.chart,a=r.ctx,n=r.config,i=n.options.defaultFontFamily,o=n.data.datasets[this.index],l=n.options.valueLabel,c=l.formatter,s=l.fontSize,u=l.color,h=l.backgroundColor,d=l.borderRadius,g=l.padding,f=l.bottomMarginPercentage/100*this.getWidth(this.chart),p=(c||function(t){return t})(o.value).toString();a.textBaseline="middle",a.textAlign="center",s&&(a.font="".concat(s,"px ").concat(i));var b=a.measureText(p).width,P=Math.max(a.measureText("m").width,a.measureText("W").width),v=-(g.left+b/2),m=-(g.top+P/2),y=g.left+b+g.right,x=g.top+P+g.bottom,w=this.getTranslation(this.chart),O=w.dx,j=w.dy,M=this.chart.options.rotation%(2*Math.PI);O+=f*Math.cos(M+Math.PI/2),j+=f*Math.sin(M+Math.PI/2),a.save(),a.translate(O,j),a.beginPath(),t.helpers.canvas.roundedRect(a,v,m,y,x,d),a.fillStyle=h,a.fill(),a.fillStyle=u||n.options.defaultFontColor;a.fillText(p,0,.075*P),a.restore()}},update:function(e){var r=this.chart.config.data.datasets[this.index];r.minValue=r.minValue||0;var a=this.getMeta(),n={valuePercent:0};e?(a.previous=null,a.current=n):(r.data.sort((function(t,e){return t-e})),a.previous=a.current||n,a.current={valuePercent:this.getValuePercent(r,r.value)}),t.controllers.doughnut.prototype.update.call(this,e)},updateElement:function(a,n,i){t.controllers.doughnut.prototype.updateElement.call(this,a,n,i);var o=this.getDataset(),l=o.data,c=0===n?o.minValue:l[n-1],s=l[n],u=this.getAngle({chart:this.chart,valuePercent:this.getValuePercent(o,c)}),h=this.getAngle({chart:this.chart,valuePercent:this.getValuePercent(o,s)}),d=h-u;a._model=function(t){for(var a=1;a'+simba_tfa_frontend.saving+'' }); + + // https://stackoverflow.com/questions/10147149/how-can-i-override-jquerys-serialize-to-include-unchecked-checkboxes + var form_data = $('.tfa_settings_form input, .tfa_settings_form textarea, .tfa_settings_form select').serialize(); + + // Include unchecked checkboxes. Use filter to only include unchecked boxes. + $.each($('.tfa_settings_form input[type=checkbox]') + .filter(function(idx) { + return $(this).prop('checked') === false + }), + function(idx, el){ + // attach matched element names to the form_data with a chosen value. + var emptyVal = '0'; + form_data += '&' + $(el).attr('name') + '=' + emptyVal; + } + ); + + $.post(simba_tfa_frontend.ajax_url, { + action: 'tfa_frontend', + subaction: 'savesettings', + settings: form_data, + nonce: simba_tfa_frontend.nonce + }, function(response) { + var settings_saved = false; + try { + var resp = JSON.parse(response); + if (resp.hasOwnProperty('result')) { + settings_saved = true; + tfa_query_leaving = false; + // Allow user code to respond + $(document).trigger('tfa_settings_saved', resp); + } + + if (resp.hasOwnProperty('message')) { + alert(resp.message); + } + + if (resp.hasOwnProperty('qr')) { + $('.simbaotp_qr_container').data('qrcode', resp['qr']).empty().qrcode({ + "render": "image", + "text": resp['qr'], + }); + } + + if (resp.hasOwnProperty('al_type_disp')) { + $("#al_type_name").html(resp['al_type_disp']['disp']); + $("#al_type_desc").html(resp['al_type_disp']['desc']); + } + + } catch(err) { + console.log(err); + console.log(response); + if ('' === simba_tfa_frontend.also_try) { + alert(simba_tfa_frontend.response+response); + } + } + if ('' != simba_tfa_frontend.also_try) { + if (!settings_saved) { + $.post(simba_tfa_frontend.also_try, { + action: 'tfa_frontend', + subaction: 'savesettings', + settings: form_data, + nonce: simba_tfa_frontend.nonce + }, function(response) { + + try { + var resp = JSON.parse(response); + if (resp.hasOwnProperty('result')) { + settings_saved = true; + tfa_query_leaving = false; + // Allow user code to respond + $(document).trigger('tfa_settings_saved', resp); + } + if (resp.hasOwnProperty('message')) { + alert(resp.message); + } + if (resp.hasOwnProperty('qr')) { + $('.simbaotp_qr_container').data('qrcode', resp['qr']).empty().qrcode({ + "render": "image", + "text": resp['qr'], + }); + } + if (resp.hasOwnProperty('al_type_disp')) { + $("#al_type_name").html(resp['al_type_disp']['disp']); + $("#al_type_desc").html(resp['al_type_disp']['desc']); + } + + } catch(err) { + console.log(err); + console.log(response); + alert(simba_tfa_frontend.response+response); + } + $.unblockUI(); + }); + } else { + $.unblockUI(); + } + } else { + $.unblockUI(); + } + }); + + }); +}); diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/gutenberg-blocks.js b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/gutenberg-blocks.js new file mode 100755 index 00000000..6fdf9843 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/gutenberg-blocks.js @@ -0,0 +1,19 @@ +var registerBlockType = wp.blocks.registerBlockType; +var createElement = wp.element.createElement; +var serverSideRender = wp.serverSideRender; + +registerBlockType('twofactor/user-settings', { + title: tfa_trans.block_title, + icon: 'lock', + category: 'widgets', + edit: function (props) { + return createElement( + 'div', + null, + createElement(serverSideRender, { + block: 'twofactor/user-settings', + attributes: props.attributes, + } ) + ); + }, +} ); \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/jquery-qrcode/README.md b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/jquery-qrcode/README.md new file mode 100755 index 00000000..e33c40e9 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/jquery-qrcode/README.md @@ -0,0 +1,40 @@ +# jQuery.qrcode + +[![license][license-img]][github] [![web][web-img]][web] [![github][github-img]][github] [![bower][bower-img]][github] + +jQuery plugin to dynamically generate QR codes. Uses [QR Code Generator][qrcode] (MIT). + + +## License +The MIT License (MIT) + +Copyright (c) 2016 Lars Jung (https://larsjung.de) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +[web]: https://larsjung.de/qrcode/ +[github]: https://github.com/lrsjng/jquery-qrcode + +[license-img]: https://img.shields.io/badge/license-MIT-a0a060.svg?style=flat-square +[web-img]: https://img.shields.io/badge/web-larsjung.de/qrcode-a0a060.svg?style=flat-square +[github-img]: https://img.shields.io/badge/github-lrsjng/jquery--qrcode-a0a060.svg?style=flat-square +[bower-img]: https://img.shields.io/badge/bower-lrsjng/jquery--qrcode-a0a060.svg?style=flat-square + +[qrcode]: https://github.com/kazuhikoarase/qrcode-generator diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/jquery-qrcode/jquery-qrcode.js b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/jquery-qrcode/jquery-qrcode.js new file mode 100755 index 00000000..b87e884b --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/jquery-qrcode/jquery-qrcode.js @@ -0,0 +1,2332 @@ +/*! jquery-qrcode v0.14.0 - https://larsjung.de/jquery-qrcode/ */ +(function (vendor_qrcode) { + 'use strict'; + + var jq = window.jQuery; + + // Check if canvas is available in the browser (as Modernizr does) + var hasCanvas = (function () { + var elem = document.createElement('canvas'); + return !!(elem.getContext && elem.getContext('2d')); + }()); + + // Wrapper for the original QR code generator. + function createQRCode(text, level, version, quiet) { + var qr = {}; + + var vqr = vendor_qrcode(version, level); + vqr.addData(text); + vqr.make(); + + quiet = quiet || 0; + + var qrModuleCount = vqr.getModuleCount(); + var quietModuleCount = vqr.getModuleCount() + 2 * quiet; + + function isDark(row, col) { + row -= quiet; + col -= quiet; + + if (row < 0 || row >= qrModuleCount || col < 0 || col >= qrModuleCount) { + return false; + } + return vqr.isDark(row, col); + } + + function addBlank(l, t, r, b) { + var prevIsDark = qr.isDark; + var moduleSize = 1 / quietModuleCount; + + qr.isDark = function (row, col) { + var ml = col * moduleSize; + var mt = row * moduleSize; + var mr = ml + moduleSize; + var mb = mt + moduleSize; + + return prevIsDark(row, col) && (l > mr || ml > r || t > mb || mt > b); + }; + } + + qr.text = text; + qr.level = level; + qr.version = version; + qr.moduleCount = quietModuleCount; + qr.isDark = isDark; + qr.addBlank = addBlank; + + return qr; + } + + // Returns a minimal QR code for the given text starting with version `minVersion`. + // Returns `undefined` if `text` is too long to be encoded in `maxVersion`. + function createMinQRCode(text, level, minVersion, maxVersion, quiet) { + minVersion = Math.max(1, minVersion || 1); + maxVersion = Math.min(40, maxVersion || 40); + for (var version = minVersion; version <= maxVersion; version += 1) { + try { + return createQRCode(text, level, version, quiet); + } catch (err) {/* empty */} + } + return undefined; + } + + function drawBackgroundLabel(qr, context, settings) { + var size = settings.size; + var font = 'bold ' + settings.mSize * size + 'px ' + settings.fontname; + var ctx = jq('')[0].getContext('2d'); + + ctx.font = font; + + var w = ctx.measureText(settings.label).width; + var sh = settings.mSize; + var sw = w / size; + var sl = (1 - sw) * settings.mPosX; + var st = (1 - sh) * settings.mPosY; + var sr = sl + sw; + var sb = st + sh; + var pad = 0.01; + + if (settings.mode === 1) { + // Strip + qr.addBlank(0, st - pad, size, sb + pad); + } else { + // Box + qr.addBlank(sl - pad, st - pad, sr + pad, sb + pad); + } + + context.fillStyle = settings.fontcolor; + context.font = font; + context.fillText(settings.label, sl * size, st * size + 0.75 * settings.mSize * size); + } + + function drawBackgroundImage(qr, context, settings) { + var size = settings.size; + var w = settings.image.naturalWidth || 1; + var h = settings.image.naturalHeight || 1; + var sh = settings.mSize; + var sw = sh * w / h; + var sl = (1 - sw) * settings.mPosX; + var st = (1 - sh) * settings.mPosY; + var sr = sl + sw; + var sb = st + sh; + var pad = 0.01; + + if (settings.mode === 3) { + // Strip + qr.addBlank(0, st - pad, size, sb + pad); + } else { + // Box + qr.addBlank(sl - pad, st - pad, sr + pad, sb + pad); + } + + context.drawImage(settings.image, sl * size, st * size, sw * size, sh * size); + } + + function drawBackground(qr, context, settings) { + if (jq(settings.background).is('img')) { + context.drawImage(settings.background, 0, 0, settings.size, settings.size); + } else if (settings.background) { + context.fillStyle = settings.background; + context.fillRect(settings.left, settings.top, settings.size, settings.size); + } + + var mode = settings.mode; + if (mode === 1 || mode === 2) { + drawBackgroundLabel(qr, context, settings); + } else if (mode === 3 || mode === 4) { + drawBackgroundImage(qr, context, settings); + } + } + + function drawModuleDefault(qr, context, settings, left, top, width, row, col) { + if (qr.isDark(row, col)) { + context.rect(left, top, width, width); + } + } + + function drawModuleRoundedDark(ctx, l, t, r, b, rad, nw, ne, se, sw) { + if (nw) { + ctx.moveTo(l + rad, t); + } else { + ctx.moveTo(l, t); + } + + if (ne) { + ctx.lineTo(r - rad, t); + ctx.arcTo(r, t, r, b, rad); + } else { + ctx.lineTo(r, t); + } + + if (se) { + ctx.lineTo(r, b - rad); + ctx.arcTo(r, b, l, b, rad); + } else { + ctx.lineTo(r, b); + } + + if (sw) { + ctx.lineTo(l + rad, b); + ctx.arcTo(l, b, l, t, rad); + } else { + ctx.lineTo(l, b); + } + + if (nw) { + ctx.lineTo(l, t + rad); + ctx.arcTo(l, t, r, t, rad); + } else { + ctx.lineTo(l, t); + } + } + + function drawModuleRoundendLight(ctx, l, t, r, b, rad, nw, ne, se, sw) { + if (nw) { + ctx.moveTo(l + rad, t); + ctx.lineTo(l, t); + ctx.lineTo(l, t + rad); + ctx.arcTo(l, t, l + rad, t, rad); + } + + if (ne) { + ctx.moveTo(r - rad, t); + ctx.lineTo(r, t); + ctx.lineTo(r, t + rad); + ctx.arcTo(r, t, r - rad, t, rad); + } + + if (se) { + ctx.moveTo(r - rad, b); + ctx.lineTo(r, b); + ctx.lineTo(r, b - rad); + ctx.arcTo(r, b, r - rad, b, rad); + } + + if (sw) { + ctx.moveTo(l + rad, b); + ctx.lineTo(l, b); + ctx.lineTo(l, b - rad); + ctx.arcTo(l, b, l + rad, b, rad); + } + } + + function drawModuleRounded(qr, context, settings, left, top, width, row, col) { + var isDark = qr.isDark; + var right = left + width; + var bottom = top + width; + var radius = settings.radius * width; + var rowT = row - 1; + var rowB = row + 1; + var colL = col - 1; + var colR = col + 1; + var center = isDark(row, col); + var northwest = isDark(rowT, colL); + var north = isDark(rowT, col); + var northeast = isDark(rowT, colR); + var east = isDark(row, colR); + var southeast = isDark(rowB, colR); + var south = isDark(rowB, col); + var southwest = isDark(rowB, colL); + var west = isDark(row, colL); + + if (center) { + drawModuleRoundedDark(context, left, top, right, bottom, radius, !north && !west, !north && !east, !south && !east, !south && !west); + } else { + drawModuleRoundendLight(context, left, top, right, bottom, radius, north && west && northwest, north && east && northeast, south && east && southeast, south && west && southwest); + } + } + + function drawModules(qr, context, settings) { + var moduleCount = qr.moduleCount; + var moduleSize = settings.size / moduleCount; + var fn = drawModuleDefault; + var row; + var col; + + if (settings.radius > 0 && settings.radius <= 0.5) { + fn = drawModuleRounded; + } + + context.beginPath(); + for (row = 0; row < moduleCount; row += 1) { + for (col = 0; col < moduleCount; col += 1) { + var l = settings.left + col * moduleSize; + var t = settings.top + row * moduleSize; + var w = moduleSize; + + fn(qr, context, settings, l, t, w, row, col); + } + } + if (jq(settings.fill).is('img')) { + context.strokeStyle = 'rgba(0,0,0,0.5)'; + context.lineWidth = 2; + context.stroke(); + var prev = context.globalCompositeOperation; + context.globalCompositeOperation = 'destination-out'; + context.fill(); + context.globalCompositeOperation = prev; + + context.clip(); + context.drawImage(settings.fill, 0, 0, settings.size, settings.size); + context.restore(); + } else { + context.fillStyle = settings.fill; + context.fill(); + } + } + + // Draws QR code to the given `canvas` and returns it. + function drawOnCanvas(canvas, settings) { + var qr = createMinQRCode(settings.text, settings.ecLevel, settings.minVersion, settings.maxVersion, settings.quiet); + if (!qr) { + return null; + } + + var $canvas = jq(canvas).data('qrcode', qr); + var context = $canvas[0].getContext('2d'); + + drawBackground(qr, context, settings); + drawModules(qr, context, settings); + + return $canvas; + } + + // Returns a `canvas` element representing the QR code for the given settings. + function createCanvas(settings) { + var $canvas = jq('').attr('width', settings.size).attr('height', settings.size); + return drawOnCanvas($canvas, settings); + } + + // Returns an `image` element representing the QR code for the given settings. + function createImage(settings) { + return jq('').attr('src', createCanvas(settings)[0].toDataURL('image/png')); + } + + // Returns a `div` element representing the QR code for the given settings. + function createDiv(settings) { + var qr = createMinQRCode(settings.text, settings.ecLevel, settings.minVersion, settings.maxVersion, settings.quiet); + if (!qr) { + return null; + } + + // some shortcuts to improve compression + var settings_size = settings.size; + var settings_bgColor = settings.background; + var math_floor = Math.floor; + + var moduleCount = qr.moduleCount; + var moduleSize = math_floor(settings_size / moduleCount); + var offset = math_floor(0.5 * (settings_size - moduleSize * moduleCount)); + + var row; + var col; + + var containerCSS = { + position: 'relative', + left: 0, + top: 0, + padding: 0, + margin: 0, + width: settings_size, + height: settings_size + }; + var darkCSS = { + position: 'absolute', + padding: 0, + margin: 0, + width: moduleSize, + height: moduleSize, + 'background-color': settings.fill + }; + + var $div = jq('
').data('qrcode', qr).css(containerCSS); + + if (settings_bgColor) { + $div.css('background-color', settings_bgColor); + } + + for (row = 0; row < moduleCount; row += 1) { + for (col = 0; col < moduleCount; col += 1) { + if (qr.isDark(row, col)) { + jq('
') + .css(darkCSS) + .css({ + left: offset + col * moduleSize, + top: offset + row * moduleSize + }) + .appendTo($div); + } + } + } + + return $div; + } + + function createHTML(settings) { + if (hasCanvas && settings.render === 'canvas') { + return createCanvas(settings); + } else if (hasCanvas && settings.render === 'image') { + return createImage(settings); + } + + return createDiv(settings); + } + + // Plugin + // ====== + + // Default settings + // ---------------- + var defaults = { + // render method: `'canvas'`, `'image'` or `'div'` + render: 'canvas', + + // version range somewhere in 1 .. 40 + minVersion: 1, + maxVersion: 40, + + // error correction level: `'L'`, `'M'`, `'Q'` or `'H'` + ecLevel: 'L', + + // offset in pixel if drawn onto existing canvas + left: 0, + top: 0, + + // size in pixel + size: 200, + + // code color or image element + fill: '#000', + + // background color or image element, `null` for transparent background + background: null, + + // content + text: 'no text', + + // corner radius relative to module width: 0.0 .. 0.5 + radius: 0, + + // quiet zone in modules + quiet: 0, + + // modes + // 0: normal + // 1: label strip + // 2: label box + // 3: image strip + // 4: image box + mode: 0, + + mSize: 0.1, + mPosX: 0.5, + mPosY: 0.5, + + label: 'no label', + fontname: 'sans', + fontcolor: '#000', + + image: null + }; + + // Register the plugin + // ------------------- + jq.fn.qrcode = function (options) { + var settings = jq.extend({}, defaults, options); + + return this.each(function (idx, el) { + if (el.nodeName.toLowerCase() === 'canvas') { + drawOnCanvas(el, settings); + } else { + jq(el).append(createHTML(settings)); + } + }); + }; +}(function () { + // `qrcode` is the single public function defined by the `QR Code Generator` + //--------------------------------------------------------------------- + // + // QR Code Generator for JavaScript + // + // Copyright (c) 2009 Kazuhiko Arase + // + // URL: http://www.d-project.com/ + // + // Licensed under the MIT license: + // http://www.opensource.org/licenses/mit-license.php + // + // The word 'QR Code' is registered trademark of + // DENSO WAVE INCORPORATED + // http://www.denso-wave.com/qrcode/faqpatent-e.html + // + //--------------------------------------------------------------------- + + var qrcode = function() { + + //--------------------------------------------------------------------- + // qrcode + //--------------------------------------------------------------------- + + /** + * qrcode + * @param typeNumber 1 to 40 + * @param errorCorrectLevel 'L','M','Q','H' + */ + var qrcode = function(typeNumber, errorCorrectLevel) { + + var PAD0 = 0xEC; + var PAD1 = 0x11; + + var _typeNumber = typeNumber; + var _errorCorrectLevel = QRErrorCorrectLevel[errorCorrectLevel]; + var _modules = null; + var _moduleCount = 0; + var _dataCache = null; + var _dataList = new Array(); + + var _this = {}; + + var makeImpl = function(test, maskPattern) { + + _moduleCount = _typeNumber * 4 + 17; + _modules = function(moduleCount) { + var modules = new Array(moduleCount); + for (var row = 0; row < moduleCount; row += 1) { + modules[row] = new Array(moduleCount); + for (var col = 0; col < moduleCount; col += 1) { + modules[row][col] = null; + } + } + return modules; + }(_moduleCount); + + setupPositionProbePattern(0, 0); + setupPositionProbePattern(_moduleCount - 7, 0); + setupPositionProbePattern(0, _moduleCount - 7); + setupPositionAdjustPattern(); + setupTimingPattern(); + setupTypeInfo(test, maskPattern); + + if (_typeNumber >= 7) { + setupTypeNumber(test); + } + + if (_dataCache == null) { + _dataCache = createData(_typeNumber, _errorCorrectLevel, _dataList); + } + + mapData(_dataCache, maskPattern); + }; + + var setupPositionProbePattern = function(row, col) { + + for (var r = -1; r <= 7; r += 1) { + + if (row + r <= -1 || _moduleCount <= row + r) continue; + + for (var c = -1; c <= 7; c += 1) { + + if (col + c <= -1 || _moduleCount <= col + c) continue; + + if ( (0 <= r && r <= 6 && (c == 0 || c == 6) ) + || (0 <= c && c <= 6 && (r == 0 || r == 6) ) + || (2 <= r && r <= 4 && 2 <= c && c <= 4) ) { + _modules[row + r][col + c] = true; + } else { + _modules[row + r][col + c] = false; + } + } + } + }; + + var getBestMaskPattern = function() { + + var minLostPoint = 0; + var pattern = 0; + + for (var i = 0; i < 8; i += 1) { + + makeImpl(true, i); + + var lostPoint = QRUtil.getLostPoint(_this); + + if (i == 0 || minLostPoint > lostPoint) { + minLostPoint = lostPoint; + pattern = i; + } + } + + return pattern; + }; + + var setupTimingPattern = function() { + + for (var r = 8; r < _moduleCount - 8; r += 1) { + if (_modules[r][6] != null) { + continue; + } + _modules[r][6] = (r % 2 == 0); + } + + for (var c = 8; c < _moduleCount - 8; c += 1) { + if (_modules[6][c] != null) { + continue; + } + _modules[6][c] = (c % 2 == 0); + } + }; + + var setupPositionAdjustPattern = function() { + + var pos = QRUtil.getPatternPosition(_typeNumber); + + for (var i = 0; i < pos.length; i += 1) { + + for (var j = 0; j < pos.length; j += 1) { + + var row = pos[i]; + var col = pos[j]; + + if (_modules[row][col] != null) { + continue; + } + + for (var r = -2; r <= 2; r += 1) { + + for (var c = -2; c <= 2; c += 1) { + + if (r == -2 || r == 2 || c == -2 || c == 2 + || (r == 0 && c == 0) ) { + _modules[row + r][col + c] = true; + } else { + _modules[row + r][col + c] = false; + } + } + } + } + } + }; + + var setupTypeNumber = function(test) { + + var bits = QRUtil.getBCHTypeNumber(_typeNumber); + + for (var i = 0; i < 18; i += 1) { + var mod = (!test && ( (bits >> i) & 1) == 1); + _modules[Math.floor(i / 3)][i % 3 + _moduleCount - 8 - 3] = mod; + } + + for (var i = 0; i < 18; i += 1) { + var mod = (!test && ( (bits >> i) & 1) == 1); + _modules[i % 3 + _moduleCount - 8 - 3][Math.floor(i / 3)] = mod; + } + }; + + var setupTypeInfo = function(test, maskPattern) { + + var data = (_errorCorrectLevel << 3) | maskPattern; + var bits = QRUtil.getBCHTypeInfo(data); + + // vertical + for (var i = 0; i < 15; i += 1) { + + var mod = (!test && ( (bits >> i) & 1) == 1); + + if (i < 6) { + _modules[i][8] = mod; + } else if (i < 8) { + _modules[i + 1][8] = mod; + } else { + _modules[_moduleCount - 15 + i][8] = mod; + } + } + + // horizontal + for (var i = 0; i < 15; i += 1) { + + var mod = (!test && ( (bits >> i) & 1) == 1); + + if (i < 8) { + _modules[8][_moduleCount - i - 1] = mod; + } else if (i < 9) { + _modules[8][15 - i - 1 + 1] = mod; + } else { + _modules[8][15 - i - 1] = mod; + } + } + + // fixed module + _modules[_moduleCount - 8][8] = (!test); + }; + + var mapData = function(data, maskPattern) { + + var inc = -1; + var row = _moduleCount - 1; + var bitIndex = 7; + var byteIndex = 0; + var maskFunc = QRUtil.getMaskFunction(maskPattern); + + for (var col = _moduleCount - 1; col > 0; col -= 2) { + + if (col == 6) col -= 1; + + while (true) { + + for (var c = 0; c < 2; c += 1) { + + if (_modules[row][col - c] == null) { + + var dark = false; + + if (byteIndex < data.length) { + dark = ( ( (data[byteIndex] >>> bitIndex) & 1) == 1); + } + + var mask = maskFunc(row, col - c); + + if (mask) { + dark = !dark; + } + + _modules[row][col - c] = dark; + bitIndex -= 1; + + if (bitIndex == -1) { + byteIndex += 1; + bitIndex = 7; + } + } + } + + row += inc; + + if (row < 0 || _moduleCount <= row) { + row -= inc; + inc = -inc; + break; + } + } + } + }; + + var createBytes = function(buffer, rsBlocks) { + + var offset = 0; + + var maxDcCount = 0; + var maxEcCount = 0; + + var dcdata = new Array(rsBlocks.length); + var ecdata = new Array(rsBlocks.length); + + for (var r = 0; r < rsBlocks.length; r += 1) { + + var dcCount = rsBlocks[r].dataCount; + var ecCount = rsBlocks[r].totalCount - dcCount; + + maxDcCount = Math.max(maxDcCount, dcCount); + maxEcCount = Math.max(maxEcCount, ecCount); + + dcdata[r] = new Array(dcCount); + + for (var i = 0; i < dcdata[r].length; i += 1) { + dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset]; + } + offset += dcCount; + + var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount); + var rawPoly = qrPolynomial(dcdata[r], rsPoly.getLength() - 1); + + var modPoly = rawPoly.mod(rsPoly); + ecdata[r] = new Array(rsPoly.getLength() - 1); + for (var i = 0; i < ecdata[r].length; i += 1) { + var modIndex = i + modPoly.getLength() - ecdata[r].length; + ecdata[r][i] = (modIndex >= 0)? modPoly.getAt(modIndex) : 0; + } + } + + var totalCodeCount = 0; + for (var i = 0; i < rsBlocks.length; i += 1) { + totalCodeCount += rsBlocks[i].totalCount; + } + + var data = new Array(totalCodeCount); + var index = 0; + + for (var i = 0; i < maxDcCount; i += 1) { + for (var r = 0; r < rsBlocks.length; r += 1) { + if (i < dcdata[r].length) { + data[index] = dcdata[r][i]; + index += 1; + } + } + } + + for (var i = 0; i < maxEcCount; i += 1) { + for (var r = 0; r < rsBlocks.length; r += 1) { + if (i < ecdata[r].length) { + data[index] = ecdata[r][i]; + index += 1; + } + } + } + + return data; + }; + + var createData = function(typeNumber, errorCorrectLevel, dataList) { + + var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel); + + var buffer = qrBitBuffer(); + + for (var i = 0; i < dataList.length; i += 1) { + var data = dataList[i]; + buffer.put(data.getMode(), 4); + buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber) ); + data.write(buffer); + } + + // calc num max data. + var totalDataCount = 0; + for (var i = 0; i < rsBlocks.length; i += 1) { + totalDataCount += rsBlocks[i].dataCount; + } + + if (buffer.getLengthInBits() > totalDataCount * 8) { + throw new Error('code length overflow. (' + + buffer.getLengthInBits() + + '>' + + totalDataCount * 8 + + ')'); + } + + // end code + if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) { + buffer.put(0, 4); + } + + // padding + while (buffer.getLengthInBits() % 8 != 0) { + buffer.putBit(false); + } + + // padding + while (true) { + + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(PAD0, 8); + + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(PAD1, 8); + } + + return createBytes(buffer, rsBlocks); + }; + + _this.addData = function(data) { + var newData = qr8BitByte(data); + _dataList.push(newData); + _dataCache = null; + }; + + _this.isDark = function(row, col) { + if (row < 0 || _moduleCount <= row || col < 0 || _moduleCount <= col) { + throw new Error(row + ',' + col); + } + return _modules[row][col]; + }; + + _this.getModuleCount = function() { + return _moduleCount; + }; + + _this.make = function() { + makeImpl(false, getBestMaskPattern() ); + }; + + _this.createTableTag = function(cellSize, margin) { + + cellSize = cellSize || 2; + margin = (typeof margin == 'undefined')? cellSize * 4 : margin; + + var qrHtml = ''; + + qrHtml += ''; + qrHtml += ''; + + for (var r = 0; r < _this.getModuleCount(); r += 1) { + + qrHtml += ''; + + for (var c = 0; c < _this.getModuleCount(); c += 1) { + qrHtml += ''; + } + + qrHtml += ''; + qrHtml += '
'; + } + + qrHtml += '
'; + + return qrHtml; + }; + + _this.createImgTag = function(cellSize, margin) { + + cellSize = cellSize || 2; + margin = (typeof margin == 'undefined')? cellSize * 4 : margin; + + var size = _this.getModuleCount() * cellSize + margin * 2; + var min = margin; + var max = size - margin; + + return createImgTag(size, size, function(x, y) { + if (min <= x && x < max && min <= y && y < max) { + var c = Math.floor( (x - min) / cellSize); + var r = Math.floor( (y - min) / cellSize); + return _this.isDark(r, c)? 0 : 1; + } else { + return 1; + } + } ); + }; + + return _this; + }; + + //--------------------------------------------------------------------- + // qrcode.stringToBytes + //--------------------------------------------------------------------- + + qrcode.stringToBytes = function(s) { + var bytes = new Array(); + for (var i = 0; i < s.length; i += 1) { + var c = s.charCodeAt(i); + bytes.push(c & 0xff); + } + return bytes; + }; + + //--------------------------------------------------------------------- + // qrcode.createStringToBytes + //--------------------------------------------------------------------- + + /** + * @param unicodeData base64 string of byte array. + * [16bit Unicode],[16bit Bytes], ... + * @param numChars + */ + qrcode.createStringToBytes = function(unicodeData, numChars) { + + // create conversion map. + + var unicodeMap = function() { + + var bin = base64DecodeInputStream(unicodeData); + var read = function() { + var b = bin.read(); + if (b == -1) throw new Error(); + return b; + }; + + var count = 0; + var unicodeMap = {}; + while (true) { + var b0 = bin.read(); + if (b0 == -1) break; + var b1 = read(); + var b2 = read(); + var b3 = read(); + var k = String.fromCharCode( (b0 << 8) | b1); + var v = (b2 << 8) | b3; + unicodeMap[k] = v; + count += 1; + } + if (count != numChars) { + throw new Error(count + ' != ' + numChars); + } + + return unicodeMap; + }(); + + var unknownChar = '?'.charCodeAt(0); + + return function(s) { + var bytes = new Array(); + for (var i = 0; i < s.length; i += 1) { + var c = s.charCodeAt(i); + if (c < 128) { + bytes.push(c); + } else { + var b = unicodeMap[s.charAt(i)]; + if (typeof b == 'number') { + if ( (b & 0xff) == b) { + // 1byte + bytes.push(b); + } else { + // 2bytes + bytes.push(b >>> 8); + bytes.push(b & 0xff); + } + } else { + bytes.push(unknownChar); + } + } + } + return bytes; + }; + }; + + //--------------------------------------------------------------------- + // QRMode + //--------------------------------------------------------------------- + + var QRMode = { + MODE_NUMBER : 1 << 0, + MODE_ALPHA_NUM : 1 << 1, + MODE_8BIT_BYTE : 1 << 2, + MODE_KANJI : 1 << 3 + }; + + //--------------------------------------------------------------------- + // QRErrorCorrectLevel + //--------------------------------------------------------------------- + + var QRErrorCorrectLevel = { + L : 1, + M : 0, + Q : 3, + H : 2 + }; + + //--------------------------------------------------------------------- + // QRMaskPattern + //--------------------------------------------------------------------- + + var QRMaskPattern = { + PATTERN000 : 0, + PATTERN001 : 1, + PATTERN010 : 2, + PATTERN011 : 3, + PATTERN100 : 4, + PATTERN101 : 5, + PATTERN110 : 6, + PATTERN111 : 7 + }; + + //--------------------------------------------------------------------- + // QRUtil + //--------------------------------------------------------------------- + + var QRUtil = function() { + + var PATTERN_POSITION_TABLE = [ + [], + [6, 18], + [6, 22], + [6, 26], + [6, 30], + [6, 34], + [6, 22, 38], + [6, 24, 42], + [6, 26, 46], + [6, 28, 50], + [6, 30, 54], + [6, 32, 58], + [6, 34, 62], + [6, 26, 46, 66], + [6, 26, 48, 70], + [6, 26, 50, 74], + [6, 30, 54, 78], + [6, 30, 56, 82], + [6, 30, 58, 86], + [6, 34, 62, 90], + [6, 28, 50, 72, 94], + [6, 26, 50, 74, 98], + [6, 30, 54, 78, 102], + [6, 28, 54, 80, 106], + [6, 32, 58, 84, 110], + [6, 30, 58, 86, 114], + [6, 34, 62, 90, 118], + [6, 26, 50, 74, 98, 122], + [6, 30, 54, 78, 102, 126], + [6, 26, 52, 78, 104, 130], + [6, 30, 56, 82, 108, 134], + [6, 34, 60, 86, 112, 138], + [6, 30, 58, 86, 114, 142], + [6, 34, 62, 90, 118, 146], + [6, 30, 54, 78, 102, 126, 150], + [6, 24, 50, 76, 102, 128, 154], + [6, 28, 54, 80, 106, 132, 158], + [6, 32, 58, 84, 110, 136, 162], + [6, 26, 54, 82, 110, 138, 166], + [6, 30, 58, 86, 114, 142, 170] + ]; + var G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0); + var G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0); + var G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1); + + var _this = {}; + + var getBCHDigit = function(data) { + var digit = 0; + while (data != 0) { + digit += 1; + data >>>= 1; + } + return digit; + }; + + _this.getBCHTypeInfo = function(data) { + var d = data << 10; + while (getBCHDigit(d) - getBCHDigit(G15) >= 0) { + d ^= (G15 << (getBCHDigit(d) - getBCHDigit(G15) ) ); + } + return ( (data << 10) | d) ^ G15_MASK; + }; + + _this.getBCHTypeNumber = function(data) { + var d = data << 12; + while (getBCHDigit(d) - getBCHDigit(G18) >= 0) { + d ^= (G18 << (getBCHDigit(d) - getBCHDigit(G18) ) ); + } + return (data << 12) | d; + }; + + _this.getPatternPosition = function(typeNumber) { + return PATTERN_POSITION_TABLE[typeNumber - 1]; + }; + + _this.getMaskFunction = function(maskPattern) { + + switch (maskPattern) { + + case QRMaskPattern.PATTERN000 : + return function(i, j) { return (i + j) % 2 == 0; }; + case QRMaskPattern.PATTERN001 : + return function(i, j) { return i % 2 == 0; }; + case QRMaskPattern.PATTERN010 : + return function(i, j) { return j % 3 == 0; }; + case QRMaskPattern.PATTERN011 : + return function(i, j) { return (i + j) % 3 == 0; }; + case QRMaskPattern.PATTERN100 : + return function(i, j) { return (Math.floor(i / 2) + Math.floor(j / 3) ) % 2 == 0; }; + case QRMaskPattern.PATTERN101 : + return function(i, j) { return (i * j) % 2 + (i * j) % 3 == 0; }; + case QRMaskPattern.PATTERN110 : + return function(i, j) { return ( (i * j) % 2 + (i * j) % 3) % 2 == 0; }; + case QRMaskPattern.PATTERN111 : + return function(i, j) { return ( (i * j) % 3 + (i + j) % 2) % 2 == 0; }; + + default : + throw new Error('bad maskPattern:' + maskPattern); + } + }; + + _this.getErrorCorrectPolynomial = function(errorCorrectLength) { + var a = qrPolynomial([1], 0); + for (var i = 0; i < errorCorrectLength; i += 1) { + a = a.multiply(qrPolynomial([1, QRMath.gexp(i)], 0) ); + } + return a; + }; + + _this.getLengthInBits = function(mode, type) { + + if (1 <= type && type < 10) { + + // 1 - 9 + + switch(mode) { + case QRMode.MODE_NUMBER : return 10; + case QRMode.MODE_ALPHA_NUM : return 9; + case QRMode.MODE_8BIT_BYTE : return 8; + case QRMode.MODE_KANJI : return 8; + default : + throw new Error('mode:' + mode); + } + + } else if (type < 27) { + + // 10 - 26 + + switch(mode) { + case QRMode.MODE_NUMBER : return 12; + case QRMode.MODE_ALPHA_NUM : return 11; + case QRMode.MODE_8BIT_BYTE : return 16; + case QRMode.MODE_KANJI : return 10; + default : + throw new Error('mode:' + mode); + } + + } else if (type < 41) { + + // 27 - 40 + + switch(mode) { + case QRMode.MODE_NUMBER : return 14; + case QRMode.MODE_ALPHA_NUM : return 13; + case QRMode.MODE_8BIT_BYTE : return 16; + case QRMode.MODE_KANJI : return 12; + default : + throw new Error('mode:' + mode); + } + + } else { + throw new Error('type:' + type); + } + }; + + _this.getLostPoint = function(qrcode) { + + var moduleCount = qrcode.getModuleCount(); + + var lostPoint = 0; + + // LEVEL1 + + for (var row = 0; row < moduleCount; row += 1) { + for (var col = 0; col < moduleCount; col += 1) { + + var sameCount = 0; + var dark = qrcode.isDark(row, col); + + for (var r = -1; r <= 1; r += 1) { + + if (row + r < 0 || moduleCount <= row + r) { + continue; + } + + for (var c = -1; c <= 1; c += 1) { + + if (col + c < 0 || moduleCount <= col + c) { + continue; + } + + if (r == 0 && c == 0) { + continue; + } + + if (dark == qrcode.isDark(row + r, col + c) ) { + sameCount += 1; + } + } + } + + if (sameCount > 5) { + lostPoint += (3 + sameCount - 5); + } + } + }; + + // LEVEL2 + + for (var row = 0; row < moduleCount - 1; row += 1) { + for (var col = 0; col < moduleCount - 1; col += 1) { + var count = 0; + if (qrcode.isDark(row, col) ) count += 1; + if (qrcode.isDark(row + 1, col) ) count += 1; + if (qrcode.isDark(row, col + 1) ) count += 1; + if (qrcode.isDark(row + 1, col + 1) ) count += 1; + if (count == 0 || count == 4) { + lostPoint += 3; + } + } + } + + // LEVEL3 + + for (var row = 0; row < moduleCount; row += 1) { + for (var col = 0; col < moduleCount - 6; col += 1) { + if (qrcode.isDark(row, col) + && !qrcode.isDark(row, col + 1) + && qrcode.isDark(row, col + 2) + && qrcode.isDark(row, col + 3) + && qrcode.isDark(row, col + 4) + && !qrcode.isDark(row, col + 5) + && qrcode.isDark(row, col + 6) ) { + lostPoint += 40; + } + } + } + + for (var col = 0; col < moduleCount; col += 1) { + for (var row = 0; row < moduleCount - 6; row += 1) { + if (qrcode.isDark(row, col) + && !qrcode.isDark(row + 1, col) + && qrcode.isDark(row + 2, col) + && qrcode.isDark(row + 3, col) + && qrcode.isDark(row + 4, col) + && !qrcode.isDark(row + 5, col) + && qrcode.isDark(row + 6, col) ) { + lostPoint += 40; + } + } + } + + // LEVEL4 + + var darkCount = 0; + + for (var col = 0; col < moduleCount; col += 1) { + for (var row = 0; row < moduleCount; row += 1) { + if (qrcode.isDark(row, col) ) { + darkCount += 1; + } + } + } + + var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5; + lostPoint += ratio * 10; + + return lostPoint; + }; + + return _this; + }(); + + //--------------------------------------------------------------------- + // QRMath + //--------------------------------------------------------------------- + + var QRMath = function() { + + var EXP_TABLE = new Array(256); + var LOG_TABLE = new Array(256); + + // initialize tables + for (var i = 0; i < 8; i += 1) { + EXP_TABLE[i] = 1 << i; + } + for (var i = 8; i < 256; i += 1) { + EXP_TABLE[i] = EXP_TABLE[i - 4] + ^ EXP_TABLE[i - 5] + ^ EXP_TABLE[i - 6] + ^ EXP_TABLE[i - 8]; + } + for (var i = 0; i < 255; i += 1) { + LOG_TABLE[EXP_TABLE[i] ] = i; + } + + var _this = {}; + + _this.glog = function(n) { + + if (n < 1) { + throw new Error('glog(' + n + ')'); + } + + return LOG_TABLE[n]; + }; + + _this.gexp = function(n) { + + while (n < 0) { + n += 255; + } + + while (n >= 256) { + n -= 255; + } + + return EXP_TABLE[n]; + }; + + return _this; + }(); + + //--------------------------------------------------------------------- + // qrPolynomial + //--------------------------------------------------------------------- + + function qrPolynomial(num, shift) { + + if (typeof num.length == 'undefined') { + throw new Error(num.length + '/' + shift); + } + + var _num = function() { + var offset = 0; + while (offset < num.length && num[offset] == 0) { + offset += 1; + } + var _num = new Array(num.length - offset + shift); + for (var i = 0; i < num.length - offset; i += 1) { + _num[i] = num[i + offset]; + } + return _num; + }(); + + var _this = {}; + + _this.getAt = function(index) { + return _num[index]; + }; + + _this.getLength = function() { + return _num.length; + }; + + _this.multiply = function(e) { + + var num = new Array(_this.getLength() + e.getLength() - 1); + + for (var i = 0; i < _this.getLength(); i += 1) { + for (var j = 0; j < e.getLength(); j += 1) { + num[i + j] ^= QRMath.gexp(QRMath.glog(_this.getAt(i) ) + QRMath.glog(e.getAt(j) ) ); + } + } + + return qrPolynomial(num, 0); + }; + + _this.mod = function(e) { + + if (_this.getLength() - e.getLength() < 0) { + return _this; + } + + var ratio = QRMath.glog(_this.getAt(0) ) - QRMath.glog(e.getAt(0) ); + + var num = new Array(_this.getLength() ); + for (var i = 0; i < _this.getLength(); i += 1) { + num[i] = _this.getAt(i); + } + + for (var i = 0; i < e.getLength(); i += 1) { + num[i] ^= QRMath.gexp(QRMath.glog(e.getAt(i) ) + ratio); + } + + // recursive call + return qrPolynomial(num, 0).mod(e); + }; + + return _this; + }; + + //--------------------------------------------------------------------- + // QRRSBlock + //--------------------------------------------------------------------- + + var QRRSBlock = function() { + + var RS_BLOCK_TABLE = [ + + // L + // M + // Q + // H + + // 1 + [1, 26, 19], + [1, 26, 16], + [1, 26, 13], + [1, 26, 9], + + // 2 + [1, 44, 34], + [1, 44, 28], + [1, 44, 22], + [1, 44, 16], + + // 3 + [1, 70, 55], + [1, 70, 44], + [2, 35, 17], + [2, 35, 13], + + // 4 + [1, 100, 80], + [2, 50, 32], + [2, 50, 24], + [4, 25, 9], + + // 5 + [1, 134, 108], + [2, 67, 43], + [2, 33, 15, 2, 34, 16], + [2, 33, 11, 2, 34, 12], + + // 6 + [2, 86, 68], + [4, 43, 27], + [4, 43, 19], + [4, 43, 15], + + // 7 + [2, 98, 78], + [4, 49, 31], + [2, 32, 14, 4, 33, 15], + [4, 39, 13, 1, 40, 14], + + // 8 + [2, 121, 97], + [2, 60, 38, 2, 61, 39], + [4, 40, 18, 2, 41, 19], + [4, 40, 14, 2, 41, 15], + + // 9 + [2, 146, 116], + [3, 58, 36, 2, 59, 37], + [4, 36, 16, 4, 37, 17], + [4, 36, 12, 4, 37, 13], + + // 10 + [2, 86, 68, 2, 87, 69], + [4, 69, 43, 1, 70, 44], + [6, 43, 19, 2, 44, 20], + [6, 43, 15, 2, 44, 16], + + // 11 + [4, 101, 81], + [1, 80, 50, 4, 81, 51], + [4, 50, 22, 4, 51, 23], + [3, 36, 12, 8, 37, 13], + + // 12 + [2, 116, 92, 2, 117, 93], + [6, 58, 36, 2, 59, 37], + [4, 46, 20, 6, 47, 21], + [7, 42, 14, 4, 43, 15], + + // 13 + [4, 133, 107], + [8, 59, 37, 1, 60, 38], + [8, 44, 20, 4, 45, 21], + [12, 33, 11, 4, 34, 12], + + // 14 + [3, 145, 115, 1, 146, 116], + [4, 64, 40, 5, 65, 41], + [11, 36, 16, 5, 37, 17], + [11, 36, 12, 5, 37, 13], + + // 15 + [5, 109, 87, 1, 110, 88], + [5, 65, 41, 5, 66, 42], + [5, 54, 24, 7, 55, 25], + [11, 36, 12, 7, 37, 13], + + // 16 + [5, 122, 98, 1, 123, 99], + [7, 73, 45, 3, 74, 46], + [15, 43, 19, 2, 44, 20], + [3, 45, 15, 13, 46, 16], + + // 17 + [1, 135, 107, 5, 136, 108], + [10, 74, 46, 1, 75, 47], + [1, 50, 22, 15, 51, 23], + [2, 42, 14, 17, 43, 15], + + // 18 + [5, 150, 120, 1, 151, 121], + [9, 69, 43, 4, 70, 44], + [17, 50, 22, 1, 51, 23], + [2, 42, 14, 19, 43, 15], + + // 19 + [3, 141, 113, 4, 142, 114], + [3, 70, 44, 11, 71, 45], + [17, 47, 21, 4, 48, 22], + [9, 39, 13, 16, 40, 14], + + // 20 + [3, 135, 107, 5, 136, 108], + [3, 67, 41, 13, 68, 42], + [15, 54, 24, 5, 55, 25], + [15, 43, 15, 10, 44, 16], + + // 21 + [4, 144, 116, 4, 145, 117], + [17, 68, 42], + [17, 50, 22, 6, 51, 23], + [19, 46, 16, 6, 47, 17], + + // 22 + [2, 139, 111, 7, 140, 112], + [17, 74, 46], + [7, 54, 24, 16, 55, 25], + [34, 37, 13], + + // 23 + [4, 151, 121, 5, 152, 122], + [4, 75, 47, 14, 76, 48], + [11, 54, 24, 14, 55, 25], + [16, 45, 15, 14, 46, 16], + + // 24 + [6, 147, 117, 4, 148, 118], + [6, 73, 45, 14, 74, 46], + [11, 54, 24, 16, 55, 25], + [30, 46, 16, 2, 47, 17], + + // 25 + [8, 132, 106, 4, 133, 107], + [8, 75, 47, 13, 76, 48], + [7, 54, 24, 22, 55, 25], + [22, 45, 15, 13, 46, 16], + + // 26 + [10, 142, 114, 2, 143, 115], + [19, 74, 46, 4, 75, 47], + [28, 50, 22, 6, 51, 23], + [33, 46, 16, 4, 47, 17], + + // 27 + [8, 152, 122, 4, 153, 123], + [22, 73, 45, 3, 74, 46], + [8, 53, 23, 26, 54, 24], + [12, 45, 15, 28, 46, 16], + + // 28 + [3, 147, 117, 10, 148, 118], + [3, 73, 45, 23, 74, 46], + [4, 54, 24, 31, 55, 25], + [11, 45, 15, 31, 46, 16], + + // 29 + [7, 146, 116, 7, 147, 117], + [21, 73, 45, 7, 74, 46], + [1, 53, 23, 37, 54, 24], + [19, 45, 15, 26, 46, 16], + + // 30 + [5, 145, 115, 10, 146, 116], + [19, 75, 47, 10, 76, 48], + [15, 54, 24, 25, 55, 25], + [23, 45, 15, 25, 46, 16], + + // 31 + [13, 145, 115, 3, 146, 116], + [2, 74, 46, 29, 75, 47], + [42, 54, 24, 1, 55, 25], + [23, 45, 15, 28, 46, 16], + + // 32 + [17, 145, 115], + [10, 74, 46, 23, 75, 47], + [10, 54, 24, 35, 55, 25], + [19, 45, 15, 35, 46, 16], + + // 33 + [17, 145, 115, 1, 146, 116], + [14, 74, 46, 21, 75, 47], + [29, 54, 24, 19, 55, 25], + [11, 45, 15, 46, 46, 16], + + // 34 + [13, 145, 115, 6, 146, 116], + [14, 74, 46, 23, 75, 47], + [44, 54, 24, 7, 55, 25], + [59, 46, 16, 1, 47, 17], + + // 35 + [12, 151, 121, 7, 152, 122], + [12, 75, 47, 26, 76, 48], + [39, 54, 24, 14, 55, 25], + [22, 45, 15, 41, 46, 16], + + // 36 + [6, 151, 121, 14, 152, 122], + [6, 75, 47, 34, 76, 48], + [46, 54, 24, 10, 55, 25], + [2, 45, 15, 64, 46, 16], + + // 37 + [17, 152, 122, 4, 153, 123], + [29, 74, 46, 14, 75, 47], + [49, 54, 24, 10, 55, 25], + [24, 45, 15, 46, 46, 16], + + // 38 + [4, 152, 122, 18, 153, 123], + [13, 74, 46, 32, 75, 47], + [48, 54, 24, 14, 55, 25], + [42, 45, 15, 32, 46, 16], + + // 39 + [20, 147, 117, 4, 148, 118], + [40, 75, 47, 7, 76, 48], + [43, 54, 24, 22, 55, 25], + [10, 45, 15, 67, 46, 16], + + // 40 + [19, 148, 118, 6, 149, 119], + [18, 75, 47, 31, 76, 48], + [34, 54, 24, 34, 55, 25], + [20, 45, 15, 61, 46, 16] + ]; + + var qrRSBlock = function(totalCount, dataCount) { + var _this = {}; + _this.totalCount = totalCount; + _this.dataCount = dataCount; + return _this; + }; + + var _this = {}; + + var getRsBlockTable = function(typeNumber, errorCorrectLevel) { + + switch(errorCorrectLevel) { + case QRErrorCorrectLevel.L : + return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0]; + case QRErrorCorrectLevel.M : + return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1]; + case QRErrorCorrectLevel.Q : + return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2]; + case QRErrorCorrectLevel.H : + return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3]; + default : + return undefined; + } + }; + + _this.getRSBlocks = function(typeNumber, errorCorrectLevel) { + + var rsBlock = getRsBlockTable(typeNumber, errorCorrectLevel); + + if (typeof rsBlock == 'undefined') { + throw new Error('bad rs block @ typeNumber:' + typeNumber + + '/errorCorrectLevel:' + errorCorrectLevel); + } + + var length = rsBlock.length / 3; + + var list = new Array(); + + for (var i = 0; i < length; i += 1) { + + var count = rsBlock[i * 3 + 0]; + var totalCount = rsBlock[i * 3 + 1]; + var dataCount = rsBlock[i * 3 + 2]; + + for (var j = 0; j < count; j += 1) { + list.push(qrRSBlock(totalCount, dataCount) ); + } + } + + return list; + }; + + return _this; + }(); + + //--------------------------------------------------------------------- + // qrBitBuffer + //--------------------------------------------------------------------- + + var qrBitBuffer = function() { + + var _buffer = new Array(); + var _length = 0; + + var _this = {}; + + _this.getBuffer = function() { + return _buffer; + }; + + _this.getAt = function(index) { + var bufIndex = Math.floor(index / 8); + return ( (_buffer[bufIndex] >>> (7 - index % 8) ) & 1) == 1; + }; + + _this.put = function(num, length) { + for (var i = 0; i < length; i += 1) { + _this.putBit( ( (num >>> (length - i - 1) ) & 1) == 1); + } + }; + + _this.getLengthInBits = function() { + return _length; + }; + + _this.putBit = function(bit) { + + var bufIndex = Math.floor(_length / 8); + if (_buffer.length <= bufIndex) { + _buffer.push(0); + } + + if (bit) { + _buffer[bufIndex] |= (0x80 >>> (_length % 8) ); + } + + _length += 1; + }; + + return _this; + }; + + //--------------------------------------------------------------------- + // qr8BitByte + //--------------------------------------------------------------------- + + var qr8BitByte = function(data) { + + var _mode = QRMode.MODE_8BIT_BYTE; + var _data = data; + var _bytes = qrcode.stringToBytes(data); + + var _this = {}; + + _this.getMode = function() { + return _mode; + }; + + _this.getLength = function(buffer) { + return _bytes.length; + }; + + _this.write = function(buffer) { + for (var i = 0; i < _bytes.length; i += 1) { + buffer.put(_bytes[i], 8); + } + }; + + return _this; + }; + + //===================================================================== + // GIF Support etc. + // + + //--------------------------------------------------------------------- + // byteArrayOutputStream + //--------------------------------------------------------------------- + + var byteArrayOutputStream = function() { + + var _bytes = new Array(); + + var _this = {}; + + _this.writeByte = function(b) { + _bytes.push(b & 0xff); + }; + + _this.writeShort = function(i) { + _this.writeByte(i); + _this.writeByte(i >>> 8); + }; + + _this.writeBytes = function(b, off, len) { + off = off || 0; + len = len || b.length; + for (var i = 0; i < len; i += 1) { + _this.writeByte(b[i + off]); + } + }; + + _this.writeString = function(s) { + for (var i = 0; i < s.length; i += 1) { + _this.writeByte(s.charCodeAt(i) ); + } + }; + + _this.toByteArray = function() { + return _bytes; + }; + + _this.toString = function() { + var s = ''; + s += '['; + for (var i = 0; i < _bytes.length; i += 1) { + if (i > 0) { + s += ','; + } + s += _bytes[i]; + } + s += ']'; + return s; + }; + + return _this; + }; + + //--------------------------------------------------------------------- + // base64EncodeOutputStream + //--------------------------------------------------------------------- + + var base64EncodeOutputStream = function() { + + var _buffer = 0; + var _buflen = 0; + var _length = 0; + var _base64 = ''; + + var _this = {}; + + var writeEncoded = function(b) { + _base64 += String.fromCharCode(encode(b & 0x3f) ); + }; + + var encode = function(n) { + if (n < 0) { + // error. + } else if (n < 26) { + return 0x41 + n; + } else if (n < 52) { + return 0x61 + (n - 26); + } else if (n < 62) { + return 0x30 + (n - 52); + } else if (n == 62) { + return 0x2b; + } else if (n == 63) { + return 0x2f; + } + throw new Error('n:' + n); + }; + + _this.writeByte = function(n) { + + _buffer = (_buffer << 8) | (n & 0xff); + _buflen += 8; + _length += 1; + + while (_buflen >= 6) { + writeEncoded(_buffer >>> (_buflen - 6) ); + _buflen -= 6; + } + }; + + _this.flush = function() { + + if (_buflen > 0) { + writeEncoded(_buffer << (6 - _buflen) ); + _buffer = 0; + _buflen = 0; + } + + if (_length % 3 != 0) { + // padding + var padlen = 3 - _length % 3; + for (var i = 0; i < padlen; i += 1) { + _base64 += '='; + } + } + }; + + _this.toString = function() { + return _base64; + }; + + return _this; + }; + + //--------------------------------------------------------------------- + // base64DecodeInputStream + //--------------------------------------------------------------------- + + var base64DecodeInputStream = function(str) { + + var _str = str; + var _pos = 0; + var _buffer = 0; + var _buflen = 0; + + var _this = {}; + + _this.read = function() { + + while (_buflen < 8) { + + if (_pos >= _str.length) { + if (_buflen == 0) { + return -1; + } + throw new Error('unexpected end of file./' + _buflen); + } + + var c = _str.charAt(_pos); + _pos += 1; + + if (c == '=') { + _buflen = 0; + return -1; + } else if (c.match(/^\s$/) ) { + // ignore if whitespace. + continue; + } + + _buffer = (_buffer << 6) | decode(c.charCodeAt(0) ); + _buflen += 6; + } + + var n = (_buffer >>> (_buflen - 8) ) & 0xff; + _buflen -= 8; + return n; + }; + + var decode = function(c) { + if (0x41 <= c && c <= 0x5a) { + return c - 0x41; + } else if (0x61 <= c && c <= 0x7a) { + return c - 0x61 + 26; + } else if (0x30 <= c && c <= 0x39) { + return c - 0x30 + 52; + } else if (c == 0x2b) { + return 62; + } else if (c == 0x2f) { + return 63; + } else { + throw new Error('c:' + c); + } + }; + + return _this; + }; + + //--------------------------------------------------------------------- + // gifImage (B/W) + //--------------------------------------------------------------------- + + var gifImage = function(width, height) { + + var _width = width; + var _height = height; + var _data = new Array(width * height); + + var _this = {}; + + _this.setPixel = function(x, y, pixel) { + _data[y * _width + x] = pixel; + }; + + _this.write = function(out) { + + //--------------------------------- + // GIF Signature + + out.writeString('GIF87a'); + + //--------------------------------- + // Screen Descriptor + + out.writeShort(_width); + out.writeShort(_height); + + out.writeByte(0x80); // 2bit + out.writeByte(0); + out.writeByte(0); + + //--------------------------------- + // Global Color Map + + // black + out.writeByte(0x00); + out.writeByte(0x00); + out.writeByte(0x00); + + // white + out.writeByte(0xff); + out.writeByte(0xff); + out.writeByte(0xff); + + //--------------------------------- + // Image Descriptor + + out.writeString(','); + out.writeShort(0); + out.writeShort(0); + out.writeShort(_width); + out.writeShort(_height); + out.writeByte(0); + + //--------------------------------- + // Local Color Map + + //--------------------------------- + // Raster Data + + var lzwMinCodeSize = 2; + var raster = getLZWRaster(lzwMinCodeSize); + + out.writeByte(lzwMinCodeSize); + + var offset = 0; + + while (raster.length - offset > 255) { + out.writeByte(255); + out.writeBytes(raster, offset, 255); + offset += 255; + } + + out.writeByte(raster.length - offset); + out.writeBytes(raster, offset, raster.length - offset); + out.writeByte(0x00); + + //--------------------------------- + // GIF Terminator + out.writeString(';'); + }; + + var bitOutputStream = function(out) { + + var _out = out; + var _bitLength = 0; + var _bitBuffer = 0; + + var _this = {}; + + _this.write = function(data, length) { + + if ( (data >>> length) != 0) { + throw new Error('length over'); + } + + while (_bitLength + length >= 8) { + _out.writeByte(0xff & ( (data << _bitLength) | _bitBuffer) ); + length -= (8 - _bitLength); + data >>>= (8 - _bitLength); + _bitBuffer = 0; + _bitLength = 0; + } + + _bitBuffer = (data << _bitLength) | _bitBuffer; + _bitLength = _bitLength + length; + }; + + _this.flush = function() { + if (_bitLength > 0) { + _out.writeByte(_bitBuffer); + } + }; + + return _this; + }; + + var getLZWRaster = function(lzwMinCodeSize) { + + var clearCode = 1 << lzwMinCodeSize; + var endCode = (1 << lzwMinCodeSize) + 1; + var bitLength = lzwMinCodeSize + 1; + + // Setup LZWTable + var table = lzwTable(); + + for (var i = 0; i < clearCode; i += 1) { + table.add(String.fromCharCode(i) ); + } + table.add(String.fromCharCode(clearCode) ); + table.add(String.fromCharCode(endCode) ); + + var byteOut = byteArrayOutputStream(); + var bitOut = bitOutputStream(byteOut); + + // clear code + bitOut.write(clearCode, bitLength); + + var dataIndex = 0; + + var s = String.fromCharCode(_data[dataIndex]); + dataIndex += 1; + + while (dataIndex < _data.length) { + + var c = String.fromCharCode(_data[dataIndex]); + dataIndex += 1; + + if (table.contains(s + c) ) { + + s = s + c; + + } else { + + bitOut.write(table.indexOf(s), bitLength); + + if (table.size() < 0xfff) { + + if (table.size() == (1 << bitLength) ) { + bitLength += 1; + } + + table.add(s + c); + } + + s = c; + } + } + + bitOut.write(table.indexOf(s), bitLength); + + // end code + bitOut.write(endCode, bitLength); + + bitOut.flush(); + + return byteOut.toByteArray(); + }; + + var lzwTable = function() { + + var _map = {}; + var _size = 0; + + var _this = {}; + + _this.add = function(key) { + if (_this.contains(key) ) { + throw new Error('dup key:' + key); + } + _map[key] = _size; + _size += 1; + }; + + _this.size = function() { + return _size; + }; + + _this.indexOf = function(key) { + return _map[key]; + }; + + _this.contains = function(key) { + return typeof _map[key] != 'undefined'; + }; + + return _this; + }; + + return _this; + }; + + var createImgTag = function(width, height, getPixel, alt) { + + var gif = gifImage(width, height); + for (var y = 0; y < height; y += 1) { + for (var x = 0; x < width; x += 1) { + gif.setPixel(x, y, getPixel(x, y) ); + } + } + + var b = byteArrayOutputStream(); + gif.write(b); + + var base64 = base64EncodeOutputStream(); + var bytes = b.toByteArray(); + for (var i = 0; i < bytes.length; i += 1) { + base64.writeByte(bytes[i]); + } + base64.flush(); + + var img = ''; + img += '> 6), + 0x80 | (charcode & 0x3f)); + } + else if (charcode < 0xd800 || charcode >= 0xe000) { + utf8.push(0xe0 | (charcode >> 12), + 0x80 | ((charcode>>6) & 0x3f), + 0x80 | (charcode & 0x3f)); + } + // surrogate pair + else { + i++; + // UTF-16 encodes 0x10000-0x10FFFF by + // subtracting 0x10000 and splitting the + // 20 bits of 0x0-0xFFFFF into two halves + charcode = 0x10000 + (((charcode & 0x3ff)<<10) + | (str.charCodeAt(i) & 0x3ff)); + utf8.push(0xf0 | (charcode >>18), + 0x80 | ((charcode>>12) & 0x3f), + 0x80 | ((charcode>>6) & 0x3f), + 0x80 | (charcode & 0x3f)); + } + } + return utf8; + } + return toUTF8Array(s); + }; + + }(qrcode); + + return qrcode; // eslint-disable-line no-undef +}())); diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/jquery-qrcode/jquery-qrcode.min.js b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/jquery-qrcode/jquery-qrcode.min.js new file mode 100755 index 00000000..f718c22b --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/jquery-qrcode/jquery-qrcode.min.js @@ -0,0 +1,2 @@ +/*! jquery-qrcode v0.14.0 - https://larsjung.de/jquery-qrcode/ */ +!function(r){"use strict";function t(t,e,n,o){function a(r,t){return r-=o,t-=o,0>r||r>=c||0>t||t>=c?!1:f.isDark(r,t)}function i(r,t,e,n){var o=u.isDark,a=1/l;u.isDark=function(i,u){var f=u*a,c=i*a,l=f+a,g=c+a;return o(i,u)&&(r>l||f>e||t>g||c>n)}}var u={},f=r(n,e);f.addData(t),f.make(),o=o||0;var c=f.getModuleCount(),l=f.getModuleCount()+2*o;return u.text=t,u.level=e,u.version=n,u.moduleCount=l,u.isDark=a,u.addBlank=i,u}function e(r,e,n,o,a){n=Math.max(1,n||1),o=Math.min(40,o||40);for(var i=n;o>=i;i+=1)try{return t(r,e,i,a)}catch(u){}}function n(r,t,e){var n=e.size,o="bold "+e.mSize*n+"px "+e.fontname,a=w("")[0].getContext("2d");a.font=o;var i=a.measureText(e.label).width,u=e.mSize,f=i/n,c=(1-f)*e.mPosX,l=(1-u)*e.mPosY,g=c+f,s=l+u,v=.01;1===e.mode?r.addBlank(0,l-v,n,s+v):r.addBlank(c-v,l-v,g+v,s+v),t.fillStyle=e.fontcolor,t.font=o,t.fillText(e.label,c*n,l*n+.75*e.mSize*n)}function o(r,t,e){var n=e.size,o=e.image.naturalWidth||1,a=e.image.naturalHeight||1,i=e.mSize,u=i*o/a,f=(1-u)*e.mPosX,c=(1-i)*e.mPosY,l=f+u,g=c+i,s=.01;3===e.mode?r.addBlank(0,c-s,n,g+s):r.addBlank(f-s,c-s,l+s,g+s),t.drawImage(e.image,f*n,c*n,u*n,i*n)}function a(r,t,e){w(e.background).is("img")?t.drawImage(e.background,0,0,e.size,e.size):e.background&&(t.fillStyle=e.background,t.fillRect(e.left,e.top,e.size,e.size));var a=e.mode;1===a||2===a?n(r,t,e):(3===a||4===a)&&o(r,t,e)}function i(r,t,e,n,o,a,i,u){r.isDark(i,u)&&t.rect(n,o,a,a)}function u(r,t,e,n,o,a,i,u,f,c){i?r.moveTo(t+a,e):r.moveTo(t,e),u?(r.lineTo(n-a,e),r.arcTo(n,e,n,o,a)):r.lineTo(n,e),f?(r.lineTo(n,o-a),r.arcTo(n,o,t,o,a)):r.lineTo(n,o),c?(r.lineTo(t+a,o),r.arcTo(t,o,t,e,a)):r.lineTo(t,o),i?(r.lineTo(t,e+a),r.arcTo(t,e,n,e,a)):r.lineTo(t,e)}function f(r,t,e,n,o,a,i,u,f,c){i&&(r.moveTo(t+a,e),r.lineTo(t,e),r.lineTo(t,e+a),r.arcTo(t,e,t+a,e,a)),u&&(r.moveTo(n-a,e),r.lineTo(n,e),r.lineTo(n,e+a),r.arcTo(n,e,n-a,e,a)),f&&(r.moveTo(n-a,o),r.lineTo(n,o),r.lineTo(n,o-a),r.arcTo(n,o,n-a,o,a)),c&&(r.moveTo(t+a,o),r.lineTo(t,o),r.lineTo(t,o-a),r.arcTo(t,o,t+a,o,a))}function c(r,t,e,n,o,a,i,c){var l=r.isDark,g=n+a,s=o+a,v=e.radius*a,h=i-1,d=i+1,w=c-1,m=c+1,y=l(i,c),T=l(h,w),p=l(h,c),B=l(h,m),A=l(i,m),E=l(d,m),k=l(d,c),M=l(d,w),C=l(i,w);y?u(t,n,o,g,s,v,!p&&!C,!p&&!A,!k&&!A,!k&&!C):f(t,n,o,g,s,v,p&&C&&T,p&&A&&B,k&&A&&E,k&&C&&M)}function l(r,t,e){var n,o,a=r.moduleCount,u=e.size/a,f=i;for(e.radius>0&&e.radius<=.5&&(f=c),t.beginPath(),n=0;a>n;n+=1)for(o=0;a>o;o+=1){var l=e.left+o*u,g=e.top+n*u,s=u;f(r,t,e,l,g,s,n,o)}if(w(e.fill).is("img")){t.strokeStyle="rgba(0,0,0,0.5)",t.lineWidth=2,t.stroke();var v=t.globalCompositeOperation;t.globalCompositeOperation="destination-out",t.fill(),t.globalCompositeOperation=v,t.clip(),t.drawImage(e.fill,0,0,e.size,e.size),t.restore()}else t.fillStyle=e.fill,t.fill()}function g(r,t){var n=e(t.text,t.ecLevel,t.minVersion,t.maxVersion,t.quiet);if(!n)return null;var o=w(r).data("qrcode",n),i=o[0].getContext("2d");return a(n,i,t),l(n,i,t),o}function s(r){var t=w("").attr("width",r.size).attr("height",r.size);return g(t,r)}function v(r){return w("").attr("src",s(r)[0].toDataURL("image/png"))}function h(r){var t=e(r.text,r.ecLevel,r.minVersion,r.maxVersion,r.quiet);if(!t)return null;var n,o,a=r.size,i=r.background,u=Math.floor,f=t.moduleCount,c=u(a/f),l=u(.5*(a-c*f)),g={position:"relative",left:0,top:0,padding:0,margin:0,width:a,height:a},s={position:"absolute",padding:0,margin:0,width:c,height:c,"background-color":r.fill},v=w("
").data("qrcode",t).css(g);for(i&&v.css("background-color",i),n=0;f>n;n+=1)for(o=0;f>o;o+=1)t.isDark(n,o)&&w("
").css(s).css({left:l+o*c,top:l+n*c}).appendTo(v);return v}function d(r){return m&&"canvas"===r.render?s(r):m&&"image"===r.render?v(r):h(r)}var w=window.jQuery,m=function(){var r=document.createElement("canvas");return!(!r.getContext||!r.getContext("2d"))}(),y={render:"canvas",minVersion:1,maxVersion:40,ecLevel:"L",left:0,top:0,size:200,fill:"#000",background:null,text:"no text",radius:0,quiet:0,mode:0,mSize:.1,mPosX:.5,mPosY:.5,label:"no label",fontname:"sans",fontcolor:"#000",image:null};w.fn.qrcode=function(r){var t=w.extend({},y,r);return this.each(function(r,e){"canvas"===e.nodeName.toLowerCase()?g(e,t):w(e).append(d(t))})}}(function(){var r=function(){function r(t,e){if("undefined"==typeof t.length)throw new Error(t.length+"/"+e);var n=function(){for(var r=0;re;e+=1){t[e]=new Array(r);for(var n=0;r>n;n+=1)t[e][n]=null}return t}(v),T(0,0),T(v-7,0),T(0,v-7),A(),B(),k(r,t),l>=7&&E(r),null==d&&(d=D(l,g,w)),M(d,t)},T=function(r,t){for(var e=-1;7>=e;e+=1)if(!(-1>=r+e||r+e>=v))for(var n=-1;7>=n;n+=1)-1>=t+n||t+n>=v||(e>=0&&6>=e&&(0==n||6==n)||n>=0&&6>=n&&(0==e||6==e)||e>=2&&4>=e&&n>=2&&4>=n?s[r+e][t+n]=!0:s[r+e][t+n]=!1)},p=function(){for(var r=0,t=0,e=0;8>e;e+=1){y(!0,e);var n=a.getLostPoint(m);(0==e||r>n)&&(r=n,t=e)}return t},B=function(){for(var r=8;v-8>r;r+=1)null==s[r][6]&&(s[r][6]=r%2==0);for(var t=8;v-8>t;t+=1)null==s[6][t]&&(s[6][t]=t%2==0)},A=function(){for(var r=a.getPatternPosition(l),t=0;t=i;i+=1)for(var u=-2;2>=u;u+=1)-2==i||2==i||-2==u||2==u||0==i&&0==u?s[n+i][o+u]=!0:s[n+i][o+u]=!1}},E=function(r){for(var t=a.getBCHTypeNumber(l),e=0;18>e;e+=1){var n=!r&&1==(t>>e&1);s[Math.floor(e/3)][e%3+v-8-3]=n}for(var e=0;18>e;e+=1){var n=!r&&1==(t>>e&1);s[e%3+v-8-3][Math.floor(e/3)]=n}},k=function(r,t){for(var e=g<<3|t,n=a.getBCHTypeInfo(e),o=0;15>o;o+=1){var i=!r&&1==(n>>o&1);6>o?s[o][8]=i:8>o?s[o+1][8]=i:s[v-15+o][8]=i}for(var o=0;15>o;o+=1){var i=!r&&1==(n>>o&1);8>o?s[8][v-o-1]=i:9>o?s[8][15-o-1+1]=i:s[8][15-o-1]=i}s[v-8][8]=!r},M=function(r,t){for(var e=-1,n=v-1,o=7,i=0,u=a.getMaskFunction(t),f=v-1;f>0;f-=2)for(6==f&&(f-=1);;){for(var c=0;2>c;c+=1)if(null==s[n][f-c]){var l=!1;i>>o&1));var g=u(n,f-c);g&&(l=!l),s[n][f-c]=l,o-=1,-1==o&&(i+=1,o=7)}if(n+=e,0>n||n>=v){n-=e,e=-e;break}}},C=function(t,e){for(var n=0,o=0,i=0,u=new Array(e.length),f=new Array(e.length),c=0;c=0?d.getAt(w):0}}for(var m=0,s=0;ss;s+=1)for(var c=0;cs;s+=1)for(var c=0;c8*s)throw new Error("code length overflow. ("+c.getLengthInBits()+">"+8*s+")");for(c.getLengthInBits()+4<=8*s&&c.put(0,4);c.getLengthInBits()%8!=0;)c.putBit(!1);for(;;){if(c.getLengthInBits()>=8*s)break;if(c.put(o,8),c.getLengthInBits()>=8*s)break;c.put(i,8)}return C(c,n)};return m.addData=function(r){var t=c(r);w.push(t),d=null},m.isDark=function(r,t){if(0>r||r>=v||0>t||t>=v)throw new Error(r+","+t);return s[r][t]},m.getModuleCount=function(){return v},m.make=function(){y(!1,p())},m.createTableTag=function(r,t){r=r||2,t="undefined"==typeof t?4*r:t;var e="";e+='";for(var o=0;o';e+=""}return e+="",e+="
"},m.createImgTag=function(r,t){r=r||2,t="undefined"==typeof t?4*r:t;var e=m.getModuleCount()*r+2*t,n=t,o=e-t;return h(e,e,function(t,e){if(t>=n&&o>t&&e>=n&&o>e){var a=Math.floor((t-n)/r),i=Math.floor((e-n)/r);return m.isDark(i,a)?0:1}return 1})},m};t.stringToBytes=function(r){for(var t=new Array,e=0;ea)t.push(a);else{var i=e[r.charAt(o)];"number"==typeof i?(255&i)==i?t.push(i):(t.push(i>>>8),t.push(255&i)):t.push(n)}}return t}};var e={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},n={L:1,M:0,Q:3,H:2},o={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},a=function(){var t=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],n=1335,a=7973,u=21522,f={},c=function(r){for(var t=0;0!=r;)t+=1,r>>>=1;return t};return f.getBCHTypeInfo=function(r){for(var t=r<<10;c(t)-c(n)>=0;)t^=n<=0;)t^=a<n;n+=1)e=e.multiply(r([1,i.gexp(n)],0));return e},f.getLengthInBits=function(r,t){if(t>=1&&10>t)switch(r){case e.MODE_NUMBER:return 10;case e.MODE_ALPHA_NUM:return 9;case e.MODE_8BIT_BYTE:return 8;case e.MODE_KANJI:return 8;default:throw new Error("mode:"+r)}else if(27>t)switch(r){case e.MODE_NUMBER:return 12;case e.MODE_ALPHA_NUM:return 11;case e.MODE_8BIT_BYTE:return 16;case e.MODE_KANJI:return 10;default:throw new Error("mode:"+r)}else{if(!(41>t))throw new Error("type:"+t);switch(r){case e.MODE_NUMBER:return 14;case e.MODE_ALPHA_NUM:return 13;case e.MODE_8BIT_BYTE:return 16;case e.MODE_KANJI:return 12;default:throw new Error("mode:"+r)}}},f.getLostPoint=function(r){for(var t=r.getModuleCount(),e=0,n=0;t>n;n+=1)for(var o=0;t>o;o+=1){for(var a=0,i=r.isDark(n,o),u=-1;1>=u;u+=1)if(!(0>n+u||n+u>=t))for(var f=-1;1>=f;f+=1)0>o+f||o+f>=t||(0!=u||0!=f)&&i==r.isDark(n+u,o+f)&&(a+=1);a>5&&(e+=3+a-5)}for(var n=0;t-1>n;n+=1)for(var o=0;t-1>o;o+=1){var c=0;r.isDark(n,o)&&(c+=1),r.isDark(n+1,o)&&(c+=1),r.isDark(n,o+1)&&(c+=1),r.isDark(n+1,o+1)&&(c+=1),(0==c||4==c)&&(e+=3)}for(var n=0;t>n;n+=1)for(var o=0;t-6>o;o+=1)r.isDark(n,o)&&!r.isDark(n,o+1)&&r.isDark(n,o+2)&&r.isDark(n,o+3)&&r.isDark(n,o+4)&&!r.isDark(n,o+5)&&r.isDark(n,o+6)&&(e+=40);for(var o=0;t>o;o+=1)for(var n=0;t-6>n;n+=1)r.isDark(n,o)&&!r.isDark(n+1,o)&&r.isDark(n+2,o)&&r.isDark(n+3,o)&&r.isDark(n+4,o)&&!r.isDark(n+5,o)&&r.isDark(n+6,o)&&(e+=40);for(var l=0,o=0;t>o;o+=1)for(var n=0;t>n;n+=1)r.isDark(n,o)&&(l+=1);var g=Math.abs(100*l/t/t-50)/5;return e+=10*g},f}(),i=function(){for(var r=new Array(256),t=new Array(256),e=0;8>e;e+=1)r[e]=1<e;e+=1)r[e]=r[e-4]^r[e-5]^r[e-6]^r[e-8];for(var e=0;255>e;e+=1)t[r[e]]=e;var n={};return n.glog=function(r){if(1>r)throw new Error("glog("+r+")");return t[r]},n.gexp=function(t){for(;0>t;)t+=255;for(;t>=256;)t-=255;return r[t]},n}(),u=function(){var r=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],t=function(r,t){var e={};return e.totalCount=r,e.dataCount=t,e},e={},o=function(t,e){switch(e){case n.L:return r[4*(t-1)+0];case n.M:return r[4*(t-1)+1];case n.Q:return r[4*(t-1)+2];case n.H:return r[4*(t-1)+3];default:return}};return e.getRSBlocks=function(r,e){var n=o(r,e);if("undefined"==typeof n)throw new Error("bad rs block @ typeNumber:"+r+"/errorCorrectLevel:"+e);for(var a=n.length/3,i=new Array,u=0;a>u;u+=1)for(var f=n[3*u+0],c=n[3*u+1],l=n[3*u+2],g=0;f>g;g+=1)i.push(t(c,l));return i},e}(),f=function(){var r=new Array,t=0,e={};return e.getBuffer=function(){return r},e.getAt=function(t){var e=Math.floor(t/8);return 1==(r[e]>>>7-t%8&1)},e.put=function(r,t){for(var n=0;t>n;n+=1)e.putBit(1==(r>>>t-n-1&1))},e.getLengthInBits=function(){return t},e.putBit=function(e){var n=Math.floor(t/8);r.length<=n&&r.push(0),e&&(r[n]|=128>>>t%8),t+=1},e},c=function(r){var n=e.MODE_8BIT_BYTE,o=t.stringToBytes(r),a={};return a.getMode=function(){return n},a.getLength=function(r){return o.length},a.write=function(r){for(var t=0;t>>8)},t.writeBytes=function(r,e,n){e=e||0,n=n||r.length;for(var o=0;n>o;o+=1)t.writeByte(r[o+e])},t.writeString=function(r){for(var e=0;e0&&(t+=","),t+=r[e];return t+="]"},t},g=function(){var r=0,t=0,e=0,n="",o={},a=function(r){n+=String.fromCharCode(i(63&r))},i=function(r){if(0>r);else{if(26>r)return 65+r;if(52>r)return 97+(r-26);if(62>r)return 48+(r-52);if(62==r)return 43;if(63==r)return 47}throw new Error("n:"+r)};return o.writeByte=function(n){for(r=r<<8|255&n,t+=8,e+=1;t>=6;)a(r>>>t-6),t-=6},o.flush=function(){if(t>0&&(a(r<<6-t),r=0,t=0),e%3!=0)for(var o=3-e%3,i=0;o>i;i+=1)n+="="},o.toString=function(){return n},o},s=function(r){var t=r,e=0,n=0,o=0,a={};a.read=function(){for(;8>o;){if(e>=t.length){if(0==o)return-1;throw new Error("unexpected end of file./"+o)}var r=t.charAt(e);if(e+=1,"="==r)return o=0,-1;r.match(/^\s$/)||(n=n<<6|i(r.charCodeAt(0)),o+=6)}var a=n>>>o-8&255;return o-=8,a};var i=function(r){if(r>=65&&90>=r)return r-65;if(r>=97&&122>=r)return r-97+26;if(r>=48&&57>=r)return r-48+52;if(43==r)return 62;if(47==r)return 63;throw new Error("c:"+r)};return a},v=function(r,t){var e=r,n=t,o=new Array(r*t),a={};a.setPixel=function(r,t,n){o[t*e+r]=n},a.write=function(r){r.writeString("GIF87a"),r.writeShort(e),r.writeShort(n),r.writeByte(128),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(255),r.writeByte(255),r.writeByte(255),r.writeString(","),r.writeShort(0),r.writeShort(0),r.writeShort(e),r.writeShort(n),r.writeByte(0);var t=2,o=u(t);r.writeByte(t);for(var a=0;o.length-a>255;)r.writeByte(255),r.writeBytes(o,a,255),a+=255;r.writeByte(o.length-a),r.writeBytes(o,a,o.length-a),r.writeByte(0),r.writeString(";")};var i=function(r){var t=r,e=0,n=0,o={};return o.write=function(r,o){if(r>>>o!=0)throw new Error("length over");for(;e+o>=8;)t.writeByte(255&(r<>>=8-e,n=0,e=0;n=r<0&&t.writeByte(n)},o},u=function(r){for(var t=1<u;u+=1)a.add(String.fromCharCode(u));a.add(String.fromCharCode(t)),a.add(String.fromCharCode(e));var c=l(),g=i(c);g.write(t,n);var s=0,v=String.fromCharCode(o[s]);for(s+=1;sa;a+=1)for(var i=0;r>i;i+=1)o.setPixel(i,a,e(i,a));var u=l();o.write(u);for(var f=g(),c=u.toByteArray(),s=0;sn?t.push(n):2048>n?t.push(192|n>>6,128|63&n):55296>n||n>=57344?t.push(224|n>>12,128|n>>6&63,128|63&n):(e++,n=65536+((1023&n)<<10|1023&r.charCodeAt(e)),t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return t}return t(r)}}(r),r}()); \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/jquery.blockUI.js b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/jquery.blockUI.js new file mode 100755 index 00000000..29b1325f --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/jquery.blockUI.js @@ -0,0 +1,619 @@ +/*! + * jQuery blockUI plugin + * Version 2.70.0-2014.11.23 + * Requires jQuery v1.7 or later + * + * Examples at: http://malsup.com/jquery/block/ + * Copyright (c) 2007-2013 M. Alsup + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Thanks to Amir-Hossein Sobhi for some excellent contributions! + */ +;(function() { +/*jshint eqeqeq:false curly:false latedef:false */ +"use strict"; + + function setup($) { + $.fn._fadeIn = $.fn.fadeIn; + + var noOp = $.noop || function() {}; + + // this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle + // confusing userAgent strings on Vista) + var msie = /MSIE/.test(navigator.userAgent); + var ie6 = /MSIE 6.0/.test(navigator.userAgent) && ! /MSIE 8.0/.test(navigator.userAgent); + var mode = document.documentMode || 0; + var setExpr = $.isFunction( document.createElement('div').style.setExpression ); + + // global $ methods for blocking/unblocking the entire page + $.blockUI = function(opts) { install(window, opts); }; + $.unblockUI = function(opts) { remove(window, opts); }; + + // convenience method for quick growl-like notifications (http://www.google.com/search?q=growl) + $.growlUI = function(title, message, timeout, onClose) { + var $m = $('
'); + if (title) $m.append('

'+title+'

'); + if (message) $m.append('

'+message+'

'); + if (timeout === undefined) timeout = 3000; + + // Added by konapun: Set timeout to 30 seconds if this growl is moused over, like normal toast notifications + var callBlock = function(opts) { + opts = opts || {}; + + $.blockUI({ + message: $m, + fadeIn : typeof opts.fadeIn !== 'undefined' ? opts.fadeIn : 700, + fadeOut: typeof opts.fadeOut !== 'undefined' ? opts.fadeOut : 1000, + timeout: typeof opts.timeout !== 'undefined' ? opts.timeout : timeout, + centerY: false, + showOverlay: false, + onUnblock: onClose, + css: $.blockUI.defaults.growlCSS + }); + }; + + callBlock(); + var nonmousedOpacity = $m.css('opacity'); + $m.mouseover(function() { + callBlock({ + fadeIn: 0, + timeout: 30000 + }); + + var displayBlock = $('.blockMsg'); + displayBlock.stop(); // cancel fadeout if it has started + displayBlock.fadeTo(300, 1); // make it easier to read the message by removing transparency + }).mouseout(function() { + $('.blockMsg').fadeOut(1000); + }); + // End konapun additions + }; + + // plugin method for blocking element content + $.fn.block = function(opts) { + if ( this[0] === window ) { + $.blockUI( opts ); + return this; + } + var fullOpts = $.extend({}, $.blockUI.defaults, opts || {}); + this.each(function() { + var $el = $(this); + if (fullOpts.ignoreIfBlocked && $el.data('blockUI.isBlocked')) + return; + $el.unblock({ fadeOut: 0 }); + }); + + return this.each(function() { + if ($.css(this,'position') == 'static') { + this.style.position = 'relative'; + $(this).data('blockUI.static', true); + } + this.style.zoom = 1; // force 'hasLayout' in ie + install(this, opts); + }); + }; + + // plugin method for unblocking element content + $.fn.unblock = function(opts) { + if ( this[0] === window ) { + $.unblockUI( opts ); + return this; + } + return this.each(function() { + remove(this, opts); + }); + }; + + $.blockUI.version = 2.70; // 2nd generation blocking at no extra cost! + + // override these in your code to change the default behavior and style + $.blockUI.defaults = { + // message displayed when blocking (use null for no message) + message: '

Please wait...

', + + title: null, // title string; only used when theme == true + draggable: true, // only used when theme == true (requires jquery-ui.js to be loaded) + + theme: false, // set to true to use with jQuery UI themes + + // styles for the message when blocking; if you wish to disable + // these and use an external stylesheet then do this in your code: + // $.blockUI.defaults.css = {}; + css: { + padding: 0, + margin: 0, + width: '30%', + top: '40%', + left: '35%', + textAlign: 'center', + color: '#000', + border: '3px solid #aaa', + backgroundColor:'#fff', + cursor: 'wait' + }, + + // minimal style set used when themes are used + themedCSS: { + width: '30%', + top: '40%', + left: '35%' + }, + + // styles for the overlay + overlayCSS: { + backgroundColor: '#000', + opacity: 0.6, + cursor: 'wait' + }, + + // style to replace wait cursor before unblocking to correct issue + // of lingering wait cursor + cursorReset: 'default', + + // styles applied when using $.growlUI + growlCSS: { + width: '350px', + top: '10px', + left: '', + right: '10px', + border: 'none', + padding: '5px', + opacity: 0.6, + cursor: 'default', + color: '#fff', + backgroundColor: '#000', + '-webkit-border-radius':'10px', + '-moz-border-radius': '10px', + 'border-radius': '10px' + }, + + // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w + // (hat tip to Jorge H. N. de Vasconcelos) + /*jshint scripturl:true */ + iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank', + + // force usage of iframe in non-IE browsers (handy for blocking applets) + forceIframe: false, + + // z-index for the blocking overlay + baseZ: 1000, + + // set these to true to have the message automatically centered + centerX: true, // <-- only effects element blocking (page block controlled via css above) + centerY: true, + + // allow body element to be stetched in ie6; this makes blocking look better + // on "short" pages. disable if you wish to prevent changes to the body height + allowBodyStretch: true, + + // enable if you want key and mouse events to be disabled for content that is blocked + bindEvents: true, + + // be default blockUI will suppress tab navigation from leaving blocking content + // (if bindEvents is true) + constrainTabKey: true, + + // fadeIn time in millis; set to 0 to disable fadeIn on block + fadeIn: 200, + + // fadeOut time in millis; set to 0 to disable fadeOut on unblock + fadeOut: 400, + + // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock + timeout: 0, + + // disable if you don't want to show the overlay + showOverlay: true, + + // if true, focus will be placed in the first available input field when + // page blocking + focusInput: true, + + // elements that can receive focus + focusableElements: ':input:enabled:visible', + + // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity) + // no longer needed in 2012 + // applyPlatformOpacityRules: true, + + // callback method invoked when fadeIn has completed and blocking message is visible + onBlock: null, + + // callback method invoked when unblocking has completed; the callback is + // passed the element that has been unblocked (which is the window object for page + // blocks) and the options that were passed to the unblock call: + // onUnblock(element, options) + onUnblock: null, + + // callback method invoked when the overlay area is clicked. + // setting this will turn the cursor to a pointer, otherwise cursor defined in overlayCss will be used. + onOverlayClick: null, + + // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493 + quirksmodeOffsetHack: 4, + + // class name of the message block + blockMsgClass: 'blockMsg', + + // if it is already blocked, then ignore it (don't unblock and reblock) + ignoreIfBlocked: false + }; + + // private data and functions follow... + + var pageBlock = null; + var pageBlockEls = []; + + function install(el, opts) { + var css, themedCSS; + var full = (el == window); + var msg = (opts && opts.message !== undefined ? opts.message : undefined); + opts = $.extend({}, $.blockUI.defaults, opts || {}); + + if (opts.ignoreIfBlocked && $(el).data('blockUI.isBlocked')) + return; + + opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {}); + css = $.extend({}, $.blockUI.defaults.css, opts.css || {}); + if (opts.onOverlayClick) + opts.overlayCSS.cursor = 'pointer'; + + themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {}); + msg = msg === undefined ? opts.message : msg; + + // remove the current block (if there is one) + if (full && pageBlock) + remove(window, {fadeOut:0}); + + // if an existing element is being used as the blocking content then we capture + // its current place in the DOM (and current display style) so we can restore + // it when we unblock + if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) { + var node = msg.jquery ? msg[0] : msg; + var data = {}; + $(el).data('blockUI.history', data); + data.el = node; + data.parent = node.parentNode; + data.display = node.style.display; + data.position = node.style.position; + if (data.parent) + data.parent.removeChild(node); + } + + $(el).data('blockUI.onUnblock', opts.onUnblock); + var z = opts.baseZ; + + // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform; + // layer1 is the iframe layer which is used to suppress bleed through of underlying content + // layer2 is the overlay layer which has opacity and a wait cursor (by default) + // layer3 is the message content that is displayed while blocking + var lyr1, lyr2, lyr3, s; + if (msie || opts.forceIframe) + lyr1 = $(''); + else + lyr1 = $(''); + + if (opts.theme) + lyr2 = $(''); + else + lyr2 = $(''); + + if (opts.theme && full) { + s = ''; + } + else if (opts.theme) { + s = ''; + } + else if (full) { + s = ''; + } + else { + s = ''; + } + lyr3 = $(s); + + // if we have a message, style it + if (msg) { + if (opts.theme) { + lyr3.css(themedCSS); + lyr3.addClass('ui-widget-content'); + } + else + lyr3.css(css); + } + + // style the overlay + if (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/) + lyr2.css(opts.overlayCSS); + lyr2.css('position', full ? 'fixed' : 'absolute'); + + // make iframe layer transparent in IE + if (msie || opts.forceIframe) + lyr1.css('opacity',0.0); + + //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el); + var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el); + $.each(layers, function() { + this.appendTo($par); + }); + + if (opts.theme && opts.draggable && $.fn.draggable) { + lyr3.draggable({ + handle: '.ui-dialog-titlebar', + cancel: 'li' + }); + } + + // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling) + var expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0); + if (ie6 || expr) { + // give body 100% height + if (full && opts.allowBodyStretch && $.support.boxModel) + $('html,body').css('height','100%'); + + // fix ie6 issue when blocked element has a border width + if ((ie6 || !$.support.boxModel) && !full) { + var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth'); + var fixT = t ? '(0 - '+t+')' : 0; + var fixL = l ? '(0 - '+l+')' : 0; + } + + // simulate fixed position + $.each(layers, function(i,o) { + var s = o[0].style; + s.position = 'absolute'; + if (i < 2) { + if (full) + s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"'); + else + s.setExpression('height','this.parentNode.offsetHeight + "px"'); + if (full) + s.setExpression('width','jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"'); + else + s.setExpression('width','this.parentNode.offsetWidth + "px"'); + if (fixL) s.setExpression('left', fixL); + if (fixT) s.setExpression('top', fixT); + } + else if (opts.centerY) { + if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"'); + s.marginTop = 0; + } + else if (!opts.centerY && full) { + var top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0; + var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"'; + s.setExpression('top',expression); + } + }); + } + + // show the message + if (msg) { + if (opts.theme) + lyr3.find('.ui-widget-content').append(msg); + else + lyr3.append(msg); + if (msg.jquery || msg.nodeType) + $(msg).show(); + } + + if ((msie || opts.forceIframe) && opts.showOverlay) + lyr1.show(); // opacity is zero + if (opts.fadeIn) { + var cb = opts.onBlock ? opts.onBlock : noOp; + var cb1 = (opts.showOverlay && !msg) ? cb : noOp; + var cb2 = msg ? cb : noOp; + if (opts.showOverlay) + lyr2._fadeIn(opts.fadeIn, cb1); + if (msg) + lyr3._fadeIn(opts.fadeIn, cb2); + } + else { + if (opts.showOverlay) + lyr2.show(); + if (msg) + lyr3.show(); + if (opts.onBlock) + opts.onBlock.bind(lyr3)(); + } + + // bind key and mouse events + bind(1, el, opts); + + if (full) { + pageBlock = lyr3[0]; + pageBlockEls = $(opts.focusableElements,pageBlock); + if (opts.focusInput) + setTimeout(focus, 20); + } + else + center(lyr3[0], opts.centerX, opts.centerY); + + if (opts.timeout) { + // auto-unblock + var to = setTimeout(function() { + if (full) + $.unblockUI(opts); + else + $(el).unblock(opts); + }, opts.timeout); + $(el).data('blockUI.timeout', to); + } + } + + // remove the block + function remove(el, opts) { + var count; + var full = (el == window); + var $el = $(el); + var data = $el.data('blockUI.history'); + var to = $el.data('blockUI.timeout'); + if (to) { + clearTimeout(to); + $el.removeData('blockUI.timeout'); + } + opts = $.extend({}, $.blockUI.defaults, opts || {}); + bind(0, el, opts); // unbind events + + if (opts.onUnblock === null) { + opts.onUnblock = $el.data('blockUI.onUnblock'); + $el.removeData('blockUI.onUnblock'); + } + + var els; + if (full) // crazy selector to handle odd field errors in ie6/7 + els = $('body').children().filter('.blockUI').add('body > .blockUI'); + else + els = $el.find('>.blockUI'); + + // fix cursor issue + if ( opts.cursorReset ) { + if ( els.length > 1 ) + els[1].style.cursor = opts.cursorReset; + if ( els.length > 2 ) + els[2].style.cursor = opts.cursorReset; + } + + if (full) + pageBlock = pageBlockEls = null; + + if (opts.fadeOut) { + count = els.length; + els.stop().fadeOut(opts.fadeOut, function() { + if ( --count === 0) + reset(els,data,opts,el); + }); + } + else + reset(els, data, opts, el); + } + + // move blocking element back into the DOM where it started + function reset(els,data,opts,el) { + var $el = $(el); + if ( $el.data('blockUI.isBlocked') ) + return; + + els.each(function(i,o) { + // remove via DOM calls so we don't lose event handlers + if (this.parentNode) + this.parentNode.removeChild(this); + }); + + if (data && data.el) { + data.el.style.display = data.display; + data.el.style.position = data.position; + data.el.style.cursor = 'default'; // #59 + if (data.parent) + data.parent.appendChild(data.el); + $el.removeData('blockUI.history'); + } + + if ($el.data('blockUI.static')) { + $el.css('position', 'static'); // #22 + } + + if (typeof opts.onUnblock == 'function') + opts.onUnblock(el,opts); + + // fix issue in Safari 6 where block artifacts remain until reflow + var body = $(document.body), w = body.width(), cssW = body[0].style.width; + body.width(w-1).width(w); + body[0].style.width = cssW; + } + + // bind/unbind the handler + function bind(b, el, opts) { + var full = el == window, $el = $(el); + + // don't bother unbinding if there is nothing to unbind + if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked'))) + return; + + $el.data('blockUI.isBlocked', b); + + // don't bind events when overlay is not in use or if bindEvents is false + if (!full || !opts.bindEvents || (b && !opts.showOverlay)) + return; + + // bind anchors and inputs for mouse and key events + var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove'; + if (b) + $(document).bind(events, opts, handler); + else + $(document).unbind(events, handler); + + // former impl... + // var $e = $('a,:input'); + // b ? $e.bind(events, opts, handler) : $e.unbind(events, handler); + } + + // event handler to suppress keyboard/mouse events when blocking + function handler(e) { + // allow tab navigation (conditionally) + if (e.type === 'keydown' && e.keyCode && e.keyCode == 9) { + if (pageBlock && e.data.constrainTabKey) { + var els = pageBlockEls; + var fwd = !e.shiftKey && e.target === els[els.length-1]; + var back = e.shiftKey && e.target === els[0]; + if (fwd || back) { + setTimeout(function(){focus(back);},10); + return false; + } + } + } + var opts = e.data; + var target = $(e.target); + if (target.hasClass('blockOverlay') && opts.onOverlayClick) + opts.onOverlayClick(e); + + // allow events within the message content + if (target.parents('div.' + opts.blockMsgClass).length > 0) + return true; + + // allow events for content that is not being blocked + return target.parents().children().filter('div.blockUI').length === 0; + } + + function focus(back) { + if (!pageBlockEls) + return; + var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0]; + if (e) + e.focus(); + } + + function center(el, x, y) { + var p = el.parentNode, s = el.style; + var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth'); + var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth'); + if (x) s.left = l > 0 ? (l+'px') : '0'; + if (y) s.top = t > 0 ? (t+'px') : '0'; + } + + function sz(el, p) { + return parseInt($.css(el,p),10)||0; + } + + } + + + /*global define:true */ + if (typeof define === 'function' && define.amd && define.amd.jQuery) { + define(['jquery'], setup); + } else { + setup(jQuery); + } + +})(); \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/jquery.blockUI.min.js b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/jquery.blockUI.min.js new file mode 100755 index 00000000..47fb9744 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/jquery.blockUI.min.js @@ -0,0 +1,14 @@ +/*! + * jQuery blockUI plugin + * Version 2.70.0-2014.11.23 + * Requires jQuery v1.7 or later + * + * Examples at: http://malsup.com/jquery/block/ + * Copyright (c) 2007-2013 M. Alsup + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Thanks to Amir-Hossein Sobhi for some excellent contributions! + */ +!function(){"use strict";function a(a){function b(b,d){var f,p,q=b==window,r=d&&void 0!==d.message?d.message:void 0;if(d=a.extend({},a.blockUI.defaults,d||{}),!d.ignoreIfBlocked||!a(b).data("blockUI.isBlocked")){if(d.overlayCSS=a.extend({},a.blockUI.defaults.overlayCSS,d.overlayCSS||{}),f=a.extend({},a.blockUI.defaults.css,d.css||{}),d.onOverlayClick&&(d.overlayCSS.cursor="pointer"),p=a.extend({},a.blockUI.defaults.themedCSS,d.themedCSS||{}),r=void 0===r?d.message:r,q&&n&&c(window,{fadeOut:0}),r&&"string"!=typeof r&&(r.parentNode||r.jquery)){var s=r.jquery?r[0]:r,t={};a(b).data("blockUI.history",t),t.el=s,t.parent=s.parentNode,t.display=s.style.display,t.position=s.style.position,t.parent&&t.parent.removeChild(s)}a(b).data("blockUI.onUnblock",d.onUnblock);var u,v,w,x,y=d.baseZ;u=a(k||d.forceIframe?'':''),v=a(d.theme?'':''),d.theme&&q?(x='"):d.theme?(x='"):x=q?'':'',w=a(x),r&&(d.theme?(w.css(p),w.addClass("ui-widget-content")):w.css(f)),d.theme||v.css(d.overlayCSS),v.css("position",q?"fixed":"absolute"),(k||d.forceIframe)&&u.css("opacity",0);var z=[u,v,w],A=a(q?"body":b);a.each(z,function(){this.appendTo(A)}),d.theme&&d.draggable&&a.fn.draggable&&w.draggable({handle:".ui-dialog-titlebar",cancel:"li"});var B=m&&(!a.support.boxModel||a("object,embed",q?null:b).length>0);if(l||B){if(q&&d.allowBodyStretch&&a.support.boxModel&&a("html,body").css("height","100%"),(l||!a.support.boxModel)&&!q)var C=i(b,"borderTopWidth"),D=i(b,"borderLeftWidth"),E=C?"(0 - "+C+")":0,F=D?"(0 - "+D+")":0;a.each(z,function(a,b){var c=b[0].style;if(c.position="absolute",2>a)q?c.setExpression("height","Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:"+d.quirksmodeOffsetHack+') + "px"'):c.setExpression("height",'this.parentNode.offsetHeight + "px"'),q?c.setExpression("width",'jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"'):c.setExpression("width",'this.parentNode.offsetWidth + "px"'),F&&c.setExpression("left",F),E&&c.setExpression("top",E);else if(d.centerY)q&&c.setExpression("top",'(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"'),c.marginTop=0;else if(!d.centerY&&q){var e=d.css&&d.css.top?parseInt(d.css.top,10):0,f="((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "+e+') + "px"';c.setExpression("top",f)}})}if(r&&(d.theme?w.find(".ui-widget-content").append(r):w.append(r),(r.jquery||r.nodeType)&&a(r).show()),(k||d.forceIframe)&&d.showOverlay&&u.show(),d.fadeIn){var G=d.onBlock?d.onBlock:j,H=d.showOverlay&&!r?G:j,I=r?G:j;d.showOverlay&&v._fadeIn(d.fadeIn,H),r&&w._fadeIn(d.fadeIn,I)}else d.showOverlay&&v.show(),r&&w.show(),d.onBlock&&d.onBlock.bind(w)();if(e(1,b,d),q?(n=w[0],o=a(d.focusableElements,n),d.focusInput&&setTimeout(g,20)):h(w[0],d.centerX,d.centerY),d.timeout){var J=setTimeout(function(){q?a.unblockUI(d):a(b).unblock(d)},d.timeout);a(b).data("blockUI.timeout",J)}}}function c(b,c){var f,g=b==window,h=a(b),i=h.data("blockUI.history"),j=h.data("blockUI.timeout");j&&(clearTimeout(j),h.removeData("blockUI.timeout")),c=a.extend({},a.blockUI.defaults,c||{}),e(0,b,c),null===c.onUnblock&&(c.onUnblock=h.data("blockUI.onUnblock"),h.removeData("blockUI.onUnblock"));var k;k=g?a("body").children().filter(".blockUI").add("body > .blockUI"):h.find(">.blockUI"),c.cursorReset&&(k.length>1&&(k[1].style.cursor=c.cursorReset),k.length>2&&(k[2].style.cursor=c.cursorReset)),g&&(n=o=null),c.fadeOut?(f=k.length,k.stop().fadeOut(c.fadeOut,function(){0===--f&&d(k,i,c,b)})):d(k,i,c,b)}function d(b,c,d,e){var f=a(e);if(!f.data("blockUI.isBlocked")){b.each(function(){this.parentNode&&this.parentNode.removeChild(this)}),c&&c.el&&(c.el.style.display=c.display,c.el.style.position=c.position,c.el.style.cursor="default",c.parent&&c.parent.appendChild(c.el),f.removeData("blockUI.history")),f.data("blockUI.static")&&f.css("position","static"),"function"==typeof d.onUnblock&&d.onUnblock(e,d);var g=a(document.body),h=g.width(),i=g[0].style.width;g.width(h-1).width(h),g[0].style.width=i}}function e(b,c,d){var e=c==window,g=a(c);if((b||(!e||n)&&(e||g.data("blockUI.isBlocked")))&&(g.data("blockUI.isBlocked",b),e&&d.bindEvents&&(!b||d.showOverlay))){var h="mousedown mouseup keydown keypress keyup touchstart touchend touchmove";b?a(document).bind(h,d,f):a(document).unbind(h,f)}}function f(b){if("keydown"===b.type&&b.keyCode&&9==b.keyCode&&n&&b.data.constrainTabKey){var c=o,d=!b.shiftKey&&b.target===c[c.length-1],e=b.shiftKey&&b.target===c[0];if(d||e)return setTimeout(function(){g(e)},10),!1}var f=b.data,h=a(b.target);return h.hasClass("blockOverlay")&&f.onOverlayClick&&f.onOverlayClick(b),h.parents("div."+f.blockMsgClass).length>0?!0:0===h.parents().children().filter("div.blockUI").length}function g(a){if(o){var b=o[a===!0?o.length-1:0];b&&b.focus()}}function h(a,b,c){var d=a.parentNode,e=a.style,f=(d.offsetWidth-a.offsetWidth)/2-i(d,"borderLeftWidth"),g=(d.offsetHeight-a.offsetHeight)/2-i(d,"borderTopWidth");b&&(e.left=f>0?f+"px":"0"),c&&(e.top=g>0?g+"px":"0")}function i(b,c){return parseInt(a.css(b,c),10)||0}a.fn._fadeIn=a.fn.fadeIn;var j=a.noop||function(){},k=/MSIE/.test(navigator.userAgent),l=/MSIE 6.0/.test(navigator.userAgent)&&!/MSIE 8.0/.test(navigator.userAgent),m=(document.documentMode||0,a.isFunction(document.createElement("div").style.setExpression));a.blockUI=function(a){b(window,a)},a.unblockUI=function(a){c(window,a)},a.growlUI=function(b,c,d,e){var f=a('
');b&&f.append("

"+b+"

"),c&&f.append("

"+c+"

"),void 0===d&&(d=3e3);var g=function(b){b=b||{},a.blockUI({message:f,fadeIn:"undefined"!=typeof b.fadeIn?b.fadeIn:700,fadeOut:"undefined"!=typeof b.fadeOut?b.fadeOut:1e3,timeout:"undefined"!=typeof b.timeout?b.timeout:d,centerY:!1,showOverlay:!1,onUnblock:e,css:a.blockUI.defaults.growlCSS})};g();f.css("opacity");f.mouseover(function(){g({fadeIn:0,timeout:3e4});var b=a(".blockMsg");b.stop(),b.fadeTo(300,1)}).mouseout(function(){a(".blockMsg").fadeOut(1e3)})},a.fn.block=function(c){if(this[0]===window)return a.blockUI(c),this;var d=a.extend({},a.blockUI.defaults,c||{});return this.each(function(){var b=a(this);d.ignoreIfBlocked&&b.data("blockUI.isBlocked")||b.unblock({fadeOut:0})}),this.each(function(){"static"==a.css(this,"position")&&(this.style.position="relative",a(this).data("blockUI.static",!0)),this.style.zoom=1,b(this,c)})},a.fn.unblock=function(b){return this[0]===window?(a.unblockUI(b),this):this.each(function(){c(this,b)})},a.blockUI.version=2.7,a.blockUI.defaults={message:"

Please wait...

",title:null,draggable:!0,theme:!1,css:{padding:0,margin:0,width:"30%",top:"40%",left:"35%",textAlign:"center",color:"#000",border:"3px solid #aaa",backgroundColor:"#fff",cursor:"wait"},themedCSS:{width:"30%",top:"40%",left:"35%"},overlayCSS:{backgroundColor:"#000",opacity:.6,cursor:"wait"},cursorReset:"default",growlCSS:{width:"350px",top:"10px",left:"",right:"10px",border:"none",padding:"5px",opacity:.6,cursor:"default",color:"#fff",backgroundColor:"#000","-webkit-border-radius":"10px","-moz-border-radius":"10px","border-radius":"10px"},iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank",forceIframe:!1,baseZ:1e3,centerX:!0,centerY:!0,allowBodyStretch:!0,bindEvents:!0,constrainTabKey:!0,fadeIn:200,fadeOut:400,timeout:0,showOverlay:!0,focusInput:!0,focusableElements:":input:enabled:visible",onBlock:null,onUnblock:null,onOverlayClick:null,quirksmodeOffsetHack:4,blockMsgClass:"blockMsg",ignoreIfBlocked:!1};var n=null,o=[]}"function"==typeof define&&define.amd&&define.amd.jQuery?define(["jquery"],a):a(jQuery)}(); \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/login-form-integrations.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/login-form-integrations.php new file mode 100755 index 00000000..931560a9 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/login-form-integrations.php @@ -0,0 +1,146 @@ +tfa = $tfa; + + $enqueue_upon_actions = array( + // This is needed for the login form on the dedicated payment page (e.g. /checkout/order-pay/123456/?pay_for_order=true&key=wc_order_blahblahblah) + 'woocommerce_login_form_start', + 'woocommerce_before_customer_login_form', + // The login form on the checkout doesn't call the woocommerce_before_customer_login_form action + 'woocommerce_before_checkout_form', + 'affwp_login_fields_before', + ); + + foreach ($enqueue_upon_actions as $action) { + add_action($action, array($this->tfa, 'login_enqueue_scripts')); + } + + if (!defined('TWO_FACTOR_DISABLE') || !TWO_FACTOR_DISABLE) { + add_action('affwp_process_login_form', array($this, 'affwp_process_login_form')); + } + + add_filter('tml_display', array($this, 'tml_display')); + add_filter('wppb_login_form_bottom', array($this, 'pb_login_form')); + + // We want to run first if possible, so that we're not aborted by JavaScript exceptions in other components (our code is critical to the login process for TFA users) + // Unfortunately, though, people start enqueuing from init onwards (before that is buggy - https://core.trac.wordpress.org/ticket/11526), so, we try to detect the login page and go earlier there. + if (isset($GLOBALS['pagenow']) && 'wp-login.php' === $GLOBALS['pagenow']) { + add_action('init', array($this->tfa, 'login_enqueue_scripts'), -99999999999); + } else { + add_action('login_enqueue_scripts', array($this->tfa, 'login_enqueue_scripts'), -99999999999); + } + + add_filter('do_shortcode_tag', array($this, 'do_shortcode_tag'), 10, 2); + + add_filter('simba_tfa_login_enqueue_localize', array($this, 'simba_tfa_login_enqueue_localize'), 9); + + } + + /** + * Catch TML login widgets (other TML login forms already trigger) + * + * @param Mixed $whatever + * + * @return Mixed + */ + public function tml_display($whatever) { + $this->tfa->login_enqueue_scripts(); + return $whatever; + } + + /** + * Catch Profile Builder login form + * + * @param Mixed $whatever + * + * @return Mixed + */ + public function pb_login_form($whatever) { + $this->tfa->login_enqueue_scripts(); + return $whatever; + } + + /** + * Runs upon the WP filter simba_tfa_login_enqueue_localize. + * + * @param Array $localize + * + * @return Array + */ + public function simba_tfa_login_enqueue_localize($localize) { + // WP login form is #loginform + // Ultimate Membership Pro - April 2018 + // Theme My Login 6.x - .tml-login form[name="loginform"] + // Theme My Login 7.x - .tml-login form[name="login"] (July 2018) + // WP Members - March 2018 + // bbPress - June 2021 + // WooCommerce - ported over from the separate wooextend.js code, June 2021 + // Affiliates WP - ported over from the separate wooextend.js code, June 2021 + $localize['login_form_selectors'] .= '.tml-login form[name="loginform"], .tml-login form[name="login"], #loginform, #wpmem_login form, form#ihc_login_form, .bbp-login-form, .woocommerce form.login, #affwp-login-form, #wppb-loginform'; + $localize['login_form_off_selectors'] .= '#ihc_login_form'; + return $localize; + } + + /** + * Runs upon the WP action affwp_process_login_form + */ + public function affwp_process_login_form() { + + if (!function_exists('affiliate_wp')) return; + + $affiliate_wp = affiliate_wp(); + $login = $affiliate_wp->login; + + $params = array( + // phpcs:ignore WordPress.Security.NonceVerification -- No nonce. + 'log' => isset($_POST['affwp_user_login']) ? sanitize_user(wp_unslash($_POST['affwp_user_login'])): '', + + $request_uri = isset($_SERVER['REQUEST_URI']) ? sanitize_text_field(wp_unslash($_SERVER['REQUEST_URI'])) : '', + 'caller'=> isset($_SERVER['PHP_SELF']) ? sanitize_text_field(wp_unslash($_SERVER['PHP_SELF'])) : $request_uri, + // phpcs:ignore WordPress.Security.NonceVerification -- No nonce. + 'two_factor_code' => isset($_POST['two_factor_code']) ? sanitize_text_field(wp_unslash((string) $_POST['two_factor_code'])) : '', + ); + $code_ok = $this->tfa->authorise_user_from_login($params, true); + + $code_ok = apply_filters('simbatfa_affwp_process_login_form_auth_result', $code_ok, $params); + + if (is_wp_error($code_ok)) { + $login->add_error($code_ok->get_error_code(), $code_ok->get_error_message()); + } elseif (!$code_ok) { + $login->add_error('authentication_failed', __('Error:', 'all-in-one-wp-security-and-firewall').' '.apply_filters('simba_tfa_message_code_incorrect', __('The one-time password (TFA code) you entered was incorrect.', 'all-in-one-wp-security-and-firewall'))); + } + + } + + /** + * Ultimate Membership Pro support + * + * @param String $output + * @param String $tag + * + * @return String + */ + public function do_shortcode_tag($output, $tag) { + if ('ihc-login-form' == $tag) $this->tfa->login_enqueue_scripts(); + return $output; + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/select2.css b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/select2.css new file mode 100755 index 00000000..750b3207 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/select2.css @@ -0,0 +1,481 @@ +.select2-container { + box-sizing: border-box; + display: inline-block; + margin: 0; + position: relative; + vertical-align: middle; } + .select2-container .select2-selection--single { + box-sizing: border-box; + cursor: pointer; + display: block; + height: 28px; + user-select: none; + -webkit-user-select: none; } + .select2-container .select2-selection--single .select2-selection__rendered { + display: block; + padding-left: 8px; + padding-right: 20px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + .select2-container .select2-selection--single .select2-selection__clear { + position: relative; } + .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 8px; + padding-left: 20px; } + .select2-container .select2-selection--multiple { + box-sizing: border-box; + cursor: pointer; + display: block; + min-height: 32px; + user-select: none; + -webkit-user-select: none; } + .select2-container .select2-selection--multiple .select2-selection__rendered { + display: inline-block; + overflow: hidden; + padding-left: 8px; + text-overflow: ellipsis; + white-space: nowrap; } + .select2-container .select2-search--inline { + float: left; } + .select2-container .select2-search--inline .select2-search__field { + box-sizing: border-box; + border: none; + font-size: 100%; + margin-top: 5px; + padding: 0; } + .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; } + +.select2-dropdown { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + box-sizing: border-box; + display: block; + position: absolute; + left: -100000px; + width: 100%; + z-index: 1051; } + +.select2-results { + display: block; } + +.select2-results__options { + list-style: none; + margin: 0; + padding: 0; } + +.select2-results__option { + padding: 6px; + user-select: none; + -webkit-user-select: none; } + .select2-results__option[aria-selected] { + cursor: pointer; } + +.select2-container--open .select2-dropdown { + left: 0; } + +.select2-container--open .select2-dropdown--above { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--open .select2-dropdown--below { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-search--dropdown { + display: block; + padding: 4px; } + .select2-search--dropdown .select2-search__field { + padding: 4px; + width: 100%; + box-sizing: border-box; } + .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; } + .select2-search--dropdown.select2-search--hide { + display: none; } + +.select2-close-mask { + border: 0; + margin: 0; + padding: 0; + display: block; + position: fixed; + left: 0; + top: 0; + min-height: 100%; + min-width: 100%; + height: auto; + width: auto; + opacity: 0; + z-index: 99; + background-color: #fff; + filter: alpha(opacity=0); } + +.select2-hidden-accessible { + border: 0 !important; + clip: rect(0 0 0 0) !important; + -webkit-clip-path: inset(50%) !important; + clip-path: inset(50%) !important; + height: 1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !important; + white-space: nowrap !important; } + +.select2-container--default .select2-selection--single { + background-color: #fff; + border: 1px solid #aaa; + border-radius: 4px; } + .select2-container--default .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; } + .select2-container--default .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; } + .select2-container--default .select2-selection--single .select2-selection__placeholder { + color: #999; } + .select2-container--default .select2-selection--single .select2-selection__arrow { + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; } + .select2-container--default .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; } + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; } + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto; } + +.select2-container--default.select2-container--disabled .select2-selection--single { + background-color: #eee; + cursor: default; } + .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { + display: none; } + +.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; } + +.select2-container--default .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; } + .select2-container--default .select2-selection--multiple .select2-selection__rendered { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0 5px; + width: 100%; } + .select2-container--default .select2-selection--multiple .select2-selection__rendered li { + list-style: none; } + .select2-container--default .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-top: 5px; + margin-right: 10px; + padding: 1px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + color: #999; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #333; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { + float: right; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; } + +.select2-container--default.select2-container--focus .select2-selection--multiple { + border: solid black 1px; + outline: 0; } + +.select2-container--default.select2-container--disabled .select2-selection--multiple { + background-color: #eee; + cursor: default; } + +.select2-container--default.select2-container--disabled .select2-selection__choice__remove { + display: none; } + +.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--default .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; } + +.select2-container--default .select2-search--inline .select2-search__field { + background: transparent; + border: none; + outline: 0; + box-shadow: none; + -webkit-appearance: textfield; } + +.select2-container--default .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; } + +.select2-container--default .select2-results__option[role=group] { + padding: 0; } + +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999; } + +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd; } + +.select2-container--default .select2-results__option .select2-results__option { + padding-left: 1em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em; } + +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #5897fb; + color: white; } + +.select2-container--default .select2-results__group { + cursor: default; + display: block; + padding: 6px; } + +.select2-container--classic .select2-selection--single { + background-color: #f7f7f7; + border: 1px solid #aaa; + border-radius: 4px; + outline: 0; + background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } + .select2-container--classic .select2-selection--single:focus { + border: 1px solid #5897fb; } + .select2-container--classic .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; } + .select2-container--classic .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-right: 10px; } + .select2-container--classic .select2-selection--single .select2-selection__placeholder { + color: #999; } + .select2-container--classic .select2-selection--single .select2-selection__arrow { + background-color: #ddd; + border: none; + border-left: 1px solid #aaa; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } + .select2-container--classic .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; } + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; } + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { + border: none; + border-right: 1px solid #aaa; + border-radius: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + left: 1px; + right: auto; } + +.select2-container--classic.select2-container--open .select2-selection--single { + border: 1px solid #5897fb; } + .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { + background: transparent; + border: none; } + .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; } + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } + +.select2-container--classic .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; + outline: 0; } + .select2-container--classic .select2-selection--multiple:focus { + border: 1px solid #5897fb; } + .select2-container--classic .select2-selection--multiple .select2-selection__rendered { + list-style: none; + margin: 0; + padding: 0 5px; } + .select2-container--classic .select2-selection--multiple .select2-selection__clear { + display: none; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { + color: #888; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #555; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + float: right; + margin-left: 5px; + margin-right: auto; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; } + +.select2-container--classic.select2-container--open .select2-selection--multiple { + border: 1px solid #5897fb; } + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--classic .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; + outline: 0; } + +.select2-container--classic .select2-search--inline .select2-search__field { + outline: 0; + box-shadow: none; } + +.select2-container--classic .select2-dropdown { + background-color: white; + border: 1px solid transparent; } + +.select2-container--classic .select2-dropdown--above { + border-bottom: none; } + +.select2-container--classic .select2-dropdown--below { + border-top: none; } + +.select2-container--classic .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; } + +.select2-container--classic .select2-results__option[role=group] { + padding: 0; } + +.select2-container--classic .select2-results__option[aria-disabled=true] { + color: grey; } + +.select2-container--classic .select2-results__option--highlighted[aria-selected] { + background-color: #3875d7; + color: white; } + +.select2-container--classic .select2-results__group { + cursor: default; + display: block; + padding: 6px; } + +.select2-container--classic.select2-container--open .select2-dropdown { + border-color: #5897fb; } diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/select2.js b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/select2.js new file mode 100755 index 00000000..fcfb5ab4 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/select2.js @@ -0,0 +1,6108 @@ +/*! + * Select2 4.0.13 + * https://select2.github.io + * + * Released under the MIT license + * https://github.com/select2/select2/blob/master/LICENSE.md + */ +;(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof module === 'object' && module.exports) { + // Node/CommonJS + module.exports = function (root, jQuery) { + if (jQuery === undefined) { + // require('jQuery') returns a factory that requires window to + // build a jQuery instance, we normalize how we use modules + // that require this pattern but the window provided is a noop + // if it's defined (how jquery works) + if (typeof window !== 'undefined') { + jQuery = require('jquery'); + } + else { + jQuery = require('jquery')(root); + } + } + factory(jQuery); + return jQuery; + }; + } else { + // Browser globals + factory(jQuery); + } +} (function (jQuery) { + // This is needed so we can catch the AMD loader configuration and use it + // The inner file should be wrapped (by `banner.start.js`) in a function that + // returns the AMD loader references. + var S2 =(function () { + // Restore the Select2 AMD loader so it can be used + // Needed mostly in the language files, where the loader is not inserted + if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { + var S2 = jQuery.fn.select2.amd; + } +var S2;(function () { if (!S2 || !S2.requirejs) { +if (!S2) { S2 = {}; } else { require = S2; } +/** + * @license almond 0.3.3 Copyright jQuery Foundation and other contributors. + * Released under MIT license, http://github.com/requirejs/almond/LICENSE + */ +//Going sloppy to avoid 'use strict' string cost, but strict practices should +//be followed. +/*global setTimeout: false */ + +var requirejs, require, define; +(function (undef) { + var main, req, makeMap, handlers, + defined = {}, + waiting = {}, + config = {}, + defining = {}, + hasOwn = Object.prototype.hasOwnProperty, + aps = [].slice, + jsSuffixRegExp = /\.js$/; + + function hasProp(obj, prop) { + return hasOwn.call(obj, prop); + } + + /** + * Given a relative module name, like ./something, normalize it to + * a real name that can be mapped to a path. + * @param {String} name the relative name + * @param {String} baseName a real name that the name arg is relative + * to. + * @returns {String} normalized name + */ + function normalize(name, baseName) { + var nameParts, nameSegment, mapValue, foundMap, lastIndex, + foundI, foundStarMap, starI, i, j, part, normalizedBaseParts, + baseParts = baseName && baseName.split("/"), + map = config.map, + starMap = (map && map['*']) || {}; + + //Adjust any relative paths. + if (name) { + name = name.split('/'); + lastIndex = name.length - 1; + + // If wanting node ID compatibility, strip .js from end + // of IDs. Have to do this here, and not in nameToUrl + // because node allows either .js or non .js to map + // to same file. + if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { + name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); + } + + // Starts with a '.' so need the baseName + if (name[0].charAt(0) === '.' && baseParts) { + //Convert baseName to array, and lop off the last part, + //so that . matches that 'directory' and not name of the baseName's + //module. For instance, baseName of 'one/two/three', maps to + //'one/two/three.js', but we want the directory, 'one/two' for + //this normalization. + normalizedBaseParts = baseParts.slice(0, baseParts.length - 1); + name = normalizedBaseParts.concat(name); + } + + //start trimDots + for (i = 0; i < name.length; i++) { + part = name[i]; + if (part === '.') { + name.splice(i, 1); + i -= 1; + } else if (part === '..') { + // If at the start, or previous value is still .., + // keep them so that when converted to a path it may + // still work when converted to a path, even though + // as an ID it is less than ideal. In larger point + // releases, may be better to just kick out an error. + if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') { + continue; + } else if (i > 0) { + name.splice(i - 1, 2); + i -= 2; + } + } + } + //end trimDots + + name = name.join('/'); + } + + //Apply map config if available. + if ((baseParts || starMap) && map) { + nameParts = name.split('/'); + + for (i = nameParts.length; i > 0; i -= 1) { + nameSegment = nameParts.slice(0, i).join("/"); + + if (baseParts) { + //Find the longest baseName segment match in the config. + //So, do joins on the biggest to smallest lengths of baseParts. + for (j = baseParts.length; j > 0; j -= 1) { + mapValue = map[baseParts.slice(0, j).join('/')]; + + //baseName segment has config, find if it has one for + //this name. + if (mapValue) { + mapValue = mapValue[nameSegment]; + if (mapValue) { + //Match, update name to the new value. + foundMap = mapValue; + foundI = i; + break; + } + } + } + } + + if (foundMap) { + break; + } + + //Check for a star map match, but just hold on to it, + //if there is a shorter segment match later in a matching + //config, then favor over this star map. + if (!foundStarMap && starMap && starMap[nameSegment]) { + foundStarMap = starMap[nameSegment]; + starI = i; + } + } + + if (!foundMap && foundStarMap) { + foundMap = foundStarMap; + foundI = starI; + } + + if (foundMap) { + nameParts.splice(0, foundI, foundMap); + name = nameParts.join('/'); + } + } + + return name; + } + + function makeRequire(relName, forceSync) { + return function () { + //A version of a require function that passes a moduleName + //value for items that may need to + //look up paths relative to the moduleName + var args = aps.call(arguments, 0); + + //If first arg is not require('string'), and there is only + //one arg, it is the array form without a callback. Insert + //a null so that the following concat is correct. + if (typeof args[0] !== 'string' && args.length === 1) { + args.push(null); + } + return req.apply(undef, args.concat([relName, forceSync])); + }; + } + + function makeNormalize(relName) { + return function (name) { + return normalize(name, relName); + }; + } + + function makeLoad(depName) { + return function (value) { + defined[depName] = value; + }; + } + + function callDep(name) { + if (hasProp(waiting, name)) { + var args = waiting[name]; + delete waiting[name]; + defining[name] = true; + main.apply(undef, args); + } + + if (!hasProp(defined, name) && !hasProp(defining, name)) { + throw new Error('No ' + name); + } + return defined[name]; + } + + //Turns a plugin!resource to [plugin, resource] + //with the plugin being undefined if the name + //did not have a plugin prefix. + function splitPrefix(name) { + var prefix, + index = name ? name.indexOf('!') : -1; + if (index > -1) { + prefix = name.substring(0, index); + name = name.substring(index + 1, name.length); + } + return [prefix, name]; + } + + //Creates a parts array for a relName where first part is plugin ID, + //second part is resource ID. Assumes relName has already been normalized. + function makeRelParts(relName) { + return relName ? splitPrefix(relName) : []; + } + + /** + * Makes a name map, normalizing the name, and using a plugin + * for normalization if necessary. Grabs a ref to plugin + * too, as an optimization. + */ + makeMap = function (name, relParts) { + var plugin, + parts = splitPrefix(name), + prefix = parts[0], + relResourceName = relParts[1]; + + name = parts[1]; + + if (prefix) { + prefix = normalize(prefix, relResourceName); + plugin = callDep(prefix); + } + + //Normalize according + if (prefix) { + if (plugin && plugin.normalize) { + name = plugin.normalize(name, makeNormalize(relResourceName)); + } else { + name = normalize(name, relResourceName); + } + } else { + name = normalize(name, relResourceName); + parts = splitPrefix(name); + prefix = parts[0]; + name = parts[1]; + if (prefix) { + plugin = callDep(prefix); + } + } + + //Using ridiculous property names for space reasons + return { + f: prefix ? prefix + '!' + name : name, //fullName + n: name, + pr: prefix, + p: plugin + }; + }; + + function makeConfig(name) { + return function () { + return (config && config.config && config.config[name]) || {}; + }; + } + + handlers = { + require: function (name) { + return makeRequire(name); + }, + exports: function (name) { + var e = defined[name]; + if (typeof e !== 'undefined') { + return e; + } else { + return (defined[name] = {}); + } + }, + module: function (name) { + return { + id: name, + uri: '', + exports: defined[name], + config: makeConfig(name) + }; + } + }; + + main = function (name, deps, callback, relName) { + var cjsModule, depName, ret, map, i, relParts, + args = [], + callbackType = typeof callback, + usingExports; + + //Use name if no relName + relName = relName || name; + relParts = makeRelParts(relName); + + //Call the callback to define the module, if necessary. + if (callbackType === 'undefined' || callbackType === 'function') { + //Pull out the defined dependencies and pass the ordered + //values to the callback. + //Default to [require, exports, module] if no deps + deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; + for (i = 0; i < deps.length; i += 1) { + map = makeMap(deps[i], relParts); + depName = map.f; + + //Fast path CommonJS standard dependencies. + if (depName === "require") { + args[i] = handlers.require(name); + } else if (depName === "exports") { + //CommonJS module spec 1.1 + args[i] = handlers.exports(name); + usingExports = true; + } else if (depName === "module") { + //CommonJS module spec 1.1 + cjsModule = args[i] = handlers.module(name); + } else if (hasProp(defined, depName) || + hasProp(waiting, depName) || + hasProp(defining, depName)) { + args[i] = callDep(depName); + } else if (map.p) { + map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); + args[i] = defined[depName]; + } else { + throw new Error(name + ' missing ' + depName); + } + } + + ret = callback ? callback.apply(defined[name], args) : undefined; + + if (name) { + //If setting exports via "module" is in play, + //favor that over return value and exports. After that, + //favor a non-undefined return value over exports use. + if (cjsModule && cjsModule.exports !== undef && + cjsModule.exports !== defined[name]) { + defined[name] = cjsModule.exports; + } else if (ret !== undef || !usingExports) { + //Use the return value from the function. + defined[name] = ret; + } + } + } else if (name) { + //May just be an object definition for the module. Only + //worry about defining if have a module name. + defined[name] = callback; + } + }; + + requirejs = require = req = function (deps, callback, relName, forceSync, alt) { + if (typeof deps === "string") { + if (handlers[deps]) { + //callback in this case is really relName + return handlers[deps](callback); + } + //Just return the module wanted. In this scenario, the + //deps arg is the module name, and second arg (if passed) + //is just the relName. + //Normalize module name, if it contains . or .. + return callDep(makeMap(deps, makeRelParts(callback)).f); + } else if (!deps.splice) { + //deps is a config object, not an array. + config = deps; + if (config.deps) { + req(config.deps, config.callback); + } + if (!callback) { + return; + } + + if (callback.splice) { + //callback is an array, which means it is a dependency list. + //Adjust args if there are dependencies + deps = callback; + callback = relName; + relName = null; + } else { + deps = undef; + } + } + + //Support require(['a']) + callback = callback || function () {}; + + //If relName is a function, it is an errback handler, + //so remove it. + if (typeof relName === 'function') { + relName = forceSync; + forceSync = alt; + } + + //Simulate async callback; + if (forceSync) { + main(undef, deps, callback, relName); + } else { + //Using a non-zero value because of concern for what old browsers + //do, and latest browsers "upgrade" to 4 if lower value is used: + //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: + //If want a value immediately, use require('id') instead -- something + //that works in almond on the global level, but not guaranteed and + //unlikely to work in other AMD implementations. + setTimeout(function () { + main(undef, deps, callback, relName); + }, 4); + } + + return req; + }; + + /** + * Just drops the config on the floor, but returns req in case + * the config return value is used. + */ + req.config = function (cfg) { + return req(cfg); + }; + + /** + * Expose module registry for debugging and tooling + */ + requirejs._defined = defined; + + define = function (name, deps, callback) { + if (typeof name !== 'string') { + throw new Error('See almond README: incorrect module build, no module name'); + } + + //This module may not have dependencies + if (!deps.splice) { + //deps is not an array, so probably means + //an object literal or factory function for + //the value. Adjust args. + callback = deps; + deps = []; + } + + if (!hasProp(defined, name) && !hasProp(waiting, name)) { + waiting[name] = [name, deps, callback]; + } + }; + + define.amd = { + jQuery: true + }; +}()); + +S2.requirejs = requirejs;S2.require = require;S2.define = define; +} +}()); +S2.define("almond", function(){}); + +/* global jQuery:false, $:false */ +S2.define('jquery',[],function () { + var _$ = jQuery || $; + + if (_$ == null && console && console.error) { + console.error( + 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + + 'found. Make sure that you are including jQuery before Select2 on your ' + + 'web page.' + ); + } + + return _$; +}); + +S2.define('select2/utils',[ + 'jquery' +], function ($) { + var Utils = {}; + + Utils.Extend = function (ChildClass, SuperClass) { + var __hasProp = {}.hasOwnProperty; + + function BaseConstructor () { + this.constructor = ChildClass; + } + + for (var key in SuperClass) { + if (__hasProp.call(SuperClass, key)) { + ChildClass[key] = SuperClass[key]; + } + } + + BaseConstructor.prototype = SuperClass.prototype; + ChildClass.prototype = new BaseConstructor(); + ChildClass.__super__ = SuperClass.prototype; + + return ChildClass; + }; + + function getMethods (theClass) { + var proto = theClass.prototype; + + var methods = []; + + for (var methodName in proto) { + var m = proto[methodName]; + + if (typeof m !== 'function') { + continue; + } + + if (methodName === 'constructor') { + continue; + } + + methods.push(methodName); + } + + return methods; + } + + Utils.Decorate = function (SuperClass, DecoratorClass) { + var decoratedMethods = getMethods(DecoratorClass); + var superMethods = getMethods(SuperClass); + + function DecoratedClass () { + var unshift = Array.prototype.unshift; + + var argCount = DecoratorClass.prototype.constructor.length; + + var calledConstructor = SuperClass.prototype.constructor; + + if (argCount > 0) { + unshift.call(arguments, SuperClass.prototype.constructor); + + calledConstructor = DecoratorClass.prototype.constructor; + } + + calledConstructor.apply(this, arguments); + } + + DecoratorClass.displayName = SuperClass.displayName; + + function ctr () { + this.constructor = DecoratedClass; + } + + DecoratedClass.prototype = new ctr(); + + for (var m = 0; m < superMethods.length; m++) { + var superMethod = superMethods[m]; + + DecoratedClass.prototype[superMethod] = + SuperClass.prototype[superMethod]; + } + + var calledMethod = function (methodName) { + // Stub out the original method if it's not decorating an actual method + var originalMethod = function () {}; + + if (methodName in DecoratedClass.prototype) { + originalMethod = DecoratedClass.prototype[methodName]; + } + + var decoratedMethod = DecoratorClass.prototype[methodName]; + + return function () { + var unshift = Array.prototype.unshift; + + unshift.call(arguments, originalMethod); + + return decoratedMethod.apply(this, arguments); + }; + }; + + for (var d = 0; d < decoratedMethods.length; d++) { + var decoratedMethod = decoratedMethods[d]; + + DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); + } + + return DecoratedClass; + }; + + var Observable = function () { + this.listeners = {}; + }; + + Observable.prototype.on = function (event, callback) { + this.listeners = this.listeners || {}; + + if (event in this.listeners) { + this.listeners[event].push(callback); + } else { + this.listeners[event] = [callback]; + } + }; + + Observable.prototype.trigger = function (event) { + var slice = Array.prototype.slice; + var params = slice.call(arguments, 1); + + this.listeners = this.listeners || {}; + + // Params should always come in as an array + if (params == null) { + params = []; + } + + // If there are no arguments to the event, use a temporary object + if (params.length === 0) { + params.push({}); + } + + // Set the `_type` of the first object to the event + params[0]._type = event; + + if (event in this.listeners) { + this.invoke(this.listeners[event], slice.call(arguments, 1)); + } + + if ('*' in this.listeners) { + this.invoke(this.listeners['*'], arguments); + } + }; + + Observable.prototype.invoke = function (listeners, params) { + for (var i = 0, len = listeners.length; i < len; i++) { + listeners[i].apply(this, params); + } + }; + + Utils.Observable = Observable; + + Utils.generateChars = function (length) { + var chars = ''; + + for (var i = 0; i < length; i++) { + var randomChar = Math.floor(Math.random() * 36); + chars += randomChar.toString(36); + } + + return chars; + }; + + Utils.bind = function (func, context) { + return function () { + func.apply(context, arguments); + }; + }; + + Utils._convertData = function (data) { + for (var originalKey in data) { + var keys = originalKey.split('-'); + + var dataLevel = data; + + if (keys.length === 1) { + continue; + } + + for (var k = 0; k < keys.length; k++) { + var key = keys[k]; + + // Lowercase the first letter + // By default, dash-separated becomes camelCase + key = key.substring(0, 1).toLowerCase() + key.substring(1); + + if (!(key in dataLevel)) { + dataLevel[key] = {}; + } + + if (k == keys.length - 1) { + dataLevel[key] = data[originalKey]; + } + + dataLevel = dataLevel[key]; + } + + delete data[originalKey]; + } + + return data; + }; + + Utils.hasScroll = function (index, el) { + // Adapted from the function created by @ShadowScripter + // and adapted by @BillBarry on the Stack Exchange Code Review website. + // The original code can be found at + // http://codereview.stackexchange.com/q/13338 + // and was designed to be used with the Sizzle selector engine. + + var $el = $(el); + var overflowX = el.style.overflowX; + var overflowY = el.style.overflowY; + + //Check both x and y declarations + if (overflowX === overflowY && + (overflowY === 'hidden' || overflowY === 'visible')) { + return false; + } + + if (overflowX === 'scroll' || overflowY === 'scroll') { + return true; + } + + return ($el.innerHeight() < el.scrollHeight || + $el.innerWidth() < el.scrollWidth); + }; + + Utils.escapeMarkup = function (markup) { + var replaceMap = { + '\\': '\', + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''', + '/': '/' + }; + + // Do not try to escape the markup if it's not a string + if (typeof markup !== 'string') { + return markup; + } + + return String(markup).replace(/[&<>"'\/\\]/g, function (match) { + return replaceMap[match]; + }); + }; + + // Append an array of jQuery nodes to a given element. + Utils.appendMany = function ($element, $nodes) { + // jQuery 1.7.x does not support $.fn.append() with an array + // Fall back to a jQuery object collection using $.fn.add() + if ($.fn.jquery.substr(0, 3) === '1.7') { + var $jqNodes = $(); + + $.map($nodes, function (node) { + $jqNodes = $jqNodes.add(node); + }); + + $nodes = $jqNodes; + } + + $element.append($nodes); + }; + + // Cache objects in Utils.__cache instead of $.data (see #4346) + Utils.__cache = {}; + + var id = 0; + Utils.GetUniqueElementId = function (element) { + // Get a unique element Id. If element has no id, + // creates a new unique number, stores it in the id + // attribute and returns the new id. + // If an id already exists, it simply returns it. + + var select2Id = element.getAttribute('data-select2-id'); + if (select2Id == null) { + // If element has id, use it. + if (element.id) { + select2Id = element.id; + element.setAttribute('data-select2-id', select2Id); + } else { + element.setAttribute('data-select2-id', ++id); + select2Id = id.toString(); + } + } + return select2Id; + }; + + Utils.StoreData = function (element, name, value) { + // Stores an item in the cache for a specified element. + // name is the cache key. + var id = Utils.GetUniqueElementId(element); + if (!Utils.__cache[id]) { + Utils.__cache[id] = {}; + } + + Utils.__cache[id][name] = value; + }; + + Utils.GetData = function (element, name) { + // Retrieves a value from the cache by its key (name) + // name is optional. If no name specified, return + // all cache items for the specified element. + // and for a specified element. + var id = Utils.GetUniqueElementId(element); + if (name) { + if (Utils.__cache[id]) { + if (Utils.__cache[id][name] != null) { + return Utils.__cache[id][name]; + } + return $(element).data(name); // Fallback to HTML5 data attribs. + } + return $(element).data(name); // Fallback to HTML5 data attribs. + } else { + return Utils.__cache[id]; + } + }; + + Utils.RemoveData = function (element) { + // Removes all cached items for a specified element. + var id = Utils.GetUniqueElementId(element); + if (Utils.__cache[id] != null) { + delete Utils.__cache[id]; + } + + element.removeAttribute('data-select2-id'); + }; + + return Utils; +}); + +S2.define('select2/results',[ + 'jquery', + './utils' +], function ($, Utils) { + function Results ($element, options, dataAdapter) { + this.$element = $element; + this.data = dataAdapter; + this.options = options; + + Results.__super__.constructor.call(this); + } + + Utils.Extend(Results, Utils.Observable); + + Results.prototype.render = function () { + var $results = $( + '
    ' + ); + + if (this.options.get('multiple')) { + $results.attr('aria-multiselectable', 'true'); + } + + this.$results = $results; + + return $results; + }; + + Results.prototype.clear = function () { + this.$results.empty(); + }; + + Results.prototype.displayMessage = function (params) { + var escapeMarkup = this.options.get('escapeMarkup'); + + this.clear(); + this.hideLoading(); + + var $message = $( + '' + ); + + var message = this.options.get('translations').get(params.message); + + $message.append( + escapeMarkup( + message(params.args) + ) + ); + + $message[0].className += ' select2-results__message'; + + this.$results.append($message); + }; + + Results.prototype.hideMessages = function () { + this.$results.find('.select2-results__message').remove(); + }; + + Results.prototype.append = function (data) { + this.hideLoading(); + + var $options = []; + + if (data.results == null || data.results.length === 0) { + if (this.$results.children().length === 0) { + this.trigger('results:message', { + message: 'noResults' + }); + } + + return; + } + + data.results = this.sort(data.results); + + for (var d = 0; d < data.results.length; d++) { + var item = data.results[d]; + + var $option = this.option(item); + + $options.push($option); + } + + this.$results.append($options); + }; + + Results.prototype.position = function ($results, $dropdown) { + var $resultsContainer = $dropdown.find('.select2-results'); + $resultsContainer.append($results); + }; + + Results.prototype.sort = function (data) { + var sorter = this.options.get('sorter'); + + return sorter(data); + }; + + Results.prototype.highlightFirstItem = function () { + var $options = this.$results + .find('.select2-results__option[aria-selected]'); + + var $selected = $options.filter('[aria-selected=true]'); + + // Check if there are any selected options + if ($selected.length > 0) { + // If there are selected options, highlight the first + $selected.first().trigger('mouseenter'); + } else { + // If there are no selected options, highlight the first option + // in the dropdown + $options.first().trigger('mouseenter'); + } + + this.ensureHighlightVisible(); + }; + + Results.prototype.setClasses = function () { + var self = this; + + this.data.current(function (selected) { + var selectedIds = $.map(selected, function (s) { + return s.id.toString(); + }); + + var $options = self.$results + .find('.select2-results__option[aria-selected]'); + + $options.each(function () { + var $option = $(this); + + var item = Utils.GetData(this, 'data'); + + // id needs to be converted to a string when comparing + var id = '' + item.id; + + if ((item.element != null && item.element.selected) || + (item.element == null && $.inArray(id, selectedIds) > -1)) { + $option.attr('aria-selected', 'true'); + } else { + $option.attr('aria-selected', 'false'); + } + }); + + }); + }; + + Results.prototype.showLoading = function (params) { + this.hideLoading(); + + var loadingMore = this.options.get('translations').get('searching'); + + var loading = { + disabled: true, + loading: true, + text: loadingMore(params) + }; + var $loading = this.option(loading); + $loading.className += ' loading-results'; + + this.$results.prepend($loading); + }; + + Results.prototype.hideLoading = function () { + this.$results.find('.loading-results').remove(); + }; + + Results.prototype.option = function (data) { + var option = document.createElement('li'); + option.className = 'select2-results__option'; + + var attrs = { + 'role': 'option', + 'aria-selected': 'false' + }; + + var matches = window.Element.prototype.matches || + window.Element.prototype.msMatchesSelector || + window.Element.prototype.webkitMatchesSelector; + + if ((data.element != null && matches.call(data.element, ':disabled')) || + (data.element == null && data.disabled)) { + delete attrs['aria-selected']; + attrs['aria-disabled'] = 'true'; + } + + if (data.id == null) { + delete attrs['aria-selected']; + } + + if (data._resultId != null) { + option.id = data._resultId; + } + + if (data.title) { + option.title = data.title; + } + + if (data.children) { + attrs.role = 'group'; + attrs['aria-label'] = data.text; + delete attrs['aria-selected']; + } + + for (var attr in attrs) { + var val = attrs[attr]; + + option.setAttribute(attr, val); + } + + if (data.children) { + var $option = $(option); + + var label = document.createElement('strong'); + label.className = 'select2-results__group'; + + var $label = $(label); + this.template(data, label); + + var $children = []; + + for (var c = 0; c < data.children.length; c++) { + var child = data.children[c]; + + var $child = this.option(child); + + $children.push($child); + } + + var $childrenContainer = $('
      ', { + 'class': 'select2-results__options select2-results__options--nested' + }); + + $childrenContainer.append($children); + + $option.append(label); + $option.append($childrenContainer); + } else { + this.template(data, option); + } + + Utils.StoreData(option, 'data', data); + + return option; + }; + + Results.prototype.bind = function (container, $container) { + var self = this; + + var id = container.id + '-results'; + + this.$results.attr('id', id); + + container.on('results:all', function (params) { + self.clear(); + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + self.highlightFirstItem(); + } + }); + + container.on('results:append', function (params) { + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + } + }); + + container.on('query', function (params) { + self.hideMessages(); + self.showLoading(params); + }); + + container.on('select', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + + if (self.options.get('scrollAfterSelect')) { + self.highlightFirstItem(); + } + }); + + container.on('unselect', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + + if (self.options.get('scrollAfterSelect')) { + self.highlightFirstItem(); + } + }); + + container.on('open', function () { + // When the dropdown is open, aria-expended="true" + self.$results.attr('aria-expanded', 'true'); + self.$results.attr('aria-hidden', 'false'); + + self.setClasses(); + self.ensureHighlightVisible(); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expended="false" + self.$results.attr('aria-expanded', 'false'); + self.$results.attr('aria-hidden', 'true'); + self.$results.removeAttr('aria-activedescendant'); + }); + + container.on('results:toggle', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + $highlighted.trigger('mouseup'); + }); + + container.on('results:select', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var data = Utils.GetData($highlighted[0], 'data'); + + if ($highlighted.attr('aria-selected') == 'true') { + self.trigger('close', {}); + } else { + self.trigger('select', { + data: data + }); + } + }); + + container.on('results:previous', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + // If we are already at the top, don't move further + // If no options, currentIndex will be -1 + if (currentIndex <= 0) { + return; + } + + var nextIndex = currentIndex - 1; + + // If none are highlighted, highlight the first + if ($highlighted.length === 0) { + nextIndex = 0; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top; + var nextTop = $next.offset().top; + var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextTop - currentOffset < 0) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:next', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + var nextIndex = currentIndex + 1; + + // If we are at the last option, stay there + if (nextIndex >= $options.length) { + return; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top + + self.$results.outerHeight(false); + var nextBottom = $next.offset().top + $next.outerHeight(false); + var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextBottom > currentOffset) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:focus', function (params) { + params.element.addClass('select2-results__option--highlighted'); + }); + + container.on('results:message', function (params) { + self.displayMessage(params); + }); + + if ($.fn.mousewheel) { + this.$results.on('mousewheel', function (e) { + var top = self.$results.scrollTop(); + + var bottom = self.$results.get(0).scrollHeight - top + e.deltaY; + + var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; + var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); + + if (isAtTop) { + self.$results.scrollTop(0); + + e.preventDefault(); + e.stopPropagation(); + } else if (isAtBottom) { + self.$results.scrollTop( + self.$results.get(0).scrollHeight - self.$results.height() + ); + + e.preventDefault(); + e.stopPropagation(); + } + }); + } + + this.$results.on('mouseup', '.select2-results__option[aria-selected]', + function (evt) { + var $this = $(this); + + var data = Utils.GetData(this, 'data'); + + if ($this.attr('aria-selected') === 'true') { + if (self.options.get('multiple')) { + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + } else { + self.trigger('close', {}); + } + + return; + } + + self.trigger('select', { + originalEvent: evt, + data: data + }); + }); + + this.$results.on('mouseenter', '.select2-results__option[aria-selected]', + function (evt) { + var data = Utils.GetData(this, 'data'); + + self.getHighlightedResults() + .removeClass('select2-results__option--highlighted'); + + self.trigger('results:focus', { + data: data, + element: $(this) + }); + }); + }; + + Results.prototype.getHighlightedResults = function () { + var $highlighted = this.$results + .find('.select2-results__option--highlighted'); + + return $highlighted; + }; + + Results.prototype.destroy = function () { + this.$results.remove(); + }; + + Results.prototype.ensureHighlightVisible = function () { + var $highlighted = this.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var $options = this.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + var currentOffset = this.$results.offset().top; + var nextTop = $highlighted.offset().top; + var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); + + var offsetDelta = nextTop - currentOffset; + nextOffset -= $highlighted.outerHeight(false) * 2; + + if (currentIndex <= 2) { + this.$results.scrollTop(0); + } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { + this.$results.scrollTop(nextOffset); + } + }; + + Results.prototype.template = function (result, container) { + var template = this.options.get('templateResult'); + var escapeMarkup = this.options.get('escapeMarkup'); + + var content = template(result, container); + + if (content == null) { + container.style.display = 'none'; + } else if (typeof content === 'string') { + container.innerHTML = escapeMarkup(content); + } else { + $(container).append(content); + } + }; + + return Results; +}); + +S2.define('select2/keys',[ + +], function () { + var KEYS = { + BACKSPACE: 8, + TAB: 9, + ENTER: 13, + SHIFT: 16, + CTRL: 17, + ALT: 18, + ESC: 27, + SPACE: 32, + PAGE_UP: 33, + PAGE_DOWN: 34, + END: 35, + HOME: 36, + LEFT: 37, + UP: 38, + RIGHT: 39, + DOWN: 40, + DELETE: 46 + }; + + return KEYS; +}); + +S2.define('select2/selection/base',[ + 'jquery', + '../utils', + '../keys' +], function ($, Utils, KEYS) { + function BaseSelection ($element, options) { + this.$element = $element; + this.options = options; + + BaseSelection.__super__.constructor.call(this); + } + + Utils.Extend(BaseSelection, Utils.Observable); + + BaseSelection.prototype.render = function () { + var $selection = $( + '' + ); + + this._tabindex = 0; + + if (Utils.GetData(this.$element[0], 'old-tabindex') != null) { + this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex'); + } else if (this.$element.attr('tabindex') != null) { + this._tabindex = this.$element.attr('tabindex'); + } + + $selection.attr('title', this.$element.attr('title')); + $selection.attr('tabindex', this._tabindex); + $selection.attr('aria-disabled', 'false'); + + this.$selection = $selection; + + return $selection; + }; + + BaseSelection.prototype.bind = function (container, $container) { + var self = this; + + var resultsId = container.id + '-results'; + + this.container = container; + + this.$selection.on('focus', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('blur', function (evt) { + self._handleBlur(evt); + }); + + this.$selection.on('keydown', function (evt) { + self.trigger('keypress', evt); + + if (evt.which === KEYS.SPACE) { + evt.preventDefault(); + } + }); + + container.on('results:focus', function (params) { + self.$selection.attr('aria-activedescendant', params.data._resultId); + }); + + container.on('selection:update', function (params) { + self.update(params.data); + }); + + container.on('open', function () { + // When the dropdown is open, aria-expanded="true" + self.$selection.attr('aria-expanded', 'true'); + self.$selection.attr('aria-owns', resultsId); + + self._attachCloseHandler(container); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expanded="false" + self.$selection.attr('aria-expanded', 'false'); + self.$selection.removeAttr('aria-activedescendant'); + self.$selection.removeAttr('aria-owns'); + + self.$selection.trigger('focus'); + + self._detachCloseHandler(container); + }); + + container.on('enable', function () { + self.$selection.attr('tabindex', self._tabindex); + self.$selection.attr('aria-disabled', 'false'); + }); + + container.on('disable', function () { + self.$selection.attr('tabindex', '-1'); + self.$selection.attr('aria-disabled', 'true'); + }); + }; + + BaseSelection.prototype._handleBlur = function (evt) { + var self = this; + + // This needs to be delayed as the active element is the body when the tab + // key is pressed, possibly along with others. + window.setTimeout(function () { + // Don't trigger `blur` if the focus is still in the selection + if ( + (document.activeElement == self.$selection[0]) || + ($.contains(self.$selection[0], document.activeElement)) + ) { + return; + } + + self.trigger('blur', evt); + }, 1); + }; + + BaseSelection.prototype._attachCloseHandler = function (container) { + + $(document.body).on('mousedown.select2.' + container.id, function (e) { + var $target = $(e.target); + + var $select = $target.closest('.select2'); + + var $all = $('.select2.select2-container--open'); + + $all.each(function () { + if (this == $select[0]) { + return; + } + + var $element = Utils.GetData(this, 'element'); + + $element.select2('close'); + }); + }); + }; + + BaseSelection.prototype._detachCloseHandler = function (container) { + $(document.body).off('mousedown.select2.' + container.id); + }; + + BaseSelection.prototype.position = function ($selection, $container) { + var $selectionContainer = $container.find('.selection'); + $selectionContainer.append($selection); + }; + + BaseSelection.prototype.destroy = function () { + this._detachCloseHandler(this.container); + }; + + BaseSelection.prototype.update = function (data) { + throw new Error('The `update` method must be defined in child classes.'); + }; + + /** + * Helper method to abstract the "enabled" (not "disabled") state of this + * object. + * + * @return {true} if the instance is not disabled. + * @return {false} if the instance is disabled. + */ + BaseSelection.prototype.isEnabled = function () { + return !this.isDisabled(); + }; + + /** + * Helper method to abstract the "disabled" state of this object. + * + * @return {true} if the disabled option is true. + * @return {false} if the disabled option is false. + */ + BaseSelection.prototype.isDisabled = function () { + return this.options.get('disabled'); + }; + + return BaseSelection; +}); + +S2.define('select2/selection/single',[ + 'jquery', + './base', + '../utils', + '../keys' +], function ($, BaseSelection, Utils, KEYS) { + function SingleSelection () { + SingleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(SingleSelection, BaseSelection); + + SingleSelection.prototype.render = function () { + var $selection = SingleSelection.__super__.render.call(this); + + $selection.addClass('select2-selection--single'); + + $selection.html( + '' + + '' + + '' + + '' + ); + + return $selection; + }; + + SingleSelection.prototype.bind = function (container, $container) { + var self = this; + + SingleSelection.__super__.bind.apply(this, arguments); + + var id = container.id + '-container'; + + this.$selection.find('.select2-selection__rendered') + .attr('id', id) + .attr('role', 'textbox') + .attr('aria-readonly', 'true'); + this.$selection.attr('aria-labelledby', id); + + this.$selection.on('mousedown', function (evt) { + // Only respond to left clicks + if (evt.which !== 1) { + return; + } + + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on('focus', function (evt) { + // User focuses on the container + }); + + this.$selection.on('blur', function (evt) { + // User exits the container + }); + + container.on('focus', function (evt) { + if (!container.isOpen()) { + self.$selection.trigger('focus'); + } + }); + }; + + SingleSelection.prototype.clear = function () { + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty(); + $rendered.removeAttr('title'); // clear tooltip on empty + }; + + SingleSelection.prototype.display = function (data, container) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data, container)); + }; + + SingleSelection.prototype.selectionContainer = function () { + return $(''); + }; + + SingleSelection.prototype.update = function (data) { + if (data.length === 0) { + this.clear(); + return; + } + + var selection = data[0]; + + var $rendered = this.$selection.find('.select2-selection__rendered'); + var formatted = this.display(selection, $rendered); + + $rendered.empty().append(formatted); + + var title = selection.title || selection.text; + + if (title) { + $rendered.attr('title', title); + } else { + $rendered.removeAttr('title'); + } + }; + + return SingleSelection; +}); + +S2.define('select2/selection/multiple',[ + 'jquery', + './base', + '../utils' +], function ($, BaseSelection, Utils) { + function MultipleSelection ($element, options) { + MultipleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(MultipleSelection, BaseSelection); + + MultipleSelection.prototype.render = function () { + var $selection = MultipleSelection.__super__.render.call(this); + + $selection.addClass('select2-selection--multiple'); + + $selection.html( + '
        ' + ); + + return $selection; + }; + + MultipleSelection.prototype.bind = function (container, $container) { + var self = this; + + MultipleSelection.__super__.bind.apply(this, arguments); + + this.$selection.on('click', function (evt) { + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on( + 'click', + '.select2-selection__choice__remove', + function (evt) { + // Ignore the event if it is disabled + if (self.isDisabled()) { + return; + } + + var $remove = $(this); + var $selection = $remove.parent(); + + var data = Utils.GetData($selection[0], 'data'); + + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + } + ); + }; + + MultipleSelection.prototype.clear = function () { + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty(); + $rendered.removeAttr('title'); + }; + + MultipleSelection.prototype.display = function (data, container) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data, container)); + }; + + MultipleSelection.prototype.selectionContainer = function () { + var $container = $( + '
      • ' + + '' + + '×' + + '' + + '
      • ' + ); + + return $container; + }; + + MultipleSelection.prototype.update = function (data) { + this.clear(); + + if (data.length === 0) { + return; + } + + var $selections = []; + + for (var d = 0; d < data.length; d++) { + var selection = data[d]; + + var $selection = this.selectionContainer(); + var formatted = this.display(selection, $selection); + + $selection.append(formatted); + + var title = selection.title || selection.text; + + if (title) { + $selection.attr('title', title); + } + + Utils.StoreData($selection[0], 'data', selection); + + $selections.push($selection); + } + + var $rendered = this.$selection.find('.select2-selection__rendered'); + + Utils.appendMany($rendered, $selections); + }; + + return MultipleSelection; +}); + +S2.define('select2/selection/placeholder',[ + '../utils' +], function (Utils) { + function Placeholder (decorated, $element, options) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options); + } + + Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { + var $placeholder = this.selectionContainer(); + + $placeholder.html(this.display(placeholder)); + $placeholder.addClass('select2-selection__placeholder') + .removeClass('select2-selection__choice'); + + return $placeholder; + }; + + Placeholder.prototype.update = function (decorated, data) { + var singlePlaceholder = ( + data.length == 1 && data[0].id != this.placeholder.id + ); + var multipleSelections = data.length > 1; + + if (multipleSelections || singlePlaceholder) { + return decorated.call(this, data); + } + + this.clear(); + + var $placeholder = this.createPlaceholder(this.placeholder); + + this.$selection.find('.select2-selection__rendered').append($placeholder); + }; + + return Placeholder; +}); + +S2.define('select2/selection/allowClear',[ + 'jquery', + '../keys', + '../utils' +], function ($, KEYS, Utils) { + function AllowClear () { } + + AllowClear.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + if (this.placeholder == null) { + if (this.options.get('debug') && window.console && console.error) { + console.error( + 'Select2: The `allowClear` option should be used in combination ' + + 'with the `placeholder` option.' + ); + } + } + + this.$selection.on('mousedown', '.select2-selection__clear', + function (evt) { + self._handleClear(evt); + }); + + container.on('keypress', function (evt) { + self._handleKeyboardClear(evt, container); + }); + }; + + AllowClear.prototype._handleClear = function (_, evt) { + // Ignore the event if it is disabled + if (this.isDisabled()) { + return; + } + + var $clear = this.$selection.find('.select2-selection__clear'); + + // Ignore the event if nothing has been selected + if ($clear.length === 0) { + return; + } + + evt.stopPropagation(); + + var data = Utils.GetData($clear[0], 'data'); + + var previousVal = this.$element.val(); + this.$element.val(this.placeholder.id); + + var unselectData = { + data: data + }; + this.trigger('clear', unselectData); + if (unselectData.prevented) { + this.$element.val(previousVal); + return; + } + + for (var d = 0; d < data.length; d++) { + unselectData = { + data: data[d] + }; + + // Trigger the `unselect` event, so people can prevent it from being + // cleared. + this.trigger('unselect', unselectData); + + // If the event was prevented, don't clear it out. + if (unselectData.prevented) { + this.$element.val(previousVal); + return; + } + } + + this.$element.trigger('input').trigger('change'); + + this.trigger('toggle', {}); + }; + + AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { + if (container.isOpen()) { + return; + } + + if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { + this._handleClear(evt); + } + }; + + AllowClear.prototype.update = function (decorated, data) { + decorated.call(this, data); + + if (this.$selection.find('.select2-selection__placeholder').length > 0 || + data.length === 0) { + return; + } + + var removeAll = this.options.get('translations').get('removeAllItems'); + + var $remove = $( + '' + + '×' + + '' + ); + Utils.StoreData($remove[0], 'data', data); + + this.$selection.find('.select2-selection__rendered').prepend($remove); + }; + + return AllowClear; +}); + +S2.define('select2/selection/search',[ + 'jquery', + '../utils', + '../keys' +], function ($, Utils, KEYS) { + function Search (decorated, $element, options) { + decorated.call(this, $element, options); + } + + Search.prototype.render = function (decorated) { + var $search = $( + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + var $rendered = decorated.call(this); + + this._transferTabIndex(); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + var resultsId = container.id + '-results'; + + decorated.call(this, container, $container); + + container.on('open', function () { + self.$search.attr('aria-controls', resultsId); + self.$search.trigger('focus'); + }); + + container.on('close', function () { + self.$search.val(''); + self.$search.removeAttr('aria-controls'); + self.$search.removeAttr('aria-activedescendant'); + self.$search.trigger('focus'); + }); + + container.on('enable', function () { + self.$search.prop('disabled', false); + + self._transferTabIndex(); + }); + + container.on('disable', function () { + self.$search.prop('disabled', true); + }); + + container.on('focus', function (evt) { + self.$search.trigger('focus'); + }); + + container.on('results:focus', function (params) { + if (params.data._resultId) { + self.$search.attr('aria-activedescendant', params.data._resultId); + } else { + self.$search.removeAttr('aria-activedescendant'); + } + }); + + this.$selection.on('focusin', '.select2-search--inline', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('focusout', '.select2-search--inline', function (evt) { + self._handleBlur(evt); + }); + + this.$selection.on('keydown', '.select2-search--inline', function (evt) { + evt.stopPropagation(); + + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + + var key = evt.which; + + if (key === KEYS.BACKSPACE && self.$search.val() === '') { + var $previousChoice = self.$searchContainer + .prev('.select2-selection__choice'); + + if ($previousChoice.length > 0) { + var item = Utils.GetData($previousChoice[0], 'data'); + + self.searchRemoveChoice(item); + + evt.preventDefault(); + } + } + }); + + this.$selection.on('click', '.select2-search--inline', function (evt) { + if (self.$search.val()) { + evt.stopPropagation(); + } + }); + + // Try to detect the IE version should the `documentMode` property that + // is stored on the document. This is only implemented in IE and is + // slightly cleaner than doing a user agent check. + // This property is not available in Edge, but Edge also doesn't have + // this bug. + var msie = document.documentMode; + var disableInputEvents = msie && msie <= 11; + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$selection.on( + 'input.searchcheck', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents) { + self.$selection.off('input.search input.searchcheck'); + return; + } + + // Unbind the duplicated `keyup` event + self.$selection.off('keyup.search'); + } + ); + + this.$selection.on( + 'keyup.search input.search', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents && evt.type === 'input') { + self.$selection.off('input.search input.searchcheck'); + return; + } + + var key = evt.which; + + // We can freely ignore events from modifier keys + if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { + return; + } + + // Tabbing will be handled during the `keydown` phase + if (key == KEYS.TAB) { + return; + } + + self.handleSearch(evt); + } + ); + }; + + /** + * This method will transfer the tabindex attribute from the rendered + * selection to the search box. This allows for the search box to be used as + * the primary focus instead of the selection container. + * + * @private + */ + Search.prototype._transferTabIndex = function (decorated) { + this.$search.attr('tabindex', this.$selection.attr('tabindex')); + this.$selection.attr('tabindex', '-1'); + }; + + Search.prototype.createPlaceholder = function (decorated, placeholder) { + this.$search.attr('placeholder', placeholder.text); + }; + + Search.prototype.update = function (decorated, data) { + var searchHadFocus = this.$search[0] == document.activeElement; + + this.$search.attr('placeholder', ''); + + decorated.call(this, data); + + this.$selection.find('.select2-selection__rendered') + .append(this.$searchContainer); + + this.resizeSearch(); + if (searchHadFocus) { + this.$search.trigger('focus'); + } + }; + + Search.prototype.handleSearch = function () { + this.resizeSearch(); + + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.searchRemoveChoice = function (decorated, item) { + this.trigger('unselect', { + data: item + }); + + this.$search.val(item.text); + this.handleSearch(); + }; + + Search.prototype.resizeSearch = function () { + this.$search.css('width', '25px'); + + var width = ''; + + if (this.$search.attr('placeholder') !== '') { + width = this.$selection.find('.select2-selection__rendered').width(); + } else { + var minimumWidth = this.$search.val().length + 1; + + width = (minimumWidth * 0.75) + 'em'; + } + + this.$search.css('width', width); + }; + + return Search; +}); + +S2.define('select2/selection/eventRelay',[ + 'jquery' +], function ($) { + function EventRelay () { } + + EventRelay.prototype.bind = function (decorated, container, $container) { + var self = this; + var relayEvents = [ + 'open', 'opening', + 'close', 'closing', + 'select', 'selecting', + 'unselect', 'unselecting', + 'clear', 'clearing' + ]; + + var preventableEvents = [ + 'opening', 'closing', 'selecting', 'unselecting', 'clearing' + ]; + + decorated.call(this, container, $container); + + container.on('*', function (name, params) { + // Ignore events that should not be relayed + if ($.inArray(name, relayEvents) === -1) { + return; + } + + // The parameters should always be an object + params = params || {}; + + // Generate the jQuery event for the Select2 event + var evt = $.Event('select2:' + name, { + params: params + }); + + self.$element.trigger(evt); + + // Only handle preventable events if it was one + if ($.inArray(name, preventableEvents) === -1) { + return; + } + + params.prevented = evt.isDefaultPrevented(); + }); + }; + + return EventRelay; +}); + +S2.define('select2/translation',[ + 'jquery', + 'require' +], function ($, require) { + function Translation (dict) { + this.dict = dict || {}; + } + + Translation.prototype.all = function () { + return this.dict; + }; + + Translation.prototype.get = function (key) { + return this.dict[key]; + }; + + Translation.prototype.extend = function (translation) { + this.dict = $.extend({}, translation.all(), this.dict); + }; + + // Static functions + + Translation._cache = {}; + + Translation.loadPath = function (path) { + if (!(path in Translation._cache)) { + var translations = require(path); + + Translation._cache[path] = translations; + } + + return new Translation(Translation._cache[path]); + }; + + return Translation; +}); + +S2.define('select2/diacritics',[ + +], function () { + var diacritics = { + '\u24B6': 'A', + '\uFF21': 'A', + '\u00C0': 'A', + '\u00C1': 'A', + '\u00C2': 'A', + '\u1EA6': 'A', + '\u1EA4': 'A', + '\u1EAA': 'A', + '\u1EA8': 'A', + '\u00C3': 'A', + '\u0100': 'A', + '\u0102': 'A', + '\u1EB0': 'A', + '\u1EAE': 'A', + '\u1EB4': 'A', + '\u1EB2': 'A', + '\u0226': 'A', + '\u01E0': 'A', + '\u00C4': 'A', + '\u01DE': 'A', + '\u1EA2': 'A', + '\u00C5': 'A', + '\u01FA': 'A', + '\u01CD': 'A', + '\u0200': 'A', + '\u0202': 'A', + '\u1EA0': 'A', + '\u1EAC': 'A', + '\u1EB6': 'A', + '\u1E00': 'A', + '\u0104': 'A', + '\u023A': 'A', + '\u2C6F': 'A', + '\uA732': 'AA', + '\u00C6': 'AE', + '\u01FC': 'AE', + '\u01E2': 'AE', + '\uA734': 'AO', + '\uA736': 'AU', + '\uA738': 'AV', + '\uA73A': 'AV', + '\uA73C': 'AY', + '\u24B7': 'B', + '\uFF22': 'B', + '\u1E02': 'B', + '\u1E04': 'B', + '\u1E06': 'B', + '\u0243': 'B', + '\u0182': 'B', + '\u0181': 'B', + '\u24B8': 'C', + '\uFF23': 'C', + '\u0106': 'C', + '\u0108': 'C', + '\u010A': 'C', + '\u010C': 'C', + '\u00C7': 'C', + '\u1E08': 'C', + '\u0187': 'C', + '\u023B': 'C', + '\uA73E': 'C', + '\u24B9': 'D', + '\uFF24': 'D', + '\u1E0A': 'D', + '\u010E': 'D', + '\u1E0C': 'D', + '\u1E10': 'D', + '\u1E12': 'D', + '\u1E0E': 'D', + '\u0110': 'D', + '\u018B': 'D', + '\u018A': 'D', + '\u0189': 'D', + '\uA779': 'D', + '\u01F1': 'DZ', + '\u01C4': 'DZ', + '\u01F2': 'Dz', + '\u01C5': 'Dz', + '\u24BA': 'E', + '\uFF25': 'E', + '\u00C8': 'E', + '\u00C9': 'E', + '\u00CA': 'E', + '\u1EC0': 'E', + '\u1EBE': 'E', + '\u1EC4': 'E', + '\u1EC2': 'E', + '\u1EBC': 'E', + '\u0112': 'E', + '\u1E14': 'E', + '\u1E16': 'E', + '\u0114': 'E', + '\u0116': 'E', + '\u00CB': 'E', + '\u1EBA': 'E', + '\u011A': 'E', + '\u0204': 'E', + '\u0206': 'E', + '\u1EB8': 'E', + '\u1EC6': 'E', + '\u0228': 'E', + '\u1E1C': 'E', + '\u0118': 'E', + '\u1E18': 'E', + '\u1E1A': 'E', + '\u0190': 'E', + '\u018E': 'E', + '\u24BB': 'F', + '\uFF26': 'F', + '\u1E1E': 'F', + '\u0191': 'F', + '\uA77B': 'F', + '\u24BC': 'G', + '\uFF27': 'G', + '\u01F4': 'G', + '\u011C': 'G', + '\u1E20': 'G', + '\u011E': 'G', + '\u0120': 'G', + '\u01E6': 'G', + '\u0122': 'G', + '\u01E4': 'G', + '\u0193': 'G', + '\uA7A0': 'G', + '\uA77D': 'G', + '\uA77E': 'G', + '\u24BD': 'H', + '\uFF28': 'H', + '\u0124': 'H', + '\u1E22': 'H', + '\u1E26': 'H', + '\u021E': 'H', + '\u1E24': 'H', + '\u1E28': 'H', + '\u1E2A': 'H', + '\u0126': 'H', + '\u2C67': 'H', + '\u2C75': 'H', + '\uA78D': 'H', + '\u24BE': 'I', + '\uFF29': 'I', + '\u00CC': 'I', + '\u00CD': 'I', + '\u00CE': 'I', + '\u0128': 'I', + '\u012A': 'I', + '\u012C': 'I', + '\u0130': 'I', + '\u00CF': 'I', + '\u1E2E': 'I', + '\u1EC8': 'I', + '\u01CF': 'I', + '\u0208': 'I', + '\u020A': 'I', + '\u1ECA': 'I', + '\u012E': 'I', + '\u1E2C': 'I', + '\u0197': 'I', + '\u24BF': 'J', + '\uFF2A': 'J', + '\u0134': 'J', + '\u0248': 'J', + '\u24C0': 'K', + '\uFF2B': 'K', + '\u1E30': 'K', + '\u01E8': 'K', + '\u1E32': 'K', + '\u0136': 'K', + '\u1E34': 'K', + '\u0198': 'K', + '\u2C69': 'K', + '\uA740': 'K', + '\uA742': 'K', + '\uA744': 'K', + '\uA7A2': 'K', + '\u24C1': 'L', + '\uFF2C': 'L', + '\u013F': 'L', + '\u0139': 'L', + '\u013D': 'L', + '\u1E36': 'L', + '\u1E38': 'L', + '\u013B': 'L', + '\u1E3C': 'L', + '\u1E3A': 'L', + '\u0141': 'L', + '\u023D': 'L', + '\u2C62': 'L', + '\u2C60': 'L', + '\uA748': 'L', + '\uA746': 'L', + '\uA780': 'L', + '\u01C7': 'LJ', + '\u01C8': 'Lj', + '\u24C2': 'M', + '\uFF2D': 'M', + '\u1E3E': 'M', + '\u1E40': 'M', + '\u1E42': 'M', + '\u2C6E': 'M', + '\u019C': 'M', + '\u24C3': 'N', + '\uFF2E': 'N', + '\u01F8': 'N', + '\u0143': 'N', + '\u00D1': 'N', + '\u1E44': 'N', + '\u0147': 'N', + '\u1E46': 'N', + '\u0145': 'N', + '\u1E4A': 'N', + '\u1E48': 'N', + '\u0220': 'N', + '\u019D': 'N', + '\uA790': 'N', + '\uA7A4': 'N', + '\u01CA': 'NJ', + '\u01CB': 'Nj', + '\u24C4': 'O', + '\uFF2F': 'O', + '\u00D2': 'O', + '\u00D3': 'O', + '\u00D4': 'O', + '\u1ED2': 'O', + '\u1ED0': 'O', + '\u1ED6': 'O', + '\u1ED4': 'O', + '\u00D5': 'O', + '\u1E4C': 'O', + '\u022C': 'O', + '\u1E4E': 'O', + '\u014C': 'O', + '\u1E50': 'O', + '\u1E52': 'O', + '\u014E': 'O', + '\u022E': 'O', + '\u0230': 'O', + '\u00D6': 'O', + '\u022A': 'O', + '\u1ECE': 'O', + '\u0150': 'O', + '\u01D1': 'O', + '\u020C': 'O', + '\u020E': 'O', + '\u01A0': 'O', + '\u1EDC': 'O', + '\u1EDA': 'O', + '\u1EE0': 'O', + '\u1EDE': 'O', + '\u1EE2': 'O', + '\u1ECC': 'O', + '\u1ED8': 'O', + '\u01EA': 'O', + '\u01EC': 'O', + '\u00D8': 'O', + '\u01FE': 'O', + '\u0186': 'O', + '\u019F': 'O', + '\uA74A': 'O', + '\uA74C': 'O', + '\u0152': 'OE', + '\u01A2': 'OI', + '\uA74E': 'OO', + '\u0222': 'OU', + '\u24C5': 'P', + '\uFF30': 'P', + '\u1E54': 'P', + '\u1E56': 'P', + '\u01A4': 'P', + '\u2C63': 'P', + '\uA750': 'P', + '\uA752': 'P', + '\uA754': 'P', + '\u24C6': 'Q', + '\uFF31': 'Q', + '\uA756': 'Q', + '\uA758': 'Q', + '\u024A': 'Q', + '\u24C7': 'R', + '\uFF32': 'R', + '\u0154': 'R', + '\u1E58': 'R', + '\u0158': 'R', + '\u0210': 'R', + '\u0212': 'R', + '\u1E5A': 'R', + '\u1E5C': 'R', + '\u0156': 'R', + '\u1E5E': 'R', + '\u024C': 'R', + '\u2C64': 'R', + '\uA75A': 'R', + '\uA7A6': 'R', + '\uA782': 'R', + '\u24C8': 'S', + '\uFF33': 'S', + '\u1E9E': 'S', + '\u015A': 'S', + '\u1E64': 'S', + '\u015C': 'S', + '\u1E60': 'S', + '\u0160': 'S', + '\u1E66': 'S', + '\u1E62': 'S', + '\u1E68': 'S', + '\u0218': 'S', + '\u015E': 'S', + '\u2C7E': 'S', + '\uA7A8': 'S', + '\uA784': 'S', + '\u24C9': 'T', + '\uFF34': 'T', + '\u1E6A': 'T', + '\u0164': 'T', + '\u1E6C': 'T', + '\u021A': 'T', + '\u0162': 'T', + '\u1E70': 'T', + '\u1E6E': 'T', + '\u0166': 'T', + '\u01AC': 'T', + '\u01AE': 'T', + '\u023E': 'T', + '\uA786': 'T', + '\uA728': 'TZ', + '\u24CA': 'U', + '\uFF35': 'U', + '\u00D9': 'U', + '\u00DA': 'U', + '\u00DB': 'U', + '\u0168': 'U', + '\u1E78': 'U', + '\u016A': 'U', + '\u1E7A': 'U', + '\u016C': 'U', + '\u00DC': 'U', + '\u01DB': 'U', + '\u01D7': 'U', + '\u01D5': 'U', + '\u01D9': 'U', + '\u1EE6': 'U', + '\u016E': 'U', + '\u0170': 'U', + '\u01D3': 'U', + '\u0214': 'U', + '\u0216': 'U', + '\u01AF': 'U', + '\u1EEA': 'U', + '\u1EE8': 'U', + '\u1EEE': 'U', + '\u1EEC': 'U', + '\u1EF0': 'U', + '\u1EE4': 'U', + '\u1E72': 'U', + '\u0172': 'U', + '\u1E76': 'U', + '\u1E74': 'U', + '\u0244': 'U', + '\u24CB': 'V', + '\uFF36': 'V', + '\u1E7C': 'V', + '\u1E7E': 'V', + '\u01B2': 'V', + '\uA75E': 'V', + '\u0245': 'V', + '\uA760': 'VY', + '\u24CC': 'W', + '\uFF37': 'W', + '\u1E80': 'W', + '\u1E82': 'W', + '\u0174': 'W', + '\u1E86': 'W', + '\u1E84': 'W', + '\u1E88': 'W', + '\u2C72': 'W', + '\u24CD': 'X', + '\uFF38': 'X', + '\u1E8A': 'X', + '\u1E8C': 'X', + '\u24CE': 'Y', + '\uFF39': 'Y', + '\u1EF2': 'Y', + '\u00DD': 'Y', + '\u0176': 'Y', + '\u1EF8': 'Y', + '\u0232': 'Y', + '\u1E8E': 'Y', + '\u0178': 'Y', + '\u1EF6': 'Y', + '\u1EF4': 'Y', + '\u01B3': 'Y', + '\u024E': 'Y', + '\u1EFE': 'Y', + '\u24CF': 'Z', + '\uFF3A': 'Z', + '\u0179': 'Z', + '\u1E90': 'Z', + '\u017B': 'Z', + '\u017D': 'Z', + '\u1E92': 'Z', + '\u1E94': 'Z', + '\u01B5': 'Z', + '\u0224': 'Z', + '\u2C7F': 'Z', + '\u2C6B': 'Z', + '\uA762': 'Z', + '\u24D0': 'a', + '\uFF41': 'a', + '\u1E9A': 'a', + '\u00E0': 'a', + '\u00E1': 'a', + '\u00E2': 'a', + '\u1EA7': 'a', + '\u1EA5': 'a', + '\u1EAB': 'a', + '\u1EA9': 'a', + '\u00E3': 'a', + '\u0101': 'a', + '\u0103': 'a', + '\u1EB1': 'a', + '\u1EAF': 'a', + '\u1EB5': 'a', + '\u1EB3': 'a', + '\u0227': 'a', + '\u01E1': 'a', + '\u00E4': 'a', + '\u01DF': 'a', + '\u1EA3': 'a', + '\u00E5': 'a', + '\u01FB': 'a', + '\u01CE': 'a', + '\u0201': 'a', + '\u0203': 'a', + '\u1EA1': 'a', + '\u1EAD': 'a', + '\u1EB7': 'a', + '\u1E01': 'a', + '\u0105': 'a', + '\u2C65': 'a', + '\u0250': 'a', + '\uA733': 'aa', + '\u00E6': 'ae', + '\u01FD': 'ae', + '\u01E3': 'ae', + '\uA735': 'ao', + '\uA737': 'au', + '\uA739': 'av', + '\uA73B': 'av', + '\uA73D': 'ay', + '\u24D1': 'b', + '\uFF42': 'b', + '\u1E03': 'b', + '\u1E05': 'b', + '\u1E07': 'b', + '\u0180': 'b', + '\u0183': 'b', + '\u0253': 'b', + '\u24D2': 'c', + '\uFF43': 'c', + '\u0107': 'c', + '\u0109': 'c', + '\u010B': 'c', + '\u010D': 'c', + '\u00E7': 'c', + '\u1E09': 'c', + '\u0188': 'c', + '\u023C': 'c', + '\uA73F': 'c', + '\u2184': 'c', + '\u24D3': 'd', + '\uFF44': 'd', + '\u1E0B': 'd', + '\u010F': 'd', + '\u1E0D': 'd', + '\u1E11': 'd', + '\u1E13': 'd', + '\u1E0F': 'd', + '\u0111': 'd', + '\u018C': 'd', + '\u0256': 'd', + '\u0257': 'd', + '\uA77A': 'd', + '\u01F3': 'dz', + '\u01C6': 'dz', + '\u24D4': 'e', + '\uFF45': 'e', + '\u00E8': 'e', + '\u00E9': 'e', + '\u00EA': 'e', + '\u1EC1': 'e', + '\u1EBF': 'e', + '\u1EC5': 'e', + '\u1EC3': 'e', + '\u1EBD': 'e', + '\u0113': 'e', + '\u1E15': 'e', + '\u1E17': 'e', + '\u0115': 'e', + '\u0117': 'e', + '\u00EB': 'e', + '\u1EBB': 'e', + '\u011B': 'e', + '\u0205': 'e', + '\u0207': 'e', + '\u1EB9': 'e', + '\u1EC7': 'e', + '\u0229': 'e', + '\u1E1D': 'e', + '\u0119': 'e', + '\u1E19': 'e', + '\u1E1B': 'e', + '\u0247': 'e', + '\u025B': 'e', + '\u01DD': 'e', + '\u24D5': 'f', + '\uFF46': 'f', + '\u1E1F': 'f', + '\u0192': 'f', + '\uA77C': 'f', + '\u24D6': 'g', + '\uFF47': 'g', + '\u01F5': 'g', + '\u011D': 'g', + '\u1E21': 'g', + '\u011F': 'g', + '\u0121': 'g', + '\u01E7': 'g', + '\u0123': 'g', + '\u01E5': 'g', + '\u0260': 'g', + '\uA7A1': 'g', + '\u1D79': 'g', + '\uA77F': 'g', + '\u24D7': 'h', + '\uFF48': 'h', + '\u0125': 'h', + '\u1E23': 'h', + '\u1E27': 'h', + '\u021F': 'h', + '\u1E25': 'h', + '\u1E29': 'h', + '\u1E2B': 'h', + '\u1E96': 'h', + '\u0127': 'h', + '\u2C68': 'h', + '\u2C76': 'h', + '\u0265': 'h', + '\u0195': 'hv', + '\u24D8': 'i', + '\uFF49': 'i', + '\u00EC': 'i', + '\u00ED': 'i', + '\u00EE': 'i', + '\u0129': 'i', + '\u012B': 'i', + '\u012D': 'i', + '\u00EF': 'i', + '\u1E2F': 'i', + '\u1EC9': 'i', + '\u01D0': 'i', + '\u0209': 'i', + '\u020B': 'i', + '\u1ECB': 'i', + '\u012F': 'i', + '\u1E2D': 'i', + '\u0268': 'i', + '\u0131': 'i', + '\u24D9': 'j', + '\uFF4A': 'j', + '\u0135': 'j', + '\u01F0': 'j', + '\u0249': 'j', + '\u24DA': 'k', + '\uFF4B': 'k', + '\u1E31': 'k', + '\u01E9': 'k', + '\u1E33': 'k', + '\u0137': 'k', + '\u1E35': 'k', + '\u0199': 'k', + '\u2C6A': 'k', + '\uA741': 'k', + '\uA743': 'k', + '\uA745': 'k', + '\uA7A3': 'k', + '\u24DB': 'l', + '\uFF4C': 'l', + '\u0140': 'l', + '\u013A': 'l', + '\u013E': 'l', + '\u1E37': 'l', + '\u1E39': 'l', + '\u013C': 'l', + '\u1E3D': 'l', + '\u1E3B': 'l', + '\u017F': 'l', + '\u0142': 'l', + '\u019A': 'l', + '\u026B': 'l', + '\u2C61': 'l', + '\uA749': 'l', + '\uA781': 'l', + '\uA747': 'l', + '\u01C9': 'lj', + '\u24DC': 'm', + '\uFF4D': 'm', + '\u1E3F': 'm', + '\u1E41': 'm', + '\u1E43': 'm', + '\u0271': 'm', + '\u026F': 'm', + '\u24DD': 'n', + '\uFF4E': 'n', + '\u01F9': 'n', + '\u0144': 'n', + '\u00F1': 'n', + '\u1E45': 'n', + '\u0148': 'n', + '\u1E47': 'n', + '\u0146': 'n', + '\u1E4B': 'n', + '\u1E49': 'n', + '\u019E': 'n', + '\u0272': 'n', + '\u0149': 'n', + '\uA791': 'n', + '\uA7A5': 'n', + '\u01CC': 'nj', + '\u24DE': 'o', + '\uFF4F': 'o', + '\u00F2': 'o', + '\u00F3': 'o', + '\u00F4': 'o', + '\u1ED3': 'o', + '\u1ED1': 'o', + '\u1ED7': 'o', + '\u1ED5': 'o', + '\u00F5': 'o', + '\u1E4D': 'o', + '\u022D': 'o', + '\u1E4F': 'o', + '\u014D': 'o', + '\u1E51': 'o', + '\u1E53': 'o', + '\u014F': 'o', + '\u022F': 'o', + '\u0231': 'o', + '\u00F6': 'o', + '\u022B': 'o', + '\u1ECF': 'o', + '\u0151': 'o', + '\u01D2': 'o', + '\u020D': 'o', + '\u020F': 'o', + '\u01A1': 'o', + '\u1EDD': 'o', + '\u1EDB': 'o', + '\u1EE1': 'o', + '\u1EDF': 'o', + '\u1EE3': 'o', + '\u1ECD': 'o', + '\u1ED9': 'o', + '\u01EB': 'o', + '\u01ED': 'o', + '\u00F8': 'o', + '\u01FF': 'o', + '\u0254': 'o', + '\uA74B': 'o', + '\uA74D': 'o', + '\u0275': 'o', + '\u0153': 'oe', + '\u01A3': 'oi', + '\u0223': 'ou', + '\uA74F': 'oo', + '\u24DF': 'p', + '\uFF50': 'p', + '\u1E55': 'p', + '\u1E57': 'p', + '\u01A5': 'p', + '\u1D7D': 'p', + '\uA751': 'p', + '\uA753': 'p', + '\uA755': 'p', + '\u24E0': 'q', + '\uFF51': 'q', + '\u024B': 'q', + '\uA757': 'q', + '\uA759': 'q', + '\u24E1': 'r', + '\uFF52': 'r', + '\u0155': 'r', + '\u1E59': 'r', + '\u0159': 'r', + '\u0211': 'r', + '\u0213': 'r', + '\u1E5B': 'r', + '\u1E5D': 'r', + '\u0157': 'r', + '\u1E5F': 'r', + '\u024D': 'r', + '\u027D': 'r', + '\uA75B': 'r', + '\uA7A7': 'r', + '\uA783': 'r', + '\u24E2': 's', + '\uFF53': 's', + '\u00DF': 's', + '\u015B': 's', + '\u1E65': 's', + '\u015D': 's', + '\u1E61': 's', + '\u0161': 's', + '\u1E67': 's', + '\u1E63': 's', + '\u1E69': 's', + '\u0219': 's', + '\u015F': 's', + '\u023F': 's', + '\uA7A9': 's', + '\uA785': 's', + '\u1E9B': 's', + '\u24E3': 't', + '\uFF54': 't', + '\u1E6B': 't', + '\u1E97': 't', + '\u0165': 't', + '\u1E6D': 't', + '\u021B': 't', + '\u0163': 't', + '\u1E71': 't', + '\u1E6F': 't', + '\u0167': 't', + '\u01AD': 't', + '\u0288': 't', + '\u2C66': 't', + '\uA787': 't', + '\uA729': 'tz', + '\u24E4': 'u', + '\uFF55': 'u', + '\u00F9': 'u', + '\u00FA': 'u', + '\u00FB': 'u', + '\u0169': 'u', + '\u1E79': 'u', + '\u016B': 'u', + '\u1E7B': 'u', + '\u016D': 'u', + '\u00FC': 'u', + '\u01DC': 'u', + '\u01D8': 'u', + '\u01D6': 'u', + '\u01DA': 'u', + '\u1EE7': 'u', + '\u016F': 'u', + '\u0171': 'u', + '\u01D4': 'u', + '\u0215': 'u', + '\u0217': 'u', + '\u01B0': 'u', + '\u1EEB': 'u', + '\u1EE9': 'u', + '\u1EEF': 'u', + '\u1EED': 'u', + '\u1EF1': 'u', + '\u1EE5': 'u', + '\u1E73': 'u', + '\u0173': 'u', + '\u1E77': 'u', + '\u1E75': 'u', + '\u0289': 'u', + '\u24E5': 'v', + '\uFF56': 'v', + '\u1E7D': 'v', + '\u1E7F': 'v', + '\u028B': 'v', + '\uA75F': 'v', + '\u028C': 'v', + '\uA761': 'vy', + '\u24E6': 'w', + '\uFF57': 'w', + '\u1E81': 'w', + '\u1E83': 'w', + '\u0175': 'w', + '\u1E87': 'w', + '\u1E85': 'w', + '\u1E98': 'w', + '\u1E89': 'w', + '\u2C73': 'w', + '\u24E7': 'x', + '\uFF58': 'x', + '\u1E8B': 'x', + '\u1E8D': 'x', + '\u24E8': 'y', + '\uFF59': 'y', + '\u1EF3': 'y', + '\u00FD': 'y', + '\u0177': 'y', + '\u1EF9': 'y', + '\u0233': 'y', + '\u1E8F': 'y', + '\u00FF': 'y', + '\u1EF7': 'y', + '\u1E99': 'y', + '\u1EF5': 'y', + '\u01B4': 'y', + '\u024F': 'y', + '\u1EFF': 'y', + '\u24E9': 'z', + '\uFF5A': 'z', + '\u017A': 'z', + '\u1E91': 'z', + '\u017C': 'z', + '\u017E': 'z', + '\u1E93': 'z', + '\u1E95': 'z', + '\u01B6': 'z', + '\u0225': 'z', + '\u0240': 'z', + '\u2C6C': 'z', + '\uA763': 'z', + '\u0386': '\u0391', + '\u0388': '\u0395', + '\u0389': '\u0397', + '\u038A': '\u0399', + '\u03AA': '\u0399', + '\u038C': '\u039F', + '\u038E': '\u03A5', + '\u03AB': '\u03A5', + '\u038F': '\u03A9', + '\u03AC': '\u03B1', + '\u03AD': '\u03B5', + '\u03AE': '\u03B7', + '\u03AF': '\u03B9', + '\u03CA': '\u03B9', + '\u0390': '\u03B9', + '\u03CC': '\u03BF', + '\u03CD': '\u03C5', + '\u03CB': '\u03C5', + '\u03B0': '\u03C5', + '\u03CE': '\u03C9', + '\u03C2': '\u03C3', + '\u2019': '\'' + }; + + return diacritics; +}); + +S2.define('select2/data/base',[ + '../utils' +], function (Utils) { + function BaseAdapter ($element, options) { + BaseAdapter.__super__.constructor.call(this); + } + + Utils.Extend(BaseAdapter, Utils.Observable); + + BaseAdapter.prototype.current = function (callback) { + throw new Error('The `current` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.query = function (params, callback) { + throw new Error('The `query` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.bind = function (container, $container) { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.destroy = function () { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.generateResultId = function (container, data) { + var id = container.id + '-result-'; + + id += Utils.generateChars(4); + + if (data.id != null) { + id += '-' + data.id.toString(); + } else { + id += '-' + Utils.generateChars(4); + } + return id; + }; + + return BaseAdapter; +}); + +S2.define('select2/data/select',[ + './base', + '../utils', + 'jquery' +], function (BaseAdapter, Utils, $) { + function SelectAdapter ($element, options) { + this.$element = $element; + this.options = options; + + SelectAdapter.__super__.constructor.call(this); + } + + Utils.Extend(SelectAdapter, BaseAdapter); + + SelectAdapter.prototype.current = function (callback) { + var data = []; + var self = this; + + this.$element.find(':selected').each(function () { + var $option = $(this); + + var option = self.item($option); + + data.push(option); + }); + + callback(data); + }; + + SelectAdapter.prototype.select = function (data) { + var self = this; + + data.selected = true; + + // If data.element is a DOM node, use it instead + if ($(data.element).is('option')) { + data.element.selected = true; + + this.$element.trigger('input').trigger('change'); + + return; + } + + if (this.$element.prop('multiple')) { + this.current(function (currentData) { + var val = []; + + data = [data]; + data.push.apply(data, currentData); + + for (var d = 0; d < data.length; d++) { + var id = data[d].id; + + if ($.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + self.$element.trigger('input').trigger('change'); + }); + } else { + var val = data.id; + + this.$element.val(val); + this.$element.trigger('input').trigger('change'); + } + }; + + SelectAdapter.prototype.unselect = function (data) { + var self = this; + + if (!this.$element.prop('multiple')) { + return; + } + + data.selected = false; + + if ($(data.element).is('option')) { + data.element.selected = false; + + this.$element.trigger('input').trigger('change'); + + return; + } + + this.current(function (currentData) { + var val = []; + + for (var d = 0; d < currentData.length; d++) { + var id = currentData[d].id; + + if (id !== data.id && $.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + + self.$element.trigger('input').trigger('change'); + }); + }; + + SelectAdapter.prototype.bind = function (container, $container) { + var self = this; + + this.container = container; + + container.on('select', function (params) { + self.select(params.data); + }); + + container.on('unselect', function (params) { + self.unselect(params.data); + }); + }; + + SelectAdapter.prototype.destroy = function () { + // Remove anything added to child elements + this.$element.find('*').each(function () { + // Remove any custom data set by Select2 + Utils.RemoveData(this); + }); + }; + + SelectAdapter.prototype.query = function (params, callback) { + var data = []; + var self = this; + + var $options = this.$element.children(); + + $options.each(function () { + var $option = $(this); + + if (!$option.is('option') && !$option.is('optgroup')) { + return; + } + + var option = self.item($option); + + var matches = self.matches(params, option); + + if (matches !== null) { + data.push(matches); + } + }); + + callback({ + results: data + }); + }; + + SelectAdapter.prototype.addOptions = function ($options) { + Utils.appendMany(this.$element, $options); + }; + + SelectAdapter.prototype.option = function (data) { + var option; + + if (data.children) { + option = document.createElement('optgroup'); + option.label = data.text; + } else { + option = document.createElement('option'); + + if (option.textContent !== undefined) { + option.textContent = data.text; + } else { + option.innerText = data.text; + } + } + + if (data.id !== undefined) { + option.value = data.id; + } + + if (data.disabled) { + option.disabled = true; + } + + if (data.selected) { + option.selected = true; + } + + if (data.title) { + option.title = data.title; + } + + var $option = $(option); + + var normalizedData = this._normalizeItem(data); + normalizedData.element = option; + + // Override the option's data with the combined data + Utils.StoreData(option, 'data', normalizedData); + + return $option; + }; + + SelectAdapter.prototype.item = function ($option) { + var data = {}; + + data = Utils.GetData($option[0], 'data'); + + if (data != null) { + return data; + } + + if ($option.is('option')) { + data = { + id: $option.val(), + text: $option.text(), + disabled: $option.prop('disabled'), + selected: $option.prop('selected'), + title: $option.prop('title') + }; + } else if ($option.is('optgroup')) { + data = { + text: $option.prop('label'), + children: [], + title: $option.prop('title') + }; + + var $children = $option.children('option'); + var children = []; + + for (var c = 0; c < $children.length; c++) { + var $child = $($children[c]); + + var child = this.item($child); + + children.push(child); + } + + data.children = children; + } + + data = this._normalizeItem(data); + data.element = $option[0]; + + Utils.StoreData($option[0], 'data', data); + + return data; + }; + + SelectAdapter.prototype._normalizeItem = function (item) { + if (item !== Object(item)) { + item = { + id: item, + text: item + }; + } + + item = $.extend({}, { + text: '' + }, item); + + var defaults = { + selected: false, + disabled: false + }; + + if (item.id != null) { + item.id = item.id.toString(); + } + + if (item.text != null) { + item.text = item.text.toString(); + } + + if (item._resultId == null && item.id && this.container != null) { + item._resultId = this.generateResultId(this.container, item); + } + + return $.extend({}, defaults, item); + }; + + SelectAdapter.prototype.matches = function (params, data) { + var matcher = this.options.get('matcher'); + + return matcher(params, data); + }; + + return SelectAdapter; +}); + +S2.define('select2/data/array',[ + './select', + '../utils', + 'jquery' +], function (SelectAdapter, Utils, $) { + function ArrayAdapter ($element, options) { + this._dataToConvert = options.get('data') || []; + + ArrayAdapter.__super__.constructor.call(this, $element, options); + } + + Utils.Extend(ArrayAdapter, SelectAdapter); + + ArrayAdapter.prototype.bind = function (container, $container) { + ArrayAdapter.__super__.bind.call(this, container, $container); + + this.addOptions(this.convertToOptions(this._dataToConvert)); + }; + + ArrayAdapter.prototype.select = function (data) { + var $option = this.$element.find('option').filter(function (i, elm) { + return elm.value == data.id.toString(); + }); + + if ($option.length === 0) { + $option = this.option(data); + + this.addOptions($option); + } + + ArrayAdapter.__super__.select.call(this, data); + }; + + ArrayAdapter.prototype.convertToOptions = function (data) { + var self = this; + + var $existing = this.$element.find('option'); + var existingIds = $existing.map(function () { + return self.item($(this)).id; + }).get(); + + var $options = []; + + // Filter out all items except for the one passed in the argument + function onlyItem (item) { + return function () { + return $(this).val() == item.id; + }; + } + + for (var d = 0; d < data.length; d++) { + var item = this._normalizeItem(data[d]); + + // Skip items which were pre-loaded, only merge the data + if ($.inArray(item.id, existingIds) >= 0) { + var $existingOption = $existing.filter(onlyItem(item)); + + var existingData = this.item($existingOption); + var newData = $.extend(true, {}, item, existingData); + + var $newOption = this.option(newData); + + $existingOption.replaceWith($newOption); + + continue; + } + + var $option = this.option(item); + + if (item.children) { + var $children = this.convertToOptions(item.children); + + Utils.appendMany($option, $children); + } + + $options.push($option); + } + + return $options; + }; + + return ArrayAdapter; +}); + +S2.define('select2/data/ajax',[ + './array', + '../utils', + 'jquery' +], function (ArrayAdapter, Utils, $) { + function AjaxAdapter ($element, options) { + this.ajaxOptions = this._applyDefaults(options.get('ajax')); + + if (this.ajaxOptions.processResults != null) { + this.processResults = this.ajaxOptions.processResults; + } + + AjaxAdapter.__super__.constructor.call(this, $element, options); + } + + Utils.Extend(AjaxAdapter, ArrayAdapter); + + AjaxAdapter.prototype._applyDefaults = function (options) { + var defaults = { + data: function (params) { + return $.extend({}, params, { + q: params.term + }); + }, + transport: function (params, success, failure) { + var $request = $.ajax(params); + + $request.then(success); + $request.fail(failure); + + return $request; + } + }; + + return $.extend({}, defaults, options, true); + }; + + AjaxAdapter.prototype.processResults = function (results) { + return results; + }; + + AjaxAdapter.prototype.query = function (params, callback) { + var matches = []; + var self = this; + + if (this._request != null) { + // JSONP requests cannot always be aborted + if ($.isFunction(this._request.abort)) { + this._request.abort(); + } + + this._request = null; + } + + var options = $.extend({ + type: 'GET' + }, this.ajaxOptions); + + if (typeof options.url === 'function') { + options.url = options.url.call(this.$element, params); + } + + if (typeof options.data === 'function') { + options.data = options.data.call(this.$element, params); + } + + function request () { + var $request = options.transport(options, function (data) { + var results = self.processResults(data, params); + + if (self.options.get('debug') && window.console && console.error) { + // Check to make sure that the response included a `results` key. + if (!results || !results.results || !$.isArray(results.results)) { + console.error( + 'Select2: The AJAX results did not return an array in the ' + + '`results` key of the response.' + ); + } + } + + callback(results); + }, function () { + // Attempt to detect if a request was aborted + // Only works if the transport exposes a status property + if ('status' in $request && + ($request.status === 0 || $request.status === '0')) { + return; + } + + self.trigger('results:message', { + message: 'errorLoading' + }); + }); + + self._request = $request; + } + + if (this.ajaxOptions.delay && params.term != null) { + if (this._queryTimeout) { + window.clearTimeout(this._queryTimeout); + } + + this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); + } else { + request(); + } + }; + + return AjaxAdapter; +}); + +S2.define('select2/data/tags',[ + 'jquery' +], function ($) { + function Tags (decorated, $element, options) { + var tags = options.get('tags'); + + var createTag = options.get('createTag'); + + if (createTag !== undefined) { + this.createTag = createTag; + } + + var insertTag = options.get('insertTag'); + + if (insertTag !== undefined) { + this.insertTag = insertTag; + } + + decorated.call(this, $element, options); + + if ($.isArray(tags)) { + for (var t = 0; t < tags.length; t++) { + var tag = tags[t]; + var item = this._normalizeItem(tag); + + var $option = this.option(item); + + this.$element.append($option); + } + } + } + + Tags.prototype.query = function (decorated, params, callback) { + var self = this; + + this._removeOldTags(); + + if (params.term == null || params.page != null) { + decorated.call(this, params, callback); + return; + } + + function wrapper (obj, child) { + var data = obj.results; + + for (var i = 0; i < data.length; i++) { + var option = data[i]; + + var checkChildren = ( + option.children != null && + !wrapper({ + results: option.children + }, true) + ); + + var optionText = (option.text || '').toUpperCase(); + var paramsTerm = (params.term || '').toUpperCase(); + + var checkText = optionText === paramsTerm; + + if (checkText || checkChildren) { + if (child) { + return false; + } + + obj.data = data; + callback(obj); + + return; + } + } + + if (child) { + return true; + } + + var tag = self.createTag(params); + + if (tag != null) { + var $option = self.option(tag); + $option.attr('data-select2-tag', true); + + self.addOptions([$option]); + + self.insertTag(data, tag); + } + + obj.results = data; + + callback(obj); + } + + decorated.call(this, params, wrapper); + }; + + Tags.prototype.createTag = function (decorated, params) { + var term = $.trim(params.term); + + if (term === '') { + return null; + } + + return { + id: term, + text: term + }; + }; + + Tags.prototype.insertTag = function (_, data, tag) { + data.unshift(tag); + }; + + Tags.prototype._removeOldTags = function (_) { + var $options = this.$element.find('option[data-select2-tag]'); + + $options.each(function () { + if (this.selected) { + return; + } + + $(this).remove(); + }); + }; + + return Tags; +}); + +S2.define('select2/data/tokenizer',[ + 'jquery' +], function ($) { + function Tokenizer (decorated, $element, options) { + var tokenizer = options.get('tokenizer'); + + if (tokenizer !== undefined) { + this.tokenizer = tokenizer; + } + + decorated.call(this, $element, options); + } + + Tokenizer.prototype.bind = function (decorated, container, $container) { + decorated.call(this, container, $container); + + this.$search = container.dropdown.$search || container.selection.$search || + $container.find('.select2-search__field'); + }; + + Tokenizer.prototype.query = function (decorated, params, callback) { + var self = this; + + function createAndSelect (data) { + // Normalize the data object so we can use it for checks + var item = self._normalizeItem(data); + + // Check if the data object already exists as a tag + // Select it if it doesn't + var $existingOptions = self.$element.find('option').filter(function () { + return $(this).val() === item.id; + }); + + // If an existing option wasn't found for it, create the option + if (!$existingOptions.length) { + var $option = self.option(item); + $option.attr('data-select2-tag', true); + + self._removeOldTags(); + self.addOptions([$option]); + } + + // Select the item, now that we know there is an option for it + select(item); + } + + function select (data) { + self.trigger('select', { + data: data + }); + } + + params.term = params.term || ''; + + var tokenData = this.tokenizer(params, this.options, createAndSelect); + + if (tokenData.term !== params.term) { + // Replace the search term if we have the search box + if (this.$search.length) { + this.$search.val(tokenData.term); + this.$search.trigger('focus'); + } + + params.term = tokenData.term; + } + + decorated.call(this, params, callback); + }; + + Tokenizer.prototype.tokenizer = function (_, params, options, callback) { + var separators = options.get('tokenSeparators') || []; + var term = params.term; + var i = 0; + + var createTag = this.createTag || function (params) { + return { + id: params.term, + text: params.term + }; + }; + + while (i < term.length) { + var termChar = term[i]; + + if ($.inArray(termChar, separators) === -1) { + i++; + + continue; + } + + var part = term.substr(0, i); + var partParams = $.extend({}, params, { + term: part + }); + + var data = createTag(partParams); + + if (data == null) { + i++; + continue; + } + + callback(data); + + // Reset the term to not include the tokenized portion + term = term.substr(i + 1) || ''; + i = 0; + } + + return { + term: term + }; + }; + + return Tokenizer; +}); + +S2.define('select2/data/minimumInputLength',[ + +], function () { + function MinimumInputLength (decorated, $e, options) { + this.minimumInputLength = options.get('minimumInputLength'); + + decorated.call(this, $e, options); + } + + MinimumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (params.term.length < this.minimumInputLength) { + this.trigger('results:message', { + message: 'inputTooShort', + args: { + minimum: this.minimumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MinimumInputLength; +}); + +S2.define('select2/data/maximumInputLength',[ + +], function () { + function MaximumInputLength (decorated, $e, options) { + this.maximumInputLength = options.get('maximumInputLength'); + + decorated.call(this, $e, options); + } + + MaximumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (this.maximumInputLength > 0 && + params.term.length > this.maximumInputLength) { + this.trigger('results:message', { + message: 'inputTooLong', + args: { + maximum: this.maximumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MaximumInputLength; +}); + +S2.define('select2/data/maximumSelectionLength',[ + +], function (){ + function MaximumSelectionLength (decorated, $e, options) { + this.maximumSelectionLength = options.get('maximumSelectionLength'); + + decorated.call(this, $e, options); + } + + MaximumSelectionLength.prototype.bind = + function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function () { + self._checkIfMaximumSelected(); + }); + }; + + MaximumSelectionLength.prototype.query = + function (decorated, params, callback) { + var self = this; + + this._checkIfMaximumSelected(function () { + decorated.call(self, params, callback); + }); + }; + + MaximumSelectionLength.prototype._checkIfMaximumSelected = + function (_, successCallback) { + var self = this; + + this.current(function (currentData) { + var count = currentData != null ? currentData.length : 0; + if (self.maximumSelectionLength > 0 && + count >= self.maximumSelectionLength) { + self.trigger('results:message', { + message: 'maximumSelected', + args: { + maximum: self.maximumSelectionLength + } + }); + return; + } + + if (successCallback) { + successCallback(); + } + }); + }; + + return MaximumSelectionLength; +}); + +S2.define('select2/dropdown',[ + 'jquery', + './utils' +], function ($, Utils) { + function Dropdown ($element, options) { + this.$element = $element; + this.options = options; + + Dropdown.__super__.constructor.call(this); + } + + Utils.Extend(Dropdown, Utils.Observable); + + Dropdown.prototype.render = function () { + var $dropdown = $( + '' + + '' + + '' + ); + + $dropdown.attr('dir', this.options.get('dir')); + + this.$dropdown = $dropdown; + + return $dropdown; + }; + + Dropdown.prototype.bind = function () { + // Should be implemented in subclasses + }; + + Dropdown.prototype.position = function ($dropdown, $container) { + // Should be implemented in subclasses + }; + + Dropdown.prototype.destroy = function () { + // Remove the dropdown from the DOM + this.$dropdown.remove(); + }; + + return Dropdown; +}); + +S2.define('select2/dropdown/search',[ + 'jquery', + '../utils' +], function ($, Utils) { + function Search () { } + + Search.prototype.render = function (decorated) { + var $rendered = decorated.call(this); + + var $search = $( + '' + + '' + + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + $rendered.prepend($search); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + var resultsId = container.id + '-results'; + + decorated.call(this, container, $container); + + this.$search.on('keydown', function (evt) { + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + }); + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$search.on('input', function (evt) { + // Unbind the duplicated `keyup` event + $(this).off('keyup'); + }); + + this.$search.on('keyup input', function (evt) { + self.handleSearch(evt); + }); + + container.on('open', function () { + self.$search.attr('tabindex', 0); + self.$search.attr('aria-controls', resultsId); + + self.$search.trigger('focus'); + + window.setTimeout(function () { + self.$search.trigger('focus'); + }, 0); + }); + + container.on('close', function () { + self.$search.attr('tabindex', -1); + self.$search.removeAttr('aria-controls'); + self.$search.removeAttr('aria-activedescendant'); + + self.$search.val(''); + self.$search.trigger('blur'); + }); + + container.on('focus', function () { + if (!container.isOpen()) { + self.$search.trigger('focus'); + } + }); + + container.on('results:all', function (params) { + if (params.query.term == null || params.query.term === '') { + var showSearch = self.showSearch(params); + + if (showSearch) { + self.$searchContainer.removeClass('select2-search--hide'); + } else { + self.$searchContainer.addClass('select2-search--hide'); + } + } + }); + + container.on('results:focus', function (params) { + if (params.data._resultId) { + self.$search.attr('aria-activedescendant', params.data._resultId); + } else { + self.$search.removeAttr('aria-activedescendant'); + } + }); + }; + + Search.prototype.handleSearch = function (evt) { + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.showSearch = function (_, params) { + return true; + }; + + return Search; +}); + +S2.define('select2/dropdown/hidePlaceholder',[ + +], function () { + function HidePlaceholder (decorated, $element, options, dataAdapter) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options, dataAdapter); + } + + HidePlaceholder.prototype.append = function (decorated, data) { + data.results = this.removePlaceholder(data.results); + + decorated.call(this, data); + }; + + HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + HidePlaceholder.prototype.removePlaceholder = function (_, data) { + var modifiedData = data.slice(0); + + for (var d = data.length - 1; d >= 0; d--) { + var item = data[d]; + + if (this.placeholder.id === item.id) { + modifiedData.splice(d, 1); + } + } + + return modifiedData; + }; + + return HidePlaceholder; +}); + +S2.define('select2/dropdown/infiniteScroll',[ + 'jquery' +], function ($) { + function InfiniteScroll (decorated, $element, options, dataAdapter) { + this.lastParams = {}; + + decorated.call(this, $element, options, dataAdapter); + + this.$loadingMore = this.createLoadingMore(); + this.loading = false; + } + + InfiniteScroll.prototype.append = function (decorated, data) { + this.$loadingMore.remove(); + this.loading = false; + + decorated.call(this, data); + + if (this.showLoadingMore(data)) { + this.$results.append(this.$loadingMore); + this.loadMoreIfNeeded(); + } + }; + + InfiniteScroll.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('query', function (params) { + self.lastParams = params; + self.loading = true; + }); + + container.on('query:append', function (params) { + self.lastParams = params; + self.loading = true; + }); + + this.$results.on('scroll', this.loadMoreIfNeeded.bind(this)); + }; + + InfiniteScroll.prototype.loadMoreIfNeeded = function () { + var isLoadMoreVisible = $.contains( + document.documentElement, + this.$loadingMore[0] + ); + + if (this.loading || !isLoadMoreVisible) { + return; + } + + var currentOffset = this.$results.offset().top + + this.$results.outerHeight(false); + var loadingMoreOffset = this.$loadingMore.offset().top + + this.$loadingMore.outerHeight(false); + + if (currentOffset + 50 >= loadingMoreOffset) { + this.loadMore(); + } + }; + + InfiniteScroll.prototype.loadMore = function () { + this.loading = true; + + var params = $.extend({}, {page: 1}, this.lastParams); + + params.page++; + + this.trigger('query:append', params); + }; + + InfiniteScroll.prototype.showLoadingMore = function (_, data) { + return data.pagination && data.pagination.more; + }; + + InfiniteScroll.prototype.createLoadingMore = function () { + var $option = $( + '
      • ' + ); + + var message = this.options.get('translations').get('loadingMore'); + + $option.html(message(this.lastParams)); + + return $option; + }; + + return InfiniteScroll; +}); + +S2.define('select2/dropdown/attachBody',[ + 'jquery', + '../utils' +], function ($, Utils) { + function AttachBody (decorated, $element, options) { + this.$dropdownParent = $(options.get('dropdownParent') || document.body); + + decorated.call(this, $element, options); + } + + AttachBody.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('open', function () { + self._showDropdown(); + self._attachPositioningHandler(container); + + // Must bind after the results handlers to ensure correct sizing + self._bindContainerResultHandlers(container); + }); + + container.on('close', function () { + self._hideDropdown(); + self._detachPositioningHandler(container); + }); + + this.$dropdownContainer.on('mousedown', function (evt) { + evt.stopPropagation(); + }); + }; + + AttachBody.prototype.destroy = function (decorated) { + decorated.call(this); + + this.$dropdownContainer.remove(); + }; + + AttachBody.prototype.position = function (decorated, $dropdown, $container) { + // Clone all of the container classes + $dropdown.attr('class', $container.attr('class')); + + $dropdown.removeClass('select2'); + $dropdown.addClass('select2-container--open'); + + $dropdown.css({ + position: 'absolute', + top: -999999 + }); + + this.$container = $container; + }; + + AttachBody.prototype.render = function (decorated) { + var $container = $(''); + + var $dropdown = decorated.call(this); + $container.append($dropdown); + + this.$dropdownContainer = $container; + + return $container; + }; + + AttachBody.prototype._hideDropdown = function (decorated) { + this.$dropdownContainer.detach(); + }; + + AttachBody.prototype._bindContainerResultHandlers = + function (decorated, container) { + + // These should only be bound once + if (this._containerResultsHandlersBound) { + return; + } + + var self = this; + + container.on('results:all', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:append', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:message', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('select', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('unselect', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + this._containerResultsHandlersBound = true; + }; + + AttachBody.prototype._attachPositioningHandler = + function (decorated, container) { + var self = this; + + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.each(function () { + Utils.StoreData(this, 'select2-scroll-position', { + x: $(this).scrollLeft(), + y: $(this).scrollTop() + }); + }); + + $watchers.on(scrollEvent, function (ev) { + var position = Utils.GetData(this, 'select2-scroll-position'); + $(this).scrollTop(position.y); + }); + + $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, + function (e) { + self._positionDropdown(); + self._resizeDropdown(); + }); + }; + + AttachBody.prototype._detachPositioningHandler = + function (decorated, container) { + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.off(scrollEvent); + + $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); + }; + + AttachBody.prototype._positionDropdown = function () { + var $window = $(window); + + var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); + var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); + + var newDirection = null; + + var offset = this.$container.offset(); + + offset.bottom = offset.top + this.$container.outerHeight(false); + + var container = { + height: this.$container.outerHeight(false) + }; + + container.top = offset.top; + container.bottom = offset.top + container.height; + + var dropdown = { + height: this.$dropdown.outerHeight(false) + }; + + var viewport = { + top: $window.scrollTop(), + bottom: $window.scrollTop() + $window.height() + }; + + var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); + var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); + + var css = { + left: offset.left, + top: container.bottom + }; + + // Determine what the parent element is to use for calculating the offset + var $offsetParent = this.$dropdownParent; + + // For statically positioned elements, we need to get the element + // that is determining the offset + if ($offsetParent.css('position') === 'static') { + $offsetParent = $offsetParent.offsetParent(); + } + + var parentOffset = { + top: 0, + left: 0 + }; + + if ( + $.contains(document.body, $offsetParent[0]) || + $offsetParent[0].isConnected + ) { + parentOffset = $offsetParent.offset(); + } + + css.top -= parentOffset.top; + css.left -= parentOffset.left; + + if (!isCurrentlyAbove && !isCurrentlyBelow) { + newDirection = 'below'; + } + + if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { + newDirection = 'above'; + } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { + newDirection = 'below'; + } + + if (newDirection == 'above' || + (isCurrentlyAbove && newDirection !== 'below')) { + css.top = container.top - parentOffset.top - dropdown.height; + } + + if (newDirection != null) { + this.$dropdown + .removeClass('select2-dropdown--below select2-dropdown--above') + .addClass('select2-dropdown--' + newDirection); + this.$container + .removeClass('select2-container--below select2-container--above') + .addClass('select2-container--' + newDirection); + } + + this.$dropdownContainer.css(css); + }; + + AttachBody.prototype._resizeDropdown = function () { + var css = { + width: this.$container.outerWidth(false) + 'px' + }; + + if (this.options.get('dropdownAutoWidth')) { + css.minWidth = css.width; + css.position = 'relative'; + css.width = 'auto'; + } + + this.$dropdown.css(css); + }; + + AttachBody.prototype._showDropdown = function (decorated) { + this.$dropdownContainer.appendTo(this.$dropdownParent); + + this._positionDropdown(); + this._resizeDropdown(); + }; + + return AttachBody; +}); + +S2.define('select2/dropdown/minimumResultsForSearch',[ + +], function () { + function countResults (data) { + var count = 0; + + for (var d = 0; d < data.length; d++) { + var item = data[d]; + + if (item.children) { + count += countResults(item.children); + } else { + count++; + } + } + + return count; + } + + function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { + this.minimumResultsForSearch = options.get('minimumResultsForSearch'); + + if (this.minimumResultsForSearch < 0) { + this.minimumResultsForSearch = Infinity; + } + + decorated.call(this, $element, options, dataAdapter); + } + + MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { + if (countResults(params.data.results) < this.minimumResultsForSearch) { + return false; + } + + return decorated.call(this, params); + }; + + return MinimumResultsForSearch; +}); + +S2.define('select2/dropdown/selectOnClose',[ + '../utils' +], function (Utils) { + function SelectOnClose () { } + + SelectOnClose.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('close', function (params) { + self._handleSelectOnClose(params); + }); + }; + + SelectOnClose.prototype._handleSelectOnClose = function (_, params) { + if (params && params.originalSelect2Event != null) { + var event = params.originalSelect2Event; + + // Don't select an item if the close event was triggered from a select or + // unselect event + if (event._type === 'select' || event._type === 'unselect') { + return; + } + } + + var $highlightedResults = this.getHighlightedResults(); + + // Only select highlighted results + if ($highlightedResults.length < 1) { + return; + } + + var data = Utils.GetData($highlightedResults[0], 'data'); + + // Don't re-select already selected resulte + if ( + (data.element != null && data.element.selected) || + (data.element == null && data.selected) + ) { + return; + } + + this.trigger('select', { + data: data + }); + }; + + return SelectOnClose; +}); + +S2.define('select2/dropdown/closeOnSelect',[ + +], function () { + function CloseOnSelect () { } + + CloseOnSelect.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function (evt) { + self._selectTriggered(evt); + }); + + container.on('unselect', function (evt) { + self._selectTriggered(evt); + }); + }; + + CloseOnSelect.prototype._selectTriggered = function (_, evt) { + var originalEvent = evt.originalEvent; + + // Don't close if the control key is being held + if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) { + return; + } + + this.trigger('close', { + originalEvent: originalEvent, + originalSelect2Event: evt + }); + }; + + return CloseOnSelect; +}); + +S2.define('select2/i18n/en',[],function () { + // English + return { + errorLoading: function () { + return 'The results could not be loaded.'; + }, + inputTooLong: function (args) { + var overChars = args.input.length - args.maximum; + + var message = 'Please delete ' + overChars + ' character'; + + if (overChars != 1) { + message += 's'; + } + + return message; + }, + inputTooShort: function (args) { + var remainingChars = args.minimum - args.input.length; + + var message = 'Please enter ' + remainingChars + ' or more characters'; + + return message; + }, + loadingMore: function () { + return 'Loading more results…'; + }, + maximumSelected: function (args) { + var message = 'You can only select ' + args.maximum + ' item'; + + if (args.maximum != 1) { + message += 's'; + } + + return message; + }, + noResults: function () { + return 'No results found'; + }, + searching: function () { + return 'Searching…'; + }, + removeAllItems: function () { + return 'Remove all items'; + } + }; +}); + +S2.define('select2/defaults',[ + 'jquery', + 'require', + + './results', + + './selection/single', + './selection/multiple', + './selection/placeholder', + './selection/allowClear', + './selection/search', + './selection/eventRelay', + + './utils', + './translation', + './diacritics', + + './data/select', + './data/array', + './data/ajax', + './data/tags', + './data/tokenizer', + './data/minimumInputLength', + './data/maximumInputLength', + './data/maximumSelectionLength', + + './dropdown', + './dropdown/search', + './dropdown/hidePlaceholder', + './dropdown/infiniteScroll', + './dropdown/attachBody', + './dropdown/minimumResultsForSearch', + './dropdown/selectOnClose', + './dropdown/closeOnSelect', + + './i18n/en' +], function ($, require, + + ResultsList, + + SingleSelection, MultipleSelection, Placeholder, AllowClear, + SelectionSearch, EventRelay, + + Utils, Translation, DIACRITICS, + + SelectData, ArrayData, AjaxData, Tags, Tokenizer, + MinimumInputLength, MaximumInputLength, MaximumSelectionLength, + + Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, + AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, + + EnglishTranslation) { + function Defaults () { + this.reset(); + } + + Defaults.prototype.apply = function (options) { + options = $.extend(true, {}, this.defaults, options); + + if (options.dataAdapter == null) { + if (options.ajax != null) { + options.dataAdapter = AjaxData; + } else if (options.data != null) { + options.dataAdapter = ArrayData; + } else { + options.dataAdapter = SelectData; + } + + if (options.minimumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MinimumInputLength + ); + } + + if (options.maximumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumInputLength + ); + } + + if (options.maximumSelectionLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumSelectionLength + ); + } + + if (options.tags) { + options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); + } + + if (options.tokenSeparators != null || options.tokenizer != null) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Tokenizer + ); + } + + if (options.query != null) { + var Query = require(options.amdBase + 'compat/query'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Query + ); + } + + if (options.initSelection != null) { + var InitSelection = require(options.amdBase + 'compat/initSelection'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + InitSelection + ); + } + } + + if (options.resultsAdapter == null) { + options.resultsAdapter = ResultsList; + + if (options.ajax != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + InfiniteScroll + ); + } + + if (options.placeholder != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + HidePlaceholder + ); + } + + if (options.selectOnClose) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + SelectOnClose + ); + } + } + + if (options.dropdownAdapter == null) { + if (options.multiple) { + options.dropdownAdapter = Dropdown; + } else { + var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); + + options.dropdownAdapter = SearchableDropdown; + } + + if (options.minimumResultsForSearch !== 0) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + MinimumResultsForSearch + ); + } + + if (options.closeOnSelect) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + CloseOnSelect + ); + } + + if ( + options.dropdownCssClass != null || + options.dropdownCss != null || + options.adaptDropdownCssClass != null + ) { + var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + DropdownCSS + ); + } + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + AttachBody + ); + } + + if (options.selectionAdapter == null) { + if (options.multiple) { + options.selectionAdapter = MultipleSelection; + } else { + options.selectionAdapter = SingleSelection; + } + + // Add the placeholder mixin if a placeholder was specified + if (options.placeholder != null) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + Placeholder + ); + } + + if (options.allowClear) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + AllowClear + ); + } + + if (options.multiple) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + SelectionSearch + ); + } + + if ( + options.containerCssClass != null || + options.containerCss != null || + options.adaptContainerCssClass != null + ) { + var ContainerCSS = require(options.amdBase + 'compat/containerCss'); + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + ContainerCSS + ); + } + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + EventRelay + ); + } + + // If the defaults were not previously applied from an element, it is + // possible for the language option to have not been resolved + options.language = this._resolveLanguage(options.language); + + // Always fall back to English since it will always be complete + options.language.push('en'); + + var uniqueLanguages = []; + + for (var l = 0; l < options.language.length; l++) { + var language = options.language[l]; + + if (uniqueLanguages.indexOf(language) === -1) { + uniqueLanguages.push(language); + } + } + + options.language = uniqueLanguages; + + options.translations = this._processTranslations( + options.language, + options.debug + ); + + return options; + }; + + Defaults.prototype.reset = function () { + function stripDiacritics (text) { + // Used 'uni range + named function' from http://jsperf.com/diacritics/18 + function match(a) { + return DIACRITICS[a] || a; + } + + return text.replace(/[^\u0000-\u007E]/g, match); + } + + function matcher (params, data) { + // Always return the object if there is nothing to compare + if ($.trim(params.term) === '') { + return data; + } + + // Do a recursive check for options with children + if (data.children && data.children.length > 0) { + // Clone the data object if there are children + // This is required as we modify the object to remove any non-matches + var match = $.extend(true, {}, data); + + // Check each child of the option + for (var c = data.children.length - 1; c >= 0; c--) { + var child = data.children[c]; + + var matches = matcher(params, child); + + // If there wasn't a match, remove the object in the array + if (matches == null) { + match.children.splice(c, 1); + } + } + + // If any children matched, return the new object + if (match.children.length > 0) { + return match; + } + + // If there were no matching children, check just the plain object + return matcher(params, match); + } + + var original = stripDiacritics(data.text).toUpperCase(); + var term = stripDiacritics(params.term).toUpperCase(); + + // Check if the text contains the term + if (original.indexOf(term) > -1) { + return data; + } + + // If it doesn't contain the term, don't return anything + return null; + } + + this.defaults = { + amdBase: './', + amdLanguageBase: './i18n/', + closeOnSelect: true, + debug: false, + dropdownAutoWidth: false, + escapeMarkup: Utils.escapeMarkup, + language: {}, + matcher: matcher, + minimumInputLength: 0, + maximumInputLength: 0, + maximumSelectionLength: 0, + minimumResultsForSearch: 0, + selectOnClose: false, + scrollAfterSelect: false, + sorter: function (data) { + return data; + }, + templateResult: function (result) { + return result.text; + }, + templateSelection: function (selection) { + return selection.text; + }, + theme: 'default', + width: 'resolve' + }; + }; + + Defaults.prototype.applyFromElement = function (options, $element) { + var optionLanguage = options.language; + var defaultLanguage = this.defaults.language; + var elementLanguage = $element.prop('lang'); + var parentLanguage = $element.closest('[lang]').prop('lang'); + + var languages = Array.prototype.concat.call( + this._resolveLanguage(elementLanguage), + this._resolveLanguage(optionLanguage), + this._resolveLanguage(defaultLanguage), + this._resolveLanguage(parentLanguage) + ); + + options.language = languages; + + return options; + }; + + Defaults.prototype._resolveLanguage = function (language) { + if (!language) { + return []; + } + + if ($.isEmptyObject(language)) { + return []; + } + + if ($.isPlainObject(language)) { + return [language]; + } + + var languages; + + if (!$.isArray(language)) { + languages = [language]; + } else { + languages = language; + } + + var resolvedLanguages = []; + + for (var l = 0; l < languages.length; l++) { + resolvedLanguages.push(languages[l]); + + if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) { + // Extract the region information if it is included + var languageParts = languages[l].split('-'); + var baseLanguage = languageParts[0]; + + resolvedLanguages.push(baseLanguage); + } + } + + return resolvedLanguages; + }; + + Defaults.prototype._processTranslations = function (languages, debug) { + var translations = new Translation(); + + for (var l = 0; l < languages.length; l++) { + var languageData = new Translation(); + + var language = languages[l]; + + if (typeof language === 'string') { + try { + // Try to load it with the original name + languageData = Translation.loadPath(language); + } catch (e) { + try { + // If we couldn't load it, check if it wasn't the full path + language = this.defaults.amdLanguageBase + language; + languageData = Translation.loadPath(language); + } catch (ex) { + // The translation could not be loaded at all. Sometimes this is + // because of a configuration problem, other times this can be + // because of how Select2 helps load all possible translation files + if (debug && window.console && console.warn) { + console.warn( + 'Select2: The language file for "' + language + '" could ' + + 'not be automatically loaded. A fallback will be used instead.' + ); + } + } + } + } else if ($.isPlainObject(language)) { + languageData = new Translation(language); + } else { + languageData = language; + } + + translations.extend(languageData); + } + + return translations; + }; + + Defaults.prototype.set = function (key, value) { + var camelKey = $.camelCase(key); + + var data = {}; + data[camelKey] = value; + + var convertedData = Utils._convertData(data); + + $.extend(true, this.defaults, convertedData); + }; + + var defaults = new Defaults(); + + return defaults; +}); + +S2.define('select2/options',[ + 'require', + 'jquery', + './defaults', + './utils' +], function (require, $, Defaults, Utils) { + function Options (options, $element) { + this.options = options; + + if ($element != null) { + this.fromElement($element); + } + + if ($element != null) { + this.options = Defaults.applyFromElement(this.options, $element); + } + + this.options = Defaults.apply(this.options); + + if ($element && $element.is('input')) { + var InputCompat = require(this.get('amdBase') + 'compat/inputData'); + + this.options.dataAdapter = Utils.Decorate( + this.options.dataAdapter, + InputCompat + ); + } + } + + Options.prototype.fromElement = function ($e) { + var excludedData = ['select2']; + + if (this.options.multiple == null) { + this.options.multiple = $e.prop('multiple'); + } + + if (this.options.disabled == null) { + this.options.disabled = $e.prop('disabled'); + } + + if (this.options.dir == null) { + if ($e.prop('dir')) { + this.options.dir = $e.prop('dir'); + } else if ($e.closest('[dir]').prop('dir')) { + this.options.dir = $e.closest('[dir]').prop('dir'); + } else { + this.options.dir = 'ltr'; + } + } + + $e.prop('disabled', this.options.disabled); + $e.prop('multiple', this.options.multiple); + + if (Utils.GetData($e[0], 'select2Tags')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-select2-tags` attribute has been changed to ' + + 'use the `data-data` and `data-tags="true"` attributes and will be ' + + 'removed in future versions of Select2.' + ); + } + + Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags')); + Utils.StoreData($e[0], 'tags', true); + } + + if (Utils.GetData($e[0], 'ajaxUrl')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-ajax-url` attribute has been changed to ' + + '`data-ajax--url` and support for the old attribute will be removed' + + ' in future versions of Select2.' + ); + } + + $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl')); + Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl')); + } + + var dataset = {}; + + function upperCaseLetter(_, letter) { + return letter.toUpperCase(); + } + + // Pre-load all of the attributes which are prefixed with `data-` + for (var attr = 0; attr < $e[0].attributes.length; attr++) { + var attributeName = $e[0].attributes[attr].name; + var prefix = 'data-'; + + if (attributeName.substr(0, prefix.length) == prefix) { + // Get the contents of the attribute after `data-` + var dataName = attributeName.substring(prefix.length); + + // Get the data contents from the consistent source + // This is more than likely the jQuery data helper + var dataValue = Utils.GetData($e[0], dataName); + + // camelCase the attribute name to match the spec + var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter); + + // Store the data attribute contents into the dataset since + dataset[camelDataName] = dataValue; + } + } + + // Prefer the element's `dataset` attribute if it exists + // jQuery 1.x does not correctly handle data attributes with multiple dashes + if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { + dataset = $.extend(true, {}, $e[0].dataset, dataset); + } + + // Prefer our internal data cache if it exists + var data = $.extend(true, {}, Utils.GetData($e[0]), dataset); + + data = Utils._convertData(data); + + for (var key in data) { + if ($.inArray(key, excludedData) > -1) { + continue; + } + + if ($.isPlainObject(this.options[key])) { + $.extend(this.options[key], data[key]); + } else { + this.options[key] = data[key]; + } + } + + return this; + }; + + Options.prototype.get = function (key) { + return this.options[key]; + }; + + Options.prototype.set = function (key, val) { + this.options[key] = val; + }; + + return Options; +}); + +S2.define('select2/core',[ + 'jquery', + './options', + './utils', + './keys' +], function ($, Options, Utils, KEYS) { + var Select2 = function ($element, options) { + if (Utils.GetData($element[0], 'select2') != null) { + Utils.GetData($element[0], 'select2').destroy(); + } + + this.$element = $element; + + this.id = this._generateId($element); + + options = options || {}; + + this.options = new Options(options, $element); + + Select2.__super__.constructor.call(this); + + // Set up the tabindex + + var tabindex = $element.attr('tabindex') || 0; + Utils.StoreData($element[0], 'old-tabindex', tabindex); + $element.attr('tabindex', '-1'); + + // Set up containers and adapters + + var DataAdapter = this.options.get('dataAdapter'); + this.dataAdapter = new DataAdapter($element, this.options); + + var $container = this.render(); + + this._placeContainer($container); + + var SelectionAdapter = this.options.get('selectionAdapter'); + this.selection = new SelectionAdapter($element, this.options); + this.$selection = this.selection.render(); + + this.selection.position(this.$selection, $container); + + var DropdownAdapter = this.options.get('dropdownAdapter'); + this.dropdown = new DropdownAdapter($element, this.options); + this.$dropdown = this.dropdown.render(); + + this.dropdown.position(this.$dropdown, $container); + + var ResultsAdapter = this.options.get('resultsAdapter'); + this.results = new ResultsAdapter($element, this.options, this.dataAdapter); + this.$results = this.results.render(); + + this.results.position(this.$results, this.$dropdown); + + // Bind events + + var self = this; + + // Bind the container to all of the adapters + this._bindAdapters(); + + // Register any DOM event handlers + this._registerDomEvents(); + + // Register any internal event handlers + this._registerDataEvents(); + this._registerSelectionEvents(); + this._registerDropdownEvents(); + this._registerResultsEvents(); + this._registerEvents(); + + // Set the initial state + this.dataAdapter.current(function (initialData) { + self.trigger('selection:update', { + data: initialData + }); + }); + + // Hide the original select + $element.addClass('select2-hidden-accessible'); + $element.attr('aria-hidden', 'true'); + + // Synchronize any monitored attributes + this._syncAttributes(); + + Utils.StoreData($element[0], 'select2', this); + + // Ensure backwards compatibility with $element.data('select2'). + $element.data('select2', this); + }; + + Utils.Extend(Select2, Utils.Observable); + + Select2.prototype._generateId = function ($element) { + var id = ''; + + if ($element.attr('id') != null) { + id = $element.attr('id'); + } else if ($element.attr('name') != null) { + id = $element.attr('name') + '-' + Utils.generateChars(2); + } else { + id = Utils.generateChars(4); + } + + id = id.replace(/(:|\.|\[|\]|,)/g, ''); + id = 'select2-' + id; + + return id; + }; + + Select2.prototype._placeContainer = function ($container) { + $container.insertAfter(this.$element); + + var width = this._resolveWidth(this.$element, this.options.get('width')); + + if (width != null) { + $container.css('width', width); + } + }; + + Select2.prototype._resolveWidth = function ($element, method) { + var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; + + if (method == 'resolve') { + var styleWidth = this._resolveWidth($element, 'style'); + + if (styleWidth != null) { + return styleWidth; + } + + return this._resolveWidth($element, 'element'); + } + + if (method == 'element') { + var elementWidth = $element.outerWidth(false); + + if (elementWidth <= 0) { + return 'auto'; + } + + return elementWidth + 'px'; + } + + if (method == 'style') { + var style = $element.attr('style'); + + if (typeof(style) !== 'string') { + return null; + } + + var attrs = style.split(';'); + + for (var i = 0, l = attrs.length; i < l; i = i + 1) { + var attr = attrs[i].replace(/\s/g, ''); + var matches = attr.match(WIDTH); + + if (matches !== null && matches.length >= 1) { + return matches[1]; + } + } + + return null; + } + + if (method == 'computedstyle') { + var computedStyle = window.getComputedStyle($element[0]); + + return computedStyle.width; + } + + return method; + }; + + Select2.prototype._bindAdapters = function () { + this.dataAdapter.bind(this, this.$container); + this.selection.bind(this, this.$container); + + this.dropdown.bind(this, this.$container); + this.results.bind(this, this.$container); + }; + + Select2.prototype._registerDomEvents = function () { + var self = this; + + this.$element.on('change.select2', function () { + self.dataAdapter.current(function (data) { + self.trigger('selection:update', { + data: data + }); + }); + }); + + this.$element.on('focus.select2', function (evt) { + self.trigger('focus', evt); + }); + + this._syncA = Utils.bind(this._syncAttributes, this); + this._syncS = Utils.bind(this._syncSubtree, this); + + if (this.$element[0].attachEvent) { + this.$element[0].attachEvent('onpropertychange', this._syncA); + } + + var observer = window.MutationObserver || + window.WebKitMutationObserver || + window.MozMutationObserver + ; + + if (observer != null) { + this._observer = new observer(function (mutations) { + self._syncA(); + self._syncS(null, mutations); + }); + this._observer.observe(this.$element[0], { + attributes: true, + childList: true, + subtree: false + }); + } else if (this.$element[0].addEventListener) { + this.$element[0].addEventListener( + 'DOMAttrModified', + self._syncA, + false + ); + this.$element[0].addEventListener( + 'DOMNodeInserted', + self._syncS, + false + ); + this.$element[0].addEventListener( + 'DOMNodeRemoved', + self._syncS, + false + ); + } + }; + + Select2.prototype._registerDataEvents = function () { + var self = this; + + this.dataAdapter.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerSelectionEvents = function () { + var self = this; + var nonRelayEvents = ['toggle', 'focus']; + + this.selection.on('toggle', function () { + self.toggleDropdown(); + }); + + this.selection.on('focus', function (params) { + self.focus(params); + }); + + this.selection.on('*', function (name, params) { + if ($.inArray(name, nonRelayEvents) !== -1) { + return; + } + + self.trigger(name, params); + }); + }; + + Select2.prototype._registerDropdownEvents = function () { + var self = this; + + this.dropdown.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerResultsEvents = function () { + var self = this; + + this.results.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerEvents = function () { + var self = this; + + this.on('open', function () { + self.$container.addClass('select2-container--open'); + }); + + this.on('close', function () { + self.$container.removeClass('select2-container--open'); + }); + + this.on('enable', function () { + self.$container.removeClass('select2-container--disabled'); + }); + + this.on('disable', function () { + self.$container.addClass('select2-container--disabled'); + }); + + this.on('blur', function () { + self.$container.removeClass('select2-container--focus'); + }); + + this.on('query', function (params) { + if (!self.isOpen()) { + self.trigger('open', {}); + } + + this.dataAdapter.query(params, function (data) { + self.trigger('results:all', { + data: data, + query: params + }); + }); + }); + + this.on('query:append', function (params) { + this.dataAdapter.query(params, function (data) { + self.trigger('results:append', { + data: data, + query: params + }); + }); + }); + + this.on('keypress', function (evt) { + var key = evt.which; + + if (self.isOpen()) { + if (key === KEYS.ESC || key === KEYS.TAB || + (key === KEYS.UP && evt.altKey)) { + self.close(evt); + + evt.preventDefault(); + } else if (key === KEYS.ENTER) { + self.trigger('results:select', {}); + + evt.preventDefault(); + } else if ((key === KEYS.SPACE && evt.ctrlKey)) { + self.trigger('results:toggle', {}); + + evt.preventDefault(); + } else if (key === KEYS.UP) { + self.trigger('results:previous', {}); + + evt.preventDefault(); + } else if (key === KEYS.DOWN) { + self.trigger('results:next', {}); + + evt.preventDefault(); + } + } else { + if (key === KEYS.ENTER || key === KEYS.SPACE || + (key === KEYS.DOWN && evt.altKey)) { + self.open(); + + evt.preventDefault(); + } + } + }); + }; + + Select2.prototype._syncAttributes = function () { + this.options.set('disabled', this.$element.prop('disabled')); + + if (this.isDisabled()) { + if (this.isOpen()) { + this.close(); + } + + this.trigger('disable', {}); + } else { + this.trigger('enable', {}); + } + }; + + Select2.prototype._isChangeMutation = function (evt, mutations) { + var changed = false; + var self = this; + + // Ignore any mutation events raised for elements that aren't options or + // optgroups. This handles the case when the select element is destroyed + if ( + evt && evt.target && ( + evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP' + ) + ) { + return; + } + + if (!mutations) { + // If mutation events aren't supported, then we can only assume that the + // change affected the selections + changed = true; + } else if (mutations.addedNodes && mutations.addedNodes.length > 0) { + for (var n = 0; n < mutations.addedNodes.length; n++) { + var node = mutations.addedNodes[n]; + + if (node.selected) { + changed = true; + } + } + } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { + changed = true; + } else if ($.isArray(mutations)) { + $.each(mutations, function(evt, mutation) { + if (self._isChangeMutation(evt, mutation)) { + // We've found a change mutation. + // Let's escape from the loop and continue + changed = true; + return false; + } + }); + } + return changed; + }; + + Select2.prototype._syncSubtree = function (evt, mutations) { + var changed = this._isChangeMutation(evt, mutations); + var self = this; + + // Only re-pull the data if we think there is a change + if (changed) { + this.dataAdapter.current(function (currentData) { + self.trigger('selection:update', { + data: currentData + }); + }); + } + }; + + /** + * Override the trigger method to automatically trigger pre-events when + * there are events that can be prevented. + */ + Select2.prototype.trigger = function (name, args) { + var actualTrigger = Select2.__super__.trigger; + var preTriggerMap = { + 'open': 'opening', + 'close': 'closing', + 'select': 'selecting', + 'unselect': 'unselecting', + 'clear': 'clearing' + }; + + if (args === undefined) { + args = {}; + } + + if (name in preTriggerMap) { + var preTriggerName = preTriggerMap[name]; + var preTriggerArgs = { + prevented: false, + name: name, + args: args + }; + + actualTrigger.call(this, preTriggerName, preTriggerArgs); + + if (preTriggerArgs.prevented) { + args.prevented = true; + + return; + } + } + + actualTrigger.call(this, name, args); + }; + + Select2.prototype.toggleDropdown = function () { + if (this.isDisabled()) { + return; + } + + if (this.isOpen()) { + this.close(); + } else { + this.open(); + } + }; + + Select2.prototype.open = function () { + if (this.isOpen()) { + return; + } + + if (this.isDisabled()) { + return; + } + + this.trigger('query', {}); + }; + + Select2.prototype.close = function (evt) { + if (!this.isOpen()) { + return; + } + + this.trigger('close', { originalEvent : evt }); + }; + + /** + * Helper method to abstract the "enabled" (not "disabled") state of this + * object. + * + * @return {true} if the instance is not disabled. + * @return {false} if the instance is disabled. + */ + Select2.prototype.isEnabled = function () { + return !this.isDisabled(); + }; + + /** + * Helper method to abstract the "disabled" state of this object. + * + * @return {true} if the disabled option is true. + * @return {false} if the disabled option is false. + */ + Select2.prototype.isDisabled = function () { + return this.options.get('disabled'); + }; + + Select2.prototype.isOpen = function () { + return this.$container.hasClass('select2-container--open'); + }; + + Select2.prototype.hasFocus = function () { + return this.$container.hasClass('select2-container--focus'); + }; + + Select2.prototype.focus = function (data) { + // No need to re-trigger focus events if we are already focused + if (this.hasFocus()) { + return; + } + + this.$container.addClass('select2-container--focus'); + this.trigger('focus', {}); + }; + + Select2.prototype.enable = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("enable")` method has been deprecated and will' + + ' be removed in later Select2 versions. Use $element.prop("disabled")' + + ' instead.' + ); + } + + if (args == null || args.length === 0) { + args = [true]; + } + + var disabled = !args[0]; + + this.$element.prop('disabled', disabled); + }; + + Select2.prototype.data = function () { + if (this.options.get('debug') && + arguments.length > 0 && window.console && console.warn) { + console.warn( + 'Select2: Data can no longer be set using `select2("data")`. You ' + + 'should consider setting the value instead using `$element.val()`.' + ); + } + + var data = []; + + this.dataAdapter.current(function (currentData) { + data = currentData; + }); + + return data; + }; + + Select2.prototype.val = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("val")` method has been deprecated and will be' + + ' removed in later Select2 versions. Use $element.val() instead.' + ); + } + + if (args == null || args.length === 0) { + return this.$element.val(); + } + + var newVal = args[0]; + + if ($.isArray(newVal)) { + newVal = $.map(newVal, function (obj) { + return obj.toString(); + }); + } + + this.$element.val(newVal).trigger('input').trigger('change'); + }; + + Select2.prototype.destroy = function () { + this.$container.remove(); + + if (this.$element[0].detachEvent) { + this.$element[0].detachEvent('onpropertychange', this._syncA); + } + + if (this._observer != null) { + this._observer.disconnect(); + this._observer = null; + } else if (this.$element[0].removeEventListener) { + this.$element[0] + .removeEventListener('DOMAttrModified', this._syncA, false); + this.$element[0] + .removeEventListener('DOMNodeInserted', this._syncS, false); + this.$element[0] + .removeEventListener('DOMNodeRemoved', this._syncS, false); + } + + this._syncA = null; + this._syncS = null; + + this.$element.off('.select2'); + this.$element.attr('tabindex', + Utils.GetData(this.$element[0], 'old-tabindex')); + + this.$element.removeClass('select2-hidden-accessible'); + this.$element.attr('aria-hidden', 'false'); + Utils.RemoveData(this.$element[0]); + this.$element.removeData('select2'); + + this.dataAdapter.destroy(); + this.selection.destroy(); + this.dropdown.destroy(); + this.results.destroy(); + + this.dataAdapter = null; + this.selection = null; + this.dropdown = null; + this.results = null; + }; + + Select2.prototype.render = function () { + var $container = $( + '' + + '' + + '' + + '' + ); + + $container.attr('dir', this.options.get('dir')); + + this.$container = $container; + + this.$container.addClass('select2-container--' + this.options.get('theme')); + + Utils.StoreData($container[0], 'element', this.$element); + + return $container; + }; + + return Select2; +}); + +S2.define('jquery-mousewheel',[ + 'jquery' +], function ($) { + // Used to shim jQuery.mousewheel for non-full builds. + return $; +}); + +S2.define('jquery.select2',[ + 'jquery', + 'jquery-mousewheel', + + './select2/core', + './select2/defaults', + './select2/utils' +], function ($, _, Select2, Defaults, Utils) { + if ($.fn.select2 == null) { + // All methods that should return the element + var thisMethods = ['open', 'close', 'destroy']; + + $.fn.select2 = function (options) { + options = options || {}; + + if (typeof options === 'object') { + this.each(function () { + var instanceOptions = $.extend(true, {}, options); + + var instance = new Select2($(this), instanceOptions); + }); + + return this; + } else if (typeof options === 'string') { + var ret; + var args = Array.prototype.slice.call(arguments, 1); + + this.each(function () { + var instance = Utils.GetData(this, 'select2'); + + if (instance == null && window.console && console.error) { + console.error( + 'The select2(\'' + options + '\') method was called on an ' + + 'element that is not using Select2.' + ); + } + + ret = instance[options].apply(instance, args); + }); + + // Check if we should be returning `this` + if ($.inArray(options, thisMethods) > -1) { + return this; + } + + return ret; + } else { + throw new Error('Invalid arguments for Select2: ' + options); + } + }; + } + + if ($.fn.select2.defaults == null) { + $.fn.select2.defaults = Defaults; + } + + return Select2; +}); + + // Return the AMD loader configuration so it can be used outside of this file + return { + define: S2.define, + require: S2.require + }; +}()); + + // Autoload the jQuery bindings + // We know that all of the modules exist above this, so we're safe + var select2 = S2.require('jquery.select2'); + + // Hold the AMD module references on the jQuery function that was just loaded + // This allows Select2 to use the internal loader outside of this file, such + // as in the language files. + jQuery.fn.select2.amd = S2; + + // Return the Select2 instance for anyone who is importing it. + return select2; +})); diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/select2.min.js b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/select2.min.js new file mode 100755 index 00000000..e4214264 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/select2.min.js @@ -0,0 +1,2 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ +!function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t),t}:n(jQuery)}(function(u){var e=function(){if(u&&u.fn&&u.fn.select2&&u.fn.select2.amd)var e=u.fn.select2.amd;var t,n,r,h,o,s,f,g,m,v,y,_,i,a,b;function w(e,t){return i.call(e,t)}function l(e,t){var n,r,i,o,s,a,l,c,u,d,p,h=t&&t.split("/"),f=y.map,g=f&&f["*"]||{};if(e){for(s=(e=e.split("/")).length-1,y.nodeIdCompat&&b.test(e[s])&&(e[s]=e[s].replace(b,"")),"."===e[0].charAt(0)&&h&&(e=h.slice(0,h.length-1).concat(e)),u=0;u":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},i.appendMany=function(e,t){if("1.7"===o.fn.jquery.substr(0,3)){var n=o();o.map(t,function(e){n=n.add(e)}),t=n}e.append(t)},i.__cache={};var n=0;return i.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null==t&&(e.id?(t=e.id,e.setAttribute("data-select2-id",t)):(e.setAttribute("data-select2-id",++n),t=n.toString())),t},i.StoreData=function(e,t,n){var r=i.GetUniqueElementId(e);i.__cache[r]||(i.__cache[r]={}),i.__cache[r][t]=n},i.GetData=function(e,t){var n=i.GetUniqueElementId(e);return t?i.__cache[n]&&null!=i.__cache[n][t]?i.__cache[n][t]:o(e).data(t):i.__cache[n]},i.RemoveData=function(e){var t=i.GetUniqueElementId(e);null!=i.__cache[t]&&delete i.__cache[t],e.removeAttribute("data-select2-id")},i}),e.define("select2/results",["jquery","./utils"],function(h,f){function r(e,t,n){this.$element=e,this.data=n,this.options=t,r.__super__.constructor.call(this)}return f.Extend(r,f.Observable),r.prototype.render=function(){var e=h('
          ');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},r.prototype.clear=function(){this.$results.empty()},r.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=h(''),r=this.options.get("translations").get(e.message);n.append(t(r(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},r.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},r.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n",{class:"select2-results__options select2-results__options--nested"});p.append(l),s.append(a),s.append(p)}else this.template(e,t);return f.StoreData(t,"data",e),t},r.prototype.bind=function(t,e){var l=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){l.clear(),l.append(e.data),t.isOpen()&&(l.setClasses(),l.highlightFirstItem())}),t.on("results:append",function(e){l.append(e.data),t.isOpen()&&l.setClasses()}),t.on("query",function(e){l.hideMessages(),l.showLoading(e)}),t.on("select",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("open",function(){l.$results.attr("aria-expanded","true"),l.$results.attr("aria-hidden","false"),l.setClasses(),l.ensureHighlightVisible()}),t.on("close",function(){l.$results.attr("aria-expanded","false"),l.$results.attr("aria-hidden","true"),l.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=l.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e=l.getHighlightedResults();if(0!==e.length){var t=f.GetData(e[0],"data");"true"==e.attr("aria-selected")?l.trigger("close",{}):l.trigger("select",{data:t})}}),t.on("results:previous",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e);if(!(n<=0)){var r=n-1;0===e.length&&(r=0);var i=t.eq(r);i.trigger("mouseenter");var o=l.$results.offset().top,s=i.offset().top,a=l.$results.scrollTop()+(s-o);0===r?l.$results.scrollTop(0):s-o<0&&l.$results.scrollTop(a)}}),t.on("results:next",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e)+1;if(!(n>=t.length)){var r=t.eq(n);r.trigger("mouseenter");var i=l.$results.offset().top+l.$results.outerHeight(!1),o=r.offset().top+r.outerHeight(!1),s=l.$results.scrollTop()+o-i;0===n?l.$results.scrollTop(0):ithis.$results.outerHeight()||o<0)&&this.$results.scrollTop(i)}},r.prototype.template=function(e,t){var n=this.options.get("templateResult"),r=this.options.get("escapeMarkup"),i=n(e,t);null==i?t.style.display="none":"string"==typeof i?t.innerHTML=r(i):h(t).append(i)},r}),e.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),e.define("select2/selection/base",["jquery","../utils","../keys"],function(n,r,i){function o(e,t){this.$element=e,this.options=t,o.__super__.constructor.call(this)}return r.Extend(o,r.Observable),o.prototype.render=function(){var e=n('');return this._tabindex=0,null!=r.GetData(this.$element[0],"old-tabindex")?this._tabindex=r.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),e.attr("aria-disabled","false"),this.$selection=e},o.prototype.bind=function(e,t){var n=this,r=e.id+"-results";this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===i.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",r),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.trigger("focus"),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex),n.$selection.attr("aria-disabled","false")}),e.on("disable",function(){n.$selection.attr("tabindex","-1"),n.$selection.attr("aria-disabled","true")})},o.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},o.prototype._attachCloseHandler=function(e){n(document.body).on("mousedown.select2."+e.id,function(e){var t=n(e.target).closest(".select2");n(".select2.select2-container--open").each(function(){this!=t[0]&&r.GetData(this,"element").select2("close")})})},o.prototype._detachCloseHandler=function(e){n(document.body).off("mousedown.select2."+e.id)},o.prototype.position=function(e,t){t.find(".selection").append(e)},o.prototype.destroy=function(){this._detachCloseHandler(this.container)},o.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},o.prototype.isEnabled=function(){return!this.isDisabled()},o.prototype.isDisabled=function(){return this.options.get("disabled")},o}),e.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,r){function i(){i.__super__.constructor.apply(this,arguments)}return n.Extend(i,t),i.prototype.render=function(){var e=i.__super__.render.call(this);return e.addClass("select2-selection--single"),e.html(''),e},i.prototype.bind=function(t,e){var n=this;i.__super__.bind.apply(this,arguments);var r=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",r).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",r),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.trigger("focus")})},i.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},i.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},i.prototype.selectionContainer=function(){return e("")},i.prototype.update=function(e){if(0!==e.length){var t=e[0],n=this.$selection.find(".select2-selection__rendered"),r=this.display(t,n);n.empty().append(r);var i=t.title||t.text;i?n.attr("title",i):n.removeAttr("title")}else this.clear()},i}),e.define("select2/selection/multiple",["jquery","./base","../utils"],function(i,e,l){function n(e,t){n.__super__.constructor.apply(this,arguments)}return l.Extend(n,e),n.prototype.render=function(){var e=n.__super__.render.call(this);return e.addClass("select2-selection--multiple"),e.html('
            '),e},n.prototype.bind=function(e,t){var r=this;n.__super__.bind.apply(this,arguments),this.$selection.on("click",function(e){r.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){if(!r.isDisabled()){var t=i(this).parent(),n=l.GetData(t[0],"data");r.trigger("unselect",{originalEvent:e,data:n})}})},n.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},n.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},n.prototype.selectionContainer=function(){return i('
          • ×
          • ')},n.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=0;n×');a.StoreData(r[0],"data",t),this.$selection.find(".select2-selection__rendered").prepend(r)}},e}),e.define("select2/selection/search",["jquery","../utils","../keys"],function(r,a,l){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=r('');this.$searchContainer=t,this.$search=t.find("input");var n=e.call(this);return this._transferTabIndex(),n},e.prototype.bind=function(e,t,n){var r=this,i=t.id+"-results";e.call(this,t,n),t.on("open",function(){r.$search.attr("aria-controls",i),r.$search.trigger("focus")}),t.on("close",function(){r.$search.val(""),r.$search.removeAttr("aria-controls"),r.$search.removeAttr("aria-activedescendant"),r.$search.trigger("focus")}),t.on("enable",function(){r.$search.prop("disabled",!1),r._transferTabIndex()}),t.on("disable",function(){r.$search.prop("disabled",!0)}),t.on("focus",function(e){r.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?r.$search.attr("aria-activedescendant",e.data._resultId):r.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){r.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){r._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){if(e.stopPropagation(),r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented(),e.which===l.BACKSPACE&&""===r.$search.val()){var t=r.$searchContainer.prev(".select2-selection__choice");if(0this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("select",function(){r._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var r=this;this._checkIfMaximumSelected(function(){e.call(r,t,n)})},e.prototype._checkIfMaximumSelected=function(e,n){var r=this;this.current(function(e){var t=null!=e?e.length:0;0=r.maximumSelectionLength?r.trigger("results:message",{message:"maximumSelected",args:{maximum:r.maximumSelectionLength}}):n&&n()})},e}),e.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),e.define("select2/dropdown/search",["jquery","../utils"],function(o,e){function t(){}return t.prototype.render=function(e){var t=e.call(this),n=o('');return this.$searchContainer=n,this.$search=n.find("input"),t.prepend(n),t},t.prototype.bind=function(e,t,n){var r=this,i=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){o(this).off("keyup")}),this.$search.on("keyup input",function(e){r.handleSearch(e)}),t.on("open",function(){r.$search.attr("tabindex",0),r.$search.attr("aria-controls",i),r.$search.trigger("focus"),window.setTimeout(function(){r.$search.trigger("focus")},0)}),t.on("close",function(){r.$search.attr("tabindex",-1),r.$search.removeAttr("aria-controls"),r.$search.removeAttr("aria-activedescendant"),r.$search.val(""),r.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||r.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(r.showSearch(e)?r.$searchContainer.removeClass("select2-search--hide"):r.$searchContainer.addClass("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?r.$search.attr("aria-activedescendant",e.data._resultId):r.$search.removeAttr("aria-activedescendant")})},t.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},t.prototype.showSearch=function(e,t){return!0},t}),e.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,r){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,r)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),r=t.length-1;0<=r;r--){var i=t[r];this.placeholder.id===i.id&&n.splice(r,1)}return n},e}),e.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,r){this.lastParams={},e.call(this,t,n,r),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("query",function(e){r.lastParams=e,r.loading=!0}),t.on("query:append",function(e){r.lastParams=e,r.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);if(!this.loading&&e){var t=this.$results.offset().top+this.$results.outerHeight(!1);this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=t+50&&this.loadMore()}},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('
          • '),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),e.define("select2/dropdown/attachBody",["jquery","../utils"],function(f,a){function e(e,t,n){this.$dropdownParent=f(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("open",function(){r._showDropdown(),r._attachPositioningHandler(t),r._bindContainerResultHandlers(t)}),t.on("close",function(){r._hideDropdown(),r._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=f(""),n=e.call(this);return t.append(n),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){if(!this._containerResultsHandlersBound){var n=this;t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0}},e.prototype._attachPositioningHandler=function(e,t){var n=this,r="scroll.select2."+t.id,i="resize.select2."+t.id,o="orientationchange.select2."+t.id,s=this.$container.parents().filter(a.hasScroll);s.each(function(){a.StoreData(this,"select2-scroll-position",{x:f(this).scrollLeft(),y:f(this).scrollTop()})}),s.on(r,function(e){var t=a.GetData(this,"select2-scroll-position");f(this).scrollTop(t.y)}),f(window).on(r+" "+i+" "+o,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,r="resize.select2."+t.id,i="orientationchange.select2."+t.id;this.$container.parents().filter(a.hasScroll).off(n),f(window).off(n+" "+r+" "+i)},e.prototype._positionDropdown=function(){var e=f(window),t=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),r=null,i=this.$container.offset();i.bottom=i.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=i.top,o.bottom=i.top+o.height;var s=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=ai.bottom+s,d={left:i.left,top:o.bottom},p=this.$dropdownParent;"static"===p.css("position")&&(p=p.offsetParent());var h={top:0,left:0};(f.contains(document.body,p[0])||p[0].isConnected)&&(h=p.offset()),d.top-=h.top,d.left-=h.left,t||n||(r="below"),u||!c||t?!c&&u&&t&&(r="below"):r="above",("above"==r||t&&"below"!==r)&&(d.top=o.top-h.top-s),null!=r&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+r),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+r)),this.$dropdownContainer.css(d)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),e.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,r){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,r)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,r=0;r');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container.addClass("select2-container--"+this.options.get("theme")),u.StoreData(e[0],"element",this.$element),e},d}),e.define("jquery-mousewheel",["jquery"],function(e){return e}),e.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(i,e,o,t,s){if(null==i.fn.select2){var a=["open","close","destroy"];i.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var e=i.extend(!0,{},t);new o(i(this),e)}),this;if("string"!=typeof t)throw new Error("Invalid arguments for Select2: "+t);var n,r=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=s.GetData(this,"select2");null==e&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),n=e[t].apply(e,r)}),-1simba_tfa = $simba_tfa; + $this->file_path = path_join($this->get_mu_plugin_dir(), 'simba-tfa-encryption-key.php'); + } + + /** + * Returns full path to mu-plugin directory + * + * @return string - the mu-plugin directory path + */ + public function get_mu_plugin_dir() { + return WPMU_PLUGIN_DIR; + } + + /** + * Returns the full path to the mu-plugin file + * + * @return string - the mu-plugin path + */ + public function get_file_path() { + return $this->file_path; + } + + /** + * This function checks if our mu-plugin exists + * + * @return boolean - true if the file exists otherwise false + */ + public function muplugin_exists() { + return file_exists($this->file_path); + } + + /** + * Inserts our code into our mu-plugin. + * + * The mu-plugin and the mu-plugin directory will be created if they don't already exists + * + * @return boolean|WP_Error - true on success or WP_Error on failure + */ + public function insert_contents() { + + $info = pathinfo($this->file_path); + + if (!isset($info['dirname'])) { + return new WP_Error( + 'file_no_directory', + /* translators: %s: Multi user plugin directory */ + __('Encrypt secrets feature not enabled: no directory has been set.', 'all-in-one-wp-security-and-firewall') . ' ' . sprintf(__('Please check your %s constant is valid', 'all-in-one-wp-security-and-firewall'), 'WPMU_PLUGIN_DIR'), + $this->file_path + ); + } + + if (false === wp_mkdir_p($info['dirname'])) { + return new WP_Error( + 'file_no_directory_created', + /* translators: %s: Multi user plugin directory */ + sprintf(__('The encrypt secrets feature was not enabled: your mu-plugins directory could not be automatically created; therefore, please use your web hosting file manager or FTP to manually create this folder and then try again: %s', 'all-in-one-wp-security-and-firewall'), $this->get_mu_plugin_dir()), + $info['dirname'] + ); + } + + if (false === @file_put_contents($this->file_path, $this->get_contents())) { // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- ignore this as it is handled by the caller + return new WP_Error( + 'file_no_contents', + /* translators: %s: File path. */ + __('The encrypt secrets feature was not enabled: attempting to write the mu-plugin file contents failed; therefore, please create the file manually.', 'all-in-one-wp-security-and-firewall') . "

            " . sprintf(__('Add the following code to the file %s', 'all-in-one-wp-security-and-firewall'), $this->get_file_path()) . "\n" . '

            ' . nl2br(esc_html($this->get_contents())) . '

            ' . __('Once you have added the above code then press the button to turn on encryption again', 'all-in-one-wp-security-and-firewall'), + $info['dirname'] + ); + } + + return true; + } + + /** + * This function creates the contents for the mu-plugin + * + * @return string - the contents of the mu-plugin + */ + public function get_contents() { + $encryption_key = base64_encode($this->simba_tfa->random_bytes(16)); + $code = "0) { + styling = 'margin-left: 4px; position: relative; top: 4px; width: 20px; height: 20px; border:0px; box-shadow:none;'; + } + $submit_button.after(''); + } + + $.ajax({ + url: simba_tfasettings.ajaxurl, + type: 'POST', + data: { + action: 'simbatfa-init-otp', + user: username + }, + dataType: 'text', + success: function(resp) { + try { + var json_begins = resp.search('{"jsonstarter":"justhere"'); + if (json_begins > -1) { + if (json_begins > 0) { + console.log("Expected JSON marker found at position: "+json_begins); + resp = resp.substring(json_begins); + } + } else { + console.log("Expected JSON marker not found"); + console.log(resp); + } + + response = JSON.parse(resp); + + if (response.hasOwnProperty('php_output')) { + console.log("PHP output was returned (follows)"); + console.log(response.php_output); + } + + if (response.hasOwnProperty('extra_output')) { + console.log("Extra output was returned (follows)"); + console.log(response.extra_output); + } + + if (only_cache_the_results) { + // Save the result for later processing + username_requires_otp[username] = response; + $('.simbaotp_spinner').remove(); + } else { + process_user_tfa_enabled_check_results($(form), response); + } + + } catch(err) { + $('#login').html(resp); + console.log("Simba TFA: Error when processing response"); + console.log(err); + console.log(resp); + } + }, + error: function(jq_xhr, text_status, error_thrown) { + console.log("Simba TFA: AJAX error: "+error_thrown+": "+text_status); + console.log(jq_xhr); + if (jq_xhr.hasOwnProperty('responseText')) { + console.log(jq_xhr.responseText); + $(form).append('

            '+simba_tfasettings.error+'

            '); + } + } + }); + return true; + } + + // Parameters: see check_and_possibly_show_otp_field + function show_otp_field(form, user_can_trust, user_already_trusted) { + + var $submit_button; + + user_can_trust = ('undefined' == typeof user_can_trust) ? false : user_can_trust; + user_already_trusted = ('undefined' == typeof user_already_trusted) ? false : user_already_trusted; + + if ('https:' != window.location.protocol && 'localhost' !== location.hostname && '127.0.0.1' !== location.hostname && /^\.localdomain$/.test(location.hostname)) { + user_can_trust = false; + } + + if (!user_can_trust) { user_already_trusted = false; } + + var form_is_gravity_forms = ('object' == typeof window['gform_gravityforms'] && 'undefined' !== typeof $(form).attr('id') && 'gform_' === $(form).attr('id').substring(0, 6)); + + // This is used just for applying similar styling (via adding structure/CSS classes) + var form_is_ultimate_member = ($(form).find('.um-row').length > 0) ? true : false; + + // This is used just for applying styling if .js-login-form class exists inside form + var form_is_login_form = ($(form).find('.js-login-form').length > 0) ? true : false; + + // Gravity Forms won't submit if the elements are hidden + var form_retain_existing_elements = form_is_gravity_forms ? true : false; + + // name="Submit" is WP-Members. 'submit' is Theme My Login starting from 7.x + $submit_button = $(form).find('input[name="wp-submit"], input[name="Submit"], input[name="submit"]'); + // This hasn't been needed for anything yet (Jul 2018), but is a decent back-stop that would have prevented some breakage in the past that needed manual attention: + if (0 == $submit_button.length) { + $submit_button = $(form).find('input[type="submit"], button[type="submit"]').first(); + } + + if (!form_retain_existing_elements) { + // Hide all elements in a browser-safe way + // .user-pass-wrap is the wrapper used (instead of a paragraph) on wp-login.php from WP 5.3 + // .um-row : Ultimate Member + // .rmrow : RegistrationMagic + $submit_button.parents('form').first().find('p, .impu-form-line-fr, .tml-field-wrap, .user-pass-wrap, .elementor-field-type-text, .elementor-field-type-submit, .elementor-remember-me, .bbp-username, .bbp-password, .bbp-submit-wrapper, .gform_body, .um-row, .um-button, .js-login-form, .rmrow').each(function(i) { + $(this).css('visibility', 'hidden').css('position', 'absolute'); + // On the WooCommerce form, the 'required' asterisk in the child still shows without this + $(this).find('span').css('visibility', 'hidden').css('position', 'absolute'); + }); + + // WP-Members + $submit_button.parents('#wpmem_login').find('fieldset').css('visibility', 'hidden').css('position', 'absolute'); + + } + + // Add new field and controls + var html = ''; + + if (form_is_ultimate_member) { + html += '
            '; + } + + if (user_already_trusted) { + + html += '
            '+simba_tfasettings.is_trusted+''; + + } else { + + if (form_is_ultimate_member) { html += '
            '; } + + html += '
            '; + } + + if (user_can_trust) { + + html += ''; + + } + } + + html += '

            '; + + var submit_button_text; + var submit_button_name; + + // Gravity forms doesn't like its button being disabled + if (!form_is_gravity_forms) { + + if ('button' == $submit_button.prop('nodeName').toLowerCase()) { + submit_button_text = $submit_button.text().trim(); + submit_button_name = $submit_button.attr('name'); + } else { + submit_button_text = $submit_button.val(); + submit_button_name = $submit_button.attr('name'); + } + + html += '

            '; + + $submit_button.prop('disabled', true).hide(); + + } + + if (form_retain_existing_elements && form_is_gravity_forms) { + // $submit_button.parents('form').first().append(html); + //$('
            '+html+'
            ').insertBefore($submit_button); + $(form).find('#gform_fields_login').append(html); + } else { + $submit_button.parents('form').first().prepend(html); + } + + $('#login_error').hide(); + + if (user_already_trusted) { + if (form_retain_existing_elements) { + $submit_button.trigger('click'); + } else { + $('#tfa_login_btn').trigger('click'); + } + } else { + + $('#simba_two_factor_auth').trigger('focus'); + + // Hide extra boxes of third party plugins + jQuery('.hide-when-displaying-tfa-input').hide(); + } + + } + + /** + * This function gets attached to a form submission handler and decides whether to add an OTP field or not. + * + * @param Object e - submission event + * + * @return Boolean - whether to proceed with the submission or not + */ + var form_submit_handler = function(e) { + + console.log('Simba TFA: form submit request'); + + var form = e.target; + + var form_is_gravity_forms = ('object' == typeof window['gform_gravityforms'] && 'undefined' !== typeof $(form).attr('id') && 'gform_' === $(form).attr('id').substring(0, 6)); + + // Turn off everything + $(form).off(); + + if (0 == $(form).find('#simba_two_factor_auth').length && check_and_possibly_show_otp_field(form)) { + + if (form_is_gravity_forms) { + var form_id = $(form).attr('id').substring(6); + // Gravity Forms won't allow the form to submit if this is already true + window['gf_submitting_'+form_id] = false; + } + + e.preventDefault(); + return false; + + } + + return true; + + }; + + if (simba_tfasettings.login_form_off_selectors) { + $(simba_tfasettings.login_form_off_selectors).off('submit'); + } + + $(simba_tfasettings.login_form_selectors).on('submit', form_submit_handler); + + $(simba_tfasettings.login_form_selectors).find(get_username_identifiers()).on('blur', function() { + var $form = $(this).parents('form').first(); + check_and_possibly_show_otp_field($form, true); + }); + +}); diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/tfa_admin_icon_16x16.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/tfa_admin_icon_16x16.png new file mode 100755 index 00000000..7605cc44 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/tfa_admin_icon_16x16.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/tfa_admin_icon_32x32.png b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/tfa_admin_icon_32x32.png new file mode 100755 index 00000000..5e6b2633 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/tfa_admin_icon_32x32.png differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/tfa_frontend.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/tfa_frontend.php new file mode 100755 index 00000000..1dac8c32 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/tfa_frontend.php @@ -0,0 +1,216 @@ +mother = $mother; + add_action('wp_ajax_tfa_frontend', array($this, 'ajax')); + add_shortcode('twofactor_user_settings', array($this, 'tfa_user_settings_front')); + + if (!WP_Block_Type_Registry::get_instance()->is_registered('twofactor/user-settings')) { + register_block_type('twofactor/user-settings', array( + 'editor_script' => 'twofactor-gutenberg-blocks', + 'render_callback' => array($this, 'tfa_user_settings_front'), + )); + } + } + + /** + * Runs upon the WP action wp_ajax_tfa_frontend + * + * @uses die() + */ + public function ajax() { + $totp_controller = $this->mother->get_controller('totp'); + global $current_user; + + $return_array = array(); + + if (empty($_POST) || empty($_POST['subaction']) || !isset($_POST['nonce']) || !is_user_logged_in() || !wp_verify_nonce($_POST['nonce'], 'tfa_frontend_nonce')) die('Security check'); + + if ('savesettings' == $_POST['subaction']) { + if (empty($_POST['settings']) || !is_string($_POST['settings'])) die; + + parse_str(stripslashes($_POST['settings']), $posted_settings); + + if (isset($posted_settings['tfa_algorithm_type'])) { + $old_algorithm = $totp_controller->get_user_otp_algorithm($current_user->ID); + + if ($old_algorithm != $posted_settings['tfa_algorithm_type']) + $totp_controller->changeUserAlgorithmTo($current_user->ID, $posted_settings['tfa_algorithm_type']); + + //Re-fetch the algorithm type, url and private string + $variables = $this->tfa_fetch_assort_vars(); + + $return_array['qr'] = $totp_controller->tfa_qr_code_url($variables['algorithm_type'], $variables['url'], $variables['tfa_priv_key']); + $return_array['al_type_disp'] = $this->tfa_algorithm_info($variables['algorithm_type']); + } + + if (isset($posted_settings['tfa_enable_tfa'])) { + + $allow_enable_or_disable = false; + + if (empty($posted_settings['require_current']) || !$posted_settings['tfa_enable_tfa']) { + $allow_enable_or_disable = true; + } else { + + if (!isset($posted_settings['tfa_enable_current']) || '' == $posted_settings['tfa_enable_current']) { + $return_array['message'] = __('To enable TFA, you must enter the current code.', 'all-in-one-wp-security-and-firewall'); + $return_array['error'] = 'code_absent'; + } else { + // Third parameter: don't allow emergency codes + if ($totp_controller->check_code_for_user($current_user->ID, $posted_settings['tfa_enable_current'], false)) { + $allow_enable_or_disable = true; + } else { + $return_array['error'] = 'code_wrong'; + $return_array['message'] = apply_filters('simba_tfa_message_code_incorrect', __('The TFA code you entered was incorrect.', 'all-in-one-wp-security-and-firewall')); + } + } + + } + + if ($allow_enable_or_disable) $this->mother->change_tfa_enabled_status($current_user->ID, $posted_settings['tfa_enable_tfa']); + } + + $return_array['result'] = 'saved'; + + echo json_encode($return_array); + } + + die; + } + + /** + * Make the algorithm information string easier to update + * + * @param String $algorithm_type - totp|hotp + */ + public function tfa_algorithm_info($algorithm_type) { + $al_type_disp = strtoupper($algorithm_type); + $al_type_desc = ($algorithm_type == 'totp' ? __('a time based', 'all-in-one-wp-security-and-firewall') : __('an event based', 'all-in-one-wp-security-and-firewall')); + + return array('disp' => $al_type_disp, 'desc' => $al_type_desc); + } + + /** + * Make the assorted required variables more accessible for ajax + * + * Returns: Site URL, private key, emergency codes, algorithm type + * + * @return Array + */ + public function tfa_fetch_assort_vars() { + global $current_user; + $totp_controller = $this->mother->get_controller('totp'); + + $url = preg_replace('/^https?:\/\//i', '', site_url()); + + $tfa_priv_key_64 = get_user_meta($current_user->ID, 'tfa_priv_key_64', true); + + if (!$tfa_priv_key_64) $tfa_priv_key_64 = $totp_controller->addPrivateKey($current_user->ID); + + $tfa_priv_key = trim($totp_controller->getPrivateKeyPlain($tfa_priv_key_64, $current_user->ID)); + + $algorithm_type = $totp_controller->get_user_otp_algorithm($current_user->ID); + + return apply_filters('simba_tfa_fetch_assort_vars', array( + 'url' => $url, + 'tfa_priv_key_64' => $tfa_priv_key_64, + 'tfa_priv_key' => $tfa_priv_key, + 'emergency_str' => ''.__('No emergency codes left. Sorry.', 'all-in-one-wp-security-and-firewall').'', + 'algorithm_type' => $algorithm_type + ), $totp_controller, $current_user); + } + + /** + * Paints out the 'save settings' button + */ + public function save_settings_button() { + echo ''; + } + + /** + * Paint output for the TFA on/off radio + * + * @param String $style - valid values are 'show_current' and 'require_current' + */ + public function settings_enable_or_disable_output($style = 'show_current') { + $this->save_settings_javascript_output(); + global $current_user; + ?> +
            +

            mother->paint_enable_tfa_radios($current_user->ID, true, $style); ?>

            + +
            + mother->includes_url().'/jquery.blockUI' . $suffix . '.js', array('jquery'), '2.60'); + + $script_ver = (defined('WP_DEBUG') && WP_DEBUG) ? time() : filemtime($this->mother->includes_dir().'/frontend-settings.js'); + + wp_enqueue_script('simba-tfa-frontend-settings', $this->mother->includes_url().'/frontend-settings.js', array('jquery-blockui'), $script_ver); + + $ajax_url = admin_url('admin-ajax.php'); + // It's possible that FORCE_ADMIN_SSL will make that SSL, whilst the user is on the front-end having logged in over non-SSL - and as a result, their login cookies won't get sent, and they're not registered as logged in. + if (!is_admin() && substr(strtolower($ajax_url), 0, 6) == 'https:' && !is_ssl()) { + $also_try = 'http:'.substr($ajax_url, 6); + } else { + $also_try = ''; + } + + $localize = array( + 'ask' => __('You have unsaved settings.', 'all-in-one-wp-security-and-firewall'), + 'saving' => __('Saving...', 'all-in-one-wp-security-and-firewall'), + 'ajax_url' => $ajax_url, + 'also_try' => $also_try, + 'nonce' => wp_create_nonce('tfa_frontend_nonce'), + 'response' => __('Response:', 'all-in-one-wp-security-and-firewall'), + ); + + wp_localize_script('simba-tfa-frontend-settings', 'simba_tfa_frontend', $localize); + + } + + /** + * Shortcode function for twofactor_user_settings + * + * @param Array $atts - shortcode attributes + * + * @return String + */ + public function tfa_user_settings_front($atts = array()) { + + if (!is_user_logged_in()) return ''; + + $atts = array_change_key_case((array)$atts, CASE_LOWER); + + $atts = shortcode_atts(array('show_algorithm_selector' => 'no'), $atts); + + $show_algorithm_selector = ('yes' === $atts['show_algorithm_selector']); + + global $current_user; + + return $this->mother->include_template('shortcode-tfa-user-settings.php', array('is_activated_for_user' => $current_user->ID, 'tfa_frontend' => $this, 'show_algorithm_selector' => $show_algorithm_selector), true); + + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/totp.js b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/totp.js new file mode 100755 index 00000000..98bb4171 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/totp.js @@ -0,0 +1,101 @@ +jQuery(function($) { + + // Render any QR codes on the page + $('.simbaotp_qr_container').qrcode({ + 'render': 'image', + 'text': $('.simbaotp_qr_container:first').data('qrcode'), + }); + + function update_otp_code() { + + $('.simba_current_otp').html(''+simbatfa_totp.updating+''); + + var got_code = ''; + + $.post(simbatfa_totp.ajax_url, { + action: 'simbatfa_shared_ajax', + subaction: 'refreshotp', + nonce: simbatfa_totp.tfa_shared_nonce + }, function(response) { + + try { + var resp = JSON.parse(response); + got_code = resp.code; + } catch(err) { + if ('' !== simbatfa_totp.also_try) { + alert(simbatfa_totp.response+" "+response); + } + console.log(response); + console.log(err); + } + + if ('' === got_code && '' !== simbatfa_totp.also_try) { + $.post(simbatfa_totp.also_try, { + action: 'simbatfa_shared_ajax', + subaction: 'refreshotp', + nonce: simbatfa_totp.tfa_shared_nonce + }, function(response) { + try { + var resp = JSON.parse(response); + if (resp.code) { + $('.simba_current_otp').html(resp.code); + } else { + console.log(response); + console.log("TFA: no code found"); + } + } catch(err) { + alert(simbatfa_totp.response+" "+response); + console.log(response); + console.log(err); + } + }); + } else if ('' != got_code) { + $('.simba_current_otp').html(got_code); + } else { + console.log("TFA: no code found"); + } + }); + } + + var min_refresh_after = 30; + + if (0 == $('body.settings_page_two-factor-auth').length) { + $('.simba_current_otp').each(function(ind, obj) { + var refresh_after = $(obj).data('refresh_after'); + if (refresh_after > 0 && refresh_after < min_refresh_after) { + min_refresh_after = refresh_after; + } + }); + + // Update after the given seconds, and then every 30 seconds + setTimeout(function() { + setInterval(update_otp_code, 30000) + update_otp_code(); + }, min_refresh_after * 1000); + } + + // Handle clicks on the 'refresh' link + $('.simbaotp_refresh').on('click', function(e) { + e.preventDefault(); + update_otp_code(); + }); + + $('#tfa_trusted_devices_box').on('click', '.simbatfa-trust-remove', function(e) { + e.preventDefault(); + var device_id = $(this).data('trusted-device-id'); + $(this).parents('.simbatfa_trusted_device').css('opacity', '0.5'); + if ('undefined' !== typeof device_id) { + $.post(simbatfa_totp.ajax_url, { + action: 'simbatfa_shared_ajax', + subaction: 'untrust_device', + nonce: simbatfa_totp.tfa_shared_nonce, + device_id: device_id + }, function(response) { + var resp = JSON.parse(response); + if (resp.hasOwnProperty('trusted_list')) { + $('#tfa_trusted_devices_box_inner').html(resp.trusted_list); + } + }); + } + }); +}); diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/users.css b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/users.css new file mode 100755 index 00000000..ca7d3f04 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/includes/users.css @@ -0,0 +1,13 @@ +/* TFA users list column */ +th.column-tfa-status, +td.column-tfa-status { + text-align: center; +} + +td.column-tfa-status span.dashicons-no { + color: red; +} + +td.column-tfa-status span.dashicons-yes { + color: green; +} \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/providers/totp/Base32/Base32.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/providers/totp/Base32/Base32.php new file mode 100755 index 00000000..02a3d533 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/providers/totp/Base32/Base32.php @@ -0,0 +1,225 @@ + + * @link http://christianriesen.com + * @license MIT License see LICENSE file + */ +class Base32 +{ + /** + * Table for encoding base32 + * + * @var array + */ + private static $encode = array( + 0 => 'A', + 1 => 'B', + 2 => 'C', + 3 => 'D', + 4 => 'E', + 5 => 'F', + 6 => 'G', + 7 => 'H', + 8 => 'I', + 9 => 'J', + 10 => 'K', + 11 => 'L', + 12 => 'M', + 13 => 'N', + 14 => 'O', + 15 => 'P', + 16 => 'Q', + 17 => 'R', + 18 => 'S', + 19 => 'T', + 20 => 'U', + 21 => 'V', + 22 => 'W', + 23 => 'X', + 24 => 'Y', + 25 => 'Z', + 26 => 2, + 27 => 3, + 28 => 4, + 29 => 5, + 30 => 6, + 31 => 7, + 32 => '=', + ); + + /** + * Table for decoding base32 + * + * @var array + */ + private static $decode = array( + 'A' => 0, + 'B' => 1, + 'C' => 2, + 'D' => 3, + 'E' => 4, + 'F' => 5, + 'G' => 6, + 'H' => 7, + 'I' => 8, + 'J' => 9, + 'K' => 10, + 'L' => 11, + 'M' => 12, + 'N' => 13, + 'O' => 14, + 'P' => 15, + 'Q' => 16, + 'R' => 17, + 'S' => 18, + 'T' => 19, + 'U' => 20, + 'V' => 21, + 'W' => 22, + 'X' => 23, + 'Y' => 24, + 'Z' => 25, + 2 => 26, + 3 => 27, + 4 => 28, + 5 => 29, + 6 => 30, + 7 => 31, + '=' => 32, + ); + + /** + * Creates an array from a binary string into a given chunk size + * + * @param string $binaryString String to chunk + * @param integer $bits Number of bits per chunk + * @return array + */ + private static function chunk($binaryString, $bits) + { + $binaryString = chunk_split($binaryString, $bits, ' '); + + if (substr($binaryString, (strlen($binaryString)) - 1) == ' ') { + $binaryString = substr($binaryString, 0, strlen($binaryString)-1); + } + + return explode(' ', $binaryString); + } + + /** + * Encodes into base32 + * + * @param string $string Clear text string + * @return string Base32 encoded string + */ + public static function encode($string) + { + if (strlen($string) == 0) { + // Gives an empty string + return ''; + } + + // Convert string to binary + $binaryString = ''; + + foreach (str_split($string) as $s) { + // Return each character as an 8-bit binary string + $s = decbin(ord($s)); + $binaryString .= str_pad($s, 8, 0, STR_PAD_LEFT); + } + + // Break into 5-bit chunks, then break that into an array + $binaryArray = self::chunk($binaryString, 5); + + // Pad array to be divisible by 8 + while (count($binaryArray) % 8 !== 0) { + $binaryArray[] = null; + } + + $base32String = ''; + + // Encode in base32 + foreach ($binaryArray as $bin) { + $char = 32; + + if (!is_null($bin)) { + // Pad the binary strings + $bin = str_pad($bin, 5, 0, STR_PAD_RIGHT); + $char = bindec($bin); + } + + // Base32 character + $base32String .= self::$encode[$char]; + } + + return $base32String; + } + + /** + * Decodes base32 + * + * @param string $base32String Base32 encoded string + * @return string Clear text string + */ + public static function decode($base32String) + { + if (strlen($base32String) == 0) { + // Gives an empty string + return ''; + } + + // Only work in upper cases + $base32String = strtoupper($base32String); + + // Remove anything that is not base32 alphabet + $pattern = '/[^A-Z2-7]/'; + $replacement = ''; + + $base32String = preg_replace($pattern, '', $base32String); + + $base32Array = str_split($base32String); + + $binaryArray = array(); + $string = ''; + + foreach ($base32Array as $str) { + $char = self::$decode[$str]; + + // Ignore the padding character + if ($char !== 32) { + $char = decbin($char); + $string .= str_pad($char, 5, 0, STR_PAD_LEFT); + } + } + + while (strlen($string) %8 !== 0) { + $string = substr($string, 0, strlen($string)-1); + } + + $binaryArray = self::chunk($string, 8); + + $realString = ''; + + foreach ($binaryArray as $bin) { + // Pad each value to 8 bits + $bin = str_pad($bin, 8, 0, STR_PAD_RIGHT); + // Convert binary strings to ascii + $realString .= chr(bindec($bin)); + } + + return $realString; + } +} + diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/providers/totp/hotp-php-master/LICENSE b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/providers/totp/hotp-php-master/LICENSE new file mode 100755 index 00000000..0b10fd2e --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/providers/totp/hotp-php-master/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2008, Jakob Heuser +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of HOTP-PHP nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY Jakob Heuser ''AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/providers/totp/hotp-php-master/README.markdown b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/providers/totp/hotp-php-master/README.markdown new file mode 100755 index 00000000..59b2b416 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/providers/totp/hotp-php-master/README.markdown @@ -0,0 +1,27 @@ +HOTP - PHP Based HMAC One Time Passwords +======================================== + +**What is HOTP**: +HOTP is a class that simplifies One Time Password systems for PHP Authentication. The HOTP/TOTP Algorithms have been around for a bit, so this is a straightforward class to meet the test vector requirements. + +**What works with HOTP/TOTP**: +It's been tested to the test vectors, and I've verified the time-sync hashes against the following: + +* Android: Mobile-OTP +* iPhone: OATH Token + +**Why would I use this**: +Who wouldn't love a simple drop-in class for HMAC Based One Time Passwords? It's a great extra layer of security (creating two-factor auth) and it's pretty darn zippy. + +**Okay you sold me. Give me some docs**: + +* $result = HOTP::generateByCounter($key, $counter); // event based +* $result = HOTP::generateByTime($key, $window); // time based within a "window" of time +* $result = HOTP::generateByTimeWindow($key, $window, $min, $max); // same as generateByTime, but for $min windows before and $max windows after + +with $result, you can do all sorts of neat things... + +* $result->toString(); +* $result->toHex(); +* $result->doDec(); +* $result->toHotp($length); // how many digits in your OTP? \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/providers/totp/hotp-php-master/example.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/providers/totp/hotp-php-master/example.php new file mode 100755 index 00000000..44c05753 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/providers/totp/hotp-php-master/example.php @@ -0,0 +1,160 @@ + array( + 0 => array( + 'HMAC' => 'cc93cf18508d94934c64b65d8ba7667fb7cde4b0', + 'hex' => '4c93cf18', + 'dec' => '1284755224', + 'hotp' => '755224', + ), + 1 => array( + 'HMAC' => '75a48a19d4cbe100644e8ac1397eea747a2d33ab', + 'hex' => '41397eea', + 'dec' => '1094287082', + 'hotp' => '287082', + ), + 2 => array( + 'HMAC' => '0bacb7fa082fef30782211938bc1c5e70416ff44', + 'hex' => '82fef30', + 'dec' => '137359152', + 'hotp' => '359152', + ), + 3 => array( + 'HMAC' => '66c28227d03a2d5529262ff016a1e6ef76557ece', + 'hex' => '66ef7655', + 'dec' => '1726969429', + 'hotp' => '969429', + ), + 4 => array( + 'HMAC' => 'a904c900a64b35909874b33e61c5938a8e15ed1c', + 'hex' => '61c5938a', + 'dec' => '1640338314', + 'hotp' => '338314', + ), + 5 => array( + 'HMAC' => 'a37e783d7b7233c083d4f62926c7a25f238d0316', + 'hex' => '33c083d4', + 'dec' => '868254676', + 'hotp' => '254676', + ), + 6 => array( + 'HMAC' => 'bc9cd28561042c83f219324d3c607256c03272ae', + 'hex' => '7256c032', + 'dec' => '1918287922', + 'hotp' => '287922', + ), + 7 => array( + 'HMAC' => 'a4fb960c0bc06e1eabb804e5b397cdc4b45596fa', + 'hex' => '4e5b397', + 'dec' => '82162583', + 'hotp' => '162583', + ), + 8 => array( + 'HMAC' => '1b3c89f65e6c9e883012052823443f048b4332db', + 'hex' => '2823443f', + 'dec' => '673399871', + 'hotp' => '399871', + ), + 9 => array( + 'HMAC' => '1637409809a679dc698207310c8c7fc07290d9e5', + 'hex' => '2679dc69', + 'dec' => '645520489', + 'hotp' => '520489', + ), + ), + 'TOTP' => array( + '59' => array( + 'totp' => '94287082', + ), + '1111111109' => array( + 'totp' => '07081804', + ), + '1111111111' => array( + 'totp' => '14050471', + ), + '1234567890' => array( + 'totp' => '89005924', + ), + '2000000000' => array( + 'totp' => '69279037', + ), + ), + ); + +echo <<
            +http://www.ietf.org/rfc/rfc4226.txt
            +http://tools.ietf.org/html/draft-mraihi-totp-timebased-06
            +
            +TEST VECTOR VERIFICATION
            +
            +HOTP Tests:
            +
            +DOCBLOCK;
            +  
            +echo "Count Method Value                                           Pass/Fail\n";
            +echo "----------------------------------------------------------------------\n";
            +
            +// loop over all HOTP table results, and calculate the matching value
            +foreach ($table['HOTP'] as $seed => $results) {
            +    $hotp = HOTP::generateByCounter($key, $seed);
            +    $first = true;
            +    foreach ($results as $type => $calc) {
            +        if ($first) {
            +            echo str_pad($seed, 4, ' ', STR_PAD_LEFT);
            +            $first = false;
            +        }
            +        else {
            +            echo '    ';
            +        }
            +        echo '  ';
            +        echo str_pad($type, 5, ' ', STR_PAD_RIGHT);
            +        echo '  ';
            +        echo str_pad($calc, 47, ' ', STR_PAD_RIGHT);
            +        echo '  ';
            +        $method = 'to'.(ucfirst(str_replace('HMAC', 'string', $type)));
            +        echo str_pad(($calc == $hotp->$method(6)) ? '[OK]' : '[FAIL]', 9, ' ', STR_PAD_LEFT);
            +        echo "\n";
            +    }
            +}
            +
            +echo << $results) {
            +    $totp = HOTP::generateByTime($key, 30, $seed);
            +    $first = true;
            +    foreach ($results as $type => $calc) {
            +        if ($first) {
            +            echo str_pad($seed, 10, ' ', STR_PAD_LEFT);
            +            $first = false;
            +        }
            +        else {
            +            echo '          ';
            +        }
            +        echo '   ';
            +        echo str_pad($calc, 47, ' ', STR_PAD_RIGHT);
            +        echo '  ';
            +        $method = 'to'.(ucfirst(str_replace('totp', 'hotp', $type)));
            +        echo str_pad(($calc == $totp->$method(8)) ? '[OK]' : '[FAIL]', 9, ' ', STR_PAD_LEFT);
            +        echo "\n";
            +    }
            +}
            +
            +echo '
            '; + diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/providers/totp/hotp-php-master/hotp.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/providers/totp/hotp-php-master/hotp.php new file mode 100755 index 00000000..090e7599 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/providers/totp/hotp-php-master/hotp.php @@ -0,0 +1,174 @@ += 0; $i--) { + $cur_counter[$i] = pack ('C*', $counter); + $counter = $counter >> 8; + } + + $bin_counter = implode($cur_counter); + + // Pad to 8 chars + if (strlen($bin_counter) < 8) { + $bin_counter = str_repeat (chr(0), 8 - strlen ($bin_counter)) . $bin_counter; + } + + // HMAC + $hash = hash_hmac('sha1', $bin_counter, $key); + + return new HOTPResult($hash); + } + + /** + * Generate a HOTP key based on a timestamp and window size + * @param string $key the key to use for hashing + * @param int $window the size of the window a key is valid for in seconds + * @param int $timestamp a timestamp to calculate for, defaults to time() + * @return HOTPResult a HOTP Result which can be truncated or output + */ + public static function generateByTime($key, $window, $timestamp = false) { + if (!$timestamp && $timestamp !== 0) { + $timestamp = HOTP::getTime(); + } + + $counter = intval($timestamp / $window); + + return HOTP::generateByCounter($key, $counter); + } + + /** + * Generate a HOTP key collection based on a timestamp and window size + * all keys that could exist between a start and end time will be included + * in the returned array + * @param string $key the key to use for hashing + * @param int $window the size of the window a key is valid for in seconds + * @param int $min the minimum window to accept before $timestamp + * @param int $max the maximum window to accept after $timestamp + * @param int $timestamp a timestamp to calculate for, defaults to time() + * @return array of HOTPResult + */ + public static function generateByTimeWindow($key, $window, $min = -1, $max = 1, $timestamp = false) { + if (!$timestamp && $timestamp !== 0) { + $timestamp = HOTP::getTime(); + } + + $counter = intval($timestamp / $window); + $window = range($min, $max); + + $out = array(); + for ($i = 0; $i < count($window); $i++) { + $shift_counter = $window[$i]; + $out[$shift_counter] = HOTP::generateByCounter($key, $counter + $shift_counter); + } + + return $out; + } + + /** + * Gets the current time + * Ensures we are operating in UTC for the entire framework + * Restores the timezone on exit. + * @return int the current time + */ + public static function getTime() { + return time(); // PHP's time is always UTC + } +} + +/** + * The HOTPResult Class converts an HOTP item to various forms + * Supported formats include hex, decimal, string, and HOTP + * @author Jakob Heuser (firstname)@felocity.com + */ +class HOTPResult { + protected $hash; + protected $binary; + protected $decimal; + + /** + * Build an HOTP Result + * @param string $value the value to construct with + */ + public function __construct($value) { + // store raw + $this->hash = $value; + } + + /** + * Returns the string version of the HOTP + * @return string + */ + public function toString() { + return $this->hash; + } + + /** + * Returns the hex version of the HOTP + * @return string + */ + public function toHex() { + if( !$this->hex ) + { + $this->hex = dechex($this->toDec()); + } + return $this->hex; + } + + /** + * Returns the decimal version of the HOTP + * @return int + */ + public function toDec() { + if( !$this->decimal ) + { + // store calculate decimal + $hmac_result = array(); + + // Convert to decimal + foreach(str_split($this->hash,2) as $hex) + { + $hmac_result[] = hexdec($hex); + } + + $offset = $hmac_result[19] & 0xf; + + $this->decimal = ( + (($hmac_result[$offset+0] & 0x7f) << 24 ) | + (($hmac_result[$offset+1] & 0xff) << 16 ) | + (($hmac_result[$offset+2] & 0xff) << 8 ) | + ($hmac_result[$offset+3] & 0xff) + ); + } + return $this->decimal; + } + + /** + * Returns the truncated decimal form of the HOTP + * @param int $length the length of the HOTP to return + * @return string + */ + public function toHOTP($length) { + $str = str_pad($this->toDec(), $length, "0", STR_PAD_LEFT); + $str = substr($str, (-1 * $length)); + return $str; + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/providers/totp/loader.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/providers/totp/loader.php new file mode 100755 index 00000000..b322ec6f --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/providers/totp/loader.php @@ -0,0 +1,1034 @@ +tfa = $tfa; + + $this->otp_helper = new HOTP(); + + add_action('plugins_loaded', array($this, 'plugins_loaded')); + + add_action('admin_init', array($this, 'admin_init')); + + if (!is_admin()) { + add_action('init', array($this, 'check_possible_reset')); + } + + // Potentially show off-sync message for hotp + add_action('admin_notices', array($this, 'tfa_show_hotp_off_sync_message')); + } + + /** + * Return whether or not this class detected and saved new settings + * + * @return Boolean + */ + public function were_settings_saved() { + return $this->settings_saved; + } + + /** + * Runs upon the WP action admin_init + */ + public function admin_init() { + + $this->check_possible_reset(); + + global $current_user; + + if (!empty($_REQUEST['_tfa_activate_nonce']) && !empty($_POST['tfa_enable_tfa']) && wp_verify_nonce($_REQUEST['_tfa_activate_nonce'], 'tfa_activate') && !empty($_GET['settings-updated'])) { + $this->tfa->change_tfa_enabled_status($current_user->ID, $_POST['tfa_enable_tfa']); + $this->settings_saved = true; + } + + if (!empty($_REQUEST['_tfa_algorithm_nonce']) && !empty($_POST['tfa_algorithm_type']) && !empty($_GET['settings-updated']) && wp_verify_nonce($_REQUEST['_tfa_algorithm_nonce'], 'tfa_algorithm')) { + + $old_algorithm = $this->get_user_otp_algorithm($current_user->ID); + + if ($old_algorithm != $_POST['tfa_algorithm_type']) { + $this->changeUserAlgorithmTo($current_user->ID, $_POST['tfa_algorithm_type']); + } + + $this->settings_saved = true; + } + + if (!empty($_GET['warning_button_clicked']) && !empty($_REQUEST['resyncnonce']) && wp_verify_nonce($_REQUEST['resyncnonce'], 'tfaresync')) { + delete_user_meta($current_user->ID, 'tfa_hotp_off_sync'); + } + + } + + /** + * Enqueue adding of JavaScript for footer + */ + public function add_footer() { + + static $added_footer = false; + if ($added_footer) return; + $added_footer = true; + + $qr_script_file = (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG) ? 'jquery-qrcode.js' : 'jquery-qrcode.min.js'; + + $qr_script_ver = (defined('WP_DEBUG') && WP_DEBUG) ? time() : filemtime($this->tfa->includes_dir()."/jquery-qrcode/$qr_script_file"); + + wp_register_script('jquery-qrcode', $this->tfa->includes_url()."/jquery-qrcode/$qr_script_file", array('jquery'), $qr_script_ver); + + $script_ver = (defined('WP_DEBUG') && WP_DEBUG) ? time() : filemtime($this->tfa->includes_dir()."/totp.js"); + + // Adds the necessary JavaScript for rendering and updating QR codes, and handling trusted devices removal in the admin area + wp_enqueue_script('simba-tfa-totp', $this->tfa->includes_url()."/totp.js", array('jquery-qrcode'), $script_ver); + + wp_localize_script('simba-tfa-totp', 'simbatfa_totp', $this->translation_strings()); + + } + + /** + * Get textual strings used from JavaScript + * + * @return Array + */ + private function translation_strings() { + + // It's possible that FORCE_ADMIN_SSL will make that SSL, whilst the user is on the front-end having logged in over non-SSL - and as a result, their login cookies won't get sent, and they're not registered as logged in. + $ajax_url = admin_url('admin-ajax.php'); + $also_try = ''; + if (!is_admin() && substr(strtolower($ajax_url), 0, 6) == 'https:' && !is_ssl()) { + $also_try = 'http:'.substr($ajax_url, 6); + } + + return apply_filters('simba_tfa_totp_translation_strings', array( + 'ajax_url' => $ajax_url, + 'updating' => __('Updating...', 'all-in-one-wp-security-and-firewall'), + 'tfa_shared_nonce' => wp_create_nonce('tfa_shared_nonce'), + 'also_try' => $also_try, + 'response' => __('Response:', 'all-in-one-wp-security-and-firewall'), + )); + } + + /** + * Return a link to refresh the current OTP code + * + * @return String + */ + public function refresh_current_otp_link() { + return ''.__('(update)', 'all-in-one-wp-security-and-firewall').''; + } + + /** + * Echo the radio buttons for changing between TOTP/HOTP + * + * TODO: Hide this choice on new installs (TOTP only) + * + * @param Integer $user_id + */ + protected function print_algorithm_choice_radios($user_id) { + if (!$user_id) return; + + $types = array( + 'totp' => __('TOTP (time based - most common algorithm; used by Google Authenticator)', 'all-in-one-wp-security-and-firewall'), + 'hotp' => __('HOTP (event based)', 'all-in-one-wp-security-and-firewall') + ); + + $setting = $this->get_user_otp_algorithm($user_id); + + foreach ($types as $id => $name) { + print '
            \n"; + } + } + + /** + * Print out the advanced settings box - choice of algorithm + * + * @param Boolean|Callable $submit_button_callback - if not a callback, then
            tags will be added + */ + public function advanced_settings_box($submit_button_callback = false) { + + global $current_user; + $algorithm_type = $this->get_user_otp_algorithm($current_user->ID); + + ?> +

            + +
            + + + + + + + +

            + print_algorithm_choice_radios($current_user->ID); + if ('hotp' == $algorithm_type) { + $counter = $this->getUserCounter($current_user->ID); + print '
            '.__('Your counter on the server is currently on', 'all-in-one-wp-security-and-firewall').': '.$counter; + } + ?> + +

            + '; } else { call_user_func($submit_button_callback); } ?> + +
            + ID; + $tfa_priv_key_64 = get_user_meta($user_id, 'tfa_priv_key_64', true); + if (!$tfa_priv_key_64) $tfa_priv_key_64 = $this->addPrivateKey($user_id); + $time_now = time(); + $refresh_after = 30 - ($time_now % 30); + return ''.$this->generateOTP($user_id, $tfa_priv_key_64).''; + } + + /** + * Runs upon the WP 'init' action - check for possible private key reset request from the user + */ + public function check_possible_reset() { + if (!empty($_GET['simbatfa_priv_key_reset']) && !empty($_REQUEST['nonce']) && wp_verify_nonce($_REQUEST['nonce'], 'simbatfa_reset_private_key')) { + $this->reset_private_key_and_emergency_codes(); + exit; + } + } + + /** + * Remove private key and emergency codes for the specified (or logged-in) user + * + * @param Boolean|Integer $user_id - WP user ID, or false for the currently logged-in user + * @param Boolean $redirect - if this is not false, then a redirection will occur - where to depends upon the value of $_REQUEST['noredirect'] + */ + public function reset_private_key_and_emergency_codes($user_id = false, $redirect = true) { + + if (!$user_id) { + global $current_user; + $user_id = $current_user->ID; + } + + delete_user_meta($user_id, 'tfa_priv_key_64'); + delete_user_meta($user_id, 'simba_tfa_emergency_codes_64'); + + if (!$redirect) return; + + if (empty($_REQUEST['noredirect'])) { + // TODO: Re-factoring + wp_safe_redirect(admin_url('admin.php').'?page='. $this->tfa->get_user_settings_page_slug() .'&settings-updated=1'); + } else { + $url = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . remove_query_arg(array('simbatfa_priv_key_reset', 'noredirect', 'nonce')); + wp_redirect(esc_url_raw($url)); + } + } + + /** + * Return HTML for a link to reset the current user's private key + * + * @return String + */ + public function reset_link() { + + // TODO: Refactoring + $url_base = is_admin() ? admin_url('admin.php').'?page='. $this->tfa->get_user_settings_page_slug() .'&settings-updated=1' : (( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST']); + + $add_query_args = array('simbatfa_priv_key_reset' => 1); + + if (!is_admin()) $add_query_args['noredirect'] = 1; + + $url = $url_base.add_query_arg($add_query_args); + + $url = wp_nonce_url($url, 'simbatfa_reset_private_key', 'nonce'); + + return ''.__('Reset private key', 'all-in-one-wp-security-and-firewall').''; + + } + + /** + * Output the current codes box + * + * @param Boolean|Integer $user_id + */ + public function current_codes_box($user_id = false) { + + global $current_user; + if (false == $user_id) $user_id = $current_user->ID; + + $admin = is_admin(); + + $this->add_footer(); + + $url = preg_replace('/^https?:\/\//i', '', site_url()); + + // TODO Replace this with an appropriate method + $tfa_priv_key_64 = get_user_meta($user_id, 'tfa_priv_key_64', true); + if (!$tfa_priv_key_64) $tfa_priv_key_64 = $this->addPrivateKey($user_id); + + $tfa_priv_key = trim($this->getPrivateKeyPlain($tfa_priv_key_64, $user_id), "\x00..\x1F"); + + $tfa_priv_key_32 = Base32::encode($tfa_priv_key); + + $algorithm_type = $this->get_user_otp_algorithm($user_id); + + if ($admin && $current_user->ID != $user_id) { + $user = get_user_by('id', $user_id); + $user_descrip = htmlspecialchars($user->user_nicename.' - '.$user->user_email); + echo '

            '.sprintf(__('Current codes (login: %s)', 'all-in-one-wp-security-and-firewall'), $user_descrip).'

            '; + } + + ?> +
            + + +

            + ID == $user_id) { echo $this->refresh_current_otp_link(); } ?> + +
            +

            current_otp_code($user_id); ?>

            +
            +

            + + +
            +

            + refresh_current_otp_link(); ?> : + + generateOTP($user_id, $tfa_priv_key_64); ?> + +

            +
            + + + + +

            + +

            + +

            + + +
            +

            + + + . +

            + + tfa_qr_code_url($algorithm_type, $url, $tfa_priv_key, $user_id); ?> +
            + +

            + print_private_keys('full', $user_id); + if ($current_user->ID == $user_id) { + echo $this->reset_link($admin); + } else { + echo ''.__('Reset private key', 'all-in-one-wp-security-and-firewall').''; + } + ?> +

            + + + +
            +

            + tfa->get_premium_version_url()).'">'.__('One-time emergency codes are a feature of the Premium version of this plugin.', 'all-in-one-wp-security-and-firewall').''; + echo apply_filters('simba_tfa_emergency_codes_user_settings', $default_text, $user_id); + ?> +
            + + +
            + +
            + ID; + + $tfa_priv_key_64 = get_user_meta($user_id, 'tfa_priv_key_64', true); + if (!$tfa_priv_key_64) $tfa_priv_key_64 = $this->addPrivateKey($user_id); + + $tfa_priv_key = trim($this->getPrivateKeyPlain($tfa_priv_key_64, $user_id), "\x00..\x1F"); + + $tfa_priv_key_32 = Base32::encode($tfa_priv_key); + + // The first (base32) private key used to have the description "base 32 - used by Google Authenticator and Authy", and the base64 version was just described as "private key". But basically the former is what everything uses. + //Private key: htmlspecialchars($tfa_priv_key) + if ('full' == $type) { + ?> + '.htmlspecialchars($tfa_priv_key_32); ?>
            + user_login).'?secret='.Base32::encode($tfa_priv_key).'&issuer='.$url.'&counter='.$this->getUserCounter($user->ID); + + return $encode; + } + + /** + * See if HOTP is off sync, and if show, print out a message + */ + public function tfa_show_hotp_off_sync_message() { + + global $current_user; + $is_off_sync = get_user_meta($current_user->ID, 'tfa_hotp_off_sync', true); + if (!$is_off_sync) return; + + ?> +
            +

            +

            + +
            + +

            + +

            +
            + + time_window_size = apply_filters('simbatfa_time_window_size', 30); + $this->check_back_time_windows = apply_filters('simbatfa_check_back_time_windows', 2); + $this->check_forward_time_windows = apply_filters('simbatfa_check_forward_time_windows', 1); + $this->check_forward_counter_window = apply_filters('simbatfa_check_forward_counter_window', 20); + + $this->salt_prefix = defined('AUTH_SALT') ? AUTH_SALT : wp_salt('auth'); + $this->pw_prefix = defined('AUTH_KEY') ? AUTH_KEY : get_site_option('auth_key'); + } + + /** + * Generate the current code for a specified user + * + * @param $user_id Integer - WordPress user ID + * + * @return String|Boolean - false if not set up + */ + public function get_current_code($user_id) { + + $tfa_priv_key_64 = get_user_meta($user_id, 'tfa_priv_key_64', true); + + if (!$tfa_priv_key_64) return false; + + return $this->generateOTP($user_id, $tfa_priv_key_64); + + } + + public function print_default_hmac_radios() { + + $setting = $this->tfa->get_option('tfa_default_hmac'); + if (!$setting) $setting = $this->default_hmac; + + $types = array('totp' => __('TOTP (time based - most common algorithm; used by Google Authenticator)', 'all-in-one-wp-security-and-firewall'), 'hotp' => __('HOTP (event based)', 'all-in-one-wp-security-and-firewall')); + + foreach ($types as $id => $name) { + print ' '.'
            \n"; + } + } + + public function generateOTP($user_ID, $key_b64, $length = 6, $counter = false) { + + $length = $length ? (int)$length : 6; + + $key = $this->decryptString($key_b64, $user_ID); + $alg = $this->get_user_otp_algorithm($user_ID); + + if ('hotp' == $alg) { + $db_counter = $this->getUserCounter($user_ID); + + $counter = $counter ? $counter : $db_counter; + $otp_res = $this->otp_helper->generateByCounter($key, $counter); + } else { + //time() is supposed to be UTC + $time = $counter ? $counter : time(); + $otp_res = $this->otp_helper->generateByTime($key, $this->time_window_size, $time); + } + $code = $otp_res->toHotp($length); + + return $code; + } + + /** + * Generate a list of OTP codes based on the user, key and time window + * + * @param Integer $user_ID - user ID + * @param String $key_b64 - the user's private key, in base64 format + * + * @return Array + */ + private function generate_otps_for_login_check($user_ID, $key_b64) { + $key = trim($this->decryptString($key_b64, $user_ID)); + $alg = $this->get_user_otp_algorithm($user_ID); + + if ('totp' == $alg) { + $otp_res = $this->otp_helper->generateByTimeWindow($key, $this->time_window_size, -1*$this->check_back_time_windows, $this->check_forward_time_windows); + } elseif ('hotp' == $alg) { + + $counter = $this->getUserCounter($user_ID); + + $otp_res = array(); + + for ($i = 0; $i < $this->check_forward_counter_window; $i++) { + $otp_res[] = $this->otp_helper->generateByCounter($key, $counter+$i); + } + } + return $otp_res; + } + + + /** + * Generate a private key for the user. + * + * @param Integer $user_id - WordPress user ID + * @param Boolean|String $key + * + * @return String + */ + public function addPrivateKey($user_id, $key = false) { + + // To work with Google Authenticator it has to be 10 bytes = 16 chars in base32 + $code = $key ? $key : strtoupper($this->randString(10)); + + // Encrypt the key + $code = $this->encryptString($code, $user_id); + + // Add private key to usermeta + update_user_meta($user_id, 'tfa_priv_key_64', $code); + + $alg = $this->get_user_otp_algorithm($user_id); + + // This hook is used for generation of emergency codes to accompany the key + do_action('simba_tfa_adding_private_key', $alg, $user_id, $code, $this); + + $this->changeUserAlgorithmTo($user_id, $alg); + + return $code; + } + + /** + * Port over keys that were encrypted with mcrypt and its non-compliant padding scheme, so that if the site is ever migrated to a server without mcrypt, they can still be decrypted + */ + public function potentially_port_private_keys() { + + $simba_tfa_priv_key_format = get_site_option('simba_tfa_priv_key_format', false); + + if ($simba_tfa_priv_key_format >= 1 || !function_exists('openssl_encrypt')) return; + + $attempts = 0; + $successes = 0; + + error_log("TFA: Beginning attempt to port private key encryption over to openssl"); + + global $wpdb; + + $sql = "SELECT user_id, meta_value FROM ".$wpdb->usermeta." WHERE meta_key = 'tfa_priv_key_64'"; + + $user_results = $wpdb->get_results($sql); + + foreach ($user_results as $u) { + $dec_openssl = $this->decryptString($u->meta_value, $u->user_id, true); + + $ported = false; + if ('' == $dec_openssl) { + + $attempts++; + + $dec_default = $this->decryptString($u->meta_value, $u->user_id); + + if ('' != $dec_default) { + + $enc = $this->encryptString($dec_default, $u->user_id); + + if ($enc) { + + $ported = true; + $successes++; + update_user_meta($u->user_id, 'tfa_priv_key_64', $enc); + } + } + + } + + if ($ported) { + error_log("TFA: Successfully ported the key for user with ID ".$u->user_id." over to openssl"); + } else { + error_log("TFA: Failed to port the key for user with ID ".$u->user_id." over to openssl"); + } + } + + if ($attempts == 0 || $successes > 0) update_site_option('simba_tfa_priv_key_format', 1); + + } + + /** + * This function will attempt to encrypt all the users private keys and emergency codes + * + * @return boolean|WP_Error - true on success or WP_Error on failure + */ + public function potentially_encrypt_private_keys() { + + error_log("TFA: Beginning attempt to encrypt private keys"); + + global $wpdb; + + $sql = "SELECT user_id, meta_value FROM ".$wpdb->usermeta." WHERE meta_key = 'tfa_priv_key_64' AND meta_value != ''"; + + $user_results = $wpdb->get_results($sql); + + if (null === $user_results) { + return new WP_Error( + 'failed_to_get_priv_keys', + __('Encrypt secrets feature not enabled: unable to get private keys from the database.', 'all-in-one-wp-security-and-firewall') + ); + } + + $number_ported = 0; + $number_failed = 0; + + foreach ($user_results as $u) { + $ported = false; + + $key = $this->decryptString($u->meta_value, $u->user_id); + $enc = $this->encryptString($key, $u->user_id, true); + + if ($enc) { + $ported = true; + update_user_meta($u->user_id, 'tfa_priv_key_64', $enc); + } + + $codes = get_user_meta($u->user_id, 'simba_tfa_emergency_codes_64', true); + if (!is_array($codes)) $codes = array(); + $enc_codes = array(); + + foreach ($codes as $code) { + $plain_code = $this->decryptString($code, $u->user_id); + $enc_codes[] = $this->encryptString($plain_code, $u->user_id, true); + } + + if (!empty($enc_codes)) update_user_meta($u->user_id, 'simba_tfa_emergency_codes_64', $enc_codes); + + if ($ported) { + $number_ported++; + } else { + $number_failed++; + error_log("TFA: Failed to encrypt the key for user with ID ".$u->user_id); + } + } + + error_log("TFA: Number of user keys successfully encrypted: ".$number_ported.", number which failed to encrypt: ".$number_failed); + + return true; + } + + public function getPrivateKeyPlain($enc, $user_ID) { + $dec = $this->decryptString($enc, $user_ID); + $this->potentially_port_private_keys(); + return $dec; + } + + /** + * @param Integer $user_id - WP user ID + * @param Boolean $generate_if_empty - generate some new codes if the list is empty + * + * @return String - human-usable codes, separated by ', ' (or a human-readable message, if there were none) + */ + public function get_emergency_codes_as_string($user_id, $generate_if_empty = false) { + + $codes = get_user_meta($user_id, 'simba_tfa_emergency_codes_64', true); + if (!is_array($codes)) $codes = array(); + + if ($generate_if_empty && empty($codes)) { + $tfa_priv_key = get_user_meta($user_id, 'tfa_priv_key_64', true); + $algorithm = get_user_meta($user_id, 'tfa_algorithm_type', true); + do_action('simba_tfa_emergency_codes_empty', $algorithm, $user_id, $tfa_priv_key, $this); + $codes = get_user_meta($user_id, 'simba_tfa_emergency_codes_64', true); + if (!is_array($codes)) $codes = array(); + } + + $emergency_str = ''; + + foreach ($codes as $p_code) { + $emergency_str .= $this->decryptString($p_code, $user_id).', '; + } + + $emergency_str = rtrim($emergency_str, ', '); + + $emergency_str = $emergency_str ? $emergency_str : ''.__('There are no emergency codes left. You will need to reset your private key to generate new ones.', 'all-in-one-wp-security-and-firewall').''; + + return $emergency_str; + } + + /** + * Check a code for a user (checks the code only - does not check activation status etc.) + * + * @param Integer $user_id - WP user ID + * @param String $user_code - the code to check + * @param Boolean $allow_emergency_code - whether to check against emergency codes + * + * @return Boolean + */ + public function check_code_for_user($user_id, $user_code, $allow_emergency_code = true) { + + $tfa_priv_key = get_user_meta($user_id, 'tfa_priv_key_64', true); + // $tfa_last_login = get_user_meta($user_id, 'tfa_last_login', true); // Unused + $tfa_last_pws_arr = get_user_meta($user_id, 'tfa_last_pws', true); + $tfa_last_pws = @$tfa_last_pws_arr ? $tfa_last_pws_arr : array(); + $alg = $this->get_user_otp_algorithm($user_id); + + $current_time_window = intval(time()/30); + + //Give the user 1,5 minutes time span to enter/retrieve the code + //Or check $this->check_forward_counter_window number of events if hotp + $codes = $this->generate_otps_for_login_check($user_id, $tfa_priv_key); + + //A recently used code was entered; that's not OK. + if (in_array($this->hash($user_code, $user_id), $tfa_last_pws)) return false; + + $match = false; + foreach ($codes as $index => $code) { + if (hash_equals(trim($code->toHotp(6)), trim($user_code))) { + $match = true; + $found_index = $index; + break; + } + } + + // Check emergency codes + if (!$match) { + $emergency_codes = $allow_emergency_code ? get_user_meta($user_id, 'simba_tfa_emergency_codes_64', true) : array(); + + if (!$emergency_codes) return $match; + + foreach ($emergency_codes as $key => $emergency_code) { + $dec = trim($this->decryptString(trim($emergency_code), $user_id)); + if (hash_equals($dec, trim($user_code))) { + $match = true; + // Remove emergency code + unset($emergency_codes[$key]); + break; + } + } + + // Update emergency codes array + if ($match) { + update_user_meta($user_id, 'simba_tfa_emergency_codes_64', $emergency_codes); + do_action('simba_tfa_emergency_code_used', $user_id, $emergency_codes); + } + + } else { + //Add the used code as well so it cant be used again + //Keep the two last codes + $tfa_last_pws[] = $this->hash($user_code, $user_id); + $nr_of_old_to_save = $alg == 'hotp' ? $this->check_forward_counter_window : $this->check_back_time_windows; + + if (count($tfa_last_pws) > $nr_of_old_to_save) array_splice($tfa_last_pws, 0, 1); + + update_user_meta($user_id, 'tfa_last_pws', $tfa_last_pws); + } + + if ($match) { + //Save the time window when the last successful login took place + update_user_meta($user_id, 'tfa_last_login', $current_time_window); + + //Update the counter if HOTP was used + if ($alg == 'hotp') { + $counter = $this->getUserCounter($user_id); + + $enc_new_counter = $this->encryptString($counter+1, $user_id); + update_user_meta($user_id, 'tfa_hotp_counter', $enc_new_counter); + + if ($found_index > 10) update_user_meta($user_id, 'tfa_hotp_off_sync', 1); + } + } + + return $match; + + } + + public function getUserCounter($user_ID) { + $enc_counter = get_user_meta($user_ID, 'tfa_hotp_counter', true); + return $enc_counter ? trim($this->decryptString(trim($enc_counter), $user_ID)) : ''; + } + + public function changeUserAlgorithmTo($user_id, $new_algorithm) { + update_user_meta($user_id, 'tfa_algorithm_type', $new_algorithm); + delete_user_meta($user_id, 'tfa_hotp_off_sync'); + + $counter_start = rand(13, 999999999); + $enc_counter_start = $this->encryptString($counter_start, $user_id); + + if ('hotp' == $new_algorithm) { + update_user_meta($user_id, 'tfa_hotp_counter', $enc_counter_start); + } else { + delete_user_meta($user_id, 'tfa_hotp_counter'); + } + } + + /** + * Whether HOTP or TOTP is being used + * + * @param Integer|Boolean $user_id - WordPress user ID, or false for the site-wide default + * + * @return String - 'hotp' or 'totp' + */ + public function get_user_otp_algorithm($user_id = false) { + + $setting = $user_id ? get_user_meta($user_id, 'tfa_algorithm_type', true) : false; + + $default_hmac = $this->tfa->get_option('tfa_default_hmac'); + if (!$default_hmac) $default_hmac = $this->default_hmac; + + return $setting ? $setting : $default_hmac; + } + + private function get_iv_size() { + // mcrypt first, for backwards compatibility + if (function_exists('mcrypt_get_iv_size')) { + return $GLOBALS['simba_two_factor_authentication']->is_mcrypt_deprecated() ? @mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC) : mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); + } elseif (function_exists('openssl_cipher_iv_length')) { + return openssl_cipher_iv_length('AES-128-CBC'); + } + throw new Exception('One of the mcrypt or openssl PHP modules needs to be installed'); + } + + private function encrypt($key, $string, $iv) { + // Prefer OpenSSL, because it uses correct padding, and its output can be decrypted by mcrypt - whereas, the converse is not true + if (function_exists('openssl_encrypt')) { + return openssl_encrypt($string, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv); + } elseif (function_exists('mcrypt_encrypt')) { + return $GLOBALS['simba_two_factor_authentication']->is_mcrypt_deprecated() ? @mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $string, MCRYPT_MODE_CBC, $iv) : mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $string, MCRYPT_MODE_CBC, $iv); + } + throw new Exception('One of the mcrypt or openssl PHP modules needs to be installed'); + } + + private function decrypt($key, $enc, $iv, $force_openssl = false) { + // Prefer mcrypt, because it can decrypt the output of both mcrypt_encrypt() and openssl_decrypt(), whereas (because of mcrypt_encrypt() using bad padding), the converse is not true + if (function_exists('mcrypt_decrypt') && !$force_openssl) { + return $GLOBALS['simba_two_factor_authentication']->is_mcrypt_deprecated() ? @mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $enc, MCRYPT_MODE_CBC, $iv) : mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $enc, MCRYPT_MODE_CBC, $iv); + } elseif (function_exists('openssl_decrypt')) { + $decrypted = openssl_decrypt($enc, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv); + if (false === $decrypted && !$force_openssl) { + $extra = function_exists('wp_debug_backtrace_summary') ? " backtrace: ".wp_debug_backtrace_summary() : ''; + error_log("TFA decryption failure: was your site migrated to a server without mcrypt? You may need to install mcrypt, or disable TFA, in order to successfully decrypt data that was previously encrypted with mcrypt.$extra"); + } + return $decrypted; + } + if ($force_openssl) return false; + throw new Exception('One of the mcrypt or openssl PHP modules needs to be installed'); + } + + public function encryptString($string, $salt_suffix, $force_encrypt = false) { + $key = ($this->tfa->get_option('tfa_encrypt_secrets') && defined('SIMBA_TFA_DB_ENCRYPTION_KEY')) ? base64_decode(SIMBA_TFA_DB_ENCRYPTION_KEY) : $this->hashAndBin($this->pw_prefix.$salt_suffix, $this->salt_prefix.$salt_suffix); + + if ($force_encrypt && defined('SIMBA_TFA_DB_ENCRYPTION_KEY')) $key = base64_decode(SIMBA_TFA_DB_ENCRYPTION_KEY); + + $iv_size = $this->get_iv_size(); + $iv = $GLOBALS['simba_two_factor_authentication']->random_bytes($iv_size); + + $enc = $this->encrypt($key, $string, $iv); + + if (false === $enc) return false; + + $enc = $iv.$enc; + $enc_b64 = base64_encode($enc); + return $enc_b64; + } + + private function decryptString($enc_b64, $salt_suffix, $force_openssl = false) { + $key = ($this->tfa->get_option('tfa_encrypt_secrets') && defined('SIMBA_TFA_DB_ENCRYPTION_KEY')) ? base64_decode(SIMBA_TFA_DB_ENCRYPTION_KEY) : $this->hashAndBin($this->pw_prefix.$salt_suffix, $this->salt_prefix.$salt_suffix); + + $iv_size = $this->get_iv_size(); + $enc_conc = bin2hex(base64_decode($enc_b64)); + + $iv = hex2bin(substr($enc_conc, 0, $iv_size*2)); + $enc = hex2bin(substr($enc_conc, $iv_size*2)); + + $string = $this->decrypt($key, $enc, $iv, $force_openssl); + + // Remove padding bytes + return rtrim($string, "\x00..\x1F"); + } + + private function hashAndBin($pw, $salt) { + $key = $this->hash($pw, $salt); + $key = pack('H*', $key); + // Yes: it's a null encryption key. See: https://wordpress.org/support/topic/warning-mcrypt_decrypt-key-of-size-0-not-supported-by-this-algorithm-only-k?replies=5#post-6806922 + // Basically: the original plugin had a bug here, which caused a null encryption key. This fails on PHP 5.6+. But, fixing it would break backwards compatibility for existing installs - and note that the only unknown once you have access to the encrypted data is the AUTH_SALT and AUTH_KEY constants... which means that actually the intended encryption was non-portable, + problematic if you lose your wp-config.php or try to migrate data to another site, or changes these values. (Normally changing these values only causes a compulsory re-log-in - but with the intended encryption in the original author's plugin, it'd actually cause a permanent lock-out until you disabled his plugin). If someone has read-access to the database, then it'd be reasonable to assume they have read-access to wp-config.php too: or at least, the number of attackers who can do one and not the other would be small. The "encryption's" not worth it. + // In summary: this isn't encryption, and is not intended to be. + return str_repeat(chr(0), 16); + } + + private function hash($pw, $salt) { + //$hash = hash_pbkdf2('sha256', $pw, $salt, 10); + //$hash = crypt($pw, '$5$'.$salt.'$'); + $hash = md5($salt.$pw); + return $hash; + } + + private function randString($len = 10) { + $chars = '23456789QWERTYUPASDFGHJKLZXCVBNM'; + $chars = str_split($chars); + shuffle($chars); + if (function_exists('random_int')) { + $code = ''; + for ($i = 1; $i <= $len; $i++) { + $code .= $chars[random_int(0, count($chars)-1)]; + } + } else { + $code = implode('', array_splice($chars, 0, $len)); + } + return $code; + } + +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/simba-tfa.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/simba-tfa.php new file mode 100755 index 00000000..4e0a8f0c --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/simba-tfa.php @@ -0,0 +1,1722 @@ +controllers[$provider_id] = new $class_name($this); + } + + // Process login form AJAX events + add_action('wp_ajax_nopriv_simbatfa-init-otp', array($this, 'tfaInitLogin')); + add_action('wp_ajax_simbatfa-init-otp', array($this, 'tfaInitLogin')); + + add_action('wp_ajax_simbatfa_shared_ajax', array($this, 'shared_ajax')); + + if (!class_exists('Simba_TFA_Login_Form_Integrations')) require_once($this->includes_dir().'/login-form-integrations.php'); + new Simba_TFA_Login_Form_Integrations($this); + + if (!class_exists('Simba_TFA_Encryption_Muplugin')) require_once($this->includes_dir().'/tfa-encryption-muplugin.php'); + $this->tfa_muplugin = new Simba_TFA_Encryption_Muplugin($this); + + // Add TFA column on admin users list + add_action('manage_users_columns', array($this, 'manage_users_columns_tfa')); + add_action('wpmu_users_columns', array($this, 'manage_users_columns_tfa')); + add_action('manage_users_custom_column', array($this, 'manage_users_custom_column_tfa'), 10, 3); + + // CSS for admin users screen + add_action('admin_print_styles-users.php', array($this, 'load_users_css'), 10, 0); + + add_action('admin_menu', array($this, 'admin_menu'), 9); + + add_action('admin_init', array($this, 'register_two_factor_auth_settings')); + add_action('init', array($this, 'init_parent')); + + if (!defined('TWO_FACTOR_DISABLE') || !TWO_FACTOR_DISABLE) { + + add_filter('application_password_did_authenticate', array($this, 'application_password_did_authenticate')); + + add_filter('authenticate', array($this, 'tfaVerifyCodeAndUser'), 99999999999, 3); + } + + add_action('show_user_profile', array($this, 'show_user_profile'), 1); + + add_action('enqueue_block_assets', array($this, 'enqueue_gutenberg_block_scripts')); + + add_filter('pre_update_option', array($this, 'setup_secret_encryption'), 10, 2); + + if (defined('DOING_AJAX') && DOING_AJAX && defined('WP_ADMIN') && WP_ADMIN && !empty($_REQUEST['action']) && 'simbatfa-init-otp' == $_REQUEST['action']) { + // Try to prevent PHP notices breaking the AJAX conversation + $this->output_buffering = true; + $this->logged = array(); + set_error_handler(array($this, 'get_php_errors'), E_ALL & ~E_STRICT); + ob_start(); + } + } + + /** + * Runs upon the WP action application_password_did_authenticate when a user successfully authenticates with an application password + * + * @param WP_User $user + */ + public function application_password_did_authenticate($user) { + + // This case is handled elsewhere + if (defined('XMLRPC_REQUEST') && XMLRPC_REQUEST) return; + + if (!in_array($user->ID, $this->application_passwords_authenticated)) { + $this->application_passwords_authenticated[] = $user->ID; + } + + } + + /** + * Runs upon the WP action show_user_profile + * + * @param WP_User $user - the user that the profile is for + */ + final public function show_user_profile($user) { + if ($user->ID !== get_current_user_id() || !$this->is_activated_for_user($user->ID)) return; + echo '

            '.__('Two Factor Authentication', 'all-in-one-wp-security-and-firewall').'

            '; + $settings_url = admin_url('admin.php').'?page='.$this->get_user_settings_page_slug(); + printf('%s', $settings_url, __('Go here for your two factor authentication settings...', 'all-in-one-wp-security-and-firewall')); + } + + /** + * Enqueues scripts for Gutenberg blocks. + * + * @return void + */ + public function enqueue_gutenberg_block_scripts() { + global $pagenow; + + if ($pagenow == 'post.php' || has_block('twofactor/user-settings')) { + $script_ver = (defined('WP_DEBUG') && WP_DEBUG) ? time() : filemtime($this->includes_dir() . '/gutenberg-blocks.js'); + wp_enqueue_script('twofactor-gutenberg-blocks', $this->includes_url() . '/gutenberg-blocks.js', array('wp-blocks', 'wp-element', 'wp-server-side-render'), $script_ver); + + wp_localize_script('twofactor-gutenberg-blocks', 'tfa_trans', + array( + 'block_title' => __('Two Factor Authentication Settings', 'two-factor-authentication'), + ) + ); + } + } + + /** + * This function is called via the filter `pre_update_option` if the option being saved is `tfa_encrypt_secrets` then we will proceed to setup the encryption + * + * @param mixed $value - the value of the option + * @param string $option_name - the option name + * + * @return mixed - returns 0 on error to prevent the feature from being turned on otherwise returns the value passed in + */ + public function setup_secret_encryption($value, $option_name) { + if ('tfa_encrypt_secrets' !== $option_name) return $value; + + if (!$this->tfa_muplugin->muplugin_exists() || !defined('SIMBA_TFA_DB_ENCRYPTION_KEY') || '' === SIMBA_TFA_DB_ENCRYPTION_KEY) { + $result = $this->tfa_muplugin->insert_contents(); + + if (is_wp_error($result)) { + add_settings_error('tfa_encrypt_secrets', $result->get_error_code(), $result->get_error_message()); + return 0; + } + + // We now need to include the file as it won't be loaded until WordPress refreshes but we want to use it now + include_once($this->tfa_muplugin->get_file_path()); + } + + $result = $this->get_controller('totp')->potentially_encrypt_private_keys(); + + if (is_wp_error($result)) { + add_settings_error('tfa_encrypt_secrets', $result->get_error_code(), $result->get_error_message()); + return 0; + } + + return $value; + } + + /** + * Runs upon the WP filter admin_menu + */ + final public function admin_menu() { + $this->get_controller('totp')->potentially_port_private_keys(); + } + + /** + * Give the filesystem path to the plugin's includes directory + * + * @return String + */ + public function includes_dir() { + return __DIR__.'/includes'; + } + + /** + * Give the URL for the plugin's includes directory + * + * @return String + */ + public function includes_url() { + return plugins_url('', __FILE__).'/includes'; + } + + /** + * Set URL slug for the plugin's option page. + * + * @param String Setting page URL slug. + * @return Void + */ + public function set_user_settings_page_slug($user_settings_page_slug) { + $this->user_settings_page_slug = $user_settings_page_slug; + } + + /** + * Get URL slug for the plugin's option page. + * + * @return String Setting page URL slug. + */ + public function get_user_settings_page_slug() { + return $this->user_settings_page_slug; + } + + /** + * Set settings page heading for plugin's option page + * + * @param String $settings_page_heading String. + * + * @return String + */ + public function set_settings_page_heading($settings_page_heading) { + $this->settings_page_heading = $settings_page_heading; + } + + /** + * Get settings page heading for plugin's option page. + * + * @return String Setting page heading. + */ + public function get_settings_page_heading() { + return $this->settings_page_heading; + } + + /** + * Set plugin translate url + * + * @param String $plugin_translate_url Plugin translation URL. + * @return Void + */ + public function set_plugin_translate_url($plugin_translate_url) { + $this->plugin_translate_url = $plugin_translate_url; + } + + /** + * Get plugin translate url + * + * @return String Plugin translate URL + */ + public function get_plugin_translate_url() { + return $this->plugin_translate_url; + } + + /** + * Set plugin premium version url + * + * @param String $premium_version_url Plugin premium version url. + * @return Void + */ + public function set_premium_version_url($premium_version_url) { + $this->premium_version_url = $premium_version_url; + } + + /** + * Get plugin premium version URL. + * + * @return String Plugin premium version URL. + */ + public function get_premium_version_url() { + return $this->premium_version_url; + } + + /** + * Set plugin FAQ URL + * + * @param String $faq_url Plugin FAQ URL. + * @return Void + */ + public function set_faq_url($faq_url) { + $this->faq_url = $faq_url; + } + + /** + * Get plugin FAQ URL. + * + * @return String Plugin FAQ URL. + */ + public function get_faq_url() { + return $this->faq_url; + } + + /** + * Set plugin site wide administration URL + * + * @param String $site_wide_administration_url Plugin site wide administration URL. + * @return Void + */ + public function set_site_wide_administration_url($site_wide_administration_url) { + $this->site_wide_administration_url = $site_wide_administration_url; + } + + /** + * Get plugin site wide administration URL. + * + * @return String Plugin site wide administration URL + */ + public function get_site_wide_administration_url() { + return $this->site_wide_administration_url; + } + + /** + * Give the filesystem path to the plugin's templates directory + * + * @return String + */ + public function templates_dir() { + return __DIR__.'/templates'; + } + + /** + * Include the user settings page code + */ + public function show_dashboard_user_settings_page() { + $this->include_template('user-settings.php'); + } + + /** + * Enqueue CSS styling on the users page + */ + public function load_users_css() { + $css_version = (defined('WP_DEBUG') && WP_DEBUG) ? time() : filemtime($this->includes_dir().'/users.css'); + wp_enqueue_style( + 'tfa-users-css', + $this->includes_url().'/users.css', + array(), + $css_version, + 'screen' + ); + } + + /** + * Add the 2FA label to the users list table header. + * + * @param Array $columns Table columns. + * + * @return Array + */ + public function manage_users_columns_tfa($columns = array()) { + $columns['tfa-status'] = __('2FA', 'all-in-one-wp-security-and-firewall'); + return $columns; + } + + /** + * Add status into TFA column. + * + * @param String $value String. + * @param String $column_name Column name. + * @param Integer $user_id User ID. + * + * @return String + */ + public function manage_users_custom_column_tfa($value = '', $column_name = '', $user_id = 0) { + + // Only for this column name. + if ('tfa-status' === $column_name) { + + if (!$this->is_activated_for_user($user_id)) { + $value = '—'; + } elseif ($this->is_activated_by_user($user_id)) { + // Use value. + $value = ''; + } else { + // No group. + $value = ''; + } + } + + return $value; + } + + /** + * Paint out an admin notice + * + * @param String $message - the caller should already have taken care of any escaping + * @param String $class + */ + public function show_admin_warning($message, $class = 'updated') { + echo '
            '."

            $message

            "; + } + + /** + * Returns all two factor authentication setting name => group pairs. + * + * @return Array + */ + private function get_config_keys() { + global $wp_roles; + + if (!isset($wp_roles)) $wp_roles = new WP_Roles(); + + $keys = array( + 'tfa_requireafter' => 'tfa_user_roles_required_group', + 'tfa_require_enforce_after' => 'tfa_user_roles_required_group', + 'tfa_if_required_redirect_to' => 'tfa_user_roles_required_group', + 'tfa_hide_turn_off' => 'tfa_user_roles_required_group', + 'tfa_trusted_for' => 'tfa_user_roles_trusted_group', + 'tfa_wc_add_section' => 'simba_tfa_woocommerce_group', + 'tfa_bot_protection' => 'simba_tfa_woocommerce_group', + 'tfa_default_hmac' => 'simba_tfa_default_hmac_group', + 'tfa_encrypt_secrets' => 'simba_tfa_encrypt_secrets_group', + 'tfa_xmlrpc_on' => 'tfa_xmlrpc_status_group', + ); + + foreach ($wp_roles->role_names as $id => $name) { + $keys['tfa_'.$id] = 'tfa_user_roles_group'; + $keys['tfa_trusted_'.$id] = 'tfa_user_roles_trusted_group'; + $keys['tfa_required_'.$id] = 'tfa_user_roles_required_group'; + } + + if (is_multisite()) { + $keys['tfa__super_admin'] = 'tfa_user_roles_group'; + $keys['tfa_trusted__super_admin'] = 'tfa_user_roles_trusted_group'; + $keys['tfa_required__super_admin'] = 'tfa_user_roles_required_group'; + } + + return $keys; + } + + /** + * Registers all two factor authentication settings. Runs upon the WP action admin_init. + */ + public function register_two_factor_auth_settings() { + $config_keys = $this->get_config_keys(); + + foreach ($config_keys as $name => $group) { + register_setting($group, $name); + } + } + + /** + * Returns all two factor authentication options from the WP database. + * + * @return Array + */ + public function get_configs() { + $config_keys = $this->get_config_keys(); + + $configs = array(); + + foreach (array_keys($config_keys) as $name) { + if (false !== $this->get_option($name)) { + $configs[$name] = $this->get_option($name); + } + } + + return $configs; + } + + /** + * Sets two factor authentication options from array. + * + * @param Array $configs + * + * @return Boolean + */ + public function set_configs($configs) { + $result = false; + + foreach ($configs as $key => $value) { + $result = $this->update_option($key, $value) ? true : $result; + } + + return $result; + } + + /** + * Deletes all two factor authentication options from the WP database. + * + * @return Void + */ + public function delete_configs() { + $config_keys = $this->get_config_keys(); + + foreach (array_keys($config_keys) as $name) { + $this->delete_option($name); + } + } + + /** + * See whether TFA is available or not for a particular user - i.e. whether the administrator has permitted it for their user level + * + * @param Integer $user_id - WordPress user ID + * + * @return Boolean + */ + public function is_activated_for_user($user_id) { + + if (empty($user_id)) return false; + + // Super admin is not a role (they are admins with an extra attribute); needs separate handling + if (is_multisite() && is_super_admin($user_id)) { + // This is always a final decision - we don't want it to drop through to the 'admin' role's setting + $role = '_super_admin'; + $db_val = $this->get_option('tfa_'.$role); + // Defaults to true if no setting has been saved + return (false === $db_val || $db_val) ? true : false; + } + + $roles = $this->get_user_roles($user_id); + + // N.B. This populates with roles on the current site within a multisite + foreach ($roles as $role) { + $db_val = $this->get_option('tfa_'.$role); + if (false === $db_val || $db_val) return true; + } + + return false; + + } + + /** + * Get all user roles for a given user (if on multisite, amalgamates all roles from all sites) + * + * @param Integer $user_id - WordPress user ID + * + * @return Array + */ + protected function get_user_roles($user_id) { + + // Get roles on the main site + $user = new WP_User($user_id); + $roles = (array) $user->roles; + + // On multisite, also check roles on non-main sites + if (is_multisite()) { + global $wpdb, $table_prefix; + $roles_db = $wpdb->get_results($wpdb->prepare("SELECT meta_key, meta_value FROM {$wpdb->usermeta} WHERE user_id=%d AND meta_key LIKE '".esc_sql($table_prefix)."%_capabilities'", $user_id)); + if (is_array($roles_db)) { + foreach ($roles_db as $role_info) { + if (empty($role_info->meta_key) || !preg_match('/^'.$table_prefix.'\d+_capabilities$/', $role_info->meta_key) || empty($role_info->meta_value) || !preg_match('/^a:/', $role_info->meta_value)) continue; + $site_roles = $this->unserialize($role_info->meta_value); + if (!is_array($site_roles)) continue; + foreach ($site_roles as $role => $active) { + if ($active && !in_array($role, $roles)) $roles[] = $role; + } + } + } + } + + return $roles; + } + + /** + * Check if TFA is required for a specified user + * + * N.B. - This doesn't check is_activated_for_user() - the caller would normally want to do that first + * + * @param $user_id Integer - the WP user ID + * + * @return Boolean + */ + public function is_required_for_user($user_id) { + return apply_filters('simba_tfa_required_for_user', $this->user_property_active($user_id, 'required_'), $user_id); + } + + /** + * See if a particular user property is active + * + * @param Integer $user_id + * @param String $prefix - e.g. "required_", "trusted_" + * + * @return Boolean + */ + public function user_property_active($user_id, $prefix = 'required_') { + + if (empty($user_id)) return false; + + // Super admin is not a role (they are admins with an extra attribute); needs separate handling + if (is_multisite() && is_super_admin($user_id)) { + // This is always a final decision - we don't want it to drop through to the 'admin' role's setting + $role = '_super_admin'; + $db_val = $this->get_option('tfa_'.$prefix.$role); + return $db_val ? true : false; + } + + $roles = $this->get_user_roles($user_id); + + foreach ($roles as $role) { + $db_val = $this->get_option('tfa_'.$prefix.$role); + if ($db_val) return true; + } + + return false; + + } + + /** + * Whether TFA is activated by a specific user. Note that this doesn't check if TFA is enabled for the user's role; the caller should check that first. + * + * @param Integer $user_id + * + * @return Boolean + */ + public function is_activated_by_user($user_id) { + $enabled = get_user_meta($user_id, 'tfa_enable_tfa', true); + return !empty($enabled); + } + + /** + * Get a list of trusted devices for the user + * + * @param Integer|Boolean $user_id - WordPress user ID, or false for the current user + * + * @return Array + */ + public function user_get_trusted_devices($user_id = false) { + + if (false === $user_id) { + global $current_user; + $user_id = $current_user->ID; + } + + $trusted_devices = get_user_meta($user_id, 'tfa_trusted_devices', true); + + if (!is_array($trusted_devices)) $trusted_devices = array(); + + return $trusted_devices; + } + + /** + * Trust the current device + * + * @param Integer $user_id - WordPress user ID + * @param Integer $trusted_for - time to trust for, in days + */ + public function trust_device($user_id, $trusted_for) { + + $trusted_devices = $this->user_get_trusted_devices($user_id); + + $time_now = time(); + + foreach ($trusted_devices as $k => $device) { + if (empty($device['until']) || $device['until'] <= $time_now) unset($trusted_devices[$k]); + } + + $until = $time_now + $trusted_for * 86400; + + $token = bin2hex($this->random_bytes(40)); + + $trusted_devices[] = array( + 'ip' => $_SERVER['REMOTE_ADDR'], + 'until' => $until, + 'user_agent' => empty($_SERVER['HTTP_USER_AGENT']) ? '' : (string) $_SERVER['HTTP_USER_AGENT'], + 'token' => $token + ); + + $this->user_set_trusted_devices($user_id, $trusted_devices); + + $this->set_cookie('simbatfa_trust_token', $token, $until); + } + + /** + * Returns true if running on a PHP version on which mcrypt has been deprecated + * + * @return Boolean + */ + public function is_mcrypt_deprecated() { + return (7 == PHP_MAJOR_VERSION && PHP_MINOR_VERSION >= 1); + } + + /** + * Return the specified number of bytes + * + * @param Integer $bytes + * + * @throws Exception + * + * @return String + */ + public function random_bytes($bytes) { + if (function_exists('random_bytes')) { + return random_bytes($bytes); + } elseif (function_exists('mcrypt_create_iv')) { + return $this->is_mcrypt_deprecated() ? @mcrypt_create_iv($bytes, MCRYPT_RAND) : mcrypt_create_iv($bytes, MCRYPT_RAND); + } elseif (function_exists('openssl_random_pseudo_bytes')) { + return openssl_random_pseudo_bytes($bytes); + } + throw new Exception('One of the mcrypt or openssl PHP modules needs to be installed'); + } + + /** + * Set a cookie so that, however we logged in, it can be found + * + * @param String $name - the cookie name + * @param String $value - the cookie value + * @param Integer $expires - when the cookie expires, in epoch time. Defaults to 24 hours' time. Values in the past cause cookie deletion. + */ + protected function set_cookie($name, $value, $expires = null) { + if (null === $expires) $expires = time() + 86400; + $secure = is_ssl(); + $secure_logged_in_cookie = ($secure && 'https' === parse_url(get_option('home'), PHP_URL_SCHEME)); + $secure = apply_filters('secure_auth_cookie', $secure, get_current_user_id()); + $secure_logged_in_cookie = apply_filters('secure_logged_in_cookie', $secure_logged_in_cookie, get_current_user_id(), $secure); + + setcookie($name, $value, $expires, ADMIN_COOKIE_PATH, COOKIE_DOMAIN, $secure, true); + setcookie($name, $value, $expires, COOKIEPATH, COOKIE_DOMAIN, $secure_logged_in_cookie, true); + if (COOKIEPATH != SITECOOKIEPATH) { + setcookie($name, $value, $expires, SITECOOKIEPATH, COOKIE_DOMAIN, $secure_logged_in_cookie, true); + } + } + + /** + * Get a list of trusted devices for the user + * + * @param Integer $user_id - WordPress user ID + * @param Array $trusted_devices - the list of devices + */ + public function user_set_trusted_devices($user_id, $trusted_devices) { + update_user_meta($user_id, 'tfa_trusted_devices', $trusted_devices); + } + + /** + * Get the user capability needed for managing TFA users. + * You'll want to think carefully about changing this to a non-admin, as it can give the ability to lock admins out (though, if you have FTP/files access, you can always disable TFA or any plugin) + * + * @return String + */ + public function get_management_capability() { + return apply_filters('simba_tfa_management_capability', 'manage_options'); + } + + /** + * Used with set_error_handler() + * + * @param Integer $errno + * @param String $errstr + * @param String $errfile + * @param Integer $errline + * + * @return Boolean + */ + final public function get_php_errors($errno, $errstr, $errfile, $errline) { + if (0 == error_reporting()) return true; + $logline = $this->php_error_to_logline($errno, $errstr, $errfile, $errline); + $this->logged[] = $logline; + # Don't pass it up the chain (since it's going to be output to the user always) + return true; + } + + public function php_error_to_logline($errno, $errstr, $errfile, $errline) { + switch ($errno) { + case 1: $e_type = 'E_ERROR'; break; + case 2: $e_type = 'E_WARNING'; break; + case 4: $e_type = 'E_PARSE'; break; + case 8: $e_type = 'E_NOTICE'; break; + case 16: $e_type = 'E_CORE_ERROR'; break; + case 32: $e_type = 'E_CORE_WARNING'; break; + case 64: $e_type = 'E_COMPILE_ERROR'; break; + case 128: $e_type = 'E_COMPILE_WARNING'; break; + case 256: $e_type = 'E_USER_ERROR'; break; + case 512: $e_type = 'E_USER_WARNING'; break; + case 1024: $e_type = 'E_USER_NOTICE'; break; + case 2048: $e_type = 'E_STRICT'; break; + case 4096: $e_type = 'E_RECOVERABLE_ERROR'; break; + case 8192: $e_type = 'E_DEPRECATED'; break; + case 16384: $e_type = 'E_USER_DEPRECATED'; break; + case 30719: $e_type = 'E_ALL'; break; + default: $e_type = "E_UNKNOWN ($errno)"; break; + } + + if (!is_string($errstr)) $errstr = serialize($errstr); + + if (0 === strpos($errfile, ABSPATH)) $errfile = substr($errfile, strlen(ABSPATH)); + + return "PHP event: code $e_type: $errstr (line $errline, $errfile)"; + + } + + /** + * Runs upon the WordPress 'init' action. + */ + final public function init_parent() { + if ((!is_admin() || (defined('DOING_AJAX') && DOING_AJAX)) && is_user_logged_in() && file_exists($this->includes_dir().'/tfa_frontend.php')) { + $this->load_frontend(); + } else { + add_shortcode('twofactor_user_settings', array($this, 'shortcode_when_not_logged_in')); + } + } + + /** + * Return the TOTP provider object. + * + * @param String $controller_id - which controller + * + * @return Simba_TFA_Provider_totp + */ + public function get_controller($controller_id = 'totp') { + return $this->controllers[$controller_id]; + } + + /** + * Return all OTP controllers + * + * @return Array + */ + public function get_controllers() { + return $this->controllers; + } + + /** + * Deprecated synonym for get_controller('totp') + * + * @return Simba_TFA_Provider_totp + */ + public function get_totp_controller() { + trigger_error("Deprecated: Call get_controller('totp'), not get_totp_controller()", E_USER_WARNING); + return $this->get_controller('totp'); + } + + /** + * "Shared" - i.e. could be called from either front-end or back-end + */ + final public function shared_ajax() { + + if (empty($_POST['subaction']) || empty($_POST['nonce']) || !is_user_logged_in() || !wp_verify_nonce($_POST['nonce'], 'tfa_shared_nonce')) die('Security check (3).'); + + global $current_user; + + $subaction = $_POST['subaction']; + + if ('refreshotp' == $subaction) { + + $code = $this->get_controller('totp')->get_current_code($current_user->ID); + + if (false === $code) die(json_encode(array('code' => ''))); + + die(json_encode(array('code' => $code))); + + } elseif ('untrust_device' == $subaction && isset($_POST['device_id'])) { + $this->untrust_device(stripslashes($_POST['device_id'])); + ob_start(); + $this->include_template('trusted-devices-inner-box.php', array('trusted_devices' => $this->user_get_trusted_devices())); + echo json_encode(array('trusted_list' => ob_get_clean())); + } + + exit; + + } + + /** + * Mark a device as untrusted for the current user + * + * @param String $device_id + */ + protected function untrust_device($device_id) { + + $trusted_devices = $this->user_get_trusted_devices(); + + unset($trusted_devices[$device_id]); + + global $current_user; + $current_user_id = $current_user->ID; + + $this->user_set_trusted_devices($current_user_id, $trusted_devices); + + } + + /** + * Called upon the AJAX action simbatfa-init-otp . Will die. + * + * Uses these keys from $_POST: user + */ + public function tfaInitLogin() { + + if (empty($_POST['user'])) die('Security check (2).'); + + if (defined('TWO_FACTOR_DISABLE') && TWO_FACTOR_DISABLE) { + $res = array('result' => false, 'user_can_trust' => false); + } else { + + if (!function_exists('sanitize_user')) require_once ABSPATH.WPINC.'/formatting.php'; + + // WP's password-checking sanitizes the supplied user, so we must do the same to check if TFA is enabled for them + $auth_info = array('log' => sanitize_user(stripslashes((string)$_POST['user']))); + + if (!empty($_COOKIE['simbatfa_trust_token'])) $auth_info['trust_token'] = (string) $_COOKIE['simbatfa_trust_token']; + + $res = $this->pre_auth($auth_info, 'array'); + } + + $results = array( + 'jsonstarter' => 'justhere', + 'status' => $res['result'], + ); + + if (!empty($res['user_can_trust'])) { + $results['user_can_trust'] = 1; + if (!empty($res['user_already_trusted'])) $results['user_already_trusted'] = 1; + } + + + if (!empty($this->output_buffering)) { + if (!empty($this->logged)) { + $results['php_output'] = $this->logged; + } + restore_error_handler(); + $buffered = ob_get_clean(); + if ($buffered) $results['extra_output'] = $buffered; + } + + $results = apply_filters('simbatfa_check_tfa_requirements_ajax_response', $results); + + echo json_encode($results); + + exit; + } + + /** + * Enable or disable TFA for a user + * + * @param Integer $user_id - the WordPress user ID + * @param String $setting - either "true" (to turn on) or "false" (to turn off) + */ + public function change_tfa_enabled_status($user_id, $setting) { + $previously_enabled = $this->is_activated_by_user($user_id) ? 1 : 0; + $setting = ('true' === $setting) ? 1 : 0; + update_user_meta($user_id, 'tfa_enable_tfa', $setting); + do_action('simba_tfa_activation_status_saved', $user_id, $setting, $previously_enabled, $this); + } + + /** + * Here's where the login action happens. Called on the WP 'authenticate' action (which also happens when wp-login.php loads, so parameters need checking). + * + * @param WP_Error|WP_User $user + * @param String $username - this is not necessarily the WP username; it is whatever was typed in the form, so can be an email address + * @param String $password + * + * @return WP_Error|WP_User + */ + public function tfaVerifyCodeAndUser($user, $username, $password) { + + // Do not require a TFA code when authenticating via cookie (or other non-login-form mechanism) + if ('' === $username && is_multisite()) return $user; + + // When both the AIOWPS and Two Factor Authentication plugins are active, this function is called more than once; that should be short-circuited. + if (isset(self::$is_authenticated[$this->authentication_slug]) && self::$is_authenticated[$this->authentication_slug]) { + return $user; + } + + if (is_a($user, 'WP_User') && !empty($user->ID)) { + if (in_array($user->ID, $this->application_passwords_authenticated)) { + // User authenticated via an application password (and thus - see wp_authenticate_application_password - via an API request). Do not require a TFA code. + return $user; + } + } + + $original_user = $user; + $params = stripslashes_deep($_POST); + + // If (only) the error was a wrong password, but it looks like the user appended a TFA code to their password, then have another go + if (is_wp_error($user) && array('incorrect_password') == $user->get_error_codes() && !isset($params['two_factor_code']) && false !== ($from_password = apply_filters('simba_tfa_tfa_from_password', false, $password))) { + // This forces a new password authentication below + $user = false; + } + + if (is_wp_error($user)) { + $ret = $user; + } else { + + if (is_object($user) && isset($user->ID) && isset($user->user_login)) { + $params['log'] = $user->user_login; + // Confirm that this is definitely a username regardless of its format + $may_be_email = false; + } else { + $params['log'] = $username; + $may_be_email = true; + } + + $params['caller'] = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['REQUEST_URI']; + if (!empty($_COOKIE['simbatfa_trust_token'])) $params['trust_token'] = (string) $_COOKIE['simbatfa_trust_token']; + + if (isset($from_password) && false !== $from_password) { + // Support login forms that can't be hooked via appending to the password + $speculatively_try_appendage = true; + $params['two_factor_code'] = $from_password['tfa_code']; + } + + $code_ok = $this->authorise_user_from_login($params, $may_be_email); + + if (is_wp_error($code_ok)) { + $ret = $code_ok; + } elseif (!$code_ok) { + $encryption_enabled = $this->get_option('tfa_encrypt_secrets'); + $additional = ($encryption_enabled && (!defined('SIMBA_TFA_DB_ENCRYPTION_KEY') || '' === SIMBA_TFA_DB_ENCRYPTION_KEY)) ? ' ' . htmlspecialchars(__('The "encrypt secrets" feature is currently enabled, but no encryption key has been found (set via the SIMBA_TFA_DB_ENCRYPTION_KEY constant).', 'all-in-one-wp-security-and-firewall').' '.__('This indicates that either setup failed, or your WordPress installation has been corrupted.', 'all-in-one-wp-security-and-firewall')) . ' '. __('Go here for the FAQs, which explain how a website owner can de-activate the plugin without needing to login.', 'all-in-one-wp-security-and-firewall') .'' : ''; + $ret = new WP_Error('authentication_failed', ''.__('Error:', 'all-in-one-wp-security-and-firewall').' '.apply_filters('simba_tfa_message_code_incorrect', __('The one-time password (TFA code) you entered was incorrect.', 'all-in-one-wp-security-and-firewall') . $additional)); + if (is_a($user, 'WP_User')) $this->log_incorrect_tfa_code_attempt($user); + } elseif ($user) { + $ret = $user; + } else { + + if (!empty($speculatively_try_appendage) && true === $code_ok) { + $password = $from_password['password']; + } + + $username_is_email = false; + + if (function_exists('wp_authenticate_username_password') && $may_be_email && filter_var($username, FILTER_VALIDATE_EMAIL)) { + global $wpdb; + // This has to match self::authorise_user_from_login() + $response = $wpdb->get_row($wpdb->prepare("SELECT ID, user_registered from ".$wpdb->users." WHERE user_email=%s", $username)); + if (is_object($response)) $username_is_email = true; + } + + $ret = $username_is_email ? wp_authenticate_email_password(null, $username, $password) : wp_authenticate_username_password(null, $username, $password); + } + + } + + $ret = apply_filters('simbatfa_verify_code_and_user_result', $ret, $original_user, $username, $password); + + // If the TFA code was actually validated (not just not required, for example), then $code_ok is (boolean)true + if (isset($code_ok) && true === $code_ok && is_a($ret, 'WP_User')) { + // Though $_SERVER['SERVER_NAME'] can't always be trusted (if the webserver is misconfigured), anyone using this already has password and TFA clearance. + if (!empty($params['simba_tfa_mark_as_trusted']) && $this->user_can_trust($ret->ID) && (is_ssl() || (!empty($_SERVER['SERVER_NAME']) && ('localhost' == $_SERVER['SERVER_NAME'] ||'127.0.0.1' == $_SERVER['SERVER_NAME'] || preg_match('/\.localdomain$/', $_SERVER['SERVER_NAME']))))) { + + $trusted_for = $this->get_option('tfa_trusted_for'); + $trusted_for = (false === $trusted_for) ? 30 : (string) absint($trusted_for); + + $this->trust_device($ret->ID, $trusted_for); + } + } + + self::$is_authenticated[$this->authentication_slug] = true; + + return $ret; + } + + /** + * Save incorrect TFA code attempts in database + * + * @param Array $tfa_incorrect_code_attempts - all user info with incorrect code attempts + * @param Boolean $update - update in option table + * + * @return Void + */ + private function save_incorrect_tfa_code_attempts($tfa_incorrect_code_attempts, $update = false) { + if ($update) { + update_site_option('tfa_incorrect_code_attempts', $tfa_incorrect_code_attempts); + } else { + add_site_option('tfa_incorrect_code_attempts', $tfa_incorrect_code_attempts); + } + } + + /** + * Remove old incorrect TFA code attempts + * + * @param Array $user_info - user invalid attempts + * + * @return Array + */ + private function remove_incorrect_tfa_code_old_attempts($user_info) { + $splice_recs = 0; + foreach ($user_info['attempts'] as $attempt) { + $mins_diff = (time() - $attempt['activity_time']) / 60; + if ($mins_diff >= TFA_INCORRECT_ATTEMPTS_WITHIN_MINUTES_LIMIT) { + $splice_recs++; + } + } + if ($splice_recs > 0) { + array_splice($user_info['attempts'], 0, $splice_recs); // remove all older attempts. + } + return $user_info; + } + + /** + * Log incorrect TFA code attempt and email user if attempt exceeded limit + * + * @param WP_User $user - user object for the user logging in + * + * @return Void + */ + private function log_incorrect_tfa_code_attempt($user) { + $tfa_incorrect_code_attempts = get_site_option('tfa_incorrect_code_attempts'); + if (empty($tfa_incorrect_code_attempts)) $tfa_incorrect_code_attempts = array(); + $userinfo_added = false; + $update = false; + if (count($tfa_incorrect_code_attempts) > 0) { + foreach ($tfa_incorrect_code_attempts as $i => $user_info) { + $user_info = $this->remove_incorrect_tfa_code_old_attempts($user_info); // remove old (before 30 mins) incorrect tfa code attempts by users + if (empty($user_info['attempts'])) { + unset($tfa_incorrect_code_attempts[$i]); + continue; + } + if ($user_info['user_id'] == $user->ID) { + $userinfo_added = true; + if (count($user_info['attempts']) >= TFA_INCORRECT_MAX_ATTEMPTS_ALLOWED_LIMIT && empty($user_info['mailsent'])) { + $this->notify_incorrect_tfa_code_attempts($user_info, $user->user_email); // if incorrect tfa attempts are more than max allowed notify user by email that some one else has your password. + $user_info['mailsent'] = 1; + } else { + if (0 == count($user_info['attempts'])) $user_info['mailsent'] = 0; + $user_info['attempts'][] = $this->get_incorrect_tfa_attempt_info(); //add new incorrect attempt for existing user. + } + } + $tfa_incorrect_code_attempts[$i] = $user_info; + } + $update = true; + } + if (false == $userinfo_added) { + $tfa_incorrect_code_attempts[] = $this->get_incorrect_tfa_user_info($user); //add incorrect attempt with username etc info. + } + $this->save_incorrect_tfa_code_attempts($tfa_incorrect_code_attempts, $update); + } + + /** + * Get incorrect attempt info time and IP address to save in database + * + * @return Array + */ + private function get_incorrect_tfa_attempt_info() { + $ip_address = apply_filters('tfa_user_ip_address', $_SERVER['REMOTE_ADDR']); + return array('activity_time' => time(), 'ip_address' => $ip_address); + } + + /** + * Get incorrect attempt with userinfo to save in database + * + * @param WP_User $user - logging in user object + * + * @return Array + */ + private function get_incorrect_tfa_user_info($user) { + return array('user_id' => $user->ID, 'attempts' => array($this->get_incorrect_tfa_attempt_info())); + } + + /** + * Notify user might be someone else has your possword + * + * @param Array $user_info - user's incorrect attempt information + * @param String $user_email - user email address notification to be sent. + */ + private function notify_incorrect_tfa_code_attempts($user_info, $user_email) { + $subject = __('Incorrect TFA code attempts', 'all-in-one-wp-security-and-firewall'); + $email_msg = sprintf(__('There has been an incorrect TFA code entered for logging in to your account %s.', 'all-in-one-wp-security-and-firewall'), $user_info['username']) . "\n\n" . + __('Attempts', 'all-in-one-wp-security-and-firewall') . "\n\n"; + foreach ($user_info['attempts'] as $index => $attempt) { + $email_msg.= ($index+1) . '. ' . wp_date('F j, Y g:i a', $attempt['activity_time'], wp_timezone()) . ' ' . __('from', 'all-in-one-wp-security-and-firewall') . ' ' . $attempt['ip_address']. "\n"; + } + $email_msg.= "\n" . __('If the above attempts were not by you then someone else has your password.', 'all-in-one-wp-security-and-firewall') . "\n" . + __('TFA codes are checked only after the password has been successfully checked.', 'all-in-one-wp-security-and-firewall') . "\n\n" . + __('Please change your password urgently.', 'all-in-one-wp-security-and-firewall') . "\n"; + $mail_sent = wp_mail($user_email, $subject, $email_msg); + } + + // N.B. - This doesn't check is_activated_for_user() - the caller would normally want to do that first + public function user_can_trust($user_id) { + // Default is false because this is a new feature and we don't want to surprise existing users by granting broader access than they expected upon an upgrade + return apply_filters('simba_tfa_user_can_trust', false, $user_id); + } + + /** + * Should the user be asked for a TFA code? And optionally, is the user allowed to trust devices? + * + * @param Array $params - the key used is 'log', indicating the username or email address + * @param String $response_format - 'simple' (historic format) or 'array' (richer info) + * + * @return Boolean + */ + public function pre_auth($params, $response_format = 'simple') { + global $wpdb; + + $query = filter_var($params['log'], FILTER_VALIDATE_EMAIL) ? $wpdb->prepare("SELECT ID, user_email from ".$wpdb->users." WHERE user_email=%s", $params['log']) : $wpdb->prepare("SELECT ID, user_email from ".$wpdb->users." WHERE user_login=%s", $params['log']); + $user = $wpdb->get_row($query); + + if (!$user && filter_var($params['log'], FILTER_VALIDATE_EMAIL)) { + // Corner-case: login looks like an email, but is a username rather than email address + $user = $wpdb->get_row($wpdb->prepare("SELECT ID, user_email from ".$wpdb->users." WHERE user_login=%s", $params['log'])); + } + + $is_activated_for_user = true; + $is_activated_by_user = false; + + $result = false; + + $totp_controller = $this->get_controller('totp'); + + if ($user) { + $tfa_priv_key = get_user_meta($user->ID, 'tfa_priv_key_64', true); + $is_activated_for_user = $this->is_activated_for_user($user->ID); + $is_activated_by_user = $this->is_activated_by_user($user->ID); + + if ($is_activated_for_user && $is_activated_by_user) { + + // No private key yet, generate one. This shouldn't really be possible. + if (!$tfa_priv_key) $tfa_priv_key = $totp_controller->addPrivateKey($user->ID); + + $code = $totp_controller->generateOTP($user->ID, $tfa_priv_key); + + $result = true; + } + } + + if ('array' != $response_format) return $result; + + $ret = array('result' => $result); + + if ($result) { + $ret['user_can_trust'] = $this->user_can_trust($user->ID); + if (!empty($params['trust_token']) && $this->user_trust_token_valid($user->ID, $params['trust_token'])) { + $ret['user_already_trusted'] = 1; + } + } + + return $ret; + } + + /** + * Print the radio buttons for enabling/disabling TFA + * + * @param Integer $user_id - the WordPress user ID + * @param Boolean $long_label - whether to use a long label rather than a short one + * @param String $style - valid values are "show_current" and "require_current" + */ + public function paint_enable_tfa_radios($user_id, $long_label = false, $style = 'show_current') { + + if (!$user_id) return; + + if ('require_current' != $style) $style = 'show_current'; + + $is_required = $this->is_required_for_user($user_id); + $is_activated = $this->is_activated_by_user($user_id); + + if ($is_required) { + $require_after = absint($this->get_option('tfa_requireafter')); + echo '

            '.sprintf(__('N.B. This site is configured to forbid you to log in if you disable two-factor authentication after your account is %d days old', 'all-in-one-wp-security-and-firewall'), $require_after).'

            '; + } + + $tfa_enabled_label = $long_label ? __('Enable two-factor authentication', 'all-in-one-wp-security-and-firewall') : __('Enabled', 'all-in-one-wp-security-and-firewall'); + + if ('show_current' == $style) { + $tfa_enabled_label .= ' '.sprintf(__('(Current code: %s)', 'all-in-one-wp-security-and-firewall'), $this->get_controller('totp')->current_otp_code($user_id)); + } elseif ('require_current' == $style) { + $tfa_enabled_label .= ' '.sprintf(__('(you must enter the current code: %s)', 'all-in-one-wp-security-and-firewall'), ''); + } + + $show_disable = ((is_multisite() && is_super_admin()) || (!is_multisite() && current_user_can($this->get_management_capability())) || false == $is_activated || !$is_required || !$this->get_option('tfa_hide_turn_off')) ? true : false; + + $tfa_disabled_label = $long_label ? __('Disable two-factor authentication', 'all-in-one-wp-security-and-firewall') : __('Disabled', 'all-in-one-wp-security-and-firewall'); + + if ('require_current' == $style) echo ''."\n"; + + echo '
            '; + + // Show the 'disabled' option if the user is an admin, or if it is currently set, or if TFA is not compulsory, or if the site owner doesn't require it to be hidden + // Note that this just hides the option in the UI. The user could POST to turn off TFA, but, since it's required, they won't be able to log in. + if ($show_disable) { + echo '
            '; + } + } + + /** + * Retrieve a saved option + * + * @param String $key - option key + * + * @return Mixed + */ + public function get_option($key) { + if (!is_multisite()) return get_option($key); + $main_site_id = function_exists('get_main_site_id') ? get_main_site_id() : 1; + $get_option_site_id = apply_filters('simba_tfa_get_option_site_id', $main_site_id); + switch_to_blog($get_option_site_id); + $value = get_option($key); + restore_current_blog(); + return $value; + } + + /** + * Updates an option. + * + * @param String $key - option key + * @param Mixed $value - option value + * + * @return Boolean + */ + public function update_option($key, $value) { + if (!is_multisite()) return update_option($key, $value); + + $main_site_id = function_exists('get_main_site_id') ? get_main_site_id() : 1; + $update_option_site_id = apply_filters('simba_tfa_update_option_site_id', $main_site_id); + + switch_to_blog($update_option_site_id); + $result = update_option($key, $value); + restore_current_blog(); + + return $result; + } + + /** + * Deletes an option. + * + * @param String $key - option key + * + * @return Boolean + */ + public function delete_option($key) { + if (!is_multisite()) return delete_option($key); + + $main_site_id = function_exists('get_main_site_id') ? get_main_site_id() : 1; + $delete_option_site_id = apply_filters('simba_tfa_delete_option_site_id', $main_site_id); + + switch_to_blog($delete_option_site_id); + $result = delete_option($key); + restore_current_blog(); + + return $result; + } + + /** + * Paint a list of checkboxes, one for each role + * + * @param String $prefix + * @param Integer $default - default value (0 or 1) + */ + public function list_user_roles_checkboxes($prefix = '', $default = 1) { + if (is_multisite()) { + // Not a real WP role; needs separate handling + $id = '_super_admin'; + $name = __('Multisite Super Admin', 'all-in-one-wp-security-and-firewall'); + $setting = $this->get_option('tfa_'.$prefix.$id); + $setting = ($setting === false) ? $default : ($setting ? 1 : 0); + + echo '
            \n"; + } + + global $wp_roles; + if (!isset($wp_roles)) $wp_roles = new WP_Roles(); + + foreach ($wp_roles->role_names as $id => $name) { + $setting = $this->get_option('tfa_'.$prefix.$id); + $setting = ($setting === false) ? $default : ($setting ? 1 : 0); + + echo '
            \n"; + } + + } + + public function tfa_list_xmlrpc_status_radios() { + + $setting = $this->get_option('tfa_xmlrpc_on'); + $setting = $setting ? 1 : 0; + + $types = array( + '0' => __('Do not require 2FA over XMLRPC (best option if you must use XMLRPC and your client does not support 2FA)', 'all-in-one-wp-security-and-firewall'), + '1' => __('Do require 2FA over XMLRPC (best option if you do not use XMLRPC or are unsure)', 'all-in-one-wp-security-and-firewall') + ); + + foreach($types as $id => $name) { + print '
            \n"; + } + } + + protected function is_caller_active() { + + if (!defined('XMLRPC_REQUEST') || !XMLRPC_REQUEST) return true; + + $saved_data = $this->get_option('tfa_xmlrpc_on'); + + return $saved_data ? true : false; + + } + + /** + * @param Array $params + * @param Boolean $may_be_email + * + * @return WP_Error|Boolean|Integer - WP_Error or false means failure; true or 1 means success, but true means the TFA code was validated + */ + public function authorise_user_from_login($params, $may_be_email = false) { + + $params = apply_filters('simbatfa_auth_user_from_login_params', $params); + + global $wpdb; + + if (!$this->is_caller_active()) return 1; + + $query = ($may_be_email && filter_var($params['log'], FILTER_VALIDATE_EMAIL)) ? $wpdb->prepare("SELECT ID, user_registered from ".$wpdb->users." WHERE user_email=%s", $params['log']) : $wpdb->prepare("SELECT ID, user_registered from ".$wpdb->users." WHERE user_login=%s", $params['log']); + $response = $wpdb->get_row($query); + + if (!$response && $may_be_email && filter_var($params['log'], FILTER_VALIDATE_EMAIL)) { + // Corner-case: login looks like an email, but is a username rather than email address + $response = $wpdb->get_row($wpdb->prepare("SELECT ID, user_registered from ".$wpdb->users." WHERE user_login=%s", $params['log'])); + } + + $user_id = is_object($response) ? $response->ID : false; + $user_registered = is_object($response) ? $response->user_registered : false; + + $user_code = isset($params['two_factor_code']) ? str_replace(' ', '', trim($params['two_factor_code'])) : ''; + + // This condition in theory should not be possible + if (!$user_id) return new WP_Error('tfa_user_not_found', apply_filters('simbatfa_tfa_user_not_found', ''.__('Error:', 'all-in-one-wp-security-and-firewall').' '.__('The indicated user could not be found.', 'all-in-one-wp-security-and-firewall'))); + + if (!$this->is_activated_for_user($user_id)) return 1; + + if (!empty($params['trust_token']) && $this->user_trust_token_valid($user_id, $params['trust_token'])) { + return 1; + } + + if (!$this->is_activated_by_user($user_id)) { + + if (!$this->is_required_for_user($user_id)) return 1; + + $enforce_require_after_check = true; + + $require_enforce_after = $this->get_option('tfa_require_enforce_after'); + + // Don't enforce if the setting has never been saved + if (is_string($require_enforce_after) && preg_match('#^(\d+)-(\d+)-(\d+)$#', $require_enforce_after, $enforce_matches)) { + + // wp_date() is WP 5.3+, but performs translation into the site locale + $current_date = function_exists('wp_date') ? wp_date('Y-m-d') : get_date_from_gmt(gmdate('Y-m-d H:i:s'), 'Y-m-d'); + + if (preg_match('#^(\d+)-(\d+)-(\d+)$#', $current_date, $current_date_matches)) { + if ($current_date_matches[0] < $enforce_matches[0] || ($current_date_matches[0] == $enforce_matches[0] && ($current_date_matches[1] < $enforce_matches[1] || ($current_date_matches[1] == $enforce_matches[1] && $current_date_matches[2] < $enforce_matches[2])))) { + // Enforcement not yet begun; skip + $enforce_require_after_check = false; + } + } + + } + + $require_after = absint($this->get_option('tfa_requireafter')) * 86400; + + $account_age = time() - strtotime($user_registered); + + if ($account_age > $require_after && apply_filters('simbatfa_enforce_require_after_check', $enforce_require_after_check, $user_id, $require_after, $account_age)) { + + return new WP_Error('tfa_required', apply_filters('simbatfa_notfa_forbidden_login', ''.__('Error:', 'all-in-one-wp-security-and-firewall').' '.__('The site owner has forbidden you to login without two-factor authentication. Please contact the site owner to re-gain access.', 'all-in-one-wp-security-and-firewall'))); + } + + return 1; + } + + $tfa_creds_user_id = !empty($params['creds_user_id']) ? $params['creds_user_id'] : $user_id; + + if ($tfa_creds_user_id != $user_id) { + + // Authenticating using a different user's credentials (e.g. https://wordpress.org/plugins/use-administrator-password/) + // In this case, we require that different user to have TFA active - so that this mechanism can't be used to avoid TFA + + if (!$this->is_activated_for_user($tfa_creds_user_id) || !$this->is_activated_by_user($tfa_creds_user_id)) { + return new WP_Error('tfa_required', apply_filters('simbatfa_notfa_forbidden_login_altuser', ''.__('Error:', 'all-in-one-wp-security-and-firewall').' '.__('You are attempting to log in to an account that has two-factor authentication enabled; this requires you to also have two-factor authentication enabled on the account whose credentials you are using.', 'all-in-one-wp-security-and-firewall'))); + } + + } + + return $this->get_controller('totp')->check_code_for_user($tfa_creds_user_id, $user_code); + + } + + /** + * Evaluate whether a trust token is valid for a user + * + * @param Integer $user_id - WP user ID + * @param String $trust_token - trust token + * + * @return Boolean + */ + protected function user_trust_token_valid($user_id, $trust_token) { + + if (!is_string($trust_token) || strlen($trust_token) < 30) return false; + + $trusted_devices = $this->user_get_trusted_devices($user_id); + + $time_now = time(); + + foreach ($trusted_devices as $device) { + if (empty($device['until']) || $device['until'] <= $time_now) continue; + if (!empty($device['token']) && $device['token'] === $trust_token) { + return true; + } + } + + return false; + } + + /** + * This deals with the issue that wp-login.php does not redirect to a canonical URL. As a result, if a website is available under more than one host, then admin_url('admin-ajax.php') might return a different one than the visitor is using, resulting in AJAX failing due to CORS errors. + * + * @return String + */ + protected function get_ajax_url() { + $ajax_url = admin_url('admin-ajax.php'); + $parsed_url = parse_url($ajax_url); + if (strtolower($parsed_url['host']) !== strtolower($_SERVER['HTTP_HOST']) && !empty($parsed_url['path'])) { + // Mismatch - return the relative URL only + $ajax_url = $parsed_url['path']; + } + return $ajax_url; + } + + /** + * Called not only upon the WP action login_enqueue_scripts, but potentially upon the action 'init' and various others from other plugins too. It can handle being called multiple times. + */ + public function login_enqueue_scripts() { + if (!$this->should_enqueue_login_scripts()) { + return; + } + + if (isset($_GET['action']) && 'logout ' != $_GET['action'] && 'login' != $_GET['action']) return; + + static $already_done = false; + if ($already_done) return; + $already_done = true; + + // Prevent caching when in debug mode + $script_ver = (defined('WP_DEBUG') && WP_DEBUG) ? time() : filemtime($this->includes_dir().'/tfa.js'); + + wp_enqueue_script('tfa-ajax-request', $this->includes_url().'/tfa.js', array('jquery'), $script_ver); + + $trusted_for = $this->get_option('tfa_trusted_for'); + $trusted_for = (false === $trusted_for) ? 30 : (string) absint($trusted_for); + + $localize = array( + 'ajaxurl' => $this->get_ajax_url(), + 'click_to_enter_otp' => __("Click to enter One Time Password", 'all-in-one-wp-security-and-firewall'), + 'enter_username_first' => __('You have to enter a username first.', 'all-in-one-wp-security-and-firewall'), + 'otp' => __('One Time Password (i.e. 2FA)', 'all-in-one-wp-security-and-firewall'), + 'otp_login_help' => __('(check your OTP app to get this password)', 'all-in-one-wp-security-and-firewall'), + 'mark_as_trusted' => sprintf(_n('Trust this device (allow login without 2FA for %d day)', 'Trust this device (allow login without TFA for %d days)', $trusted_for, 'all-in-one-wp-security-and-firewall'), $trusted_for), + 'is_trusted' => __('(Trusted device - no OTP code required)', 'all-in-one-wp-security-and-firewall'), + 'nonce' => wp_create_nonce('simba_tfa_loginform_nonce'), + 'login_form_selectors' => '', + 'login_form_off_selectors' => '', + 'error' => __('An error has occurred. Site owners can check the JavaScript console for more details.', 'all-in-one-wp-security-and-firewall'), + ); + + // Spinner exists since WC 3.8. Use the proper functions to avoid SSL warnings. + if (file_exists(ABSPATH.'wp-admin/images/spinner-2x.gif')) { + $localize['spinnerimg'] = admin_url('images/spinner-2x.gif'); + } elseif (file_exists(ABSPATH.WPINC.'/images/spinner-2x.gif')) { + $localize['spinnerimg'] = includes_url('images/spinner-2x.gif'); + } + + $localize = apply_filters('simba_tfa_login_enqueue_localize', $localize); + + wp_localize_script('tfa-ajax-request', 'simba_tfasettings', $localize); + + } + + /** + * Check whether TFA login scripts should be enqueued or not. + * + * @return boolean True if the TFA login script should be enqueued, otherwise false. + */ + private function should_enqueue_login_scripts() { + if (defined('TWO_FACTOR_DISABLE') && TWO_FACTOR_DISABLE) { + return apply_filters('simbatfa_enqueue_login_scripts', false); + } + + global $wpdb; + $sql = $wpdb->prepare('SELECT COUNT(user_id) FROM ' . $wpdb->usermeta . ' WHERE meta_key = %s AND meta_value = %d LIMIT 1', 'tfa_enable_tfa', 1); + $count_user_id = $wpdb->get_var($sql); + + if (is_null($count_user_id)) { // Error in query. + return apply_filters('simbatfa_enqueue_login_scripts', true); + } elseif ($count_user_id > 0) { // A user exists with TFA enabled. + return apply_filters('simbatfa_enqueue_login_scripts', true); + } + + // No user exists with TFA enabled. + return apply_filters('simbatfa_enqueue_login_scripts', false); + } + + + /** + * Return or output view content + * + * @param String $path - path to template, usually relative to templates/ within the plugin directory + * @param Array $extract_these - key/value pairs for substitution into the scope of the template + * @param Boolean $return_instead_of_echo - what to do with the results + * + * @return String|Void + */ + public function include_template($path, $extract_these = array(), $return_instead_of_echo = false) { + + if ($return_instead_of_echo) ob_start(); + + $template_file = apply_filters('simatfa_template_file', $this->templates_dir().'/'.$path, $path, $extract_these, $return_instead_of_echo); + + do_action('simbatfa_before_template', $path, $return_instead_of_echo, $extract_these, $template_file); + + if (!file_exists($template_file)) { + error_log("TFA: template not found: $template_file (from $path)"); + echo __('Error:', 'all-in-one-wp-security-and-firewall').' '.__('Template path not found:', 'all-in-one-wp-security-and-firewall')." (".htmlspecialchars($path).")"; + } else { + extract($extract_these); + // The following are useful variables which can be used in the template. + // They appear as unused, but may be used in the $template_file. + $wpdb = $GLOBALS['wpdb'];// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- $wpdb might be used in the included template + $simba_tfa = $this;// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- $wp_optimize might be used in the included template + $totp_controller = $this->get_controller('totp');// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- $wp_optimize might be used in the included template + include $template_file; + } + + do_action('simbatfa_after_template', $path, $return_instead_of_echo, $extract_these, $template_file); + + if ($return_instead_of_echo) return ob_get_clean(); + } + + /** + * Make sure that self::$frontend is the instance of Simba_TFA_Frontend, and return it + * + * @return Simba_TFA_Frontend + */ + public function load_frontend() { + if (!class_exists('Simba_TFA_Frontend')) require_once($this->includes_dir().'/tfa_frontend.php'); + if (empty($this->frontend)) $this->frontend = new Simba_TFA_Frontend($this); + return $this->frontend; + } + + // __return_empty_string() does not exist until WP 3.7 + public function shortcode_when_not_logged_in() { + return ''; + } + + /** + * Set authentication slug. + * + * @param String $authentication_slug - Authentication slug. Verify that two-factor authentication should not be repeated for the same slug. + */ + public function set_authentication_slug($authentication_slug) { + $this->authentication_slug = $authentication_slug; + } + + /** + * Unserialize data while maintaining compatibility across PHP versions due to different number of arguments required by PHP's "unserialize" function + * + * @param string $serialized_data Data to be unserialized, should be one that is already serialized + * @param boolean|array $allowed_classes Either an array of class names which should be accepted, false to accept no classes, or true to accept all classes + * @param integer $max_depth The maximum depth of structures permitted during unserialization, and is intended to prevent stack overflows + * + * @return mixed Unserialized data can be any of types (integer, float, boolean, string, array or object) + */ + private static function unserialize($serialized_data, $allowed_classes = false, $max_depth = 0) { + if (version_compare(PHP_VERSION, '7.0', '<')) { + $result = unserialize($serialized_data); + } else { + $result = unserialize($serialized_data, array('allowed_classes' => $allowed_classes, 'max_depth' => $max_depth)); // phpcs:ignore PHPCompatibility.FunctionUse.NewFunctionParameters.unserialize_optionsFound -- This is the method used to unserialize data instead of the default unserialize method + } + return $result; + } +} diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/templates/admin-settings.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/templates/admin-settings.php new file mode 100755 index 00000000..ba387783 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/templates/admin-settings.php @@ -0,0 +1,214 @@ +
            + +
            +

            + ' . esc_html($val['title']) . ''; + }, $admin_settings_links)); + echo '
            '; + } + ?> +
            + + get_option('tfa_encrypt_secrets'); ?> + + +
            +

            +

            + +

            +
            + + +
            + + +

            + +

            + + + + +

            + +

            + list_user_roles_checkboxes(); ?> +

            + + + +
            + +
            +

            + + ' . esc_html__('Requiring users to use two-factor authentication is a feature of the Premium version of this plugin.', 'all-in-one-wp-security-and-firewall').'

            '; + echo apply_filters('simba_tfa_after_user_roles', $output); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- already escaped (and not suitable for kses since non-wordpress.org add-on adds HTML lists) + + ?> + +


            +

            + +
            + + + + ' . esc_html__('Allowing users to mark a device as trusted so that a two-factor code is only needed once in a specified number of days (instead of every login) is a feature of the Premium version of this plugin.', 'all-in-one-wp-security-and-firewall').'

            '; + echo apply_filters('simba_tfa_trusted_devices_config', $output); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Contains checkboxes, and content is already escaped during construction. + + ?> +

            +
            + + +
            +
            +
            + +

            + '; + echo esc_html__("XMLRPC is a feature within WordPress allowing other computers to talk to your WordPress install. For example, it could be used by an app on your tablet that allows you to blog directly from the app (instead of needing the WordPress dashboard).", 'all-in-one-wp-security-and-firewall'); + echo '

            '; + + echo esc_html__("Unfortunately, XMLRPC also provides a way for attackers to perform actions on your WordPress site, using only a password (i.e. without a two-factor password). More unfortunately, authors of legitimate programmes using XMLRPC have not yet added two-factor support to their code.", 'all-in-one-wp-security-and-firewall'); + echo '

            '; + + echo esc_html__("i.e. XMLRPC requests coming in to WordPress (whether from a legitimate app, or from an attacker) can only be verified using the password - not with a two-factor code. As a result, there not be an ideal option to pick below. You may have to choose between the convenience of using your apps, or the security of two factor authentication.", 'all-in-one-wp-security-and-firewall'); + echo '

            '; + + ?> +

            + tfa_list_xmlrpc_status_radios(); ?> +

            + +
            +
            + +
            +
            +
            + +

            + +

            + print_default_hmac_radios(); + ?>

            + +
            +
            + +
            +
            + +

            +

            + +

            + +
            + + +

            +

            + +

            +

            + + +

            + +
            + +
            + +
            + + +

            +

            +

            + get_premium_version_url()) . '">' . esc_html__('The Premium version of this plugin allows you to add a configuration tab for users in the WooCommerce "My account" area, and anti-bot protection on the WooCommerce login form.', 'all-in-one-wp-security-and-firewall').''); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- already escaped, and contains checkboxes ?> +

            +
            + + +
            + +
            +
            +

            +

            + + + + + + + + + + + +


            + +

            +

            +
            +

            +

            +

              +
            • -
            • +
            • -
            • +
            • -
            • +
            • -
            • +
            • -
            • +
            • -
            • +
            • -
            • +
            • -
            • +
            • -
            • +
            +

            +
            + +
            + +

            +

            + + get_plugin_translate_url()) . '">' . esc_html__('the wordpress.org translation website.', 'all-in-one-wp-security-and-firewall').'') . ' ' . esc_html__("Don't send us the translation file directly - plugin authors do not have access to the wordpress.org translation system (local language teams do).", 'all-in-one-wp-security-and-firewall'); ?> +
            +

            + +
            +
            diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/templates/settings-intro-notices.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/templates/settings-intro-notices.php new file mode 100755 index 00000000..b6285bac --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/templates/settings-intro-notices.php @@ -0,0 +1,30 @@ +

            +get_management_capability())) { + echo esc_html(apply_filters('simba_tfa_message_personal_settings', __('These are your personal settings.', 'all-in-one-wp-security-and-firewall') . ' ' . __('Nothing you change here will have any effect on other users.', 'all-in-one-wp-security-and-firewall'))); +} + +if (is_multisite()) { + if (is_super_admin()) { + // Since WP 4.9 + $main_site_id = function_exists('get_main_site_id') ? get_main_site_id() : 1; + $switched = switch_to_blog($main_site_id); + echo ' ' . esc_html__('The site-wide administration options are here.', 'all-in-one-wp-security-and-firewall').''; + if ($switched) restore_current_blog(); + } +} elseif (current_user_can($simba_tfa->get_management_capability())) { + echo ' ' . esc_html__('The site-wide administration options are here.', 'all-in-one-wp-security-and-firewall').''; +} + +?> +

            + +

            + + + + get_management_capability())) { ?> + + +

            diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/templates/shortcode-tfa-user-settings.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/templates/shortcode-tfa-user-settings.php new file mode 100755 index 00000000..dbedfd82 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/templates/shortcode-tfa-user-settings.php @@ -0,0 +1,29 @@ +ID) ? '(' . esc_html__('Not logged in.', 'all-in-one-wp-security-and-firewall').')' : esc_html__('Two factor authentication is not available for your user.', 'all-in-one-wp-security-and-firewall'); + +} else { + + ?> + +
            + + include_template('settings-intro-notices.php'); ?> + + settings_enable_or_disable_output(); ?> + + get_controller('totp')->current_codes_box(); ?> + + get_controller('totp')->advanced_settings_box(array($tfa_frontend, 'save_settings_button')); ?> + +
            + + save_settings_javascript_output(); ?> + + + +
            + +

            + + user_get_trusted_devices($current_user->ID); + + if (empty($trusted_devices)) { + echo ''.__('(none)', 'all-in-one-wp-security-and-firewall').''; + } + + foreach ($trusted_devices as $device_id => $device) { + + if (!isset($device['token']) || '' == $device['token']) continue; + + $user_agent = empty($device['user_agent']) ? __('(unspecified)', 'all-in-one-wp-security-and-firewall'): $device['user_agent']; + + echo ''.sprintf(__('User agent %s logged in from IP address %s and is trusted until %s', 'all-in-one-wp-security-and-firewall'), ''.htmlspecialchars($user_agent).'', ''.htmlspecialchars($device['ip']).'', ''.date_i18n(get_option('time_format').' '.get_option('date_format'), $device['until']).'').' - '.__('Remove trust', 'all-in-one-wp-security-and-firewall').'
            '; + + } + + ?> + +
            diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/templates/user-settings.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/templates/user-settings.php new file mode 100755 index 00000000..139b37b4 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/includes/simba-tfa/templates/user-settings.php @@ -0,0 +1,62 @@ +get_controller('totp'); + +?> + +
            + +

            + + were_settings_saved())) { + echo '
            ' . "

            " . esc_html__('Settings saved.', 'all-in-one-wp-security-and-firewall') . "

            "; + } + + $simba_tfa->include_template('settings-intro-notices.php'); + + ?> + +
            + + + +

            +

            + +

            +

            + paint_enable_tfa_radios($current_user->ID); + ?>

            + +
            + + current_codes_box(); + + $totp_controller->advanced_settings_box(); + + do_action('simba_tfa_user_settings_after_advanced_settings'); + + ?> + +
            diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/index.html b/wp-content/plugins/all-in-one-wp-security-and-firewall/index.html new file mode 100755 index 00000000..e69de29b diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/js/index.html b/wp-content/plugins/all-in-one-wp-security-and-firewall/js/index.html new file mode 100755 index 00000000..e69de29b diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/js/password-strength-tool.js b/wp-content/plugins/all-in-one-wp-security-and-firewall/js/password-strength-tool.js new file mode 100755 index 00000000..628dd761 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/js/password-strength-tool.js @@ -0,0 +1,137 @@ +(function($) { + $.fn.extend({ + pwdstr: function(crack_time_calculation, crack_time_message, hibp_message) { + return this.each(function() { + const check_interval = 500; + var last_check_time = 0; + $(this).keyup(function() { + $(crack_time_calculation).html(getTime($(this).val())); + $(crack_time_message).show(); + $(hibp_message).hide(); + + setTimeout(() => { + if (Date.now() - last_check_time > check_interval) { + last_check_time = Date.now(); + aios_send_command('hibp_check_password', {password: $(this).val()}, function(response) { + if (response.pwned) { + $(crack_time_message).hide(); + $(hibp_message).show(); + } + }) + } + }, check_interval); + }); + + function getTime(str) { + var chars = 0; + var rate = 2800000000; + + if ((/[a-z]/).test(str)) chars += 26; + if ((/[A-Z]/).test(str)) chars += 26; + if ((/[0-9]/).test(str)) chars += 10; + if ((/[^a-zA-Z0-9]/).test(str)) chars += 32; + + var pos = Math.pow(chars,str.length); + var s = pos/rate; + var decimalYears = s/(3600*24*365); + var years = Math.floor(decimalYears); + + var decimalMonths = (decimalYears-years)*12; + var months = Math.floor(decimalMonths); + + var decimalDays = (decimalMonths-months)*30; + var days = Math.floor(decimalDays); + + var decimalHours = (decimalDays-days)*24; + var hours = Math.floor(decimalHours); + + var decimalMinutes = (decimalHours-hours)*60; + var minutes = Math.floor(decimalMinutes); + + var decimalSeconds = (decimalMinutes-minutes)*60; + var seconds = Math.floor(decimalSeconds); + + var time = []; + + if (years > 0) { + time.push(years + " " + aios_pwtool_trans.years + ", "); + } + if (months > 0) { + time.push(months + " " + aios_pwtool_trans.months + ", "); + } + if (days > 0) { + time.push(days + " " + aios_pwtool_trans.days + ", "); + } + if (hours > 0) { + time.push(hours + " " + aios_pwtool_trans.hours + ", "); + } + if (minutes > 0) { + time.push(minutes + " " + aios_pwtool_trans.minutes + ", "); + } + if (seconds > 0) { + time.push(seconds + " " + aios_pwtool_trans.seconds + ", "); + } + + if (time.length <= 0) + time = "" + aios_pwtool_trans.less_than_one_second + ", "; + else if (time.length == 1) + time = time[0]; + else time = time[0] + time[1]; + + var field = $('#aiowps_password_test'); + if (s <= 1 || !field.val()) { + //Time to crack < 1 sec + complexity = 0; + } else if (s > 1 && s <= 43200) { + //1 sec < Time to crack < 12hrs + complexity = 1; + } else if (s > 43200 && s <= 86400) { + //12 hrs < Time to crack < 1day + complexity = 2; + } else if (s > 86400 && s <= 604800) { + //1 day < Time to crack < 1wk + complexity = 3; + } else if (s > 604800 && s <= 2678400) { + //1wk < Time to crack < 1mth + complexity = 4; + } else if (s > 2678400 && s <= 15552000) { + //1mth < Time to crack < 6mths + complexity = 5; + } else if (s > 31536000 && s <= 31536000) { + //6mths < Time to crack < 1yrs + complexity = 6; + } else if (s > 31536000 && s <= 315360000) { + //1yrs < Time to crack < 10yrs + complexity = 7; + } else if (s > 315360000 && s <= 3153600000) { + //10yrs < Time to crack < 100yrs + complexity = 8; + } else if (s > 3153600000 && s <= 31536000000) { + //100yrs < Time to crack < 1000yrs + complexity = 9; + } else if (s > 31536000000) { + //1000yrs < Time to crack + complexity = 10; + } + // Rotate the arrow + var meterFill = $('#aios_meter_fill'); + if (str.length === 0) { + meterFill.css('width', '0').css('background-color', 'transparent'); + } else if (complexity < 3) { + meterFill.css('width', (complexity * 10) + '%').css('background-color', 'red'); + } else if (complexity < 6) { + meterFill.css('width', (complexity * 10) + '%').css('background-color', 'orange'); + } else { + meterFill.css('width', (complexity * 10) + '%').css('background-color', 'green'); + } + + return time.substring(0,time.length-2); + } + }); + } + }); + $(document).ready(function() { + $('#aiowps_password_test').pwdstr('#aiowps_password_crack_time_calculation', '#aiowps_password_crack_info_text', '#aiowps_password_hibp_info_text'); + }); +})(jQuery); + diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/js/remove-weak-pw.js b/wp-content/plugins/all-in-one-wp-security-and-firewall/js/remove-weak-pw.js new file mode 100755 index 00000000..f43a9f32 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/js/remove-weak-pw.js @@ -0,0 +1,4 @@ +jQuery(document).ready(function($) { + $('#pw-weak').remove(); + $('.pw-weak').remove(); +}); \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/js/wp-security-admin-script.js b/wp-content/plugins/all-in-one-wp-security-and-firewall/js/wp-security-admin-script.js new file mode 100755 index 00000000..1455953e --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/js/wp-security-admin-script.js @@ -0,0 +1,1846 @@ +/** + * Send an action over AJAX. A wrapper around jQuery.ajax. In future, all consumers can be reviewed to simplify some of the options, where there is historical cruft. + * + * @param {string} action - the action to send + * @param {*} data - data to send + * @param {Function} callback - will be called with the results + * @param {object} options -further options. Relevant properties include: + * - [json_parse=true] - whether to JSON parse the results + * - [alert_on_error=true] - whether to show an alert box if there was a problem (otherwise, suppress it) + * - [action='aios_ajax'] - what to send as the action parameter on the AJAX request (N.B. action parameter to this function goes as the 'subaction' parameter on the AJAX request) + * - [nonce=aios_ajax_nonce] - the nonce value to send. + * - [nonce_key='nonce'] - the key value for the nonce field + * - [timeout=null] - set a timeout after this number of seconds (or if null, none is set) + * - [async=true] - control whether the request is asynchronous (almost always wanted) or blocking (would need to have a specific reason) + * - [type='POST'] - GET or POST + */ +function aios_send_command(action, data, callback, options) { + + var default_options = { + json_parse: true, + alert_on_error: true, + action: 'aios_ajax', + nonce: aios_data.ajax_nonce, + nonce_key: 'nonce', + timeout: null, + async: true, + type: 'POST' + }; + + if ('undefined' === typeof options) options = {}; + + for (var opt in default_options) { + if (!options.hasOwnProperty(opt)) { options[opt] = default_options[opt]; } + } + + var ajax_data = { + action: options.action, + subaction: action + }; + + ajax_data[options.nonce_key] = options.nonce; + ajax_data.data = data; + + var ajax_opts = { + type: options.type, + url: ajaxurl, + data: ajax_data, + success: function(response, status) { + if (options.json_parse) { + try { + var resp = aios_parse_json(response); + } catch (e) { + if ('function' == typeof options.error_callback) { + return options.error_callback(response, e, 502, resp); + } else { + console.log(e); + console.log(response); + if (options.alert_on_error) { alert(aios_trans.unexpected_response+' '+response); } + return; + } + } + if (resp.hasOwnProperty('fatal_error')) { + if ('function' == typeof options.error_callback) { + // 500 is internal server error code + return options.error_callback(response, status, 500, resp); + } else { + console.error(resp.fatal_error_message); + if (options.alert_on_error) { alert(resp.fatal_error_message); } + return false; + } + } + if ('function' == typeof callback) callback(resp, status, response); + } else { + if ('function' == typeof callback) callback(response, status); + } + }, + error: function(response, status, error_code) { + if ('function' == typeof options.error_callback) { + options.error_callback(response, status, error_code); + } else { + console.log("aios_send_command: error: "+status+" ("+error_code+")"); + console.log(response); + } + }, + dataType: 'text', + async: options.async + }; + + if (null != options.timeout) { ajax_opts.timeout = options.timeout; } + + jQuery.ajax(ajax_opts); + +} + +/** + * Parse JSON string, including automatically detecting unwanted extra input and skipping it + * + * @param {string} json_mix_str - JSON string which need to parse and convert to object + * @param {boolean} analyse - if true, then the return format will contain information on the parsing, and parsing will skip attempting to JSON.parse() the entire string (will begin with trying to locate the actual JSON) + * + * @throws SyntaxError|String (including passing on what JSON.parse may throw) if a parsing error occurs. + * + * @returns Mixed parsed JSON object. Will only return if parsing is successful (otherwise, will throw). If analyse is true, then will rather return an object with properties (mixed)parsed, (integer)json_start_pos and (integer)json_end_pos + */ +function aios_parse_json(json_mix_str, analyse) { + + analyse = ('undefined' === typeof analyse) ? false : true; + + // Just try it - i.e. the 'default' case where things work (which can include extra whitespace/line-feeds, and simple strings, etc.). + if (!analyse) { + try { + var result = JSON.parse(json_mix_str); + return result; + } catch (e) { + console.log('AIOS: Exception when trying to parse JSON (1) - will attempt to fix/re-parse based upon first/last curly brackets'); + console.log(json_mix_str); + } + } + + var json_start_pos = json_mix_str.indexOf('{'); + var json_last_pos = json_mix_str.lastIndexOf('}'); + + // Case where some php notice may be added after or before json string + if (json_start_pos > -1 && json_last_pos > -1) { + var json_str = json_mix_str.slice(json_start_pos, json_last_pos + 1); + try { + var parsed = JSON.parse(json_str); + if (!analyse) { console.log('AIOS: JSON re-parse successful'); } + return analyse ? { parsed: parsed, json_start_pos: json_start_pos, json_last_pos: json_last_pos + 1 } : parsed; + } catch (e) { + console.log('AIOS: Exception when trying to parse JSON (2) - will attempt to fix/re-parse based upon bracket counting'); + + var cursor = json_start_pos; + var open_count = 0; + var last_character = ''; + var inside_string = false; + + // Don't mistake this for a real JSON parser. Its aim is to improve the odds in real-world cases seen, not to arrive at universal perfection. + while ((open_count > 0 || cursor == json_start_pos) && cursor <= json_last_pos) { + + var current_character = json_mix_str.charAt(cursor); + + if (!inside_string && '{' == current_character) { + open_count++; + } else if (!inside_string && '}' == current_character) { + open_count--; + } else if ('"' == current_character && '\\' != last_character) { + inside_string = inside_string ? false : true; + } + + last_character = current_character; + cursor++; + } + console.log("Started at cursor="+json_start_pos+", ended at cursor="+cursor+" with result following:"); + console.log(json_mix_str.substring(json_start_pos, cursor)); + + try { + var parsed = JSON.parse(json_mix_str.substring(json_start_pos, cursor)); + console.log('AIOS: JSON re-parse successful'); + return analyse ? { parsed: parsed, json_start_pos: json_start_pos, json_last_pos: cursor } : parsed; + } catch (e) { + // Throw it again, so that our function works just like JSON.parse() in its behaviour. + throw e; + } + } + } + + throw "AIOS: could not parse the JSON"; + +} + +/** + * Updates the content of an HTML element identified by its ID with the provided badge text. + * + * @param {Array} badges - An array of objects representing badges to update. + * @param {string} badges.id - The ID of the HTML element to update. + * @param {string} badges.html - The HTML content to set for the element. + * @returns {void} + */ +function aios_update_badge(badges) { + badges.forEach(function(badge) { + aios_update_content(badge.id, badge.html); + }); +} + +/** + * Update the content of an element with the specified HTML. + * + * @param {string} id - The ID of the element to update. + * @param {string} html - The HTML content to set for the element. + * @returns {void} + */ +function aios_update_content(id, html) { + jQuery(id).html(html); +} + + +/** + * Function to block the UI and display a loading message. + * Uses jQuery blockUI plugin. + * + * @param {string} message - A string to be shown when function is called + * + * @returns {void} + */ +function aios_block_ui(message = aios_trans.saving) { + jQuery.blockUI({ + css: { + width: '500px', + border: 'none', + 'border-radius': '10px', + left: 'calc(50% - 250px)', + top: 'calc(50% - 150px)', + padding: '20px' + }, + message: '

            ' + message + '
            ' + }); +} + +/** + * Display a success modal with optional message and icon. + * + * @param {Object|string} args - Configuration object or message string. + * @param {boolean} close_popup - Optional. If true, the popup will close automatically after 2 seconds. Default is true. + * + * @returns {void} + */ +function aios_show_success_modal(args, close_popup = true) { + if ('string' == typeof args) { + args = { + message: args + }; + } + var data = jQuery.extend( + { + icon: 'yes', + close: aios_trans.close, + message: '', + classes: 'success' + }, + args + ); + + var closeButtonHTML = ''; + if (!close_popup) { + closeButtonHTML = ''; + } + + jQuery.blockUI({ + css: { + width: '500px', + border: 'none', + 'border-radius': '10px', + left: 'calc(50% - 250px)', + top: 'calc(50% - 150px)', + cursor: 'default' + }, + onOverlayClick: jQuery.unblockUI, + message: '
            ' + data.message + '
            ' + closeButtonHTML + '
            ' + }); + + // click the show more for AJAX info + jQuery('.aios_success_popup').on('click', '#aios_ajax_showmoreoptions', function (e) { + e.preventDefault(); + let more_options = jQuery('#aios_ajax_moreoptions'); + more_options.toggle(); + // Toggle text between "Show more" and "Hide" + let new_text = more_options.is(':visible') ? aios_trans.hide_info : aios_trans.show_info; + jQuery(this).text(new_text); + }); + + // close success popup + jQuery('.blockUI .aios-close-overlay').on('click', function() { + jQuery.unblockUI(); + }); + + if (close_popup) { + setTimeout(function () { + jQuery.unblockUI(); + }, 2000); + } +} + +/** + * Submits a form using AJAX and handles the response. + * + * @param {jQuery} form - The jQuery object representing the form element. + * @param {string} action - The action to perform when submitting the form. + * @param {boolean|Object} [use_data=true] - Indicates whether to include form data in the AJAX request. + * @param {string} [block_ui_message="Saving..."] - The message to display while blocking UI during AJAX request. + * @param {Function} [pre_ajax_callback] - Optional callback function to execute before the AJAX request. + * @param {Function} [post_ajax_callback] - Optional callback function to execute after the AJAX request. + */ +function aios_submit_form(form, action, use_data = true, block_ui_message = aios_trans.saving, pre_ajax_callback, post_ajax_callback) { + aios_block_ui(block_ui_message); + var submitButton = form.find(':submit'); + submitButton.prop('disabled', true); + var data = {}; + + if ('function' === typeof pre_ajax_callback) { + pre_ajax_callback(); + } + + if ('object' === typeof use_data) { + data = use_data; // Use custom data object + } else if (use_data) { + var dataArray = form.serializeArray(); + var dataLength = dataArray.length; + for (var i = 0; i < dataLength; i++) { + data[dataArray[i].name] = dataArray[i].value; + } + } + aios_send_command(action, data, function(response) { + aios_handle_ajax_update(response, post_ajax_callback); + submitButton.prop('disabled', false); + }); +} + +/** + * Handle AJAX response and update UI elements accordingly. + * If a callback function is provided, it will be executed. + * + * @param {Object} response - The AJAX response object. + * @param {Function} [callback] - Optional callback function to execute. + * + * @returns {void} + */ +function aios_handle_ajax_update(response, callback) { + + // update contents on the page + if (response.hasOwnProperty('content')) { + jQuery.each(response.content, function(key, value) { + aios_update_content('#' + key, value); + }); + } + + // update fields with new values if changed + if (response.hasOwnProperty('values')) { + jQuery.each(response.values, function(key, value) { + jQuery('#' + key).val(value); + }); + } + + // update badges + if (response.hasOwnProperty('badges')) { + aios_update_badge(response.badges); + } + + if ('function' === typeof callback) { + callback(response); + } + + aios_show_ajax_response_message(response); +} + +/** + * Displays an AJAX response message in a modal or unblocks the UI. + * + * This function processes the response from an AJAX request and displays + * the message or info in a modal. If there is an error in the response, + * it shows a warning modal. If there are additional informational messages, + * it provides a toggle to display them. If no messages are present, it unblocks the UI. + * + * @param {Object} response - The response object returned from the AJAX call. + * @param {string} [response.message] - The main message to be displayed in the modal. + * @param {string} [response.status] - The status of the response ('error' indicates a warning). + * @param {Array} [response.info] - Additional information messages to display. + */ +function aios_show_ajax_response_message(response) { + var update_message = (response.hasOwnProperty('message') && response.message.length > 0) || (response.hasOwnProperty('info') && response.info.length > 0); + + if (update_message) { + var messageContainer = jQuery('
            '); + var close_popup = true; + + // display single message + if (response.hasOwnProperty('message')) { + messageContainer.append(response.message); + messageContainer.append('
            '); + } + + if (response.hasOwnProperty('info') && response.info.length > 0) { + close_popup = false; + // info toggle + let toggle = jQuery('' + aios_trans.show_notices + ' (' + aios_trans.show_info + ')'); + toggle.appendTo(messageContainer); + + + let infoContainer = jQuery(''); + response.info.forEach(function (info) { + infoContainer.append(`${info}`, '
            '); + }); + + infoContainer.appendTo(messageContainer); + } + + + if ('error' === response.status) { + aios_show_success_modal({ + message: messageContainer.html(), + icon: 'no-alt', + classes: 'warning' + }, false); + } else { + aios_show_success_modal(messageContainer.html(), close_popup); + } + } else { + setTimeout(function() { + jQuery.unblockUI(); + }, 1500); + } +} + +jQuery(function($) { + //Add Generic Admin Dashboard JS Code in this file + + //Media Uploader - start + jQuery("#aiowps_restore_htaccess_form").on('submit', function(e) { + e.preventDefault(); + var form = jQuery(this); + + aios_read_restore_file(this, 'htaccess', function () { + aios_submit_form(form, 'perform_restore_htaccess_file', true, aios_trans.processing, null, function (response) { + form[0].reset(); + }) + }); + }); + + jQuery("#aiowps_restore_wp_config_form").on('submit', function(e) { + e.preventDefault(); + var form = jQuery(this); + + aios_read_restore_file(this, 'wp_config', function () { + aios_submit_form(form, 'perform_restore_wp_config_file', true, aios_trans.processing, null, function (response) { + form[0].reset(); + }) + }); + }); + + jQuery("#aiowps_restore_settings_form").on('submit', function(e) { + e.preventDefault(); + var form = jQuery(this); + + aios_read_restore_file(this, 'import_settings', function () { + + aios_submit_form(form, 'perform_restore_aiowps_settings', true, aios_trans.processing, null, function(response) { + form[0].reset(); + if (response.hasOwnProperty('redirect_url')) { + // Redirect to the URL + window.location.href = response.extra_args.redirect_url; + } + }) + }) + }); + + /** + * Reads the contents of a selected file and submits the form after populating a hidden input with the file contents. + * + * @param {HTMLFormElement} form - The form element to submit after reading the file contents. + * @param {string} file - The type of file to read ('htaccess', 'wp_config', 'import_settings'). + * @param {Function} [callback] - Optional. A callback function to execute after reading the file contents. + */ + function aios_read_restore_file(form, file, callback) { + var aios_import_file_input = document.getElementById('aiowps_' + file + '_file'); + if (0 == aios_import_file_input.files.length) { + alert(aios_trans.no_import_file); + return; + } + var aios_import_file_file = aios_import_file_input.files[0]; + var aios_import_file_reader = new FileReader(); + aios_import_file_reader.onload = function() { + jQuery('#aiowps_' + file + '_file_contents').val(this.result); + if ('function' === typeof callback) { + // If callback is provided, execute it + callback(); + } else { + // If callback is not provided, submit the form + form.submit(); + } + }; + aios_import_file_reader.readAsText(aios_import_file_file); + } + //End of Media Uploader + + // Triggers the more info toggle link + jQuery(".aiowps_more_info_body").hide();//hide the more info on page load + function toggleMoreInfo(target = '.aiowps_more_info_anchor') { + jQuery(target).on('click', function () { + jQuery(this).next(".aiowps_more_info_body").animate({"height": "toggle"}); + var toggle_char_ref = jQuery(this).find(".aiowps_more_info_toggle_char"); + var toggle_char_value = toggle_char_ref.text(); + if ("+" === toggle_char_value) { + toggle_char_ref.text("-"); + } else { + toggle_char_ref.text("+"); + } + }); + } + toggleMoreInfo(); + //End of more info toggle + + /** + * This function uses javascript to retrieve a query arg from the current page URL + * + * @param {string} name - The name of the query parameter to retrieve. + * @returns {string|null} The value of the query parameter, or null if the parameter does not exist. + */ + function getParameterByName(name) { + var url = window.location.href; + name = name.replace(/[\[\]]/g, "\\$&"); + var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"), + results = regex.exec(url); + if (!results) return null; + if (!results[2]) return ''; + return decodeURIComponent(results[2].replace(/\+/g, " ")); + } + + // Start of brute force attack prevention toggle handling + jQuery('input[name=aiowps_enable_brute_force_attack_prevention]').on('click', function () { + jQuery('input[name=aiowps_brute_force_secret_word]').prop('disabled', !jQuery(this).prop('checked')); + jQuery('input[name=aiowps_cookie_based_brute_force_redirect_url]').prop('disabled', !jQuery(this).prop('checked')); + jQuery('input[name=aiowps_brute_force_attack_prevention_pw_protected_exception]').prop('disabled', !jQuery(this).prop('checked')); + jQuery('input[name=aiowps_brute_force_attack_prevention_ajax_exception]').prop('disabled', !jQuery(this).prop('checked')); + }); + // End of brute force attack prevention toggle handling + + // Start of CAPTCHA handling + jQuery('.wrap').on('change', '#aiowps_default_captcha', function () { + var selected_captcha = jQuery(this).val(); + jQuery('.captcha_settings').hide(); + jQuery('#aios-'+ selected_captcha).show(); + + if ('none' === selected_captcha) { + jQuery('#aios-captcha-options').hide(); + } else { + jQuery('#aios-captcha-options').show(); + } + }); + // End of CAPTCHA handling + + /** + * Take a backup with UpdraftPlus if possible. + * + * @param {String} file_entities + * + * @return void + */ + function take_a_backup_with_updraftplus(file_entities) { + // Set default for file_entities to empty string + if ('undefined' == typeof file_entities) file_entities = ''; + var exclude_files = file_entities ? 0 : 1; + + if ('function' === typeof updraft_backupnow_inpage_go) { + updraft_backupnow_inpage_go(function () { + // Close the backup dialogue. + jQuery('#updraft-backupnow-inpage-modal').dialog('close'); + }, file_entities, 'autobackup', 0, exclude_files, 0); + } + } + + if (jQuery('#aios-manual-db-backup-now').length) { + jQuery('#aios-manual-db-backup-now').on('click', function (e) { + e.preventDefault(); + take_a_backup_with_updraftplus(); + }); + } + + // Hide 2FA premium section (advertisements) for free. + if (jQuery('.tfa-premium').length && 0 == jQuery('#tfa_trusted_for').length) { + jQuery('.tfa-premium').parent().find('hr').first().hide(); + jQuery('.tfa-premium').hide(); + } + + // Start of trash spam comments toggle handling + jQuery('input[name=aiowps_enable_trash_spam_comments]').on('click', function() { + jQuery('input[name=aiowps_trash_spam_comments_after_days]').prop('disabled', !jQuery(this).prop('checked')); + }); + // End of trash spam comments toggle handling + + /** + * Copies text to the clipboard using the deprecated document.execCommand method. + * + * @param {string} text - The text to be copied to the clipboard. + */ + function deprecated_copy(text) { + var $temp = jQuery(''); + jQuery('body').append($temp); + $temp.val(text).select(); + if (document.execCommand('copy')) { + alert(aios_trans.copied); + } + $temp.remove(); + } + + // Start of copy-to-clipboard click handling + jQuery('.copy-to-clipboard').on('click', function(event) { + if (navigator.clipboard) { + navigator.clipboard.writeText(event.target.value).then(function() { + alert(aios_trans.copied); + }, function() { + deprecated_copy(event.target.value); + }); + } else { + deprecated_copy(event.target.value); + } + }); + // End of copy-to-clipboard click handling + + // Start audit log list table handling + var audit_log_table_id = '#audit-log-list-table #tables-filter', + audit_log_elements = '.tablenav-pages a, .manage-column.sortable a, .manage-column.sorted a, .current-page, #search-submit, .action', + audit_log_bulk_action_selector = '#bulk-action-selector-top, #bulk-action-selector-bottom', + audit_log_table_tab = 'render_audit_log_tab', + audit_log_filter_event = '.audit-filter-event', + audit_log_search = '#search_audit_events-search-input', + audit_log_level = '.audit-filter-level'; + detect_table_action(audit_log_table_id, audit_log_elements, audit_log_bulk_action_selector, audit_log_table_tab, audit_log_filter_event, audit_log_search, audit_log_level); + // End of audit log list table handling + + + // Start of list table handling + + /** + * Attaches event handlers to specified table elements for detecting and performing actions, + * then updates the table based on the current state or the clicked element. + * + * @param {string} id - The ID selector of the table element (e.g., '#my-table'). + * @param {string} elements - The elements inside the table to attach event handlers to (e.g., 'input, select'). + * @param {string} action_selector - The selector for the bulk action dropdown element (e.g., '#bulk-action-selector-top'). + * @param {string} tab - The tab or section to update after performing an action (e.g., 'posts', 'comments'). + * @param {string} [filter_event_selector=''] - The selector for filtering by event type (optional). + * @param {string} [search_selector=''] - The selector for the search input element (optional). + * @param {string} [filter_level_selector=''] - The selector for filtering by level (optional). + * @param {boolean} [detect=true] - Whether to detect actions based on the clicked element or to perform an action immediately. + * + * @returns {void} + */ + function detect_table_action(id, elements, action_selector, tab, filter_event_selector = '', search_selector = '', filter_level_selector = '', detect = true) { + + if (true === detect) { + jQuery(id).on('click change', elements, function(e) { + // Check if the event's default action is prevented by the confirm message cancel + if (!e.isDefaultPrevented()) { + e.preventDefault(); + perform_action.call(this); // Ensure the context (this) is correct + } + }); + } else { + perform_action.call(jQuery(id).get(0)); // Use the first element from the selector to maintain context + } + + /** + * Perform the action based on the clicked element or the current sorting state. + * + * @returns {void} + */ + function perform_action() { + aios_block_ui(aios_trans.processing); + var checked_values = jQuery('th.check-column input[type="checkbox"]:checked').map(function() { + return jQuery(this).val(); + }).get(); + + var event_filter = jQuery(filter_event_selector).val(); + + var top_selector = jQuery('#bulk-action-selector-top').val(), + bottom_selector = jQuery('#bulk-action-selector-bottom').val(), + search = jQuery(search_selector).val(), + action; + + if ('-1' !== top_selector) { + action = top_selector; + } else if ('-1' !== bottom_selector) { + action = bottom_selector; + } else { + action = '-1'; + } + + var data = { + 'paged': get_page_number(jQuery(this)), + 'order': get_order(jQuery(this)), + 'orderby': get_order_by(jQuery(this)), + 's': search || '', + 'level-filter': jQuery(filter_level_selector).val() || '-1', + 'event-filter': event_filter || '-1', + 'items': checked_values, + 'action': action + }; + + update_list_table(tab, data); + + jQuery(action_selector).val('-1'); + } + } + + /** + * Remove the message after a set time. + * + * @returns {void} + */ + function remove_aios_message() { + setTimeout(function() { + jQuery('#aios_message').remove(); + }, 5000); + } + + /** + * Get the column ID based on the clicked element or the current sorting state. + * + * @param {jQuery} element - The jQuery object representing the clicked element. + * + * @returns {string} The ID of the column. + */ + function get_order_by(element) { + if (element.is('.manage-column.sortable a')) return element.closest('th').attr('id'); + else if (0 < jQuery('.sorted').length) return jQuery('.sorted').attr('id'); + else return element.closest('th').attr('id'); + } + + /** + * Get the order (ascending or descending) based on the clicked element or the current sorting state. + * + * @param {jQuery} element - The jQuery object representing the clicked element. + * + * @returns {string} The order ('asc' for ascending, 'desc' for descending). + */ + function get_order(element) { + if (element.is('.manage-column.sortable a') || element.is('.manage-column.sorted a')) { + var url = element.attr('href'), + orderMatch = url.match(/[?&]order=([^&]+)/); + return orderMatch[1]; + } else if (0 < jQuery('.sorted').length) { + return jQuery('.sorted').hasClass('asc') ? 'asc' : 'desc'; + } else { + return element.closest('th').hasClass('asc') ? 'asc' : 'desc'; + } + } + + /** + * Get the page number based on the clicked element. + * + * @param {jQuery} element - The jQuery object representing the clicked element. + * + * @returns {number|string} The page number. If the clicked element represents a specific page, returns that page number. If not, returns the current page number. + */ + function get_page_number(element) { + if (element.hasClass('first-page')) + return '1'; + else if (element.hasClass('last-page')) + return find_page_number(jQuery('.last-page')); + else if (element.hasClass('prev-page')) + return find_page_number(jQuery('.prev-page')); + else if (element.hasClass('next-page')) + return find_page_number(jQuery('.next-page')); + else return jQuery('.current-page').val(); + } + + /** + * Finds and returns the page number from the href attribute of the provided element. + * + * @param {jQuery} element - The jQuery object representing the element containing the href attribute. + * + * @returns {number} The page number extracted from the href attribute. + */ + function find_page_number(element) { + return parseInt(element.attr('href').split('paged=')[1]); + } + + /** + * Update the list table with data from an AJAX call. + * If the current page number exceeds the total pages available, + * make a new request for the last available page. + * + * @param {string} table - The table tab. + * @param {object} data - The data object containing table parameters. + */ + function update_list_table(table, data) { + aios_send_command(table, data, function (response) { + // Check if the requested page number exceeds the total pages available + if (data.paged > response.total_pages && 0 < response.total_pages) { + // Update data to request the last available page + data.paged = response.total_pages; + // Make another AJAX call to get the data for the last page + aios_send_command(table, data, function (response) { + render_table(response); + }, { + error_callback: handle_ajax_error + }); + } else { + // Proceed to render the table with the current response + render_table(response); + } + }, { + error_callback: handle_ajax_error + }); + } + // End of list table handling + + /** + * Render the table elements based on the AJAX response. + * + * @param {object} response - The response object from the AJAX call. + */ + function render_table(response) { + // Add the requested rows + if (response.rows.length) jQuery('#the-list').html(response.rows); + // Update column headers for sorting + if (response.column_headers.length) jQuery('thead tr, tfoot tr').html(response.column_headers); + // Update pagination for navigation + if (response.pagination.top.length) jQuery('.tablenav.top .tablenav-pages').html(jQuery(response.pagination.top).html()); + if (response.pagination.bottom.length) jQuery('.tablenav.bottom .tablenav-pages').html(jQuery(response.pagination.bottom).html()); + + // Add/Remove the message + if (response.message && response.message.length) { + aios_show_ajax_response_message(response); + } else { + remove_aios_message(); + setTimeout(function() { + jQuery.unblockUI(); + }, 3000); + } + } + + /** + * Handle errors from the AJAX call. + * + * @param {object} response - The response object from the AJAX call. + * @param {string} status - The status of the AJAX call. + * @param {string} error_code - The error code from the AJAX call. + * @param {object} resp - The response object containing detailed error information. + */ + function handle_ajax_error(response, status, error_code, resp) { + if (typeof resp !== 'undefined' && resp.hasOwnProperty('fatal_error')) { + console.error(resp.fatal_error_message); + alert(resp.fatal_error_message); + } else { + var error_message = "aios_send_command: error: " + status + " (" + error_code + ")"; + console.log(error_message); + alert(error_message); + } + jQuery.unblockUI(); + } + + // Start of database table prefix handling + jQuery('#aiowps_enable_random_prefix').on('click', function() { + jQuery('#aiowps_new_manual_db_prefix').prop('disabled', jQuery(this).prop('checked')); + }); + + jQuery('#aiowps_new_manual_db_prefix').on('input', function() { + if (jQuery(this).prop('value')) { + jQuery('#aiowps_enable_random_prefix').prop('disabled', true); + } else { + jQuery('#aiowps_enable_random_prefix').prop('disabled', false); + } + }); + // End of database table prefix handling + + // Dashboard menu ajaxify + jQuery("#locked-ip-list-table").on('click', '.aios-unlock-ip-button', function(e) { + e.preventDefault(); + var element = jQuery(this); + if (confirm(element.data('message'))) { + aios_submit_form(element, 'unlock_ip', {ip: element.data('ip')}, aios_trans.processing, null, function(response) { + if ('success' === response.status) jQuery('#locked-ip-list-table').load(' #locked-ip-list-table > *'); + }) + } + }); + + jQuery("#locked-ip-list-table").on('click', '.aios-delete-locked-ip-record', function(e) { + e.preventDefault(); + var element = jQuery(this); + confirm(element.data('message')) ? aios_send_command('delete_locked_ip_record', {id: element.data('id')}, function(response) { + jQuery('#aios_message').remove(); + jQuery('#wpbody-content .wrap h2:first').after(response.message); + if ('success' === response.status) jQuery('#locked-ip-list-table').load(' #locked-ip-list-table > *'); + }) : false; + }); + + jQuery("#permanent-ip-list-table").on('click', '.aios-unblock-permanent-ip', function(e) { + e.preventDefault(); + var element = jQuery(this); + if (confirm(element.data('message'))) { + aios_submit_form(element,'blocked_ip_list_unblock_ip', {id: element.data('id')}, aios_trans.processing, null, function(response) { + if ('success' === response.status) jQuery('#permanent-ip-list-table').load(' #permanent-ip-list-table > *'); + }) + } + }); + + jQuery('#audit-log-list-table').on('click', '.aios-delete-audit-log', function(e) { + e.preventDefault(); + var element = jQuery(this); + + if (confirm(element.data('message'))) { + aios_submit_form(element, 'delete_audit_log', {id: element.data('id')}, aios_trans.processing, null, function(response) { + if ('success' === response.status) detect_table_action(audit_log_table_id, '.aios-delete-audit-log', audit_log_bulk_action_selector, audit_log_table_tab, audit_log_filter_event, audit_log_search, audit_log_level, detect = false); + }) + } + }); + + jQuery('#audit-log-list-table').on('click', '.aios-unlock-ip-button', function(e) { + e.preventDefault(); + var element = jQuery(this); + if (confirm(element.data('message'))) { + aios_submit_form(element, 'unlock_ip', {ip: element.data('ip')}, aios_trans.processing, null, function(response) { + if ('success' === response.status) detect_table_action(audit_log_table_id, '.aios-unlock-ip-button', audit_log_bulk_action_selector, audit_log_table_tab, audit_log_filter_event, audit_log_search, audit_log_level, detect = false); + }) + } + }); + + jQuery('#audit-log-list-table').on('click', '.aios-unblacklist-ip-button', function(e) { + e.preventDefault(); + var element = jQuery(this); + if (confirm(element.data('message'))) { + aios_submit_form(element, 'unblacklist_ip', {ip: element.data('ip')}, aios_trans.processing, null, function(response) { + if ('success' === response.status) detect_table_action(audit_log_table_id, '.aios-unblacklist-ip-button', audit_log_bulk_action_selector, audit_log_table_tab, audit_log_filter_event, audit_log_search, audit_log_level, detect = false); + }) + } + }); + + jQuery('#audit-log-list-table').on('click', '.aios-lock-ip-button', function(e) { + e.preventDefault(); + var element = jQuery(this); + if (confirm(element.data('message'))) { + aios_submit_form(element,'lock_ip', {ip: element.data('ip'), lock_reason: 'audit-log'}, aios_trans.processing, null, function (response) { + if ('success' === response.status) detect_table_action(audit_log_table_id, '.aios-lock-ip-button', audit_log_bulk_action_selector, audit_log_table_tab, audit_log_filter_event, audit_log_search, audit_log_level, false); + }) + } + }); + + jQuery('#audit-log-list-table').on('click', '.aios-blacklist-ip-button', function(e) { + e.preventDefault(); + var element = jQuery(this); + if (confirm(element.data('message'))) { + aios_submit_form(element,'blacklist_ip', {ip: element.data('ip')}, aios_trans.processing, null, function(response) { + if ('success' === response.status) detect_table_action(audit_log_table_id, '.aios-blacklist-ip-button', audit_log_bulk_action_selector, audit_log_table_tab, audit_log_filter_event, audit_log_search, audit_log_level, detect = false); + }) + } + }); + + jQuery('#audit-log-list-table').on('click', '#aiowps_export_audit_event_logs_to_csv', function(e) { + e.preventDefault(); + + aios_submit_form(jQuery(this), 'export_audit_logs', true, aios_trans.processing, null, function (response) { + aios_download_csv_file(response.data, response.title); + }); + }); + + jQuery('#aios-clear-debug-logs').on('click', '.aios-clear-debug-logs', function(e) { + e.preventDefault(); + if (confirm(jQuery(this).data('message'))) { + aios_send_command('clear_debug_logs', {}, function(response) { + jQuery('#aios_message').remove(); + jQuery('#wpbody-content .wrap h2:first').after(response.message); + if ("success" === response.status) jQuery('#debug-list-table').load(' #debug-list-table > *'); + }); + } + }); + // End of dashboard menu ajaxify + + //Start of Spam prevention ajaxify + jQuery('#aios-spam-prevention-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_comment_spam_prevention'); + }) + + jQuery('#aios-auto-spam-block-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_auto_block_spam_ip'); + }) + + jQuery('#aios-spam-ip-search-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_ip_spam_search', true, aios_trans.processing, null, function (response) { + var targetOffset = jQuery('#aios-spammer-list-table').offset().top; + jQuery('html, body').animate({ scrollTop: targetOffset }, 'slow'); + if ("success" === response.status) { + jQuery('#aios-spammer-list-table').load(' #aios-spammer-list-table > *'); + } + }) + }) + + jQuery('#aios-spammer-list-table').on('click', '.aios-block-author-ip', function(e) { + e.preventDefault(); + var ip = jQuery(this).data('ip'); + var data = { + 'ip': ip + } + + if (confirm(jQuery(this).data('message'))) { + aios_submit_form(jQuery(this), 'perform_block_spam_ip', data, aios_trans.processing, null, function (response) { + if ("success" === response.status) { + jQuery('#aios-spammer-list-table').load(' #aios-spammer-list-table > *'); + jQuery('html, body').animate({ scrollTop: 0 }, 'slow'); + } + }); + } + }) + //End of spam prevention ajaxify + + // Start of settings menu ajaxify + jQuery('#aiowpsec-disable-all-features-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_disable_all_features', true, aios_trans.disabling); + }); + + jQuery('#aiowpsec-disable-all-firewall-rules-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_disable_all_firewall_rules', true, aios_trans.disabling); + }); + + jQuery('#aiowpsec-reset-settings-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_reset_all_settings', true, aios_trans.processing); + }); + + jQuery('#aiowps_enable_debug').on('change', function(e) { + e.preventDefault(); + var aiowps_enable_debug = jQuery(this).is(':checked') ? '1' : ''; + var data = { + 'aiowps_enable_debug': aiowps_enable_debug + }; + + aios_submit_form(jQuery(this), 'perform_save_debug_settings', data, aios_trans.processing); + }); + + jQuery('#aiowpsec-save-htaccess-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_backup_htaccess_file', true, aios_trans.processing, null, function (response) { + if ('success' === response.status) { + aios_download_txt_file(response.extra_args.data, response.extra_args.title); + } + }); + }); + + jQuery('#aiowpsec-delete-plugin-settings-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_delete_plugin_settings'); + }); + + jQuery('#aiowpsec-remove-wp-meta-info-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_remove_wp_version_info_settings'); + }); + + jQuery('#aiowpsec-ip-settings-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_save_ip_settings'); + }); + + jQuery('#aiowpsec-save-wp-config-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_save_wp_config', {}, aios_trans.saving, null, function(response) { + aios_download_txt_file(response.extra_args.data, response.extra_args.title); + }); + }); + + jQuery('#aiowpsec-export-settings-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_export_aios_settings', {}, aios_trans.exporting, null, function(response) { + aios_download_txt_file(response.extra_args.data, response.extra_args.title); + }); + }); + // End of settings menu ajaxify + // Start of Filesystem menu ajaxify + jQuery('#aios-file-permissions-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_fix_permissions', true, aios_trans.processing); + }) + + jQuery('#aiowps_delete_default_wp_files').on('click', function(e) { + e.preventDefault(); + var button = jQuery(this); + aios_submit_form(jQuery(this), 'perform_delete_default_wp_files', {'aios-delete_default_wp_files': 1}, aios_trans.deleting, function() { + button.prop('disabled', true); + }, + function(response) { + button.prop('disabled', false); + }); + }) + + jQuery('#aios-file-protection-settings-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_file_protection_settings'); + }) + + jQuery('#aios-host-system-logs-form').on('submit', function(e) { + e.preventDefault(); + + aios_submit_form(jQuery(this), 'perform_host_system_logs', true, aios_trans.processing, function () { + jQuery('#aios-host-system-logs-results').html(''); + jQuery('#aiowps_activejobs_table').html('

            '+ aios_trans.processing + '

            '); + jQuery('#aiowps_activejobs_table .aiowps_spinner').addClass('visible'); + }, + function(response) { + var loading_span = jQuery('#aiowps_activejobs_table'); + loading_span.hide(); + }); + }) + + jQuery('#aios-frame-display-settings-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_save_frame_display_prevent'); + }) + + jQuery('#aios-copy-protection-settings-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this),'perform_save_copy_protection'); + }) + //End of Filesystem menu ajaxify + + // Firewall menu ajaxify + jQuery('#aios-php-firewall-settings-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_php_firewall_settings', true, aios_trans.saving, null, function(response) { + if ("success" === response.status) { + jQuery('.aio_orange_box').remove(); + if (jQuery('#aiowps_enable_6g_firewall').prop('checked')) { + jQuery('.aios-toggle-advanced-options').removeClass('advanced-options-disabled'); + jQuery('.aios-advanced-options-panel .aiowps_more_info_body').hide(); + toggleMoreInfo('.aios-advanced-options-panel .aiowps_more_info_anchor'); + } else { + jQuery('.aios-toggle-advanced-options').addClass('advanced-options-disabled'); + jQuery('.button.button-link.aios-toggle-advanced-options').removeClass('opened'); + } + check_input(); + jQuery('#post-body h2:first').after(response.extra_args.xmlprc_warning); + } + }); + }); + + jQuery('#aios-htaccess-firewall-settings-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this),'perform_htaccess_firewall_settings'); + }); + + jQuery("#aios-blacklist-settings-form").on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this),'perform_save_blacklist_settings'); + }); + + jQuery("#aios-firewall-allowlist-form").on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this),'perform_firewall_allowlist'); + }); + + jQuery("#aios-5g-firewall-settings-form").on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_save_5g_settings') + }); + + jQuery('#aiowps-firewall-status-container').on('submit', "#aiowpsec-firewall-setup-form", function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_setup_firewall', true, aios_trans.setting_up_firewall, null, function (response) { + if (response.extra_args && response.extra_args.info_box) { + jQuery("#aios-firewall-setup-notice").remove(); + jQuery('#wpbody-content .wrap h2:first').after(response.extra_args.info_box); + } + }); + }); + + jQuery('#aiowps-firewall-status-container').on('submit', "#aiowps-firewall-downgrade-form", function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_downgrade_firewall', true, aios_trans.downgrading_firewall, null, function (response) { + if (response.extra_args && response.extra_args.info_box) { + jQuery("#aios-firewall-installed-notice").remove(); + jQuery('#wpbody-content .wrap h2:first').after(response.extra_args.info_box); + } + }); + }); + + jQuery('#aios-upgrade-unsafe-http-calls-settings-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_save_upgrade_unsafe_http_calls_settings'); + }) + // end of firewall menu ajax + + // Start of file scan handling + jQuery('.aiowps_next_scheduled_scan_wrapper').on('click', '.aiowps_view_last_fcd_results', view_scan_results_handler); + jQuery('#aiowps_fcds_change_detected').on('click', '.aiowps_view_last_fcd_results', view_scan_results_handler); + + // start of user security menu ajax + jQuery('#aios-user-accounts-settings-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_save_user_account_settings'); + }); + + jQuery('#aios-change-admin-username-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_change_admin_username', true, aios_trans.saving, null, function (response) { + if (response.hasOwnProperty('logout_user') && true === response.logout_user) { + setTimeout(function() { + // Check if a logout URL is present in the response + if (response.hasOwnProperty('logout_url')) { + // Redirect to the logout URL + window.location.href = response.logout_url; + } else { + // If no logout URL is provided, reload the current page + location.reload(); + } + }, 3000); + } + }); + }); + + jQuery('#aios-user-login-lockdown-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_save_login_lockout_settings'); + }); + + jQuery('#aios-user-login-lockout-whitelist-settings-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_save_login_lockout_whitelist_settings'); + }); + + jQuery('#aios-force-user-logout-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_force_logout', true, aios_trans.saving, null, function (response) { + if (response.hasOwnProperty('logout_user') && true === response.logout_user) { + setTimeout(function() { + // Check if a logout URL is present in the response + if (response.hasOwnProperty('logout_url')) { + // Redirect to the logout URL + window.location.href = response.logout_url; + } else { + // If no logout URL is provided, reload the current page + location.reload(); + } + }, 3000); + } + }); + }); + + jQuery('#aios-hibp-password-settings-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_save_hibp_settings'); + }); + + jQuery('#aios-disable-application-password-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_disable_application_password'); + }); + + jQuery('#aios-enable-salt-postfix-form').submit(function (e) { + e.preventDefault(); + aios_submit_form(jQuery(this),'perform_add_salt_postfix', true, aios_trans.saving, null,function() { + setTimeout(function () { + location.reload(); + }, 3000); + }); + }); + + jQuery('#aios-logged-in-users-table').on('click', '.aios-force-logout-user', function(e) { + e.preventDefault(); + let user_id = jQuery(this).data('user-id'), data = { + logged_in_id: user_id, + action: 'force_user_logout' + }; + if (confirm(jQuery(this).data('message'))) { + aios_submit_form(jQuery(this), 'perform_logged_in_user_action', data, aios_trans.processing, null, function (response) { + if ('success' === response.status) { + jQuery('#aios-logged-in-users-table').load(' #aios-logged-in-users-table > *'); + } + }); + } + }); + + jQuery("#aios-refresh-logged-in-user-list-form").on('submit', function(e) { + e.preventDefault(); + aios_block_ui(aios_trans.refreshing); + var submitButton = jQuery(this).find(':submit'); + submitButton.prop('disabled', true); + jQuery('#aios-logged-in-users-table').load(' #aios-logged-in-users-table > *', function () { + jQuery.unblockUI(); + submitButton.prop('disabled', false); + }); + }); + + jQuery('#aios-manually-approve-registrations-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_manual_approval_settings'); + }); + + jQuery("#aios-manual-approval-table").on('click', '.aios-approve-user-acct', function(e) { + e.preventDefault(); + let user_id = jQuery(this).data('id'), data = { + user_id: user_id, + action: 'approve_acct' + }; + if (confirm(jQuery(this).data('message'))) { + aios_submit_form(jQuery(this), 'perform_manual_approval_item_action', data, aios_trans.processing, null, function () { + jQuery('#aios-manual-approval-table').load(' #aios-manual-approval-table > *'); + }); + } + }); + + jQuery("#aios-manual-approval-table").on('click', '.aios-delete-user-acct', function(e) { + e.preventDefault(); + let user_id = jQuery(this).data('id'), data = { + user_id: user_id, + action: 'delete_acct' + }; + if (confirm(jQuery(this).data('message'))) { + aios_submit_form(jQuery(this), 'perform_manual_approval_item_action', data, aios_trans.processing, null, function () { + jQuery('#aios-manual-approval-table').load(' #aios-manual-approval-table > *'); + }); + } + }); + + jQuery("#aios-manual-approval-table").on('click', '.aios-block-ip', function(e) { + e.preventDefault(); + let ip_address = jQuery(this).data('ip'), data = { + ip_address: ip_address, + action: 'block_ip' + }; + if (confirm(jQuery(this).data('message'))) { + aios_submit_form(jQuery(this),'perform_manual_approval_item_action', data, aios_trans.blocking, null, function() { + jQuery('#aios-manual-approval-table').load(' #aios-manual-approval-table > *'); + }) + } + }); + + jQuery("#aios-refresh-manual-approval-list-form").on('submit', function(e) { + e.preventDefault(); + aios_block_ui(aios_trans.refreshing); + var submitButton = jQuery(this).find(':submit'); + submitButton.prop('disabled', true); + jQuery('#aios-manual-approval-table').load(' #aios-manual-approval-table > *', function () { + jQuery.unblockUI(); + submitButton.prop('disabled', false); + }); + }); + + jQuery("#aios-enforce-strong-password-form").on('submit', function(e) { + e.preventDefault(); + + aios_submit_form(jQuery(this), 'enforce_strong_password'); + }); + + // end of user security menu ajax + + // start of tools menu ajaxify + jQuery("#aiowpsec-whois-lookup-form").on('submit', function(e) { + e.preventDefault(); + + jQuery('#aios-who-is-lookup-result-container').html(''); + + aios_submit_form(jQuery(this), 'perform_whois_lookup', true, aios_trans.processing, null, function () { + var targetOffset = jQuery('#aios-who-is-lookup-result-container').offset().top; + jQuery('html, body').animate({ scrollTop: targetOffset }, 'slow'); + }); + }); + + jQuery("#aiowpsec-site-lockout-form").on('submit', function (e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_general_visitor_lockout', true, aios_trans.saving, function () { + var editor = tinyMCE.get('aiowps_site_lockout_msg_editor_content'); + if (editor) { + editor.save(); + } + }); + }); + + jQuery('#maintenance_mode_status').on('click', '#aiowps_site_lockout', function (e) { + aios_block_ui(aios_trans.saving); + + var enabled = jQuery(this).is(':checked'); + var data = {}; + + if (enabled) { + data.aiowps_site_lockout = '1'; + } + + aios_send_command('perform_general_visitor_lockout_dashboard_widget', data, function(response) { + aios_show_ajax_response_message(response); + if ('success' === response.status) { + if (enabled) { + jQuery("#aiowpsec-dashboard-maintenance-mode-status-message").text(aios_trans.maintenance_mode_enabled); + } else { + jQuery("#aiowpsec-dashboard-maintenance-mode-status-message").text(aios_trans.maintenance_mode_disabled); + } + } + }); + }); + + jQuery("#aiowpsec-save-custom-rules-settings-form").on('submit', function (e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_store_custom_htaccess_settings'); + }); + // end of tools menu ajaxify + jQuery('#aiowpsec-scheduled-fcd-scan-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_save_file_detection_change_settings'); + }); + + /** + * This function handles the view last scan result event + * + * @param {*} e - the event + */ + function view_scan_results_handler(e) { + e.preventDefault(); + + var reset_change_detected = jQuery(this).data('reset_change_detected') ? 1 : 0; + + aios_submit_form(jQuery(this), 'get_last_scan_results', { reset_change_detected: reset_change_detected}, aios_trans.processing, null, function (response) { + if (reset_change_detected) jQuery('#aiowps_fcds_change_detected').remove(); + var targetOffset = jQuery('#aiowps_previous_scan_wrapper').offset().top; + jQuery('html, body').animate({ scrollTop: targetOffset }, 'slow'); + }) + } + + jQuery('#aiowps_manual_fcd_scan').on('click', function(e) { + e.preventDefault(); + + aios_submit_form(jQuery(this), 'perform_file_scan', true, aios_trans.scanning, function () { + jQuery('#aiowps_activejobs_table').html('

            '+ aios_trans.processing + '

            '); + jQuery('#aiowps_activejobs_table .aiowps_spinner').addClass('visible'); + }, function (response) { + jQuery('#aiowps_activejobs_table').html(''); + if ('success' === response.status) { + jQuery('#aiowps_activejobs_table').append('

            '+response.extra_args.result+'

            '); + } + }); + }); + // End of file scan handling + + // start of brute force ajax + jQuery('#aios-rename-login-page-form').on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_rename_login_page', true, aios_trans.saving, null,function(response) { + if ("error" === response.status) { + jQuery('#aiowps_enable_rename_login_page').prop('checked', false); + } + }) + }); + + jQuery("#aios-cookie-based-settings-form").on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_cookie_based_brute_force_prevention', true, aios_trans.saving, null, function (response) { + if ("success" === response.status) { + jQuery('#aios_message').remove(); + jQuery('#post-body .postbox').before(response.info_box); + } + }) + }); + + jQuery("#aios-perform-cookie-test").on('click', function(e) { + e.preventDefault(); + var cookieButton = jQuery(this); + cookieButton.prop('disabled', true); + + aios_submit_form(jQuery(this), 'perform_cookie_test', {}, aios_trans.processing, null,function(response) { + cookieButton.prop('disabled', false); + if ("success" === response.status) { + var submitButton = jQuery('#aios-cookie-based-settings-form').find(':submit'); + submitButton.prop('disabled', false); + } + }) + }); + + jQuery("#aios-login-whitelist-settings-form").on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_login_whitelist_settings'); + }); + + jQuery("#aios-honeypot-settings-form").on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_honeypot_settings'); + }); + + jQuery("#aios-captcha-settings-form").on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_captcha_settings'); + }); + + jQuery("#aios-404-detection-settings-form").on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_404_settings', true, aios_trans.saving, null, function(response) { + if ("success" === response.status) { + jQuery('.aios-404-detection-container').toggleClass('aio_hidden', !jQuery('#aiowps_enable_404_IP_lockout').is(':checked')); + } + }); + }); + + jQuery("#aios-delete-404-form").on('submit', function(e) { + e.preventDefault(); + aios_submit_form(jQuery(this), 'perform_delete_404_event_records', true, aios_trans.deleting, null, function(response) { + if ("success" === response.status) jQuery('#aios-404-event-logs-table').load(' #aios-404-event-logs-table > *', function () { + jQuery(".aiowps_more_info_body").hide(); + }); + }); + }); + + jQuery("#aios-404-event-logs-table").on('click', ".aios-delete-404", function(e) { + e.preventDefault(); + let data = { + id: jQuery(this).data('id'), + action: 'delete' + }; + if (confirm(jQuery(this).data('message'))) { + aios_submit_form(jQuery(this), 'perform_404_log_item_action', data, aios_trans.deleting, null, function (response) { + if ('success' === response.status) jQuery('#aios-404-event-logs-table').load(' #aios-404-event-logs-table > *'); + }); + } + }); + + jQuery("#aios-404-event-logs-table").on('click', ".aios-temp-block-404", function(e) { + e.preventDefault(); + let ip = jQuery(this).data('ip'), username = jQuery(this).data('username'), data = { + ip: ip, + action: 'temp_block', + username: username + }; + if (confirm(jQuery(this).data('message'))) { + aios_submit_form(jQuery(this), 'perform_404_log_item_action', data, aios_trans.blocking, null, function (response) { + if ('success' === response.status) jQuery('#aios-404-event-logs-table').load(' #aios-404-event-logs-table > *'); + }); + } + }); + + jQuery("#aios-404-event-logs-table").on('click', ".aios-blacklist-404", function(e) { + e.preventDefault(); + let ip = jQuery(this).data('ip'), data = { + ip: ip, + action: 'blacklist' + }; + if (confirm(jQuery(this).data('message'))) { + aios_submit_form(jQuery(this), 'perform_404_log_item_action', data, aios_trans.processing, null, function (response) { + if ('success' === response.status) jQuery('#aios-404-event-logs-table').load(' #aios-404-event-logs-table > *'); + }); + } + }); + + jQuery("#aios-404-event-logs-table").on('click', ".aios-unblock-404", function(e) { + e.preventDefault(); + let ip = jQuery(this).data('ip'), data = { + ip: ip, + action: 'unblock' + }; + if (confirm(jQuery(this).data('message'))) { + aios_submit_form(jQuery(this), 'perform_404_log_item_action', data, aios_trans.unlocking, null, function (response) { + if ('success' === response.status) jQuery('#aios-404-event-logs-table').load(' #aios-404-event-logs-table > *'); + }); + } + }); + // end of brute force ajax + + // Start of login whitelist suggests both IPv4 and IPv6 + if (jQuery('#aios_user_ip_maybe_also').length) { + var selector = '#aios-ipify-ip-address'; + var ipfield = '#aios_user_ip_maybe_also'; + var getting_text = jQuery(ipfield).attr('getting_text'); + var ip_maybe = jQuery(ipfield).attr('ip_maybe'); + if ('v6' == ip_maybe) { + var url = 'https://api64.ipify.org/?format=json'; + } else { + var url = 'https://api.ipify.org/?format=json'; + } + jQuery(selector).html(getting_text); + jQuery.ajax({ + type: 'GET', + dataType: 'json', + url: url, + success: function (response, status) { + if (response.hasOwnProperty('ip') && response.ip != jQuery('#aiowps_user_ip').val()) { + jQuery(ipfield).val(response.ip); + jQuery(ipfield).removeClass('aio_hidden'); + } else { + console.log(response); + } + jQuery(selector).html(''); + }, + error: function (response, status, error_code) { + console.log(response); + jQuery(selector).html(''); + } + }); + } + // End of login whitelist suggests both IPv4 and IPv6 + + // Click the 'show/hide advanced options' button + jQuery('button.button-link.aios-toggle-advanced-options').on('click', function() { + if (!jQuery(this).hasClass('advanced-options-disabled')) { + jQuery(this).toggleClass('opened'); + } + }); + + // Start of the new UI settings + var initial_values = {}; + jQuery('.aiowps-actions').hide(); + + /** + * Set active tab from URL + * + * @param {string} subtab + * + * @returns {void} + */ + function set_active_tab_from_url() { + const url_params = new URLSearchParams(window.location.search); + const subtab = url_params.get('subtab'); + if (subtab) { + jQuery('.aiowps-rules li').removeClass('aiowps-active'); + jQuery(`.aiowps-rules li[data-template="${subtab}"]`).addClass('aiowps-active'); + jQuery('.aiowps-settings .postbox').hide(); + jQuery(`.aiowps-settings .postbox[data-template="${subtab}"]`).show(); + } else { + jQuery('.aiowps-settings .postbox:first').show(); + } + } + + var initial_values = {}; + + /** + * Store initial values of the settings + * + * @returns {void} + */ + function store_values() { + jQuery('.aiowps-settings :input').each(function() { + if (jQuery(this).is(':checkbox')) { + initial_values[jQuery(this).attr('name')] = jQuery(this).is(':checked'); + } else { + initial_values[jQuery(this).attr('name')] = jQuery(this).val(); + } + }); + } + + // Store initial values on page load + store_values(); + + // Add change event listener to all inputs + function check_input() { + jQuery('.aiowps-settings :input').on('change', function() { + var all_inputs_back_to_original = true; + jQuery('.aiowps-settings :input').each(function() { + var input_name = jQuery(this).attr('name'); + if (jQuery(this).is(':checkbox')) { + if (jQuery(this).is(':checked') !== initial_values[input_name]) { + all_inputs_back_to_original = false; + return false; + } + } else { + if (jQuery(this).val() !== initial_values[input_name]) { + all_inputs_back_to_original = false; + return false; + } + } + }); + + if (all_inputs_back_to_original) { + jQuery('.aiowps-actions').hide(); + } else { + jQuery('.aiowps-actions').show(); + } + }); + } + check_input(); + // Add click event listener to the button + jQuery('.aiowps-actions :input').on('click', function() { + // Hide the actions div + jQuery('.aiowps-actions').hide(); + + // Re-store the values + store_values(); + }); + + /** + * Initiates the download of a text file with the provided data and title. + * + * @param {string} data - The text data to be included in the file. + * @param {string} title - The name of the file to be downloaded. + */ + function aios_download_txt_file(data, title) { + + // Create a Blob containing the text data + let blob = new Blob([data], {type: 'text/plain'}); + aios_download_file(blob, title); + } + + /** + * Initiates the download of a CSV file with the provided data and title. + * + * @param {string} data - The CSV data to be included in the file. + * @param {string} title - The name of the file to be downloaded. + */ + function aios_download_csv_file(data, title) { + + // Create a Blob containing the CSV data + let blob = new Blob([data], {type: 'text/csv'}); + aios_download_file(blob, title); + } + + /** + * Triggers the download of a file using the provided Blob and filename. + * + * This function creates a temporary URL for the given Blob, then creates + * and triggers a download of the file with the specified title. After the + * download is initiated, it cleans up by removing the temporary element + * and revoking the Blob URL. + * + * @param {Blob} blob - The Blob object containing the file data to be downloaded. + * @param {string} title - The name of the file to be downloaded (including the file extension). + */ + function aios_download_file(blob, title) { + + // Create a temporary URL to the Blob + let url = window.URL.createObjectURL(blob); + + // Create a temporary element to trigger the download + let a = document.createElement('a'); + a.href = url; + a.download = title; + document.body.appendChild(a); + a.click(); + + // Cleanup: remove the temporary element and revoke the Blob URL + document.body.removeChild(a); + window.URL.revokeObjectURL(url); + } + + // Add click event listener to rules + jQuery('.aiowps-rules li').on('click', function() { + jQuery('.aiowps-rules li').removeClass('aiowps-active'); + jQuery(this).addClass('aiowps-active'); + var template = jQuery(this).data('template'); + jQuery('.aiowps-settings .postbox').hide(); + jQuery('.aiowps-settings .postbox').each(function() { + if (jQuery(this).data('template') === template) { + jQuery(this).show(); + return false; + } + }); + const url_params = new URLSearchParams(window.location.search); + const subtab_param = 'subtab=' + template; + + if (url_params.has('subtab')) { + // If subtab parameter already exists, replace its value + url_params.set('subtab', template); + } else { + // If subtab parameter doesn't exist + if ("" === url_params.toString()) { + // If there are no existing parameters, append subtab with '?' + window.history.replaceState({}, '', window.location.pathname + '?' + subtab_param); + return; + } else { + // If there are existing parameters + const query_params = Array.from(url_params.entries()); + const new_params = query_params.map(param => param.join('=')).join('&'); + window.history.replaceState({}, '', window.location.pathname + '?' + new_params + '&' + subtab_param); + return; + } + } + + window.history.replaceState({}, '', window.location.pathname + '?' + url_params.toString()); + }); + + // Search for rules + jQuery('.aiowps-search').on('keydown', function(event) { + if ('Enter' === event.key) { + event.preventDefault(); + } + }); + + jQuery('.aiowps-search').on('keyup', function(event) { + if ('Enter' === event.key) { + event.preventDefault(); + } + var value = jQuery(this).val().toLowerCase(); + jQuery('.aiowps-rules li').each(function() { + var template_value = jQuery(this).data('template').toLowerCase(); + var span_text = jQuery(this).find('span').text().toLowerCase(); + var th_match = false; + jQuery('.form-table th').each(function() { + var th_text = jQuery(this).text().toLowerCase(); + if (th_text.indexOf(value) > -1) { + var template = jQuery(this).closest('.postbox').data('template'); + if (template === template_value) { + th_match = true; + return false; + } + } + }); + if (template_value.indexOf(value) > -1 || span_text.indexOf(value) > -1 || th_match) { + jQuery(this).show(); + } else { + jQuery(this).hide(); + } + }); + }); + + jQuery('#aiowps-rule-search .clear-search').on('click', function() { + jQuery('.aiowps-search').val(''); + jQuery('.aiowps-search').trigger('keyup'); + }); + + set_active_tab_from_url(); + // End of the new UI settings + + //toggle xmlrpc warning + jQuery('#aiowps_enable_pingback_firewall').change(function() { + if (jQuery(this).is(':checked')) { + // When the checkbox is checked, remove the 'aio_hidden' class + jQuery('.xmlrpc_warning_box').removeClass('aio_hidden'); + } else { + // Optionally, if unchecked, you can add the class back (if needed) + jQuery('.xmlrpc_warning_box').addClass('aio_hidden'); + } + }); + + // Start of WP REST API toggle whitelist setting handling + jQuery('input[name=aiowps_disallow_unauthorized_rest_requests]').on('click', function() { + jQuery('.aios-rest-white-list-options-panel').toggleClass('hidden'); + }); + // End of WP REST API toggle whitelist setting handling + + // Start of the copy report button handling + jQuery('#copy-report').on('click', function(event) { + var text = jQuery('#report-textarea').val(); + if (navigator.clipboard) { + navigator.clipboard.writeText(text).then(function() { + alert(aios_trans.copied); + }, function() { + deprecated_copy(text); + }); + } else { + deprecated_copy(text); + } + }); + // End of the copy report button handling + + // Start of the send report button handling + jQuery('#send-report').on('click', function(e) { + e.preventDefault(); + var report_email = jQuery('#report_email').val(); + var report_sections = jQuery('#report_sections').val(); + jQuery('#report-response').html('

            '+ aios_trans.processing + '

            '); + jQuery('#report-response .aiowps_spinner').addClass('visible'); + + aios_send_command('send_report_email', {'report_email': report_email, 'report_sections': report_sections}, function (resp) { + if (resp.hasOwnProperty('message')) { + alert(resp.message); + } + }); + }); + // End of the send report button handling +}); diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/js/wp-security-front-script.js b/wp-content/plugins/all-in-one-wp-security-and-firewall/js/wp-security-front-script.js new file mode 100755 index 00000000..7a9e3cc3 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/js/wp-security-front-script.js @@ -0,0 +1,32 @@ +jQuery(function($) { + // antibot keys are expired then add new keys to comment form + if ($('.comment-form-aios-antibot-keys').length && $('#aios_antibot_keys_expiry').length) { + if ($('#aios_antibot_keys_expiry').val() < Math.floor(Date.now() / 1000)) { + jQuery.ajax({ + url: AIOS_FRONT.ajaxurl, + type: 'post', + dataType: 'json', + cache: false, + data: { + action: 'get_antibot_keys', + nonce: AIOS_FRONT.ajax_nonce + }, + success: function(resp) { + if (resp.hasOwnProperty('error_code')) { + console.log("ERROR: " + resp.error_message); + } else if (resp.hasOwnProperty('data')) { + for (var indx in resp.data) { + var input = $("").attr("type", "hidden"); + input.attr("name", resp.data[indx][0]); + input.attr("value", resp.data[indx][1]); + $('.comment-form-aios-antibot-keys').append(input); + } + } + }, + error: function(xhr, text_status, error_thrown) { + console.log("ERROR: " + text_status + " : " + error_thrown); + } + }); + } + } +}); \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-fr_FR.mo b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-fr_FR.mo new file mode 100755 index 00000000..643e276e Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-fr_FR.mo differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-fr_FR.po b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-fr_FR.po new file mode 100755 index 00000000..3e5f3b15 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-fr_FR.po @@ -0,0 +1,5991 @@ +msgid "" +msgstr "" +"Project-Id-Version: AIOWPS\n" +"POT-Creation-Date: 2016-04-12 12:12+0200\n" +"PO-Revision-Date: 2016-04-18 17:41+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 1.8.7\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-KeywordsList: __;_e\n" +"X-Poedit-SearchPath-0: .\n" + +#. Plugin Name of the plugin +msgid "All In One WP Security" +msgstr "" + +#. Plugin URI of the plugin +msgid "https://wordpress.org/plugins/all-in-one-wp-security-and-firewall/" +msgstr "" + +#. Description of the plugin +msgid "All round best WordPress security plugin!" +msgstr "" + +#. Author of the plugin +msgid "All In One WP Security & Firewall Team" +msgstr "" + +#. Author URI of the plugin +msgid "https://teamupdraft.com/" +msgstr "" + +#: admin/general/wp-security-list-table.php:483 +msgid "Are you sure you want to perform this bulk action?" +msgstr "" + +#: admin/wp-security-admin-init.php:259 +msgid "Unexpected response:" +msgstr "" + +#: admin/wp-security-admin-init.php:290 +msgid "Enjoyed %1$s? Please leave us a %2$s rating. We really appreciate your support!" +msgstr "" + +#: admin/wp-security-admin-init.php:414 +#: classes/wp-security-two-factor-login.php:95 +msgid "WP Security" +msgstr "WP sécurité" + +#: admin/wp-security-admin-init.php:415 +#: admin/wp-security-dashboard-menu.php:26 +#: admin/wp-security-dashboard-menu.php:76 +msgid "Dashboard" +msgstr "Tableau de bord" + +#: admin/wp-security-admin-init.php:416 +#: admin/wp-security-settings-menu.php:95 +msgid "Settings" +msgstr "Paramètres" + +#: admin/wp-security-admin-init.php:417 +msgid "User Accounts" +msgstr "Comptes utilisateur" + +#: admin/wp-security-admin-init.php:418 +msgid "User Login" +msgstr "Connexion" + +#: admin/wp-security-admin-init.php:419 +msgid "User Registration" +msgstr "Enregistrement de l’utilisateur" + +#: admin/wp-security-admin-init.php:420 +msgid "Database Security" +msgstr "Sécurité BdD" + +#: admin/wp-security-admin-init.php:424 +msgid "Filesystem Security" +msgstr "Sécurité des fichiers" + +#: admin/wp-security-admin-init.php:429 +msgid "Blacklist Manager" +msgstr "Gestionnaire de liste noire" + +#: admin/wp-security-admin-init.php:434 +#: admin/wp-security-firewall-menu.php:60 +msgid "Firewall" +msgstr "Pare-feu" + +#: admin/wp-security-admin-init.php:436 +msgid "Brute Force" +msgstr "Brute Force" + +#: admin/wp-security-admin-init.php:437 +msgid "Spam Prevention" +msgstr "Prévention du SPAM" + +#: admin/wp-security-admin-init.php:441 +#: admin/wp-security-filescan-menu.php:53 +msgid "Scanner" +msgstr "Scanner" + +#: admin/wp-security-admin-init.php:443 +#: admin/wp-security-maintenance-menu.php:51 +msgid "Maintenance" +msgstr "Maintenance" + +#: admin/wp-security-admin-init.php:444 +#: admin/wp-security-misc-options-menu.php:57 +msgid "Miscellaneous" +msgstr "Divers" + +#: admin/wp-security-admin-init.php:445 +#: admin/wp-security-tools-menu.php:64 +msgid "Tools" +msgstr "" + +#: admin/wp-security-admin-init.php:457 +msgid "Premium Upgrade" +msgstr "" + +#: admin/wp-security-admin-menu.php:67 +msgid "Settings successfully updated." +msgstr "Paramètres correctement mis à jour" + +#: admin/wp-security-admin-menu.php:77 +msgid "Successfully deleted the selected record(s)." +msgstr "" + +#: admin/wp-security-admin-menu.php:86 +msgid "Failed to delete the selected record(s)." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:25 +msgid "Ban users" +msgstr "Utilisateurs bannis" + +#: admin/wp-security-blacklist-menu.php:51 +msgid "Blacklist manager" +msgstr "Gestionnaire de liste noire" + +#: admin/wp-security-blacklist-menu.php:132 +#: admin/wp-security-firewall-menu.php:1233 +#: admin/wp-security-list-404.php:234 +#: admin/wp-security-list-comment-spammer-ip.php:205 +msgid "The plugin was unable to write to the .htaccess file. Please edit file manually." +msgstr "L’extension a été incapable d’écrire dans le fichier .htaccess. Veuillez éditer manuellement ce fichier." + +#: admin/wp-security-blacklist-menu.php:139 +msgid "Ban IPs or user agents" +msgstr "Adresses IP ou ID d’utilisateur banni(e)s" + +#: admin/wp-security-blacklist-menu.php:142 +msgid "The All In One WP Security Blacklist feature gives you the option of banning certain host IP addresses or ranges and also user agents." +msgstr "La fonctionnalité liste noire d’All In One WP Security vous donne la possibilité de bannir certaines plages d’adresses IP, d’hôte ou ID d’utilisateurs." + +#: admin/wp-security-blacklist-menu.php:143 +msgid "This feature will deny total site access for users which have IP addresses or user agents matching those which you have configured in the settings below." +msgstr "Cette fonctionnalité refuse l’accès au site pour les utilisateurs qui ont des adresses IP ou ID utilisateurs correspondant à celles que vous avez configuré ci-dessous." + +#: admin/wp-security-blacklist-menu.php:144 +msgid "The plugin achieves this by making appropriate modifications to your .htaccess file." +msgstr "L’extension atteint cet objectif en apportant les modifications appropriées à votre fichier .htaccess." + +#: admin/wp-security-blacklist-menu.php:145 +msgid "By blocking people, you are using the most secure first line of defence, which denies all access to blacklisted visitors as soon as they hit your hosting server." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:154 +#: admin/wp-security-firewall-menu.php:1055 +#: templates/may-also-like.php:20 +msgid "All In One WP Security & Firewall Premium" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:155 +#: admin/wp-security-firewall-menu.php:1056 +msgid "You may also be interested in %s." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "This plugin adds a number of extra features including %s and %s." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "smart 404 blocking" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "country IP blocking" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:170 +msgid "IP hosts and user agent blacklist settings" +msgstr "Paramètres de liste noire d’IP hôtes et/ou d’ID utilisateurs" + +#: admin/wp-security-blacklist-menu.php:182 +#: admin/wp-security-brute-force-menu.php:193 +#: admin/wp-security-brute-force-menu.php:331 +msgid "must read this message" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:183 +#: admin/wp-security-brute-force-menu.php:194 +msgid "This feature can lock you out of admin if it doesn't work correctly on your site. You %s before activating this feature." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:189 +msgid "Enable IP or user agent blacklisting" +msgstr "Activer la liste noire d’IP ou d’ID utilisateur" + +#: admin/wp-security-blacklist-menu.php:192 +msgid "Check this if you want to enable the banning (or blacklisting) of selected IP addresses and/or user agents specified in the settings below" +msgstr "Cochez si vous souhaitez activer l’interdiction des adresses IP sélectionnées et/ou ID d’utilisateurs spécifiés dans les paramètres ci-dessous" + +#: admin/wp-security-blacklist-menu.php:196 +msgid "Enter IP addresses:" +msgstr "Entrez les adresses IP :" + +#: admin/wp-security-blacklist-menu.php:200 +msgid "Enter one or more IP addresses or IP ranges." +msgstr "Entrez une ou plusieurs adresse(s) IP (ou plage d’adresses)." + +#: admin/wp-security-blacklist-menu.php:205 +msgid "Enter user agents:" +msgstr "Entrez les agents utilisateurs:" + +#: admin/wp-security-blacklist-menu.php:210 +msgid "Enter one or more user agent strings." +msgstr "Saisissez un ou plusieurs chaînes de l’agent utilisateur." + +#: admin/wp-security-blacklist-menu.php:211 +#: admin/wp-security-brute-force-menu.php:374 +#: admin/wp-security-brute-force-menu.php:408 +#: admin/wp-security-brute-force-menu.php:431 +#: admin/wp-security-brute-force-menu.php:452 +#: admin/wp-security-filescan-menu.php:309 +#: admin/wp-security-filescan-menu.php:326 +#: admin/wp-security-firewall-menu.php:175 +#: admin/wp-security-firewall-menu.php:212 +#: admin/wp-security-firewall-menu.php:232 +#: admin/wp-security-firewall-menu.php:258 +#: admin/wp-security-firewall-menu.php:385 +#: admin/wp-security-firewall-menu.php:415 +#: admin/wp-security-firewall-menu.php:446 +#: admin/wp-security-firewall-menu.php:474 +#: admin/wp-security-firewall-menu.php:503 +#: admin/wp-security-firewall-menu.php:681 +#: admin/wp-security-firewall-menu.php:699 +#: admin/wp-security-firewall-menu.php:737 +#: admin/wp-security-firewall-menu.php:868 +#: admin/wp-security-firewall-menu.php:1087 +#: admin/wp-security-firewall-menu.php:1110 +#: admin/wp-security-spam-menu.php:186 +#: admin/wp-security-spam-menu.php:221 +#: admin/wp-security-spam-menu.php:390 +#: admin/wp-security-spam-menu.php:430 +#: admin/wp-security-user-login-menu.php:362 +#: templates/info/ip-address-ip-range-info.php:2 +#: templates/menus/settings/advanced-settings.php:63 +msgid "More info" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:214 +msgid "Each user agent string must be on a new line." +msgstr "Chaque chaîne d’ID utilisateur doit figurer sur une nouvelle ligne." + +#: admin/wp-security-blacklist-menu.php:215 +msgid "Example 1 - A single user agent string to block:" +msgstr "Exemple 1 - Un seul agent utilisateur à bloquer :" + +#: admin/wp-security-blacklist-menu.php:217 +msgid "Example 2 - A list of more than 1 user agent strings to block" +msgstr "Exemple 2 - Une liste de plusieurs agents utilisateurs à bloquer :" + +#: admin/wp-security-blacklist-menu.php:225 +#: admin/wp-security-brute-force-menu.php:213 +#: admin/wp-security-brute-force-menu.php:686 +#: admin/wp-security-brute-force-menu.php:806 +#: admin/wp-security-brute-force-menu.php:868 +#: admin/wp-security-filescan-menu.php:351 +#: admin/wp-security-filesystem-menu.php:242 +#: admin/wp-security-firewall-menu.php:945 +#: admin/wp-security-firewall-menu.php:1129 +#: admin/wp-security-misc-options-menu.php:167 +#: admin/wp-security-misc-options-menu.php:218 +#: admin/wp-security-misc-options-menu.php:278 +#: admin/wp-security-settings-menu.php:619 +#: admin/wp-security-settings-menu.php:680 +#: admin/wp-security-spam-menu.php:233 +#: admin/wp-security-spam-menu.php:407 +#: admin/wp-security-spam-menu.php:526 +#: admin/wp-security-spam-menu.php:588 +#: admin/wp-security-user-login-menu.php:384 +#: admin/wp-security-user-login-menu.php:422 +#: admin/wp-security-user-login-menu.php:601 +#: admin/wp-security-user-login-menu.php:788 +#: admin/wp-security-user-registration-menu.php:150 +#: admin/wp-security-user-registration-menu.php:242 +#: admin/wp-security-user-registration-menu.php:305 +#: templates/menus/settings/advanced-settings.php:217 +msgid "Save settings" +msgstr "Enregistrer les modifications" + +#: admin/wp-security-brute-force-menu.php:33 +#: admin/wp-security-brute-force-menu.php:759 +#: admin/wp-security-dashboard-menu.php:651 +msgid "Rename login page" +msgstr "Renommer la page de connexion" + +#: admin/wp-security-brute-force-menu.php:34 +#: admin/wp-security-brute-force-menu.php:154 +msgid "Cookie based brute force prevention" +msgstr "Protection contre « Brute Force basée cookie »" + +#: admin/wp-security-brute-force-menu.php:35 +#: classes/grade-system/wp-security-feature-item-manager.php:105 +msgid "Login CAPTCHA" +msgstr "Captcha de Connexion" + +#: admin/wp-security-brute-force-menu.php:36 +#: admin/wp-security-brute-force-menu.php:746 +msgid "Login whitelist" +msgstr "Liste blanche de connexion" + +#: admin/wp-security-brute-force-menu.php:37 +msgid "Honeypot" +msgstr "Utiliser Honeypot." + +#: admin/wp-security-brute-force-menu.php:67 +msgid "Brute force" +msgstr "Brute Force" + +#: admin/wp-security-brute-force-menu.php:105 +msgid "Please enter a value for your login page slug." +msgstr "Veuillez entrer un alias pour votre page de connexion sécurisée." + +#: admin/wp-security-brute-force-menu.php:109 +msgid "You cannot use the value \"wp-admin\" for your login page slug." +msgstr "Vous ne pouvez utiliser la valeur « wp-admin » pour l’alias de votre page de connexion sécurisée." + +#: admin/wp-security-brute-force-menu.php:111 +msgid "You must use alpha numeric characters for your login page slug." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:116 +#: admin/wp-security-filescan-menu.php:174 +#: admin/wp-security-firewall-menu.php:151 +#: admin/wp-security-firewall-menu.php:1011 +#: admin/wp-security-spam-menu.php:101 +#: admin/wp-security-spam-menu.php:270 +#: admin/wp-security-spam-menu.php:302 +#: admin/wp-security-user-login-menu.php:184 +#: admin/wp-security-user-login-menu.php:553 +#: templates/partials/non-apache-feature-notice.php:9 +msgid "Attention:" +msgstr "A l’attention de :" + +#: admin/wp-security-brute-force-menu.php:133 +msgid "Could not delete the Cookie-based directives from the .htaccess file. Please check the file permissions." +msgstr "Impossible de supprimer les directives basées-cookie à partir du fichier .htaccess. Veuillez vérifier les permissions des fichiers." + +#: admin/wp-security-brute-force-menu.php:155 +msgid "Login page white list" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:156 +msgid "An effective Brute Force prevention technique is to change the default WordPress login page URL." +msgstr "Une technique efficace de prévention contre Brute Force consiste à changer l’URL par défaut de la page de connexion à WordPress." + +#: admin/wp-security-brute-force-menu.php:157 +msgid "Normally if you wanted to login to WordPress you would type your site's home URL followed by wp-login.php." +msgstr "Normalement, si vous voulez vous connecter à WordPress, vous tapez l’URL de votre site attendue par wp-login.php." + +#: admin/wp-security-brute-force-menu.php:158 +msgid "This feature allows you to change the login URL by setting your own slug and renaming the last portion of the login URL which contains the wp-login.php to any string that you like." +msgstr "Cette fonction permet de modifier l'URL de connexion en définissant votre propre alias et ajoutant l'URL de connexion à wp-login.php." + +#: admin/wp-security-brute-force-menu.php:159 +msgid "By doing this, malicious bots and hackers will not be able to access your login page because they will not know the correct login page URL." +msgstr "En procédant ainsi, les robots et pirates ne pourront accéder à votre page de connexion, car ils ne connaîtront pas la bonne URL." + +#: admin/wp-security-brute-force-menu.php:161 +msgid "You may also be interested in the following alternative brute force prevention features:" +msgstr "Ces fonctionnalités alternatives de prévention de Brute Force peuvent également vous intéresser :" + +#: admin/wp-security-brute-force-menu.php:172 +msgid "Your WordPress login page URL has been renamed." +msgstr "Votre URL de connexion WordPress a été renommée." + +#: admin/wp-security-brute-force-menu.php:173 +msgid "Your current login URL is:" +msgstr "Votre nouvelle URL de connexion est :" + +#: admin/wp-security-brute-force-menu.php:181 +msgid "Rename login page settings" +msgstr "Renommer la page de connexion" + +#: admin/wp-security-brute-force-menu.php:195 +msgid "NOTE: If you are hosting your site on WPEngine or a provider which performs server caching, you will need to ask the host support people to NOT cache your renamed login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:200 +msgid "Enable rename login page feature" +msgstr "Autorisez le renommage de la page des réglages de Connexion" + +#: admin/wp-security-brute-force-menu.php:203 +msgid "Check this if you want to enable the rename login page feature" +msgstr "Cocher si vous souhaitez activer la fonction de renommage de la page de connexion" + +#: admin/wp-security-brute-force-menu.php:207 +msgid "Login page URL" +msgstr "URL de page de connexion" + +#: admin/wp-security-brute-force-menu.php:209 +msgid "Enter a string which will represent your secure login page slug. You are encouraged to choose something which is hard to guess and only you will remember." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:243 +msgid "Settings have not been saved - your secret word must consist only of alphanumeric characters, ie, letters and/or numbers only." +msgstr "Paramètres non enregistrés : votre mot secret ne doit comporter que des caractères alphanumériques, à savoir seulement lettres et chiffres !" + +#: admin/wp-security-brute-force-menu.php:257 +msgid "You have successfully enabled the cookie based brute force prevention feature" +msgstr "Vous avez correctement activé la fonctionnalité de prévention de Brute Force basée cookie" + +#: admin/wp-security-brute-force-menu.php:258 +msgid "From now on you will need to log into your WP Admin using the following URL:" +msgstr "À partir de maintenant, vous aurez besoin de l’URL suivante pour vous connecter à votre Admin WP :" + +#: admin/wp-security-brute-force-menu.php:260 +msgid "It is important that you save this URL value somewhere in case you forget it, OR," +msgstr "Il est important d’enregistrer cette URL quelque part pour le cas où vous l’oublieriez, OU" + +#: admin/wp-security-brute-force-menu.php:261 +msgid "simply remember to add a \"?%s=1\" to your current site URL address." +msgstr "rappelez-vous simplement d’ajouter « ?%s=1 » à l’adresse URL de votre site actuel." + +#: admin/wp-security-brute-force-menu.php:265 +msgid "You have successfully saved cookie based brute force prevention feature settings." +msgstr "Vous avez correctement enregistré les paramètres de prévention de Brute Force basée cookie." + +#: admin/wp-security-brute-force-menu.php:295 +msgid "Brute force prevention firewall settings" +msgstr "Paramètres du pare-feu contre la Brute Force" + +#: admin/wp-security-brute-force-menu.php:300 +msgid "A Brute Force Attack is when a hacker tries many combinations of usernames and passwords until they succeed in guessing the right combination." +msgstr "Une attaque Brute Force se caractérise par des essais répétés de nombreuses combinaisons d’ID utilisateurs / mots de passe, jusqu’à parvenir à trouver la bonne." + +#: admin/wp-security-brute-force-menu.php:301 +msgid "Due to the fact that at any one time there may be many concurrent login attempts occurring on your site via malicious automated robots, this also has a negative impact on your server's memory and performance." +msgstr "En raison du fait qu’à un moment donné, il peut y avoir de nombreuses tentatives de connexion à votre site par des robots malveillants, un énorme impact négatif sur la mémoire et les performances de votre serveur peut avoir lieu." + +#: admin/wp-security-brute-force-menu.php:302 +msgid "The features in this tab will stop the majority of brute force login attacks thus providing even better protection for your WP login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:307 +#: admin/wp-security-firewall-menu.php:654 +msgid "backup" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:308 +msgid "video tutorial" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:309 +msgid "To learn more about how to use this feature, please watch the following %s." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:310 +#: admin/wp-security-brute-force-menu.php:758 +msgid "Cookie-Based Brute Force Login Prevention" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:320 +#: admin/wp-security-user-login-menu.php:253 +msgid "Cookie based brute force login prevention" +msgstr "Protection contre « Brute Force basée cookie »" + +#: admin/wp-security-brute-force-menu.php:331 +msgid "This feature can lock you out of admin if it doesn't work correctly on your site. You
            " +msgstr "" + +#: admin/wp-security-brute-force-menu.php:342 +msgid "The cookie test was successful. You can now enable this feature." +msgstr "Le test de cookie a été couronnée de succès. Vous pouvez maintenant activer cette fonctionnalité." + +#: admin/wp-security-brute-force-menu.php:350 +msgid "The cookie test failed on this server. Consequently, this feature cannot be used on this site." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:357 +msgid "Before using this feature, you must perform a cookie test first." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:359 +msgid "This ensures that your browser cookie is working correctly and that you won't lock yourself out." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:364 +msgid "Perform cookie test" +msgstr "Effectuer le test du Cookie" + +#: admin/wp-security-brute-force-menu.php:370 +#: classes/grade-system/wp-security-feature-item-manager.php:103 +msgid "Enable brute force attack prevention" +msgstr "Activer la prévention d’attaque Brute Force" + +#: admin/wp-security-brute-force-menu.php:373 +msgid "Check this if you want to protect your login page from Brute Force Attack." +msgstr "Cocher si vous souhaitez protéger votre page de connexion d’une attaque par Brute Force." + +#: admin/wp-security-brute-force-menu.php:378 +msgid "This feature will deny access to your WordPress login page for all people except those who have a special cookie in their browser." +msgstr "Cette fonctionnalité refusera l’accès à votre page de connexion WordPress pour tous visiteurs sauf ceux ayant un cookie spécial dans leur navigateur." + +#: admin/wp-security-brute-force-menu.php:380 +msgid "To use this feature do the following:" +msgstr "Pour utiliser cette fonctionnalité procéder comme suit :" + +#: admin/wp-security-brute-force-menu.php:382 +msgid "1) Enable the checkbox." +msgstr "1) Cochez la case." + +#: admin/wp-security-brute-force-menu.php:384 +msgid "2) Enter a secret word consisting of alphanumeric characters which will be difficult to guess. This secret word will be useful whenever you need to know the special URL which you will use to access the login page (see point below)." +msgstr "2) Entrez un mot secret composé de caractères alphanumériques qui seront difficiles à deviner. Ce mot secret sera utile lorsque vous aurez besoin de vous remémorer l’URL spéciale que vous utiliserez pour accéder à la page de connexion (voir point ci-dessous)." + +#: admin/wp-security-brute-force-menu.php:386 +msgid "3) You will then be provided with a special login URL. You will need to use this URL to login to your WordPress site instead of the usual login URL. NOTE: The system will deposit a special cookie in your browser which will allow you access to the WordPress administration login page." +msgstr "3) vous recevrez ensuite une URL de connexion spéciale. Vous devrez utiliser cette URL pour vous connecter à votre site WordPress en lieu et place de l’URL de connexion standard. Remarque : Le système déposera un cookie spécial dans votre navigateur qui vous permettra d’accédez à la page de connexion d’administration WordPress (veillez à ce qu’il ne soit pas détruit)." + +#: admin/wp-security-brute-force-menu.php:388 +msgid "Any person trying to access your login page who does not have the special cookie in their browser will be automatically blocked." +msgstr "Tout visiteur essayant d’accéder à votre page de connexion sans avoir le cookie spécial dans son navigateur sera automatiquement bloqué(e)." + +#: admin/wp-security-brute-force-menu.php:395 +msgid "Secret word" +msgstr "Clé secrète" + +#: admin/wp-security-brute-force-menu.php:397 +msgid "Choose a secret word consisting of alphanumeric characters which you can use to access your special URL. Your are highly encouraged to choose a word which will be difficult to guess." +msgstr "Choisissez un mot secret composé de caractères alphanumériques qui vous permettra d’accéder à votre URL spéciale. Vous êtes fortement encouragés à choisir un mot difficile à deviner mais qu’il vous faudra retenir !" + +#: admin/wp-security-brute-force-menu.php:401 +msgid "Re-direct URL" +msgstr "URL de redirection" + +#: admin/wp-security-brute-force-menu.php:405 +msgid "Specify a URL to redirect a hacker to when they try to access your WordPress login page." +msgstr "Spécifiez l'URL où rediriger les pirates quand ils essaient d'accéder à votre page de connexion de WordPress." + +#: admin/wp-security-brute-force-menu.php:412 +msgid "The URL specified here can be any site's URL and does not have to be your own. For example you can be as creative as you like and send hackers to the CIA or NSA home page." +msgstr "L’URL spécifiée ici peut être celle de n’importe quel site et naturellement, pas le vôtre. Vous pouvez faire preuve de créativité et envoyez les pirates à la page d’accueil de la CIA ou de la NSA par exemple." + +#: admin/wp-security-brute-force-menu.php:414 +msgid "This field will default to: http://127.0.0.1 if you do not enter a value." +msgstr "Champ par défaut : http://127.0.0.1 si vous n’entrez aucune valeur." + +#: admin/wp-security-brute-force-menu.php:416 +msgid "Useful Tip:" +msgstr "Petite astuce utile :" + +#: admin/wp-security-brute-force-menu.php:418 +msgid "It's a good idea to not redirect attempted brute force login attempts to your site because it increases the load on your server." +msgstr "C’est une bonne idée que de ne pas rediriger les tentatives de connexion Brute Force sur votre propre site car elles augmenteraient la charge de votre serveur." + +#: admin/wp-security-brute-force-menu.php:420 +msgid "Redirecting a hacker or malicious bot back to \"http://127.0.0.1\" is ideal because it deflects them back to their own local host and puts the load on their server instead of yours." +msgstr "Rediriger pirates ou bots malicieux vers « http://127.0.0.1 » est idéal car elle les renvoie à leur propre hôte et met la charge sur leur serveur au lieu du vôtre." + +#: admin/wp-security-brute-force-menu.php:427 +msgid "My site has posts or pages which are password protected" +msgstr "Mon site a des articles ou des pages protégés par mot-clé anti Brute Force" + +#: admin/wp-security-brute-force-menu.php:430 +msgid "Check this if you are using the native WordPress password protection feature for some or all of your blog posts or pages." +msgstr "Cocher si vous utilisez la fonctionnalité native WordPress de protection par mot de passe pour tout ou partie de votre blog ou site." + +#: admin/wp-security-brute-force-menu.php:435 +msgid "In the cases where you are protecting some of your posts or pages using the in-built WordPress password protection feature, a few extra lines of directives and exceptions need to be added so that people trying to access pages are not automatically blocked." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:437 +msgid "By enabling this checkbox, the plugin will add the necessary rules and exceptions so that people trying to access these pages are not automatically blocked." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:439 +msgid "Helpful Tip:" +msgstr "Conseil utile :" + +#: admin/wp-security-brute-force-menu.php:441 +msgid "If you do not use the WordPress password protection feature for your posts or pages then it is highly recommended that you leave this checkbox disabled." +msgstr "Si vous n'utilisez pas la fonctionnalité de protection par mot de passe WordPress pour vos articles ou pages, il est hautement recommandé de laissez cette case désactivée." + +#: admin/wp-security-brute-force-menu.php:448 +msgid "My site has a theme or plugins which use AJAX" +msgstr "Mon Site a un thème ou des extensions utilisant AJAX" + +#: admin/wp-security-brute-force-menu.php:451 +msgid "Check this if your site uses AJAX functionality." +msgstr "Cocher si votre site utilise des fonctionnalités AJAX." + +#: admin/wp-security-brute-force-menu.php:456 +msgid "In the cases where your WordPress installation has a theme or plugin that uses AJAX, a few extra lines of directives and exceptions need to be added to prevent AJAX requests from being automatically blocked by the brute force prevention feature." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:458 +msgid "By enabling this checkbox, the plugin will add the necessary rules and exceptions so that AJAX operations will work as expected." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:467 +msgid "Save feature settings" +msgstr "Enregistrer les paramètres de fonction" + +#: admin/wp-security-brute-force-menu.php:525 +msgid "This feature allows you to add a CAPTCHA form on various WordPress login pages and forms." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:526 +msgid "Adding a CAPTCHA form on a login page or form is another effective yet simple \"Brute Force\" prevention technique." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:527 +msgid "You have the option of using either %s or a plain maths CAPTCHA form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:528 +msgid "If you enable Google reCAPTCHA the reCAPTCHA widget will be displayed for all forms the CAPTCHA settings below." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:529 +msgid "If Google reCAPTCHA is disabled the simple maths CAPTCHA form will apply and users will need to enter the answer to a simple mathematical question." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:535 +msgid "Google reCAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:540 +msgid "By enabling these settings the Google reCAPTCHA v2 widget will be applied by default for all forms with CAPTCHA enabled." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:549 +msgid "reCAPTCHA will not work because you have disabled login lockout by activating the AIOS_DISABLE_LOGIN_LOCKOUT constant value in a configuration file." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:550 +msgid "To enable it, define AIOS_DISABLE_LOGIN_LOCKOUT constant value as false, or remove it." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:558 +msgid "Use Google reCAPTCHA as default" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:561 +msgid "Check this if you want to default to Google reCAPTCHA for all settings below. (If this is left unchecked, all CAPTCHA forms will revert to the plain maths CAPTCHA)" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:565 +msgid "Site key" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:571 +msgid "Secret key" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:580 +msgid "Login form CAPTCHA settings" +msgstr "Réglage du Captcha du formulaire de connexion" + +#: admin/wp-security-brute-force-menu.php:589 +msgid "Enable CAPTCHA on login page" +msgstr "Activer le Captcha sur la page de Connexion" + +#: admin/wp-security-brute-force-menu.php:592 +msgid "Check this if you want to insert a CAPTCHA form on the login page." +msgstr "Cochez si vous souhaitez insérer un formulaire Captcha sur la page de connexion" + +#: admin/wp-security-brute-force-menu.php:598 +msgid "Lost password form CAPTCHA settings" +msgstr "Mot de passe des paramètres de formulaire Captcha perdu" + +#: admin/wp-security-brute-force-menu.php:608 +msgid "Enable CAPTCHA on lost password page" +msgstr "Activer le Captcha sur la page Mot de passe perdu" + +#: admin/wp-security-brute-force-menu.php:611 +msgid "Check this if you want to insert a CAPTCHA form on the lost password page." +msgstr "Cochez si vous souhaitez insérer un formulaire Captcha sur la page de mot de passe perdu" + +#: admin/wp-security-brute-force-menu.php:617 +msgid "Custom login form CAPTCHA settings" +msgstr "Personnalisation des réglages du Captcha de formulaire de connexion" + +#: admin/wp-security-brute-force-menu.php:626 +msgid "Enable CAPTCHA on custom login form" +msgstr "Activer le Captcha sur le formulaire de connexion" + +#: admin/wp-security-brute-force-menu.php:629 +msgid "Check this if you want to insert CAPTCHA on a custom login form generated by the following WP function: wp_login_form()" +msgstr "Cochez si vous souhaitez insérer un Captcha dans le formulaire de connexion personnalisé généré par la fonction WP : wp_login_form()" + +#: admin/wp-security-brute-force-menu.php:639 +msgid "WooCommerce forms CAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:648 +msgid "Enable CAPTCHA on WooCommerce login form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:651 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce login form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:661 +msgid "Enable CAPTCHA on WooCommerce lost password form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:664 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce lost password form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:674 +msgid "Enable CAPTCHA on WooCommerce registration form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:677 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce registration form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:749 +msgid "The All In One WP Security Whitelist feature gives you the option of only allowing certain IP addresses or ranges to have access to your WordPress login page." +msgstr "La fonctionnalité liste blanche d’All In One WP Security vous donne la possibilité de n’autoriser que certaines adresses IP (ou plages) à avoir accès à votre page de connexion WordPress." + +#: admin/wp-security-brute-force-menu.php:750 +msgid "This feature will deny login access for all IP addresses which are not in your whitelist as configured in the settings below." +msgstr "Cette fonctionnalité refusera l’accès à toutes les adresses IP qui ne font pas partie de votre liste blanche configurée dans les paramètres ci-dessous." + +#: admin/wp-security-brute-force-menu.php:751 +msgid "The plugin achieves this by writing the appropriate directives to your .htaccess file." +msgstr "L’extension réalise cela en écrivant les directives appropriées dans votre fichier .htaccess." + +#: admin/wp-security-brute-force-menu.php:752 +msgid "By allowing/blocking IP addresses, you are using the most secure first line of defence because login access will only be granted to whitelisted IP addresses and other addresses will be blocked as soon as they try to access your login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:760 +msgid "Attention: If in addition to enabling the white list feature, you also have one of the %s or %s features enabled, you will still need to use your secret word or special slug in the URL when trying to access your WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:761 +msgid "These features are NOT functionally related. Having both of them enabled on your site means you are creating 2 layers of security." +msgstr "Ces fonctionnalités ne sont pas liées opérationnellement. Si les deux sont activées sur votre site, cela signifie que vous créez 2 couches de sécurité." + +#: admin/wp-security-brute-force-menu.php:772 +msgid "Login IP whitelist settings" +msgstr "Paramétrage de liste blanche des IP de connexion" + +#: admin/wp-security-brute-force-menu.php:783 +msgid "Enable IP whitelisting" +msgstr "Activer la liste blanche d’IP" + +#: admin/wp-security-brute-force-menu.php:786 +#: admin/wp-security-user-login-menu.php:408 +msgid "Check this if you want to enable the whitelisting of selected IP addresses specified in the settings below" +msgstr "Cochez si vous souhaitez activer la liste blanche pour certaines adresses IP spécifiées dans les paramètres ci-dessous" + +#: admin/wp-security-brute-force-menu.php:790 +msgid "Your current IP address" +msgstr "Votre adresse IP actuelle" + +#: admin/wp-security-brute-force-menu.php:793 +msgid "You can copy and paste this address in the text box below if you want to include it in your login whitelist." +msgstr "Vous pouvez copier / coller cette adresse dans la zone de texte ci-dessous pour l’inclure en liste blanche de connexion." + +#: admin/wp-security-brute-force-menu.php:797 +#: admin/wp-security-user-login-menu.php:412 +msgid "Enter whitelisted IP addresses:" +msgstr "Entrez les adresses IP en liste blanche :" + +#: admin/wp-security-brute-force-menu.php:801 +#: admin/wp-security-user-login-menu.php:416 +msgid "Enter one or more IP addresses or IP ranges you wish to include in your whitelist." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:801 +msgid "Only the addresses specified here will have access to the WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:839 +msgid "This feature allows you to add a special hidden \"honeypot\" field on the WordPress login page. This will only be visible to robots and not humans." +msgstr "Cette fonctionnalité permet d’ajouter un champ caché spécial « Honeypot » sur la page de connexion WordPress. Il ne sera visible que des robots, et pas des humains." + +#: admin/wp-security-brute-force-menu.php:840 +msgid "Since robots usually fill in every input field from a login form, they will also submit a value for the special hidden honeypot field." +msgstr "Les robots remplissant généralement chaque champ de saisie d’un formulaire de connexion, ils présenteront également une valeur pour le champ spécial Honeypot caché." + +#: admin/wp-security-brute-force-menu.php:841 +#: admin/wp-security-user-registration-menu.php:278 +msgid "The way honeypots work is that a hidden field is placed somewhere inside a form which only robots will submit. If that field contains a value when the form is submitted then a robot has most likely submitted the form and it is consequently dealt with." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:842 +msgid "Therefore, if the plugin detects that this field has a value when the login form is submitted, then the robot which is attempting to login to your site will be redirected to its localhost address - http://127.0.0.1." +msgstr "Par conséquent, si l’extension détecte que ce champ a été rempli sur le formulaire envoyé, et que le robot tente de se connecter à votre site il sera redirigé vers l’adresse localhost - http://127.0.0.1." + +#: admin/wp-security-brute-force-menu.php:848 +msgid "Login form honeypot settings" +msgstr "Réglages du formulaire de connexion Honeypot" + +#: admin/wp-security-brute-force-menu.php:859 +msgid "Enable honeypot on login page" +msgstr "Activer Honeypot sur la page de connexion" + +#: admin/wp-security-brute-force-menu.php:862 +msgid "Check this if you want to enable the honeypot feature for the login page" +msgstr "Cochez cette case si vous souhaitez activer la fonctionnalité Honeypot sur la page de connexion" + +#: admin/wp-security-dashboard-menu.php:27 +#: admin/wp-security-dashboard-menu.php:374 +#: classes/wp-security-user-login.php:74 +msgid "Locked IP addresses" +msgstr "Adresses IP Verrouillées" + +#: admin/wp-security-dashboard-menu.php:28 +msgid "Permanent block list" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:29 +msgid "Logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:33 +msgid "Premium upgrade" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:131 +#: admin/wp-security-dashboard-menu.php:518 +#: admin/wp-security-user-login-menu.php:53 +#: classes/grade-system/wp-security-feature-item-manager.php:49 +msgid "Login lockout" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:132 +msgid "This tab displays the list of all IP addresses which are currently temporarily locked out due to the login lockout feature:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:138 +msgid "Currently locked out IP addresses and ranges" +msgstr "Plages et adresses IP actuellement en lock-out" + +#: admin/wp-security-dashboard-menu.php:183 +msgid "This tab displays the list of all permanently blocked IP addresses." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:184 +#: admin/wp-security-spam-menu.php:339 +msgid "NOTE: This feature does NOT use the .htaccess file to permanently block the IP addresses so it should be compatible with all web servers running WordPress." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:189 +msgid "Permanently blocked IP addresses" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:200 +#: admin/wp-security-firewall-menu.php:1151 +#: admin/wp-security-user-login-menu.php:485 +#: admin/wp-security-user-login-menu.php:643 +#: admin/wp-security-user-registration-menu.php:164 +msgid "Search" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:238 +#: admin/wp-security-dashboard-menu.php:249 +#: admin/wp-security-dashboard-menu.php:260 +msgid "All In One WP Security & Firewall" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:250 +msgid "Debug logs have been cleared." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:261 +msgid "Unable to clear the logs; an invalid nonce was provided" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:274 +msgid "Debug log options" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:281 +msgid "Clear logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:289 +msgid "Debug logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:362 +msgid "Security strength meter" +msgstr "Mesure de l’efficacité du mot de passe." + +#: admin/wp-security-dashboard-menu.php:363 +msgid "Security points breakdown" +msgstr "Répartition des points de sécurité" + +#: admin/wp-security-dashboard-menu.php:364 +msgid "Spread the word" +msgstr "Passez le message" + +#: admin/wp-security-dashboard-menu.php:365 +msgid "Get to know the developers" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:366 +msgid "Critical feature status" +msgstr "État des caractéristiques critiques" + +#: admin/wp-security-dashboard-menu.php:367 +msgid "Last 5 logins" +msgstr "Les 5 dernières connexions" + +#: admin/wp-security-dashboard-menu.php:368 +msgid "Maintenance mode status" +msgstr "État du mode maintenance" + +#: admin/wp-security-dashboard-menu.php:373 +#: admin/wp-security-dashboard-menu.php:664 +#: admin/wp-security-user-login-menu.php:57 +msgid "Logged in users" +msgstr "Utilisateurs connectés" + +#: admin/wp-security-dashboard-menu.php:417 +msgid "Total Achievable Points: " +msgstr "Total de Points réalisables :" + +#: admin/wp-security-dashboard-menu.php:419 +msgid "Current Score of Your Site: " +msgstr "Score actuel de votre site:" + +#: admin/wp-security-dashboard-menu.php:472 +msgid "We are working hard to make your WordPress site more secure. Please support us, here is how:" +msgstr "Nous travaillons dur pour rendre votre site WordPress plus sûr. Merci de nous aider, vous le pouvez d’une (ou plusieurs) façon(s) suivante(s) :" + +#: admin/wp-security-dashboard-menu.php:473 +msgid "Follow us on" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:477 +msgid "Post to Twitter" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:481 +msgid "Give us a good rating" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:488 +msgid "Wanna know more about the developers behind this plugin?" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:499 +msgid "Below is the current status of the critical features that you should activate on your site to achieve a minimum level of recommended security" +msgstr "Ci-dessous, l’état actuel des fonctionnalités essentielles que vous devez activer sur votre site pour atteindre un niveau minimal de sécurité recommandé" + +#: admin/wp-security-dashboard-menu.php:503 +msgid "Admin username" +msgstr "Identifiant de l’administrateur" + +#: admin/wp-security-dashboard-menu.php:533 +msgid "File permission" +msgstr "Autorisation de fichier" + +#: admin/wp-security-dashboard-menu.php:548 +msgid "Basic firewall" +msgstr "Pare-feu de base" + +#: admin/wp-security-dashboard-menu.php:577 +msgid "No data found." +msgstr "Aucune donnée!" + +#: admin/wp-security-dashboard-menu.php:581 +msgid "Last 5 logins summary:" +msgstr "Sommaire des 5 dernières connexions :" + +#: admin/wp-security-dashboard-menu.php:585 +msgid "User" +msgstr "Utilisateur" + +#: admin/wp-security-dashboard-menu.php:586 +#: admin/wp-security-list-404.php:95 +#: admin/wp-security-list-login-fails.php:56 +#: admin/wp-security-list-permanent-blocked-ip.php:68 +msgid "Date" +msgstr "Date" + +#: admin/wp-security-dashboard-menu.php:587 +msgid "IP" +msgstr "IP" + +#: admin/wp-security-dashboard-menu.php:608 +msgid "Maintenance mode is currently enabled. Remember to turn it off when you are done" +msgstr "Mode maintenance actuellement activé. Rappelez-vous de l’enlever lorsque vous aurez terminé" + +#: admin/wp-security-dashboard-menu.php:610 +msgid "Maintenance mode is currently off." +msgstr "Mode maintenance actuellement désactivé." + +#: admin/wp-security-dashboard-menu.php:614 +msgid "Maintenance mode" +msgstr "Mode maintenance" + +#: admin/wp-security-dashboard-menu.php:632 +msgid "Cookie based brute force" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:636 +#: admin/wp-security-dashboard-menu.php:654 +msgid "The %s feature is currently active." +msgstr "La fonction %s est actuellement active." + +#: admin/wp-security-dashboard-menu.php:637 +#: admin/wp-security-dashboard-menu.php:655 +msgid "Your new WordPress login URL is now:" +msgstr "Votre nouvelle URL de connexion WordPress est maintenant :" + +#: admin/wp-security-dashboard-menu.php:666 +msgid "Number of users currently logged into your site (including you) is:" +msgstr "Nombre d’utilisateurs actuellement connectés à votre site (y compris vous-même ) :" + +#: admin/wp-security-dashboard-menu.php:667 +msgid "There are no other users currently logged in." +msgstr "Aucun autre utilisateur connecté." + +#: admin/wp-security-dashboard-menu.php:680 +msgid "Number of users currently logged in site-wide (including you) is:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:681 +msgid "There are no other site-wide users currently logged in." +msgstr "Il n’y a aucun autre utilisateur actuellement connecté sur l’ensemble du site." + +#: admin/wp-security-dashboard-menu.php:694 +#: admin/wp-security-dashboard-menu.php:711 +msgid "Go to the %s menu to see more details" +msgstr "Accéder au menu %s pour plus de détails" + +#: admin/wp-security-dashboard-menu.php:707 +msgid "There are no IP addresses currently locked out." +msgstr "Aucune adresse IP actuellement verrouillée." + +#: admin/wp-security-dashboard-menu.php:710 +msgid "Number of temporarily locked out IP addresses: " +msgstr "Nombre d’adresses IP verrouillées temporairement :" + +#: admin/wp-security-database-menu.php:52 +msgid "UpdraftPlus is installed but currently not active." +msgstr "" + +#: admin/wp-security-database-menu.php:52 +msgid "Follow this link to activate UpdraftPlus, to take a backup." +msgstr "" + +#: admin/wp-security-database-menu.php:57 +msgid "Follow this link to install UpdraftPlus, to take a database backup." +msgstr "" + +#: admin/wp-security-database-menu.php:87 +#: admin/wp-security-database-menu.php:92 +msgid "Database backup" +msgstr "sauvegarde de BdD" + +#: admin/wp-security-database-menu.php:91 +#: classes/grade-system/wp-security-feature-item-manager.php:65 +msgid "Database prefix" +msgstr "Préfixe de BdD" + +#: admin/wp-security-database-menu.php:119 +msgid "Database security" +msgstr "Sécurité BdD" + +#: admin/wp-security-database-menu.php:147 +msgid "Nonce check failed for DB prefix change operation!" +msgstr "Echec du contrôle lors du changement de préfixe BdD !" + +#: admin/wp-security-database-menu.php:155 +msgid "The plugin has detected that it cannot write to the wp-config.php file. This feature can only be used if the plugin can successfully write to the wp-config.php file." +msgstr "L’extension a détecté qu’elle ne peut écrire dans le fichier wp-config.php. Vérifiez les autorisations d’accès et recommencez l’opération." + +#: admin/wp-security-database-menu.php:168 +msgid "Please enter a value for the DB prefix." +msgstr "Veuillez saisir une valeur de préfixe pour la BdD." + +#: admin/wp-security-database-menu.php:177 +msgid "ERROR: The table prefix can only contain numbers, letters, and underscores." +msgstr "ERREUR : Le préfixe des tables ne peut contenir que des chiffres, des lettres et « _ »." + +#: admin/wp-security-database-menu.php:186 +#: admin/wp-security-database-menu.php:245 +msgid "Change database prefix" +msgstr "Changer le préfixe des tables de la BdD" + +#: admin/wp-security-database-menu.php:189 +msgid "Your WordPress database is the most important asset of your website because it contains a lot of your site's precious information." +msgstr "" + +#: admin/wp-security-database-menu.php:190 +msgid "The database is also a target for hackers via methods such as SQL injections and malicious and automated code which targets certain tables." +msgstr "" + +#: admin/wp-security-database-menu.php:191 +msgid "One way to add a layer of protection for your DB is to change the default WordPress table prefix from \"wp_\" to something else which will be difficult for hackers to guess." +msgstr "Une façon d’ajouter une couche de protection supplémentaire à votre BdD consiste à modifier le préfixe des tables WordPress (« wp_ » par défaut !) en quelque chose de plus difficile à découvrir par les pirates." + +#: admin/wp-security-database-menu.php:192 +msgid "This feature allows you to easily change the prefix to a value of your choice or to a random value set by this plugin." +msgstr "Cette fonctionnalité permet de changer facilement le préfixe actuel de la BdD en une valeur de votre choix ou à une valeur aléatoire définie par l’extension." + +#: admin/wp-security-database-menu.php:198 +msgid "Database prefix options" +msgstr "Options de préfixe BdD" + +#: admin/wp-security-database-menu.php:210 +msgid "database backup" +msgstr "sauvegarde de BdD" + +#: admin/wp-security-database-menu.php:211 +msgid "It is recommended that you perform a %s before using this feature" +msgstr "Il est recommandé d’effectuer une %s avant d’utiliser cette fonctionnalité" + +#: admin/wp-security-database-menu.php:221 +msgid "Current database table prefix" +msgstr "Préfixe actuel des tables de BdD" + +#: admin/wp-security-database-menu.php:227 +msgid "Your site is currently using the default WordPress database prefix value of \"wp_\"." +msgstr "" + +#: admin/wp-security-database-menu.php:227 +msgid "To increase your site's security you should consider changing the database prefix value to another value." +msgstr "" + +#: admin/wp-security-database-menu.php:234 +msgid "Generate new database table prefix" +msgstr "Générer un nouveau préfixe de tables BdD" + +#: admin/wp-security-database-menu.php:238 +msgid "Check this if you want the plugin to generate a random 6 character string for the table prefix" +msgstr "Cochez si vous souhaitez que l’extension génère une chaîne de 6 caractères aléatoires pour préfixer les tables" + +#: admin/wp-security-database-menu.php:239 +msgid "OR" +msgstr "OU" + +#: admin/wp-security-database-menu.php:241 +msgid "Choose your own database prefix by specifying a string which contains letters and/or numbers and/or underscores. Example: xyz_" +msgstr "" + +#: admin/wp-security-database-menu.php:265 +msgid "Take a database backup using UpdraftPlus" +msgstr "" + +#: admin/wp-security-database-menu.php:270 +msgid "Manual backup" +msgstr "Sauvegarde manuelle" + +#: admin/wp-security-database-menu.php:274 +msgid "UpdraftPlus Backup/Restore" +msgstr "" + +#: admin/wp-security-database-menu.php:274 +msgid "Your backups are on the UpdraftPlus Backup/Restore admin page." +msgstr "" + +#: admin/wp-security-database-menu.php:276 +msgid "Create database backup now" +msgstr "" + +#: admin/wp-security-database-menu.php:308 +msgid "Error - Could not get tables or no tables found!" +msgstr "Erreur : Impossible d’obtenir des tables (ou tables non trouvées) !" + +#: admin/wp-security-database-menu.php:312 +msgid "Starting DB prefix change operations....." +msgstr "Début du changement de préfixe BdD…" + +#: admin/wp-security-database-menu.php:314 +msgid "Your WordPress system has a total of %s tables and your new DB prefix will be: %s" +msgstr "Votre BdD WordPress contient un total de %s tables et leur nouveau préfixe sera : %s" + +#: admin/wp-security-database-menu.php:320 +#: classes/wp-security-utility.php:306 +msgid "Failed to make a backup of the wp-config.php file. This operation will not go ahead." +msgstr "Impossible de faire une sauvegarde du fichier wp-config.php. Cette opération n’ira pas plus loin." + +#: admin/wp-security-database-menu.php:324 +msgid "A backup copy of your wp-config.php file was created successfully!" +msgstr "Une copie de sauvegarde de votre fichier wp-config.php a été réalisée avec succès !" + +#: admin/wp-security-database-menu.php:351 +msgid "%s table name update failed" +msgstr "Le renommage de table en « %s » à échoué" + +#: admin/wp-security-database-menu.php:363 +msgid "Please change the prefix manually for the above tables to: %s" +msgstr "Veuillez changer manuellement le préfixe des tables ci-dessus en : %s" + +#: admin/wp-security-database-menu.php:366 +msgid "%s tables had their prefix updated successfully!" +msgstr "Renommage des tables en « %s » terminé avec succès !" + +#: admin/wp-security-database-menu.php:387 +msgid "wp-config.php file was updated successfully!" +msgstr "Le fichier wp-config.php a été mis à jour avec succès !" + +#: admin/wp-security-database-menu.php:390 +msgid "The \"wp-config.php\" file was not able to be modified." +msgstr "" + +#: admin/wp-security-database-menu.php:390 +msgid "Please modify this file manually using your favourite editor and search for variable \"$table_prefix\" and assign the following value to that variable: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:401 +#: admin/wp-security-database-menu.php:420 +msgid "Update of table %s failed: unable to change %s to %s" +msgstr "L’actualisation de la table %s a échoué : impossible de passer de %s à %s" + +#: admin/wp-security-database-menu.php:405 +msgid "The options table records which had references to the old DB prefix were updated successfully!" +msgstr "Les options de table qui faisaient référence à l’ancien préfixe BdD ont été actualisées avec succès !" + +#: admin/wp-security-database-menu.php:424 +msgid "The %s table records which had references to the old DB prefix were updated successfully!" +msgstr "Les enregistrements de la table %s qui faisaient référence à l’ancien préfixe BdD ont été actualisés avec succès !" + +#: admin/wp-security-database-menu.php:452 +msgid "Error updating user_meta table where new meta_key = %s, old meta_key = %s and user_id = %s." +msgstr "Erreur d’actualisation de la table avec nouvelle meta_key = %s, ancienne meta_key = %s et user_id = %s." + +#: admin/wp-security-database-menu.php:457 +msgid "The usermeta table records which had references to the old DB prefix were updated successfully!" +msgstr "Les enregistrement de la table de méta-utilisateur qui faisaient référence à l’ancien préfixe BdD ont été actualisés avec succès !" + +#: admin/wp-security-database-menu.php:459 +msgid "The database prefix change tasks have been completed." +msgstr "Les tâches de modification du préfixe BdD sont terminées." + +#: admin/wp-security-database-menu.php:503 +msgid "Checking for MySQL tables of type \"view\"....." +msgstr "" + +#: admin/wp-security-database-menu.php:520 +msgid "Update of the following MySQL view definition failed: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:527 +msgid "%s view definitions were updated successfully!" +msgstr "" + +#: admin/wp-security-filescan-menu.php:26 +#: classes/grade-system/wp-security-feature-item-manager.php:127 +msgid "File change detection" +msgstr "Détection de changement dans un fichier" + +#: admin/wp-security-filescan-menu.php:27 +msgid "Malware scan" +msgstr "Recherche de logiciel(s) malveillant(s)" + +#: admin/wp-security-filescan-menu.php:88 +msgid "There have been no file changes since the last scan." +msgstr "Aucune modification de fichier n’a été repérée depuis la dernière analyse." + +#: admin/wp-security-filescan-menu.php:98 +msgid "Nonce check failed for manual file change detection scan operation!" +msgstr "Échec de l’analyse de modification de fichier !" + +#: admin/wp-security-filescan-menu.php:104 +msgid "There was an error during the file change detection scan. Please check the AIOS logs." +msgstr "" + +#: admin/wp-security-filescan-menu.php:110 +msgid "The plugin has detected that this is your first file change detection scan. The file details from this scan will be used to detect file changes for future scans." +msgstr "L’extension a détecté que vous n’avez pas encore effectué d’analyse de changements dans les fichiers. Les détails de celle-ci seront utilisés pour détecter les modifications lors d’analyses ultérieures !" + +#: admin/wp-security-filescan-menu.php:112 +msgid "Scan complete - There were no file changes detected!" +msgstr "Analyse terminée - Il n’y a pas eu de modifications de fichiers détectées !" + +#: admin/wp-security-filescan-menu.php:133 +msgid "You entered a non numeric value for the \"backup time interval\" field. It has been set to the default value." +msgstr "Vous avez entré une valeur non numérique pour le champ « intervalle entre sauvegardes ». Elle sera fixée à la valeur par défaut." + +#: admin/wp-security-filescan-menu.php:167 +msgid "The following address was removed because it is not a valid email address: " +msgstr "" + +#: admin/wp-security-filescan-menu.php:206 +msgid "NEW SCAN COMPLETED: The plugin has detected that you have made changes to the \"File Types To Ignore\" or \"Files To Ignore\" fields." +msgstr "" + +#: admin/wp-security-filescan-menu.php:206 +msgid "In order to ensure that future scan results are accurate, the old scan data has been refreshed." +msgstr "" + +#: admin/wp-security-filescan-menu.php:215 +msgid "All In One WP Security & Firewall has detected that there was a change in your host's files." +msgstr "All In One WP Security & Firewall a détecté un changement dans les fichiers de votre hôte." + +#: admin/wp-security-filescan-menu.php:217 +msgid "View scan details and clear this message" +msgstr "" + +#: admin/wp-security-filescan-menu.php:226 +msgid "If given an opportunity hackers can insert their code or files into your system which they can then use to carry out malicious acts on your site." +msgstr "Si on leur en laisse l’opportunité, des pirates peuvent insérer leur code et / ou fichiers dans votre système, qu’ensuite ils utiliseront pour perpétrer des actes malveillants sur votre site." + +#: admin/wp-security-filescan-menu.php:227 +msgid "Being informed of any changes in your files can be a good way to quickly prevent a hacker from causing damage to your website." +msgstr "Être informé de toute modification de vos fichiers peut être un bon moyen d’empêcher rapidement un hacker de nuire à votre site Web." + +#: admin/wp-security-filescan-menu.php:228 +msgid "In general, WordPress core and plugin files and file types such as \".php\" or \".js\" should not change often and when they do, it is important that you are made aware when a change occurs and which file was affected." +msgstr "En général, les fichiers du noyau et extensions WordPress et les types de fichiers comme « .php » ou « .js » ne devraient pas changer souvent, quand ils le font, il est important que vous soyez mis au courant qu’une telle modification s’est produite et quel fichier a été affecté." + +#: admin/wp-security-filescan-menu.php:229 +msgid "The \"File Change Detection Feature\" will notify you of any file change which occurs on your system, including the addition and deletion of files by performing a regular automated or manual scan of your system's files." +msgstr "La fonction « détection d’un changement de fichier » vous avise de tout changement dans votre système de fichiers, y compris l’ajout ou la suppression en effectuant une analyse régulière, automatisée ou manuelle, de votre système de fichiers." + +#: admin/wp-security-filescan-menu.php:230 +msgid "This feature also allows you to exclude certain files or folders from the scan in cases where you know that they change often as part of their normal operation. (For example log files and certain caching plugin files may change often and hence you may choose to exclude such files from the file change detection scan)" +msgstr "Cette fonction permet également d’exclure certains fichiers ou dossiers de l’analyse dans les cas où vous savez qu’ils changent quelquefois dans le cadre d’un fonctionnement normal. (Par exemple les fichiers journaux et certains fichiers plugin mis en cache peuvent changer souvent, c’est pourquoi vous pouvez choisir de les exclure de l’analyse des changements)" + +#: admin/wp-security-filescan-menu.php:241 +msgid "It appears that your server is using an old PHP version which is missing the %s. The file scanner feature needs this class in order to work. If you would like to use this feature please upgrade your server PHP version to 5.3 or greater." +msgstr "" + +#: admin/wp-security-filescan-menu.php:249 +msgid "Manual file change detection scan" +msgstr "Détection manuelle de changements dans les fichiers" + +#: admin/wp-security-filescan-menu.php:255 +msgid "To perform a manual file change detection scan click on the button below." +msgstr "Pour effectuer une analyse manuelle de changement dans les fichiers, cliquez le bouton ci-dessous." + +#: admin/wp-security-filescan-menu.php:258 +msgid "Perform scan now" +msgstr "Effectuer une analyse maintenant" + +#: admin/wp-security-filescan-menu.php:262 +msgid "View last saved file change results" +msgstr "Voir les résultats de la dernière sauvegarde d’analyse des modifications de fichiers" + +#: admin/wp-security-filescan-menu.php:268 +msgid "Click the button below to view the saved file change results from the last scan." +msgstr "Cliquez le bouton ci-dessous pour afficher les résultats des modifications de fichier depuis la dernière analyse." + +#: admin/wp-security-filescan-menu.php:271 +msgid "View last file change" +msgstr "Dernières modifications de fichier" + +#: admin/wp-security-filescan-menu.php:275 +msgid "File change detection settings" +msgstr "Paramètres d’analyse des changements dans les fichiers" + +#: admin/wp-security-filescan-menu.php:287 +msgid "Enable automated file change detection scan" +msgstr "Activer l’analyse automatisée des modifications dans les fichiers" + +#: admin/wp-security-filescan-menu.php:290 +msgid "Check this if you want the system to automatically/periodically scan your files to check for file changes based on the settings below" +msgstr "Cochez si vous voulez que le système analyse automatiquement/périodiquement vos fichiers à la recherche des modifications avec les paramètres ci-dessous" + +#: admin/wp-security-filescan-menu.php:294 +msgid "Scan time interval" +msgstr "Intervalle d’analyse" + +#: admin/wp-security-filescan-menu.php:297 +msgid "Hours" +msgstr "Heures" + +#: admin/wp-security-filescan-menu.php:298 +msgid "Days" +msgstr "Jours" + +#: admin/wp-security-filescan-menu.php:299 +msgid "Weeks" +msgstr "Semaines" + +#: admin/wp-security-filescan-menu.php:301 +msgid "Set the value for how often you would like a scan to occur" +msgstr "Définissez la fréquence souhaitée pour l’analyse" + +#: admin/wp-security-filescan-menu.php:305 +msgid "File types to ignore" +msgstr "Type de fichiers à ignorer" + +#: admin/wp-security-filescan-menu.php:308 +msgid "Enter each file type or extension on a new line which you wish to exclude from the file change detection scan." +msgstr "Entrez chaque type de fichier ou extension à exclure de l’analyse sur une nouvelle ligne." + +#: admin/wp-security-filescan-menu.php:312 +msgid "You can exclude file types from the scan which would not normally pose any security threat if they were changed. These can include things such as image files." +msgstr "Vous pouvez exclure de l’analyse les types de fichiers qui ne constituent pas normalement une menace pour la sécurité s’il ont été modifiés. Ceux-ci peuvent par exemple être les fichiers image." + +#: admin/wp-security-filescan-menu.php:313 +msgid "Example: If you want the scanner to ignore files of type jpg, png, and bmp, then you would enter the following:" +msgstr "Exemple : Si vous souhaitez que l’analyse ignore les fichiers de type JPG, PNG, BMP etc., entrez le texte suivant :" + +#: admin/wp-security-filescan-menu.php:314 +msgid "jpg" +msgstr "jpg" + +#: admin/wp-security-filescan-menu.php:315 +msgid "png" +msgstr "png" + +#: admin/wp-security-filescan-menu.php:316 +msgid "bmp" +msgstr "bmp" + +#: admin/wp-security-filescan-menu.php:322 +msgid "Files/Directories to ignore" +msgstr "Fichiers / Dossiers à ignorer" + +#: admin/wp-security-filescan-menu.php:325 +msgid "Enter each file or directory on a new line which you wish to exclude from the file change detection scan." +msgstr "Entrez chaque fichier ou dossier à exclure de l’analyse sur une nouvelle ligne." + +#: admin/wp-security-filescan-menu.php:329 +msgid "You can exclude specific files/directories from the scan which would not normally pose any security threat if they were changed. These can include things such as log files." +msgstr "Vous pouvez exclure de l’analyse des fichiers et / ou dossiers spécifiques qui ne constituent normalement pas une menace pour la sécurité s’il ont été modifiés. Ceux-ci peuvent être, entre autres, les fichiers journaux." + +#: admin/wp-security-filescan-menu.php:330 +msgid "Example: If you want the scanner to ignore certain files in different directories or whole directories, then you would enter the following:" +msgstr "Exemple : Si vous souhaitez que l’analyse ignore certains fichiers dans différents dossiers ou des dossiers entiers, vous devez entrer le texte suivant :" + +#: admin/wp-security-filescan-menu.php:331 +msgid "cache/config/master.php" +msgstr "cache/config/master.php" + +#: admin/wp-security-filescan-menu.php:332 +msgid "somedirectory" +msgstr "un dossier" + +#: admin/wp-security-filescan-menu.php:339 +msgid "Send email when change detected" +msgstr "Envoyer un courriel si un changement a été détecté" + +#: admin/wp-security-filescan-menu.php:343 +msgid "Check this if you want the system to email you if a file change was detected" +msgstr "Cochez si vous voulez que le système vous contacte s’il détecte une modification de fichier" + +#: admin/wp-security-filescan-menu.php:347 +msgid "Enter one or more email addresses on a new line." +msgstr "" + +#: admin/wp-security-filescan-menu.php:364 +msgid "What is malware?" +msgstr "Qu’est-ce qu’un malware ?" + +#: admin/wp-security-filescan-menu.php:365 +msgid "The word malware stands for Malicious Software. It can consist of things like trojan horses, adware, worms, spyware and any other undesirable code which a hacker will try to inject into your website." +msgstr "Le mot Malware signifie « logiciel malveillant ». Il consiste souvent en des bouts de code comme les chevaux de Troie, adwares, vers, logiciels espions ou tout autre code indésirable qu’un pirate va essayer d’injecter dans votre site web." + +#: admin/wp-security-filescan-menu.php:366 +msgid "Often when malware code has been inserted into your site you will normally not notice anything out of the ordinary based on appearances, but it can have a dramatic effect on your site's search ranking." +msgstr "Souvent, lorsqu’un code malveillant a été inséré dans votre site, vous ne remarquez rien sortant des apparences ordinaires, mais il peut avoir un effet dramatique sur le classement de recherche de votre site." + +#: admin/wp-security-filescan-menu.php:367 +msgid "This is because the bots and spiders from search engines such as Google have the capability to detect malware when they are indexing the pages on your site, and consequently they can blacklist your website which will in turn affect your search rankings." +msgstr "Et parce que les bots et les robots des moteurs de recherche tels que Google ont la capacité de les détecter tout en procédant à l’indexation des pages de votre site, ils risquent de l’ostracisme, ce qui, par voie de conséquences affectera vos classements de recherche." + +#: admin/wp-security-filescan-menu.php:369 +msgid "CLICK HERE" +msgstr "" + +#: admin/wp-security-filescan-menu.php:371 +msgid "Scanning for malware" +msgstr "Recherche de Malwares" + +#: admin/wp-security-filescan-menu.php:372 +msgid "Due to the constantly changing and complex nature of Malware, scanning for such things using a standalone plugin will not work reliably. This is something best done via an external scan of your site regularly." +msgstr "En raison de la constante évolution et de la complexité croissante des Malwares, la recherche en utilisant une simple extension autonome ne donnera que de piètres résultats. C’est une tâche qu’il vaut mieux confier à une analyse externe régulière de votre site." + +#: admin/wp-security-filescan-menu.php:373 +msgid "This is why we have created an easy-to-use scanning service which is hosted off our own server which will scan your site for malware once every day and notify you if it finds anything." +msgstr "C’est pourquoi nous avons créé un service d’analyse facile à utiliser, hébergé hors de notre propre serveur, qui va analyser votre site pour traquer les logiciels malveillants une fois par jour et vous avertir s’il trouve quelque chose." + +#: admin/wp-security-filescan-menu.php:374 +msgid "When you sign up for this service you will get the following:" +msgstr "Lorsque vous vous inscrirez à ce service, vous obtiendrez :" + +#: admin/wp-security-filescan-menu.php:376 +msgid "Automatic daily scan of 1 website" +msgstr "– Une analyse automatique quotidienne pour 1 site Web," + +#: admin/wp-security-filescan-menu.php:377 +msgid "Automatic malware and blacklist monitoring" +msgstr "" + +#: admin/wp-security-filescan-menu.php:378 +msgid "Automatic email alerting" +msgstr "– L’alerte courriel automatique en cas de positif," + +#: admin/wp-security-filescan-menu.php:379 +msgid "Site uptime monitoring" +msgstr "- Surveillance de la disponibilité du site" + +#: admin/wp-security-filescan-menu.php:380 +msgid "Site response time monitoring" +msgstr "– Surveillance du temps de réponse du site" + +#: admin/wp-security-filescan-menu.php:381 +msgid "We provide advice for malware cleanup" +msgstr "" + +#: admin/wp-security-filescan-menu.php:382 +msgid "Blacklist removal" +msgstr "– Annulation du Blacklistage éventuel par les moteurs de recherche," + +#: admin/wp-security-filescan-menu.php:383 +msgid "No contract (cancel anytime)" +msgstr "– Un service non contractuel (arrêt sur simple demande)." + +#: admin/wp-security-filescan-menu.php:385 +msgid "To learn more please %s." +msgstr "Pour en savoir plus, %s." + +#: admin/wp-security-filescan-menu.php:406 +msgid "Latest file change scan results" +msgstr "Résultats de la dernière analyse des modifications de fichiers" + +#: admin/wp-security-filescan-menu.php:416 +msgid "The following files were added to your host." +msgstr "Les fichiers suivants ont été ajoutés à votre hôte :" + +#: admin/wp-security-filescan-menu.php:419 +#: admin/wp-security-filescan-menu.php:440 +#: admin/wp-security-filescan-menu.php:464 +msgid "File" +msgstr "Fichier" + +#: admin/wp-security-filescan-menu.php:420 +#: admin/wp-security-filescan-menu.php:441 +#: admin/wp-security-filescan-menu.php:465 +msgid "File size" +msgstr "Taille du fichier" + +#: admin/wp-security-filescan-menu.php:421 +#: admin/wp-security-filescan-menu.php:442 +#: admin/wp-security-filescan-menu.php:466 +msgid "File modified" +msgstr "Modifié le" + +#: admin/wp-security-filescan-menu.php:437 +msgid "The following files were removed from your host." +msgstr "Les fichiers suivants ont été supprimés de votre hôte :" + +#: admin/wp-security-filescan-menu.php:461 +msgid "The following files were changed on your host." +msgstr "Les fichiers suivants ont été modifiés sur votre hôte :" + +#: admin/wp-security-filesystem-menu.php:26 +#: classes/grade-system/wp-security-feature-item-manager.php:69 +msgid "File permissions" +msgstr "Autorisations du fichier" + +#: admin/wp-security-filesystem-menu.php:27 +msgid "PHP file editing" +msgstr "Édition de fichier PHP" + +#: admin/wp-security-filesystem-menu.php:28 +msgid "WP file access" +msgstr "Accès aux fichiers WP" + +#: admin/wp-security-filesystem-menu.php:29 +msgid "Host system logs" +msgstr "Journaux système" + +#: admin/wp-security-filesystem-menu.php:55 +msgid "Filesystem security" +msgstr "Sécurité des fichiers" + +#: admin/wp-security-filesystem-menu.php:80 +msgid "Nonce check failed for manual DB backup operation!" +msgstr "Echec du contrôle afférent à la sauvegarde manuelle de la BdD !" + +#: admin/wp-security-filesystem-menu.php:90 +msgid "The permissions for %s were succesfully changed to %s" +msgstr "Les autorisations pour %s ont été correctement remplacées par %s" + +#: admin/wp-security-filesystem-menu.php:94 +msgid "Unable to change permissions for %s!" +msgstr "Impossible de modifier les autorisations de %s !" + +#: admin/wp-security-filesystem-menu.php:100 +msgid "File permissions scan" +msgstr "Analyse des autorisations de fichier" + +#: admin/wp-security-filesystem-menu.php:103 +msgid "Your WordPress file and folder permission settings govern the accessability and read/write privileges of the files and folders which make up your WP installation." +msgstr "Les paramètres d’autorisation régissent les privilèges d’accessibilité et de lecture / écriture des fichiers et dossiers qui composent votre installation WP." + +#: admin/wp-security-filesystem-menu.php:104 +msgid "Your WP installation already comes with reasonably secure file permission settings for the filesystem." +msgstr "Votre installation de WP semble disposer de paramètres d’autorisation raisonnablement sécurisés." + +#: admin/wp-security-filesystem-menu.php:105 +msgid "However, sometimes people or other plugins modify the various permission settings of certain core WP folders or files such that they end up making their site less secure because they chose the wrong permission values." +msgstr "Parfois, cependant, des acteurs humains ou d’autres extensions peuvent modifier différents paramètres d’autorisation sur certains fichiers ou dossiers du noyau WP de telle sorte qu’elles finissent par rendre le site moins sécurisé en raison des valeurs d’autorisation incorrectes qu’elles ont choisies." + +#: admin/wp-security-filesystem-menu.php:106 +msgid "This feature will scan the critical WP core folders and files and will highlight any permission settings which are insecure." +msgstr "Cette fonctionnalité va analyser les dossiers et fichiers critiques du noyau WP et mettre en évidence les paramètres d’autorisation précaires." + +#: admin/wp-security-filesystem-menu.php:114 +msgid "This plugin has detected that your site is running on a Windows server." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:115 +msgid "This feature is not applicable for Windows server installations." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:121 +msgid "WP directory and file permissions scan results" +msgstr "Résultat d’analyse des autorisations des dossiers et fichiers du noyau WP" + +#: admin/wp-security-filesystem-menu.php:133 +#: admin/wp-security-filesystem-menu.php:152 +msgid "Name" +msgstr "Nom" + +#: admin/wp-security-filesystem-menu.php:134 +#: admin/wp-security-filesystem-menu.php:153 +msgid "File/Folder" +msgstr "Fichier / Dossier" + +#: admin/wp-security-filesystem-menu.php:135 +#: admin/wp-security-filesystem-menu.php:154 +msgid "Current permissions" +msgstr "Autorisations actuelles" + +#: admin/wp-security-filesystem-menu.php:136 +#: admin/wp-security-filesystem-menu.php:155 +msgid "Recommended permissions" +msgstr "Autorisations recommandées" + +#: admin/wp-security-filesystem-menu.php:137 +#: admin/wp-security-filesystem-menu.php:156 +msgid "Recommended action" +msgstr "Action recommandée" + +#: admin/wp-security-filesystem-menu.php:195 +msgid "Your PHP file editing settings were saved successfully." +msgstr "Les paramètres d’édition des fichiers PHP ont été correctement sauvegardées." + +#: admin/wp-security-filesystem-menu.php:199 +msgid "Operation failed! Unable to modify or make a backup of wp-config.php file!" +msgstr "L’opération a échoué ! Impossible de modifier ou de faire une sauvegarde du fichier wp-config.php !" + +#: admin/wp-security-filesystem-menu.php:212 +#: classes/grade-system/wp-security-feature-item-manager.php:71 +msgid "File editing" +msgstr "Édition de fichier" + +#: admin/wp-security-filesystem-menu.php:215 +msgid "The WordPress Dashboard by default allows administrators to edit PHP files, such as plugin and theme files." +msgstr "Le tableau de bord par défaut de WordPress permet aux administrateurs de modifier les fichiers PHP, tout comme les extension et thèmes." + +#: admin/wp-security-filesystem-menu.php:216 +msgid "This is often the first tool an attacker will use if able to login, since it allows code execution." +msgstr "C’est souvent le premier outil qu’un agresseur utilisera s’il parvient à se connecter, car il permet l’exécution de code." + +#: admin/wp-security-filesystem-menu.php:217 +msgid "This feature will disable the ability for people to edit PHP files via the dashboard." +msgstr "Cette fonction désactive la capacité d’éditer certains fichiers PHP via le tableau de bord." + +#: admin/wp-security-filesystem-menu.php:223 +msgid "Disable PHP file editing" +msgstr "Désactiver l’édition de fichier PHP" + +#: admin/wp-security-filesystem-menu.php:235 +msgid "Disable ability to edit PHP files" +msgstr "Désactiver la capacité d’éditer des fichiers PHP" + +#: admin/wp-security-filesystem-menu.php:238 +msgid "Check this if you want to remove the ability for people to edit PHP files via the WP dashboard" +msgstr "Cochez pour supprimer la possibilité d’éditer les fichiers PHP via le tableau de bord WP" + +#: admin/wp-security-filesystem-menu.php:282 +msgid "You have successfully saved the Prevent Access to Default WP Files configuration." +msgstr "Vous avez enregistré avec succès l’interdiction d’accès à la configuration par défaut des fichiers de WP." + +#: admin/wp-security-filesystem-menu.php:286 +#: admin/wp-security-firewall-menu.php:126 +#: admin/wp-security-firewall-menu.php:346 +#: admin/wp-security-firewall-menu.php:613 +#: admin/wp-security-firewall-menu.php:912 +#: admin/wp-security-settings-menu.php:772 +#: admin/wp-security-spam-menu.php:124 +msgid "Could not write to the .htaccess file. Please check the file permissions." +msgstr "Impossible d’écrire dans le fichier .htaccess. Veuillez vérifier les permissions." + +#: admin/wp-security-filesystem-menu.php:291 +msgid "WordPress files" +msgstr "Fichiers WordPress" + +#: admin/wp-security-filesystem-menu.php:294 +msgid "This feature allows you to prevent access to files such as %s, %s and %s which are delivered with all WP installations." +msgstr "Cette fonctionnalité permet d’empêcher l’accès à des fichiers tels que %s, %s et %s livrés avec toutes les installations de WP." + +#: admin/wp-security-filesystem-menu.php:295 +msgid "By preventing access to these files you are hiding some key pieces of information (such as WordPress version info) from potential hackers." +msgstr "En empêchant l’accès à ces fichiers, vous cacherez certains éléments clé d’information (version de WordPress, celle des d’extensions…) aux pirates éventuels." + +#: admin/wp-security-filesystem-menu.php:300 +msgid "Prevent access to default WP files" +msgstr "Empêcher l’accès aux fichiers par défaut WP" + +#: admin/wp-security-filesystem-menu.php:311 +msgid "Prevent access to WP default install files" +msgstr "Empêcher l’accès aux fichiers d’installation par défaut WP" + +#: admin/wp-security-filesystem-menu.php:314 +msgid "Check this if you want to prevent access to readme.html, license.txt and wp-config-sample.php." +msgstr "Cochez si vous voulez empêcher l’accès à readme.html, license.txt et wp-config-sample.php." + +#: admin/wp-security-filesystem-menu.php:318 +msgid "Save setting" +msgstr "Enregistrer les paramètres" + +#: admin/wp-security-filesystem-menu.php:342 +msgid "System logs" +msgstr "Journaux système" + +#: admin/wp-security-filesystem-menu.php:345 +msgid "Sometimes your hosting platform will produce error or warning logs in a file called \"error_log\"." +msgstr "Parfois, votre plate-forme d’hébergement produira erreur ou avertissement dans le fichier appelé « error_log »." + +#: admin/wp-security-filesystem-menu.php:346 +msgid "Depending on the nature and cause of the error or warning, your hosting server can create multiple instances of this file in numerous directory locations of your WordPress installation." +msgstr "Selon la nature et la cause de l’erreur ou avertissement, votre serveur d’hébergement peut créer plusieurs instances de ce fichier en de nombreux emplacements des dossiers de votre installation WordPress." + +#: admin/wp-security-filesystem-menu.php:347 +msgid "By occassionally viewing the contents of these logs files you can keep informed of any underlying problems on your system which you might need to address." +msgstr "En regardant de temps en temps le contenu de ces fichiers lors vous pouvez être tenu informé de problèmes sous-jacents sur votre système, dont vous pourriez avoir besoin pour répondre." + +#: admin/wp-security-filesystem-menu.php:353 +msgid "View system logs" +msgstr "Voir les journaux système" + +#: admin/wp-security-filesystem-menu.php:355 +msgid "Please click the button below to view the latest system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:358 +msgid "Enter System Log File Name" +msgstr "Entrez le nom du fichier journal système" + +#: admin/wp-security-filesystem-menu.php:360 +msgid "Enter your system log file name. (Defaults to error_log)" +msgstr "Entrez le nom de fichier journal du système. (Par défaut pour error_log)" + +#: admin/wp-security-filesystem-menu.php:363 +msgid "View latest system logs" +msgstr "Afficher les derniers journaux système" + +#: admin/wp-security-filesystem-menu.php:365 +msgid "Loading..." +msgstr "Chargement…" + +#: admin/wp-security-filesystem-menu.php:382 +msgid "No system logs were found." +msgstr "Aucun journal système n’a été trouvé !" + +#: admin/wp-security-filesystem-menu.php:435 +msgid "Set recommended permissions" +msgstr "Appliquer le réglage des autorisations recommandé" + +#: admin/wp-security-filesystem-menu.php:441 +msgid "No action required" +msgstr "Aucune action n’est requise." + +#: admin/wp-security-filesystem-menu.php:481 +msgid "Showing latest entries of error_log file: %s" +msgstr "Affichage des dernières entrées du fichier error_log : %s" + +#: admin/wp-security-firewall-menu.php:28 +msgid "Basic firewall rules" +msgstr "Règles de base du pare-feu" + +#: admin/wp-security-firewall-menu.php:29 +msgid "Additional firewall rules" +msgstr "Règles supplémentaires du pare-feu" + +#: admin/wp-security-firewall-menu.php:30 +msgid "6G Blacklist firewall rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:31 +msgid "Internet bots" +msgstr "Bots internet" + +#: admin/wp-security-firewall-menu.php:32 +msgid "Prevent hotlinks" +msgstr "Prévenir des Hotlinks" + +#: admin/wp-security-firewall-menu.php:33 +msgid "404 detection" +msgstr "Détection d’erreur(s) 404" + +#: admin/wp-security-firewall-menu.php:34 +msgid "Custom rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:122 +#: admin/wp-security-firewall-menu.php:908 +#: admin/wp-security-spam-menu.php:120 +#: admin/wp-security-spam-menu.php:494 +#: admin/wp-security-spam-menu.php:556 +#: admin/wp-security-user-registration-menu.php:95 +msgid "Settings were successfully saved" +msgstr "Vos paramètres ont été enregistrés avec succès." + +#: admin/wp-security-firewall-menu.php:131 +#: admin/wp-security-firewall-menu.php:651 +msgid "Firewall settings" +msgstr "Paramètres du pare-feu" + +#: admin/wp-security-firewall-menu.php:138 +msgid "This should not have any impact on your site's general functionality but if you wish you can take a %s of your .htaccess file before proceeding." +msgstr "Cela ne devrait pas avoir d’incidence sur les fonctionnalités générales de votre site mais, si vous le souhaitez, vous pouvez faire une %s de votre fichier .htaccess avant de procéder." + +#: admin/wp-security-firewall-menu.php:139 +msgid "The features in this tab allow you to activate some basic firewall security protection rules for your site." +msgstr "Les fonctions de cet onglet vous permettent d’activer certaines règles de protection basiques de sécurité du pare-feu pour votre site." + +#: admin/wp-security-firewall-menu.php:140 +msgid "The firewall functionality is achieved via the insertion of special code into your currently active .htaccess file." +msgstr "La fonctionnalité de pare-feu est réalisée par insertion d’un code spécial dans votre fichier .htaccess actuellement actif." + +#: admin/wp-security-firewall-menu.php:151 +msgid "You have enabled the \"Completely Block Access To XMLRPC\" checkbox which means all XMLRPC functionality will be blocked." +msgstr "" + +#: admin/wp-security-firewall-menu.php:152 +msgid "By leaving this feature enabled you will prevent Jetpack or Wordpress iOS or other apps which need XMLRPC from working correctly on your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:153 +msgid "If you still need XMLRPC then uncheck the \"Completely Block Access To XMLRPC\" checkbox and enable only the \"Disable Pingback Functionality From XMLRPC\" checkbox." +msgstr "" + +#: admin/wp-security-firewall-menu.php:163 +msgid "Basic firewall settings" +msgstr "Paramètres de base du pare-feu" + +#: admin/wp-security-firewall-menu.php:171 +msgid "Enable basic firewall protection" +msgstr "Activer la protection de base du pare-feu" + +#: admin/wp-security-firewall-menu.php:174 +msgid "Check this if you want to apply basic firewall protection to your site." +msgstr "Cochez si vous souhaitez appliquer une protection de base au pare-feu de votre site." + +#: admin/wp-security-firewall-menu.php:178 +msgid "This setting will implement the following basic firewall protection mechanisms on your site:" +msgstr "Ce paramètre mettra en œuvre les mécanismes de protection de base du pare-feu suivants sur votre site :" + +#: admin/wp-security-firewall-menu.php:179 +msgid "1) Protect your htaccess file by denying access to it." +msgstr "1) Protection de votre fichier .htaccess en refusant l’accès à celui-ci." + +#: admin/wp-security-firewall-menu.php:180 +msgid "2) Disable the server signature." +msgstr "2) Désactivation de la signature de serveur." + +#: admin/wp-security-firewall-menu.php:181 +msgid "3) Limit file upload size (%sMB)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:182 +msgid "4) Protect your wp-config.php file by denying access to it." +msgstr "4) Protection de votre fichier wp-config.php en refusant l’accès à celui-ci." + +#: admin/wp-security-firewall-menu.php:183 +msgid "The above firewall features will be applied via your .htaccess file and should not affect your site's overall functionality." +msgstr "Les fonctionnalités de pare-feu ci-dessus s’appliqueront via votre fichier .htaccess et ne devraient pas affecter le fonctionnement global du site." + +#: admin/wp-security-firewall-menu.php:184 +msgid "You are still advised to take a backup of your active .htaccess file just in case." +msgstr "Il est toujours conseillé de faire une sauvegarde de votre fichier .htaccess actif, juste au cas où." + +#: admin/wp-security-firewall-menu.php:190 +msgid "Max file upload size (MB)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:192 +msgid "The value for the maximum file upload size used in the .htaccess file. (Defaults to %sMB if left blank)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:200 +msgid "WordPress XMLRPC and pingback vulnerability protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:208 +msgid "Completely block access to XMLRPC" +msgstr "" + +#: admin/wp-security-firewall-menu.php:211 +msgid "Check this if you are not using the WP XML-RPC functionality and you want to completely block external access to XMLRPC." +msgstr "" + +#: admin/wp-security-firewall-menu.php:215 +msgid "This setting will add a directive in your .htaccess to disable access to the WordPress xmlrpc.php file which is responsible for the XML-RPC functionality in WordPress." +msgstr "" + +#: admin/wp-security-firewall-menu.php:216 +msgid "Hackers can exploit various vulnerabilities in the WordPress XML-RPC API in a number of ways such as:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:217 +msgid "1) Denial of Service (DoS) attacks" +msgstr "1) Attaques par déni de Service (DoS)" + +#: admin/wp-security-firewall-menu.php:218 +msgid "2) Hacking internal routers." +msgstr "2) Pirater des routeurs internes." + +#: admin/wp-security-firewall-menu.php:219 +msgid "3) Scanning ports in internal networks to get info from various hosts." +msgstr "3) Analyse des ports dans les réseaux internes pour obtenir des informations de divers hôtes‪." + +#: admin/wp-security-firewall-menu.php:220 +msgid "Apart from the security protection benefit, this feature may also help reduce load on your server, particularly if your site currently has a lot of unwanted traffic hitting the XML-RPC API on your installation." +msgstr "En dehors du bénéfice de protection de sécurité, cette fonctionnalité peut également aider à réduire la charge sur votre serveur, en particulier si votre site a beaucoup de trafic indésirable touchant l’API XML-RPC de votre installation." + +#: admin/wp-security-firewall-menu.php:221 +msgid "NOTE: You should only enable this feature if you are not currently using the XML-RPC functionality on your WordPress installation." +msgstr "REMARQUE : Vous ne devez activer cette fonction que si vous n’utilisez pas actuellement la fonctionnalité XML-RPC sur votre installation WordPress." + +#: admin/wp-security-firewall-menu.php:222 +msgid "Leave this feature disabled and use the feature below if you want pingback protection but you still need XMLRPC." +msgstr "" + +#: admin/wp-security-firewall-menu.php:228 +msgid "Disable pingback functionality from XMLRPC" +msgstr "" + +#: admin/wp-security-firewall-menu.php:231 +msgid "If you use Jetpack or WP iOS or other apps which need WP XML-RPC functionality then check this. This will enable protection against WordPress pingback vulnerabilities." +msgstr "" + +#: admin/wp-security-firewall-menu.php:235 +msgid "NOTE: If you use Jetpack or the Wordpress iOS or other apps then you should enable this feature but leave the \"Completely Block Access To XMLRPC\" checkbox unchecked." +msgstr "" + +#: admin/wp-security-firewall-menu.php:236 +msgid "The feature will still allow XMLRPC functionality on your site but will disable the pingback methods." +msgstr "" + +#: admin/wp-security-firewall-menu.php:237 +msgid "This feature will also remove the \"X-Pingback\" header if it is present." +msgstr "" + +#: admin/wp-security-firewall-menu.php:246 +msgid "Block access to debug log file" +msgstr "" + +#: admin/wp-security-firewall-menu.php:254 +msgid "Block access to debug.log file" +msgstr "" + +#: admin/wp-security-firewall-menu.php:257 +msgid "Check this if you want to block access to the debug.log file that WordPress creates when debug logging is enabled." +msgstr "" + +#: admin/wp-security-firewall-menu.php:261 +msgid "WordPress has an option to turn on the debug logging to a file located in wp-content/debug.log. This file may contain sensitive information." +msgstr "" + +#: admin/wp-security-firewall-menu.php:262 +msgid "Using this option will block external access to this file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:262 +msgid "You can still access this file by logging into your site via FTP." +msgstr "" + +#: admin/wp-security-firewall-menu.php:270 +msgid "Save basic firewall settings" +msgstr "Enregistrer les paramètres de base du pare-feu" + +#: admin/wp-security-firewall-menu.php:342 +msgid "You have successfully saved the Additional Firewall Protection configuration" +msgstr "Vous avez enregistré avec succès la configuration supplémentaire du pare-feu" + +#: admin/wp-security-firewall-menu.php:356 +msgid "Additional firewall protection" +msgstr "Protection supplémentaire du pare-feu" + +#: admin/wp-security-firewall-menu.php:360 +msgid "Due to the nature of the code being inserted to the .htaccess file, this feature may break some functionality for certain plugins and you are therefore advised to take a %s of .htaccess before applying this configuration." +msgstr "En raison de la nature du code étant inséré dans le fichier .htaccess, cette fonctionnalité peut briser certaines fonctionnalités pour certains plugins et vous êtes donc invités à prendre un%s de .htaccess avant d’appliquer cette configuration." + +#: admin/wp-security-firewall-menu.php:362 +msgid "This feature allows you to activate more advanced firewall settings to your site." +msgstr "Cette fonction vous permet d’activer les paramètres de pare-feu plus avancés sur votre site." + +#: admin/wp-security-firewall-menu.php:363 +msgid "The advanced firewall rules are applied via the insertion of special code to your currently active .htaccess file." +msgstr "Les règles avancées du pare-feu sont appliquées par l’intermédiaire de l’insertion de code spécial à votre fichier .htaccess actuellement actif." + +#: admin/wp-security-firewall-menu.php:372 +msgid "Listing of directory contents" +msgstr "Liste du Répertoire des matières" + +#: admin/wp-security-firewall-menu.php:381 +#: classes/grade-system/wp-security-feature-item-manager.php:85 +msgid "Disable index views" +msgstr "Désactiver les vues Index" + +#: admin/wp-security-firewall-menu.php:384 +msgid "Check this if you want to disable directory and file listing." +msgstr "Cochez pour désactiver le listage des dossier et de fichiers." + +#: admin/wp-security-firewall-menu.php:389 +msgid "By default, an Apache server will allow the listing of the contents of a directory if it doesn't contain an index.php file." +msgstr "Par défaut, un serveur Apache permet de lister le contenu d’un dossier, s’il ne contient pas de fichier index.php" + +#: admin/wp-security-firewall-menu.php:391 +msgid "This feature will prevent the listing of contents for all directories." +msgstr "Cette fonctionnalité permet d’empêcher de lister le contenu pour tous les répertoires." + +#: admin/wp-security-firewall-menu.php:393 +msgid "NOTE: In order for this feature to work \"AllowOverride\" of the Indexes directive must be enabled in your httpd.conf file. Ask your hosting provider to check this if you don't have access to httpd.conf" +msgstr "REMARQUE : Afin que cette option puisse travailler en « AllowOverride » la directive de l’index doit être activée dans votre fichier httpd.conf, demandez-en confirmation à votre hébergeur. Si vous n’avez pas accès au fichier httpd.conf, cochez cette case." + +#: admin/wp-security-firewall-menu.php:402 +msgid "Trace and track" +msgstr "Trace et Pistage" + +#: admin/wp-security-firewall-menu.php:411 +#: classes/grade-system/wp-security-feature-item-manager.php:86 +msgid "Disable trace and track" +msgstr "Désactiver Trace et Pistage" + +#: admin/wp-security-firewall-menu.php:414 +msgid "Check this if you want to disable trace and track." +msgstr "Cochez si vous voulez désactiver la trace et le pistage." + +#: admin/wp-security-firewall-menu.php:419 +msgid "HTTP Trace attack (XST) can be used to return header requests and grab cookies and other information." +msgstr "L’attaque par Trace HTTP (XST) peut être utilisée pour renvoyer des demandes d’en-tête et récupérer les cookies et autres informations." + +#: admin/wp-security-firewall-menu.php:421 +msgid "This hacking technique is usually used together with cross site scripting attacks (XSS)." +msgstr "Cette technique de piratage est généralement utilisée conjointement à des attaques cross-site stripping (XSS)." + +#: admin/wp-security-firewall-menu.php:423 +msgid "Disabling trace and track on your site will help prevent HTTP Trace attacks." +msgstr "La désactivation du traçage et du pistage sur votre site aidera à prévenir ces attaques HTTP Trace." + +#: admin/wp-security-firewall-menu.php:432 +msgid "Proxy comment posting" +msgstr "Publication commentaire Proxy" + +#: admin/wp-security-firewall-menu.php:442 +msgid "Forbid proxy comment posting" +msgstr "Interdire l’émission de commentaire par Proxy" + +#: admin/wp-security-firewall-menu.php:445 +msgid "Check this if you want to forbid proxy comment posting." +msgstr "Cochez si vous voulez interdire l’émission de commentaire par proxy." + +#: admin/wp-security-firewall-menu.php:450 +msgid "This setting will deny any requests that use a proxy server when posting comments." +msgstr "Ce paramètre interdit toute requête utilisant un serveur proxy lors de la publication de commentaires." + +#: admin/wp-security-firewall-menu.php:451 +msgid "By forbidding proxy comments you are in effect eliminating some spam and other proxy requests." +msgstr "En interdisant les commentaires par Proxy, quelques courriels et autres requêtes Proxy peuvent être éliminés." + +#: admin/wp-security-firewall-menu.php:460 +msgid "Bad query strings" +msgstr "Chaînes Query incorrectes" + +#: admin/wp-security-firewall-menu.php:470 +msgid "Deny bad query strings" +msgstr "Refuser les chaînes Query incorrecte" + +#: admin/wp-security-firewall-menu.php:473 +msgid "This will help protect you against malicious queries via XSS." +msgstr "Cela contribuera à vous protéger des requêtes malveillantes via XSS." + +#: admin/wp-security-firewall-menu.php:478 +msgid "This feature will write rules in your .htaccess file to prevent malicious string attacks on your site using XSS." +msgstr "Cette fonction va écrire dans votre fichier .htaccess les règles pour contrer les attaques par chaînes XSS malveillantes sur votre site." + +#: admin/wp-security-firewall-menu.php:479 +msgid "NOTE: Some of these strings might be used for plugins or themes and hence this might break some functionality." +msgstr "REMARQUE : Certaines de ces chaînes peuvent servir à certains plugins ou thèmes ceci pourrait briser certaines fonctionnalités." + +#: admin/wp-security-firewall-menu.php:480 +#: admin/wp-security-firewall-menu.php:510 +msgid "You are therefore strongly advised to take a backup of your active .htaccess file before applying this feature." +msgstr "Il est donc fortement conseillé de faire une sauvegarde de votre fichier .htaccess actif avant d’appliquer cette fonctionnalité." + +#: admin/wp-security-firewall-menu.php:489 +#: classes/grade-system/wp-security-feature-item-manager.php:89 +msgid "Advanced character string filter" +msgstr "Filtre avancé de chaînes de caractères" + +#: admin/wp-security-firewall-menu.php:499 +msgid "Enable advanced character string filter" +msgstr "Activer le filtre avancé de chaînes de caractères" + +#: admin/wp-security-firewall-menu.php:502 +msgid "This will block bad character matches from XSS." +msgstr "Ceci bloquera les identités de caractères incorrects depuis XSS." + +#: admin/wp-security-firewall-menu.php:507 +msgid "This is an advanced character string filter to prevent malicious string attacks on your site coming from Cross Site Scripting (XSS)." +msgstr "Il s’agit d’un filtre avancé de chaînes de caractères destiné à contrer les attaques par chaînes sur votre site en provenance de Cross Site Stripping (XSS)." + +#: admin/wp-security-firewall-menu.php:508 +msgid "This setting matches for common malicious string patterns and exploits and will produce a 403 error for the hacker attempting the query." +msgstr "Ce paramètre identifie des modèles de chaînes malveillantes communément exploitées et produit une erreur 403 si un pirate tente une requête." + +#: admin/wp-security-firewall-menu.php:509 +msgid "NOTE: Some strings for this setting might break some functionality." +msgstr "REMARQUE: Certaines chaînes de ce paramètre peuvent briser certaines autres fonctionnalités." + +#: admin/wp-security-firewall-menu.php:518 +msgid "Save additional firewall settings" +msgstr "Enregistrer les paramètres supplémentaires du pare-feu" + +#: admin/wp-security-firewall-menu.php:609 +msgid "You have successfully saved the 5G/6G Firewall Protection configuration" +msgstr "" + +#: admin/wp-security-firewall-menu.php:633 +msgid "All in One WP Security and Firewall" +msgstr "" + +#: admin/wp-security-firewall-menu.php:634 +msgid "We were unable to access the firewall's configuration file:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:636 +msgid "As a result, the firewall will be unavailable." +msgstr "" + +#: admin/wp-security-firewall-menu.php:637 +msgid "Please check your PHP error log for further information." +msgstr "" + +#: admin/wp-security-firewall-menu.php:638 +msgid "If you're unable to locate your PHP log file, please contact your web hosting company to ask them where it can be found on their setup." +msgstr "" + +#: admin/wp-security-firewall-menu.php:655 +msgid "This feature allows you to activate the %s (or legacy %s) firewall security protection rules designed and produced by %s." +msgstr "" + +#: admin/wp-security-firewall-menu.php:656 +msgid "The 6G Blacklist is updated and improved version of 5G Blacklist. If you have 5G Blacklist active, you might consider activating 6G Blacklist instead." +msgstr "" + +#: admin/wp-security-firewall-menu.php:657 +msgid "The 6G Blacklist is a simple, flexible blacklist that helps reduce the number of malicious URL requests that hit your website." +msgstr "" + +#: admin/wp-security-firewall-menu.php:658 +msgid "The added advantage of applying the 6G firewall to your site is that it has been tested and confirmed by the people at PerishablePress.com to be an optimal and least disruptive set of .htaccess security rules for general WP sites running on an Apache server or similar." +msgstr "" + +#: admin/wp-security-firewall-menu.php:659 +msgid "Therefore the 6G firewall rules should not have any impact on your site's general functionality but if you wish you can take a %s of your .htaccess file before proceeding." +msgstr "" + +#: admin/wp-security-firewall-menu.php:665 +msgid "6G blacklist/firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:677 +msgid "Enable 6G firewall protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:680 +msgid "Check this if you want to apply the 6G Blacklist firewall protection from perishablepress.com to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:684 +msgid "This setting will implement the 6G security firewall protection mechanisms on your site which include the following things:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:685 +#: admin/wp-security-firewall-menu.php:703 +msgid "1) Block forbidden characters commonly used in exploitative attacks." +msgstr "1) Blocage de caractères interdits couramment utilisés dans les attaques d’exploitation." + +#: admin/wp-security-firewall-menu.php:686 +#: admin/wp-security-firewall-menu.php:704 +msgid "2) Block malicious encoded URL characters such as the \".css(\" string." +msgstr "2) Blocage les codes malveillants composés de caractères d’URL tels la chaîne « CSS ( »," + +#: admin/wp-security-firewall-menu.php:687 +#: admin/wp-security-firewall-menu.php:705 +msgid "3) Guard against the common patterns and specific exploits in the root portion of targeted URLs." +msgstr "3) Protection contre les schémas communs et spécifiques d’attaques dans la partie racine d’URL ciblées," + +#: admin/wp-security-firewall-menu.php:688 +#: admin/wp-security-firewall-menu.php:706 +msgid "4) Stop attackers from manipulating query strings by disallowing illicit characters." +msgstr "4) Arrêt des attaques manipulant des requête par chaînes en interdisant les caractères illicites" + +#: admin/wp-security-firewall-menu.php:689 +#: admin/wp-security-firewall-menu.php:707 +msgid "....and much more." +msgstr "…et plus encore." + +#: admin/wp-security-firewall-menu.php:695 +msgid "Enable legacy 5G firewall protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:698 +msgid "Check this if you want to apply the 5G Blacklist firewall protection from perishablepress.com to your site." +msgstr "Cochez si vous souhaitez appliquer la protection liste noire pare-feu 5G de perishablepress.com à votre site." + +#: admin/wp-security-firewall-menu.php:702 +msgid "This setting will implement the 5G security firewall protection mechanisms on your site which include the following things:" +msgstr "Ce paramètre mettra en œuvre les mécanismes de sécurité 5G de protection pare-feu sur votre site incluant les éléments suivants :" + +#: admin/wp-security-firewall-menu.php:713 +msgid "Save 5G/6G firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:721 +msgid "6G block request methods" +msgstr "" + +#: admin/wp-security-firewall-menu.php:725 +msgid "HTTP Request methods are used by browsers and clients to communicate with servers to get responses." +msgstr "" + +#: admin/wp-security-firewall-menu.php:726 +msgid "GET and POST are the most commonly used methods to request and submit data for specified resources of the server." +msgstr "" + +#: admin/wp-security-firewall-menu.php:732 +msgid "Block %s method" +msgstr "" + +#: admin/wp-security-firewall-menu.php:735 +msgid "Check this to block the %s request method" +msgstr "" + +#: admin/wp-security-firewall-menu.php:740 +msgid "Some WooCommerce extensions use the PUT request method in addition to GET and POST." +msgstr "" + +#: admin/wp-security-firewall-menu.php:740 +msgid "This means WooCommerce users shouldn't block the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:741 +msgid "A few REST requests use the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:741 +msgid "If your site is communicated by the WP REST API, you should not block the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:749 +msgid "Save request methods settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:757 +msgid "6G other settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:761 +msgid "Block query strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:764 +msgid "Check this to block all query strings recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:768 +msgid "Block request strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:771 +msgid "Check this to block all request strings recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:775 +msgid "Block referrers" +msgstr "" + +#: admin/wp-security-firewall-menu.php:778 +msgid "Check this to block all referrers recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:782 +msgid "Block user-agents" +msgstr "" + +#: admin/wp-security-firewall-menu.php:785 +msgid "Check this to block all user-agents recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:789 +msgid "Save other settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:823 +msgid "The Internet bot settings were successfully saved" +msgstr "Les paramètres de bots Internet ont été enregistrés avec succès" + +#: admin/wp-security-firewall-menu.php:827 +msgid "Internet bot settings" +msgstr "Paramètres Bots Internet" + +#: admin/wp-security-firewall-menu.php:833 +msgid "What is an Internet Bot" +msgstr "" + +#: admin/wp-security-firewall-menu.php:834 +msgid "%s?" +msgstr "%s ?" + +#: admin/wp-security-firewall-menu.php:836 +msgid "A bot is a piece of software which runs on the Internet and performs automatic tasks. For example when Google indexes your pages it uses automatic bots to achieve this task." +msgstr "Un bot est un logiciel qui tourne sur Internet et effectue des tâches automatiques. Par exemple, lorsque Google indexe vos pages, il utilise des robots bots automatiques pour achever cette tâche." + +#: admin/wp-security-firewall-menu.php:837 +msgid "A lot of bots are legitimate and non-malicous but not all bots are good and often you will find some which try to impersonate legitimate bots such as \"Googlebot\" but in reality they have nohing to do with Google at all." +msgstr "De nombreux bots sont légitimes et non-malveillants mais pas tous, ni tout le temps : vous en trouverez qui essaient de se faire passer pour des robots collecteurs légitimes tels « Googlebot » mais qui, en réalité, n’ont rien à voir avec Google." + +#: admin/wp-security-firewall-menu.php:838 +msgid "Although most of the bots out there are relatively harmless sometimes website owners want to have more control over which bots they allow into their site." +msgstr "Bien que la plupart des bots soient relativement inoffensifs, parfois les propriétaires de sites Web veulent avoir le contrôle sur les bots qu’ils admettent dans leur site." + +#: admin/wp-security-firewall-menu.php:839 +msgid "This feature allows you to block bots which are impersonating as a Googlebot but actually aren't. (In other words they are fake Google bots)" +msgstr "Cette fonctionnalité permet de bloquer les robots qui empruntent une identité comme celle de Googlebots, ce qu’en fait ils ne sont pas. (En d’autres termes, ce sont de faux Googlebots)" + +#: admin/wp-security-firewall-menu.php:840 +msgid "Googlebots have a unique indentity which cannot easily be forged and this feature will indentify any fake Google bots and block them from reading your site's pages." +msgstr "les Googlebots ont une identité unique qui ne peut pas facilement être forgée et cette caractéristique va identifier tout faux robots Google et leur bloquer la lecture de pages de votre site." + +#: admin/wp-security-firewall-menu.php:846 +msgid "Attention: Sometimes non-malicious Internet organizations might have bots which impersonate as a \"Googlebot\"." +msgstr "ATTENTION : Parfois des organisations Internet non-malveillantes peuvent avoir des bots usurpant l’identité d’un « Googlebot »." + +#: admin/wp-security-firewall-menu.php:847 +msgid "Just be aware that if you activate this feature the plugin will block all bots which use the \"Googlebot\" string in their User Agent information but are NOT officially from Google (irrespective whether they are malicious or not)." +msgstr "Soyez juste conscient(e) que si vous activez cette fonctionnalité le plugin bloquera tous les robots utilisant la chaîne « Googlebot » dans leurs informations d’ID, mais n’appartenant pas officiellement à Google (indépendamment de ce qu’elles soient malveillantes ou non)." + +#: admin/wp-security-firewall-menu.php:848 +msgid "All other bots from other organizations such as \"Yahoo\", \"Bing\" etc will not be affected by this feature." +msgstr "Aucun des autres robots d’autres organisations telles que « Yahoo », « Bing » etc. ne souffriront de cette fonctionnalité." + +#: admin/wp-security-firewall-menu.php:854 +#: admin/wp-security-firewall-menu.php:864 +#: classes/grade-system/wp-security-feature-item-manager.php:93 +msgid "Block fake Googlebots" +msgstr "Bloquer les faux Googlebots" + +#: admin/wp-security-firewall-menu.php:867 +msgid "Check this if you want to block all fake Googlebots." +msgstr "Cochez si vous souhaitez bloquer tous les faux Googlebots" + +#: admin/wp-security-firewall-menu.php:871 +msgid "This feature will check if the User Agent information of a bot contains the string \"Googlebot\"." +msgstr "Cette fonction vérifie si les informations d’ID d’un bot contient la chaîne « Googlebot »." + +#: admin/wp-security-firewall-menu.php:872 +msgid "It will then perform a few tests to verify if the bot is legitimately from Google and if so it will allow the bot to proceed." +msgstr "Il sera ensuite effectué quelques tests pour vérifier si le bot est légitimement de Google et si elle autorisera le bot à agir." + +#: admin/wp-security-firewall-menu.php:873 +msgid "If the bot fails the checks then the plugin will mark it as being a fake Googlebot and it will block it" +msgstr "Si le bot ne les satisfait pas, alors l’extension le marquera comme faux Googlebot et le bloquera" + +#: admin/wp-security-firewall-menu.php:880 +msgid "Save internet bot settings" +msgstr "Enregistrer les paramètres de Bot Internet" + +#: admin/wp-security-firewall-menu.php:916 +#: admin/wp-security-firewall-menu.php:938 +#: classes/grade-system/wp-security-feature-item-manager.php:95 +msgid "Prevent image hotlinking" +msgstr "Empêcher les liens dynamiques (Hotline)" + +#: admin/wp-security-firewall-menu.php:919 +msgid "A Hotlink is where someone displays an image on their site which is actually located on your site by using a direct link to the source of the image on your server." +msgstr "Un lien dynamique est un lien pointant vers une image de votre site que quelqu’un affiche indûment sur le sien, alors qu’il n’en a pas les droits." + +#: admin/wp-security-firewall-menu.php:920 +msgid "Due to the fact that the image being displayed on the other person's site is coming from your server, this can cause leaking of bandwidth and resources for you because your server has to present this image for the people viewing it on someone elses's site." +msgstr "De plus, du fait que l’image affichée sur l’autre site provient de votre serveur, cela peut provoquer une fuite de bande passante et de ressources pour vous, car votre serveur doit présenter cette image pour la consultation sur un site étranger, cela risque de vous être préjudiciable." + +#: admin/wp-security-firewall-menu.php:921 +msgid "This feature will prevent people from directly hotlinking images from your site's pages by writing some directives in your .htaccess file." +msgstr "Cette fonction neutralise le lien dynamique visant directement les images, articles ou pages de votre site en écrivant quelques directives dans votre fichier .htaccess." + +#: admin/wp-security-firewall-menu.php:926 +msgid "Prevent hotlinking" +msgstr "Prévention des liens dynamiques (Hotlinking)" + +#: admin/wp-security-firewall-menu.php:941 +msgid "Check this if you want to prevent hotlinking to images on your site." +msgstr "Cochez si vous souhaitez empêcher le « Hotlinking » vers votre site." + +#: admin/wp-security-firewall-menu.php:961 +msgid "Nonce check failed for delete all 404 event logs operation!" +msgstr "Échec du contrôle de suppression des journaux d’événements 404 !" + +#: admin/wp-security-firewall-menu.php:972 +msgid "404 Detection Feature - Delete all 404 event logs operation failed!" +msgstr "Fonction de détection 404 - échec de l’opération de suppression de tous les événements 404 des journaux !" + +#: admin/wp-security-firewall-menu.php:976 +msgid "All 404 event logs were deleted from the DB successfully!" +msgstr "Tous les évènements 404 dans les journaux ont été supprimés avec succès !" + +#: admin/wp-security-firewall-menu.php:1000 +msgid "You entered a non numeric value for the lockout time length field. It has been set to the default value." +msgstr "Vous avez entré une valeur non numérique pour le champ « intervalle entre sauvegardes ». Elle sera fixée à la valeur par défaut." + +#: admin/wp-security-firewall-menu.php:1006 +msgid "You entered an incorrect format for the \"Redirect URL\" field. It has been set to the default value." +msgstr "Vous avez entré un format incorrect pour le champ « URL de redirection ». Il a été renseigné par la valeur par défaut." + +#: admin/wp-security-firewall-menu.php:1039 +msgid "404 detection configuration" +msgstr "Configuration de la détection 404" + +#: admin/wp-security-firewall-menu.php:1042 +msgid "A 404 or Not Found error occurs when somebody tries to access a non-existent page on your website." +msgstr "Une erreur 404 « adresse (URL) introuvable » se produit lorsque quelqu'un tente d'accéder à une page inexistante sur votre site web." + +#: admin/wp-security-firewall-menu.php:1043 +msgid "Typically, most 404 errors happen quite innocently when people have mis-typed a URL or used an old link to page which doesn't exist anymore." +msgstr "Généralement, la plupart des erreurs 404 se produisent assez innocemment quand l’utilisateur a mal saisi une URL ou utilisé un vieux lien vers une page qui n’existe plus." + +#: admin/wp-security-firewall-menu.php:1044 +msgid "However, in some cases you may find many repeated 404 errors which occur in a relatively short space of time and from the same IP address which are all attempting to access a variety of non-existent page URLs." +msgstr "Toutefois, dans certains cas, vous pouvez trouver de nombreuses répétition d’erreurs 404 se produisant dans un laps de temps relativement court avec la même adresse IP d’origine qui sont toutes des tentatives d’accéder à une variété d’URL de pages inexistantes." + +#: admin/wp-security-firewall-menu.php:1045 +msgid "Such behaviour can mean that a hacker might be trying to find a particular page or URL for sinister reasons." +msgstr "Un tel comportement peut signifier qu’un pirate essaye de trouver une page ou une URL particulière pour de sinistres mots." + +#: admin/wp-security-firewall-menu.php:1046 +msgid "This feature allows you to monitor all 404 events which occur on your site, and it also gives you the option of blocking IP addresses for a configured length of time." +msgstr "Cette fonctionnalité permet de surveiller tous les événements 404 se produisant sur votre site, et donne également la possibilité de bloquer les adresses IP les ayant générées pour une durée configurée." + +#: admin/wp-security-firewall-menu.php:1047 +msgid "If you want to temporarily block or blacklist an IP address, simply click the \"Temp Block\" or \"Blacklist IP\" link for the applicable IP entry in the \"404 Event Logs\" table below." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1071 +msgid "404 detection options" +msgstr "Options de détection 404" + +#: admin/wp-security-firewall-menu.php:1083 +msgid "Enable 404 IP detection and lockout" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1086 +msgid "Check this if you want to enable the lockout of selected IP addresses." +msgstr "Cochez si vous souhaitez activer le verrouillage des adresses IP sélectionnées." + +#: admin/wp-security-firewall-menu.php:1091 +msgid "When you enable this checkbox, all 404 events on your site will be logged in the table below. You can monitor these events and select some IP addresses listed in the table below and block them for a specified amount of time. All IP addresses you select to be blocked from the \"404 Event Logs\" table section will be unable to access your site during the time specified." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1099 +msgid "Enable 404 event logging" +msgstr "Activer le journal des événements" + +#: admin/wp-security-firewall-menu.php:1102 +msgid "Check this if you want to enable the logging of 404 events" +msgstr "Cochez si vous souhaitez activer la journalisation des événements 404" + +#: admin/wp-security-firewall-menu.php:1107 +msgid "Time length of 404 lockout (minutes)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1109 +msgid "Set the length of time for which a blocked IP address will be prevented from visiting your site" +msgstr "Réglez la durée pendant laquelle une adresse IP bloquée sera empêché de visiter votre site" + +#: admin/wp-security-firewall-menu.php:1114 +msgid "You can lock any IP address which is recorded in the \"404 Event Logs\" table section below." +msgstr "Vous pouvez verrouiller une adresse IP enregistrée dans la section « journaux d'événements 404 » du tableau ci-dessous." + +#: admin/wp-security-firewall-menu.php:1116 +msgid "To temporarily lock an IP address, hover over the ID column and click the \"Temp Block\" link for the applicable IP entry." +msgstr "Pour verrouiller temporairement une adresse IP, survolez la colonne ID et cliquez sur le lien « Temps de Blocage » pour l'entrée IP sélectionnée." + +#: admin/wp-security-firewall-menu.php:1123 +msgid "404 lockout redirect URL" +msgstr "URL de redirection verrouillage 404" + +#: admin/wp-security-firewall-menu.php:1125 +msgid "A blocked visitor will be automatically redirected to this URL." +msgstr "Un visiteur bloqué sera automatiquement redirigé vers cette URL." + +#: admin/wp-security-firewall-menu.php:1135 +msgid "This list displays the 404 event logs when somebody tries to access a non-existent page on your website." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1136 +msgid "404 event logs that are older than %1$d days are purged automatically." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1141 +msgid "404 event logs" +msgstr "Journaux d'événements 404" + +#: admin/wp-security-firewall-menu.php:1163 +#: admin/wp-security-firewall-menu.php:1172 +#: admin/wp-security-user-login-menu.php:495 +#: admin/wp-security-user-login-menu.php:504 +#: admin/wp-security-user-login-menu.php:653 +#: admin/wp-security-user-login-menu.php:662 +msgid "Export to CSV" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1169 +#: admin/wp-security-user-login-menu.php:501 +#: admin/wp-security-user-login-menu.php:659 +msgid "Click this button if you wish to download this log in CSV format." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1176 +#: admin/wp-security-firewall-menu.php:1185 +msgid "Delete all 404 event logs" +msgstr "Supprimer toutes entrées des journaux d'événements 404" + +#: admin/wp-security-firewall-menu.php:1182 +msgid "Click this button if you wish to purge all 404 event logs from the DB." +msgstr "Cliquez ce bouton si vous souhaitez purger les journaux d'événements 404 dans la BdD." + +#: admin/wp-security-firewall-menu.php:1241 +msgid "Custom .htaccess rules settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1248 +msgid "This feature can be used to apply your own custom .htaccess rules and directives." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1249 +msgid "It is useful for when you want to tweak our existing firewall rules or when you want to add your own." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1250 +msgid "NOTE: This feature can only be used if your site is hosted in an apache or similar web server." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1256 +msgid "Warning: Only use this feature if you know what you are doing." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1257 +msgid "Incorrect .htaccess rules or directives can break or prevent access to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1258 +msgid "It is your responsibility to ensure that you are entering the correct code!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1259 +msgid "If you break your site you will need to access your server via FTP or something similar and then edit your .htaccess file and delete the changes you made." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1265 +msgid "Custom .htaccess rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1269 +msgid "Enable custom .htaccess rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1272 +msgid "Check this if you want to enable custom rules entered in the text box below" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1276 +msgid "Place custom rules at the top" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1279 +msgid "Check this if you want to place your custom rules at the beginning of all the rules applied by this plugin" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1283 +msgid "Enter custom .htaccess rules:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1287 +msgid "Enter your custom .htaccess rules/directives." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1292 +msgid "Save custom rules" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:338 +#: admin/wp-security-firewall-setup-notice.php:407 +#: admin/wp-security-firewall-setup-notice.php:479 +#: admin/wp-security-firewall-setup-notice.php:595 +#: wp-security.php:43 +msgid "All In One WP Security and Firewall" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:340 +msgid "We were unable to create the file necessary to give you the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:341 +msgid "Your firewall will have reduced protection which means some of your firewall's functionality will be unavailable." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:342 +msgid "If you would like to manually set up the necessary file, please follow these steps:" +msgstr "" + +#. translators: %s Boostrap file name. +#. translators: %s Firewall file name. +#: admin/wp-security-firewall-setup-notice.php:346 +#: admin/wp-security-firewall-setup-notice.php:453 +msgid "1. Create a file with the name %s in the same directory as your WordPress install is in, i.e.:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:350 +msgid "2. Paste in the following code:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:352 +#: admin/wp-security-firewall-setup-notice.php:462 +msgid "3. Save the file and press the 'Try again' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:372 +msgid "1. Open the following file:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:378 +msgid "2. Look for the auto_prepend_file directive." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:382 +msgid "2. Look for the following:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:388 +msgid "3. Change it to the following:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:392 +msgid "4. Save the file and press the 'Try again' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:392 +#: admin/wp-security-firewall-setup-notice.php:441 +msgid "You may have to wait up to 5 minutes before the settings take effect." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:410 +msgid "Your firewall has been installed with the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:411 +msgid "You may have to wait 5 minutes for the changes to take effect." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:434 +msgid "1. Open your php.ini file." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:437 +msgid "2. Set the auto_prepend_file directive like below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:441 +msgid "3. Restart the webserver and refresh the page" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:458 +msgid "2. Paste in the following directives:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:482 +msgid "We were unable to set up your firewall with the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:483 +msgid "Your firewall will have reduced functionality." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:487 +msgid "To give your site the highest level of protection, please follow these steps:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:500 +msgid "Note: if you're unable to perform any of the aforementioned steps, please ask your web hosting provider for further assistance." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:517 +msgid "Try again" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:539 +msgid "We have detected that your AIOS firewall is not fully installed, and therefore does not have the highest level of protection. " +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:540 +msgid "Your firewall will have reduced functionality until it has been upgraded. " +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:542 +msgid "Upgrade your protection now" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:598 +msgid "Our PHP-based firewall has been created to give you even greater protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:602 +msgid "If you already have our .htaccess-based firewall enabled, you will still need to set up the PHP-based firewall to benefit from its protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:605 +msgid "To set up the PHP-based firewall, press the 'Set up now' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:608 +msgid "Set up now" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:614 +#: templates/notices/custom-notice.php:10 +#: templates/notices/custom-notice.php:12 +#: templates/notices/horizontal-notice.php:50 +#: templates/notices/horizontal-notice.php:52 +#: templates/notices/htaccess-to-php-feature-notice.php:10 +#: templates/notices/htaccess-to-php-feature-notice.php:12 +msgid "Dismiss" +msgstr "" + +#: admin/wp-security-list-404.php:91 +msgid "Event type" +msgstr "" + +#: admin/wp-security-list-404.php:92 +#: admin/wp-security-list-logged-in-users.php:46 +#: admin/wp-security-list-registered-users.php:74 +msgid "IP address" +msgstr "" + +#: admin/wp-security-list-404.php:93 +msgid "Attempted URL" +msgstr "" + +#: admin/wp-security-list-404.php:94 +msgid "Referer" +msgstr "" + +#: admin/wp-security-list-404.php:96 +msgid "Lock status" +msgstr "" + +#: admin/wp-security-list-404.php:118 +msgid "Temp block IP" +msgstr "" + +#: admin/wp-security-list-404.php:119 +msgid "Blacklist IP" +msgstr "" + +#: admin/wp-security-list-404.php:120 +#: admin/wp-security-list-acct-activity.php:82 +#: admin/wp-security-list-locked-ip.php:37 +#: admin/wp-security-list-locked-ip.php:84 +#: admin/wp-security-list-login-fails.php:73 +#: admin/wp-security-list-registered-users.php:93 +msgid "Delete" +msgstr "" + +#: admin/wp-security-list-404.php:128 +#: admin/wp-security-list-404.php:136 +#: admin/wp-security-list-404.php:143 +#: admin/wp-security-list-acct-activity.php:92 +#: admin/wp-security-list-comment-spammer-ip.php:95 +#: admin/wp-security-list-locked-ip.php:97 +#: admin/wp-security-list-locked-ip.php:105 +#: admin/wp-security-list-login-fails.php:85 +#: admin/wp-security-list-permanent-blocked-ip.php:96 +#: admin/wp-security-list-registered-users.php:107 +#: admin/wp-security-list-registered-users.php:115 +#: admin/wp-security-list-registered-users.php:123 +msgid "Please select some records using the checkboxes" +msgstr "Veuillez sélectionner les enregistrements concernés par l'opération à l'aide des cases à cocher" + +#: admin/wp-security-list-404.php:278 +msgid "Nonce check failed for delete selected 404 event logs operation!" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:35 +msgid "Are you sure you want to delete this item?" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:46 +msgid "Login session still active" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:60 +#: admin/wp-security-list-locked-ip.php:60 +#: admin/wp-security-list-logged-in-users.php:44 +#: admin/wp-security-list-login-fails.php:54 +#: admin/wp-security-list-registered-users.php:69 +msgid "User ID" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:61 +#: admin/wp-security-list-locked-ip.php:61 +#: admin/wp-security-list-login-fails.php:55 +msgid "Username" +msgstr "Nom d’utilisateur" + +#: admin/wp-security-list-acct-activity.php:62 +msgid "Login date" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:63 +msgid "Logout date" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:136 +msgid "Nonce check failed for delete selected account activity logs operation!" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:59 +msgid "Spammer IP" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:60 +msgid "Number of spam comments from this IP" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:61 +msgid "Status" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:81 +msgid "Block" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:130 +#: admin/wp-security-list-comment-spammer-ip.php:179 +msgid "Nonce check failed for delete selected blocked IP operation!" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:137 +msgid "The selected IP addresses are now permanently blocked!" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:193 +msgid "The selected IP addresses were saved in the blacklist configuration settings." +msgstr "Les adresses IP sélectionnées ont été enregistrées dans les paramètres de la liste noire." + +#: admin/wp-security-list-comment-spammer-ip.php:201 +msgid "The .htaccess file was successfully modified to include the selected IP addresses." +msgstr "Le fichier .htaccess a été modifié avec succès pour exclure les adresses IP sélectionnées." + +#: admin/wp-security-list-comment-spammer-ip.php:212 +msgid "NOTE: The .htaccess file was not modified because you have disabled the \"Enable IP or User Agent Blacklisting\" check box." +msgstr "REMARQUE : Le fichier .htaccess n’a pas été modifié car vous avez décoché la case « Activer l’IP ou l’ID sur liste noire »." + +#: admin/wp-security-list-comment-spammer-ip.php:213 +msgid "To block these IP addresses you will need to enable the above flag in the %s menu" +msgstr "Pour bloquer ces adresses IP, vous devrez activer l’indicateur ci-dessus dans le menu %s" + +#: admin/wp-security-list-debug.php:47 +msgid "Level" +msgstr "" + +#: admin/wp-security-list-debug.php:48 +msgid "Message" +msgstr "" + +#: admin/wp-security-list-debug.php:49 +msgid "Type" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:36 +#: admin/wp-security-list-locked-ip.php:83 +msgid "Unlock" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:59 +msgid "Locked IP/range" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:62 +#: admin/wp-security-list-permanent-blocked-ip.php:67 +msgid "Reason" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:63 +msgid "Date locked" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:64 +msgid "Release date" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:134 +msgid "The selected IP entries were unlocked successfully." +msgstr "Les IP sélectionnées ont été débloquées avec succès ." + +#: admin/wp-security-list-locked-ip.php:140 +msgid "Nonce check failed for unlock IP operation!" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:147 +msgid "The selected IP entry was unlocked successfully." +msgstr "L'IP sélectionnée a été déverrouillée avec succès !" + +#: admin/wp-security-list-logged-in-users.php:45 +#: admin/wp-security-list-registered-users.php:70 +msgid "Login name" +msgstr "" + +#: admin/wp-security-list-logged-in-users.php:87 +msgid "Nonce check failed for force user logout operation!" +msgstr "" + +#: admin/wp-security-list-logged-in-users.php:96 +msgid "The selected user was logged out successfully!" +msgstr "" + +#: admin/wp-security-list-login-fails.php:53 +msgid "Login IP range" +msgstr "" + +#: admin/wp-security-list-login-fails.php:130 +msgid "Nonce check failed for delete failed login record operation!" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:66 +msgid "Blocked IP" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:87 +msgid "Unblock" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:122 +#: admin/wp-security-list-permanent-blocked-ip.php:139 +msgid "Successfully unblocked and deleted the selected record(s)." +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:126 +#: admin/wp-security-list-permanent-blocked-ip.php:143 +msgid "Failed to unblock and delete the selected record(s)." +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:133 +msgid "Nonce check failed for unblock IP operation!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:71 +msgid "Email" +msgstr "" + +#: admin/wp-security-list-registered-users.php:72 +msgid "Register date" +msgstr "" + +#: admin/wp-security-list-registered-users.php:73 +msgid "Account status" +msgstr "" + +#: admin/wp-security-list-registered-users.php:92 +msgid "Approve" +msgstr "" + +#: admin/wp-security-list-registered-users.php:94 +msgid "Block IP" +msgstr "" + +#: admin/wp-security-list-registered-users.php:159 +msgid "The selected accounts were approved successfully!" +msgstr "Les comptes sélectionnés ont été approuvés avec succès !" + +#: admin/wp-security-list-registered-users.php:163 +msgid "The following accounts failed to update successfully: " +msgstr "Les comptes suivants ont échoué à être mis à jour :" + +#: admin/wp-security-list-registered-users.php:171 +msgid "The selected account was approved successfully!" +msgstr "Le compte sélectionné a été approuvé avec succès !" + +#: admin/wp-security-list-registered-users.php:190 +msgid "Your account is now active" +msgstr "Votre compte est désormais actif" + +#: admin/wp-security-list-registered-users.php:191 +msgid "Your account with username: " +msgstr "Identifiant de l’administrateur" + +#: admin/wp-security-list-registered-users.php:191 +msgid " is now active" +msgstr "est maintenant actif" + +#: admin/wp-security-list-registered-users.php:222 +msgid "The selected accounts were deleted successfully!" +msgstr "Les comptes sélectionnés ont été supprimés avec succès!" + +#: admin/wp-security-list-registered-users.php:230 +msgid "Nonce check failed for delete registered user account operation!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:238 +msgid "The selected account was deleted successfully!" +msgstr "Le compte sélectionné a été supprimé avec succès !" + +#: admin/wp-security-list-registered-users.php:264 +msgid "The selected IP addresses were successfully added to the permanent block list!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:265 +#: admin/wp-security-list-registered-users.php:282 +msgid "View Blocked IPs" +msgstr "" + +#: admin/wp-security-list-registered-users.php:274 +msgid "Nonce check failed for block IP operation of registered user!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:281 +msgid "The selected IP was successfully added to the permanent block list!" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:25 +msgid "Visitor lockout" +msgstr "Visiteur bloqué" + +#: admin/wp-security-maintenance-menu.php:85 +msgid "Site lockout feature settings saved!" +msgstr "Paramètres de fonction de verrouillage du site sauvegardés !" + +#: admin/wp-security-maintenance-menu.php:92 +msgid "General visitor lockout" +msgstr "Tous visiteurs bloqués" + +#: admin/wp-security-maintenance-menu.php:98 +msgid "This feature allows you to put your site into \"maintenance mode\" by locking down the front-end to all visitors except logged in users with super admin privileges." +msgstr "Cette fonctionnalité permet de mettre votre site en mode « maintenance » en verrouillant le site à tous les visiteurs, sauf ceux ayant des privilèges d'administrateur ou super-admin." + +#: admin/wp-security-maintenance-menu.php:99 +msgid "Locking your site down to general visitors can be useful if you are investigating some issues on your site or perhaps you might be doing some maintenance and wish to keep out all traffic for security reasons." +msgstr "Le verrouillage de votre site aux visiteurs peut être utile, que vous ayez à étudier quelque point sur votre site, deviez faire un peu de ménage ou souhaitiez fermer tout le trafic pour raison de sécurité." + +#: admin/wp-security-maintenance-menu.php:104 +msgid "Enable front-end lockout" +msgstr "Activer le verrouillage du site" + +#: admin/wp-security-maintenance-menu.php:107 +msgid "Check this if you want all visitors except those who are logged in as administrator to be locked out of the front-end of your site." +msgstr "Cochez si vous souhaitez que tous les visiteurs, sauf ceux ayant des privilèges administrateur soient empêchés d’accès à votre site." + +#: admin/wp-security-maintenance-menu.php:111 +msgid "Enter a message:" +msgstr "Saisissez un message :" + +#: admin/wp-security-maintenance-menu.php:123 +msgid "Enter a message you wish to display to visitors when your site is in maintenance mode." +msgstr "Entrez le message que vous souhaitez afficher aux visiteurs lorsque votre site est en mode maintenance." + +#: admin/wp-security-maintenance-menu.php:130 +msgid "Save site lockout settings" +msgstr "Enregistrer les paramètres de verrouillage du site" + +#: admin/wp-security-misc-options-menu.php:28 +msgid "Copy protection" +msgstr "Protection contre la copie" + +#: admin/wp-security-misc-options-menu.php:29 +msgid "Frames" +msgstr "Cadres" + +#: admin/wp-security-misc-options-menu.php:30 +msgid "Users enumeration" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:31 +msgid "WP REST API" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:89 +msgid "Copy Protection feature settings saved!" +msgstr "Paramètres de la fonction de protection contre la copie sauvegardés !" + +#: admin/wp-security-misc-options-menu.php:94 +msgid "Disable the ability to copy text" +msgstr "Désactiver la possibilité de copier du texte" + +#: admin/wp-security-misc-options-menu.php:100 +msgid "This feature allows you to disable the ability to select and copy text from your front end." +msgstr "Cette fonction permet de désactiver la possibilité de sélectionner et copier du texte depuis votre site." + +#: admin/wp-security-misc-options-menu.php:101 +msgid "When admin user is logged in, the feature is automatically disabled for his session." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:106 +msgid "Enable copy protection" +msgstr "Activer la protection contre la copie" + +#: admin/wp-security-misc-options-menu.php:109 +msgid "Check this if you want to disable the \"Right click\", \"Text selection\" and \"Copy\" option on the front end of your site." +msgstr "Cochez si vous souhaitez désactiver le « clic droit », « Sélection de texte » et l'option « Copier » sur votre site." + +#: admin/wp-security-misc-options-menu.php:116 +msgid "Save copy protection settings" +msgstr "Enregistrer les paramètres de protection contre la copie" + +#: admin/wp-security-misc-options-menu.php:140 +msgid "Frame Display Prevention feature settings saved!" +msgstr "Paramètres de la fonction protection de l’affichage de cadres enregistrés !" + +#: admin/wp-security-misc-options-menu.php:145 +msgid "Prevent your site from being displayed in a frame" +msgstr "Empêcher votre site d'être affiché dans un cadre" + +#: admin/wp-security-misc-options-menu.php:151 +msgid "This feature allows you to prevent other sites from displaying any of your content via a frame or iframe." +msgstr "Cette fonction permet d’empêcher d’autres sites d’afficher tout le contenu du votre via un frame ou iframe." + +#: admin/wp-security-misc-options-menu.php:152 +msgid "When enabled, this feature will set the \"X-Frame-Options\" paramater to \"sameorigin\" in the HTTP header." +msgstr "Lorsqu’activée, cette fonction permet de paramétrer « X-Frame-Options » à « sameorigin » dans l’en-tête HTTP." + +#: admin/wp-security-misc-options-menu.php:157 +msgid "Enable iFrame protection" +msgstr "Activer la protection iFrame" + +#: admin/wp-security-misc-options-menu.php:160 +msgid "Check this if you want to stop other sites from displaying your content in a frame or iframe." +msgstr "Cochez si vous voulez empêcher d’autres sites d’afficher votre contenu dans un frame (cadre) ou iframe." + +#: admin/wp-security-misc-options-menu.php:191 +msgid "Users Enumeration Prevention feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:196 +msgid "Prevent users enumeration" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:202 +msgid "This feature allows you to prevent external users/bots from fetching the user info with urls like \"/?author=1\"." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:203 +msgid "When enabled, this feature will print a \"forbidden\" error rather than the user information." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:208 +msgid "Disable users enumeration" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:211 +msgid "Check this if you want to stop users enumeration." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:242 +msgid "WP REST API Security feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:253 +msgid "This feature allows you to block WordPress REST API access for unauthorized requests." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:254 +msgid "When enabled this feature will only allow REST requests to be processed if the user is logged in." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:260 +msgid "Beware that if you are using other plugins which have registered REST endpoints (eg, Contact Form 7), then this feature will also block REST requests used by these plugins if the user is not logged in. It is recommended that you leave this feature disabled if you want uninterrupted functionality for such plugins." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:268 +msgid "Disallow unauthorized REST requests" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:271 +msgid "Check this if you want to stop REST API access for non-logged in requests." +msgstr "" + +#: admin/wp-security-settings-menu.php:25 +msgid "General settings" +msgstr "Paramètres généraux" + +#: admin/wp-security-settings-menu.php:29 +#: admin/wp-security-settings-menu.php:33 +msgid "file" +msgstr "Fichier" + +#: admin/wp-security-settings-menu.php:37 +msgid "Delete plugin settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:41 +msgid "WP version info" +msgstr "" + +#: admin/wp-security-settings-menu.php:45 +msgid "Import/Export" +msgstr "Importer/Exporter" + +#: admin/wp-security-settings-menu.php:52 +msgid "Advanced settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:128 +msgid "All the security features have been disabled successfully!" +msgstr "Tous les dispositifs de sécurité ont été désactivés avec succès!" + +#: admin/wp-security-settings-menu.php:132 +#: admin/wp-security-settings-menu.php:159 +msgid "Could not write to the .htaccess file. Please restore your .htaccess file manually using the restore functionality in the \".htaccess File\"." +msgstr "Impossible d’écrire dans le fichier .htaccess. Veuillez restaurer manuellement votre fichier .htaccess en utilisant la fonction de restauration dans « Fichier .htaccess »." + +#: admin/wp-security-settings-menu.php:137 +msgid "Could not write to the wp-config.php. Please restore your wp-config.php file manually using the restore functionality in the \"wp-config.php File\"." +msgstr "Impossible d’écrire dans wp-config.php. Veuillez restaurer manuellement votre fichier wp-config.php en utilisant la fonction de restauration dans « Fichier wp-config.php »." + +#: admin/wp-security-settings-menu.php:155 +msgid "All firewall rules have been disabled successfully!" +msgstr "Toutes les règles de pare-feu ont été désactivés avec succès !" + +#: admin/wp-security-settings-menu.php:177 +msgid "Deletion of aio_wp_security_configs option and .htaccess directives failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:179 +msgid "Reset of aio_wp_security_configs option failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:181 +msgid "Deletion of .htaccess directives failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:183 +msgid "All settings have been successfully reset." +msgstr "" + +#: admin/wp-security-settings-menu.php:203 +msgid "For information, updates and documentation, please visit the" +msgstr "Pour informations, mises à jour et documentation, veuillez visiter" + +#: admin/wp-security-settings-menu.php:203 +msgid "Page" +msgstr "Page" + +#: admin/wp-security-settings-menu.php:204 +msgid "Follow us" +msgstr "Suivez-nous" + +#: admin/wp-security-settings-menu.php:204 +msgid "on Twitter, Google+ or via Email to stay up to date about the new security features of this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:208 +msgid "WP Security plugin" +msgstr "Extension de sécurité WP" + +#: admin/wp-security-settings-menu.php:212 +msgid "Thank you for using the AIOS security plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:216 +msgid "There are a lot of security features in this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:221 +msgid "To start, go through each security option and enable the \"basic\" options." +msgstr "" + +#: admin/wp-security-settings-menu.php:225 +msgid "The more features you enable, the more security points you will achieve." +msgstr "" + +#: admin/wp-security-settings-menu.php:228 +msgid "Before doing anything we advise taking a backup of your .htaccess file, database and wp-config.php." +msgstr "" + +#: admin/wp-security-settings-menu.php:231 +msgid "Backup your database" +msgstr "Sauvegarder votre BdD" + +#: admin/wp-security-settings-menu.php:232 +#: admin/wp-security-settings-menu.php:433 +msgid "Backup .htaccess file" +msgstr "Sauvegarder le .htaccess" + +#: admin/wp-security-settings-menu.php:233 +#: admin/wp-security-settings-menu.php:534 +msgid "Backup wp-config.php file" +msgstr "Sauvegarder wp-config.php" + +#: admin/wp-security-settings-menu.php:240 +msgid "Disable security features" +msgstr "Désactiver les fonctions de sécurité" + +#: admin/wp-security-settings-menu.php:246 +msgid "If you think that some plugin functionality on your site is broken due to a security feature you enabled in this plugin, then use the following option to turn off all the security features of this plugin." +msgstr "Si vous pensez que certaines fonctionnalités d'extension sur votre site sont brisées à cause d'une fonction de sécurité activée par All-In-One WP Security & Firewall, utilisez l'option suivante pour désactiver toutes les fonctions de sécurité." + +#: admin/wp-security-settings-menu.php:250 +msgid "Disable all security features" +msgstr "Désactiver toutes les fonctions de sécurité" + +#: admin/wp-security-settings-menu.php:257 +#: admin/wp-security-settings-menu.php:267 +msgid "Disable all firewall rules" +msgstr "Désactiver toutes les règles de pare-feu" + +#: admin/wp-security-settings-menu.php:263 +msgid "This feature will disable all firewall rules which are currently active in this plugin and it will also delete these rules from your .htacess file. Use it if you think one of the firewall rules is causing an issue on your site." +msgstr "Cette fonction permet de désactiver toutes les règles de pare-feu actuellement actives dans cette extension, elle supprime également ces règles dans le fichier .htaccess. Utilisez-la si vous pensez que l’une des règles de pare-feu est à l’origine d’un problème sur votre site." + +#: admin/wp-security-settings-menu.php:274 +#: admin/wp-security-settings-menu.php:287 +msgid "Reset settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:279 +msgid "This button click will delete all of your settings related to the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:280 +msgid "This button click will reset/empty all the database tables of the security plugin also." +msgstr "" + +#: admin/wp-security-settings-menu.php:281 +msgid "Use this plugin if you were locked out by the All In One WP Security & Firewall Plugin and/or you are having issues logging in when that plugin is activated." +msgstr "" + +#: admin/wp-security-settings-menu.php:282 +msgid "In addition to the settings it will also delete any directives which were added to the .htaccess file by the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:283 +msgid "%1$sNOTE: %2$sAfter deleting the settings you will need to re-configure the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:295 +msgid "Debug settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:301 +msgid "This setting allows you to enable/disable debug for this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:307 +msgid "Enable debug" +msgstr "" + +#: admin/wp-security-settings-menu.php:310 +msgid "Check this if you want to enable debug. You should keep this option disabled after you have finished debugging the issue." +msgstr "" + +#: admin/wp-security-settings-menu.php:314 +msgid "Save debug settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:350 +msgid "Your .htaccess file was successfully backed up! Using an FTP program go to the \"/wp-content/aiowps_backups\" directory to save a copy of the file to your computer." +msgstr "Votre fichier .htaccess a été sauvegardé avec succès ! Si vous utilisez un programme FTP, allez dans le répertoire « /wp-content/aiowps_backups » pour en enregistrer une copie sur votre ordinateur." + +#: admin/wp-security-settings-menu.php:356 +msgid "htaccess file rename failed during backup. Please check your root directory for the backup file using FTP." +msgstr "Le renommage du .htaccess a échoué lors de la sauvegarde. Veuillez vérifier votre répertoire racine pour le fichier de sauvegarde via FTP." + +#: admin/wp-security-settings-menu.php:362 +msgid "htaccess backup failed." +msgstr "La sauvegarde du .htaccess a échoué." + +#: admin/wp-security-settings-menu.php:377 +msgid "Please choose a .htaccess to restore from." +msgstr "Choisir un .htaccess à partir duquel restaurer." + +#: admin/wp-security-settings-menu.php:392 +msgid "htaccess file restore failed. Please attempt to restore the .htaccess manually using FTP." +msgstr "Échec de la restauration du .htaccess. Essayer de le restaurer manuellement en utilisant FTP si nécessaire." + +#: admin/wp-security-settings-menu.php:396 +msgid "Your .htaccess file has successfully been restored!" +msgstr "Votre fichier .htaccess a été restauré avec succès !" + +#: admin/wp-security-settings-menu.php:402 +msgid "htaccess Restore operation failed! Please check the contents of the file you are trying to restore from." +msgstr "L’opération de restauration du .htaccess a échoué ! Veuillez vérifier le contenu du fichier à partir duquel vous avez essayé de restaurer." + +#: admin/wp-security-settings-menu.php:408 +msgid ".htaccess file operations" +msgstr "Opérations sur le fichier .htaccess" + +#: admin/wp-security-settings-menu.php:411 +msgid "Your \".htaccess\" file is a key component of your website's security and it can be modified to implement various levels of protection mechanisms." +msgstr "Votre fichier « .htaccess » est un élément clé de la sécurité de votre site Web et il peut être modifié pour mettre en œuvre différents niveaux de mécanismes de protection." + +#: admin/wp-security-settings-menu.php:412 +msgid "This feature allows you to backup and save your currently active .htaccess file should you need to re-use the the backed up file in the future." +msgstr "Cette fonctionnalité permet de sauvegarder et enregistrer votre fichier .htaccess actuellement actif si vous avez besoin de réutiliser la sauvegarde à l’avenir." + +#: admin/wp-security-settings-menu.php:413 +msgid "You can also restore your site's .htaccess settings using a backed up .htaccess file." +msgstr "Vous pouvez également restaurer les paramètres .htaccess de votre site en utilisant un fichier .htaccess sauvegardé." + +#: admin/wp-security-settings-menu.php:428 +msgid "Save the current .htaccess file" +msgstr "Sauvegarder le fichier .htaccess actuel" + +#: admin/wp-security-settings-menu.php:432 +msgid "Click the button below to backup and save the currently active .htaccess file." +msgstr "Cliquez le bouton ci-dessous pour sauvegarder et enregistrer le fichier .htaccess actuellement actif." + +#: admin/wp-security-settings-menu.php:437 +msgid "Restore from a backed up .htaccess file" +msgstr "Restaurer à partir d'un fichier .htaccess sauvegardé antérieurement" + +#: admin/wp-security-settings-menu.php:443 +msgid ".htaccess file to restore from" +msgstr "Fichier .htaccess à partir duquel restaurer" + +#: admin/wp-security-settings-menu.php:445 +msgid "Select Your htaccess File" +msgstr "" + +#: admin/wp-security-settings-menu.php:449 +msgid "After selecting your file, click the button below to restore your site using the backed up htaccess file (htaccess_backup.txt)." +msgstr "Après avoir sélectionné votre fichier, cliquez le bouton ci-dessous pour restaurer votre site en utilisant le fichier .htaccess sauvegardé (htaccess_backup.txt)." + +#: admin/wp-security-settings-menu.php:455 +msgid "Restore .htaccess file" +msgstr "Restaurer le fichier .htaccess" + +#: admin/wp-security-settings-menu.php:477 +msgid "Please choose a wp-config.php file to restore from." +msgstr "Veuillez choisir un fichier wp-config.php à partir duquel restaurer." + +#: admin/wp-security-settings-menu.php:493 +msgid "wp-config.php file restore failed. Please attempt to restore this file manually using FTP." +msgstr "Échec de la restauration du fichier wp-config.php. Essayez de restaurer ce fichier manuellement, à l’aide de FTP si nécessaire." + +#: admin/wp-security-settings-menu.php:497 +msgid "Your wp-config.php file has successfully been restored!" +msgstr "Votre fichier wp-config.php a été restauré avec succès" + +#: admin/wp-security-settings-menu.php:503 +msgid "wp-config.php Restore operation failed! Please check the contents of the file you are trying to restore from." +msgstr "L'opération de restauration du wp-config.php a échoué ! Veuillez vérifiez le contenu du fichier à partir duquel vous avez essayez de restaurer." + +#: admin/wp-security-settings-menu.php:509 +msgid "wp-config.php file operations" +msgstr "Opérations sur les fichiers wp-config.php" + +#: admin/wp-security-settings-menu.php:512 +msgid "Your \"wp-config.php\" file is one of the most important in your WordPress installation. It is a primary configuration file and contains crucial things such as details of your database and other critical components." +msgstr "Votre fichier « wp-config.php » est l’un des plus importants de votre installation WordPress. C’est un fichier de configuration principal qui contient des éléments essentiels comme les détails de votre base de données et autres éléments importants." + +#: admin/wp-security-settings-menu.php:513 +msgid "This feature allows you to backup and save your currently active wp-config.php file should you need to re-use the the backed up file in the future." +msgstr "Cette fonctionnalité permet de sauvegarder et enregistrer votre fichier wp-config.php actuellement actif au cas où vous auriez besoin de ré-utiliser le fichier sauvegardé à l'avenir." + +#: admin/wp-security-settings-menu.php:514 +msgid "You can also restore your site's wp-config.php settings using a backed up wp-config.php file." +msgstr "Vous pouvez également restaurer les paramètres wp-config.php de votre site en utilisant un fichier wp-config.php sauvegardés." + +#: admin/wp-security-settings-menu.php:529 +msgid "Save the current wp-config.php file" +msgstr "Le fichier wp-config.php a été mis à jour avec succès !" + +#: admin/wp-security-settings-menu.php:533 +msgid "Click the button below to backup and download the contents of the currently active wp-config.php file." +msgstr "Cliquez le bouton ci-dessous pour sauvegarder et télécharger le contenu du fichier wp-config.php actif." + +#: admin/wp-security-settings-menu.php:539 +msgid "Restore from a backed up wp-config file" +msgstr "Restaurer wp-config à partir d’une sauvegarde antérieure" + +#: admin/wp-security-settings-menu.php:545 +msgid "wp-config file to restore from" +msgstr "Fichier wp-config à restaurer" + +#: admin/wp-security-settings-menu.php:547 +msgid "Select Your wp-config File" +msgstr "" + +#: admin/wp-security-settings-menu.php:551 +msgid "After selecting your file click the button below to restore your site using the backed up wp-config file (wp-config.php.backup.txt)." +msgstr "Après avoir sélectionné votre fichier, cliquez le bouton ci-dessous pour restaurer votre site en utilisant la sauvegarde du fichier wp-config (wp-config.php.backup.txt)." + +#: admin/wp-security-settings-menu.php:557 +msgid "Restore wp-config file" +msgstr "Restaurer le fichier wp-config" + +#: admin/wp-security-settings-menu.php:591 +msgid "Manage delete plugin settings saved." +msgstr "" + +#: admin/wp-security-settings-menu.php:596 +msgid "Manage delete plugin tasks" +msgstr "" + +#: admin/wp-security-settings-menu.php:603 +msgid "Delete database tables" +msgstr "" + +#: admin/wp-security-settings-menu.php:606 +msgid "Check this if you want to remove database tables when the plugin is uninstalled." +msgstr "" + +#: admin/wp-security-settings-menu.php:610 +msgid "Delete settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:613 +msgid "Check this if you want to remove all plugin settings when uninstalling the plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:613 +msgid "It will also remove all custom htaccess rules that were added by this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:647 +msgid "WP generator meta tag and version info" +msgstr "" + +#: admin/wp-security-settings-menu.php:650 +msgid "WordPress generator automatically adds some meta information inside the \"head\" tags of every page on your site's front end. Below is an example of this:" +msgstr "Le générateur WordPress ajoute automatiquement quelques méta-informations à l’intérieur des balises « Head » de chaque page du visuel de votre site. Voici un exemple de celles-ci :" + +#: admin/wp-security-settings-menu.php:652 +msgid "The above meta information shows which version of WordPress your site is currently running and thus can help hackers or crawlers scan your site to see if you have an older version of WordPress or one with a known exploit." +msgstr "Les méta-informations ci-dessus indiquent quelle version de WordPress est en cours d'exécution pour votre site, et peut ainsi aider les pirates ou des robots d'analyse si vous avez une ancienne version de WordPress ou comportant une faille connue." + +#: admin/wp-security-settings-menu.php:653 +msgid "There are also other ways wordpress reveals version info such as during style and script loading. An example of this is:" +msgstr "" + +#: admin/wp-security-settings-menu.php:655 +msgid "This feature will allow you to remove the WP generator meta info and other version info from your site's pages." +msgstr "" + +#: admin/wp-security-settings-menu.php:661 +msgid "WP generator meta info" +msgstr "WP générateur d’Infos Meta" + +#: admin/wp-security-settings-menu.php:673 +msgid "Remove WP generator meta info" +msgstr "Supprimer le générateur WP d’Infos Meta" + +#: admin/wp-security-settings-menu.php:676 +msgid "Check this if you want to remove the version and meta info produced by WP from all pages" +msgstr "" + +#: admin/wp-security-settings-menu.php:704 +msgid "Please choose a file to import your settings from." +msgstr "Veuillez choisir un fichier à partir duquel importer les paramètres." + +#: admin/wp-security-settings-menu.php:736 +msgid "Import AIOS settings from " +msgstr "" + +#: admin/wp-security-settings-menu.php:742 +#: admin/wp-security-settings-menu.php:786 +msgid "The deletion of the import file failed. Please delete this file manually via the media menu for security purposes." +msgstr "La suppression du fichier importation a échoué. Veuillez supprimer ce fichier manuellement via le menu médias pour raison de sécurité." + +#: admin/wp-security-settings-menu.php:744 +#: admin/wp-security-settings-menu.php:788 +msgid "The file you uploaded was also deleted for security purposes because it contains security settings details." +msgstr "Le fichier que vous avez téléchargé a également été supprimé pour raison de sécurité, car il contient des informations de paramétrage de sécurité." + +#: admin/wp-security-settings-menu.php:759 +msgid "Your AIOS settings were successfully imported via file input." +msgstr "" + +#: admin/wp-security-settings-menu.php:760 +msgid "The deletion of the import file failed. Please delete this file manually via the media menu for security purposes because it contains security settings details." +msgstr "La suppression du fichier à importer a échoué. Veuillez supprimer ce fichier manuellement via le menu des médias pour raison de sécurité, car il contient le détail des paramètres de sécurité." + +#: admin/wp-security-settings-menu.php:762 +msgid "Your AIOS settings were successfully imported. The file you uploaded was also deleted for security purposes because it contains security settings details." +msgstr "" + +#: admin/wp-security-settings-menu.php:765 +msgid "Your AIOS settings were successfully imported via text entry." +msgstr "" + +#: admin/wp-security-settings-menu.php:780 +msgid "The contents of your settings file appear invalid. Please check the contents of the file you are trying to import settings from." +msgstr "Le contenu du fichier de paramètres affiché est non valide. Vérifiez le contenu du fichier d'import des paramètres." + +#: admin/wp-security-settings-menu.php:797 +msgid "Export or import your AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:800 +msgid "This section allows you to export or import your All In One WP Security & Firewall settings." +msgstr "Cette section permet d’exporter ou importer tous vos paramètres d’All In One WP Security & Firewall ." + +#: admin/wp-security-settings-menu.php:801 +msgid "This can be handy if you wanted to save time by applying the settings from one site to another site." +msgstr "Cela peut être pratique si vous voulez gagner du temps en appliquant les paramètres d’un site à un autre." + +#: admin/wp-security-settings-menu.php:802 +msgid "NOTE: Before importing, it is your responsibility to know what settings you are trying to import. Importing settings blindly can cause you to be locked out of your site." +msgstr "REMARQUE : Avant d’importer, il est de votre responsabilité de bien savoir quels sont les paramètres que vous essayez d’installer : importer aveuglément des paramètres de sécurité peut vous bloquer hors de votre site." + +#: admin/wp-security-settings-menu.php:803 +msgid "For Example: If a settings item relies on the domain URL then it may not work correctly when imported into a site with a different domain." +msgstr "Par exemple : si un des élément du paramétrage dépend de l’URL de domaine, il peut ne pas fonctionner correctement lorsqu’importé dans un site avec un domaine différent." + +#: admin/wp-security-settings-menu.php:809 +#: admin/wp-security-settings-menu.php:818 +msgid "Export AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:815 +msgid "To export your All In One WP Security & Firewall settings click the button below." +msgstr "Pour exporter vos paramètres d’All-In-One WP Security & Firewall, cliquez le bouton ci-dessous." + +#: admin/wp-security-settings-menu.php:822 +#: admin/wp-security-settings-menu.php:851 +msgid "Import AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:828 +msgid "Use this section to import your All In One WP Security & Firewall settings from a file. Alternatively, copy/paste the contents of your import file into the textarea below." +msgstr "Utilisez cette section pour importer tous vos paramètres d’All In One WP Security & Firewall. Vous pouvez également copier / coller le contenu de votre fichier d’importation dans la zone de texte ci-dessous." + +#: admin/wp-security-settings-menu.php:830 +msgid "Import file" +msgstr "Importer le fichier" + +#: admin/wp-security-settings-menu.php:833 +msgid "Select Your Import Settings File" +msgstr "" + +#: admin/wp-security-settings-menu.php:837 +msgid "After selecting your file, click the button below to apply the settings to your site." +msgstr "Après avoir sélectionné votre fichier, cliquez le bouton ci-dessous pour appliquer les paramètres à votre site." + +#: admin/wp-security-settings-menu.php:844 +msgid "Copy/Paste import data" +msgstr "Copier / coller les données importées" + +#: admin/wp-security-settings-menu.php:893 +msgid "Default - if correct, then this is the best option" +msgstr "" + +#: admin/wp-security-settings-menu.php:894 +msgid "Only use if you're using Cloudflare." +msgstr "" + +#: admin/wp-security-settings-menu.php:902 +msgid "(current value: %s)" +msgstr "" + +#: admin/wp-security-settings-menu.php:905 +msgid "no value (i.e. empty) on your server" +msgstr "" + +#: admin/wp-security-spam-menu.php:28 +msgid "Comment spam" +msgstr "Commentaire SPAM" + +#: admin/wp-security-spam-menu.php:29 +msgid "Comment spam IP monitoring" +msgstr "Surveillance IP commentaires SPAM" + +#: admin/wp-security-spam-menu.php:30 +msgid "BuddyPress" +msgstr "BuddyPress" + +#: admin/wp-security-spam-menu.php:31 +msgid "bbPress" +msgstr "" + +#: admin/wp-security-spam-menu.php:57 +msgid "Spam prevention" +msgstr "Prévention du SPAM" + +#: admin/wp-security-spam-menu.php:99 +msgid "You entered a non numeric value for the \"move spam comments to trash after number of days\" field." +msgstr "" + +#: admin/wp-security-spam-menu.php:99 +#: admin/wp-security-spam-menu.php:297 +#: admin/wp-security-user-login-menu.php:118 +#: admin/wp-security-user-login-menu.php:124 +#: admin/wp-security-user-login-menu.php:130 +#: admin/wp-security-user-login-menu.php:136 +msgid "It has been set to the default value." +msgstr "" + +#: admin/wp-security-spam-menu.php:129 +msgid "Comment spam settings" +msgstr "Paramètres commentaires SPAM" + +#: admin/wp-security-spam-menu.php:134 +msgid "Add CAPTCHA to comments form" +msgstr "Ajouter un Captcha au formulaire de commentaires" + +#: admin/wp-security-spam-menu.php:138 +msgid "This feature will add a CAPTCHA field in the WordPress comments form." +msgstr "" + +#: admin/wp-security-spam-menu.php:139 +msgid "Adding a CAPTCHA field in the comment form is a simple way of greatly reducing spam comments from bots without using .htaccess rules." +msgstr "L’ajout d’un champ Captcha dans le formulaire de commentaire est un moyen simple de réduire grandement le SPAM de commentaires contre les robots collecteurs sans utiliser les règles .htaccess." + +#: admin/wp-security-spam-menu.php:148 +msgid "Enable CAPTCHA on comment forms" +msgstr "Activer le Captcha sur les formulaires de commentaire" + +#: admin/wp-security-spam-menu.php:151 +msgid "Check this if you want to insert a CAPTCHA field on the comment forms." +msgstr "Cochez si vous souhaitez insérer un champ Captcha sur les formulaires de commentaires" + +#: admin/wp-security-spam-menu.php:158 +msgid "Block spambot comments" +msgstr "Bloquer les commentaires de spambots" + +#: admin/wp-security-spam-menu.php:162 +msgid "A large portion of WordPress blog comment spam is mainly produced by automated bots and not necessarily by humans." +msgstr "" + +#: admin/wp-security-spam-menu.php:163 +msgid "This feature will greatly minimize the useless and unecessary traffic and load on your server resulting from spam comments by blocking all comment requests which do not originate from your domain." +msgstr "Cette fonctionnalité va considérablement réduire le trafic et les chargements inutiles sur votre serveur dus aux SPAM de commentaires en bloquant toutes les demandes de commentaire qui ne proviennent pas de votre domaine." + +#: admin/wp-security-spam-menu.php:164 +msgid "In other words, if the comment was not submitted by a human who physically submitted the comment on your site, the request will be blocked." +msgstr "En d’autres termes, si le commentaire n’était pas présenté physiquement par un humain sur votre site, il sera bloqué." + +#: admin/wp-security-spam-menu.php:182 +msgid "Block spambots from posting comments" +msgstr "Bloquer le Spambot postant un commentaire" + +#: admin/wp-security-spam-menu.php:185 +msgid "Check this if you want to apply a firewall rule which will block comments originating from spambots." +msgstr "Cochez cette case pour appliquer une règle de pare-feu permettant de bloquer les commentaires provenant des spambots." + +#: admin/wp-security-spam-menu.php:189 +msgid "This feature will implement a firewall rule to block all comment attempts which do not originate from your domain." +msgstr "Cette fonction mettra en œuvre une règle de pare-feu pour bloquer toutes tentatives de commentaire qui ne provient pas de votre domaine." + +#: admin/wp-security-spam-menu.php:190 +msgid "A legitimate comment is one which is submitted by a human who physically fills out the comment form and clicks the submit button. For such events, the HTTP_REFERRER is always set to your own domain." +msgstr "Un commentaire légitime est celui qui est présenté par un humain qui physiquement remplit le formulaire de commentaire et clique sur le bouton « Soumettre ». Pour de tels événements, le HTTP_REFERRER est toujours positionné sur votre propre nom de domaine." + +#: admin/wp-security-spam-menu.php:191 +msgid "A comment submitted by a spambot is done by directly calling the comments.php file, which usually means that the HTTP_REFERRER value is not your domain and often times empty." +msgstr "Un commentaire présenté par un spambot se fait en appelant directement le fichier comments.php, ce qui signifie généralement que la valeur HTTP_REFERRER n’est pas votre domaine et est le plus souvent vide." + +#: admin/wp-security-spam-menu.php:192 +msgid "This feature will check and block comment requests which are not referred by your domain thus greatly reducing your overall blog spam and PHP requests done by the server to process these comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:202 +msgid "Comment processing" +msgstr "" + +#: admin/wp-security-spam-menu.php:207 +msgid "Trash spam comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:216 +msgid "Move spam comments to trash after %s days." +msgstr "" + +#: admin/wp-security-spam-menu.php:224 +msgid "Enble this feature in order to move the spam comments to trash after given number of days." +msgstr "" + +#: admin/wp-security-spam-menu.php:262 +msgid "You entered a non numeric value for the minimum number of spam comments field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-spam-menu.php:265 +msgid "You must enter an integer greater than zero for minimum number of spam comments field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-spam-menu.php:292 +msgid "Nonce check failed for list spam comment IPs." +msgstr "Échec du contrôle ponctuel pour voir les IPs des Spammeurs de commentaire !" + +#: admin/wp-security-spam-menu.php:297 +msgid "You entered a non numeric value for the minimum spam comments per IP field." +msgstr "" + +#: admin/wp-security-spam-menu.php:308 +msgid "Displaying results for IP addresses which have posted a minimum of %s spam comments." +msgstr "Afficher les résultats d’adresses IP qui ont posté un minimum de %s commentaires indésirables" + +#: admin/wp-security-spam-menu.php:323 +msgid "Auto block spammer IPs" +msgstr "" + +#: admin/wp-security-spam-menu.php:328 +msgid "This feature has detected that %s is not active. It is highly recommended that you activate the Akismet plugin to make the most of this feature." +msgstr "" + +#: admin/wp-security-spam-menu.php:337 +msgid "This feature allows you to automatically and permanently block IP addresses which have exceeded a certain number of comments labelled as spam." +msgstr "" + +#: admin/wp-security-spam-menu.php:338 +msgid "Comments are usually labelled as spam either by the Akismet plugin or manually by the WP administrator when they mark a comment as \"spam\" from the WordPress Comments menu." +msgstr "" + +#: admin/wp-security-spam-menu.php:352 +msgid "You currently have no IP addresses permanently blocked due to spam." +msgstr "" + +#: admin/wp-security-spam-menu.php:365 +msgid "Spammer IPs added to permanent block list today: " +msgstr "" + +#: admin/wp-security-spam-menu.php:366 +msgid "All time total: " +msgstr "" + +#: admin/wp-security-spam-menu.php:367 +msgid "View blocked IPs" +msgstr "" + +#: admin/wp-security-spam-menu.php:380 +msgid "Enable auto block of spam comment IPs" +msgstr "" + +#: admin/wp-security-spam-menu.php:383 +msgid "Check this box if you want this plugin to automatically block IP addresses which submit spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:387 +msgid "Minimum number of spam comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:389 +msgid "Specify the minimum number of spam comments for an IP address before it is permanently blocked." +msgstr "" + +#: admin/wp-security-spam-menu.php:393 +msgid "Example 1: Setting this value to \"1\" will block ALL IP addresses which were used to submit at least one spam comment." +msgstr "" + +#: admin/wp-security-spam-menu.php:394 +msgid "Example 2: Setting this value to \"5\" will block only those IP addresses which were used to submit 5 spam comments or more on your site." +msgstr "" + +#: admin/wp-security-spam-menu.php:412 +msgid "List spammer IP addresses" +msgstr "Liste des adresses IP de Spammeurs" + +#: admin/wp-security-spam-menu.php:416 +msgid "This section displays a list of the IP addresses of the people or bots who have left spam comments on your site." +msgstr "" + +#: admin/wp-security-spam-menu.php:417 +msgid "This information can be handy for identifying the most persistent IP addresses or ranges used by spammers." +msgstr "Cette information peut être utile pour identifier les adresses IP ou plages les plus tenaces utilisées par les spammeurs." + +#: admin/wp-security-spam-menu.php:418 +msgid "By inspecting the IP address data coming from spammers you will be in a better position to determine which addresses or address ranges you should block by adding them to the permanent block list." +msgstr "" + +#: admin/wp-security-spam-menu.php:419 +msgid "To add one or more of the IP addresses displayed in the table below to your blacklist, simply click the \"Block\" link for the individual row or select more than one address using the checkboxes and then choose the \"block\" option from the Bulk Actions dropdown list and click the \"Apply\" button." +msgstr "" + +#: admin/wp-security-spam-menu.php:427 +msgid "Minimum number of spam comments per IP" +msgstr "Nombre minimal de commentaires SPAM par IP" + +#: admin/wp-security-spam-menu.php:429 +msgid "This field allows you to list only those IP addresses which have been used to post X or more spam comments." +msgstr "Ce champ vous permet d’énumérer uniquement les adresses IP qui ont été utilisés pour un (ou davantage de) commentaire SPAM." + +#: admin/wp-security-spam-menu.php:433 +msgid "Example 1: Setting this value to \"0\" or \"1\" will list ALL IP addresses which were used to submit spam comments." +msgstr "Exemple 1 : Définition de cette valeur à « 0 » ou « 1 » listera toutes les adresses IP ayant été utilisés pour soumettre des commentaires SPAMmés." + +#: admin/wp-security-spam-menu.php:434 +msgid "Example 2: Setting this value to \"5\" will list only those IP addresses which were used to submit 5 spam comments or more on your site." +msgstr "Exemple 2 : Définir cette valeur à « 5 » listera uniquement les adresses IP qui ont été utilisés pour présenter 5 commentaires SPAM ou plus sur votre site." + +#: admin/wp-security-spam-menu.php:441 +msgid "Find IP addresses" +msgstr "Trouver les adresses IP" + +#: admin/wp-security-spam-menu.php:445 +msgid "Spammer IP address results" +msgstr "Liste des adresses IP de spammeurs" + +#: admin/wp-security-spam-menu.php:451 +#: classes/wp-security-utility.php:253 +msgid "The plugin has detected that you are using a Multi-Site WordPress installation." +msgstr "L’extension a détecté que vous utilisez une installation multi-site WordPress." + +#: admin/wp-security-spam-menu.php:452 +msgid "Only the \"superadmin\" can block IP addresses from the main site." +msgstr "Seul le « super Admin » peut bloquer les adresses IP à partir du site principal." + +#: admin/wp-security-spam-menu.php:453 +msgid "Take note of the IP addresses you want blocked and ask the superadmin to add these to the blacklist using the \"Blacklist Manager\" on the main site." +msgstr "Prenez note des adresses IP que vous voulez bloquer et demandez au « super Admin » de les ajouter à la liste noire en utilisant le « gestionnaire de liste noire » sur le site principal." + +#: admin/wp-security-spam-menu.php:498 +msgid "BuddyPress spam settings" +msgstr "Paramétrage anti-SPAM de BuddyPress" + +#: admin/wp-security-spam-menu.php:503 +msgid "Add CAPTCHA to BuddyPress registration form" +msgstr "Ajouter un Captcha sur le formulaire d’inscription à BuddyPress" + +#: admin/wp-security-spam-menu.php:507 +msgid "This feature will add a simple math CAPTCHA field in the BuddyPress registration form." +msgstr "Cette fonctionnalité va ajouter un champ Captcha arithmétique simple dans le formulaire d’inscription à BuddyPress." + +#: admin/wp-security-spam-menu.php:508 +msgid "Adding a CAPTCHA field in the registration form is a simple way of greatly reducing spam signups from bots without using .htaccess rules." +msgstr "L’ajout d’un champ Captcha dans le formulaire de commentaire est un moyen simple de réduire grandement les formulaires SPAM contrant ainsi les robots collecteurs sans pour autant utiliser les règles .htaccess." + +#: admin/wp-security-spam-menu.php:518 +msgid "Enable CAPTCHA on BuddyPress registration form" +msgstr "Activer un Captcha sur le formulaire d’inscription à BuddyPress" + +#: admin/wp-security-spam-menu.php:521 +msgid "Check this if you want to insert a CAPTCHA field on the BuddyPress registration forms." +msgstr "Case à cocher pour insérer un champ Captcha sur le formulaire d’enregistrement de BuddyPress" + +#: admin/wp-security-spam-menu.php:530 +msgid "BuddyPress is not active! In order to use this feature you will need to have BuddyPress installed and activated." +msgstr "BuddyPress est pas actif ! Pour utiliser cette fonctionnalité, vous devez avoir BuddyPress installé et activé." + +#: admin/wp-security-spam-menu.php:560 +msgid "bbPress spam settings" +msgstr "" + +#: admin/wp-security-spam-menu.php:565 +msgid "Add CAPTCHA to bbPress new topic form" +msgstr "" + +#: admin/wp-security-spam-menu.php:569 +msgid "This feature will add a simple math CAPTCHA field in the bbPress new topic form." +msgstr "" + +#: admin/wp-security-spam-menu.php:570 +msgid "Adding a CAPTCHA field in this form is a simple way of greatly reducing spam submitted from bots." +msgstr "" + +#: admin/wp-security-spam-menu.php:580 +msgid "Enable CAPTCHA on bbPress new topic form" +msgstr "" + +#: admin/wp-security-spam-menu.php:583 +msgid "Check this if you want to insert a CAPTCHA field on the bbPress new topic forms." +msgstr "" + +#: admin/wp-security-spam-menu.php:592 +msgid "bbPress is not active. In order to use this feature you will need to have bbPress installed and activated." +msgstr "" + +#: admin/wp-security-tools-menu.php:34 +msgid "WHOIS lookup" +msgstr "Consultation WHOIS" + +#: admin/wp-security-tools-menu.php:95 +#: admin/wp-security-tools-menu.php:136 +msgid "Querying %s: %s" +msgstr "" + +#: admin/wp-security-tools-menu.php:103 +#: admin/wp-security-tools-menu.php:112 +#: admin/wp-security-tools-menu.php:151 +msgid "Redirected to %s" +msgstr "" + +#: admin/wp-security-tools-menu.php:173 +msgid "The WHOIS lookup feature gives you a way to look up who owns an IP address or domain name." +msgstr "" + +#: admin/wp-security-tools-menu.php:173 +msgid "You can use this to investigate users engaging in malicious activity on your site." +msgstr "" + +#: admin/wp-security-tools-menu.php:176 +msgid "WHOIS lookup on IP or domain" +msgstr "" + +#: admin/wp-security-tools-menu.php:183 +msgid "IP address or domain name:" +msgstr "" + +#: admin/wp-security-tools-menu.php:190 +msgid "Look up IP or domain" +msgstr "" + +#: admin/wp-security-tools-menu.php:219 +msgid "Please enter a valid IP address or domain name to look up." +msgstr "" + +#: admin/wp-security-tools-menu.php:220 +#: admin/wp-security-tools-menu.php:226 +msgid "Nothing to show." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:32 +msgid "WP username" +msgstr "Nom d’utilisateur WP" + +#: admin/wp-security-user-accounts-menu.php:33 +msgid "Display name" +msgstr "Nom affiché" + +#: admin/wp-security-user-accounts-menu.php:34 +msgid "Password" +msgstr "Mot de passe" + +#: admin/wp-security-user-accounts-menu.php:60 +msgid "User accounts" +msgstr "Comptes utilisateur" + +#: admin/wp-security-user-accounts-menu.php:82 +msgid "Admin user security" +msgstr "Sécurité d’Administrateur" + +#: admin/wp-security-user-accounts-menu.php:85 +msgid "By default, WordPress sets the administrator username to \"admin\" at installation time." +msgstr "Par défaut, WordPress définit l’ID administrateur comme « Admin » au moment de l’installation." + +#: admin/wp-security-user-accounts-menu.php:86 +msgid "A lot of hackers try to take advantage of this information by attempting \"Brute force login attacks\" where they repeatedly try to guess the password by using \"admin\" for username." +msgstr "Un grand nombre de pirates tentent de tirer profit de ces informations en tentant des attaques « Brute Force Connexion » où ils tentent à plusieurs reprises de découvrir le mot de passe en utilisant « Admin » comme nom d’utilisateur." + +#: admin/wp-security-user-accounts-menu.php:87 +msgid "From a security perspective, changing the default \"admin\" user name is one of the first and smartest things you should do on your site." +msgstr "Du point de vue sécurité, changer le nom par défaut de l'utilisateur « Admin » est une des premières et des plus intelligentes choses à faire sur votre site." + +#: admin/wp-security-user-accounts-menu.php:88 +msgid "This feature will allow you to change your default \"admin\" user name to a more secure name of your choosing." +msgstr "Cette fonctionnalité permet de changer le nom d'utilisateur « Admin » par défaut pour un ID plus sûr de votre choix." + +#: admin/wp-security-user-accounts-menu.php:95 +msgid "List of administrator accounts" +msgstr "Liste des comptes administrateur" + +#: admin/wp-security-user-accounts-menu.php:104 +#: classes/grade-system/wp-security-feature-item-manager.php:43 +msgid "Change admin username" +msgstr "Changement du nom d’utilisateur Administrateur" + +#: admin/wp-security-user-accounts-menu.php:112 +msgid "Your site currently has an account which uses the default \"admin\" username. It is highly recommended that you change this name to something else. Use the following field to change the admin username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:118 +msgid "New admin username" +msgstr "Nouvel ID d’utilisateur administrateur" + +#: admin/wp-security-user-accounts-menu.php:120 +msgid "Choose a new username for admin." +msgstr "Choisissez un nouveau nom d’utilisateur admin." + +#: admin/wp-security-user-accounts-menu.php:124 +msgid "Change username" +msgstr "Changer d’ID d’utilisateur" + +#: admin/wp-security-user-accounts-menu.php:126 +msgid "NOTE: If you are currently logged in as \"admin\" you will be automatically logged out after changing your username and will be required to log back in." +msgstr "NOTE: Si vous êtes actuellement connecté en tant qu’ »Admin », vous serez automatiquement déconnecté après avoir changé votre nom d’utilisateur et celui-ci sera nécessaire pour rouvrir une session." + +#: admin/wp-security-user-accounts-menu.php:133 +msgid "No action required! " +msgstr "Aucune action n’est requise!" + +#: admin/wp-security-user-accounts-menu.php:135 +msgid "Your site does not have any account which uses the default \"admin\" username. " +msgstr "Votre site n’a pas de compte utilisant la valeur par défaut « Admin » comme nom d’utilisateur." + +#: admin/wp-security-user-accounts-menu.php:136 +msgid "This is good security practice." +msgstr "Ceci est une bonne pratique de sécurité." + +#: admin/wp-security-user-accounts-menu.php:148 +msgid "Display name security" +msgstr "Sécurité de nom d’affichage" + +#: admin/wp-security-user-accounts-menu.php:151 +msgid "When you submit a post or answer a comment, WordPress will usually display your \"nickname\"." +msgstr "Lorsque vous envoyez un message ou répondez à un commentaire WordPress, il sera affiché en tant que « pseudo »." + +#: admin/wp-security-user-accounts-menu.php:152 +msgid "By default the nickname is set to the login (or user) name of your account." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:153 +msgid "From a security perspective, leaving your nickname the same as your user name is bad practice because it gives a hacker at least half of your account's login credentials." +msgstr "Du point de vue de la sécurité, donner votre vrai nom comme nom d'utilisateur est une très mauvaise pratique, car il donne à un pirate la moitié au moins des identifiants de connexion à votre compte." + +#: admin/wp-security-user-accounts-menu.php:154 +msgid "Therefore to further tighten your site's security you are advised to change your nickname and Display name to be different from your Username." +msgstr "Par conséquent, pour resserrer davantage la sécurité de votre site, il est conseillé de changer votre pseudo et nom d’affichage pour qu’il soit différent de votre nom d’utilisateur." + +#: admin/wp-security-user-accounts-menu.php:160 +msgid "Modify accounts with identical login name and display name" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:169 +msgid "Your site currently has the following accounts which have an identical login name and display name." +msgstr "Votre site a actuellement les comptes suivants avec un nom d’utilisateur et le nom d’affichage identiques." + +#: admin/wp-security-user-accounts-menu.php:170 +msgid "Follow the link to edit the user profile of that particular user account, change Nickname, choose a different Display name compared to Username, and press the \"Update User\" button.)" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:185 +msgid "No action required." +msgstr "Aucune action n’est requise." + +#: admin/wp-security-user-accounts-menu.php:186 +msgid "Your site does not have a user account where the display name is identical to the username." +msgstr "Votre site ne contient pas de compte utilisateur dont le nom d’affichage et d’utilisateur sont identiques." + +#: admin/wp-security-user-accounts-menu.php:197 +msgid "Password tool" +msgstr "Outil Mot de passe" + +#: admin/wp-security-user-accounts-menu.php:200 +msgid "Poor password selection is one of the most common weak points of many sites and is usually the first thing a hacker will try to exploit when attempting to break into your site." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:201 +msgid "Many people fall into the trap of using a simple word or series of numbers as their password. Such a predictable and simple password would take a competent hacker merely minutes to guess your password by using a simple script which cycles through the easy and most common combinations." +msgstr "Beaucoup de gens tombent dans le piège de l’utilisation d’un simple mot ou série de numéros comme mot de passe. Un tel mot de passe prévisible et simple ne prendra que quelques minutes à un hacker compétent pour deviner votre mot de passe en utilisant un script simple qui balaye des combinaisons faciles et les plus courantes." + +#: admin/wp-security-user-accounts-menu.php:202 +msgid "The longer and more complex your password is the harder it is for hackers to \"crack\" because more complex passwords require much greater computing power and time." +msgstr "Plus long et complexe sera votre mot de passe, plus il sera difficile aux pirates informatiques de le « cracker » parce que les mots de passe complexes nécessitent une beaucoup plus grande puissance de calcul et de temps, ce qu’ils rechignent à mettre en œuvre [NdT]." + +#: admin/wp-security-user-accounts-menu.php:203 +msgid "This section contains a useful password strength tool which you can use to check whether your password is sufficiently strong enough." +msgstr "Cette section contient un analyseur de mots de passe que vous pouvez utiliser pour vérifier si le mot choisi est suffisamment robuste." + +#: admin/wp-security-user-accounts-menu.php:208 +msgid "Password strength tool" +msgstr "Outil de robustesse de mot de passe" + +#: admin/wp-security-user-accounts-menu.php:210 +msgid "This password tool uses an algorithm which calculates how long it would take for your password to be cracked using the computing power of an off-the-shelf current model desktop PC with high end processor, graphics card and appropriate password cracking software." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:213 +msgid "Start typing a password." +msgstr "Commencez à saisir un mot de passe." + +#: admin/wp-security-user-accounts-menu.php:216 +msgid "It would take a desktop PC approximately" +msgstr "Il faudrait à un PC de bureau environ" + +#: admin/wp-security-user-accounts-menu.php:217 +msgid "1 sec" +msgstr "1 Seconde" + +#: admin/wp-security-user-accounts-menu.php:217 +msgid "to crack your password!" +msgstr "pour casser ce mot de passe !" + +#: admin/wp-security-user-accounts-menu.php:222 +msgid "Password Strength" +msgstr "Complexité du mot de passe" + +#: admin/wp-security-user-accounts-menu.php:245 +msgid "Username " +msgstr "Nom d’utilisateur" + +#: admin/wp-security-user-accounts-menu.php:245 +msgid " already exists. Please enter another value. " +msgstr "existe déjà sur le site. Veuillez entrer une autre valeur." + +#: admin/wp-security-user-accounts-menu.php:262 +msgid "The database update operation of the user account failed!" +msgstr "La mise à jour en BdD du compte utilisateur a échoué !" + +#: admin/wp-security-user-accounts-menu.php:291 +msgid "You entered an invalid username. Please enter another value. " +msgstr "Vous avez saisi un nom d’utilisateur invalide. Veuillez choisir une autre valeur." + +#: admin/wp-security-user-accounts-menu.php:295 +msgid "Please enter a value for your username. " +msgstr "Veuillez entrer une valeur comme nom d’utilisateur." + +#: admin/wp-security-user-accounts-menu.php:302 +msgid "Username successfully changed." +msgstr "Nom d’utilisateur changé avec succès !" + +#: admin/wp-security-user-accounts-menu.php:322 +msgid "Account login name" +msgstr "Nom de connexion du compte" + +#: admin/wp-security-user-accounts-menu.php:331 +msgid "Edit user" +msgstr "" + +#: admin/wp-security-user-login-menu.php:54 +#: admin/wp-security-user-login-menu.php:474 +msgid "Failed login records" +msgstr "Registre des connexions échouées" + +#: admin/wp-security-user-login-menu.php:55 +#: classes/grade-system/wp-security-feature-item-manager.php:51 +msgid "Force logout" +msgstr "Forcer la déconnexion" + +#: admin/wp-security-user-login-menu.php:56 +#: admin/wp-security-user-login-menu.php:632 +msgid "Account activity logs" +msgstr "Journaux d’activité du compte" + +#: admin/wp-security-user-login-menu.php:58 +#: admin/wp-security-user-login-menu.php:769 +msgid "Additional settings" +msgstr "" + +#: admin/wp-security-user-login-menu.php:81 +msgid "User login" +msgstr "Connexion" + +#: admin/wp-security-user-login-menu.php:118 +msgid "You entered a non-numeric value for the max login attempts field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:124 +msgid "You entered a non numeric value for the login retry time period field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:130 +msgid "You entered a non numeric value for the lockout time length field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:136 +msgid "You entered a non numeric value for the maximim lockout time length field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:141 +msgid "You entered an invalid minimum lockout time length, it must be less than the maximum lockout time length value." +msgstr "" + +#: admin/wp-security-user-login-menu.php:141 +msgid "Both have been set to the default values." +msgstr "" + +#: admin/wp-security-user-login-menu.php:160 +msgid "Please fill in one or more email addresses to notify." +msgstr "" + +#: admin/wp-security-user-login-menu.php:162 +msgid "You have entered one or more invalid email addresses." +msgstr "" + +#: admin/wp-security-user-login-menu.php:165 +msgid "It has been set to your WordPress admin email as default." +msgstr "" + +#: admin/wp-security-user-login-menu.php:250 +msgid "Login lockout configuration" +msgstr "" + +#: admin/wp-security-user-login-menu.php:254 +msgid "One of the ways hackers try to compromise sites is via a " +msgstr "L’un des moyens par lesquels les pirates cherchent à pénétrer les sites est" + +#: admin/wp-security-user-login-menu.php:254 +msgid "Brute force login attack" +msgstr "l’attaque « Brute Force » de connexion" + +#: admin/wp-security-user-login-menu.php:254 +msgid "This is where attackers use repeated login attempts until they guess the password." +msgstr "Où les attaquants utilisent les tentatives de connexion répétées jusqu’à ce que le duo nom utilisateur + mot de passe fonctionne." + +#: admin/wp-security-user-login-menu.php:255 +msgid "Apart from choosing strong passwords, monitoring and blocking IP addresses which are involved in repeated login failures in a short period of time is a very effective way to stop these types of attacks." +msgstr "Outre le choix de mots de passe forts, la surveillance et le blocage d’adresses IP qui sont impliquées dans les échecs répétés de connexion en un court laps de temps est un moyen très efficace pour arrêter ce type d’attaques." + +#: admin/wp-security-user-login-menu.php:256 +msgid "You may also want to checkout our %s feature for another secure way to protect against these types of attacks." +msgstr "Vous pouvez également tester notre fonctionnalité de %s comme autre moyen sûr de protection contre ce type d’attaques." + +#: admin/wp-security-user-login-menu.php:261 +msgid "Login lockout options" +msgstr "" + +#: admin/wp-security-user-login-menu.php:272 +msgid "Enable login lockout feature" +msgstr "" + +#: admin/wp-security-user-login-menu.php:275 +msgid "Check this if you want to enable the login lockout feature and apply the settings below" +msgstr "" + +#: admin/wp-security-user-login-menu.php:279 +msgid "Allow unlock requests" +msgstr "Autoriser les requêtes de déverrouillage" + +#: admin/wp-security-user-login-menu.php:282 +msgid "Check this if you want to allow users to generate an automated unlock request link which will unlock their account" +msgstr "Cochez si vous voulez autoriser les utilisateurs à générer une demande de lien de déverrouillage automatique les autorisant à se connecter de nouveau" + +#: admin/wp-security-user-login-menu.php:286 +msgid "Max login attempts" +msgstr "Nombre maximal de tentatives de connexion échouées" + +#: admin/wp-security-user-login-menu.php:288 +msgid "Set the value for the maximum login retries before IP address is locked out" +msgstr "Réglez le nombre maxi de tentatives de connexion avant que l’adresse IP ne soit verrouillée" + +#: admin/wp-security-user-login-menu.php:292 +msgid "Login retry time period (min)" +msgstr "Durée (min) entre les tentatives de connexion" + +#: admin/wp-security-user-login-menu.php:294 +msgid "If the maximum number of failed login attempts for a particular IP address occur within this time period the plugin will lock out that address" +msgstr "Si le nombre maximum de tentatives de connexion infructueuses pour une adresse IP particulière se produit pendant cette période de temps, l’extension la verrouille automatiquement" + +#: admin/wp-security-user-login-menu.php:299 +msgid "Minimum lockout time length" +msgstr "" + +#: admin/wp-security-user-login-menu.php:305 +msgid "Set the minimum time period in minutes of lockout." +msgstr "" + +#: admin/wp-security-user-login-menu.php:306 +msgid "This failed login lockout time will be tripled on each failed login." +msgstr "" + +#: admin/wp-security-user-login-menu.php:313 +msgid "Maximum lockout time length" +msgstr "" + +#: admin/wp-security-user-login-menu.php:318 +msgid "Set the maximum time period in minutes of lockout." +msgstr "" + +#: admin/wp-security-user-login-menu.php:319 +msgid "No IP address will be blocked for more than this time period after making a failed login attempt." +msgstr "" + +#: admin/wp-security-user-login-menu.php:324 +msgid "Display generic error message" +msgstr "Afficher un message d’erreur générique" + +#: admin/wp-security-user-login-menu.php:327 +msgid "Check this if you want to show a generic error message when a login attempt fails" +msgstr "Cochez pour afficher un message d’erreur générique lorsqu’une tentative de connexion a échoué" + +#: admin/wp-security-user-login-menu.php:331 +msgid "Instantly lockout invalid usernames" +msgstr "Verrouillage instantané en cas d’ID utilisateur invalide" + +#: admin/wp-security-user-login-menu.php:334 +msgid "Check this if you want to instantly lockout login attempts with usernames which do not exist on your system" +msgstr "Cochez si vous voulez verrouiller instantanément une tentative de connexion avec une ID d’utilisateur inexistante sur votre système" + +#: admin/wp-security-user-login-menu.php:339 +msgid "Instantly lockout specific usernames" +msgstr "" + +#: admin/wp-security-user-login-menu.php:349 +msgid "Insert one username per line. Existing usernames are not blocked even if present in the list." +msgstr "" + +#: admin/wp-security-user-login-menu.php:354 +msgid "Notify by email" +msgstr "Notifier par courriel" + +#: admin/wp-security-user-login-menu.php:358 +msgid "Check this if you want to receive an email when someone has been locked out due to maximum failed login attempts" +msgstr "Cochez si vous souhaitez recevoir un courriel lorsque quelqu’un a été bloqué suite à un maximum de tentatives de connexion infructueuses" + +#: admin/wp-security-user-login-menu.php:361 +msgid "Fill in one email address per line." +msgstr "" + +#: admin/wp-security-user-login-menu.php:365 +msgid "Each email address must be on a new line." +msgstr "" + +#: admin/wp-security-user-login-menu.php:366 +msgid "If a valid email address has not been filled in, it will not be saved." +msgstr "" + +#: admin/wp-security-user-login-menu.php:367 +msgid "The valid email address format is userid@example.com" +msgstr "" + +#: admin/wp-security-user-login-menu.php:368 +msgid "Example: %s" +msgstr "" + +#: admin/wp-security-user-login-menu.php:375 +msgid "Enable PHP backtrace in email" +msgstr "" + +#: admin/wp-security-user-login-menu.php:379 +msgid "Check this if you want to include the PHP backtrace in notification emails." +msgstr "" + +#: admin/wp-security-user-login-menu.php:379 +msgid "This is internal coding information which makes it easier to investigate where an issued occurred." +msgstr "" + +#: admin/wp-security-user-login-menu.php:389 +msgid "Currently locked out IP address ranges" +msgstr "Plages d’adresses IP actuellement verrouillées" + +#: admin/wp-security-user-login-menu.php:394 +msgid "To see a list of all locked IP addresses and ranges go to the %s tab in the dashboard menu." +msgstr "Pour voir une liste de toutes les adresses et plages d’adresses IP bloquées, aller à l’onglet de %s dans le menu du tableau de bord." + +#: admin/wp-security-user-login-menu.php:399 +msgid "Login lockout IP whitelist settings" +msgstr "" + +#: admin/wp-security-user-login-menu.php:405 +msgid "Enable login lockout IP whitelist" +msgstr "" + +#: admin/wp-security-user-login-menu.php:416 +msgid "The addresses specified here will never be blocked by the login lockout feature." +msgstr "" + +#: admin/wp-security-user-login-menu.php:450 +msgid "User login feature - Delete all failed login records operation failed." +msgstr "Fonctions de connexion utilisateur - L’opération de purge des enregistrement de tentatives de connexions infructueuses a échoué !" + +#: admin/wp-security-user-login-menu.php:452 +msgid "All records from the failed logins table were deleted successfully." +msgstr "Tous les enregistrements de la table des tentatives de connexions infructueuses ont été supprimés avec succès !" + +#: admin/wp-security-user-login-menu.php:467 +msgid "This tab displays the failed login attempts for your site." +msgstr "Cet onglet affiche les tentatives de connexion infructueuses sur votre site." + +#: admin/wp-security-user-login-menu.php:468 +msgid "The information below can be handy if you need to do security investigations because it will show you the IP range, username and ID (if applicable) and the time/date of the failed login attempt." +msgstr "L’information ci-dessous peut être utile si vous avez besoin de faire des enquêtes de sécurité, car elle va vous montrer la plage d’IP, nom d’utilisateur et ID (le cas échéant) et la durée / date de la tentative de connexion infructueuse." + +#: admin/wp-security-user-login-menu.php:469 +msgid "Failed login records that are older than %1$d days are purged automatically." +msgstr "" + +#: admin/wp-security-user-login-menu.php:508 +#: admin/wp-security-user-login-menu.php:517 +msgid "Delete all failed login records" +msgstr "Purger les enregistrements de connexions infructueuses" + +#: admin/wp-security-user-login-menu.php:514 +msgid "Click this button if you wish to delete all failed login records in one go." +msgstr "Cliquez ce bouton si vous souhaitez purger les enregistrements de connexions infructueuses en une seule fois." + +#: admin/wp-security-user-login-menu.php:544 +msgid "You entered a non numeric value for the logout time period field. It has been set to the default value." +msgstr "Valeur non conforme pour la période de neutralisation de relance de connexion. Elle été fixée à sa valeur par défaut." + +#: admin/wp-security-user-login-menu.php:569 +msgid "Setting an expiry period for your WP administration session is a simple way to protect against unauthorized access to your site from your computer." +msgstr "Fixer un délai d’expiration de votre session d’administration WP est un moyen simple de se protéger contre l’accès non autorisé à votre site à partir de votre ordinateur." + +#: admin/wp-security-user-login-menu.php:570 +msgid "This feature allows you to specify a time period in minutes after which the admin session will expire and the user will be forced to log back in." +msgstr "Cette fonction permet de spécifier une période (en min) au bout de laquelle la session Admin expire, l’utilisateur étant forcé de se reconnecter." + +#: admin/wp-security-user-login-menu.php:575 +msgid "Force user logout options" +msgstr "Option forçage de déconnexion de l’utilisateur" + +#: admin/wp-security-user-login-menu.php:587 +msgid "Enable force WP user logout" +msgstr "Activer le forçage de déconnexion de l’utilisateur WP" + +#: admin/wp-security-user-login-menu.php:590 +msgid "Check this if you want to force a wp user to be logged out after a configured amount of time" +msgstr "Cochez si vous voulez forcer un utilisateur WP à être déconnecté après un laps temps configuré" + +#: admin/wp-security-user-login-menu.php:594 +msgid "Logout the WP user after XX minutes" +msgstr "Déconnecter l’utilisateur WP après XX Minutes" + +#: admin/wp-security-user-login-menu.php:596 +msgid "(Minutes) The user will be forced to log back in after this time period has elapased." +msgstr "(Minutes) L’utilisateur sera forcé de se reconnecter après que ce laps de temps soit passé." + +#: admin/wp-security-user-login-menu.php:625 +msgid "This tab displays the activity for accounts registered with your site that have logged in using the WordPress login form." +msgstr "" + +#: admin/wp-security-user-login-menu.php:626 +msgid "The information below can be handy if you need to do security investigations because it will show you the last 100 recent login events by username, IP address and time/date." +msgstr "" + +#: admin/wp-security-user-login-menu.php:627 +msgid "Account activity logs that are older than %1$d days are purged automatically." +msgstr "" + +#: admin/wp-security-user-login-menu.php:697 +msgid "Refresh logged in user data" +msgstr "Recharger les données d'utilisateur connecté" + +#: admin/wp-security-user-login-menu.php:701 +msgid "Refresh data" +msgstr "Actualiser les données" + +#: admin/wp-security-user-login-menu.php:706 +msgid "This tab displays all users who are currently logged into your site." +msgstr "Cet onglet affiche tous les utilisateurs actuellement connectés à votre site." + +#: admin/wp-security-user-login-menu.php:707 +msgid "If you suspect there is a user or users who are logged in which should not be, you can block them by inspecting the IP addresses from the data below and adding them to your blacklist." +msgstr "Si vous suspectez qu'un(des) utilisateur(s) connecté(s) ne le devrai(en)t pas, vous pouvez le(s) bloquer en inspectant l'(es )adresse(s) IP à partir des données ci-dessous et de l'(es )ajouter à votre liste noire." + +#: admin/wp-security-user-login-menu.php:708 +msgid "You can also instantly log them out by clicking on the \"Force logout\" link when you hover over the row in the user id column." +msgstr "" + +#: admin/wp-security-user-login-menu.php:713 +msgid "Currently logged in users" +msgstr "Utilisateurs actuellement connectés" + +#: admin/wp-security-user-login-menu.php:761 +msgid "WordPress 5.6 introduced a new feature called \"Application passwords\"." +msgstr "" + +#: admin/wp-security-user-login-menu.php:762 +msgid "This allows you to create a token from the WordPress dashboard which then can be used in the authorization header." +msgstr "" + +#: admin/wp-security-user-login-menu.php:763 +msgid "This feature allows you to disable application passwords as they can leave your site vulnerable to social engineering and phishing scams." +msgstr "" + +#: admin/wp-security-user-login-menu.php:780 +#: classes/grade-system/wp-security-feature-item-manager.php:53 +msgid "Disable application password" +msgstr "" + +#: admin/wp-security-user-login-menu.php:783 +msgid "Check this if you want to disable the application password." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:27 +msgid "Manual approval" +msgstr "Approbation manuelle" + +#: admin/wp-security-user-registration-menu.php:28 +#: classes/grade-system/wp-security-feature-item-manager.php:59 +msgid "Registration CAPTCHA" +msgstr "Captcha d’inscription" + +#: admin/wp-security-user-registration-menu.php:29 +msgid "Registration honeypot" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:55 +msgid "User registration" +msgstr "Enregistrement de l’utilisateur" + +#: admin/wp-security-user-registration-menu.php:115 +msgid "User registration settings" +msgstr "Paramètres d’inscription utilisateur" + +#: admin/wp-security-user-registration-menu.php:119 +msgid "Manually approve new registrations" +msgstr "Approuver manuellement les nouvelles inscriptions" + +#: admin/wp-security-user-registration-menu.php:123 +msgid "If your site allows people to create their own accounts via the WordPress registration form, then you can minimize spam or bogus registrations by manually approving each registration." +msgstr "Si votre site permet au visiteur de créer son propre compte via le formulaire d’inscription WordPress, vous pouvez réduire le SPAM ou les fausses inscriptions en approuvant manuellement chaque inscription." + +#: admin/wp-security-user-registration-menu.php:124 +msgid "This feature will automatically set a newly registered account to \"pending\" until the administrator activates it. Therefore undesirable registrants will be unable to log in without your express approval." +msgstr "Cette fonction permet de programmer automatiquement un compte nouvellement enregistré « en attente » jusqu’à ce qu’un administrateur l’active. Par conséquent les inscrits indésirables seront incapables de se connecter sans une autorisation expresse." + +#: admin/wp-security-user-registration-menu.php:125 +msgid "You can view all accounts which have been newly registered via the handy table below and you can also perform bulk activation/deactivation/deletion tasks on each account." +msgstr "Vous pouvez voir tous les comptes nouvellement enregistrés via la table ci-dessous et vous pouvez également effectuer des tâches d’activation / désactivation / suppression en masse de chaque compte." + +#: admin/wp-security-user-registration-menu.php:142 +msgid "Enable manual approval of new registrations" +msgstr "Activer l’approbation manuelle des nouvelles inscriptions" + +#: admin/wp-security-user-registration-menu.php:145 +msgid "Check this if you want to automatically disable all newly registered accounts so that you can approve them manually." +msgstr "Cochez si vous souhaitez désactiver automatiquement tous les comptes nouvellement créés, de sorte que vous puissiez les approuver manuellement." + +#: admin/wp-security-user-registration-menu.php:154 +msgid "Approve registered users" +msgstr "Approbation des utilisateurs enregistrés" + +#: admin/wp-security-user-registration-menu.php:206 +msgid "This feature allows you to add a CAPTCHA form on the WordPress registration page." +msgstr "Cette fonctionnalité permet d’ajouter un formulaire Captcha sur la page de connexion de WordPress." + +#: admin/wp-security-user-registration-menu.php:207 +msgid "Users who attempt to register will also need to enter the answer to a simple mathematical question - if they enter the wrong answer, the plugin will not allow them to register." +msgstr "Les utilisateurs tentant de s'enregistrer devront également répondre à une question arithmétique simple, si elles entrent une mauvaise réponse, l'extension ne leur permettra pas d'enregistrer leur demande." + +#: admin/wp-security-user-registration-menu.php:208 +msgid "Therefore, adding a CAPTCHA form on the registration page is another effective yet simple spam registration prevention technique." +msgstr "Donc, l'ajout d'un formulaire de Captcha sur la page d'inscription est une autre technique efficace et simple de prévention du SPAM d'inscription." + +#: admin/wp-security-user-registration-menu.php:212 +msgid "Registration page CAPTCHA settings" +msgstr "Paramètres du Captcha de page d'inscription" + +#: admin/wp-security-user-registration-menu.php:219 +msgid "The core default behaviour for WordPress Multi Site regarding user registration is that all users are registered via the main site." +msgstr "Le comportement de base par défaut pour l’enregistrement des utilisateur sous WordPress Multi Site est que tous soient enregistrés via le site principal." + +#: admin/wp-security-user-registration-menu.php:220 +msgid "Therefore, if you would like to add a CAPTCHA form to the registration page for a Multi Site, please go to \"Registration CAPTCHA\" settings on the main site." +msgstr "Par conséquent, si vous souhaitez ajouter un formulaire de Captcha à la page d’inscription pour un multi site, veuillez aller dans les paramètres « Captcha d’enregistrement » sur le site principal." + +#: admin/wp-security-user-registration-menu.php:235 +msgid "Enable CAPTCHA on registration page" +msgstr "Activer le Captcha sur la page d’inscription" + +#: admin/wp-security-user-registration-menu.php:238 +msgid "Check this if you want to insert a CAPTCHA form on the WordPress user registration page (if you allow user registration)." +msgstr "Cochez cette case pour insérer un Captcha sur la page d’inscription de l’utilisateur WordPress (si vous permettez l’enregistrement des utilisateurs)." + +#: admin/wp-security-user-registration-menu.php:276 +msgid "This feature allows you to add a special hidden \"honeypot\" field on the WordPress registration page. This will only be visible to robots and not humans." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:277 +msgid "Since robots usually fill in every input field from a registration form, they will also submit a value for the special hidden honeypot field." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:279 +msgid "Therefore, if the plugin detects that this field has a value when the registration form is submitted, then the robot which is attempting to register on your site will be redirected to its localhost address - http://127.0.0.1." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:285 +msgid "Registration form honeypot settings" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:296 +msgid "Enable honeypot on registration page" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:299 +msgid "Check this if you want to enable the honeypot feature for the registration page" +msgstr "" + +#: classes/aios-ajax.php:89 +msgid "Invalid IP retrieve method." +msgstr "" + +#: classes/aios-ajax.php:131 +#: wp-security-core.php:258 +msgid "The security check failed; try refreshing the page." +msgstr "" + +#: classes/aios-ajax.php:152 +#: wp-security-core.php:268 +msgid "You are not allowed to run this command." +msgstr "" + +#: classes/aios-ajax.php:173 +#: wp-security-core.php:282 +msgid "Options can only be saved by network admin" +msgstr "" + +#: classes/aios-ajax.php:202 +msgid "The command \"%s\" was not found" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:39 +msgid "Remove WP generator meta tag" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:45 +msgid "Change display name" +msgstr "Changer nom d’affichage" + +#: classes/grade-system/wp-security-feature-item-manager.php:57 +msgid "Registration approval" +msgstr "Approbation d’inscription" + +#: classes/grade-system/wp-security-feature-item-manager.php:61 +msgid "Enable registration honeypot" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:73 +msgid "WordPress files access" +msgstr "Accès aux fichiers WordPress" + +#: classes/grade-system/wp-security-feature-item-manager.php:77 +msgid "IP and user agent blacklisting" +msgstr "IP ou ID d’utilisateur en liste noire" + +#: classes/grade-system/wp-security-feature-item-manager.php:81 +msgid "Enable basic firewall" +msgstr "Activer la protection de base du pare-feu" + +#: classes/grade-system/wp-security-feature-item-manager.php:82 +msgid "Enable pingback vulnerability protection" +msgstr "Activer la protection contre les pingback" + +#: classes/grade-system/wp-security-feature-item-manager.php:83 +msgid "Block accesss to debug log file" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:87 +msgid "Forbid proxy comments" +msgstr "Interdire les commentaires de proxy" + +#: classes/grade-system/wp-security-feature-item-manager.php:88 +msgid "Deny bad queries" +msgstr "Refuser les requêtes douteuses" + +#: classes/grade-system/wp-security-feature-item-manager.php:91 +msgid "5G/6G blacklist" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:97 +msgid "Enable IP blocking for 404 detection" +msgstr "Activer le verrouillage IP pour les événements 404" + +#: classes/grade-system/wp-security-feature-item-manager.php:101 +msgid "Enable rename login page" +msgstr "Activer le renommage de la page de Connexion" + +#: classes/grade-system/wp-security-feature-item-manager.php:106 +msgid "Lost password CAPTCHA" +msgstr "Mot de passe de Captcha perdu" + +#: classes/grade-system/wp-security-feature-item-manager.php:107 +msgid "Custom login CAPTCHA" +msgstr "Captcha de connexion personnalisé" + +#: classes/grade-system/wp-security-feature-item-manager.php:108 +msgid "Woo login CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:109 +msgid "Woo lost password CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:110 +msgid "Woo register CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:112 +msgid "Login IP whitelisting" +msgstr "Connexion IP en liste blanche" + +#: classes/grade-system/wp-security-feature-item-manager.php:114 +msgid "Enable login honeypot" +msgstr "Activer la connexion Honeypot" + +#: classes/grade-system/wp-security-feature-item-manager.php:118 +msgid "Comment CAPTCHA" +msgstr "Captcha de commentaire" + +#: classes/grade-system/wp-security-feature-item-manager.php:119 +msgid "Block spambots" +msgstr "Bloquer les Spambots" + +#: classes/grade-system/wp-security-feature-item-manager.php:121 +msgid "BuddyPress registration CAPTCHA" +msgstr "Captcha d'inscription BuddyPress" + +#: classes/grade-system/wp-security-feature-item-manager.php:123 +msgid "bbPress new topic CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item.php:29 +msgid "Basic" +msgstr "Information" + +#: classes/grade-system/wp-security-feature-item.php:31 +msgid "Intermediate" +msgstr "Intermédiaire" + +#: classes/grade-system/wp-security-feature-item.php:33 +msgid "Advanced" +msgstr "Avancée" + +#: classes/wp-security-captcha.php:47 +#: classes/wp-security-general-init-tasks.php:407 +msgid "Please enter an answer in digits:" +msgstr "Saisissez votre réponse en chiffres" + +#: classes/wp-security-captcha.php:127 +msgid "one" +msgstr "un" + +#: classes/wp-security-captcha.php:128 +msgid "two" +msgstr "deux" + +#: classes/wp-security-captcha.php:129 +msgid "three" +msgstr "trois" + +#: classes/wp-security-captcha.php:130 +msgid "four" +msgstr "quatre" + +#: classes/wp-security-captcha.php:131 +msgid "five" +msgstr "cinq" + +#: classes/wp-security-captcha.php:132 +msgid "six" +msgstr "six" + +#: classes/wp-security-captcha.php:133 +msgid "seven" +msgstr "sept" + +#: classes/wp-security-captcha.php:134 +msgid "eight" +msgstr "huit" + +#: classes/wp-security-captcha.php:135 +msgid "nine" +msgstr "neuf" + +#: classes/wp-security-captcha.php:136 +msgid "ten" +msgstr "dix" + +#: classes/wp-security-captcha.php:137 +msgid "eleven" +msgstr "onze" + +#: classes/wp-security-captcha.php:138 +msgid "twelve" +msgstr "douze" + +#: classes/wp-security-captcha.php:139 +msgid "thirteen" +msgstr "treize" + +#: classes/wp-security-captcha.php:140 +msgid "fourteen" +msgstr "quatorze" + +#: classes/wp-security-captcha.php:141 +msgid "fifteen" +msgstr "quinze" + +#: classes/wp-security-captcha.php:142 +msgid "sixteen" +msgstr "seize" + +#: classes/wp-security-captcha.php:143 +msgid "seventeen" +msgstr "dix-sept" + +#: classes/wp-security-captcha.php:144 +msgid "eighteen" +msgstr "dix-huit" + +#: classes/wp-security-captcha.php:145 +msgid "nineteen" +msgstr "dix-neuf" + +#: classes/wp-security-captcha.php:146 +msgid "twenty" +msgstr "vingt" + +#: classes/wp-security-cronjob-handler.php:34 +msgid "Every 15 minutes" +msgstr "" + +#: classes/wp-security-debug-logger.php:46 +msgid "Unable to get the reason why" +msgstr "" + +#: classes/wp-security-debug-logger.php:47 +msgid "Unable to clear the logs" +msgstr "" + +#: classes/wp-security-file-scan.php:85 +msgid "All In One WP Security - File change detected!" +msgstr "All In One WP Security - Changement détecté dans les fichiers !" + +#: classes/wp-security-file-scan.php:87 +msgid "A file change was detected on your system for site URL" +msgstr "Un changement dans les fichiers a été détecté sur votre système à l’URL" + +#: classes/wp-security-file-scan.php:87 +msgid ". Scan was generated on" +msgstr ". Un balayage a été généré sur" + +#: classes/wp-security-file-scan.php:88 +msgid "A summary of the scan results is shown below:" +msgstr "" + +#: classes/wp-security-file-scan.php:91 +msgid "Login to your site to view the scan details." +msgstr "Connectez-vous à votre site pour voir les détails du balayage." + +#: classes/wp-security-file-scan.php:313 +msgid "The following files were added to your host" +msgstr "Les fichiers suivants ont été ajoutés à votre hôte :" + +#: classes/wp-security-file-scan.php:315 +#: classes/wp-security-file-scan.php:323 +#: classes/wp-security-file-scan.php:332 +msgid "modified on: " +msgstr "" + +#: classes/wp-security-file-scan.php:321 +msgid "The following files were removed from your host" +msgstr "Les fichiers suivants ont été supprimés de votre hôte :" + +#: classes/wp-security-file-scan.php:330 +msgid "The following files were changed on your host" +msgstr "Les fichiers suivants ont été modifiés sur votre hôte :" + +#: classes/wp-security-general-init-tasks.php:212 +#: classes/wp-security-general-init-tasks.php:481 +msgid "Application passwords have been disabled by All In One WP Security & Firewall plugin." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:428 +#: classes/wp-security-general-init-tasks.php:541 +#: classes/wp-security-general-init-tasks.php:574 +#: classes/wp-security-user-login.php:137 +#: classes/wp-security-user-registration.php:74 +msgid "ERROR: Your answer was incorrect - please try again." +msgstr "ERREUR: La réponse à la question est incorrecte –veuillez réessayer" + +#: classes/wp-security-general-init-tasks.php:463 +msgid "Enter something special:" +msgstr "Entrez quelque chose de spécial :" + +#: classes/wp-security-general-init-tasks.php:476 +msgid "Application passwords" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:485 +msgid "Change setting" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:487 +msgid "Site admin can only change this setting." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:516 +msgid "Error: You entered an incorrect CAPTCHA answer. Please go back and try again." +msgstr "Erreur : réponse CAPTCHA incorrecte. Réessayez." + +#: classes/wp-security-general-init-tasks.php:558 +msgid "Your CAPTCHA answer was incorrect - please try again." +msgstr "Réponse Captcha incorrecte - Veuillez réessayer" + +#: classes/wp-security-general-init-tasks.php:567 +msgid "ERROR: Your IP address is currently locked please contact the administrator!" +msgstr "" + +#. translators: %s: Admin Dashboard > WP Security > Brute Force > Login CAPTCHA Tab Link +#: classes/wp-security-general-init-tasks.php:642 +msgid "Your Google reCAPTCHA site key is wrong. Please fill the correct reCAPTCHA keys %s to use the Google reCAPTCHA feature." +msgstr "" + +#. translators: %s: Admin Dashboard > WP Security > Brute Force > Login CAPTCHA Tab Link +#: classes/wp-security-general-init-tasks.php:642 +#: classes/wp-security-notices.php:99 +msgid "here" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +msgid "Would you like All In One WP Security & Firewall to re-insert the security rules in your .htaccess file which were cleared when you deactivated the plugin?" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +#: templates/may-also-like.php:40 +#: templates/may-also-like.php:43 +#: templates/may-also-like.php:54 +#: templates/may-also-like.php:57 +#: templates/may-also-like.php:68 +#: templates/may-also-like.php:71 +#: templates/may-also-like.php:91 +#: templates/may-also-like.php:103 +#: templates/may-also-like.php:115 +#: templates/may-also-like.php:127 +#: templates/may-also-like.php:139 +#: templates/may-also-like.php:151 +#: templates/may-also-like.php:168 +#: templates/may-also-like.php:171 +#: templates/may-also-like.php:183 +#: templates/may-also-like.php:195 +#: templates/may-also-like.php:207 +#: templates/may-also-like.php:219 +#: templates/may-also-like.php:231 +#: templates/may-also-like.php:243 +#: templates/may-also-like.php:252 +#: templates/may-also-like.php:255 +#: templates/may-also-like.php:264 +#: templates/may-also-like.php:267 +#: templates/may-also-like.php:279 +#: templates/may-also-like.php:297 +#: templates/may-also-like.php:309 +#: templates/may-also-like.php:327 +#: templates/may-also-like.php:339 +#: templates/may-also-like.php:351 +#: templates/may-also-like.php:368 +#: templates/may-also-like.php:380 +msgid "Yes" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +#: templates/may-also-like.php:88 +#: templates/may-also-like.php:100 +#: templates/may-also-like.php:112 +#: templates/may-also-like.php:124 +#: templates/may-also-like.php:136 +#: templates/may-also-like.php:148 +#: templates/may-also-like.php:180 +#: templates/may-also-like.php:192 +#: templates/may-also-like.php:204 +#: templates/may-also-like.php:216 +#: templates/may-also-like.php:228 +#: templates/may-also-like.php:240 +#: templates/may-also-like.php:276 +#: templates/may-also-like.php:294 +#: templates/may-also-like.php:306 +#: templates/may-also-like.php:324 +#: templates/may-also-like.php:336 +#: templates/may-also-like.php:348 +#: templates/may-also-like.php:365 +#: templates/may-also-like.php:377 +#: templates/notices/custom-notice.php:27 +msgid "No" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:674 +msgid "Your registration is pending approval." +msgstr "" + +#: classes/wp-security-notices.php:25 +msgid "The All in One Security plugin has disabled the login whitelist setting that you have enabled in the past." +msgstr "" + +#: classes/wp-security-notices.php:29 +msgid "Your website is running on an Apache webserver, the login whitelisting might not be functional until the recent update of AIOS (because it relied upon Apache-specific module features)." +msgstr "" + +#: classes/wp-security-notices.php:31 +msgid "Your website is running on a non-Apache webserver, so the login whitelisting was not functional until the recent update of AIOS (because it relied upon Apache-specific features)." +msgstr "" + +#: classes/wp-security-notices.php:33 +msgid "It began working with AIOS version 5.0.8." +msgstr "" + +#: classes/wp-security-notices.php:33 +msgid "We have disabled it so that your login page will not be blocked unexpectedly." +msgstr "" + +#: classes/wp-security-notices.php:42 +msgid "Would you like to re-enable login whitelisting?" +msgstr "" + +#: classes/wp-security-notices.php:48 +msgid "Removed database backup feature from the All In One WP Security & Firewall plugin" +msgstr "" + +#: classes/wp-security-notices.php:50 +msgid "Beginning with version 5.0.0, AIOS has replaced the AIOS backup method with the superior UpdraftPlus method." +msgstr "" + +#: classes/wp-security-notices.php:51 +msgid "It remains free and is fully supported by the UpdraftPlus team." +msgstr "" + +#: classes/wp-security-notices.php:54 +msgid "You are seeing this notice because you have previously set up automated database backups in AIOS." +msgstr "" + +#: classes/wp-security-notices.php:55 +msgid "Would you like to set up scheduled backups with UpdraftPlus?" +msgstr "" + +#: classes/wp-security-notices.php:61 +msgid "Setup UpdraftPlus backup plugin" +msgstr "" + +#: classes/wp-security-notices.php:67 +msgid "Important: set up your IP address detection settings" +msgstr "" + +#: classes/wp-security-notices.php:69 +msgid "The All in One Security plugin couldn't be certain about the correct method to detect the IP address for your site visitors with your currently-configured IP address detection settings." +msgstr "" + +#: classes/wp-security-notices.php:70 +msgid "It is important for your security to set the IP address detection settings properly." +msgstr "" + +#: classes/wp-security-notices.php:73 +msgid "Please go to the settings and set them now." +msgstr "" + +#: classes/wp-security-notices.php:79 +msgid "Setup IP address detection settings" +msgstr "" + +#: classes/wp-security-notices.php:85 +msgid "Important: Disabled login whitelist setting" +msgstr "" + +#: classes/wp-security-notices.php:91 +msgid "Turn it back on" +msgstr "" + +#: classes/wp-security-notices.php:92 +msgid "Edit the settings" +msgstr "" + +#: classes/wp-security-notices.php:95 +msgid "Keep it off" +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Hey - We noticed All In One WP Security & Firewall has kept your site safe for a while. If you like us, please consider leaving a positive review to spread the word. Or if you have any issues or questions please leave us a support message %s." +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Thank you so much!" +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Team All In One WP Security & Firewall" +msgstr "" + +#: classes/wp-security-notices.php:109 +msgid "Enhance your security even more by backing up your site" +msgstr "" + +#: classes/wp-security-notices.php:110 +msgid "UpdraftPlus is the world's most trusted backup plugin from the owners of All In One WP Security & Firewall" +msgstr "" + +#: classes/wp-security-notices.php:121 +msgid "After you've secured your site, we recommend you install our WP-Optimize plugin to streamline it for better website performance." +msgstr "" + +#: classes/wp-security-process-renamed-login-page.php:152 +msgid "Not available." +msgstr "" + +#: classes/wp-security-two-factor-login.php:34 +msgid "Two factor authentication - Admin settings" +msgstr "" + +#: classes/wp-security-two-factor-login.php:97 +msgid "Two Factor Auth" +msgstr "" + +#: classes/wp-security-two-factor-login.php:153 +msgid "PHP OpenSSL or mcrypt module required" +msgstr "" + +#: classes/wp-security-two-factor-login.php:153 +msgid "The All In One WP Security plugin's Two Factor Authentication module requires either the PHP openssl (preferred) or mcrypt module to be installed. Please ask your web hosting company to install one of them." +msgstr "" + +#: classes/wp-security-user-login.php:71 +msgid "You have disabled login lockout by defining the AIOS_DISABLE_LOGIN_LOCKOUT constant value as true, and the login lockout setting has enabled it." +msgstr "" + +#. translators: 1: Locked IP Addresses admin page link +#: classes/wp-security-user-login.php:73 +msgid "Delete your login lockout IP from %s and define the AIOS_DISABLE_LOGIN_LOCKOUT constant value as false." +msgstr "" + +#: classes/wp-security-user-login.php:100 +msgid "ERROR: Access from your IP address has been blocked for security reasons. Please contact the administrator." +msgstr "" + +#: classes/wp-security-user-login.php:108 +msgid "Service temporarily unavailable" +msgstr "" + +#: classes/wp-security-user-login.php:163 +msgid "ACCOUNT PENDING: Your account is currently not active. An administrator needs to activate your account before you can login." +msgstr "Compte en attente : Votre compte n'est pas actif actuellement. Un administrateur doit l'activer avant que vous ne puissiez vous connecter." + +#: classes/wp-security-user-login.php:242 +msgid "ERROR: Invalid login credentials." +msgstr "ERREUR : Identifiants de connexion invalides." + +#: classes/wp-security-user-login.php:392 +msgid "Site Lockout Notification" +msgstr "Notification de site verrouillé" + +#: classes/wp-security-user-login.php:393 +msgid "User login lockout events had occurred due to too many failed login attempts or invalid username:" +msgstr "" + +#: classes/wp-security-user-login.php:396 +msgid "Username:" +msgstr "" + +#: classes/wp-security-user-login.php:397 +msgid "IP address:" +msgstr "" + +#: classes/wp-security-user-login.php:399 +msgid "IP range:" +msgstr "" + +#: classes/wp-security-user-login.php:404 +msgid "Log into your site WordPress administration panel to see the duration of the lockout or to unlock the user." +msgstr "" + +#: classes/wp-security-user-login.php:515 +msgid "Unlock request notification" +msgstr "Notification de demande de déblocage" + +#: classes/wp-security-user-login.php:516 +msgid "You have requested for the account with email address %s to be unlocked. Please click the link below to unlock your account:" +msgstr "" + +#: classes/wp-security-user-login.php:516 +msgid "Unlock link: %s" +msgstr "" + +#: classes/wp-security-user-login.php:516 +msgid "After clicking the above link you will be able to login to the WordPress administration panel." +msgstr "Après avoir cliqué le lien ci-dessus, vous serez en mesure de vous connecter au panneau d'administration WordPress." + +#: classes/wp-security-user-login.php:739 +msgid "Your session has expired because it has been over %d minutes since your last login." +msgstr "Votre session a expiré (plus de %d minutes depuis votre connexion)." + +#: classes/wp-security-user-login.php:740 +#: classes/wp-security-user-login.php:744 +msgid "Please log back in to continue." +msgstr "Veuillez vous reconnecter pour continuer." + +#: classes/wp-security-user-login.php:743 +msgid "You were logged out because you just changed the \"admin\" username." +msgstr "Vous avez été déconnecté parce que vous venez de modifier le nom d’utilisateur « Admin »." + +#: classes/wp-security-user-login.php:773 +msgid "Request unlock" +msgstr "Recevoir un lien de déblocage." + +#: classes/wp-security-user-registration.php:68 +msgid "ERROR: You are not allowed to register because your IP address is currently locked!" +msgstr "" + +#: classes/wp-security-utility-ip-address.php:217 +#: classes/wp-security-utility-ip-address.php:231 +#: classes/wp-security-utility-ip-address.php:245 +#: classes/wp-security-utility-ip-address.php:257 +#: classes/wp-security-utility-ip-address.php:269 +msgid " is not a valid ip address format." +msgstr "n'est pas un format d'adresse IP valide." + +#: classes/wp-security-utility-ip-address.php:274 +msgid "You cannot ban your own IP address: " +msgstr "vous ne pouvez bannir votre propre adresse IP :" + +#: classes/wp-security-utility.php:254 +msgid "This feature can only be configured by the \"superadmin\" on the main site." +msgstr "ne peut être configuré(e) que par le « super Admin » sur le site principal." + +#: other-includes/wp-security-unlock-request.php:32 +msgid "ERROR: Unable to process your request!" +msgstr "" + +#: other-includes/wp-security-unlock-request.php:45 +msgid "Please enter a valid email address" +msgstr "Veuillez fournir une adresse courriel valide" + +#: other-includes/wp-security-unlock-request.php:57 +msgid "User account not found!" +msgstr "Compte utilisateur introuvable." + +#: other-includes/wp-security-unlock-request.php:71 +msgid "Error: No locked entry was found in the database with your IP address range." +msgstr "Erreur : Aucune entrée verrouillée n’a été trouvé dans la BdD avec votre plage d’IP !" + +#: other-includes/wp-security-unlock-request.php:76 +msgid "An email has been sent to you with the unlock instructions." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:93 +msgid "You are here because you have been locked out due to too many incorrect login attempts." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:94 +msgid "Please enter your email address and you will receive an email with instructions on how to unlock yourself." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:104 +msgid "Email Address" +msgstr "Email" + +#: other-includes/wp-security-unlock-request.php:108 +msgid "Send unlock request" +msgstr "" + +#: templates/admin/incompatible-plugin.php:6 +msgid "Two Factor Authentication" +msgstr "" + +#: templates/admin/incompatible-plugin.php:10 +msgid "Two Factor Authentication currently disabled" +msgstr "" + +#: templates/admin/incompatible-plugin.php:12 +#: templates/admin/incompatible-plugin.php:16 +msgid "Two factor authentication in All In One WP Security is currently disabled because the incompatible plugin %s is active." +msgstr "" + +#: templates/automated-database-backup.php:4 +msgid "Automated scheduled backups" +msgstr "Sauvegardes automatiques planifiées" + +#: templates/automated-database-backup.php:9 +msgid "Automate backup in the UpdraftPlus plugin" +msgstr "" + +#: templates/automated-database-backup.php:19 +msgid "The AIOS 5.0.0 version release has removed the automated backup feature." +msgstr "" + +#: templates/automated-database-backup.php:20 +msgid "The AIOS automated backup had issues that made it less robust than we could be happy with." +msgstr "" + +#: templates/automated-database-backup.php:21 +msgid "Follow this link to automate backups in the superior UpdraftPlus backup plugin." +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:5 +msgid "Each IP address must be on a new line." +msgstr "Chaque adresse IP doit figurer sur une nouvelle ligne." + +#: templates/info/ip-address-ip-range-info.php:6 +msgid "To specify an IPv4 range use a wildcard \"*\" character. Acceptable ways to use wildcards is shown in the examples below:" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:7 +msgid "Example 1: 195.47.89.*" +msgstr "Exemple 1 : 195.47.89.*" + +#: templates/info/ip-address-ip-range-info.php:8 +msgid "Example 2: 195.47.*.*" +msgstr "Exemple 2 : 195.47.*.*" + +#: templates/info/ip-address-ip-range-info.php:9 +msgid "Example 3: 195.*.*.*" +msgstr "Exemple 3 : 195.*.*.*" + +#: templates/info/ip-address-ip-range-info.php:10 +msgid "To specify an IPv6 range use CIDR format as shown in the examples below:" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:11 +msgid "Example 4: 2401:4900:54c3:af15:2:2:5dc0:0/112" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:12 +msgid "Example 5: 2001:db8:1263::/48" +msgstr "" + +#: templates/may-also-like.php:5 +msgid "All-In-One Security (AIOS) Free vs Premium Comparison Chart" +msgstr "" + +#: templates/may-also-like.php:7 +msgid "FAQs" +msgstr "" + +#: templates/may-also-like.php:9 +msgid "Ask a pre-sales question" +msgstr "" + +#: templates/may-also-like.php:17 +msgid "All In One WP Security & Firewall Free" +msgstr "" + +#: templates/may-also-like.php:26 +#: templates/may-also-like.php:386 +msgid "Installed" +msgstr "" + +#: templates/may-also-like.php:29 +#: templates/may-also-like.php:389 +msgid "Upgrade now" +msgstr "" + +#: templates/may-also-like.php:34 +msgid "Login security feature suite" +msgstr "" + +#: templates/may-also-like.php:35 +msgid "Protect against brute-force attacks and keep bots at bay." +msgstr "" + +#: templates/may-also-like.php:35 +msgid "AIOS takes WordPress' default login security features to a whole new level." +msgstr "" + +#: templates/may-also-like.php:37 +msgid "To see all login security features, visit %s" +msgstr "" + +#: templates/may-also-like.php:48 +msgid "Firewall and file protection feature suite" +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Protection from the latest exploits." +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Activate firewall settings ranging from basic, intermediate and advanced." +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Get comprehensive, instant protection with All-in-One Security." +msgstr "" + +#: templates/may-also-like.php:51 +msgid "To see all firewall and file protection features, visit %s" +msgstr "" + +#: templates/may-also-like.php:62 +msgid "Content protection feature suite" +msgstr "" + +#: templates/may-also-like.php:63 +msgid "Eliminate spam and protect your content to dramatically improve your website's interactions with search engines." +msgstr "" + +#: templates/may-also-like.php:65 +msgid "To see all content protection features, visit %s" +msgstr "" + +#: templates/may-also-like.php:76 +msgid "Malware scanning" +msgstr "" + +#: templates/may-also-like.php:77 +msgid "Finding out by accident that your site has been infected with malware is too late." +msgstr "" + +#: templates/may-also-like.php:79 +msgid "Malware can have a dramatic effect on your site's search rankings and you may not even know about it." +msgstr "" + +#: templates/may-also-like.php:79 +msgid "It can slow your website down, access customer data, send unsolicited emails, change your content or prevent users from accessing it." +msgstr "" + +#: templates/may-also-like.php:84 +msgid "Automatic malware scanning" +msgstr "" + +#: templates/may-also-like.php:85 +msgid "Best-in-class scanning for the latest malware, trojans and spyware 24/7." +msgstr "" + +#: templates/may-also-like.php:96 +msgid "Response time monitoring" +msgstr "" + +#: templates/may-also-like.php:97 +msgid "You'll know immediately if your website's response time is negatively affected." +msgstr "" + +#: templates/may-also-like.php:108 +msgid "Up-time monitoring" +msgstr "" + +#: templates/may-also-like.php:109 +msgid "AIOS checks your website's uptime every 5 minutes." +msgstr "" + +#: templates/may-also-like.php:109 +msgid "We'll notify you straight away if your site/server goes down." +msgstr "" + +#: templates/may-also-like.php:120 +msgid "Prevents blacklisting by search engines" +msgstr "" + +#: templates/may-also-like.php:121 +msgid "AIOS monitors your site's blacklist status daily." +msgstr "" + +#: templates/may-also-like.php:121 +msgid "We'll notify you within 24 hours if something's amiss so you can take action, before it's too late." +msgstr "" + +#: templates/may-also-like.php:132 +msgid "Flexible assignment" +msgstr "" + +#: templates/may-also-like.php:133 +msgid "Register and remove websites from the scanning service at any time." +msgstr "" + +#: templates/may-also-like.php:144 +msgid "Malware reports" +msgstr "" + +#: templates/may-also-like.php:145 +msgid "Reports are available via the 'My Account' page and directly via email." +msgstr "" + +#: templates/may-also-like.php:156 +msgid "Flexible two-factor authentication" +msgstr "" + +#: templates/may-also-like.php:157 +msgid "With Two-Factor Authentication (TFA) users enter their username and password and a one-time code sent to a device to login." +msgstr "" + +#: templates/may-also-like.php:159 +msgid "TFA is a feature in both our free and premium packages, but AIOS Premium affords whole new levels of control over how TFA is implemented." +msgstr "" + +#: templates/may-also-like.php:164 +msgid "Authenticator apps" +msgstr "" + +#: templates/may-also-like.php:165 +msgid "Supports TOTP and HOTP protocols." +msgstr "" + +#: templates/may-also-like.php:165 +msgid "TFA Can be used with Google Authenticator, Microsoft Authenticator, Authy and many more." +msgstr "" + +#: templates/may-also-like.php:176 +msgid "Role specific configuration" +msgstr "" + +#: templates/may-also-like.php:177 +msgid "Make it compulsory for certain roles e.g. for admin and editor roles." +msgstr "" + +#: templates/may-also-like.php:188 +msgid "Require TFA after a set time period" +msgstr "" + +#: templates/may-also-like.php:189 +msgid "For example you could require all admins to have TFA once their accounts are a week old." +msgstr "" + +#: templates/may-also-like.php:200 +msgid "Trusted devices - control how often TFA is required" +msgstr "" + +#: templates/may-also-like.php:201 +msgid "Ask for TFA after a chosen number of days for trusted devices instead of on every login." +msgstr "" + +#: templates/may-also-like.php:212 +msgid "Anti-bot protection" +msgstr "" + +#: templates/may-also-like.php:213 +msgid "Option to hide the existence of forms on WooCommerce login pages unless JavaScript is active." +msgstr "" + +#: templates/may-also-like.php:224 +msgid "Customise TFA design layout" +msgstr "" + +#: templates/may-also-like.php:225 +msgid "Customise the design of TFA so it aligns with your existing web design." +msgstr "" + +#: templates/may-also-like.php:236 +msgid "TFA emergency codes" +msgstr "" + +#: templates/may-also-like.php:237 +msgid "Generate a one-time use emergency code to allow access if your device is lost." +msgstr "" + +#: templates/may-also-like.php:248 +msgid "TFA multisite compatibility" +msgstr "" + +#: templates/may-also-like.php:249 +msgid "TFA is Compatible with multisite networks and sub-sites." +msgstr "" + +#: templates/may-also-like.php:260 +msgid "TFA support for common login forms" +msgstr "" + +#: templates/may-also-like.php:261 +msgid "Supports WooCommerce, Affiliates-WP and Theme my Login login forms." +msgstr "" + +#: templates/may-also-like.php:272 +msgid "TFA support for other login forms" +msgstr "" + +#: templates/may-also-like.php:273 +msgid "Supports Elementor Pro, bbPress and all third-party login forms without any further coding needed." +msgstr "" + +#: templates/may-also-like.php:284 +msgid "Smart 404 blocking" +msgstr "" + +#: templates/may-also-like.php:285 +msgid "404 errors can occur when someone legitimately mistypes a URL, but they're also generated by hackers searching for weaknesses in your site." +msgstr "" + +#: templates/may-also-like.php:290 +msgid "Automatically and permanently blocks bots producing 404s" +msgstr "" + +#: templates/may-also-like.php:291 +msgid "AIOS Premium provides more protection than the competition by automatically and permanently blocking IP addresses of bots and hackers based on how many 404 errors they generate." +msgstr "" + +#: templates/may-also-like.php:302 +msgid "404 error charts" +msgstr "" + +#: templates/may-also-like.php:303 +msgid "Handy charts keep you informed of how many 404s have occurred and which IP address or country is producing them." +msgstr "" + +#: templates/may-also-like.php:314 +msgid "Country blocking" +msgstr "" + +#: templates/may-also-like.php:315 +msgid "Most malicious attacks come from a handful of countries and so it's possible to prevent most attacks with our country blocking tool." +msgstr "" + +#: templates/may-also-like.php:320 +msgid "Block traffic based on country of origin" +msgstr "" + +#: templates/may-also-like.php:321 +msgid "AIOS Premium utilises an IP database that promises 99.5% accuracy." +msgstr "" + +#: templates/may-also-like.php:332 +msgid "Block traffic to specific pages based on country of origin" +msgstr "" + +#: templates/may-also-like.php:333 +msgid "Block access to your whole site or on a page-by-page basis." +msgstr "" + +#: templates/may-also-like.php:344 +msgid "Whitelist some users from blocked countries" +msgstr "" + +#: templates/may-also-like.php:345 +msgid "Whitelist IP addresses or IP ranges even if they are part of a blocked country." +msgstr "" + +#: templates/may-also-like.php:356 +msgid "Premium support" +msgstr "" + +#: templates/may-also-like.php:361 +msgid "Unlimited support" +msgstr "" + +#: templates/may-also-like.php:362 +msgid "Personalised, email support from our team of Security experts, as and when you need it." +msgstr "" + +#: templates/may-also-like.php:373 +msgid "Guaranteed response time" +msgstr "" + +#: templates/may-also-like.php:374 +msgid "We offer a guaranteed response time of three days." +msgstr "" + +#: templates/may-also-like.php:374 +msgid "99% of our Premium customers receive a response to their enquiry within 24 hours during the working week." +msgstr "" + +#: templates/may-also-like.php:397 +msgid "Our other plugins" +msgstr "" + +#: templates/may-also-like.php:411 +msgid "UpdraftPlus – the ultimate protection for your site, hard work and business" +msgstr "" + +#: templates/may-also-like.php:412 +msgid "Simplifies backups and restoration." +msgstr "" + +#: templates/may-also-like.php:412 +msgid "It is the world's highest ranking and most popular scheduled backup plugin, with over three million currently-active installs." +msgstr "" + +#: templates/may-also-like.php:413 +#: templates/may-also-like.php:419 +#: templates/may-also-like.php:425 +#: templates/may-also-like.php:431 +msgid "Try for free" +msgstr "" + +#: templates/may-also-like.php:417 +msgid "WP-Optimize – keep your database fast and efficient" +msgstr "" + +#: templates/may-also-like.php:418 +msgid "Makes your site fast and efficient." +msgstr "" + +#: templates/may-also-like.php:418 +msgid "It cleans the database, compresses images and caches pages for ultimate speed." +msgstr "" + +#: templates/may-also-like.php:423 +msgid "UpdraftCentral – save hours managing multiple WP sites from one place" +msgstr "" + +#: templates/may-also-like.php:424 +msgid "Highly efficient way to manage, optimize, update and backup multiple websites from one place." +msgstr "" + +#: templates/may-also-like.php:429 +msgid "Easy Updates Manager" +msgstr "" + +#: templates/may-also-like.php:430 +msgid "Keeps your WordPress site up to date and bug free." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:2 +msgid "IP address detection settings" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:6 +msgid "The IP address detection settings allow you to specify how visitors' IP addresses are made known to PHP (and hence to WordPress and its plugins)." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:7 +msgid "Usually, this is automatic and there is only one choice." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:8 +msgid "However in some setups, such as those using proxies (including load-balancers and security firewalls like Cloudflare), it may be necessary to set this manually." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:9 +msgid "Attention" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:9 +msgid "It is important to set this correctly - otherwise you may make it possible for a hacker to ban all your visitors (e.g. via banning Cloudflare from connecting to you) instead of being banned himself." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:9 +msgid "The default is to use the REMOTE_ADDR PHP server variable. If this variable does not contain the visitor's IP address, then whilst you can make a different selection below, it is better to ask your web hosting company to have it correctly set." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:10 +msgid "This is the most secure setup, because when set correctly it is immune from being spoofed by an attacker." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:16 +msgid "You have no available IP address detection method(s); you must contact your web hosting company." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:22 +#: templates/menus/settings/advanced-settings.php:27 +#: templates/menus/settings/advanced-settings.php:32 +msgid "Your detected IP address according to %s:" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:38 +msgid "If your site is setup on localhost, you won't see your external IP address using your server's IP detection setting; but on a localhost-served site (not available to the outside world), the setting is irrelevant and can be ignored." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:61 +msgid "Choose a $_SERVER variable you would like to detect visitors' IP address using." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:67 +msgid "If your chosen server variable fails the plugin will automatically fall back to retrieving the IP address from $_SERVER[\"REMOTE_ADDR\"]" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:73 +msgid "Your IP address if using this setting:" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:75 +msgid "fetching..." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:81 +#: templates/menus/settings/advanced-settings.php:190 +msgid "getting..." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:89 +msgid "look-up possibly blocked by an ad-blocker or similar tool" +msgstr "" + +#: templates/notices/cookie-based-brute-force-prevention-disabled.php:4 +msgid "Cookie based brute force login prevention currently disabled" +msgstr "" + +#: templates/notices/cookie-based-brute-force-prevention-disabled.php:6 +msgid "Cookie based brute force login prevention is currently disabled via the AIOS_DISABLE_COOKIE_BRUTE_FORCE_PREVENTION constant (which is mostly likely to be defined in your wp-config.php)" +msgstr "" + +#: templates/notices/disable-login-whitelist.php:4 +msgid "Login whitelisting currently disabled" +msgstr "" + +#: templates/notices/disable-login-whitelist.php:6 +msgid "Login whitelisting is currently disabled via the AIOS_DISABLE_LOGIN_WHITELIST constant (which is mostly likely to be defined in your wp-config.php)" +msgstr "" + +#: templates/notices/horizontal-notice.php:8 +#: templates/notices/horizontal-notice.php:40 +msgid "notice image" +msgstr "" + +#: templates/notices/horizontal-notice.php:18 +msgid "Ok, you deserve it" +msgstr "" + +#: templates/notices/horizontal-notice.php:22 +msgid "Maybe later" +msgstr "" + +#: templates/notices/horizontal-notice.php:26 +msgid "Never" +msgstr "" + +#: templates/notices/horizontal-notice.php:66 +msgid "Get UpdraftCentral" +msgstr "" + +#: templates/notices/horizontal-notice.php:68 +msgid "Get UpdraftPlus" +msgstr "" + +#: templates/notices/horizontal-notice.php:70 +msgid "Get WP-Optimize" +msgstr "" + +#: templates/notices/horizontal-notice.php:72 +msgid "Find out more." +msgstr "" + +#: templates/notices/horizontal-notice.php:74 +msgid "Sign up" +msgstr "" + +#: templates/notices/horizontal-notice.php:76 +msgid "Go there" +msgstr "" + +#: templates/notices/horizontal-notice.php:78 +msgid "Read more" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:4 +msgid "Dismiss (for %s months)" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:6 +msgid "Thank you for installing All In One WP Security & Firewall!" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:13 +msgid "Super-charge and secure your WordPress site even more with our other top plugins:" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:17 +msgid "%s makes your site fast and efficient. It cleans the database, compresses images and caches pages for ultimate speed." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:21 +msgid "%s simplifies backups and restoration. It is the world's highest ranking and most popular scheduled backup plugin, with over three million currently-active installs." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:25 +msgid "%s is a highly efficient way to manage, optimize, update and backup multiple websites from one place." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:29 +msgid "%s is a WordPress subscription extension for WooCommerce store owners." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:33 +msgid "More quality plugins" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:33 +msgid "Premium WooCommerce plugins" +msgstr "" + +#: templates/partials/non-apache-feature-notice.php:9 +msgid "This feature works only on the Apache server." +msgstr "" + +#: templates/partials/non-apache-feature-notice.php:10 +msgid "You are using the non-apache server %s, so this feature won't work on your site." +msgstr "" + +#: wp-security-core.php:236 +#: wp-security.php:45 +msgid "This plugin requires PHP version %s." +msgstr "" + +#: wp-security-core.php:237 +msgid "Current site PHP version is %s." +msgstr "" + +#: wp-security-core.php:238 +#: wp-security.php:47 +msgid "You will need to ask your web hosting company to upgrade." +msgstr "" + +#: wp-security-core.php:397 +msgid "Error:" +msgstr "" + +#: wp-security-core.php:397 +msgid "template not found" +msgstr "" + +#: wp-security.php:44 +msgid "All In One WP Security and Firewall plugin has been deactivated." +msgstr "" + +#: wp-security.php:46 +msgid "Your current PHP version is %s." +msgstr "" diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-hu_HU.mo b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-hu_HU.mo new file mode 100755 index 00000000..3114647c Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-hu_HU.mo differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-hu_HU.po b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-hu_HU.po new file mode 100755 index 00000000..96a9555f --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-hu_HU.po @@ -0,0 +1,5991 @@ +msgid "" +msgstr "" +"Project-Id-Version: AIOWPS\n" +"POT-Creation-Date: 2013-12-03 12:53+1000\n" +"PO-Revision-Date: 2014-04-17 20:34+0100\n" +"Last-Translator: I♥WP \n" +"Language-Team: \n" +"Language: hu_HU\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.6.4\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-KeywordsList: __;_e\n" +"X-Poedit-SearchPath-0: .\n" + +#. Plugin Name of the plugin +msgid "All In One WP Security" +msgstr "" + +#. Plugin URI of the plugin +msgid "https://wordpress.org/plugins/all-in-one-wp-security-and-firewall/" +msgstr "" + +#. Description of the plugin +msgid "All round best WordPress security plugin!" +msgstr "" + +#. Author of the plugin +msgid "All In One WP Security & Firewall Team" +msgstr "" + +#. Author URI of the plugin +msgid "https://teamupdraft.com/" +msgstr "" + +#: admin/general/wp-security-list-table.php:483 +msgid "Are you sure you want to perform this bulk action?" +msgstr "" + +#: admin/wp-security-admin-init.php:259 +msgid "Unexpected response:" +msgstr "" + +#: admin/wp-security-admin-init.php:290 +msgid "Enjoyed %1$s? Please leave us a %2$s rating. We really appreciate your support!" +msgstr "" + +#: admin/wp-security-admin-init.php:414 +#: classes/wp-security-two-factor-login.php:95 +msgid "WP Security" +msgstr "" + +#: admin/wp-security-admin-init.php:415 +#: admin/wp-security-dashboard-menu.php:26 +#: admin/wp-security-dashboard-menu.php:76 +msgid "Dashboard" +msgstr "" + +#: admin/wp-security-admin-init.php:416 +#: admin/wp-security-settings-menu.php:95 +msgid "Settings" +msgstr "" + +#: admin/wp-security-admin-init.php:417 +msgid "User Accounts" +msgstr "" + +#: admin/wp-security-admin-init.php:418 +msgid "User Login" +msgstr "" + +#: admin/wp-security-admin-init.php:419 +msgid "User Registration" +msgstr "" + +#: admin/wp-security-admin-init.php:420 +msgid "Database Security" +msgstr "" + +#: admin/wp-security-admin-init.php:424 +msgid "Filesystem Security" +msgstr "" + +#: admin/wp-security-admin-init.php:429 +msgid "Blacklist Manager" +msgstr "" + +#: admin/wp-security-admin-init.php:434 +#: admin/wp-security-firewall-menu.php:60 +msgid "Firewall" +msgstr "" + +#: admin/wp-security-admin-init.php:436 +msgid "Brute Force" +msgstr "" + +#: admin/wp-security-admin-init.php:437 +msgid "Spam Prevention" +msgstr "" + +#: admin/wp-security-admin-init.php:441 +#: admin/wp-security-filescan-menu.php:53 +msgid "Scanner" +msgstr "" + +#: admin/wp-security-admin-init.php:443 +#: admin/wp-security-maintenance-menu.php:51 +msgid "Maintenance" +msgstr "" + +#: admin/wp-security-admin-init.php:444 +#: admin/wp-security-misc-options-menu.php:57 +msgid "Miscellaneous" +msgstr "" + +#: admin/wp-security-admin-init.php:445 +#: admin/wp-security-tools-menu.php:64 +msgid "Tools" +msgstr "" + +#: admin/wp-security-admin-init.php:457 +msgid "Premium Upgrade" +msgstr "" + +#: admin/wp-security-admin-menu.php:67 +msgid "Settings successfully updated." +msgstr "" + +#: admin/wp-security-admin-menu.php:77 +msgid "Successfully deleted the selected record(s)." +msgstr "" + +#: admin/wp-security-admin-menu.php:86 +msgid "Failed to delete the selected record(s)." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:25 +msgid "Ban users" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:51 +msgid "Blacklist manager" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:132 +#: admin/wp-security-firewall-menu.php:1233 +#: admin/wp-security-list-404.php:234 +#: admin/wp-security-list-comment-spammer-ip.php:205 +msgid "The plugin was unable to write to the .htaccess file. Please edit file manually." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:139 +msgid "Ban IPs or user agents" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:142 +msgid "The All In One WP Security Blacklist feature gives you the option of banning certain host IP addresses or ranges and also user agents." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:143 +msgid "This feature will deny total site access for users which have IP addresses or user agents matching those which you have configured in the settings below." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:144 +msgid "The plugin achieves this by making appropriate modifications to your .htaccess file." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:145 +msgid "By blocking people, you are using the most secure first line of defence, which denies all access to blacklisted visitors as soon as they hit your hosting server." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:154 +#: admin/wp-security-firewall-menu.php:1055 +#: templates/may-also-like.php:20 +msgid "All In One WP Security & Firewall Premium" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:155 +#: admin/wp-security-firewall-menu.php:1056 +msgid "You may also be interested in %s." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "This plugin adds a number of extra features including %s and %s." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "smart 404 blocking" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "country IP blocking" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:170 +msgid "IP hosts and user agent blacklist settings" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:182 +#: admin/wp-security-brute-force-menu.php:193 +#: admin/wp-security-brute-force-menu.php:331 +msgid "must read this message" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:183 +#: admin/wp-security-brute-force-menu.php:194 +msgid "This feature can lock you out of admin if it doesn't work correctly on your site. You %s before activating this feature." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:189 +msgid "Enable IP or user agent blacklisting" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:192 +msgid "Check this if you want to enable the banning (or blacklisting) of selected IP addresses and/or user agents specified in the settings below" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:196 +msgid "Enter IP addresses:" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:200 +msgid "Enter one or more IP addresses or IP ranges." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:205 +msgid "Enter user agents:" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:210 +msgid "Enter one or more user agent strings." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:211 +#: admin/wp-security-brute-force-menu.php:374 +#: admin/wp-security-brute-force-menu.php:408 +#: admin/wp-security-brute-force-menu.php:431 +#: admin/wp-security-brute-force-menu.php:452 +#: admin/wp-security-filescan-menu.php:309 +#: admin/wp-security-filescan-menu.php:326 +#: admin/wp-security-firewall-menu.php:175 +#: admin/wp-security-firewall-menu.php:212 +#: admin/wp-security-firewall-menu.php:232 +#: admin/wp-security-firewall-menu.php:258 +#: admin/wp-security-firewall-menu.php:385 +#: admin/wp-security-firewall-menu.php:415 +#: admin/wp-security-firewall-menu.php:446 +#: admin/wp-security-firewall-menu.php:474 +#: admin/wp-security-firewall-menu.php:503 +#: admin/wp-security-firewall-menu.php:681 +#: admin/wp-security-firewall-menu.php:699 +#: admin/wp-security-firewall-menu.php:737 +#: admin/wp-security-firewall-menu.php:868 +#: admin/wp-security-firewall-menu.php:1087 +#: admin/wp-security-firewall-menu.php:1110 +#: admin/wp-security-spam-menu.php:186 +#: admin/wp-security-spam-menu.php:221 +#: admin/wp-security-spam-menu.php:390 +#: admin/wp-security-spam-menu.php:430 +#: admin/wp-security-user-login-menu.php:362 +#: templates/info/ip-address-ip-range-info.php:2 +#: templates/menus/settings/advanced-settings.php:63 +msgid "More info" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:214 +msgid "Each user agent string must be on a new line." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:215 +msgid "Example 1 - A single user agent string to block:" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:217 +msgid "Example 2 - A list of more than 1 user agent strings to block" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:225 +#: admin/wp-security-brute-force-menu.php:213 +#: admin/wp-security-brute-force-menu.php:686 +#: admin/wp-security-brute-force-menu.php:806 +#: admin/wp-security-brute-force-menu.php:868 +#: admin/wp-security-filescan-menu.php:351 +#: admin/wp-security-filesystem-menu.php:242 +#: admin/wp-security-firewall-menu.php:945 +#: admin/wp-security-firewall-menu.php:1129 +#: admin/wp-security-misc-options-menu.php:167 +#: admin/wp-security-misc-options-menu.php:218 +#: admin/wp-security-misc-options-menu.php:278 +#: admin/wp-security-settings-menu.php:619 +#: admin/wp-security-settings-menu.php:680 +#: admin/wp-security-spam-menu.php:233 +#: admin/wp-security-spam-menu.php:407 +#: admin/wp-security-spam-menu.php:526 +#: admin/wp-security-spam-menu.php:588 +#: admin/wp-security-user-login-menu.php:384 +#: admin/wp-security-user-login-menu.php:422 +#: admin/wp-security-user-login-menu.php:601 +#: admin/wp-security-user-login-menu.php:788 +#: admin/wp-security-user-registration-menu.php:150 +#: admin/wp-security-user-registration-menu.php:242 +#: admin/wp-security-user-registration-menu.php:305 +#: templates/menus/settings/advanced-settings.php:217 +msgid "Save settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:33 +#: admin/wp-security-brute-force-menu.php:759 +#: admin/wp-security-dashboard-menu.php:651 +msgid "Rename login page" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:34 +#: admin/wp-security-brute-force-menu.php:154 +msgid "Cookie based brute force prevention" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:35 +#: classes/grade-system/wp-security-feature-item-manager.php:105 +msgid "Login CAPTCHA" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:36 +#: admin/wp-security-brute-force-menu.php:746 +msgid "Login whitelist" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:37 +msgid "Honeypot" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:67 +msgid "Brute force" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:105 +msgid "Please enter a value for your login page slug." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:109 +msgid "You cannot use the value \"wp-admin\" for your login page slug." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:111 +msgid "You must use alpha numeric characters for your login page slug." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:116 +#: admin/wp-security-filescan-menu.php:174 +#: admin/wp-security-firewall-menu.php:151 +#: admin/wp-security-firewall-menu.php:1011 +#: admin/wp-security-spam-menu.php:101 +#: admin/wp-security-spam-menu.php:270 +#: admin/wp-security-spam-menu.php:302 +#: admin/wp-security-user-login-menu.php:184 +#: admin/wp-security-user-login-menu.php:553 +#: templates/partials/non-apache-feature-notice.php:9 +msgid "Attention:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:133 +msgid "Could not delete the Cookie-based directives from the .htaccess file. Please check the file permissions." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:155 +msgid "Login page white list" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:156 +msgid "An effective Brute Force prevention technique is to change the default WordPress login page URL." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:157 +msgid "Normally if you wanted to login to WordPress you would type your site's home URL followed by wp-login.php." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:158 +msgid "This feature allows you to change the login URL by setting your own slug and renaming the last portion of the login URL which contains the wp-login.php to any string that you like." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:159 +msgid "By doing this, malicious bots and hackers will not be able to access your login page because they will not know the correct login page URL." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:161 +msgid "You may also be interested in the following alternative brute force prevention features:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:172 +msgid "Your WordPress login page URL has been renamed." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:173 +msgid "Your current login URL is:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:181 +msgid "Rename login page settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:195 +msgid "NOTE: If you are hosting your site on WPEngine or a provider which performs server caching, you will need to ask the host support people to NOT cache your renamed login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:200 +msgid "Enable rename login page feature" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:203 +msgid "Check this if you want to enable the rename login page feature" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:207 +msgid "Login page URL" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:209 +msgid "Enter a string which will represent your secure login page slug. You are encouraged to choose something which is hard to guess and only you will remember." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:243 +msgid "Settings have not been saved - your secret word must consist only of alphanumeric characters, ie, letters and/or numbers only." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:257 +msgid "You have successfully enabled the cookie based brute force prevention feature" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:258 +msgid "From now on you will need to log into your WP Admin using the following URL:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:260 +msgid "It is important that you save this URL value somewhere in case you forget it, OR," +msgstr "" + +#: admin/wp-security-brute-force-menu.php:261 +msgid "simply remember to add a \"?%s=1\" to your current site URL address." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:265 +msgid "You have successfully saved cookie based brute force prevention feature settings." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:295 +msgid "Brute force prevention firewall settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:300 +msgid "A Brute Force Attack is when a hacker tries many combinations of usernames and passwords until they succeed in guessing the right combination." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:301 +msgid "Due to the fact that at any one time there may be many concurrent login attempts occurring on your site via malicious automated robots, this also has a negative impact on your server's memory and performance." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:302 +msgid "The features in this tab will stop the majority of brute force login attacks thus providing even better protection for your WP login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:307 +#: admin/wp-security-firewall-menu.php:654 +msgid "backup" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:308 +msgid "video tutorial" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:309 +msgid "To learn more about how to use this feature, please watch the following %s." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:310 +#: admin/wp-security-brute-force-menu.php:758 +msgid "Cookie-Based Brute Force Login Prevention" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:320 +#: admin/wp-security-user-login-menu.php:253 +msgid "Cookie based brute force login prevention" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:331 +msgid "This feature can lock you out of admin if it doesn't work correctly on your site. You " +msgstr "" + +#: admin/wp-security-brute-force-menu.php:342 +msgid "The cookie test was successful. You can now enable this feature." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:350 +msgid "The cookie test failed on this server. Consequently, this feature cannot be used on this site." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:357 +msgid "Before using this feature, you must perform a cookie test first." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:359 +msgid "This ensures that your browser cookie is working correctly and that you won't lock yourself out." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:364 +msgid "Perform cookie test" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:370 +#: classes/grade-system/wp-security-feature-item-manager.php:103 +msgid "Enable brute force attack prevention" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:373 +msgid "Check this if you want to protect your login page from Brute Force Attack." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:378 +msgid "This feature will deny access to your WordPress login page for all people except those who have a special cookie in their browser." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:380 +msgid "To use this feature do the following:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:382 +msgid "1) Enable the checkbox." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:384 +msgid "2) Enter a secret word consisting of alphanumeric characters which will be difficult to guess. This secret word will be useful whenever you need to know the special URL which you will use to access the login page (see point below)." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:386 +msgid "3) You will then be provided with a special login URL. You will need to use this URL to login to your WordPress site instead of the usual login URL. NOTE: The system will deposit a special cookie in your browser which will allow you access to the WordPress administration login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:388 +msgid "Any person trying to access your login page who does not have the special cookie in their browser will be automatically blocked." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:395 +msgid "Secret word" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:397 +msgid "Choose a secret word consisting of alphanumeric characters which you can use to access your special URL. Your are highly encouraged to choose a word which will be difficult to guess." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:401 +msgid "Re-direct URL" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:405 +msgid "Specify a URL to redirect a hacker to when they try to access your WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:412 +msgid "The URL specified here can be any site's URL and does not have to be your own. For example you can be as creative as you like and send hackers to the CIA or NSA home page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:414 +msgid "This field will default to: http://127.0.0.1 if you do not enter a value." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:416 +msgid "Useful Tip:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:418 +msgid "It's a good idea to not redirect attempted brute force login attempts to your site because it increases the load on your server." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:420 +msgid "Redirecting a hacker or malicious bot back to \"http://127.0.0.1\" is ideal because it deflects them back to their own local host and puts the load on their server instead of yours." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:427 +msgid "My site has posts or pages which are password protected" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:430 +msgid "Check this if you are using the native WordPress password protection feature for some or all of your blog posts or pages." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:435 +msgid "In the cases where you are protecting some of your posts or pages using the in-built WordPress password protection feature, a few extra lines of directives and exceptions need to be added so that people trying to access pages are not automatically blocked." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:437 +msgid "By enabling this checkbox, the plugin will add the necessary rules and exceptions so that people trying to access these pages are not automatically blocked." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:439 +msgid "Helpful Tip:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:441 +msgid "If you do not use the WordPress password protection feature for your posts or pages then it is highly recommended that you leave this checkbox disabled." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:448 +msgid "My site has a theme or plugins which use AJAX" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:451 +msgid "Check this if your site uses AJAX functionality." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:456 +msgid "In the cases where your WordPress installation has a theme or plugin that uses AJAX, a few extra lines of directives and exceptions need to be added to prevent AJAX requests from being automatically blocked by the brute force prevention feature." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:458 +msgid "By enabling this checkbox, the plugin will add the necessary rules and exceptions so that AJAX operations will work as expected." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:467 +msgid "Save feature settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:525 +msgid "This feature allows you to add a CAPTCHA form on various WordPress login pages and forms." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:526 +msgid "Adding a CAPTCHA form on a login page or form is another effective yet simple \"Brute Force\" prevention technique." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:527 +msgid "You have the option of using either %s or a plain maths CAPTCHA form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:528 +msgid "If you enable Google reCAPTCHA the reCAPTCHA widget will be displayed for all forms the CAPTCHA settings below." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:529 +msgid "If Google reCAPTCHA is disabled the simple maths CAPTCHA form will apply and users will need to enter the answer to a simple mathematical question." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:535 +msgid "Google reCAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:540 +msgid "By enabling these settings the Google reCAPTCHA v2 widget will be applied by default for all forms with CAPTCHA enabled." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:549 +msgid "reCAPTCHA will not work because you have disabled login lockout by activating the AIOS_DISABLE_LOGIN_LOCKOUT constant value in a configuration file." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:550 +msgid "To enable it, define AIOS_DISABLE_LOGIN_LOCKOUT constant value as false, or remove it." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:558 +msgid "Use Google reCAPTCHA as default" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:561 +msgid "Check this if you want to default to Google reCAPTCHA for all settings below. (If this is left unchecked, all CAPTCHA forms will revert to the plain maths CAPTCHA)" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:565 +msgid "Site key" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:571 +msgid "Secret key" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:580 +msgid "Login form CAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:589 +msgid "Enable CAPTCHA on login page" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:592 +msgid "Check this if you want to insert a CAPTCHA form on the login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:598 +msgid "Lost password form CAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:608 +msgid "Enable CAPTCHA on lost password page" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:611 +msgid "Check this if you want to insert a CAPTCHA form on the lost password page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:617 +msgid "Custom login form CAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:626 +msgid "Enable CAPTCHA on custom login form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:629 +msgid "Check this if you want to insert CAPTCHA on a custom login form generated by the following WP function: wp_login_form()" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:639 +msgid "WooCommerce forms CAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:648 +msgid "Enable CAPTCHA on WooCommerce login form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:651 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce login form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:661 +msgid "Enable CAPTCHA on WooCommerce lost password form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:664 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce lost password form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:674 +msgid "Enable CAPTCHA on WooCommerce registration form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:677 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce registration form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:749 +msgid "The All In One WP Security Whitelist feature gives you the option of only allowing certain IP addresses or ranges to have access to your WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:750 +msgid "This feature will deny login access for all IP addresses which are not in your whitelist as configured in the settings below." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:751 +msgid "The plugin achieves this by writing the appropriate directives to your .htaccess file." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:752 +msgid "By allowing/blocking IP addresses, you are using the most secure first line of defence because login access will only be granted to whitelisted IP addresses and other addresses will be blocked as soon as they try to access your login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:760 +msgid "Attention: If in addition to enabling the white list feature, you also have one of the %s or %s features enabled, you will still need to use your secret word or special slug in the URL when trying to access your WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:761 +msgid "These features are NOT functionally related. Having both of them enabled on your site means you are creating 2 layers of security." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:772 +msgid "Login IP whitelist settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:783 +msgid "Enable IP whitelisting" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:786 +#: admin/wp-security-user-login-menu.php:408 +msgid "Check this if you want to enable the whitelisting of selected IP addresses specified in the settings below" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:790 +msgid "Your current IP address" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:793 +msgid "You can copy and paste this address in the text box below if you want to include it in your login whitelist." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:797 +#: admin/wp-security-user-login-menu.php:412 +msgid "Enter whitelisted IP addresses:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:801 +#: admin/wp-security-user-login-menu.php:416 +msgid "Enter one or more IP addresses or IP ranges you wish to include in your whitelist." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:801 +msgid "Only the addresses specified here will have access to the WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:839 +msgid "This feature allows you to add a special hidden \"honeypot\" field on the WordPress login page. This will only be visible to robots and not humans." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:840 +msgid "Since robots usually fill in every input field from a login form, they will also submit a value for the special hidden honeypot field." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:841 +#: admin/wp-security-user-registration-menu.php:278 +msgid "The way honeypots work is that a hidden field is placed somewhere inside a form which only robots will submit. If that field contains a value when the form is submitted then a robot has most likely submitted the form and it is consequently dealt with." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:842 +msgid "Therefore, if the plugin detects that this field has a value when the login form is submitted, then the robot which is attempting to login to your site will be redirected to its localhost address - http://127.0.0.1." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:848 +msgid "Login form honeypot settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:859 +msgid "Enable honeypot on login page" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:862 +msgid "Check this if you want to enable the honeypot feature for the login page" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:27 +#: admin/wp-security-dashboard-menu.php:374 +#: classes/wp-security-user-login.php:74 +msgid "Locked IP addresses" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:28 +msgid "Permanent block list" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:29 +msgid "Logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:33 +msgid "Premium upgrade" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:131 +#: admin/wp-security-dashboard-menu.php:518 +#: admin/wp-security-user-login-menu.php:53 +#: classes/grade-system/wp-security-feature-item-manager.php:49 +msgid "Login lockout" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:132 +msgid "This tab displays the list of all IP addresses which are currently temporarily locked out due to the login lockout feature:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:138 +msgid "Currently locked out IP addresses and ranges" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:183 +msgid "This tab displays the list of all permanently blocked IP addresses." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:184 +#: admin/wp-security-spam-menu.php:339 +msgid "NOTE: This feature does NOT use the .htaccess file to permanently block the IP addresses so it should be compatible with all web servers running WordPress." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:189 +msgid "Permanently blocked IP addresses" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:200 +#: admin/wp-security-firewall-menu.php:1151 +#: admin/wp-security-user-login-menu.php:485 +#: admin/wp-security-user-login-menu.php:643 +#: admin/wp-security-user-registration-menu.php:164 +msgid "Search" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:238 +#: admin/wp-security-dashboard-menu.php:249 +#: admin/wp-security-dashboard-menu.php:260 +msgid "All In One WP Security & Firewall" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:250 +msgid "Debug logs have been cleared." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:261 +msgid "Unable to clear the logs; an invalid nonce was provided" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:274 +msgid "Debug log options" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:281 +msgid "Clear logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:289 +msgid "Debug logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:362 +msgid "Security strength meter" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:363 +msgid "Security points breakdown" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:364 +msgid "Spread the word" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:365 +msgid "Get to know the developers" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:366 +msgid "Critical feature status" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:367 +msgid "Last 5 logins" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:368 +msgid "Maintenance mode status" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:373 +#: admin/wp-security-dashboard-menu.php:664 +#: admin/wp-security-user-login-menu.php:57 +msgid "Logged in users" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:417 +msgid "Total Achievable Points: " +msgstr "" + +#: admin/wp-security-dashboard-menu.php:419 +msgid "Current Score of Your Site: " +msgstr "" + +#: admin/wp-security-dashboard-menu.php:472 +msgid "We are working hard to make your WordPress site more secure. Please support us, here is how:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:473 +msgid "Follow us on" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:477 +msgid "Post to Twitter" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:481 +msgid "Give us a good rating" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:488 +msgid "Wanna know more about the developers behind this plugin?" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:499 +msgid "Below is the current status of the critical features that you should activate on your site to achieve a minimum level of recommended security" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:503 +msgid "Admin username" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:533 +msgid "File permission" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:548 +msgid "Basic firewall" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:577 +msgid "No data found." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:581 +msgid "Last 5 logins summary:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:585 +msgid "User" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:586 +#: admin/wp-security-list-404.php:95 +#: admin/wp-security-list-login-fails.php:56 +#: admin/wp-security-list-permanent-blocked-ip.php:68 +msgid "Date" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:587 +msgid "IP" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:608 +msgid "Maintenance mode is currently enabled. Remember to turn it off when you are done" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:610 +msgid "Maintenance mode is currently off." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:614 +msgid "Maintenance mode" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:632 +msgid "Cookie based brute force" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:636 +#: admin/wp-security-dashboard-menu.php:654 +msgid "The %s feature is currently active." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:637 +#: admin/wp-security-dashboard-menu.php:655 +msgid "Your new WordPress login URL is now:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:666 +msgid "Number of users currently logged into your site (including you) is:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:667 +msgid "There are no other users currently logged in." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:680 +msgid "Number of users currently logged in site-wide (including you) is:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:681 +msgid "There are no other site-wide users currently logged in." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:694 +#: admin/wp-security-dashboard-menu.php:711 +msgid "Go to the %s menu to see more details" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:707 +msgid "There are no IP addresses currently locked out." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:710 +msgid "Number of temporarily locked out IP addresses: " +msgstr "" + +#: admin/wp-security-database-menu.php:52 +msgid "UpdraftPlus is installed but currently not active." +msgstr "" + +#: admin/wp-security-database-menu.php:52 +msgid "Follow this link to activate UpdraftPlus, to take a backup." +msgstr "" + +#: admin/wp-security-database-menu.php:57 +msgid "Follow this link to install UpdraftPlus, to take a database backup." +msgstr "" + +#: admin/wp-security-database-menu.php:87 +#: admin/wp-security-database-menu.php:92 +msgid "Database backup" +msgstr "" + +#: admin/wp-security-database-menu.php:91 +#: classes/grade-system/wp-security-feature-item-manager.php:65 +msgid "Database prefix" +msgstr "" + +#: admin/wp-security-database-menu.php:119 +msgid "Database security" +msgstr "" + +#: admin/wp-security-database-menu.php:147 +msgid "Nonce check failed for DB prefix change operation!" +msgstr "" + +#: admin/wp-security-database-menu.php:155 +msgid "The plugin has detected that it cannot write to the wp-config.php file. This feature can only be used if the plugin can successfully write to the wp-config.php file." +msgstr "" + +#: admin/wp-security-database-menu.php:168 +msgid "Please enter a value for the DB prefix." +msgstr "" + +#: admin/wp-security-database-menu.php:177 +msgid "ERROR: The table prefix can only contain numbers, letters, and underscores." +msgstr "" + +#: admin/wp-security-database-menu.php:186 +#: admin/wp-security-database-menu.php:245 +msgid "Change database prefix" +msgstr "" + +#: admin/wp-security-database-menu.php:189 +msgid "Your WordPress database is the most important asset of your website because it contains a lot of your site's precious information." +msgstr "" + +#: admin/wp-security-database-menu.php:190 +msgid "The database is also a target for hackers via methods such as SQL injections and malicious and automated code which targets certain tables." +msgstr "" + +#: admin/wp-security-database-menu.php:191 +msgid "One way to add a layer of protection for your DB is to change the default WordPress table prefix from \"wp_\" to something else which will be difficult for hackers to guess." +msgstr "" + +#: admin/wp-security-database-menu.php:192 +msgid "This feature allows you to easily change the prefix to a value of your choice or to a random value set by this plugin." +msgstr "" + +#: admin/wp-security-database-menu.php:198 +msgid "Database prefix options" +msgstr "" + +#: admin/wp-security-database-menu.php:210 +msgid "database backup" +msgstr "" + +#: admin/wp-security-database-menu.php:211 +msgid "It is recommended that you perform a %s before using this feature" +msgstr "" + +#: admin/wp-security-database-menu.php:221 +msgid "Current database table prefix" +msgstr "" + +#: admin/wp-security-database-menu.php:227 +msgid "Your site is currently using the default WordPress database prefix value of \"wp_\"." +msgstr "" + +#: admin/wp-security-database-menu.php:227 +msgid "To increase your site's security you should consider changing the database prefix value to another value." +msgstr "" + +#: admin/wp-security-database-menu.php:234 +msgid "Generate new database table prefix" +msgstr "" + +#: admin/wp-security-database-menu.php:238 +msgid "Check this if you want the plugin to generate a random 6 character string for the table prefix" +msgstr "" + +#: admin/wp-security-database-menu.php:239 +msgid "OR" +msgstr "" + +#: admin/wp-security-database-menu.php:241 +msgid "Choose your own database prefix by specifying a string which contains letters and/or numbers and/or underscores. Example: xyz_" +msgstr "" + +#: admin/wp-security-database-menu.php:265 +msgid "Take a database backup using UpdraftPlus" +msgstr "" + +#: admin/wp-security-database-menu.php:270 +msgid "Manual backup" +msgstr "" + +#: admin/wp-security-database-menu.php:274 +msgid "UpdraftPlus Backup/Restore" +msgstr "" + +#: admin/wp-security-database-menu.php:274 +msgid "Your backups are on the UpdraftPlus Backup/Restore admin page." +msgstr "" + +#: admin/wp-security-database-menu.php:276 +msgid "Create database backup now" +msgstr "" + +#: admin/wp-security-database-menu.php:308 +msgid "Error - Could not get tables or no tables found!" +msgstr "" + +#: admin/wp-security-database-menu.php:312 +msgid "Starting DB prefix change operations....." +msgstr "" + +#: admin/wp-security-database-menu.php:314 +msgid "Your WordPress system has a total of %s tables and your new DB prefix will be: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:320 +#: classes/wp-security-utility.php:306 +msgid "Failed to make a backup of the wp-config.php file. This operation will not go ahead." +msgstr "" + +#: admin/wp-security-database-menu.php:324 +msgid "A backup copy of your wp-config.php file was created successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:351 +msgid "%s table name update failed" +msgstr "" + +#: admin/wp-security-database-menu.php:363 +msgid "Please change the prefix manually for the above tables to: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:366 +msgid "%s tables had their prefix updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:387 +msgid "wp-config.php file was updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:390 +msgid "The \"wp-config.php\" file was not able to be modified." +msgstr "" + +#: admin/wp-security-database-menu.php:390 +msgid "Please modify this file manually using your favourite editor and search for variable \"$table_prefix\" and assign the following value to that variable: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:401 +#: admin/wp-security-database-menu.php:420 +msgid "Update of table %s failed: unable to change %s to %s" +msgstr "" + +#: admin/wp-security-database-menu.php:405 +msgid "The options table records which had references to the old DB prefix were updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:424 +msgid "The %s table records which had references to the old DB prefix were updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:452 +msgid "Error updating user_meta table where new meta_key = %s, old meta_key = %s and user_id = %s." +msgstr "" + +#: admin/wp-security-database-menu.php:457 +msgid "The usermeta table records which had references to the old DB prefix were updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:459 +msgid "The database prefix change tasks have been completed." +msgstr "" + +#: admin/wp-security-database-menu.php:503 +msgid "Checking for MySQL tables of type \"view\"....." +msgstr "" + +#: admin/wp-security-database-menu.php:520 +msgid "Update of the following MySQL view definition failed: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:527 +msgid "%s view definitions were updated successfully!" +msgstr "" + +#: admin/wp-security-filescan-menu.php:26 +#: classes/grade-system/wp-security-feature-item-manager.php:127 +msgid "File change detection" +msgstr "" + +#: admin/wp-security-filescan-menu.php:27 +msgid "Malware scan" +msgstr "" + +#: admin/wp-security-filescan-menu.php:88 +msgid "There have been no file changes since the last scan." +msgstr "" + +#: admin/wp-security-filescan-menu.php:98 +msgid "Nonce check failed for manual file change detection scan operation!" +msgstr "" + +#: admin/wp-security-filescan-menu.php:104 +msgid "There was an error during the file change detection scan. Please check the AIOS logs." +msgstr "" + +#: admin/wp-security-filescan-menu.php:110 +msgid "The plugin has detected that this is your first file change detection scan. The file details from this scan will be used to detect file changes for future scans." +msgstr "" + +#: admin/wp-security-filescan-menu.php:112 +msgid "Scan complete - There were no file changes detected!" +msgstr "" + +#: admin/wp-security-filescan-menu.php:133 +msgid "You entered a non numeric value for the \"backup time interval\" field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-filescan-menu.php:167 +msgid "The following address was removed because it is not a valid email address: " +msgstr "" + +#: admin/wp-security-filescan-menu.php:206 +msgid "NEW SCAN COMPLETED: The plugin has detected that you have made changes to the \"File Types To Ignore\" or \"Files To Ignore\" fields." +msgstr "" + +#: admin/wp-security-filescan-menu.php:206 +msgid "In order to ensure that future scan results are accurate, the old scan data has been refreshed." +msgstr "" + +#: admin/wp-security-filescan-menu.php:215 +msgid "All In One WP Security & Firewall has detected that there was a change in your host's files." +msgstr "" + +#: admin/wp-security-filescan-menu.php:217 +msgid "View scan details and clear this message" +msgstr "" + +#: admin/wp-security-filescan-menu.php:226 +msgid "If given an opportunity hackers can insert their code or files into your system which they can then use to carry out malicious acts on your site." +msgstr "" + +#: admin/wp-security-filescan-menu.php:227 +msgid "Being informed of any changes in your files can be a good way to quickly prevent a hacker from causing damage to your website." +msgstr "" + +#: admin/wp-security-filescan-menu.php:228 +msgid "In general, WordPress core and plugin files and file types such as \".php\" or \".js\" should not change often and when they do, it is important that you are made aware when a change occurs and which file was affected." +msgstr "" + +#: admin/wp-security-filescan-menu.php:229 +msgid "The \"File Change Detection Feature\" will notify you of any file change which occurs on your system, including the addition and deletion of files by performing a regular automated or manual scan of your system's files." +msgstr "" + +#: admin/wp-security-filescan-menu.php:230 +msgid "This feature also allows you to exclude certain files or folders from the scan in cases where you know that they change often as part of their normal operation. (For example log files and certain caching plugin files may change often and hence you may choose to exclude such files from the file change detection scan)" +msgstr "" + +#: admin/wp-security-filescan-menu.php:241 +msgid "It appears that your server is using an old PHP version which is missing the %s. The file scanner feature needs this class in order to work. If you would like to use this feature please upgrade your server PHP version to 5.3 or greater." +msgstr "" + +#: admin/wp-security-filescan-menu.php:249 +msgid "Manual file change detection scan" +msgstr "" + +#: admin/wp-security-filescan-menu.php:255 +msgid "To perform a manual file change detection scan click on the button below." +msgstr "" + +#: admin/wp-security-filescan-menu.php:258 +msgid "Perform scan now" +msgstr "" + +#: admin/wp-security-filescan-menu.php:262 +msgid "View last saved file change results" +msgstr "" + +#: admin/wp-security-filescan-menu.php:268 +msgid "Click the button below to view the saved file change results from the last scan." +msgstr "" + +#: admin/wp-security-filescan-menu.php:271 +msgid "View last file change" +msgstr "" + +#: admin/wp-security-filescan-menu.php:275 +msgid "File change detection settings" +msgstr "" + +#: admin/wp-security-filescan-menu.php:287 +msgid "Enable automated file change detection scan" +msgstr "" + +#: admin/wp-security-filescan-menu.php:290 +msgid "Check this if you want the system to automatically/periodically scan your files to check for file changes based on the settings below" +msgstr "" + +#: admin/wp-security-filescan-menu.php:294 +msgid "Scan time interval" +msgstr "" + +#: admin/wp-security-filescan-menu.php:297 +msgid "Hours" +msgstr "" + +#: admin/wp-security-filescan-menu.php:298 +msgid "Days" +msgstr "" + +#: admin/wp-security-filescan-menu.php:299 +msgid "Weeks" +msgstr "" + +#: admin/wp-security-filescan-menu.php:301 +msgid "Set the value for how often you would like a scan to occur" +msgstr "" + +#: admin/wp-security-filescan-menu.php:305 +msgid "File types to ignore" +msgstr "" + +#: admin/wp-security-filescan-menu.php:308 +msgid "Enter each file type or extension on a new line which you wish to exclude from the file change detection scan." +msgstr "" + +#: admin/wp-security-filescan-menu.php:312 +msgid "You can exclude file types from the scan which would not normally pose any security threat if they were changed. These can include things such as image files." +msgstr "" + +#: admin/wp-security-filescan-menu.php:313 +msgid "Example: If you want the scanner to ignore files of type jpg, png, and bmp, then you would enter the following:" +msgstr "" + +#: admin/wp-security-filescan-menu.php:314 +msgid "jpg" +msgstr "" + +#: admin/wp-security-filescan-menu.php:315 +msgid "png" +msgstr "" + +#: admin/wp-security-filescan-menu.php:316 +msgid "bmp" +msgstr "" + +#: admin/wp-security-filescan-menu.php:322 +msgid "Files/Directories to ignore" +msgstr "" + +#: admin/wp-security-filescan-menu.php:325 +msgid "Enter each file or directory on a new line which you wish to exclude from the file change detection scan." +msgstr "" + +#: admin/wp-security-filescan-menu.php:329 +msgid "You can exclude specific files/directories from the scan which would not normally pose any security threat if they were changed. These can include things such as log files." +msgstr "" + +#: admin/wp-security-filescan-menu.php:330 +msgid "Example: If you want the scanner to ignore certain files in different directories or whole directories, then you would enter the following:" +msgstr "" + +#: admin/wp-security-filescan-menu.php:331 +msgid "cache/config/master.php" +msgstr "" + +#: admin/wp-security-filescan-menu.php:332 +msgid "somedirectory" +msgstr "" + +#: admin/wp-security-filescan-menu.php:339 +msgid "Send email when change detected" +msgstr "" + +#: admin/wp-security-filescan-menu.php:343 +msgid "Check this if you want the system to email you if a file change was detected" +msgstr "" + +#: admin/wp-security-filescan-menu.php:347 +msgid "Enter one or more email addresses on a new line." +msgstr "" + +#: admin/wp-security-filescan-menu.php:364 +msgid "What is malware?" +msgstr "" + +#: admin/wp-security-filescan-menu.php:365 +msgid "The word malware stands for Malicious Software. It can consist of things like trojan horses, adware, worms, spyware and any other undesirable code which a hacker will try to inject into your website." +msgstr "" + +#: admin/wp-security-filescan-menu.php:366 +msgid "Often when malware code has been inserted into your site you will normally not notice anything out of the ordinary based on appearances, but it can have a dramatic effect on your site's search ranking." +msgstr "" + +#: admin/wp-security-filescan-menu.php:367 +msgid "This is because the bots and spiders from search engines such as Google have the capability to detect malware when they are indexing the pages on your site, and consequently they can blacklist your website which will in turn affect your search rankings." +msgstr "" + +#: admin/wp-security-filescan-menu.php:369 +msgid "CLICK HERE" +msgstr "" + +#: admin/wp-security-filescan-menu.php:371 +msgid "Scanning for malware" +msgstr "" + +#: admin/wp-security-filescan-menu.php:372 +msgid "Due to the constantly changing and complex nature of Malware, scanning for such things using a standalone plugin will not work reliably. This is something best done via an external scan of your site regularly." +msgstr "" + +#: admin/wp-security-filescan-menu.php:373 +msgid "This is why we have created an easy-to-use scanning service which is hosted off our own server which will scan your site for malware once every day and notify you if it finds anything." +msgstr "" + +#: admin/wp-security-filescan-menu.php:374 +msgid "When you sign up for this service you will get the following:" +msgstr "" + +#: admin/wp-security-filescan-menu.php:376 +msgid "Automatic daily scan of 1 website" +msgstr "" + +#: admin/wp-security-filescan-menu.php:377 +msgid "Automatic malware and blacklist monitoring" +msgstr "" + +#: admin/wp-security-filescan-menu.php:378 +msgid "Automatic email alerting" +msgstr "" + +#: admin/wp-security-filescan-menu.php:379 +msgid "Site uptime monitoring" +msgstr "" + +#: admin/wp-security-filescan-menu.php:380 +msgid "Site response time monitoring" +msgstr "" + +#: admin/wp-security-filescan-menu.php:381 +msgid "We provide advice for malware cleanup" +msgstr "" + +#: admin/wp-security-filescan-menu.php:382 +msgid "Blacklist removal" +msgstr "" + +#: admin/wp-security-filescan-menu.php:383 +msgid "No contract (cancel anytime)" +msgstr "" + +#: admin/wp-security-filescan-menu.php:385 +msgid "To learn more please %s." +msgstr "" + +#: admin/wp-security-filescan-menu.php:406 +msgid "Latest file change scan results" +msgstr "" + +#: admin/wp-security-filescan-menu.php:416 +msgid "The following files were added to your host." +msgstr "" + +#: admin/wp-security-filescan-menu.php:419 +#: admin/wp-security-filescan-menu.php:440 +#: admin/wp-security-filescan-menu.php:464 +msgid "File" +msgstr "" + +#: admin/wp-security-filescan-menu.php:420 +#: admin/wp-security-filescan-menu.php:441 +#: admin/wp-security-filescan-menu.php:465 +msgid "File size" +msgstr "" + +#: admin/wp-security-filescan-menu.php:421 +#: admin/wp-security-filescan-menu.php:442 +#: admin/wp-security-filescan-menu.php:466 +msgid "File modified" +msgstr "" + +#: admin/wp-security-filescan-menu.php:437 +msgid "The following files were removed from your host." +msgstr "" + +#: admin/wp-security-filescan-menu.php:461 +msgid "The following files were changed on your host." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:26 +#: classes/grade-system/wp-security-feature-item-manager.php:69 +msgid "File permissions" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:27 +msgid "PHP file editing" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:28 +msgid "WP file access" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:29 +msgid "Host system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:55 +msgid "Filesystem security" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:80 +msgid "Nonce check failed for manual DB backup operation!" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:90 +msgid "The permissions for %s were successfully changed to %s" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:94 +msgid "Unable to change permissions for %s!" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:100 +msgid "File permissions scan" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:103 +msgid "Your WordPress file and folder permission settings govern the accessibility and read/write privileges of the files and folders which make up your WP installation." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:104 +msgid "Your WP installation already comes with reasonably secure file permission settings for the filesystem." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:105 +msgid "However, sometimes people or other plugins modify the various permission settings of certain core WP folders or files such that they end up making their site less secure because they chose the wrong permission values." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:106 +msgid "This feature will scan the critical WP core folders and files and will highlight any permission settings which are insecure." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:114 +msgid "This plugin has detected that your site is running on a Windows server." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:115 +msgid "This feature is not applicable for Windows server installations." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:121 +msgid "WP directory and file permissions scan results" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:133 +#: admin/wp-security-filesystem-menu.php:152 +msgid "Name" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:134 +#: admin/wp-security-filesystem-menu.php:153 +msgid "File/Folder" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:135 +#: admin/wp-security-filesystem-menu.php:154 +msgid "Current permissions" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:136 +#: admin/wp-security-filesystem-menu.php:155 +msgid "Recommended permissions" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:137 +#: admin/wp-security-filesystem-menu.php:156 +msgid "Recommended action" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:195 +msgid "Your PHP file editing settings were saved successfully." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:199 +msgid "Operation failed! Unable to modify or make a backup of wp-config.php file!" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:212 +#: classes/grade-system/wp-security-feature-item-manager.php:71 +msgid "File editing" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:215 +msgid "The WordPress Dashboard by default allows administrators to edit PHP files, such as plugin and theme files." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:216 +msgid "This is often the first tool an attacker will use if able to login, since it allows code execution." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:217 +msgid "This feature will disable the ability for people to edit PHP files via the dashboard." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:223 +msgid "Disable PHP file editing" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:235 +msgid "Disable ability to edit PHP files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:238 +msgid "Check this if you want to remove the ability for people to edit PHP files via the WP dashboard" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:282 +msgid "You have successfully saved the Prevent Access to Default WP Files configuration." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:286 +#: admin/wp-security-firewall-menu.php:126 +#: admin/wp-security-firewall-menu.php:346 +#: admin/wp-security-firewall-menu.php:613 +#: admin/wp-security-firewall-menu.php:912 +#: admin/wp-security-settings-menu.php:772 +#: admin/wp-security-spam-menu.php:124 +msgid "Could not write to the .htaccess file. Please check the file permissions." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:291 +msgid "WordPress files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:294 +msgid "This feature allows you to prevent access to files such as %s, %s and %s which are delivered with all WP installations." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:295 +msgid "By preventing access to these files you are hiding some key pieces of information (such as WordPress version info) from potential hackers." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:300 +msgid "Prevent access to default WP files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:311 +msgid "Prevent access to WP default install files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:314 +msgid "Check this if you want to prevent access to readme.html, license.txt and wp-config-sample.php." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:318 +msgid "Save setting" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:342 +msgid "System logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:345 +msgid "Sometimes your hosting platform will produce error or warning logs in a file called \"error_log\"." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:346 +msgid "Depending on the nature and cause of the error or warning, your hosting server can create multiple instances of this file in numerous directory locations of your WordPress installation." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:347 +msgid "By occasionally viewing the contents of these logs files you can keep informed of any underlying problems on your system which you might need to address." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:353 +msgid "View system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:355 +msgid "Please click the button below to view the latest system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:358 +msgid "Enter System Log File Name" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:360 +msgid "Enter your system log file name. (Defaults to error_log)" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:363 +msgid "View latest system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:365 +msgid "Loading..." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:382 +msgid "No system logs were found." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:435 +msgid "Set recommended permissions" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:441 +msgid "No action required" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:481 +msgid "Showing latest entries of error_log file: %s" +msgstr "" + +#: admin/wp-security-firewall-menu.php:28 +msgid "Basic firewall rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:29 +msgid "Additional firewall rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:30 +msgid "6G Blacklist firewall rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:31 +msgid "Internet bots" +msgstr "" + +#: admin/wp-security-firewall-menu.php:32 +msgid "Prevent hotlinks" +msgstr "" + +#: admin/wp-security-firewall-menu.php:33 +msgid "404 detection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:34 +msgid "Custom rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:122 +#: admin/wp-security-firewall-menu.php:908 +#: admin/wp-security-spam-menu.php:120 +#: admin/wp-security-spam-menu.php:494 +#: admin/wp-security-spam-menu.php:556 +#: admin/wp-security-user-registration-menu.php:95 +msgid "Settings were successfully saved" +msgstr "" + +#: admin/wp-security-firewall-menu.php:131 +#: admin/wp-security-firewall-menu.php:651 +msgid "Firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:138 +msgid "This should not have any impact on your site's general functionality but if you wish you can take a %s of your .htaccess file before proceeding." +msgstr "" + +#: admin/wp-security-firewall-menu.php:139 +msgid "The features in this tab allow you to activate some basic firewall security protection rules for your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:140 +msgid "The firewall functionality is achieved via the insertion of special code into your currently active .htaccess file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:151 +msgid "You have enabled the \"Completely Block Access To XMLRPC\" checkbox which means all XMLRPC functionality will be blocked." +msgstr "" + +#: admin/wp-security-firewall-menu.php:152 +msgid "By leaving this feature enabled you will prevent Jetpack or Wordpress iOS or other apps which need XMLRPC from working correctly on your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:153 +msgid "If you still need XMLRPC then uncheck the \"Completely Block Access To XMLRPC\" checkbox and enable only the \"Disable Pingback Functionality From XMLRPC\" checkbox." +msgstr "" + +#: admin/wp-security-firewall-menu.php:163 +msgid "Basic firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:171 +msgid "Enable basic firewall protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:174 +msgid "Check this if you want to apply basic firewall protection to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:178 +msgid "This setting will implement the following basic firewall protection mechanisms on your site:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:179 +msgid "1) Protect your htaccess file by denying access to it." +msgstr "" + +#: admin/wp-security-firewall-menu.php:180 +msgid "2) Disable the server signature." +msgstr "" + +#: admin/wp-security-firewall-menu.php:181 +msgid "3) Limit file upload size (%sMB)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:182 +msgid "4) Protect your wp-config.php file by denying access to it." +msgstr "" + +#: admin/wp-security-firewall-menu.php:183 +msgid "The above firewall features will be applied via your .htaccess file and should not affect your site's overall functionality." +msgstr "" + +#: admin/wp-security-firewall-menu.php:184 +msgid "You are still advised to take a backup of your active .htaccess file just in case." +msgstr "" + +#: admin/wp-security-firewall-menu.php:190 +msgid "Max file upload size (MB)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:192 +msgid "The value for the maximum file upload size used in the .htaccess file. (Defaults to %sMB if left blank)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:200 +msgid "WordPress XMLRPC and pingback vulnerability protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:208 +msgid "Completely block access to XMLRPC" +msgstr "" + +#: admin/wp-security-firewall-menu.php:211 +msgid "Check this if you are not using the WP XML-RPC functionality and you want to completely block external access to XMLRPC." +msgstr "" + +#: admin/wp-security-firewall-menu.php:215 +msgid "This setting will add a directive in your .htaccess to disable access to the WordPress xmlrpc.php file which is responsible for the XML-RPC functionality in WordPress." +msgstr "" + +#: admin/wp-security-firewall-menu.php:216 +msgid "Hackers can exploit various vulnerabilities in the WordPress XML-RPC API in a number of ways such as:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:217 +msgid "1) Denial of Service (DoS) attacks" +msgstr "" + +#: admin/wp-security-firewall-menu.php:218 +msgid "2) Hacking internal routers." +msgstr "" + +#: admin/wp-security-firewall-menu.php:219 +msgid "3) Scanning ports in internal networks to get info from various hosts." +msgstr "" + +#: admin/wp-security-firewall-menu.php:220 +msgid "Apart from the security protection benefit, this feature may also help reduce load on your server, particularly if your site currently has a lot of unwanted traffic hitting the XML-RPC API on your installation." +msgstr "" + +#: admin/wp-security-firewall-menu.php:221 +msgid "NOTE: You should only enable this feature if you are not currently using the XML-RPC functionality on your WordPress installation." +msgstr "" + +#: admin/wp-security-firewall-menu.php:222 +msgid "Leave this feature disabled and use the feature below if you want pingback protection but you still need XMLRPC." +msgstr "" + +#: admin/wp-security-firewall-menu.php:228 +msgid "Disable pingback functionality from XMLRPC" +msgstr "" + +#: admin/wp-security-firewall-menu.php:231 +msgid "If you use Jetpack or WP iOS or other apps which need WP XML-RPC functionality then check this. This will enable protection against WordPress pingback vulnerabilities." +msgstr "" + +#: admin/wp-security-firewall-menu.php:235 +msgid "NOTE: If you use Jetpack or the Wordpress iOS or other apps then you should enable this feature but leave the \"Completely Block Access To XMLRPC\" checkbox unchecked." +msgstr "" + +#: admin/wp-security-firewall-menu.php:236 +msgid "The feature will still allow XMLRPC functionality on your site but will disable the pingback methods." +msgstr "" + +#: admin/wp-security-firewall-menu.php:237 +msgid "This feature will also remove the \"X-Pingback\" header if it is present." +msgstr "" + +#: admin/wp-security-firewall-menu.php:246 +msgid "Block access to debug log file" +msgstr "" + +#: admin/wp-security-firewall-menu.php:254 +msgid "Block access to debug.log file" +msgstr "" + +#: admin/wp-security-firewall-menu.php:257 +msgid "Check this if you want to block access to the debug.log file that WordPress creates when debug logging is enabled." +msgstr "" + +#: admin/wp-security-firewall-menu.php:261 +msgid "WordPress has an option to turn on the debug logging to a file located in wp-content/debug.log. This file may contain sensitive information." +msgstr "" + +#: admin/wp-security-firewall-menu.php:262 +msgid "Using this option will block external access to this file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:262 +msgid "You can still access this file by logging into your site via FTP." +msgstr "" + +#: admin/wp-security-firewall-menu.php:270 +msgid "Save basic firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:342 +msgid "You have successfully saved the Additional Firewall Protection configuration" +msgstr "" + +#: admin/wp-security-firewall-menu.php:356 +msgid "Additional firewall protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:360 +msgid "Due to the nature of the code being inserted to the .htaccess file, this feature may break some functionality for certain plugins and you are therefore advised to take a %s of .htaccess before applying this configuration." +msgstr "" + +#: admin/wp-security-firewall-menu.php:362 +msgid "This feature allows you to activate more advanced firewall settings to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:363 +msgid "The advanced firewall rules are applied via the insertion of special code to your currently active .htaccess file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:372 +msgid "Listing of directory contents" +msgstr "" + +#: admin/wp-security-firewall-menu.php:381 +#: classes/grade-system/wp-security-feature-item-manager.php:85 +msgid "Disable index views" +msgstr "" + +#: admin/wp-security-firewall-menu.php:384 +msgid "Check this if you want to disable directory and file listing." +msgstr "" + +#: admin/wp-security-firewall-menu.php:389 +msgid "By default, an Apache server will allow the listing of the contents of a directory if it doesn't contain an index.php file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:391 +msgid "This feature will prevent the listing of contents for all directories." +msgstr "" + +#: admin/wp-security-firewall-menu.php:393 +msgid "NOTE: In order for this feature to work \"AllowOverride\" of the Indexes directive must be enabled in your httpd.conf file. Ask your hosting provider to check this if you don't have access to httpd.conf" +msgstr "" + +#: admin/wp-security-firewall-menu.php:402 +msgid "Trace and track" +msgstr "" + +#: admin/wp-security-firewall-menu.php:411 +#: classes/grade-system/wp-security-feature-item-manager.php:86 +msgid "Disable trace and track" +msgstr "" + +#: admin/wp-security-firewall-menu.php:414 +msgid "Check this if you want to disable trace and track." +msgstr "" + +#: admin/wp-security-firewall-menu.php:419 +msgid "HTTP Trace attack (XST) can be used to return header requests and grab cookies and other information." +msgstr "" + +#: admin/wp-security-firewall-menu.php:421 +msgid "This hacking technique is usually used together with cross site scripting attacks (XSS)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:423 +msgid "Disabling trace and track on your site will help prevent HTTP Trace attacks." +msgstr "" + +#: admin/wp-security-firewall-menu.php:432 +msgid "Proxy comment posting" +msgstr "" + +#: admin/wp-security-firewall-menu.php:442 +msgid "Forbid proxy comment posting" +msgstr "" + +#: admin/wp-security-firewall-menu.php:445 +msgid "Check this if you want to forbid proxy comment posting." +msgstr "" + +#: admin/wp-security-firewall-menu.php:450 +msgid "This setting will deny any requests that use a proxy server when posting comments." +msgstr "" + +#: admin/wp-security-firewall-menu.php:451 +msgid "By forbidding proxy comments you are in effect eliminating some spam and other proxy requests." +msgstr "" + +#: admin/wp-security-firewall-menu.php:460 +msgid "Bad query strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:470 +msgid "Deny bad query strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:473 +msgid "This will help protect you against malicious queries via XSS." +msgstr "" + +#: admin/wp-security-firewall-menu.php:478 +msgid "This feature will write rules in your .htaccess file to prevent malicious string attacks on your site using XSS." +msgstr "" + +#: admin/wp-security-firewall-menu.php:479 +msgid "NOTE: Some of these strings might be used for plugins or themes and hence this might break some functionality." +msgstr "" + +#: admin/wp-security-firewall-menu.php:480 +#: admin/wp-security-firewall-menu.php:510 +msgid "You are therefore strongly advised to take a backup of your active .htaccess file before applying this feature." +msgstr "" + +#: admin/wp-security-firewall-menu.php:489 +#: classes/grade-system/wp-security-feature-item-manager.php:89 +msgid "Advanced character string filter" +msgstr "" + +#: admin/wp-security-firewall-menu.php:499 +msgid "Enable advanced character string filter" +msgstr "" + +#: admin/wp-security-firewall-menu.php:502 +msgid "This will block bad character matches from XSS." +msgstr "" + +#: admin/wp-security-firewall-menu.php:507 +msgid "This is an advanced character string filter to prevent malicious string attacks on your site coming from Cross Site Scripting (XSS)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:508 +msgid "This setting matches for common malicious string patterns and exploits and will produce a 403 error for the hacker attempting the query." +msgstr "" + +#: admin/wp-security-firewall-menu.php:509 +msgid "NOTE: Some strings for this setting might break some functionality." +msgstr "" + +#: admin/wp-security-firewall-menu.php:518 +msgid "Save additional firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:609 +msgid "You have successfully saved the 5G/6G Firewall Protection configuration" +msgstr "" + +#: admin/wp-security-firewall-menu.php:633 +msgid "All in One WP Security and Firewall" +msgstr "" + +#: admin/wp-security-firewall-menu.php:634 +msgid "We were unable to access the firewall's configuration file:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:636 +msgid "As a result, the firewall will be unavailable." +msgstr "" + +#: admin/wp-security-firewall-menu.php:637 +msgid "Please check your PHP error log for further information." +msgstr "" + +#: admin/wp-security-firewall-menu.php:638 +msgid "If you're unable to locate your PHP log file, please contact your web hosting company to ask them where it can be found on their setup." +msgstr "" + +#: admin/wp-security-firewall-menu.php:655 +msgid "This feature allows you to activate the %s (or legacy %s) firewall security protection rules designed and produced by %s." +msgstr "" + +#: admin/wp-security-firewall-menu.php:656 +msgid "The 6G Blacklist is updated and improved version of 5G Blacklist. If you have 5G Blacklist active, you might consider activating 6G Blacklist instead." +msgstr "" + +#: admin/wp-security-firewall-menu.php:657 +msgid "The 6G Blacklist is a simple, flexible blacklist that helps reduce the number of malicious URL requests that hit your website." +msgstr "" + +#: admin/wp-security-firewall-menu.php:658 +msgid "The added advantage of applying the 6G firewall to your site is that it has been tested and confirmed by the people at PerishablePress.com to be an optimal and least disruptive set of .htaccess security rules for general WP sites running on an Apache server or similar." +msgstr "" + +#: admin/wp-security-firewall-menu.php:659 +msgid "Therefore the 6G firewall rules should not have any impact on your site's general functionality but if you wish you can take a %s of your .htaccess file before proceeding." +msgstr "" + +#: admin/wp-security-firewall-menu.php:665 +msgid "6G blacklist/firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:677 +msgid "Enable 6G firewall protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:680 +msgid "Check this if you want to apply the 6G Blacklist firewall protection from perishablepress.com to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:684 +msgid "This setting will implement the 6G security firewall protection mechanisms on your site which include the following things:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:685 +#: admin/wp-security-firewall-menu.php:703 +msgid "1) Block forbidden characters commonly used in exploitative attacks." +msgstr "" + +#: admin/wp-security-firewall-menu.php:686 +#: admin/wp-security-firewall-menu.php:704 +msgid "2) Block malicious encoded URL characters such as the \".css(\" string." +msgstr "" + +#: admin/wp-security-firewall-menu.php:687 +#: admin/wp-security-firewall-menu.php:705 +msgid "3) Guard against the common patterns and specific exploits in the root portion of targeted URLs." +msgstr "" + +#: admin/wp-security-firewall-menu.php:688 +#: admin/wp-security-firewall-menu.php:706 +msgid "4) Stop attackers from manipulating query strings by disallowing illicit characters." +msgstr "" + +#: admin/wp-security-firewall-menu.php:689 +#: admin/wp-security-firewall-menu.php:707 +msgid "....and much more." +msgstr "" + +#: admin/wp-security-firewall-menu.php:695 +msgid "Enable legacy 5G firewall protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:698 +msgid "Check this if you want to apply the 5G Blacklist firewall protection from perishablepress.com to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:702 +msgid "This setting will implement the 5G security firewall protection mechanisms on your site which include the following things:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:713 +msgid "Save 5G/6G firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:721 +msgid "6G block request methods" +msgstr "" + +#: admin/wp-security-firewall-menu.php:725 +msgid "HTTP Request methods are used by browsers and clients to communicate with servers to get responses." +msgstr "" + +#: admin/wp-security-firewall-menu.php:726 +msgid "GET and POST are the most commonly used methods to request and submit data for specified resources of the server." +msgstr "" + +#: admin/wp-security-firewall-menu.php:732 +msgid "Block %s method" +msgstr "" + +#: admin/wp-security-firewall-menu.php:735 +msgid "Check this to block the %s request method" +msgstr "" + +#: admin/wp-security-firewall-menu.php:740 +msgid "Some WooCommerce extensions use the PUT request method in addition to GET and POST." +msgstr "" + +#: admin/wp-security-firewall-menu.php:740 +msgid "This means WooCommerce users shouldn't block the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:741 +msgid "A few REST requests use the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:741 +msgid "If your site is communicated by the WP REST API, you should not block the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:749 +msgid "Save request methods settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:757 +msgid "6G other settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:761 +msgid "Block query strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:764 +msgid "Check this to block all query strings recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:768 +msgid "Block request strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:771 +msgid "Check this to block all request strings recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:775 +msgid "Block referrers" +msgstr "" + +#: admin/wp-security-firewall-menu.php:778 +msgid "Check this to block all referrers recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:782 +msgid "Block user-agents" +msgstr "" + +#: admin/wp-security-firewall-menu.php:785 +msgid "Check this to block all user-agents recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:789 +msgid "Save other settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:823 +msgid "The Internet bot settings were successfully saved" +msgstr "" + +#: admin/wp-security-firewall-menu.php:827 +msgid "Internet bot settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:833 +msgid "What is an Internet Bot" +msgstr "" + +#: admin/wp-security-firewall-menu.php:834 +msgid "%s?" +msgstr "" + +#: admin/wp-security-firewall-menu.php:836 +msgid "A bot is a piece of software which runs on the Internet and performs automatic tasks. For example when Google indexes your pages it uses automatic bots to achieve this task." +msgstr "" + +#: admin/wp-security-firewall-menu.php:837 +msgid "A lot of bots are legitimate and non-malicious but not all bots are good and often you will find some which try to impersonate legitimate bots such as \"Googlebot\" but in reality they have nohing to do with Google at all." +msgstr "" + +#: admin/wp-security-firewall-menu.php:838 +msgid "Although most of the bots out there are relatively harmless sometimes website owners want to have more control over which bots they allow into their site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:839 +msgid "This feature allows you to block bots which are impersonating as a Googlebot but actually aren't. (In other words they are fake Google bots)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:840 +msgid "Googlebots have a unique identity which cannot easily be forged and this feature will identify any fake Google bots and block them from reading your site's pages." +msgstr "" + +#: admin/wp-security-firewall-menu.php:846 +msgid "Attention: Sometimes non-malicious Internet organizations might have bots which impersonate as a \"Googlebot\"." +msgstr "" + +#: admin/wp-security-firewall-menu.php:847 +msgid "Just be aware that if you activate this feature the plugin will block all bots which use the \"Googlebot\" string in their User Agent information but are NOT officially from Google (irrespective whether they are malicious or not)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:848 +msgid "All other bots from other organizations such as \"Yahoo\", \"Bing\" etc will not be affected by this feature." +msgstr "" + +#: admin/wp-security-firewall-menu.php:854 +#: admin/wp-security-firewall-menu.php:864 +#: classes/grade-system/wp-security-feature-item-manager.php:93 +msgid "Block fake Googlebots" +msgstr "" + +#: admin/wp-security-firewall-menu.php:867 +msgid "Check this if you want to block all fake Googlebots." +msgstr "" + +#: admin/wp-security-firewall-menu.php:871 +msgid "This feature will check if the User Agent information of a bot contains the string \"Googlebot\"." +msgstr "" + +#: admin/wp-security-firewall-menu.php:872 +msgid "It will then perform a few tests to verify if the bot is legitimately from Google and if so it will allow the bot to proceed." +msgstr "" + +#: admin/wp-security-firewall-menu.php:873 +msgid "If the bot fails the checks then the plugin will mark it as being a fake Googlebot and it will block it" +msgstr "" + +#: admin/wp-security-firewall-menu.php:880 +msgid "Save internet bot settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:916 +#: admin/wp-security-firewall-menu.php:938 +#: classes/grade-system/wp-security-feature-item-manager.php:95 +msgid "Prevent image hotlinking" +msgstr "" + +#: admin/wp-security-firewall-menu.php:919 +msgid "A Hotlink is where someone displays an image on their site which is actually located on your site by using a direct link to the source of the image on your server." +msgstr "" + +#: admin/wp-security-firewall-menu.php:920 +msgid "Due to the fact that the image being displayed on the other person's site is coming from your server, this can cause leaking of bandwidth and resources for you because your server has to present this image for the people viewing it on someone elses's site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:921 +msgid "This feature will prevent people from directly hotlinking images from your site's pages by writing some directives in your .htaccess file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:926 +msgid "Prevent hotlinking" +msgstr "" + +#: admin/wp-security-firewall-menu.php:941 +msgid "Check this if you want to prevent hotlinking to images on your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:961 +msgid "Nonce check failed for delete all 404 event logs operation!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:972 +msgid "404 Detection Feature - Delete all 404 event logs operation failed!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:976 +msgid "All 404 event logs were deleted from the DB successfully!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1000 +msgid "You entered a non numeric value for the lockout time length field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1006 +msgid "You entered an incorrect format for the \"Redirect URL\" field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1039 +msgid "404 detection configuration" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1042 +msgid "A 404 or Not Found error occurs when somebody tries to access a non-existent page on your website." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1043 +msgid "Typically, most 404 errors happen quite innocently when people have mis-typed a URL or used an old link to page which doesn't exist anymore." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1044 +msgid "However, in some cases you may find many repeated 404 errors which occur in a relatively short space of time and from the same IP address which are all attempting to access a variety of non-existent page URLs." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1045 +msgid "Such behaviour can mean that a hacker might be trying to find a particular page or URL for sinister reasons." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1046 +msgid "This feature allows you to monitor all 404 events which occur on your site, and it also gives you the option of blocking IP addresses for a configured length of time." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1047 +msgid "If you want to temporarily block or blacklist an IP address, simply click the \"Temp Block\" or \"Blacklist IP\" link for the applicable IP entry in the \"404 Event Logs\" table below." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1071 +msgid "404 detection options" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1083 +msgid "Enable 404 IP detection and lockout" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1086 +msgid "Check this if you want to enable the lockout of selected IP addresses." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1091 +msgid "When you enable this checkbox, all 404 events on your site will be logged in the table below. You can monitor these events and select some IP addresses listed in the table below and block them for a specified amount of time. All IP addresses you select to be blocked from the \"404 Event Logs\" table section will be unable to access your site during the time specified." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1099 +msgid "Enable 404 event logging" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1102 +msgid "Check this if you want to enable the logging of 404 events" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1107 +msgid "Time length of 404 lockout (minutes)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1109 +msgid "Set the length of time for which a blocked IP address will be prevented from visiting your site" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1114 +msgid "You can lock any IP address which is recorded in the \"404 Event Logs\" table section below." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1116 +msgid "To temporarily lock an IP address, hover over the ID column and click the \"Temp Block\" link for the applicable IP entry." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1123 +msgid "404 lockout redirect URL" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1125 +msgid "A blocked visitor will be automatically redirected to this URL." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1135 +msgid "This list displays the 404 event logs when somebody tries to access a non-existent page on your website." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1136 +msgid "404 event logs that are older than %1$d days are purged automatically." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1141 +msgid "404 event logs" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1163 +#: admin/wp-security-firewall-menu.php:1172 +#: admin/wp-security-user-login-menu.php:495 +#: admin/wp-security-user-login-menu.php:504 +#: admin/wp-security-user-login-menu.php:653 +#: admin/wp-security-user-login-menu.php:662 +msgid "Export to CSV" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1169 +#: admin/wp-security-user-login-menu.php:501 +#: admin/wp-security-user-login-menu.php:659 +msgid "Click this button if you wish to download this log in CSV format." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1176 +#: admin/wp-security-firewall-menu.php:1185 +msgid "Delete all 404 event logs" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1182 +msgid "Click this button if you wish to purge all 404 event logs from the DB." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1241 +msgid "Custom .htaccess rules settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1248 +msgid "This feature can be used to apply your own custom .htaccess rules and directives." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1249 +msgid "It is useful for when you want to tweak our existing firewall rules or when you want to add your own." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1250 +msgid "NOTE: This feature can only be used if your site is hosted in an apache or similar web server." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1256 +msgid "Warning: Only use this feature if you know what you are doing." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1257 +msgid "Incorrect .htaccess rules or directives can break or prevent access to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1258 +msgid "It is your responsibility to ensure that you are entering the correct code!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1259 +msgid "If you break your site you will need to access your server via FTP or something similar and then edit your .htaccess file and delete the changes you made." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1265 +msgid "Custom .htaccess rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1269 +msgid "Enable custom .htaccess rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1272 +msgid "Check this if you want to enable custom rules entered in the text box below" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1276 +msgid "Place custom rules at the top" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1279 +msgid "Check this if you want to place your custom rules at the beginning of all the rules applied by this plugin" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1283 +msgid "Enter custom .htaccess rules:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1287 +msgid "Enter your custom .htaccess rules/directives." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1292 +msgid "Save custom rules" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:338 +#: admin/wp-security-firewall-setup-notice.php:407 +#: admin/wp-security-firewall-setup-notice.php:479 +#: admin/wp-security-firewall-setup-notice.php:595 +#: wp-security.php:43 +msgid "All In One WP Security and Firewall" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:340 +msgid "We were unable to create the file necessary to give you the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:341 +msgid "Your firewall will have reduced protection which means some of your firewall's functionality will be unavailable." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:342 +msgid "If you would like to manually set up the necessary file, please follow these steps:" +msgstr "" + +#. translators: %s Bootstrap file name. +#. translators: %s Firewall file name. +#: admin/wp-security-firewall-setup-notice.php:346 +#: admin/wp-security-firewall-setup-notice.php:453 +msgid "1. Create a file with the name %s in the same directory as your WordPress install is in, i.e.:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:350 +msgid "2. Paste in the following code:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:352 +#: admin/wp-security-firewall-setup-notice.php:462 +msgid "3. Save the file and press the 'Try again' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:372 +msgid "1. Open the following file:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:378 +msgid "2. Look for the auto_prepend_file directive." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:382 +msgid "2. Look for the following:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:388 +msgid "3. Change it to the following:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:392 +msgid "4. Save the file and press the 'Try again' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:392 +#: admin/wp-security-firewall-setup-notice.php:441 +msgid "You may have to wait up to 5 minutes before the settings take effect." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:410 +msgid "Your firewall has been installed with the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:411 +msgid "You may have to wait 5 minutes for the changes to take effect." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:434 +msgid "1. Open your php.ini file." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:437 +msgid "2. Set the auto_prepend_file directive like below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:441 +msgid "3. Restart the webserver and refresh the page" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:458 +msgid "2. Paste in the following directives:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:482 +msgid "We were unable to set up your firewall with the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:483 +msgid "Your firewall will have reduced functionality." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:487 +msgid "To give your site the highest level of protection, please follow these steps:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:500 +msgid "Note: if you're unable to perform any of the aforementioned steps, please ask your web hosting provider for further assistance." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:517 +msgid "Try again" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:539 +msgid "We have detected that your AIOS firewall is not fully installed, and therefore does not have the highest level of protection. " +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:540 +msgid "Your firewall will have reduced functionality until it has been upgraded. " +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:542 +msgid "Upgrade your protection now" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:598 +msgid "Our PHP-based firewall has been created to give you even greater protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:602 +msgid "If you already have our .htaccess-based firewall enabled, you will still need to set up the PHP-based firewall to benefit from its protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:605 +msgid "To set up the PHP-based firewall, press the 'Set up now' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:608 +msgid "Set up now" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:614 +#: templates/notices/custom-notice.php:10 +#: templates/notices/custom-notice.php:12 +#: templates/notices/horizontal-notice.php:50 +#: templates/notices/horizontal-notice.php:52 +#: templates/notices/htaccess-to-php-feature-notice.php:10 +#: templates/notices/htaccess-to-php-feature-notice.php:12 +msgid "Dismiss" +msgstr "" + +#: admin/wp-security-list-404.php:91 +msgid "Event type" +msgstr "" + +#: admin/wp-security-list-404.php:92 +#: admin/wp-security-list-logged-in-users.php:46 +#: admin/wp-security-list-registered-users.php:74 +msgid "IP address" +msgstr "" + +#: admin/wp-security-list-404.php:93 +msgid "Attempted URL" +msgstr "" + +#: admin/wp-security-list-404.php:94 +msgid "Referer" +msgstr "" + +#: admin/wp-security-list-404.php:96 +msgid "Lock status" +msgstr "" + +#: admin/wp-security-list-404.php:118 +msgid "Temp block IP" +msgstr "" + +#: admin/wp-security-list-404.php:119 +msgid "Blacklist IP" +msgstr "" + +#: admin/wp-security-list-404.php:120 +#: admin/wp-security-list-acct-activity.php:82 +#: admin/wp-security-list-locked-ip.php:37 +#: admin/wp-security-list-locked-ip.php:84 +#: admin/wp-security-list-login-fails.php:73 +#: admin/wp-security-list-registered-users.php:93 +msgid "Delete" +msgstr "" + +#: admin/wp-security-list-404.php:128 +#: admin/wp-security-list-404.php:136 +#: admin/wp-security-list-404.php:143 +#: admin/wp-security-list-acct-activity.php:92 +#: admin/wp-security-list-comment-spammer-ip.php:95 +#: admin/wp-security-list-locked-ip.php:97 +#: admin/wp-security-list-locked-ip.php:105 +#: admin/wp-security-list-login-fails.php:85 +#: admin/wp-security-list-permanent-blocked-ip.php:96 +#: admin/wp-security-list-registered-users.php:107 +#: admin/wp-security-list-registered-users.php:115 +#: admin/wp-security-list-registered-users.php:123 +msgid "Please select some records using the checkboxes" +msgstr "" + +#: admin/wp-security-list-404.php:278 +msgid "Nonce check failed for delete selected 404 event logs operation!" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:35 +msgid "Are you sure you want to delete this item?" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:46 +msgid "Login session still active" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:60 +#: admin/wp-security-list-locked-ip.php:60 +#: admin/wp-security-list-logged-in-users.php:44 +#: admin/wp-security-list-login-fails.php:54 +#: admin/wp-security-list-registered-users.php:69 +msgid "User ID" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:61 +#: admin/wp-security-list-locked-ip.php:61 +#: admin/wp-security-list-login-fails.php:55 +msgid "Username" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:62 +msgid "Login date" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:63 +msgid "Logout date" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:136 +msgid "Nonce check failed for delete selected account activity logs operation!" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:59 +msgid "Spammer IP" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:60 +msgid "Number of spam comments from this IP" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:61 +msgid "Status" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:81 +msgid "Block" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:130 +#: admin/wp-security-list-comment-spammer-ip.php:179 +msgid "Nonce check failed for delete selected blocked IP operation!" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:137 +msgid "The selected IP addresses are now permanently blocked!" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:193 +msgid "The selected IP addresses were saved in the blacklist configuration settings." +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:201 +msgid "The .htaccess file was successfully modified to include the selected IP addresses." +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:212 +msgid "NOTE: The .htaccess file was not modified because you have disabled the \"Enable IP or User Agent Blacklisting\" check box." +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:213 +msgid "To block these IP addresses you will need to enable the above flag in the %s menu" +msgstr "" + +#: admin/wp-security-list-debug.php:47 +msgid "Level" +msgstr "" + +#: admin/wp-security-list-debug.php:48 +msgid "Message" +msgstr "" + +#: admin/wp-security-list-debug.php:49 +msgid "Type" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:36 +#: admin/wp-security-list-locked-ip.php:83 +msgid "Unlock" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:59 +msgid "Locked IP/range" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:62 +#: admin/wp-security-list-permanent-blocked-ip.php:67 +msgid "Reason" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:63 +msgid "Date locked" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:64 +msgid "Release date" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:134 +msgid "The selected IP entries were unlocked successfully." +msgstr "" + +#: admin/wp-security-list-locked-ip.php:140 +msgid "Nonce check failed for unlock IP operation!" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:147 +msgid "The selected IP entry was unlocked successfully." +msgstr "" + +#: admin/wp-security-list-logged-in-users.php:45 +#: admin/wp-security-list-registered-users.php:70 +msgid "Login name" +msgstr "" + +#: admin/wp-security-list-logged-in-users.php:87 +msgid "Nonce check failed for force user logout operation!" +msgstr "" + +#: admin/wp-security-list-logged-in-users.php:96 +msgid "The selected user was logged out successfully!" +msgstr "" + +#: admin/wp-security-list-login-fails.php:53 +msgid "Login IP range" +msgstr "" + +#: admin/wp-security-list-login-fails.php:130 +msgid "Nonce check failed for delete failed login record operation!" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:66 +msgid "Blocked IP" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:87 +msgid "Unblock" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:122 +#: admin/wp-security-list-permanent-blocked-ip.php:139 +msgid "Successfully unblocked and deleted the selected record(s)." +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:126 +#: admin/wp-security-list-permanent-blocked-ip.php:143 +msgid "Failed to unblock and delete the selected record(s)." +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:133 +msgid "Nonce check failed for unblock IP operation!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:71 +msgid "Email" +msgstr "" + +#: admin/wp-security-list-registered-users.php:72 +msgid "Register date" +msgstr "" + +#: admin/wp-security-list-registered-users.php:73 +msgid "Account status" +msgstr "" + +#: admin/wp-security-list-registered-users.php:92 +msgid "Approve" +msgstr "" + +#: admin/wp-security-list-registered-users.php:94 +msgid "Block IP" +msgstr "" + +#: admin/wp-security-list-registered-users.php:159 +msgid "The selected accounts were approved successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:163 +msgid "The following accounts failed to update successfully: " +msgstr "" + +#: admin/wp-security-list-registered-users.php:171 +msgid "The selected account was approved successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:190 +msgid "Your account is now active" +msgstr "" + +#: admin/wp-security-list-registered-users.php:191 +msgid "Your account with username: " +msgstr "" + +#: admin/wp-security-list-registered-users.php:191 +msgid " is now active" +msgstr "" + +#: admin/wp-security-list-registered-users.php:222 +msgid "The selected accounts were deleted successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:230 +msgid "Nonce check failed for delete registered user account operation!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:238 +msgid "The selected account was deleted successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:264 +msgid "The selected IP addresses were successfully added to the permanent block list!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:265 +#: admin/wp-security-list-registered-users.php:282 +msgid "View Blocked IPs" +msgstr "" + +#: admin/wp-security-list-registered-users.php:274 +msgid "Nonce check failed for block IP operation of registered user!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:281 +msgid "The selected IP was successfully added to the permanent block list!" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:25 +msgid "Visitor lockout" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:85 +msgid "Site lockout feature settings saved!" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:92 +msgid "General visitor lockout" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:98 +msgid "This feature allows you to put your site into \"maintenance mode\" by locking down the front-end to all visitors except logged in users with super admin privileges." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:99 +msgid "Locking your site down to general visitors can be useful if you are investigating some issues on your site or perhaps you might be doing some maintenance and wish to keep out all traffic for security reasons." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:104 +msgid "Enable front-end lockout" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:107 +msgid "Check this if you want all visitors except those who are logged in as administrator to be locked out of the front-end of your site." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:111 +msgid "Enter a message:" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:123 +msgid "Enter a message you wish to display to visitors when your site is in maintenance mode." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:130 +msgid "Save site lockout settings" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:28 +msgid "Copy protection" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:29 +msgid "Frames" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:30 +msgid "Users enumeration" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:31 +msgid "WP REST API" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:89 +msgid "Copy Protection feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:94 +msgid "Disable the ability to copy text" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:100 +msgid "This feature allows you to disable the ability to select and copy text from your front end." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:101 +msgid "When admin user is logged in, the feature is automatically disabled for his session." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:106 +msgid "Enable copy protection" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:109 +msgid "Check this if you want to disable the \"Right click\", \"Text selection\" and \"Copy\" option on the front end of your site." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:116 +msgid "Save copy protection settings" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:140 +msgid "Frame Display Prevention feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:145 +msgid "Prevent your site from being displayed in a frame" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:151 +msgid "This feature allows you to prevent other sites from displaying any of your content via a frame or iframe." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:152 +msgid "When enabled, this feature will set the \"X-Frame-Options\" parameter to \"sameorigin\" in the HTTP header." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:157 +msgid "Enable iFrame protection" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:160 +msgid "Check this if you want to stop other sites from displaying your content in a frame or iframe." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:191 +msgid "Users Enumeration Prevention feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:196 +msgid "Prevent users enumeration" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:202 +msgid "This feature allows you to prevent external users/bots from fetching the user info with urls like \"/?author=1\"." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:203 +msgid "When enabled, this feature will print a \"forbidden\" error rather than the user information." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:208 +msgid "Disable users enumeration" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:211 +msgid "Check this if you want to stop users enumeration." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:242 +msgid "WP REST API Security feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:253 +msgid "This feature allows you to block WordPress REST API access for unauthorized requests." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:254 +msgid "When enabled this feature will only allow REST requests to be processed if the user is logged in." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:260 +msgid "Beware that if you are using other plugins which have registered REST endpoints (eg, Contact Form 7), then this feature will also block REST requests used by these plugins if the user is not logged in. It is recommended that you leave this feature disabled if you want uninterrupted functionality for such plugins." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:268 +msgid "Disallow unauthorized REST requests" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:271 +msgid "Check this if you want to stop REST API access for non-logged in requests." +msgstr "" + +#: admin/wp-security-settings-menu.php:25 +msgid "General settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:29 +#: admin/wp-security-settings-menu.php:33 +msgid "file" +msgstr "" + +#: admin/wp-security-settings-menu.php:37 +msgid "Delete plugin settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:41 +msgid "WP version info" +msgstr "" + +#: admin/wp-security-settings-menu.php:45 +msgid "Import/Export" +msgstr "" + +#: admin/wp-security-settings-menu.php:52 +msgid "Advanced settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:128 +msgid "All the security features have been disabled successfully!" +msgstr "" + +#: admin/wp-security-settings-menu.php:132 +#: admin/wp-security-settings-menu.php:159 +msgid "Could not write to the .htaccess file. Please restore your .htaccess file manually using the restore functionality in the \".htaccess File\"." +msgstr "" + +#: admin/wp-security-settings-menu.php:137 +msgid "Could not write to the wp-config.php. Please restore your wp-config.php file manually using the restore functionality in the \"wp-config.php File\"." +msgstr "" + +#: admin/wp-security-settings-menu.php:155 +msgid "All firewall rules have been disabled successfully!" +msgstr "" + +#: admin/wp-security-settings-menu.php:177 +msgid "Deletion of aio_wp_security_configs option and .htaccess directives failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:179 +msgid "Reset of aio_wp_security_configs option failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:181 +msgid "Deletion of .htaccess directives failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:183 +msgid "All settings have been successfully reset." +msgstr "" + +#: admin/wp-security-settings-menu.php:203 +msgid "For information, updates and documentation, please visit the" +msgstr "" + +#: admin/wp-security-settings-menu.php:203 +msgid "Page" +msgstr "" + +#: admin/wp-security-settings-menu.php:204 +msgid "Follow us" +msgstr "" + +#: admin/wp-security-settings-menu.php:204 +msgid "on Twitter, Google+ or via Email to stay up to date about the new security features of this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:208 +msgid "WP Security plugin" +msgstr "" + +#: admin/wp-security-settings-menu.php:212 +msgid "Thank you for using the AIOS security plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:216 +msgid "There are a lot of security features in this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:221 +msgid "To start, go through each security option and enable the \"basic\" options." +msgstr "" + +#: admin/wp-security-settings-menu.php:225 +msgid "The more features you enable, the more security points you will achieve." +msgstr "" + +#: admin/wp-security-settings-menu.php:228 +msgid "Before doing anything we advise taking a backup of your .htaccess file, database and wp-config.php." +msgstr "" + +#: admin/wp-security-settings-menu.php:231 +msgid "Backup your database" +msgstr "" + +#: admin/wp-security-settings-menu.php:232 +#: admin/wp-security-settings-menu.php:433 +msgid "Backup .htaccess file" +msgstr "" + +#: admin/wp-security-settings-menu.php:233 +#: admin/wp-security-settings-menu.php:534 +msgid "Backup wp-config.php file" +msgstr "" + +#: admin/wp-security-settings-menu.php:240 +msgid "Disable security features" +msgstr "" + +#: admin/wp-security-settings-menu.php:246 +msgid "If you think that some plugin functionality on your site is broken due to a security feature you enabled in this plugin, then use the following option to turn off all the security features of this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:250 +msgid "Disable all security features" +msgstr "" + +#: admin/wp-security-settings-menu.php:257 +#: admin/wp-security-settings-menu.php:267 +msgid "Disable all firewall rules" +msgstr "" + +#: admin/wp-security-settings-menu.php:263 +msgid "This feature will disable all firewall rules which are currently active in this plugin and it will also delete these rules from your .htacess file. Use it if you think one of the firewall rules is causing an issue on your site." +msgstr "" + +#: admin/wp-security-settings-menu.php:274 +#: admin/wp-security-settings-menu.php:287 +msgid "Reset settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:279 +msgid "This button click will delete all of your settings related to the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:280 +msgid "This button click will reset/empty all the database tables of the security plugin also." +msgstr "" + +#: admin/wp-security-settings-menu.php:281 +msgid "Use this plugin if you were locked out by the All In One WP Security & Firewall Plugin and/or you are having issues logging in when that plugin is activated." +msgstr "" + +#: admin/wp-security-settings-menu.php:282 +msgid "In addition to the settings it will also delete any directives which were added to the .htaccess file by the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:283 +msgid "%1$sNOTE: %2$sAfter deleting the settings you will need to re-configure the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:295 +msgid "Debug settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:301 +msgid "This setting allows you to enable/disable debug for this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:307 +msgid "Enable debug" +msgstr "" + +#: admin/wp-security-settings-menu.php:310 +msgid "Check this if you want to enable debug. You should keep this option disabled after you have finished debugging the issue." +msgstr "" + +#: admin/wp-security-settings-menu.php:314 +msgid "Save debug settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:350 +msgid "Your .htaccess file was successfully backed up! Using an FTP program go to the \"/wp-content/aiowps_backups\" directory to save a copy of the file to your computer." +msgstr "" + +#: admin/wp-security-settings-menu.php:356 +msgid "htaccess file rename failed during backup. Please check your root directory for the backup file using FTP." +msgstr "" + +#: admin/wp-security-settings-menu.php:362 +msgid "htaccess backup failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:377 +msgid "Please choose a .htaccess to restore from." +msgstr "" + +#: admin/wp-security-settings-menu.php:392 +msgid "htaccess file restore failed. Please attempt to restore the .htaccess manually using FTP." +msgstr "" + +#: admin/wp-security-settings-menu.php:396 +msgid "Your .htaccess file has successfully been restored!" +msgstr "" + +#: admin/wp-security-settings-menu.php:402 +msgid "htaccess Restore operation failed! Please check the contents of the file you are trying to restore from." +msgstr "" + +#: admin/wp-security-settings-menu.php:408 +msgid ".htaccess file operations" +msgstr "" + +#: admin/wp-security-settings-menu.php:411 +msgid "Your \".htaccess\" file is a key component of your website's security and it can be modified to implement various levels of protection mechanisms." +msgstr "" + +#: admin/wp-security-settings-menu.php:412 +msgid "This feature allows you to backup and save your currently active .htaccess file should you need to re-use the the backed up file in the future." +msgstr "" + +#: admin/wp-security-settings-menu.php:413 +msgid "You can also restore your site's .htaccess settings using a backed up .htaccess file." +msgstr "" + +#: admin/wp-security-settings-menu.php:428 +msgid "Save the current .htaccess file" +msgstr "" + +#: admin/wp-security-settings-menu.php:432 +msgid "Click the button below to backup and save the currently active .htaccess file." +msgstr "" + +#: admin/wp-security-settings-menu.php:437 +msgid "Restore from a backed up .htaccess file" +msgstr "" + +#: admin/wp-security-settings-menu.php:443 +msgid ".htaccess file to restore from" +msgstr "" + +#: admin/wp-security-settings-menu.php:445 +msgid "Select Your htaccess File" +msgstr "" + +#: admin/wp-security-settings-menu.php:449 +msgid "After selecting your file, click the button below to restore your site using the backed up htaccess file (htaccess_backup.txt)." +msgstr "" + +#: admin/wp-security-settings-menu.php:455 +msgid "Restore .htaccess file" +msgstr "" + +#: admin/wp-security-settings-menu.php:477 +msgid "Please choose a wp-config.php file to restore from." +msgstr "" + +#: admin/wp-security-settings-menu.php:493 +msgid "wp-config.php file restore failed. Please attempt to restore this file manually using FTP." +msgstr "" + +#: admin/wp-security-settings-menu.php:497 +msgid "Your wp-config.php file has successfully been restored!" +msgstr "" + +#: admin/wp-security-settings-menu.php:503 +msgid "wp-config.php Restore operation failed! Please check the contents of the file you are trying to restore from." +msgstr "" + +#: admin/wp-security-settings-menu.php:509 +msgid "wp-config.php file operations" +msgstr "" + +#: admin/wp-security-settings-menu.php:512 +msgid "Your \"wp-config.php\" file is one of the most important in your WordPress installation. It is a primary configuration file and contains crucial things such as details of your database and other critical components." +msgstr "" + +#: admin/wp-security-settings-menu.php:513 +msgid "This feature allows you to backup and save your currently active wp-config.php file should you need to re-use the the backed up file in the future." +msgstr "" + +#: admin/wp-security-settings-menu.php:514 +msgid "You can also restore your site's wp-config.php settings using a backed up wp-config.php file." +msgstr "" + +#: admin/wp-security-settings-menu.php:529 +msgid "Save the current wp-config.php file" +msgstr "" + +#: admin/wp-security-settings-menu.php:533 +msgid "Click the button below to backup and download the contents of the currently active wp-config.php file." +msgstr "" + +#: admin/wp-security-settings-menu.php:539 +msgid "Restore from a backed up wp-config file" +msgstr "" + +#: admin/wp-security-settings-menu.php:545 +msgid "wp-config file to restore from" +msgstr "" + +#: admin/wp-security-settings-menu.php:547 +msgid "Select Your wp-config File" +msgstr "" + +#: admin/wp-security-settings-menu.php:551 +msgid "After selecting your file click the button below to restore your site using the backed up wp-config file (wp-config.php.backup.txt)." +msgstr "" + +#: admin/wp-security-settings-menu.php:557 +msgid "Restore wp-config file" +msgstr "" + +#: admin/wp-security-settings-menu.php:591 +msgid "Manage delete plugin settings saved." +msgstr "" + +#: admin/wp-security-settings-menu.php:596 +msgid "Manage delete plugin tasks" +msgstr "" + +#: admin/wp-security-settings-menu.php:603 +msgid "Delete database tables" +msgstr "" + +#: admin/wp-security-settings-menu.php:606 +msgid "Check this if you want to remove database tables when the plugin is uninstalled." +msgstr "" + +#: admin/wp-security-settings-menu.php:610 +msgid "Delete settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:613 +msgid "Check this if you want to remove all plugin settings when uninstalling the plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:613 +msgid "It will also remove all custom htaccess rules that were added by this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:647 +msgid "WP generator meta tag and version info" +msgstr "" + +#: admin/wp-security-settings-menu.php:650 +msgid "WordPress generator automatically adds some meta information inside the \"head\" tags of every page on your site's front end. Below is an example of this:" +msgstr "" + +#: admin/wp-security-settings-menu.php:652 +msgid "The above meta information shows which version of WordPress your site is currently running and thus can help hackers or crawlers scan your site to see if you have an older version of WordPress or one with a known exploit." +msgstr "" + +#: admin/wp-security-settings-menu.php:653 +msgid "There are also other ways wordpress reveals version info such as during style and script loading. An example of this is:" +msgstr "" + +#: admin/wp-security-settings-menu.php:655 +msgid "This feature will allow you to remove the WP generator meta info and other version info from your site's pages." +msgstr "" + +#: admin/wp-security-settings-menu.php:661 +msgid "WP generator meta info" +msgstr "" + +#: admin/wp-security-settings-menu.php:673 +msgid "Remove WP generator meta info" +msgstr "" + +#: admin/wp-security-settings-menu.php:676 +msgid "Check this if you want to remove the version and meta info produced by WP from all pages" +msgstr "" + +#: admin/wp-security-settings-menu.php:704 +msgid "Please choose a file to import your settings from." +msgstr "" + +#: admin/wp-security-settings-menu.php:736 +msgid "Import AIOS settings from " +msgstr "" + +#: admin/wp-security-settings-menu.php:742 +#: admin/wp-security-settings-menu.php:786 +msgid "The deletion of the import file failed. Please delete this file manually via the media menu for security purposes." +msgstr "" + +#: admin/wp-security-settings-menu.php:744 +#: admin/wp-security-settings-menu.php:788 +msgid "The file you uploaded was also deleted for security purposes because it contains security settings details." +msgstr "" + +#: admin/wp-security-settings-menu.php:759 +msgid "Your AIOS settings were successfully imported via file input." +msgstr "" + +#: admin/wp-security-settings-menu.php:760 +msgid "The deletion of the import file failed. Please delete this file manually via the media menu for security purposes because it contains security settings details." +msgstr "" + +#: admin/wp-security-settings-menu.php:762 +msgid "Your AIOS settings were successfully imported. The file you uploaded was also deleted for security purposes because it contains security settings details." +msgstr "" + +#: admin/wp-security-settings-menu.php:765 +msgid "Your AIOS settings were successfully imported via text entry." +msgstr "" + +#: admin/wp-security-settings-menu.php:780 +msgid "The contents of your settings file appear invalid. Please check the contents of the file you are trying to import settings from." +msgstr "" + +#: admin/wp-security-settings-menu.php:797 +msgid "Export or import your AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:800 +msgid "This section allows you to export or import your All In One WP Security & Firewall settings." +msgstr "" + +#: admin/wp-security-settings-menu.php:801 +msgid "This can be handy if you wanted to save time by applying the settings from one site to another site." +msgstr "" + +#: admin/wp-security-settings-menu.php:802 +msgid "NOTE: Before importing, it is your responsibility to know what settings you are trying to import. Importing settings blindly can cause you to be locked out of your site." +msgstr "" + +#: admin/wp-security-settings-menu.php:803 +msgid "For Example: If a settings item relies on the domain URL then it may not work correctly when imported into a site with a different domain." +msgstr "" + +#: admin/wp-security-settings-menu.php:809 +#: admin/wp-security-settings-menu.php:818 +msgid "Export AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:815 +msgid "To export your All In One WP Security & Firewall settings click the button below." +msgstr "" + +#: admin/wp-security-settings-menu.php:822 +#: admin/wp-security-settings-menu.php:851 +msgid "Import AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:828 +msgid "Use this section to import your All In One WP Security & Firewall settings from a file. Alternatively, copy/paste the contents of your import file into the textarea below." +msgstr "" + +#: admin/wp-security-settings-menu.php:830 +msgid "Import file" +msgstr "" + +#: admin/wp-security-settings-menu.php:833 +msgid "Select Your Import Settings File" +msgstr "" + +#: admin/wp-security-settings-menu.php:837 +msgid "After selecting your file, click the button below to apply the settings to your site." +msgstr "" + +#: admin/wp-security-settings-menu.php:844 +msgid "Copy/Paste import data" +msgstr "" + +#: admin/wp-security-settings-menu.php:893 +msgid "Default - if correct, then this is the best option" +msgstr "" + +#: admin/wp-security-settings-menu.php:894 +msgid "Only use if you're using Cloudflare." +msgstr "" + +#: admin/wp-security-settings-menu.php:902 +msgid "(current value: %s)" +msgstr "" + +#: admin/wp-security-settings-menu.php:905 +msgid "no value (i.e. empty) on your server" +msgstr "" + +#: admin/wp-security-spam-menu.php:28 +msgid "Comment spam" +msgstr "" + +#: admin/wp-security-spam-menu.php:29 +msgid "Comment spam IP monitoring" +msgstr "" + +#: admin/wp-security-spam-menu.php:30 +msgid "BuddyPress" +msgstr "" + +#: admin/wp-security-spam-menu.php:31 +msgid "bbPress" +msgstr "" + +#: admin/wp-security-spam-menu.php:57 +msgid "Spam prevention" +msgstr "" + +#: admin/wp-security-spam-menu.php:99 +msgid "You entered a non numeric value for the \"move spam comments to trash after number of days\" field." +msgstr "" + +#: admin/wp-security-spam-menu.php:99 +#: admin/wp-security-spam-menu.php:297 +#: admin/wp-security-user-login-menu.php:118 +#: admin/wp-security-user-login-menu.php:124 +#: admin/wp-security-user-login-menu.php:130 +#: admin/wp-security-user-login-menu.php:136 +msgid "It has been set to the default value." +msgstr "" + +#: admin/wp-security-spam-menu.php:129 +msgid "Comment spam settings" +msgstr "" + +#: admin/wp-security-spam-menu.php:134 +msgid "Add CAPTCHA to comments form" +msgstr "" + +#: admin/wp-security-spam-menu.php:138 +msgid "This feature will add a CAPTCHA field in the WordPress comments form." +msgstr "" + +#: admin/wp-security-spam-menu.php:139 +msgid "Adding a CAPTCHA field in the comment form is a simple way of greatly reducing spam comments from bots without using .htaccess rules." +msgstr "" + +#: admin/wp-security-spam-menu.php:148 +msgid "Enable CAPTCHA on comment forms" +msgstr "" + +#: admin/wp-security-spam-menu.php:151 +msgid "Check this if you want to insert a CAPTCHA field on the comment forms." +msgstr "" + +#: admin/wp-security-spam-menu.php:158 +msgid "Block spambot comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:162 +msgid "A large portion of WordPress blog comment spam is mainly produced by automated bots and not necessarily by humans." +msgstr "" + +#: admin/wp-security-spam-menu.php:163 +msgid "This feature will greatly minimize the useless and unnecessary traffic and load on your server resulting from spam comments by blocking all comment requests which do not originate from your domain." +msgstr "" + +#: admin/wp-security-spam-menu.php:164 +msgid "In other words, if the comment was not submitted by a human who physically submitted the comment on your site, the request will be blocked." +msgstr "" + +#: admin/wp-security-spam-menu.php:182 +msgid "Block spambots from posting comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:185 +msgid "Check this if you want to apply a firewall rule which will block comments originating from spambots." +msgstr "" + +#: admin/wp-security-spam-menu.php:189 +msgid "This feature will implement a firewall rule to block all comment attempts which do not originate from your domain." +msgstr "" + +#: admin/wp-security-spam-menu.php:190 +msgid "A legitimate comment is one which is submitted by a human who physically fills out the comment form and clicks the submit button. For such events, the HTTP_REFERRER is always set to your own domain." +msgstr "" + +#: admin/wp-security-spam-menu.php:191 +msgid "A comment submitted by a spambot is done by directly calling the comments.php file, which usually means that the HTTP_REFERRER value is not your domain and often times empty." +msgstr "" + +#: admin/wp-security-spam-menu.php:192 +msgid "This feature will check and block comment requests which are not referred by your domain thus greatly reducing your overall blog spam and PHP requests done by the server to process these comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:202 +msgid "Comment processing" +msgstr "" + +#: admin/wp-security-spam-menu.php:207 +msgid "Trash spam comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:216 +msgid "Move spam comments to trash after %s days." +msgstr "" + +#: admin/wp-security-spam-menu.php:224 +msgid "Enable this feature in order to move the spam comments to trash after given number of days." +msgstr "" + +#: admin/wp-security-spam-menu.php:262 +msgid "You entered a non numeric value for the minimum number of spam comments field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-spam-menu.php:265 +msgid "You must enter an integer greater than zero for minimum number of spam comments field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-spam-menu.php:292 +msgid "Nonce check failed for list spam comment IPs." +msgstr "" + +#: admin/wp-security-spam-menu.php:297 +msgid "You entered a non numeric value for the minimum spam comments per IP field." +msgstr "" + +#: admin/wp-security-spam-menu.php:308 +msgid "Displaying results for IP addresses which have posted a minimum of %s spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:323 +msgid "Auto block spammer IPs" +msgstr "" + +#: admin/wp-security-spam-menu.php:328 +msgid "This feature has detected that %s is not active. It is highly recommended that you activate the Akismet plugin to make the most of this feature." +msgstr "" + +#: admin/wp-security-spam-menu.php:337 +msgid "This feature allows you to automatically and permanently block IP addresses which have exceeded a certain number of comments labelled as spam." +msgstr "" + +#: admin/wp-security-spam-menu.php:338 +msgid "Comments are usually labelled as spam either by the Akismet plugin or manually by the WP administrator when they mark a comment as \"spam\" from the WordPress Comments menu." +msgstr "" + +#: admin/wp-security-spam-menu.php:352 +msgid "You currently have no IP addresses permanently blocked due to spam." +msgstr "" + +#: admin/wp-security-spam-menu.php:365 +msgid "Spammer IPs added to permanent block list today: " +msgstr "" + +#: admin/wp-security-spam-menu.php:366 +msgid "All time total: " +msgstr "" + +#: admin/wp-security-spam-menu.php:367 +msgid "View blocked IPs" +msgstr "" + +#: admin/wp-security-spam-menu.php:380 +msgid "Enable auto block of spam comment IPs" +msgstr "" + +#: admin/wp-security-spam-menu.php:383 +msgid "Check this box if you want this plugin to automatically block IP addresses which submit spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:387 +msgid "Minimum number of spam comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:389 +msgid "Specify the minimum number of spam comments for an IP address before it is permanently blocked." +msgstr "" + +#: admin/wp-security-spam-menu.php:393 +msgid "Example 1: Setting this value to \"1\" will block ALL IP addresses which were used to submit at least one spam comment." +msgstr "" + +#: admin/wp-security-spam-menu.php:394 +msgid "Example 2: Setting this value to \"5\" will block only those IP addresses which were used to submit 5 spam comments or more on your site." +msgstr "" + +#: admin/wp-security-spam-menu.php:412 +msgid "List spammer IP addresses" +msgstr "" + +#: admin/wp-security-spam-menu.php:416 +msgid "This section displays a list of the IP addresses of the people or bots who have left spam comments on your site." +msgstr "" + +#: admin/wp-security-spam-menu.php:417 +msgid "This information can be handy for identifying the most persistent IP addresses or ranges used by spammers." +msgstr "" + +#: admin/wp-security-spam-menu.php:418 +msgid "By inspecting the IP address data coming from spammers you will be in a better position to determine which addresses or address ranges you should block by adding them to the permanent block list." +msgstr "" + +#: admin/wp-security-spam-menu.php:419 +msgid "To add one or more of the IP addresses displayed in the table below to your blacklist, simply click the \"Block\" link for the individual row or select more than one address using the checkboxes and then choose the \"block\" option from the Bulk Actions dropdown list and click the \"Apply\" button." +msgstr "" + +#: admin/wp-security-spam-menu.php:427 +msgid "Minimum number of spam comments per IP" +msgstr "" + +#: admin/wp-security-spam-menu.php:429 +msgid "This field allows you to list only those IP addresses which have been used to post X or more spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:433 +msgid "Example 1: Setting this value to \"0\" or \"1\" will list ALL IP addresses which were used to submit spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:434 +msgid "Example 2: Setting this value to \"5\" will list only those IP addresses which were used to submit 5 spam comments or more on your site." +msgstr "" + +#: admin/wp-security-spam-menu.php:441 +msgid "Find IP addresses" +msgstr "" + +#: admin/wp-security-spam-menu.php:445 +msgid "Spammer IP address results" +msgstr "" + +#: admin/wp-security-spam-menu.php:451 +#: classes/wp-security-utility.php:253 +msgid "The plugin has detected that you are using a Multi-Site WordPress installation." +msgstr "" + +#: admin/wp-security-spam-menu.php:452 +msgid "Only the \"superadmin\" can block IP addresses from the main site." +msgstr "" + +#: admin/wp-security-spam-menu.php:453 +msgid "Take note of the IP addresses you want blocked and ask the superadmin to add these to the blacklist using the \"Blacklist Manager\" on the main site." +msgstr "" + +#: admin/wp-security-spam-menu.php:498 +msgid "BuddyPress spam settings" +msgstr "" + +#: admin/wp-security-spam-menu.php:503 +msgid "Add CAPTCHA to BuddyPress registration form" +msgstr "" + +#: admin/wp-security-spam-menu.php:507 +msgid "This feature will add a simple math CAPTCHA field in the BuddyPress registration form." +msgstr "" + +#: admin/wp-security-spam-menu.php:508 +msgid "Adding a CAPTCHA field in the registration form is a simple way of greatly reducing spam signups from bots without using .htaccess rules." +msgstr "" + +#: admin/wp-security-spam-menu.php:518 +msgid "Enable CAPTCHA on BuddyPress registration form" +msgstr "" + +#: admin/wp-security-spam-menu.php:521 +msgid "Check this if you want to insert a CAPTCHA field on the BuddyPress registration forms." +msgstr "" + +#: admin/wp-security-spam-menu.php:530 +msgid "BuddyPress is not active! In order to use this feature you will need to have BuddyPress installed and activated." +msgstr "" + +#: admin/wp-security-spam-menu.php:560 +msgid "bbPress spam settings" +msgstr "" + +#: admin/wp-security-spam-menu.php:565 +msgid "Add CAPTCHA to bbPress new topic form" +msgstr "" + +#: admin/wp-security-spam-menu.php:569 +msgid "This feature will add a simple math CAPTCHA field in the bbPress new topic form." +msgstr "" + +#: admin/wp-security-spam-menu.php:570 +msgid "Adding a CAPTCHA field in this form is a simple way of greatly reducing spam submitted from bots." +msgstr "" + +#: admin/wp-security-spam-menu.php:580 +msgid "Enable CAPTCHA on bbPress new topic form" +msgstr "" + +#: admin/wp-security-spam-menu.php:583 +msgid "Check this if you want to insert a CAPTCHA field on the bbPress new topic forms." +msgstr "" + +#: admin/wp-security-spam-menu.php:592 +msgid "bbPress is not active. In order to use this feature you will need to have bbPress installed and activated." +msgstr "" + +#: admin/wp-security-tools-menu.php:34 +msgid "WHOIS lookup" +msgstr "" + +#: admin/wp-security-tools-menu.php:95 +#: admin/wp-security-tools-menu.php:136 +msgid "Querying %s: %s" +msgstr "" + +#: admin/wp-security-tools-menu.php:103 +#: admin/wp-security-tools-menu.php:112 +#: admin/wp-security-tools-menu.php:151 +msgid "Redirected to %s" +msgstr "" + +#: admin/wp-security-tools-menu.php:173 +msgid "The WHOIS lookup feature gives you a way to look up who owns an IP address or domain name." +msgstr "" + +#: admin/wp-security-tools-menu.php:173 +msgid "You can use this to investigate users engaging in malicious activity on your site." +msgstr "" + +#: admin/wp-security-tools-menu.php:176 +msgid "WHOIS lookup on IP or domain" +msgstr "" + +#: admin/wp-security-tools-menu.php:183 +msgid "IP address or domain name:" +msgstr "" + +#: admin/wp-security-tools-menu.php:190 +msgid "Look up IP or domain" +msgstr "" + +#: admin/wp-security-tools-menu.php:219 +msgid "Please enter a valid IP address or domain name to look up." +msgstr "" + +#: admin/wp-security-tools-menu.php:220 +#: admin/wp-security-tools-menu.php:226 +msgid "Nothing to show." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:32 +msgid "WP username" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:33 +msgid "Display name" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:34 +msgid "Password" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:60 +msgid "User accounts" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:82 +msgid "Admin user security" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:85 +msgid "By default, WordPress sets the administrator username to \"admin\" at installation time." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:86 +msgid "A lot of hackers try to take advantage of this information by attempting \"Brute force login attacks\" where they repeatedly try to guess the password by using \"admin\" for username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:87 +msgid "From a security perspective, changing the default \"admin\" user name is one of the first and smartest things you should do on your site." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:88 +msgid "This feature will allow you to change your default \"admin\" user name to a more secure name of your choosing." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:95 +msgid "List of administrator accounts" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:104 +#: classes/grade-system/wp-security-feature-item-manager.php:43 +msgid "Change admin username" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:112 +msgid "Your site currently has an account which uses the default \"admin\" username. It is highly recommended that you change this name to something else. Use the following field to change the admin username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:118 +msgid "New admin username" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:120 +msgid "Choose a new username for admin." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:124 +msgid "Change username" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:126 +msgid "NOTE: If you are currently logged in as \"admin\" you will be automatically logged out after changing your username and will be required to log back in." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:133 +msgid "No action required! " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:135 +msgid "Your site does not have any account which uses the default \"admin\" username. " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:136 +msgid "This is good security practice." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:148 +msgid "Display name security" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:151 +msgid "When you submit a post or answer a comment, WordPress will usually display your \"nickname\"." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:152 +msgid "By default the nickname is set to the login (or user) name of your account." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:153 +msgid "From a security perspective, leaving your nickname the same as your user name is bad practice because it gives a hacker at least half of your account's login credentials." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:154 +msgid "Therefore to further tighten your site's security you are advised to change your nickname and Display name to be different from your Username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:160 +msgid "Modify accounts with identical login name and display name" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:169 +msgid "Your site currently has the following accounts which have an identical login name and display name." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:170 +msgid "Follow the link to edit the user profile of that particular user account, change Nickname, choose a different Display name compared to Username, and press the \"Update User\" button.)" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:185 +msgid "No action required." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:186 +msgid "Your site does not have a user account where the display name is identical to the username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:197 +msgid "Password tool" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:200 +msgid "Poor password selection is one of the most common weak points of many sites and is usually the first thing a hacker will try to exploit when attempting to break into your site." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:201 +msgid "Many people fall into the trap of using a simple word or series of numbers as their password. Such a predictable and simple password would take a competent hacker merely minutes to guess your password by using a simple script which cycles through the easy and most common combinations." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:202 +msgid "The longer and more complex your password is the harder it is for hackers to \"crack\" because more complex passwords require much greater computing power and time." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:203 +msgid "This section contains a useful password strength tool which you can use to check whether your password is sufficiently strong enough." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:208 +msgid "Password strength tool" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:210 +msgid "This password tool uses an algorithm which calculates how long it would take for your password to be cracked using the computing power of an off-the-shelf current model desktop PC with high end processor, graphics card and appropriate password cracking software." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:213 +msgid "Start typing a password." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:216 +msgid "It would take a desktop PC approximately" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:217 +msgid "1 sec" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:217 +msgid "to crack your password!" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:222 +msgid "Password Strength" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:245 +msgid "Username " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:245 +msgid " already exists. Please enter another value. " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:262 +msgid "The database update operation of the user account failed!" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:291 +msgid "You entered an invalid username. Please enter another value. " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:295 +msgid "Please enter a value for your username. " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:302 +msgid "Username successfully changed." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:322 +msgid "Account login name" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:331 +msgid "Edit user" +msgstr "" + +#: admin/wp-security-user-login-menu.php:54 +#: admin/wp-security-user-login-menu.php:474 +msgid "Failed login records" +msgstr "" + +#: admin/wp-security-user-login-menu.php:55 +#: classes/grade-system/wp-security-feature-item-manager.php:51 +msgid "Force logout" +msgstr "" + +#: admin/wp-security-user-login-menu.php:56 +#: admin/wp-security-user-login-menu.php:632 +msgid "Account activity logs" +msgstr "" + +#: admin/wp-security-user-login-menu.php:58 +#: admin/wp-security-user-login-menu.php:769 +msgid "Additional settings" +msgstr "" + +#: admin/wp-security-user-login-menu.php:81 +msgid "User login" +msgstr "" + +#: admin/wp-security-user-login-menu.php:118 +msgid "You entered a non-numeric value for the max login attempts field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:124 +msgid "You entered a non numeric value for the login retry time period field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:130 +msgid "You entered a non numeric value for the lockout time length field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:136 +msgid "You entered a non numeric value for the maximum lockout time length field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:141 +msgid "You entered an invalid minimum lockout time length, it must be less than the maximum lockout time length value." +msgstr "" + +#: admin/wp-security-user-login-menu.php:141 +msgid "Both have been set to the default values." +msgstr "" + +#: admin/wp-security-user-login-menu.php:160 +msgid "Please fill in one or more email addresses to notify." +msgstr "" + +#: admin/wp-security-user-login-menu.php:162 +msgid "You have entered one or more invalid email addresses." +msgstr "" + +#: admin/wp-security-user-login-menu.php:165 +msgid "It has been set to your WordPress admin email as default." +msgstr "" + +#: admin/wp-security-user-login-menu.php:250 +msgid "Login lockout configuration" +msgstr "" + +#: admin/wp-security-user-login-menu.php:254 +msgid "One of the ways hackers try to compromise sites is via a " +msgstr "" + +#: admin/wp-security-user-login-menu.php:254 +msgid "Brute force login attack" +msgstr "" + +#: admin/wp-security-user-login-menu.php:254 +msgid "This is where attackers use repeated login attempts until they guess the password." +msgstr "" + +#: admin/wp-security-user-login-menu.php:255 +msgid "Apart from choosing strong passwords, monitoring and blocking IP addresses which are involved in repeated login failures in a short period of time is a very effective way to stop these types of attacks." +msgstr "" + +#: admin/wp-security-user-login-menu.php:256 +msgid "You may also want to checkout our %s feature for another secure way to protect against these types of attacks." +msgstr "" + +#: admin/wp-security-user-login-menu.php:261 +msgid "Login lockout options" +msgstr "" + +#: admin/wp-security-user-login-menu.php:272 +msgid "Enable login lockout feature" +msgstr "" + +#: admin/wp-security-user-login-menu.php:275 +msgid "Check this if you want to enable the login lockout feature and apply the settings below" +msgstr "" + +#: admin/wp-security-user-login-menu.php:279 +msgid "Allow unlock requests" +msgstr "" + +#: admin/wp-security-user-login-menu.php:282 +msgid "Check this if you want to allow users to generate an automated unlock request link which will unlock their account" +msgstr "" + +#: admin/wp-security-user-login-menu.php:286 +msgid "Max login attempts" +msgstr "" + +#: admin/wp-security-user-login-menu.php:288 +msgid "Set the value for the maximum login retries before IP address is locked out" +msgstr "" + +#: admin/wp-security-user-login-menu.php:292 +msgid "Login retry time period (min)" +msgstr "" + +#: admin/wp-security-user-login-menu.php:294 +msgid "If the maximum number of failed login attempts for a particular IP address occur within this time period the plugin will lock out that address" +msgstr "" + +#: admin/wp-security-user-login-menu.php:299 +msgid "Minimum lockout time length" +msgstr "" + +#: admin/wp-security-user-login-menu.php:305 +msgid "Set the minimum time period in minutes of lockout." +msgstr "" + +#: admin/wp-security-user-login-menu.php:306 +msgid "This failed login lockout time will be tripled on each failed login." +msgstr "" + +#: admin/wp-security-user-login-menu.php:313 +msgid "Maximum lockout time length" +msgstr "" + +#: admin/wp-security-user-login-menu.php:318 +msgid "Set the maximum time period in minutes of lockout." +msgstr "" + +#: admin/wp-security-user-login-menu.php:319 +msgid "No IP address will be blocked for more than this time period after making a failed login attempt." +msgstr "" + +#: admin/wp-security-user-login-menu.php:324 +msgid "Display generic error message" +msgstr "" + +#: admin/wp-security-user-login-menu.php:327 +msgid "Check this if you want to show a generic error message when a login attempt fails" +msgstr "" + +#: admin/wp-security-user-login-menu.php:331 +msgid "Instantly lockout invalid usernames" +msgstr "" + +#: admin/wp-security-user-login-menu.php:334 +msgid "Check this if you want to instantly lockout login attempts with usernames which do not exist on your system" +msgstr "" + +#: admin/wp-security-user-login-menu.php:339 +msgid "Instantly lockout specific usernames" +msgstr "" + +#: admin/wp-security-user-login-menu.php:349 +msgid "Insert one username per line. Existing usernames are not blocked even if present in the list." +msgstr "" + +#: admin/wp-security-user-login-menu.php:354 +msgid "Notify by email" +msgstr "" + +#: admin/wp-security-user-login-menu.php:358 +msgid "Check this if you want to receive an email when someone has been locked out due to maximum failed login attempts" +msgstr "" + +#: admin/wp-security-user-login-menu.php:361 +msgid "Fill in one email address per line." +msgstr "" + +#: admin/wp-security-user-login-menu.php:365 +msgid "Each email address must be on a new line." +msgstr "" + +#: admin/wp-security-user-login-menu.php:366 +msgid "If a valid email address has not been filled in, it will not be saved." +msgstr "" + +#: admin/wp-security-user-login-menu.php:367 +msgid "The valid email address format is userid@example.com" +msgstr "" + +#: admin/wp-security-user-login-menu.php:368 +msgid "Example: %s" +msgstr "" + +#: admin/wp-security-user-login-menu.php:375 +msgid "Enable PHP backtrace in email" +msgstr "" + +#: admin/wp-security-user-login-menu.php:379 +msgid "Check this if you want to include the PHP backtrace in notification emails." +msgstr "" + +#: admin/wp-security-user-login-menu.php:379 +msgid "This is internal coding information which makes it easier to investigate where an issued occurred." +msgstr "" + +#: admin/wp-security-user-login-menu.php:389 +msgid "Currently locked out IP address ranges" +msgstr "" + +#: admin/wp-security-user-login-menu.php:394 +msgid "To see a list of all locked IP addresses and ranges go to the %s tab in the dashboard menu." +msgstr "" + +#: admin/wp-security-user-login-menu.php:399 +msgid "Login lockout IP whitelist settings" +msgstr "" + +#: admin/wp-security-user-login-menu.php:405 +msgid "Enable login lockout IP whitelist" +msgstr "" + +#: admin/wp-security-user-login-menu.php:416 +msgid "The addresses specified here will never be blocked by the login lockout feature." +msgstr "" + +#: admin/wp-security-user-login-menu.php:450 +msgid "User login feature - Delete all failed login records operation failed." +msgstr "" + +#: admin/wp-security-user-login-menu.php:452 +msgid "All records from the failed logins table were deleted successfully." +msgstr "" + +#: admin/wp-security-user-login-menu.php:467 +msgid "This tab displays the failed login attempts for your site." +msgstr "" + +#: admin/wp-security-user-login-menu.php:468 +msgid "The information below can be handy if you need to do security investigations because it will show you the IP range, username and ID (if applicable) and the time/date of the failed login attempt." +msgstr "" + +#: admin/wp-security-user-login-menu.php:469 +msgid "Failed login records that are older than %1$d days are purged automatically." +msgstr "" + +#: admin/wp-security-user-login-menu.php:508 +#: admin/wp-security-user-login-menu.php:517 +msgid "Delete all failed login records" +msgstr "" + +#: admin/wp-security-user-login-menu.php:514 +msgid "Click this button if you wish to delete all failed login records in one go." +msgstr "" + +#: admin/wp-security-user-login-menu.php:544 +msgid "You entered a non numeric value for the logout time period field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-user-login-menu.php:569 +msgid "Setting an expiry period for your WP administration session is a simple way to protect against unauthorized access to your site from your computer." +msgstr "" + +#: admin/wp-security-user-login-menu.php:570 +msgid "This feature allows you to specify a time period in minutes after which the admin session will expire and the user will be forced to log back in." +msgstr "" + +#: admin/wp-security-user-login-menu.php:575 +msgid "Force user logout options" +msgstr "" + +#: admin/wp-security-user-login-menu.php:587 +msgid "Enable force WP user logout" +msgstr "" + +#: admin/wp-security-user-login-menu.php:590 +msgid "Check this if you want to force a wp user to be logged out after a configured amount of time" +msgstr "" + +#: admin/wp-security-user-login-menu.php:594 +msgid "Logout the WP user after XX minutes" +msgstr "" + +#: admin/wp-security-user-login-menu.php:596 +msgid "(Minutes) The user will be forced to log back in after this time period has elapased." +msgstr "" + +#: admin/wp-security-user-login-menu.php:625 +msgid "This tab displays the activity for accounts registered with your site that have logged in using the WordPress login form." +msgstr "" + +#: admin/wp-security-user-login-menu.php:626 +msgid "The information below can be handy if you need to do security investigations because it will show you the last 100 recent login events by username, IP address and time/date." +msgstr "" + +#: admin/wp-security-user-login-menu.php:627 +msgid "Account activity logs that are older than %1$d days are purged automatically." +msgstr "" + +#: admin/wp-security-user-login-menu.php:697 +msgid "Refresh logged in user data" +msgstr "" + +#: admin/wp-security-user-login-menu.php:701 +msgid "Refresh data" +msgstr "" + +#: admin/wp-security-user-login-menu.php:706 +msgid "This tab displays all users who are currently logged into your site." +msgstr "" + +#: admin/wp-security-user-login-menu.php:707 +msgid "If you suspect there is a user or users who are logged in which should not be, you can block them by inspecting the IP addresses from the data below and adding them to your blacklist." +msgstr "" + +#: admin/wp-security-user-login-menu.php:708 +msgid "You can also instantly log them out by clicking on the \"Force logout\" link when you hover over the row in the user id column." +msgstr "" + +#: admin/wp-security-user-login-menu.php:713 +msgid "Currently logged in users" +msgstr "" + +#: admin/wp-security-user-login-menu.php:761 +msgid "WordPress 5.6 introduced a new feature called \"Application passwords\"." +msgstr "" + +#: admin/wp-security-user-login-menu.php:762 +msgid "This allows you to create a token from the WordPress dashboard which then can be used in the authorization header." +msgstr "" + +#: admin/wp-security-user-login-menu.php:763 +msgid "This feature allows you to disable application passwords as they can leave your site vulnerable to social engineering and phishing scams." +msgstr "" + +#: admin/wp-security-user-login-menu.php:780 +#: classes/grade-system/wp-security-feature-item-manager.php:53 +msgid "Disable application password" +msgstr "" + +#: admin/wp-security-user-login-menu.php:783 +msgid "Check this if you want to disable the application password." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:27 +msgid "Manual approval" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:28 +#: classes/grade-system/wp-security-feature-item-manager.php:59 +msgid "Registration CAPTCHA" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:29 +msgid "Registration honeypot" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:55 +msgid "User registration" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:115 +msgid "User registration settings" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:119 +msgid "Manually approve new registrations" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:123 +msgid "If your site allows people to create their own accounts via the WordPress registration form, then you can minimize spam or bogus registrations by manually approving each registration." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:124 +msgid "This feature will automatically set a newly registered account to \"pending\" until the administrator activates it. Therefore undesirable registrants will be unable to log in without your express approval." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:125 +msgid "You can view all accounts which have been newly registered via the handy table below and you can also perform bulk activation/deactivation/deletion tasks on each account." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:142 +msgid "Enable manual approval of new registrations" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:145 +msgid "Check this if you want to automatically disable all newly registered accounts so that you can approve them manually." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:154 +msgid "Approve registered users" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:206 +msgid "This feature allows you to add a CAPTCHA form on the WordPress registration page." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:207 +msgid "Users who attempt to register will also need to enter the answer to a simple mathematical question - if they enter the wrong answer, the plugin will not allow them to register." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:208 +msgid "Therefore, adding a CAPTCHA form on the registration page is another effective yet simple spam registration prevention technique." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:212 +msgid "Registration page CAPTCHA settings" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:219 +msgid "The core default behaviour for WordPress Multi Site regarding user registration is that all users are registered via the main site." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:220 +msgid "Therefore, if you would like to add a CAPTCHA form to the registration page for a Multi Site, please go to \"Registration CAPTCHA\" settings on the main site." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:235 +msgid "Enable CAPTCHA on registration page" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:238 +msgid "Check this if you want to insert a CAPTCHA form on the WordPress user registration page (if you allow user registration)." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:276 +msgid "This feature allows you to add a special hidden \"honeypot\" field on the WordPress registration page. This will only be visible to robots and not humans." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:277 +msgid "Since robots usually fill in every input field from a registration form, they will also submit a value for the special hidden honeypot field." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:279 +msgid "Therefore, if the plugin detects that this field has a value when the registration form is submitted, then the robot which is attempting to register on your site will be redirected to its localhost address - http://127.0.0.1." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:285 +msgid "Registration form honeypot settings" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:296 +msgid "Enable honeypot on registration page" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:299 +msgid "Check this if you want to enable the honeypot feature for the registration page" +msgstr "" + +#: classes/aios-ajax.php:89 +msgid "Invalid IP retrieve method." +msgstr "" + +#: classes/aios-ajax.php:131 +#: wp-security-core.php:258 +msgid "The security check failed; try refreshing the page." +msgstr "" + +#: classes/aios-ajax.php:152 +#: wp-security-core.php:268 +msgid "You are not allowed to run this command." +msgstr "" + +#: classes/aios-ajax.php:173 +#: wp-security-core.php:282 +msgid "Options can only be saved by network admin" +msgstr "" + +#: classes/aios-ajax.php:202 +msgid "The command \"%s\" was not found" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:39 +msgid "Remove WP generator meta tag" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:45 +msgid "Change display name" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:57 +msgid "Registration approval" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:61 +msgid "Enable registration honeypot" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:73 +msgid "WordPress files access" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:77 +msgid "IP and user agent blacklisting" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:81 +msgid "Enable basic firewall" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:82 +msgid "Enable pingback vulnerability protection" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:83 +msgid "Block access to debug log file" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:87 +msgid "Forbid proxy comments" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:88 +msgid "Deny bad queries" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:91 +msgid "5G/6G blacklist" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:97 +msgid "Enable IP blocking for 404 detection" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:101 +msgid "Enable rename login page" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:106 +msgid "Lost password CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:107 +msgid "Custom login CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:108 +msgid "Woo login CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:109 +msgid "Woo lost password CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:110 +msgid "Woo register CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:112 +msgid "Login IP whitelisting" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:114 +msgid "Enable login honeypot" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:118 +msgid "Comment CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:119 +msgid "Block spambots" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:121 +msgid "BuddyPress registration CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:123 +msgid "bbPress new topic CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item.php:29 +msgid "Basic" +msgstr "" + +#: classes/grade-system/wp-security-feature-item.php:31 +msgid "Intermediate" +msgstr "" + +#: classes/grade-system/wp-security-feature-item.php:33 +msgid "Advanced" +msgstr "" + +#: classes/wp-security-captcha.php:47 +#: classes/wp-security-general-init-tasks.php:407 +msgid "Please enter an answer in digits:" +msgstr "Kérjük, adja meg a választ számjegyekkel:" + +#: classes/wp-security-captcha.php:127 +msgid "one" +msgstr "egy" + +#: classes/wp-security-captcha.php:128 +msgid "two" +msgstr "kettő" + +#: classes/wp-security-captcha.php:129 +msgid "three" +msgstr "három" + +#: classes/wp-security-captcha.php:130 +msgid "four" +msgstr "négy" + +#: classes/wp-security-captcha.php:131 +msgid "five" +msgstr "öt" + +#: classes/wp-security-captcha.php:132 +msgid "six" +msgstr "hat" + +#: classes/wp-security-captcha.php:133 +msgid "seven" +msgstr "hét" + +#: classes/wp-security-captcha.php:134 +msgid "eight" +msgstr "nyolc" + +#: classes/wp-security-captcha.php:135 +msgid "nine" +msgstr "kilenc" + +#: classes/wp-security-captcha.php:136 +msgid "ten" +msgstr "tíz" + +#: classes/wp-security-captcha.php:137 +msgid "eleven" +msgstr "tizenegy" + +#: classes/wp-security-captcha.php:138 +msgid "twelve" +msgstr "tizenkettő" + +#: classes/wp-security-captcha.php:139 +msgid "thirteen" +msgstr "tizenhárom" + +#: classes/wp-security-captcha.php:140 +msgid "fourteen" +msgstr "tizennégy" + +#: classes/wp-security-captcha.php:141 +msgid "fifteen" +msgstr "tizenöt" + +#: classes/wp-security-captcha.php:142 +msgid "sixteen" +msgstr "tizenhat" + +#: classes/wp-security-captcha.php:143 +msgid "seventeen" +msgstr "tizenhét" + +#: classes/wp-security-captcha.php:144 +msgid "eighteen" +msgstr "tizennyolc" + +#: classes/wp-security-captcha.php:145 +msgid "nineteen" +msgstr "tizenkilenc" + +#: classes/wp-security-captcha.php:146 +msgid "twenty" +msgstr "húsz" + +#: classes/wp-security-cronjob-handler.php:34 +msgid "Every 15 minutes" +msgstr "" + +#: classes/wp-security-debug-logger.php:46 +msgid "Unable to get the reason why" +msgstr "" + +#: classes/wp-security-debug-logger.php:47 +msgid "Unable to clear the logs" +msgstr "" + +#: classes/wp-security-file-scan.php:85 +msgid "All In One WP Security - File change detected!" +msgstr "" + +#: classes/wp-security-file-scan.php:87 +msgid "A file change was detected on your system for site URL" +msgstr "" + +#: classes/wp-security-file-scan.php:87 +msgid ". Scan was generated on" +msgstr "" + +#: classes/wp-security-file-scan.php:88 +msgid "A summary of the scan results is shown below:" +msgstr "" + +#: classes/wp-security-file-scan.php:91 +msgid "Login to your site to view the scan details." +msgstr "" + +#: classes/wp-security-file-scan.php:313 +msgid "The following files were added to your host" +msgstr "" + +#: classes/wp-security-file-scan.php:315 +#: classes/wp-security-file-scan.php:323 +#: classes/wp-security-file-scan.php:332 +msgid "modified on: " +msgstr "" + +#: classes/wp-security-file-scan.php:321 +msgid "The following files were removed from your host" +msgstr "" + +#: classes/wp-security-file-scan.php:330 +msgid "The following files were changed on your host" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:212 +#: classes/wp-security-general-init-tasks.php:481 +msgid "Application passwords have been disabled by All In One WP Security & Firewall plugin." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:428 +#: classes/wp-security-general-init-tasks.php:541 +#: classes/wp-security-general-init-tasks.php:574 +#: classes/wp-security-user-login.php:137 +#: classes/wp-security-user-registration.php:74 +msgid "ERROR: Your answer was incorrect - please try again." +msgstr "HIBA: A válasz helytelen - kérjük, próbálja meg újból." + +#: classes/wp-security-general-init-tasks.php:463 +msgid "Enter something special:" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:476 +msgid "Application passwords" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:485 +msgid "Change setting" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:487 +msgid "Site admin can only change this setting." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:516 +msgid "Error: You entered an incorrect CAPTCHA answer. Please go back and try again." +msgstr "Hiba: Helytelen CAPTCHA választ adott meg. Kérjük menjen vissza és próbálja meg újból." + +#: classes/wp-security-general-init-tasks.php:558 +msgid "Your CAPTCHA answer was incorrect - please try again." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:567 +msgid "ERROR: Your IP address is currently locked please contact the administrator!" +msgstr "" + +#. translators: %s: Admin Dashboard > WP Security > Brute Force > Login CAPTCHA Tab Link +#: classes/wp-security-general-init-tasks.php:642 +msgid "Your Google reCAPTCHA site key is wrong. Please fill the correct reCAPTCHA keys %s to use the Google reCAPTCHA feature." +msgstr "" + +#. translators: %s: Admin Dashboard > WP Security > Brute Force > Login CAPTCHA Tab Link +#: classes/wp-security-general-init-tasks.php:642 +#: classes/wp-security-notices.php:99 +msgid "here" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +msgid "Would you like All In One WP Security & Firewall to re-insert the security rules in your .htaccess file which were cleared when you deactivated the plugin?" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +#: templates/may-also-like.php:40 +#: templates/may-also-like.php:43 +#: templates/may-also-like.php:54 +#: templates/may-also-like.php:57 +#: templates/may-also-like.php:68 +#: templates/may-also-like.php:71 +#: templates/may-also-like.php:91 +#: templates/may-also-like.php:103 +#: templates/may-also-like.php:115 +#: templates/may-also-like.php:127 +#: templates/may-also-like.php:139 +#: templates/may-also-like.php:151 +#: templates/may-also-like.php:168 +#: templates/may-also-like.php:171 +#: templates/may-also-like.php:183 +#: templates/may-also-like.php:195 +#: templates/may-also-like.php:207 +#: templates/may-also-like.php:219 +#: templates/may-also-like.php:231 +#: templates/may-also-like.php:243 +#: templates/may-also-like.php:252 +#: templates/may-also-like.php:255 +#: templates/may-also-like.php:264 +#: templates/may-also-like.php:267 +#: templates/may-also-like.php:279 +#: templates/may-also-like.php:297 +#: templates/may-also-like.php:309 +#: templates/may-also-like.php:327 +#: templates/may-also-like.php:339 +#: templates/may-also-like.php:351 +#: templates/may-also-like.php:368 +#: templates/may-also-like.php:380 +msgid "Yes" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +#: templates/may-also-like.php:88 +#: templates/may-also-like.php:100 +#: templates/may-also-like.php:112 +#: templates/may-also-like.php:124 +#: templates/may-also-like.php:136 +#: templates/may-also-like.php:148 +#: templates/may-also-like.php:180 +#: templates/may-also-like.php:192 +#: templates/may-also-like.php:204 +#: templates/may-also-like.php:216 +#: templates/may-also-like.php:228 +#: templates/may-also-like.php:240 +#: templates/may-also-like.php:276 +#: templates/may-also-like.php:294 +#: templates/may-also-like.php:306 +#: templates/may-also-like.php:324 +#: templates/may-also-like.php:336 +#: templates/may-also-like.php:348 +#: templates/may-also-like.php:365 +#: templates/may-also-like.php:377 +#: templates/notices/custom-notice.php:27 +msgid "No" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:674 +msgid "Your registration is pending approval." +msgstr "" + +#: classes/wp-security-notices.php:25 +msgid "The All in One Security plugin has disabled the login whitelist setting that you have enabled in the past." +msgstr "" + +#: classes/wp-security-notices.php:29 +msgid "Your website is running on an Apache webserver, the login whitelisting might not be functional until the recent update of AIOS (because it relied upon Apache-specific module features)." +msgstr "" + +#: classes/wp-security-notices.php:31 +msgid "Your website is running on a non-Apache webserver, so the login whitelisting was not functional until the recent update of AIOS (because it relied upon Apache-specific features)." +msgstr "" + +#: classes/wp-security-notices.php:33 +msgid "It began working with AIOS version 5.0.8." +msgstr "" + +#: classes/wp-security-notices.php:33 +msgid "We have disabled it so that your login page will not be blocked unexpectedly." +msgstr "" + +#: classes/wp-security-notices.php:42 +msgid "Would you like to re-enable login whitelisting?" +msgstr "" + +#: classes/wp-security-notices.php:48 +msgid "Removed database backup feature from the All In One WP Security & Firewall plugin" +msgstr "" + +#: classes/wp-security-notices.php:50 +msgid "Beginning with version 5.0.0, AIOS has replaced the AIOS backup method with the superior UpdraftPlus method." +msgstr "" + +#: classes/wp-security-notices.php:51 +msgid "It remains free and is fully supported by the UpdraftPlus team." +msgstr "" + +#: classes/wp-security-notices.php:54 +msgid "You are seeing this notice because you have previously set up automated database backups in AIOS." +msgstr "" + +#: classes/wp-security-notices.php:55 +msgid "Would you like to set up scheduled backups with UpdraftPlus?" +msgstr "" + +#: classes/wp-security-notices.php:61 +msgid "Setup UpdraftPlus backup plugin" +msgstr "" + +#: classes/wp-security-notices.php:67 +msgid "Important: set up your IP address detection settings" +msgstr "" + +#: classes/wp-security-notices.php:69 +msgid "The All in One Security plugin couldn't be certain about the correct method to detect the IP address for your site visitors with your currently-configured IP address detection settings." +msgstr "" + +#: classes/wp-security-notices.php:70 +msgid "It is important for your security to set the IP address detection settings properly." +msgstr "" + +#: classes/wp-security-notices.php:73 +msgid "Please go to the settings and set them now." +msgstr "" + +#: classes/wp-security-notices.php:79 +msgid "Setup IP address detection settings" +msgstr "" + +#: classes/wp-security-notices.php:85 +msgid "Important: Disabled login whitelist setting" +msgstr "" + +#: classes/wp-security-notices.php:91 +msgid "Turn it back on" +msgstr "" + +#: classes/wp-security-notices.php:92 +msgid "Edit the settings" +msgstr "" + +#: classes/wp-security-notices.php:95 +msgid "Keep it off" +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Hey - We noticed All In One WP Security & Firewall has kept your site safe for a while. If you like us, please consider leaving a positive review to spread the word. Or if you have any issues or questions please leave us a support message %s." +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Thank you so much!" +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Team All In One WP Security & Firewall" +msgstr "" + +#: classes/wp-security-notices.php:109 +msgid "Enhance your security even more by backing up your site" +msgstr "" + +#: classes/wp-security-notices.php:110 +msgid "UpdraftPlus is the world's most trusted backup plugin from the owners of All In One WP Security & Firewall" +msgstr "" + +#: classes/wp-security-notices.php:121 +msgid "After you've secured your site, we recommend you install our WP-Optimize plugin to streamline it for better website performance." +msgstr "" + +#: classes/wp-security-process-renamed-login-page.php:152 +msgid "Not available." +msgstr "" + +#: classes/wp-security-two-factor-login.php:34 +msgid "Two factor authentication - Admin settings" +msgstr "" + +#: classes/wp-security-two-factor-login.php:97 +msgid "Two Factor Auth" +msgstr "" + +#: classes/wp-security-two-factor-login.php:153 +msgid "PHP OpenSSL or mcrypt module required" +msgstr "" + +#: classes/wp-security-two-factor-login.php:153 +msgid "The All In One WP Security plugin's Two Factor Authentication module requires either the PHP openssl (preferred) or mcrypt module to be installed. Please ask your web hosting company to install one of them." +msgstr "" + +#: classes/wp-security-user-login.php:71 +msgid "You have disabled login lockout by defining the AIOS_DISABLE_LOGIN_LOCKOUT constant value as true, and the login lockout setting has enabled it." +msgstr "" + +#. translators: 1: Locked IP Addresses admin page link +#: classes/wp-security-user-login.php:73 +msgid "Delete your login lockout IP from %s and define the AIOS_DISABLE_LOGIN_LOCKOUT constant value as false." +msgstr "" + +#: classes/wp-security-user-login.php:100 +msgid "ERROR: Access from your IP address has been blocked for security reasons. Please contact the administrator." +msgstr "" + +#: classes/wp-security-user-login.php:108 +msgid "Service temporarily unavailable" +msgstr "" + +#: classes/wp-security-user-login.php:163 +msgid "ACCOUNT PENDING: Your account is currently not active. An administrator needs to activate your account before you can login." +msgstr "FIÓK FÜGGŐBEN: A fiókja jelenleg nem aktív. Egy adminisztrátornak kell aktiválnia, mielőtt belépne." + +#: classes/wp-security-user-login.php:242 +msgid "ERROR: Invalid login credentials." +msgstr "HIBA: Érvénytelen bejelentkezési adatok." + +#: classes/wp-security-user-login.php:392 +msgid "Site Lockout Notification" +msgstr "" + +#: classes/wp-security-user-login.php:393 +msgid "User login lockout events had occurred due to too many failed login attempts or invalid username:" +msgstr "" + +#: classes/wp-security-user-login.php:396 +msgid "Username:" +msgstr "" + +#: classes/wp-security-user-login.php:397 +msgid "IP address:" +msgstr "" + +#: classes/wp-security-user-login.php:399 +msgid "IP range:" +msgstr "" + +#: classes/wp-security-user-login.php:404 +msgid "Log into your site WordPress administration panel to see the duration of the lockout or to unlock the user." +msgstr "" + +#: classes/wp-security-user-login.php:515 +msgid "Unlock request notification" +msgstr "" + +#: classes/wp-security-user-login.php:516 +msgid "You have requested for the account with email address %s to be unlocked. Please click the link below to unlock your account:" +msgstr "" + +#: classes/wp-security-user-login.php:516 +msgid "Unlock link: %s" +msgstr "" + +#: classes/wp-security-user-login.php:516 +msgid "After clicking the above link you will be able to login to the WordPress administration panel." +msgstr "" + +#: classes/wp-security-user-login.php:739 +msgid "Your session has expired because it has been over %d minutes since your last login." +msgstr "" + +#: classes/wp-security-user-login.php:740 +#: classes/wp-security-user-login.php:744 +msgid "Please log back in to continue." +msgstr "" + +#: classes/wp-security-user-login.php:743 +msgid "You were logged out because you just changed the \"admin\" username." +msgstr "" + +#: classes/wp-security-user-login.php:773 +msgid "Request unlock" +msgstr "" + +#: classes/wp-security-user-registration.php:68 +msgid "ERROR: You are not allowed to register because your IP address is currently locked!" +msgstr "" + +#: classes/wp-security-utility-ip-address.php:217 +#: classes/wp-security-utility-ip-address.php:231 +#: classes/wp-security-utility-ip-address.php:245 +#: classes/wp-security-utility-ip-address.php:257 +#: classes/wp-security-utility-ip-address.php:269 +msgid " is not a valid ip address format." +msgstr "" + +#: classes/wp-security-utility-ip-address.php:274 +msgid "You cannot ban your own IP address: " +msgstr "" + +#: classes/wp-security-utility.php:254 +msgid "This feature can only be configured by the \"superadmin\" on the main site." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:32 +msgid "ERROR: Unable to process your request!" +msgstr "" + +#: other-includes/wp-security-unlock-request.php:45 +msgid "Please enter a valid email address" +msgstr "" + +#: other-includes/wp-security-unlock-request.php:57 +msgid "User account not found!" +msgstr "" + +#: other-includes/wp-security-unlock-request.php:71 +msgid "Error: No locked entry was found in the database with your IP address range." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:76 +msgid "An email has been sent to you with the unlock instructions." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:93 +msgid "You are here because you have been locked out due to too many incorrect login attempts." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:94 +msgid "Please enter your email address and you will receive an email with instructions on how to unlock yourself." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:104 +msgid "Email Address" +msgstr "" + +#: other-includes/wp-security-unlock-request.php:108 +msgid "Send unlock request" +msgstr "" + +#: templates/admin/incompatible-plugin.php:6 +msgid "Two Factor Authentication" +msgstr "" + +#: templates/admin/incompatible-plugin.php:10 +msgid "Two Factor Authentication currently disabled" +msgstr "" + +#: templates/admin/incompatible-plugin.php:12 +#: templates/admin/incompatible-plugin.php:16 +msgid "Two factor authentication in All In One WP Security is currently disabled because the incompatible plugin %s is active." +msgstr "" + +#: templates/automated-database-backup.php:4 +msgid "Automated scheduled backups" +msgstr "" + +#: templates/automated-database-backup.php:9 +msgid "Automate backup in the UpdraftPlus plugin" +msgstr "" + +#: templates/automated-database-backup.php:19 +msgid "The AIOS 5.0.0 version release has removed the automated backup feature." +msgstr "" + +#: templates/automated-database-backup.php:20 +msgid "The AIOS automated backup had issues that made it less robust than we could be happy with." +msgstr "" + +#: templates/automated-database-backup.php:21 +msgid "Follow this link to automate backups in the superior UpdraftPlus backup plugin." +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:5 +msgid "Each IP address must be on a new line." +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:6 +msgid "To specify an IPv4 range use a wildcard \"*\" character. Acceptable ways to use wildcards is shown in the examples below:" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:7 +msgid "Example 1: 195.47.89.*" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:8 +msgid "Example 2: 195.47.*.*" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:9 +msgid "Example 3: 195.*.*.*" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:10 +msgid "To specify an IPv6 range use CIDR format as shown in the examples below:" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:11 +msgid "Example 4: 2401:4900:54c3:af15:2:2:5dc0:0/112" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:12 +msgid "Example 5: 2001:db8:1263::/48" +msgstr "" + +#: templates/may-also-like.php:5 +msgid "All-In-One Security (AIOS) Free vs Premium Comparison Chart" +msgstr "" + +#: templates/may-also-like.php:7 +msgid "FAQs" +msgstr "" + +#: templates/may-also-like.php:9 +msgid "Ask a pre-sales question" +msgstr "" + +#: templates/may-also-like.php:17 +msgid "All In One WP Security & Firewall Free" +msgstr "" + +#: templates/may-also-like.php:26 +#: templates/may-also-like.php:386 +msgid "Installed" +msgstr "" + +#: templates/may-also-like.php:29 +#: templates/may-also-like.php:389 +msgid "Upgrade now" +msgstr "" + +#: templates/may-also-like.php:34 +msgid "Login security feature suite" +msgstr "" + +#: templates/may-also-like.php:35 +msgid "Protect against brute-force attacks and keep bots at bay." +msgstr "" + +#: templates/may-also-like.php:35 +msgid "AIOS takes WordPress' default login security features to a whole new level." +msgstr "" + +#: templates/may-also-like.php:37 +msgid "To see all login security features, visit %s" +msgstr "" + +#: templates/may-also-like.php:48 +msgid "Firewall and file protection feature suite" +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Protection from the latest exploits." +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Activate firewall settings ranging from basic, intermediate and advanced." +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Get comprehensive, instant protection with All-in-One Security." +msgstr "" + +#: templates/may-also-like.php:51 +msgid "To see all firewall and file protection features, visit %s" +msgstr "" + +#: templates/may-also-like.php:62 +msgid "Content protection feature suite" +msgstr "" + +#: templates/may-also-like.php:63 +msgid "Eliminate spam and protect your content to dramatically improve your website's interactions with search engines." +msgstr "" + +#: templates/may-also-like.php:65 +msgid "To see all content protection features, visit %s" +msgstr "" + +#: templates/may-also-like.php:76 +msgid "Malware scanning" +msgstr "" + +#: templates/may-also-like.php:77 +msgid "Finding out by accident that your site has been infected with malware is too late." +msgstr "" + +#: templates/may-also-like.php:79 +msgid "Malware can have a dramatic effect on your site's search rankings and you may not even know about it." +msgstr "" + +#: templates/may-also-like.php:79 +msgid "It can slow your website down, access customer data, send unsolicited emails, change your content or prevent users from accessing it." +msgstr "" + +#: templates/may-also-like.php:84 +msgid "Automatic malware scanning" +msgstr "" + +#: templates/may-also-like.php:85 +msgid "Best-in-class scanning for the latest malware, trojans and spyware 24/7." +msgstr "" + +#: templates/may-also-like.php:96 +msgid "Response time monitoring" +msgstr "" + +#: templates/may-also-like.php:97 +msgid "You'll know immediately if your website's response time is negatively affected." +msgstr "" + +#: templates/may-also-like.php:108 +msgid "Up-time monitoring" +msgstr "" + +#: templates/may-also-like.php:109 +msgid "AIOS checks your website's uptime every 5 minutes." +msgstr "" + +#: templates/may-also-like.php:109 +msgid "We'll notify you straight away if your site/server goes down." +msgstr "" + +#: templates/may-also-like.php:120 +msgid "Prevents blacklisting by search engines" +msgstr "" + +#: templates/may-also-like.php:121 +msgid "AIOS monitors your site's blacklist status daily." +msgstr "" + +#: templates/may-also-like.php:121 +msgid "We'll notify you within 24 hours if something's amiss so you can take action, before it's too late." +msgstr "" + +#: templates/may-also-like.php:132 +msgid "Flexible assignment" +msgstr "" + +#: templates/may-also-like.php:133 +msgid "Register and remove websites from the scanning service at any time." +msgstr "" + +#: templates/may-also-like.php:144 +msgid "Malware reports" +msgstr "" + +#: templates/may-also-like.php:145 +msgid "Reports are available via the 'My Account' page and directly via email." +msgstr "" + +#: templates/may-also-like.php:156 +msgid "Flexible two-factor authentication" +msgstr "" + +#: templates/may-also-like.php:157 +msgid "With Two-Factor Authentication (TFA) users enter their username and password and a one-time code sent to a device to login." +msgstr "" + +#: templates/may-also-like.php:159 +msgid "TFA is a feature in both our free and premium packages, but AIOS Premium affords whole new levels of control over how TFA is implemented." +msgstr "" + +#: templates/may-also-like.php:164 +msgid "Authenticator apps" +msgstr "" + +#: templates/may-also-like.php:165 +msgid "Supports TOTP and HOTP protocols." +msgstr "" + +#: templates/may-also-like.php:165 +msgid "TFA Can be used with Google Authenticator, Microsoft Authenticator, Authy and many more." +msgstr "" + +#: templates/may-also-like.php:176 +msgid "Role specific configuration" +msgstr "" + +#: templates/may-also-like.php:177 +msgid "Make it compulsory for certain roles e.g. for admin and editor roles." +msgstr "" + +#: templates/may-also-like.php:188 +msgid "Require TFA after a set time period" +msgstr "" + +#: templates/may-also-like.php:189 +msgid "For example you could require all admins to have TFA once their accounts are a week old." +msgstr "" + +#: templates/may-also-like.php:200 +msgid "Trusted devices - control how often TFA is required" +msgstr "" + +#: templates/may-also-like.php:201 +msgid "Ask for TFA after a chosen number of days for trusted devices instead of on every login." +msgstr "" + +#: templates/may-also-like.php:212 +msgid "Anti-bot protection" +msgstr "" + +#: templates/may-also-like.php:213 +msgid "Option to hide the existence of forms on WooCommerce login pages unless JavaScript is active." +msgstr "" + +#: templates/may-also-like.php:224 +msgid "Customise TFA design layout" +msgstr "" + +#: templates/may-also-like.php:225 +msgid "Customise the design of TFA so it aligns with your existing web design." +msgstr "" + +#: templates/may-also-like.php:236 +msgid "TFA emergency codes" +msgstr "" + +#: templates/may-also-like.php:237 +msgid "Generate a one-time use emergency code to allow access if your device is lost." +msgstr "" + +#: templates/may-also-like.php:248 +msgid "TFA multisite compatibility" +msgstr "" + +#: templates/may-also-like.php:249 +msgid "TFA is Compatible with multisite networks and sub-sites." +msgstr "" + +#: templates/may-also-like.php:260 +msgid "TFA support for common login forms" +msgstr "" + +#: templates/may-also-like.php:261 +msgid "Supports WooCommerce, Affiliates-WP and Theme my Login login forms." +msgstr "" + +#: templates/may-also-like.php:272 +msgid "TFA support for other login forms" +msgstr "" + +#: templates/may-also-like.php:273 +msgid "Supports Elementor Pro, bbPress and all third-party login forms without any further coding needed." +msgstr "" + +#: templates/may-also-like.php:284 +msgid "Smart 404 blocking" +msgstr "" + +#: templates/may-also-like.php:285 +msgid "404 errors can occur when someone legitimately mistypes a URL, but they're also generated by hackers searching for weaknesses in your site." +msgstr "" + +#: templates/may-also-like.php:290 +msgid "Automatically and permanently blocks bots producing 404s" +msgstr "" + +#: templates/may-also-like.php:291 +msgid "AIOS Premium provides more protection than the competition by automatically and permanently blocking IP addresses of bots and hackers based on how many 404 errors they generate." +msgstr "" + +#: templates/may-also-like.php:302 +msgid "404 error charts" +msgstr "" + +#: templates/may-also-like.php:303 +msgid "Handy charts keep you informed of how many 404s have occurred and which IP address or country is producing them." +msgstr "" + +#: templates/may-also-like.php:314 +msgid "Country blocking" +msgstr "" + +#: templates/may-also-like.php:315 +msgid "Most malicious attacks come from a handful of countries and so it's possible to prevent most attacks with our country blocking tool." +msgstr "" + +#: templates/may-also-like.php:320 +msgid "Block traffic based on country of origin" +msgstr "" + +#: templates/may-also-like.php:321 +msgid "AIOS Premium utilises an IP database that promises 99.5% accuracy." +msgstr "" + +#: templates/may-also-like.php:332 +msgid "Block traffic to specific pages based on country of origin" +msgstr "" + +#: templates/may-also-like.php:333 +msgid "Block access to your whole site or on a page-by-page basis." +msgstr "" + +#: templates/may-also-like.php:344 +msgid "Whitelist some users from blocked countries" +msgstr "" + +#: templates/may-also-like.php:345 +msgid "Whitelist IP addresses or IP ranges even if they are part of a blocked country." +msgstr "" + +#: templates/may-also-like.php:356 +msgid "Premium support" +msgstr "" + +#: templates/may-also-like.php:361 +msgid "Unlimited support" +msgstr "" + +#: templates/may-also-like.php:362 +msgid "Personalised, email support from our team of Security experts, as and when you need it." +msgstr "" + +#: templates/may-also-like.php:373 +msgid "Guaranteed response time" +msgstr "" + +#: templates/may-also-like.php:374 +msgid "We offer a guaranteed response time of three days." +msgstr "" + +#: templates/may-also-like.php:374 +msgid "99% of our Premium customers receive a response to their enquiry within 24 hours during the working week." +msgstr "" + +#: templates/may-also-like.php:397 +msgid "Our other plugins" +msgstr "" + +#: templates/may-also-like.php:411 +msgid "UpdraftPlus – the ultimate protection for your site, hard work and business" +msgstr "" + +#: templates/may-also-like.php:412 +msgid "Simplifies backups and restoration." +msgstr "" + +#: templates/may-also-like.php:412 +msgid "It is the world's highest ranking and most popular scheduled backup plugin, with over three million currently-active installs." +msgstr "" + +#: templates/may-also-like.php:413 +#: templates/may-also-like.php:419 +#: templates/may-also-like.php:425 +#: templates/may-also-like.php:431 +msgid "Try for free" +msgstr "" + +#: templates/may-also-like.php:417 +msgid "WP-Optimize – keep your database fast and efficient" +msgstr "" + +#: templates/may-also-like.php:418 +msgid "Makes your site fast and efficient." +msgstr "" + +#: templates/may-also-like.php:418 +msgid "It cleans the database, compresses images and caches pages for ultimate speed." +msgstr "" + +#: templates/may-also-like.php:423 +msgid "UpdraftCentral – save hours managing multiple WP sites from one place" +msgstr "" + +#: templates/may-also-like.php:424 +msgid "Highly efficient way to manage, optimize, update and backup multiple websites from one place." +msgstr "" + +#: templates/may-also-like.php:429 +msgid "Easy Updates Manager" +msgstr "" + +#: templates/may-also-like.php:430 +msgid "Keeps your WordPress site up to date and bug free." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:2 +msgid "IP address detection settings" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:6 +msgid "The IP address detection settings allow you to specify how visitors' IP addresses are made known to PHP (and hence to WordPress and its plugins)." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:7 +msgid "Usually, this is automatic and there is only one choice." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:8 +msgid "However in some setups, such as those using proxies (including load-balancers and security firewalls like Cloudflare), it may be necessary to set this manually." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:9 +msgid "Attention" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:9 +msgid "It is important to set this correctly - otherwise you may make it possible for a hacker to ban all your visitors (e.g. via banning Cloudflare from connecting to you) instead of being banned himself." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:9 +msgid "The default is to use the REMOTE_ADDR PHP server variable. If this variable does not contain the visitor's IP address, then whilst you can make a different selection below, it is better to ask your web hosting company to have it correctly set." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:10 +msgid "This is the most secure setup, because when set correctly it is immune from being spoofed by an attacker." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:16 +msgid "You have no available IP address detection method(s); you must contact your web hosting company." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:22 +#: templates/menus/settings/advanced-settings.php:27 +#: templates/menus/settings/advanced-settings.php:32 +msgid "Your detected IP address according to %s:" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:38 +msgid "If your site is setup on localhost, you won't see your external IP address using your server's IP detection setting; but on a localhost-served site (not available to the outside world), the setting is irrelevant and can be ignored." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:61 +msgid "Choose a $_SERVER variable you would like to detect visitors' IP address using." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:67 +msgid "If your chosen server variable fails the plugin will automatically fall back to retrieving the IP address from $_SERVER[\"REMOTE_ADDR\"]" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:73 +msgid "Your IP address if using this setting:" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:75 +msgid "fetching..." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:81 +#: templates/menus/settings/advanced-settings.php:190 +msgid "getting..." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:89 +msgid "look-up possibly blocked by an ad-blocker or similar tool" +msgstr "" + +#: templates/notices/cookie-based-brute-force-prevention-disabled.php:4 +msgid "Cookie based brute force login prevention currently disabled" +msgstr "" + +#: templates/notices/cookie-based-brute-force-prevention-disabled.php:6 +msgid "Cookie based brute force login prevention is currently disabled via the AIOS_DISABLE_COOKIE_BRUTE_FORCE_PREVENTION constant (which is mostly likely to be defined in your wp-config.php)" +msgstr "" + +#: templates/notices/disable-login-whitelist.php:4 +msgid "Login whitelisting currently disabled" +msgstr "" + +#: templates/notices/disable-login-whitelist.php:6 +msgid "Login whitelisting is currently disabled via the AIOS_DISABLE_LOGIN_WHITELIST constant (which is mostly likely to be defined in your wp-config.php)" +msgstr "" + +#: templates/notices/horizontal-notice.php:8 +#: templates/notices/horizontal-notice.php:40 +msgid "notice image" +msgstr "" + +#: templates/notices/horizontal-notice.php:18 +msgid "Ok, you deserve it" +msgstr "" + +#: templates/notices/horizontal-notice.php:22 +msgid "Maybe later" +msgstr "" + +#: templates/notices/horizontal-notice.php:26 +msgid "Never" +msgstr "" + +#: templates/notices/horizontal-notice.php:66 +msgid "Get UpdraftCentral" +msgstr "" + +#: templates/notices/horizontal-notice.php:68 +msgid "Get UpdraftPlus" +msgstr "" + +#: templates/notices/horizontal-notice.php:70 +msgid "Get WP-Optimize" +msgstr "" + +#: templates/notices/horizontal-notice.php:72 +msgid "Find out more." +msgstr "" + +#: templates/notices/horizontal-notice.php:74 +msgid "Sign up" +msgstr "" + +#: templates/notices/horizontal-notice.php:76 +msgid "Go there" +msgstr "" + +#: templates/notices/horizontal-notice.php:78 +msgid "Read more" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:4 +msgid "Dismiss (for %s months)" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:6 +msgid "Thank you for installing All In One WP Security & Firewall!" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:13 +msgid "Super-charge and secure your WordPress site even more with our other top plugins:" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:17 +msgid "%s makes your site fast and efficient. It cleans the database, compresses images and caches pages for ultimate speed." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:21 +msgid "%s simplifies backups and restoration. It is the world's highest ranking and most popular scheduled backup plugin, with over three million currently-active installs." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:25 +msgid "%s is a highly efficient way to manage, optimize, update and backup multiple websites from one place." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:29 +msgid "%s is a WordPress subscription extension for WooCommerce store owners." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:33 +msgid "More quality plugins" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:33 +msgid "Premium WooCommerce plugins" +msgstr "" + +#: templates/partials/non-apache-feature-notice.php:9 +msgid "This feature works only on the Apache server." +msgstr "" + +#: templates/partials/non-apache-feature-notice.php:10 +msgid "You are using the non-apache server %s, so this feature won't work on your site." +msgstr "" + +#: wp-security-core.php:236 +#: wp-security.php:45 +msgid "This plugin requires PHP version %s." +msgstr "" + +#: wp-security-core.php:237 +msgid "Current site PHP version is %s." +msgstr "" + +#: wp-security-core.php:238 +#: wp-security.php:47 +msgid "You will need to ask your web hosting company to upgrade." +msgstr "" + +#: wp-security-core.php:397 +msgid "Error:" +msgstr "" + +#: wp-security-core.php:397 +msgid "template not found" +msgstr "" + +#: wp-security.php:44 +msgid "All In One WP Security and Firewall plugin has been deactivated." +msgstr "" + +#: wp-security.php:46 +msgid "Your current PHP version is %s." +msgstr "" diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-ko_KR.mo b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-ko_KR.mo new file mode 100755 index 00000000..5503e915 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-ko_KR.mo differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-ko_KR.po b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-ko_KR.po new file mode 100755 index 00000000..293b281e --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-ko_KR.po @@ -0,0 +1,6253 @@ +msgid "" +msgstr "" +"Project-Id-Version: All In One WP Security 4.4.4\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-04-18 18:26+0800\n" +"PO-Revision-Date: 2020-08-08 15:15+0900\n" +"Last-Translator: Luatic \n" +"Language-Team: Luatic \n" +"Language: ko_KR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=1;\n" +"X-Generator: Poedit 1.8.13\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Textdomain-Support: yes\n" + +#. Plugin Name of the plugin +msgid "All In One WP Security" +msgstr "" + +#. Plugin URI of the plugin +msgid "https://wordpress.org/plugins/all-in-one-wp-security-and-firewall/" +msgstr "" + +#. Description of the plugin +msgid "All round best WordPress security plugin!" +msgstr "" + +#. Author of the plugin +msgid "All In One WP Security & Firewall Team" +msgstr "" + +#. Author URI of the plugin +msgid "https://teamupdraft.com/" +msgstr "" + +#: admin/general/wp-security-list-table.php:483 +msgid "Are you sure you want to perform this bulk action?" +msgstr "" + +#: admin/wp-security-admin-init.php:259 +msgid "Unexpected response:" +msgstr "" + +#: admin/wp-security-admin-init.php:290 +msgid "Enjoyed %1$s? Please leave us a %2$s rating. We really appreciate your support!" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:414 +#: classes/wp-security-two-factor-login.php:95 +msgid "WP Security" +msgstr "WP 보안" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:415 +#: admin/wp-security-dashboard-menu.php:26 +#: admin/wp-security-dashboard-menu.php:76 +msgid "Dashboard" +msgstr "상황판" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:416 +#: admin/wp-security-settings-menu.php:95 +msgid "Settings" +msgstr "설정" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:417 +msgid "User Accounts" +msgstr "사용자 계정" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:418 +msgid "User Login" +msgstr "사용자 로그인" + +#: admin/wp-security-admin-init.php:419 +msgid "User Registration" +msgstr "회원가입" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:420 +msgid "Database Security" +msgstr "데이터베이스 보안" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:424 +msgid "Filesystem Security" +msgstr "파일 시스템 보안" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:429 +msgid "Blacklist Manager" +msgstr "블랙리스트 관리자" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:434 +#: admin/wp-security-firewall-menu.php:60 +msgid "Firewall" +msgstr "방화벽" + +#: admin/wp-security-admin-init.php:436 +msgid "Brute Force" +msgstr "무차별 대입 공격" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:437 +msgid "Spam Prevention" +msgstr "스팸 예방" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:441 +#: admin/wp-security-filescan-menu.php:53 +msgid "Scanner" +msgstr "스캐너" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:443 +#: admin/wp-security-maintenance-menu.php:51 +msgid "Maintenance" +msgstr "유지관리" + +#: admin/wp-security-admin-init.php:444 +#: admin/wp-security-misc-options-menu.php:57 +msgid "Miscellaneous" +msgstr "기타설정" + +#: admin/wp-security-admin-init.php:445 +#: admin/wp-security-tools-menu.php:64 +msgid "Tools" +msgstr "" + +#: admin/wp-security-admin-init.php:457 +msgid "Premium Upgrade" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-menu.php:67 +msgid "Settings successfully updated." +msgstr "설정이 성공적으로 업데이트 되었습니다." + +#: admin/wp-security-admin-menu.php:77 +msgid "Successfully deleted the selected record(s)." +msgstr "" + +#: admin/wp-security-admin-menu.php:86 +msgid "Failed to delete the selected record(s)." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:25 +msgid "Ban users" +msgstr "사용자 차단" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:51 +msgid "Blacklist manager" +msgstr "블랙리스트 관리자" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:132 +#: admin/wp-security-firewall-menu.php:1233 +#: admin/wp-security-list-404.php:234 +#: admin/wp-security-list-comment-spammer-ip.php:205 +msgid "The plugin was unable to write to the .htaccess file. Please edit file manually." +msgstr "플러그인은 .htaccess 파일에 쓸 수 없습니다. 수동으로 파일을 편집하십시오." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:139 +msgid "Ban IPs or user agents" +msgstr "Ban IPs or User Agents" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:142 +msgid "The All In One WP Security Blacklist feature gives you the option of banning certain host IP addresses or ranges and also user agents." +msgstr "All In One WP 보안 블랙리스트 기능은 특정 호스트 IP 주소 또는 범위 및 사용자 에이전트를 금지하는 옵션을 제공합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:143 +msgid "This feature will deny total site access for users which have IP addresses or user agents matching those which you have configured in the settings below." +msgstr "이 기능은 IP 주소 또는 사용자 에이전트가 아래 설정에서 구성한 것과 일치하는 사용자의 총 사이트 액세스를 거부합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:144 +msgid "The plugin achieves this by making appropriate modifications to your .htaccess file." +msgstr "플러그인은 .htaccess 파일을 적절하게 수정하여 이를 달성합니다." + +#: admin/wp-security-blacklist-menu.php:145 +msgid "By blocking people, you are using the most secure first line of defence, which denies all access to blacklisted visitors as soon as they hit your hosting server." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:154 +#: admin/wp-security-firewall-menu.php:1055 +#: templates/may-also-like.php:20 +msgid "All In One WP Security & Firewall Premium" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:155 +#: admin/wp-security-firewall-menu.php:1056 +msgid "You may also be interested in %s." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "This plugin adds a number of extra features including %s and %s." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "smart 404 blocking" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "country IP blocking" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:170 +msgid "IP hosts and user agent blacklist settings" +msgstr "IP 호스트 및 사용자 에이전트 블랙리스트 설정" + +#: admin/wp-security-blacklist-menu.php:182 +#: admin/wp-security-brute-force-menu.php:193 +#: admin/wp-security-brute-force-menu.php:331 +msgid "must read this message" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:183 +#: admin/wp-security-brute-force-menu.php:194 +msgid "This feature can lock you out of admin if it doesn't work correctly on your site. You %s before activating this feature." +msgstr "이 기능은 사이트에서 제대로 작동하지 않으면 관리자에서 잠글 수 있습니다. 이 기능을 활성화하기 전에 %s를 사용할 수 있습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:189 +msgid "Enable IP or user agent blacklisting" +msgstr "IP 또는 사용자 에이전트 블랙리스트 사용" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:192 +msgid "Check this if you want to enable the banning (or blacklisting) of selected IP addresses and/or user agents specified in the settings below" +msgstr "아래 설정에 지정된 선택한 IP 주소 및/또는 사용자 에이전트의 금지(또는 블랙리스트)를 사용하도록 설정하려는 경우 이 옵션을 확인합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:196 +msgid "Enter IP addresses:" +msgstr "IP 주소 입력:" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:200 +msgid "Enter one or more IP addresses or IP ranges." +msgstr "하나 이상의 IP 주소 또는 IP 범위를 입력합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:205 +msgid "Enter user agents:" +msgstr "사용자 에이전트 입력:" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:210 +msgid "Enter one or more user agent strings." +msgstr "하나 이상의 사용자 에이전트 문자열을 입력합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:211 +#: admin/wp-security-brute-force-menu.php:374 +#: admin/wp-security-brute-force-menu.php:408 +#: admin/wp-security-brute-force-menu.php:431 +#: admin/wp-security-brute-force-menu.php:452 +#: admin/wp-security-filescan-menu.php:309 +#: admin/wp-security-filescan-menu.php:326 +#: admin/wp-security-firewall-menu.php:175 +#: admin/wp-security-firewall-menu.php:212 +#: admin/wp-security-firewall-menu.php:232 +#: admin/wp-security-firewall-menu.php:258 +#: admin/wp-security-firewall-menu.php:385 +#: admin/wp-security-firewall-menu.php:415 +#: admin/wp-security-firewall-menu.php:446 +#: admin/wp-security-firewall-menu.php:474 +#: admin/wp-security-firewall-menu.php:503 +#: admin/wp-security-firewall-menu.php:681 +#: admin/wp-security-firewall-menu.php:699 +#: admin/wp-security-firewall-menu.php:737 +#: admin/wp-security-firewall-menu.php:868 +#: admin/wp-security-firewall-menu.php:1087 +#: admin/wp-security-firewall-menu.php:1110 +#: admin/wp-security-spam-menu.php:186 +#: admin/wp-security-spam-menu.php:221 +#: admin/wp-security-spam-menu.php:390 +#: admin/wp-security-spam-menu.php:430 +#: admin/wp-security-user-login-menu.php:362 +#: templates/info/ip-address-ip-range-info.php:2 +#: templates/menus/settings/advanced-settings.php:63 +msgid "More info" +msgstr "더보기" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:214 +msgid "Each user agent string must be on a new line." +msgstr "각 사용자 에이전트 문자열은 새 줄에 있어야 합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:215 +msgid "Example 1 - A single user agent string to block:" +msgstr "예 1 - 차단하는 단일 사용자 에이전트 문자열:" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:217 +msgid "Example 2 - A list of more than 1 user agent strings to block" +msgstr "예 2 - 차단할 사용자 에이전트 문자열이 1개 이상 나열됩니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:225 +#: admin/wp-security-brute-force-menu.php:213 +#: admin/wp-security-brute-force-menu.php:686 +#: admin/wp-security-brute-force-menu.php:806 +#: admin/wp-security-brute-force-menu.php:868 +#: admin/wp-security-filescan-menu.php:351 +#: admin/wp-security-filesystem-menu.php:242 +#: admin/wp-security-firewall-menu.php:945 +#: admin/wp-security-firewall-menu.php:1129 +#: admin/wp-security-misc-options-menu.php:167 +#: admin/wp-security-misc-options-menu.php:218 +#: admin/wp-security-misc-options-menu.php:278 +#: admin/wp-security-settings-menu.php:619 +#: admin/wp-security-settings-menu.php:680 +#: admin/wp-security-spam-menu.php:233 +#: admin/wp-security-spam-menu.php:407 +#: admin/wp-security-spam-menu.php:526 +#: admin/wp-security-spam-menu.php:588 +#: admin/wp-security-user-login-menu.php:384 +#: admin/wp-security-user-login-menu.php:422 +#: admin/wp-security-user-login-menu.php:601 +#: admin/wp-security-user-login-menu.php:788 +#: admin/wp-security-user-registration-menu.php:150 +#: admin/wp-security-user-registration-menu.php:242 +#: admin/wp-security-user-registration-menu.php:305 +#: templates/menus/settings/advanced-settings.php:217 +msgid "Save settings" +msgstr "설정 저장" + +#: admin/wp-security-brute-force-menu.php:33 +#: admin/wp-security-brute-force-menu.php:759 +#: admin/wp-security-dashboard-menu.php:651 +msgid "Rename login page" +msgstr "로그인 페이지 주소 변경" + +#: admin/wp-security-brute-force-menu.php:34 +#: admin/wp-security-brute-force-menu.php:154 +msgid "Cookie based brute force prevention" +msgstr "쿠키 기반 무차별 무력 예방" + +#: admin/wp-security-brute-force-menu.php:35 +#: classes/grade-system/wp-security-feature-item-manager.php:105 +msgid "Login CAPTCHA" +msgstr "로그인 캡챠" + +#: admin/wp-security-brute-force-menu.php:36 +#: admin/wp-security-brute-force-menu.php:746 +msgid "Login whitelist" +msgstr "로그인 허용 목록" + +#: admin/wp-security-brute-force-menu.php:37 +msgid "Honeypot" +msgstr "허니팟(Honeypot)" + +#: admin/wp-security-brute-force-menu.php:67 +msgid "Brute force" +msgstr "무차별 대입 공격" + +#: admin/wp-security-brute-force-menu.php:105 +msgid "Please enter a value for your login page slug." +msgstr "로그인 페이지 슬러그에 대한 값을 입력하십시오." + +#: admin/wp-security-brute-force-menu.php:109 +msgid "You cannot use the value \"wp-admin\" for your login page slug." +msgstr "로그인 페이지 슬러그에 대해 \"wp-admin\" 값을 사용할 수 없습니다." + +#: admin/wp-security-brute-force-menu.php:111 +msgid "You must use alpha numeric characters for your login page slug." +msgstr "로그인 페이지 슬러그에 알파 숫자 문자를 사용해야 합니다." + +#: admin/wp-security-brute-force-menu.php:116 +#: admin/wp-security-filescan-menu.php:174 +#: admin/wp-security-firewall-menu.php:151 +#: admin/wp-security-firewall-menu.php:1011 +#: admin/wp-security-spam-menu.php:101 +#: admin/wp-security-spam-menu.php:270 +#: admin/wp-security-spam-menu.php:302 +#: admin/wp-security-user-login-menu.php:184 +#: admin/wp-security-user-login-menu.php:553 +#: templates/partials/non-apache-feature-notice.php:9 +msgid "Attention:" +msgstr "注意:" + +#: admin/wp-security-brute-force-menu.php:133 +msgid "Could not delete the Cookie-based directives from the .htaccess file. Please check the file permissions." +msgstr ".htaccess 파일에서 쿠키 기반 지침을 삭제할 수 없습니다. 파일 권한을 확인하십시오." + +#: admin/wp-security-brute-force-menu.php:155 +msgid "Login page white list" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:156 +msgid "An effective Brute Force prevention technique is to change the default WordPress login page URL." +msgstr "효과적인 무차별 포스 방지 기술은 기본 워드 프레스 로그인 페이지 URL을 변경하는 것입니다." + +#: admin/wp-security-brute-force-menu.php:157 +msgid "Normally if you wanted to login to WordPress you would type your site's home URL followed by wp-login.php." +msgstr "일반적으로 WordPress에 로그인하려는 경우 사이트의 홈 URL을 입력한 다음 wp-login.php를 입력합니다." + +#: admin/wp-security-brute-force-menu.php:158 +msgid "This feature allows you to change the login URL by setting your own slug and renaming the last portion of the login URL which contains the wp-login.php to any string that you like." +msgstr "이 기능을 사용하면 자신의 슬러그를 설정하고 wp-login.php를 포함하는 로그인 URL의 마지막 부분의 이름을 원하는 문자열로 변경하여 로그인 URL을 변경할 수 있습니다." + +#: admin/wp-security-brute-force-menu.php:159 +msgid "By doing this, malicious bots and hackers will not be able to access your login page because they will not know the correct login page URL." +msgstr "이렇게 하면 악의적인 봇과 해커가 로그인 페이지에 액세스할 수 없습니다." + +#: admin/wp-security-brute-force-menu.php:161 +msgid "You may also be interested in the following alternative brute force prevention features:" +msgstr "또한 다음과 같은 대체 무차별 무력 방지 기능에 관심이 있을 수 있습니다." + +#: admin/wp-security-brute-force-menu.php:172 +msgid "Your WordPress login page URL has been renamed." +msgstr "워드 프레스 로그인 페이지 URL의 이름이 변경되었습니다." + +#: admin/wp-security-brute-force-menu.php:173 +msgid "Your current login URL is:" +msgstr "현재 로그인 URL은 다음과 같은 것입니다." + +#: admin/wp-security-brute-force-menu.php:181 +msgid "Rename login page settings" +msgstr "로그인 페이지 주소 변경 설정" + +#: admin/wp-security-brute-force-menu.php:195 +msgid "NOTE: If you are hosting your site on WPEngine or a provider which performs server caching, you will need to ask the host support people to NOT cache your renamed login page." +msgstr "참고: WPEngine 또는 서버 캐싱을 수행하는 공급자에서 사이트를 호스팅하는 경우 호스트 지원 사람들에게 이름이 변경된 로그인 페이지를 캐시하지 않도록 요청해야 합니다." + +#: admin/wp-security-brute-force-menu.php:200 +msgid "Enable rename login page feature" +msgstr "이름 바꾸기 페이지 기능 사용" + +#: admin/wp-security-brute-force-menu.php:203 +msgid "Check this if you want to enable the rename login page feature" +msgstr "이름 바꾸기 페이지 기능을 사용하도록 설정하려면 이 방법을 확인하십시오." + +#: admin/wp-security-brute-force-menu.php:207 +msgid "Login page URL" +msgstr "로그인 페이지 URL" + +#: admin/wp-security-brute-force-menu.php:209 +msgid "Enter a string which will represent your secure login page slug. You are encouraged to choose something which is hard to guess and only you will remember." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:243 +msgid "Settings have not been saved - your secret word must consist only of alphanumeric characters, ie, letters and/or numbers only." +msgstr "설정은 저장되지 않았습니다 - 당신의 비밀 단어는 영숫자 문자, 즉, 문자 및 / 또는 숫자로만 구성해야합니다!" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:257 +msgid "You have successfully enabled the cookie based brute force prevention feature" +msgstr "쿠키 기반 무차별 무력 방지 기능을 성공적으로 활성화했습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:258 +msgid "From now on you will need to log into your WP Admin using the following URL:" +msgstr "지금부터 다음 URL을 사용하여 WP 관리자에 로그인해야 합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:260 +msgid "It is important that you save this URL value somewhere in case you forget it, OR," +msgstr "이 URL 값을 잊어버린 경우 어딘가에 저장하는 것이 중요합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:261 +msgid "simply remember to add a \"?%s=1\" to your current site URL address." +msgstr "단순히 현재 사이트 URL 주소에 \"?%s=1\"을 추가해야 합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:265 +msgid "You have successfully saved cookie based brute force prevention feature settings." +msgstr "쿠키 기반 무차별 무력 방지 기능 설정을 성공적으로 저장했습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:295 +msgid "Brute force prevention firewall settings" +msgstr "무차별 강제 방지 방화벽 설정" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:300 +msgid "A Brute Force Attack is when a hacker tries many combinations of usernames and passwords until they succeed in guessing the right combination." +msgstr "무차별 포스 공격은 해커가 올바른 조합을 추측하는 데 성공할 때까지 사용자 이름과 암호의 많은 조합을 시도할 때입니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:301 +msgid "Due to the fact that at any one time there may be many concurrent login attempts occurring on your site via malicious automated robots, this also has a negative impact on your server's memory and performance." +msgstr "악의적인 자동화 된 로봇을 통해 사이트에서 발생하는 동시 로그인 시도가 있을 수 있으므로 서버의 메모리와 성능에도 부정적인 영향을 미칩니다." + +#: admin/wp-security-brute-force-menu.php:302 +msgid "The features in this tab will stop the majority of brute force login attacks thus providing even better protection for your WP login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:307 +#: admin/wp-security-firewall-menu.php:654 +msgid "backup" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:308 +msgid "video tutorial" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:309 +msgid "To learn more about how to use this feature, please watch the following %s." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:310 +#: admin/wp-security-brute-force-menu.php:758 +msgid "Cookie-Based Brute Force Login Prevention" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:320 +#: admin/wp-security-user-login-menu.php:253 +msgid "Cookie based brute force login prevention" +msgstr "쿠키 기반 무차별 포스 로그인 방지" + +#: admin/wp-security-brute-force-menu.php:331 +msgid "This feature can lock you out of admin if it doesn't work correctly on your site. You " +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:342 +msgid "The cookie test was successful. You can now enable this feature." +msgstr "쿠키 테스트는 성공적이었습니다. 이제 이 기능을 활성화할 수 있습니다." + +#: admin/wp-security-brute-force-menu.php:350 +msgid "The cookie test failed on this server. Consequently, this feature cannot be used on this site." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:357 +msgid "Before using this feature, you must perform a cookie test first." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:359 +msgid "This ensures that your browser cookie is working correctly and that you won't lock yourself out." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:364 +msgid "Perform cookie test" +msgstr "쿠키 테스트 수행" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:370 +#: classes/grade-system/wp-security-feature-item-manager.php:103 +msgid "Enable brute force attack prevention" +msgstr "무차별 무력 공격 방지 활성화" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:373 +msgid "Check this if you want to protect your login page from Brute Force Attack." +msgstr "브루트 포스 공격으로부터 로그인 페이지를 보호하려면 이 방법을 확인하십시오." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:378 +msgid "This feature will deny access to your WordPress login page for all people except those who have a special cookie in their browser." +msgstr "이 기능은 브라우저에 특별한 쿠키가있는 사람들을 제외한 모든 사용자의 워드 프레스 로그인 페이지에 대한 액세스를 거부합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:380 +msgid "To use this feature do the following:" +msgstr "이 기능을 사용하려면 다음을 수행합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:382 +msgid "1) Enable the checkbox." +msgstr "1) 확인란을 활성화합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:384 +msgid "2) Enter a secret word consisting of alphanumeric characters which will be difficult to guess. This secret word will be useful whenever you need to know the special URL which you will use to access the login page (see point below)." +msgstr "2) 추측하기 어려운 거넘 문자로 구성된 비밀 단어를 입력합니다. 이 비밀 단어는 로그인 페이지에 액세스하는 데 사용할 특수 URL을 알아야 할 때마다 유용합니다(아래 점 참조)." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:386 +msgid "3) You will then be provided with a special login URL. You will need to use this URL to login to your WordPress site instead of the usual login URL. NOTE: The system will deposit a special cookie in your browser which will allow you access to the WordPress administration login page." +msgstr "3) 당신은 다음 특별한 로그인 URL이 제공됩니다. 이 URL을 사용하여 일반적인 로그인 URL 대신 WordPress 사이트에 로그인해야 합니다. 참고 : 시스템은 당신이 워드 프레스 관리 로그인 페이지에 액세스 할 수 있도록 브라우저에 특별한 쿠키를 입금합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:388 +msgid "Any person trying to access your login page who does not have the special cookie in their browser will be automatically blocked." +msgstr "브라우저에 특별한 쿠키가 없는 로그인 페이지에 액세스하려는 모든 사람이 자동으로 차단됩니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:395 +msgid "Secret word" +msgstr "암호 문자" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:397 +msgid "Choose a secret word consisting of alphanumeric characters which you can use to access your special URL. Your are highly encouraged to choose a word which will be difficult to guess." +msgstr "특수 URL에 액세스하는 데 사용할 수 있는 유수 문자로 구성된 비밀 단어를 선택합니다. 추측하기 어려운 단어를 선택하는 것이 좋습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:401 +msgid "Re-direct URL" +msgstr "Re-direct URL" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:405 +msgid "Specify a URL to redirect a hacker to when they try to access your WordPress login page." +msgstr "해커가 WordPress 로그인 페이지에 액세스하려고 할 때로 리디렉션할 URL을 지정합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:412 +msgid "The URL specified here can be any site's URL and does not have to be your own. For example you can be as creative as you like and send hackers to the CIA or NSA home page." +msgstr "여기에 지정된 URL은 사이트의 URL일 수 있으며 사용자 고유의 URL일 필요는 없습니다. 예를 들어 원하는 만큼 창의적이며 해커를 CIA 또는 NSA 홈 페이지로 보낼 수 있습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:414 +msgid "This field will default to: http://127.0.0.1 if you do not enter a value." +msgstr "값을 입력하지 않으면 이 필드는 기본값으로 http://127.0.0.1." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:416 +msgid "Useful Tip:" +msgstr "유용한 팁:" + +#: admin/wp-security-brute-force-menu.php:418 +msgid "It's a good idea to not redirect attempted brute force login attempts to your site because it increases the load on your server." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:420 +msgid "Redirecting a hacker or malicious bot back to \"http://127.0.0.1\" is ideal because it deflects them back to their own local host and puts the load on their server instead of yours." +msgstr "해커 나 악성 봇을 다시 \"http://127.0.0.1\"로 리디렉션하는 것은 자신의 로컬 호스트로 다시 편향하고 대신 서버의 부하를 넣기 때문에 이상적입니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:427 +msgid "My site has posts or pages which are password protected" +msgstr "내 사이트에는 암호로 보호된 게시물 또는 페이지가 있습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:430 +msgid "Check this if you are using the native WordPress password protection feature for some or all of your blog posts or pages." +msgstr "블로그 게시물 또는 페이지의 일부 또는 전부에 대해 기본 WordPress 암호 보호 기능을 사용하는 경우 이 기능을 확인하십시오." + +#: admin/wp-security-brute-force-menu.php:435 +msgid "In the cases where you are protecting some of your posts or pages using the in-built WordPress password protection feature, a few extra lines of directives and exceptions need to be added so that people trying to access pages are not automatically blocked." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:437 +msgid "By enabling this checkbox, the plugin will add the necessary rules and exceptions so that people trying to access these pages are not automatically blocked." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:439 +msgid "Helpful Tip:" +msgstr "유용한 팁:" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:441 +msgid "If you do not use the WordPress password protection feature for your posts or pages then it is highly recommended that you leave this checkbox disabled." +msgstr "게시물이나 페이지에 대해 WordPress 암호 보호 기능을 사용하지 않는 경우 이 확인란을 사용하지 않도록 두는 것이 좋습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:448 +msgid "My site has a theme or plugins which use AJAX" +msgstr "내 사이트는 AJAX를 사용하는 테마 또는 플러그인이 있습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:451 +msgid "Check this if your site uses AJAX functionality." +msgstr "사이트에서 AJAX 기능을 사용하는지 확인합니다." + +#: admin/wp-security-brute-force-menu.php:456 +msgid "In the cases where your WordPress installation has a theme or plugin that uses AJAX, a few extra lines of directives and exceptions need to be added to prevent AJAX requests from being automatically blocked by the brute force prevention feature." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:458 +msgid "By enabling this checkbox, the plugin will add the necessary rules and exceptions so that AJAX operations will work as expected." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:467 +msgid "Save feature settings" +msgstr "기능 설정 저장" + +#: admin/wp-security-brute-force-menu.php:525 +msgid "This feature allows you to add a CAPTCHA form on various WordPress login pages and forms." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:526 +msgid "Adding a CAPTCHA form on a login page or form is another effective yet simple \"Brute Force\" prevention technique." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:527 +msgid "You have the option of using either %s or a plain maths CAPTCHA form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:528 +msgid "If you enable Google reCAPTCHA the reCAPTCHA widget will be displayed for all forms the CAPTCHA settings below." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:529 +msgid "If Google reCAPTCHA is disabled the simple maths CAPTCHA form will apply and users will need to enter the answer to a simple mathematical question." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:535 +msgid "Google reCAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:540 +msgid "By enabling these settings the Google reCAPTCHA v2 widget will be applied by default for all forms with CAPTCHA enabled." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:549 +msgid "reCAPTCHA will not work because you have disabled login lockout by activating the AIOS_DISABLE_LOGIN_LOCKOUT constant value in a configuration file." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:550 +msgid "To enable it, define AIOS_DISABLE_LOGIN_LOCKOUT constant value as false, or remove it." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:558 +msgid "Use Google reCAPTCHA as default" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:561 +msgid "Check this if you want to default to Google reCAPTCHA for all settings below. (If this is left unchecked, all CAPTCHA forms will revert to the plain maths CAPTCHA)" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:565 +msgid "Site key" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:571 +msgid "Secret key" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:580 +msgid "Login form CAPTCHA settings" +msgstr "로그인 양식 캡차 설정" + +#: admin/wp-security-brute-force-menu.php:589 +msgid "Enable CAPTCHA on login page" +msgstr "로그인 페이지에서 Captcha 사용" + +#: admin/wp-security-brute-force-menu.php:592 +msgid "Check this if you want to insert a CAPTCHA form on the login page." +msgstr "로그인 페이지에 캡차 양식을 삽입하려는 경우 이 방법을 확인하십시오." + +#: admin/wp-security-brute-force-menu.php:598 +msgid "Lost password form CAPTCHA settings" +msgstr "비밀번호 찾기 양식에 보안 문자 설정" + +#: admin/wp-security-brute-force-menu.php:608 +msgid "Enable CAPTCHA on lost password page" +msgstr "암호 분실 페이지에서 보안 문자 활성화" + +#: admin/wp-security-brute-force-menu.php:611 +msgid "Check this if you want to insert a CAPTCHA form on the lost password page." +msgstr "비밀번호 찾기 페이지에 보안 문자 양식을 삽입하려는 경우 이 방법을 확인하십시오." + +#: admin/wp-security-brute-force-menu.php:617 +msgid "Custom login form CAPTCHA settings" +msgstr "사용자 정의 로그인 양식 캡차 설정" + +#: admin/wp-security-brute-force-menu.php:626 +msgid "Enable CAPTCHA on custom login form" +msgstr "맞춤형 로그인 양식에 보안 문자 사용" + +#: admin/wp-security-brute-force-menu.php:629 +msgid "Check this if you want to insert CAPTCHA on a custom login form generated by the following WP function: wp_login_form()" +msgstr "다음 WP 함수에서 생성된 사용자 지정 로그인 양식에 보안 문자를 삽입하려는 경우 wp_login_form()" + +#: admin/wp-security-brute-force-menu.php:639 +msgid "WooCommerce forms CAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:648 +msgid "Enable CAPTCHA on WooCommerce login form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:651 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce login form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:661 +msgid "Enable CAPTCHA on WooCommerce lost password form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:664 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce lost password form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:674 +msgid "Enable CAPTCHA on WooCommerce registration form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:677 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce registration form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:749 +msgid "The All In One WP Security Whitelist feature gives you the option of only allowing certain IP addresses or ranges to have access to your WordPress login page." +msgstr "모든 WP 보안 화이트리스트 기능은 특정 IP 주소 또는 범위만 WordPress 로그인 페이지에 액세스할 수 있도록 허용하는 옵션을 제공합니다." + +#: admin/wp-security-brute-force-menu.php:750 +msgid "This feature will deny login access for all IP addresses which are not in your whitelist as configured in the settings below." +msgstr "이 기능은 아래 설정에서 구성된 대로 화이트리스트에 없는 모든 IP 주소에 대한 로그인 액세스를 거부합니다." + +#: admin/wp-security-brute-force-menu.php:751 +msgid "The plugin achieves this by writing the appropriate directives to your .htaccess file." +msgstr "플러그인은 .htaccess 파일에 적절한 지침을 작성하여 이를 달성합니다." + +#: admin/wp-security-brute-force-menu.php:752 +msgid "By allowing/blocking IP addresses, you are using the most secure first line of defence because login access will only be granted to whitelisted IP addresses and other addresses will be blocked as soon as they try to access your login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:760 +msgid "Attention: If in addition to enabling the white list feature, you also have one of the %s or %s features enabled, you will still need to use your secret word or special slug in the URL when trying to access your WordPress login page." +msgstr "주의: 화이트 리스트 기능을 사용하도록 설정하는 것 외에도 %s 또는 %s 기능 중 하나가 활성화된 경우 WordPress 로그인 페이지에 액세스하려고 할 때 URL에서 비밀 단어 또는 특수 슬러그를 사용해야 합니다." + +#: admin/wp-security-brute-force-menu.php:761 +msgid "These features are NOT functionally related. Having both of them enabled on your site means you are creating 2 layers of security." +msgstr "이러한 기능은 기능적으로 관련이 없습니다. 두 가지 를 모두 사이트에서 사용하도록 설정하면 2개의 보안 계층을 만드는 것을 의미합니다." + +#: admin/wp-security-brute-force-menu.php:772 +msgid "Login IP whitelist settings" +msgstr "로그인 IP 허용 목록 설정" + +#: admin/wp-security-brute-force-menu.php:783 +msgid "Enable IP whitelisting" +msgstr "IP 화이트리스팅 활성화" + +#: admin/wp-security-brute-force-menu.php:786 +#: admin/wp-security-user-login-menu.php:408 +msgid "Check this if you want to enable the whitelisting of selected IP addresses specified in the settings below" +msgstr "아래 설정에 지정된 선택한 IP 주소의 화이트리스팅을 사용하도록 설정하려면 이 옵션을 확인하십시오." + +#: admin/wp-security-brute-force-menu.php:790 +msgid "Your current IP address" +msgstr "현재 IP 주소" + +#: admin/wp-security-brute-force-menu.php:793 +msgid "You can copy and paste this address in the text box below if you want to include it in your login whitelist." +msgstr "로그인 화이트리스트에 포함하려는 경우 아래 텍스트 상자에 이 주소를 복사하여 붙여넣기할 수 있습니다." + +#: admin/wp-security-brute-force-menu.php:797 +#: admin/wp-security-user-login-menu.php:412 +msgid "Enter whitelisted IP addresses:" +msgstr "화이트리스트 IP 주소 입력:" + +#: admin/wp-security-brute-force-menu.php:801 +#: admin/wp-security-user-login-menu.php:416 +msgid "Enter one or more IP addresses or IP ranges you wish to include in your whitelist." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:801 +msgid "Only the addresses specified here will have access to the WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:839 +msgid "This feature allows you to add a special hidden \"honeypot\" field on the WordPress login page. This will only be visible to robots and not humans." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:840 +msgid "Since robots usually fill in every input field from a login form, they will also submit a value for the special hidden honeypot field." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:841 +#: admin/wp-security-user-registration-menu.php:278 +msgid "The way honeypots work is that a hidden field is placed somewhere inside a form which only robots will submit. If that field contains a value when the form is submitted then a robot has most likely submitted the form and it is consequently dealt with." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:842 +msgid "Therefore, if the plugin detects that this field has a value when the login form is submitted, then the robot which is attempting to login to your site will be redirected to its localhost address - http://127.0.0.1." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:848 +msgid "Login form honeypot settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:859 +msgid "Enable honeypot on login page" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:862 +msgid "Check this if you want to enable the honeypot feature for the login page" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:27 +#: admin/wp-security-dashboard-menu.php:374 +#: classes/wp-security-user-login.php:74 +msgid "Locked IP addresses" +msgstr "잠긴 IP 주소" + +#: admin/wp-security-dashboard-menu.php:28 +msgid "Permanent block list" +msgstr "영구 블록 목록" + +#: admin/wp-security-dashboard-menu.php:29 +msgid "Logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:33 +msgid "Premium upgrade" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:131 +#: admin/wp-security-dashboard-menu.php:518 +#: admin/wp-security-user-login-menu.php:53 +#: classes/grade-system/wp-security-feature-item-manager.php:49 +msgid "Login lockout" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:132 +msgid "This tab displays the list of all IP addresses which are currently temporarily locked out due to the login lockout feature:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:138 +msgid "Currently locked out IP addresses and ranges" +msgstr "현재 잠겨 있는 IP 주소 및 범위" + +#: admin/wp-security-dashboard-menu.php:183 +msgid "This tab displays the list of all permanently blocked IP addresses." +msgstr "이 탭에는 영구적으로 차단된 모든 IP 주소 목록이 표시됩니다." + +#: admin/wp-security-dashboard-menu.php:184 +#: admin/wp-security-spam-menu.php:339 +msgid "NOTE: This feature does NOT use the .htaccess file to permanently block the IP addresses so it should be compatible with all web servers running WordPress." +msgstr "참고: 이 기능은 .htaccess 파일을 사용하여 IP 주소를 영구적으로 차단하지 않으므로 WordPress를 실행하는 모든 웹 서버와 호환되어야 합니다." + +#: admin/wp-security-dashboard-menu.php:189 +msgid "Permanently blocked IP addresses" +msgstr "영구적으로 차단된 IP 주소" + +#: admin/wp-security-dashboard-menu.php:200 +#: admin/wp-security-firewall-menu.php:1151 +#: admin/wp-security-user-login-menu.php:485 +#: admin/wp-security-user-login-menu.php:643 +#: admin/wp-security-user-registration-menu.php:164 +msgid "Search" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:238 +#: admin/wp-security-dashboard-menu.php:249 +#: admin/wp-security-dashboard-menu.php:260 +msgid "All In One WP Security & Firewall" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:250 +msgid "Debug logs have been cleared." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:261 +msgid "Unable to clear the logs; an invalid nonce was provided" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:274 +msgid "Debug log options" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:281 +msgid "Clear logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:289 +msgid "Debug logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:362 +msgid "Security strength meter" +msgstr "보안 강도 계수" + +#: admin/wp-security-dashboard-menu.php:363 +msgid "Security points breakdown" +msgstr "보안 지점 고장" + +#: admin/wp-security-dashboard-menu.php:364 +msgid "Spread the word" +msgstr "입소문 내기" + +#: admin/wp-security-dashboard-menu.php:365 +msgid "Get to know the developers" +msgstr "개발자에 대해 알아가기" + +#: admin/wp-security-dashboard-menu.php:366 +msgid "Critical feature status" +msgstr "중요 기능 상태" + +#: admin/wp-security-dashboard-menu.php:367 +msgid "Last 5 logins" +msgstr "마지막 5 로그인" + +#: admin/wp-security-dashboard-menu.php:368 +msgid "Maintenance mode status" +msgstr "유지 관리 모드 상태" + +#: admin/wp-security-dashboard-menu.php:373 +#: admin/wp-security-dashboard-menu.php:664 +#: admin/wp-security-user-login-menu.php:57 +msgid "Logged in users" +msgstr "로그인한 사용자" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:417 +msgid "Total Achievable Points: " +msgstr "총 달성 가능한 포인트:" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:419 +msgid "Current Score of Your Site: " +msgstr "사이트의 현재 점수:" + +#: admin/wp-security-dashboard-menu.php:472 +msgid "We are working hard to make your WordPress site more secure. Please support us, here is how:" +msgstr "우리는 당신의 워드 프레스 사이트를 더 안전하게 만들기 위해 열심히 노력하고 있습니다. 우리를 지원하십시오, 여기에 방법입니다 :" + +#: admin/wp-security-dashboard-menu.php:473 +msgid "Follow us on" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:477 +msgid "Post to Twitter" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:481 +msgid "Give us a good rating" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:488 +msgid "Wanna know more about the developers behind this plugin?" +msgstr "이 플러그인 뒤에 개발자에 대 한 자세한 내용은?" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:499 +msgid "Below is the current status of the critical features that you should activate on your site to achieve a minimum level of recommended security" +msgstr "다음은 최소한의 권장 보안을 달성하기 위해 사이트에서 활성화해야 하는 중요한 기능의 현재 상태입니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:503 +msgid "Admin username" +msgstr "관리자 아이디" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:533 +msgid "File permission" +msgstr "파일 권한" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:548 +msgid "Basic firewall" +msgstr "기본 방화벽" + +#: admin/wp-security-dashboard-menu.php:577 +msgid "No data found." +msgstr "데이터가 없습니다" + +#: admin/wp-security-dashboard-menu.php:581 +msgid "Last 5 logins summary:" +msgstr "마지막 5 개의 로그인 요약:" + +#: admin/wp-security-dashboard-menu.php:585 +msgid "User" +msgstr "사용자" + +#: admin/wp-security-dashboard-menu.php:586 +#: admin/wp-security-list-404.php:95 +#: admin/wp-security-list-login-fails.php:56 +#: admin/wp-security-list-permanent-blocked-ip.php:68 +msgid "Date" +msgstr "날짜" + +#: admin/wp-security-dashboard-menu.php:587 +msgid "IP" +msgstr "IP" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:608 +msgid "Maintenance mode is currently enabled. Remember to turn it off when you are done" +msgstr "현재 유지 관리 모드가 활성화되어 있습니다. 완료되면 꺼야 합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:610 +msgid "Maintenance mode is currently off." +msgstr "유지 관리 모드가 현재 해제되었습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:614 +msgid "Maintenance mode" +msgstr "유지관리 모드" + +#: admin/wp-security-dashboard-menu.php:632 +msgid "Cookie based brute force" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:636 +#: admin/wp-security-dashboard-menu.php:654 +msgid "The %s feature is currently active." +msgstr "%s 피쳐는 현재 활성 상태입니다." + +#: admin/wp-security-dashboard-menu.php:637 +#: admin/wp-security-dashboard-menu.php:655 +msgid "Your new WordPress login URL is now:" +msgstr "당신의 새 워드프레스 로그인 URL:" + +#: admin/wp-security-dashboard-menu.php:666 +msgid "Number of users currently logged into your site (including you) is:" +msgstr "현재 사이트에 로그인한 사용자 수(회원 포함):" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:667 +msgid "There are no other users currently logged in." +msgstr "현재 로그인한 다른 사용자는 없습니다." + +#: admin/wp-security-dashboard-menu.php:680 +msgid "Number of users currently logged in site-wide (including you) is:" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:681 +msgid "There are no other site-wide users currently logged in." +msgstr "현재 로그인한 사이트 전체의 다른 사용자는 없습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:694 +#: admin/wp-security-dashboard-menu.php:711 +msgid "Go to the %s menu to see more details" +msgstr "자세한 내용을 보려면 %s 메뉴로 이동" + +#: admin/wp-security-dashboard-menu.php:707 +msgid "There are no IP addresses currently locked out." +msgstr "현재 잠겨 있는 IP 주소가 없습니다." + +#: admin/wp-security-dashboard-menu.php:710 +msgid "Number of temporarily locked out IP addresses: " +msgstr "일시적으로 잠긴 IP 주소 수:" + +#: admin/wp-security-database-menu.php:52 +msgid "UpdraftPlus is installed but currently not active." +msgstr "" + +#: admin/wp-security-database-menu.php:52 +msgid "Follow this link to activate UpdraftPlus, to take a backup." +msgstr "" + +#: admin/wp-security-database-menu.php:57 +msgid "Follow this link to install UpdraftPlus, to take a database backup." +msgstr "" + +#: admin/wp-security-database-menu.php:87 +#: admin/wp-security-database-menu.php:92 +msgid "Database backup" +msgstr "DB 백업" + +#: admin/wp-security-database-menu.php:91 +#: classes/grade-system/wp-security-feature-item-manager.php:65 +msgid "Database prefix" +msgstr "DB 접두사" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:119 +msgid "Database security" +msgstr "데이터베이스 보안" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:147 +msgid "Nonce check failed for DB prefix change operation!" +msgstr "NONCE 는 DB 접두사 변경 작업에 대한 실패 확인!" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:155 +msgid "The plugin has detected that it cannot write to the wp-config.php file. This feature can only be used if the plugin can successfully write to the wp-config.php file." +msgstr "플러그인은 wp-config.php 파일에 쓸 수 없다는 것을 감지했습니다. 이 기능은 플러그인이 wp-config.php 파일에 성공적으로 쓸 수 있는 경우에만 사용할 수 있습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:168 +msgid "Please enter a value for the DB prefix." +msgstr "DB 접두사값을 입력하십시오." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:177 +msgid "ERROR: The table prefix can only contain numbers, letters, and underscores." +msgstr "오류: 테이블 접두사에는 숫자, 문자 및 밑줄만 포함될 수 있습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:186 +#: admin/wp-security-database-menu.php:245 +msgid "Change database prefix" +msgstr "데이터베이스 접두사 변경" + +#: admin/wp-security-database-menu.php:189 +msgid "Your WordPress database is the most important asset of your website because it contains a lot of your site's precious information." +msgstr "" + +#: admin/wp-security-database-menu.php:190 +msgid "The database is also a target for hackers via methods such as SQL injections and malicious and automated code which targets certain tables." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:191 +msgid "One way to add a layer of protection for your DB is to change the default WordPress table prefix from \"wp_\" to something else which will be difficult for hackers to guess." +msgstr "DB에 대한 보호 계층을 추가하는 한 가지 방법은 기본 워드 프레스 테이블 접두사를 \"wp_\"에서 해커가 추측하기 어려운 다른 것으로 변경하는 것입니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:192 +msgid "This feature allows you to easily change the prefix to a value of your choice or to a random value set by this plugin." +msgstr "이 기능을 사용하면 접두사를 원하는 값또는 이 플러그인으로 설정한 임의값으로 쉽게 변경할 수 있습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:198 +msgid "Database prefix options" +msgstr "DB 접두사 옵션" + +#: admin/wp-security-database-menu.php:210 +msgid "database backup" +msgstr "DB 백업" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:211 +msgid "It is recommended that you perform a %s before using this feature" +msgstr "이 기능을 사용하기 전에 %s를 수행하는 것이 좋습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:221 +msgid "Current database table prefix" +msgstr "현재 DB 테이블 접두사" + +#: admin/wp-security-database-menu.php:227 +msgid "Your site is currently using the default WordPress database prefix value of \"wp_\"." +msgstr "" + +#: admin/wp-security-database-menu.php:227 +msgid "To increase your site's security you should consider changing the database prefix value to another value." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:234 +msgid "Generate new database table prefix" +msgstr "새 DB 테이블 접두사 생성" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:238 +msgid "Check this if you want the plugin to generate a random 6 character string for the table prefix" +msgstr "플러그인이 테이블 접두사에 대한 임의의 6 자 문자열을 생성하려는 경우이 확인" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:239 +msgid "OR" +msgstr "또는" + +#: admin/wp-security-database-menu.php:241 +msgid "Choose your own database prefix by specifying a string which contains letters and/or numbers and/or underscores. Example: xyz_" +msgstr "" + +#: admin/wp-security-database-menu.php:265 +msgid "Take a database backup using UpdraftPlus" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:270 +msgid "Manual backup" +msgstr "수동 백업" + +#: admin/wp-security-database-menu.php:274 +msgid "UpdraftPlus Backup/Restore" +msgstr "" + +#: admin/wp-security-database-menu.php:274 +msgid "Your backups are on the UpdraftPlus Backup/Restore admin page." +msgstr "" + +#: admin/wp-security-database-menu.php:276 +msgid "Create database backup now" +msgstr "" + +#: admin/wp-security-database-menu.php:308 +msgid "Error - Could not get tables or no tables found!" +msgstr "오류 - 테이블을 얻을 수 없거나 테이블을 찾을 수 없습니다!" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:312 +msgid "Starting DB prefix change operations....." +msgstr "시작 DB 접두사 변경 작업....." + +#: admin/wp-security-database-menu.php:314 +msgid "Your WordPress system has a total of %s tables and your new DB prefix will be: %s" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:320 +#: classes/wp-security-utility.php:306 +msgid "Failed to make a backup of the wp-config.php file. This operation will not go ahead." +msgstr "wp-config.php 파일의 백업을 하지 못했습니다. 이 작업은 진행되지 않습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:324 +msgid "A backup copy of your wp-config.php file was created successfully!" +msgstr "wp-config.php 파일의 백업 복사본이 성공적으로 만들어졌습니다!" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:351 +msgid "%s table name update failed" +msgstr "%s 테이블 이름 업데이트 실패" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:363 +msgid "Please change the prefix manually for the above tables to: %s" +msgstr "위의 테이블에 대해 수동으로 접두사를 변경하십시오: %s" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:366 +msgid "%s tables had their prefix updated successfully!" +msgstr "%s 테이블은 접두사를 성공적으로 업데이트했습니다!" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:387 +msgid "wp-config.php file was updated successfully!" +msgstr "wp-config.php 파일이 성공적으로 업데이트되었습니다!" + +#: admin/wp-security-database-menu.php:390 +msgid "The \"wp-config.php\" file was not able to be modified." +msgstr "" + +#: admin/wp-security-database-menu.php:390 +msgid "Please modify this file manually using your favourite editor and search for variable \"$table_prefix\" and assign the following value to that variable: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:401 +#: admin/wp-security-database-menu.php:420 +msgid "Update of table %s failed: unable to change %s to %s" +msgstr "테이블 %s 업데이트 실패: %s를 %s로 변경할 수 없음" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:405 +msgid "The options table records which had references to the old DB prefix were updated successfully!" +msgstr "이전 DB 접두사에 대한 참조가 있는 옵션 테이블 레코드가 성공적으로 업데이트되었습니다!" + +#: admin/wp-security-database-menu.php:424 +msgid "The %s table records which had references to the old DB prefix were updated successfully!" +msgstr "이전 DB 접두사에 대한 참조가 있는 %s 테이블 레코드가 성공적으로 업데이트되었습니다!" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:452 +msgid "Error updating user_meta table where new meta_key = %s, old meta_key = %s and user_id = %s." +msgstr "새 meta_key = %s, 이전 meta_key = %s 및 user_id = %s가 있는 user_meta 테이블을 업데이트하는 오류입니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:457 +msgid "The usermeta table records which had references to the old DB prefix were updated successfully!" +msgstr "이전 DB 접두사에 대한 참조가 있는 사용자메타 테이블 레코드가 성공적으로 업데이트되었습니다!" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:459 +msgid "The database prefix change tasks have been completed." +msgstr "DB 접두사 변경 작업이 완료되었습니다." + +#: admin/wp-security-database-menu.php:503 +msgid "Checking for MySQL tables of type \"view\"....." +msgstr "유형 \"보기\"의 MySQL 테이블을 확인합니다.." + +#: admin/wp-security-database-menu.php:520 +msgid "Update of the following MySQL view definition failed: %s" +msgstr "다음 MySQL 보기 정의 업데이트 실패: %s" + +#: admin/wp-security-database-menu.php:527 +msgid "%s view definitions were updated successfully!" +msgstr "%s 보기 정의가 성공적으로 업데이트되었습니다!" + +#: admin/wp-security-filescan-menu.php:26 +#: classes/grade-system/wp-security-feature-item-manager.php:127 +msgid "File change detection" +msgstr "파일 변경 감지" + +#: admin/wp-security-filescan-menu.php:27 +msgid "Malware scan" +msgstr "악성 코드 검사" + +#: admin/wp-security-filescan-menu.php:88 +msgid "There have been no file changes since the last scan." +msgstr "마지막 검사 이후 파일 변경 사항이 없습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:98 +msgid "Nonce check failed for manual file change detection scan operation!" +msgstr "Nonce 확인 수동 파일 변경 감지 검사 작업에 대 한 실패!" + +#: admin/wp-security-filescan-menu.php:104 +msgid "There was an error during the file change detection scan. Please check the AIOS logs." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:110 +msgid "The plugin has detected that this is your first file change detection scan. The file details from this scan will be used to detect file changes for future scans." +msgstr "플러그인이 첫 번째 파일 변경 감지 검사임을 감지했습니다. 이 검사의 파일 세부 정보는 향후 검사에 대한 파일 변경 내용을 감지하는 데 사용됩니다!" + +#: admin/wp-security-filescan-menu.php:112 +msgid "Scan complete - There were no file changes detected!" +msgstr "검사 완료 - 파일 변경 사항이 검색되지 않았습니다!" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:133 +msgid "You entered a non numeric value for the \"backup time interval\" field. It has been set to the default value." +msgstr "\"백업 시간 간격\" 필드에 대한 비 숫자 값을 입력했습니다. 기본 값으로 설정되었습니다." + +#: admin/wp-security-filescan-menu.php:167 +msgid "The following address was removed because it is not a valid email address: " +msgstr "유효한 이메일 주소가 아니므로 다음 주소가 삭제되었습니다." + +#: admin/wp-security-filescan-menu.php:206 +msgid "NEW SCAN COMPLETED: The plugin has detected that you have made changes to the \"File Types To Ignore\" or \"Files To Ignore\" fields." +msgstr "" + +#: admin/wp-security-filescan-menu.php:206 +msgid "In order to ensure that future scan results are accurate, the old scan data has been refreshed." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:215 +msgid "All In One WP Security & Firewall has detected that there was a change in your host's files." +msgstr "모든 하나의 WP 보안 및 방화벽은 호스트의 파일에 변경이 있음을 감지했습니다." + +#: admin/wp-security-filescan-menu.php:217 +msgid "View scan details and clear this message" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:226 +msgid "If given an opportunity hackers can insert their code or files into your system which they can then use to carry out malicious acts on your site." +msgstr "기회가 주어진 경우 해커는 자신의 코드 또는 파일을 시스템에 삽입할 수 있으며, 이 파일을 시스템에 삽입하여 사이트에서 악의적인 행위를 수행하는 데 사용할 수 있습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:227 +msgid "Being informed of any changes in your files can be a good way to quickly prevent a hacker from causing damage to your website." +msgstr "파일의 변경 사항을 알리는 것은 해커가 웹 사이트에 손상을 입히는 것을 신속하게 방지하는 좋은 방법이 될 수 있습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:228 +msgid "In general, WordPress core and plugin files and file types such as \".php\" or \".js\" should not change often and when they do, it is important that you are made aware when a change occurs and which file was affected." +msgstr "일반적으로 워드 프레스 코어 및 플러그인 파일 및 \".php\" 또는 \".js\"와 같은 파일 유형은 자주 변경되지 않아야하며, 그렇게 할 때 변경이 발생하고 어떤 파일이 영향을 받은 지 알 수 있어야 합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:229 +msgid "The \"File Change Detection Feature\" will notify you of any file change which occurs on your system, including the addition and deletion of files by performing a regular automated or manual scan of your system's files." +msgstr "\"파일 변경 감지 기능\"은 시스템 파일의 정기적인 자동 또는 수동 스캔을 수행하여 파일의 추가 및 삭제를 포함하여 시스템에서 발생하는 파일 변경 사항을 알려줍니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:230 +msgid "This feature also allows you to exclude certain files or folders from the scan in cases where you know that they change often as part of their normal operation. (For example log files and certain caching plugin files may change often and hence you may choose to exclude such files from the file change detection scan)" +msgstr "또한 이 기능을 사용하면 정규 작업의 일부로 자주 변경되는 경우 특정 파일 이나 폴더를 검색에서 제외할 수 있습니다. (예를 들어 로그 파일 및 특정 캐싱 플러그인 파일은 자주 변경될 수 있으므로 파일 변경 검색에서 이러한 파일을 제외하도록 선택할 수 있습니다.)" + +#: admin/wp-security-filescan-menu.php:241 +msgid "It appears that your server is using an old PHP version which is missing the %s. The file scanner feature needs this class in order to work. If you would like to use this feature please upgrade your server PHP version to 5.3 or greater." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:249 +msgid "Manual file change detection scan" +msgstr "수동 파일 변경 감지 스캔" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:255 +msgid "To perform a manual file change detection scan click on the button below." +msgstr "수동 파일 변경 검색 스캔을 수행하려면 아래 버튼을 클릭하십시오." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:258 +msgid "Perform scan now" +msgstr "지금 검사 수행" + +#: admin/wp-security-filescan-menu.php:262 +msgid "View last saved file change results" +msgstr "마지막으로 저장된 파일 변경 결과 보기" + +#: admin/wp-security-filescan-menu.php:268 +msgid "Click the button below to view the saved file change results from the last scan." +msgstr "아래 버튼을 클릭하여 마지막 검사에서 저장된 파일 변경 결과를 봅니다." + +#: admin/wp-security-filescan-menu.php:271 +msgid "View last file change" +msgstr "마지막 파일 변경 보기" + +#: admin/wp-security-filescan-menu.php:275 +msgid "File change detection settings" +msgstr "파일 변경 검색 설정" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:287 +msgid "Enable automated file change detection scan" +msgstr "자동 파일 변경 감지 검색 활성화" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:290 +msgid "Check this if you want the system to automatically/periodically scan your files to check for file changes based on the settings below" +msgstr "시스템이 파일을 자동으로/주기적으로 스캔하여 아래 설정에 따라 파일 변경 사항을 확인하려면 이 방법을 확인합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:294 +msgid "Scan time interval" +msgstr "스캔 시간 간격" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:297 +msgid "Hours" +msgstr "시간" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:298 +msgid "Days" +msgstr "일" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:299 +msgid "Weeks" +msgstr "주" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:301 +msgid "Set the value for how often you would like a scan to occur" +msgstr "검사를 수행하려는 빈도에 대한 값을 설정합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:305 +msgid "File types to ignore" +msgstr "무시할 파일 유형" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:308 +msgid "Enter each file type or extension on a new line which you wish to exclude from the file change detection scan." +msgstr "파일 변경 검색검색에서 제외하려는 새 줄에 각 파일 유형 또는 확장을 입력합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:312 +msgid "You can exclude file types from the scan which would not normally pose any security threat if they were changed. These can include things such as image files." +msgstr "일반적으로 보안 위협이 변경되지 않는 검색에서 파일 형식을 제외할 수 있습니다. 여기에는 이미지 파일과 같은 것들이 포함될 수 있습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:313 +msgid "Example: If you want the scanner to ignore files of type jpg, png, and bmp, then you would enter the following:" +msgstr "예: 스캐너가 jpg, png 및 bmp 유형 의 파일을 무시하려면 다음을 입력합니다." + +#: admin/wp-security-filescan-menu.php:314 +msgid "jpg" +msgstr "" + +#: admin/wp-security-filescan-menu.php:315 +msgid "png" +msgstr "" + +#: admin/wp-security-filescan-menu.php:316 +msgid "bmp" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:322 +msgid "Files/Directories to ignore" +msgstr "무시할 파일/디렉터리" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:325 +msgid "Enter each file or directory on a new line which you wish to exclude from the file change detection scan." +msgstr "파일 변경 검색 검색에서 제외하려는 새 줄에 각 파일 또는 디렉터리를 입력합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:329 +msgid "You can exclude specific files/directories from the scan which would not normally pose any security threat if they were changed. These can include things such as log files." +msgstr "특정 파일/디렉터리가 변경된 경우 일반적으로 보안 위협을 제기하지 않는 검색에서 제외할 수 있습니다. 여기에는 로그 파일과 같은 것들이 포함될 수 있습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:330 +msgid "Example: If you want the scanner to ignore certain files in different directories or whole directories, then you would enter the following:" +msgstr "예: 스캐너가 다른 디렉터리 또는 전체 디렉터리의 특정 파일을 무시하려면 다음을 입력합니다." + +#: admin/wp-security-filescan-menu.php:331 +msgid "cache/config/master.php" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:332 +msgid "somedirectory" +msgstr "일부 디렉터리" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:339 +msgid "Send email when change detected" +msgstr "변경이 감지되면 이메일 보내기" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:343 +msgid "Check this if you want the system to email you if a file change was detected" +msgstr "파일 변경이 감지된 경우 시스템에서 이메일을 보내려면 이 방법을 확인합니다." + +#: admin/wp-security-filescan-menu.php:347 +msgid "Enter one or more email addresses on a new line." +msgstr "새 줄에 하나 이상의 이메일 주소를 입력합니다." + +#: admin/wp-security-filescan-menu.php:364 +msgid "What is malware?" +msgstr "악성 코드란 무엇입니까?" + +#: admin/wp-security-filescan-menu.php:365 +msgid "The word malware stands for Malicious Software. It can consist of things like trojan horses, adware, worms, spyware and any other undesirable code which a hacker will try to inject into your website." +msgstr "악성 코드라는 단어는 악성 소프트웨어를 의미합니다. 그것은 트로이 목마 같은 것 들 구성될 수 있습니다., 애드웨어, 웜, 스파이웨어 및 해커 웹사이트에 주입 하려고 합니다 다른 바람직하지 않은 코드." + +#: admin/wp-security-filescan-menu.php:366 +msgid "Often when malware code has been inserted into your site you will normally not notice anything out of the ordinary based on appearances, but it can have a dramatic effect on your site's search ranking." +msgstr "종종 악성 코드는 사이트에 삽입 된 경우 당신은 일반적으로 외모에 따라 일반 아무것도 통지하지 않습니다, 하지만 사이트의 검색 순위에 극적인 영향을 미칠 수 있습니다." + +#: admin/wp-security-filescan-menu.php:367 +msgid "This is because the bots and spiders from search engines such as Google have the capability to detect malware when they are indexing the pages on your site, and consequently they can blacklist your website which will in turn affect your search rankings." +msgstr "Google과 같은 검색 엔진의 봇과 거미는 사이트의 페이지를 인덱싱할 때 맬웨어를 탐지할 수 있으며, 따라서 웹 사이트를 블랙리스트에 표시하여 검색 순위에 영향을 줄 수 있기 때문입니다." + +#: admin/wp-security-filescan-menu.php:369 +msgid "CLICK HERE" +msgstr "" + +#: admin/wp-security-filescan-menu.php:371 +msgid "Scanning for malware" +msgstr "악성 코드 검사중" + +#: admin/wp-security-filescan-menu.php:372 +msgid "Due to the constantly changing and complex nature of Malware, scanning for such things using a standalone plugin will not work reliably. This is something best done via an external scan of your site regularly." +msgstr "악성 코드는 끊임없이 변화하고 복잡한 특성으로 인해 독립 형 플러그인을 사용하여 이러한 것들을 검사하는 것은 안정적으로 작동하지 않습니다. 이것은 정기적으로 사이트의 외부 검사를 통해 수행 하는 것이 가장 좋습니다." + +#: admin/wp-security-filescan-menu.php:373 +msgid "This is why we have created an easy-to-use scanning service which is hosted off our own server which will scan your site for malware once every day and notify you if it finds anything." +msgstr "이 때문에 우리는 매일 한 번 악성 코드에 대한 사이트를 스캔하고 아무것도 발견하면 알려 우리의 자신의 서버에서 호스팅되는 사용하기 쉬운 스캔 서비스를 만들었습니다." + +#: admin/wp-security-filescan-menu.php:374 +msgid "When you sign up for this service you will get the following:" +msgstr "이 서비스에 가입하면 다음을 얻을 수 있습니다." + +#: admin/wp-security-filescan-menu.php:376 +msgid "Automatic daily scan of 1 website" +msgstr "1 웹 사이트의 자동 일일 검사" + +#: admin/wp-security-filescan-menu.php:377 +msgid "Automatic malware and blacklist monitoring" +msgstr "" + +#: admin/wp-security-filescan-menu.php:378 +msgid "Automatic email alerting" +msgstr "자동 이메일 경고" + +#: admin/wp-security-filescan-menu.php:379 +msgid "Site uptime monitoring" +msgstr "사이트 가동 시간 모니터링" + +#: admin/wp-security-filescan-menu.php:380 +msgid "Site response time monitoring" +msgstr "현장 대응 시간 모니터링" + +#: admin/wp-security-filescan-menu.php:381 +msgid "We provide advice for malware cleanup" +msgstr "우리는 악성 코드 정리에 대한 조언을 제공합니다" + +#: admin/wp-security-filescan-menu.php:382 +msgid "Blacklist removal" +msgstr "블랙리스트 제거" + +#: admin/wp-security-filescan-menu.php:383 +msgid "No contract (cancel anytime)" +msgstr "" + +#: admin/wp-security-filescan-menu.php:385 +msgid "To learn more please %s." +msgstr "자세한 내용은 %s를 참조하십시오." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:406 +msgid "Latest file change scan results" +msgstr "최신 파일 변경 검사 결과" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:416 +msgid "The following files were added to your host." +msgstr "호스트에 다음 파일이 추가되었습니다." + +#: admin/wp-security-filescan-menu.php:419 +#: admin/wp-security-filescan-menu.php:440 +#: admin/wp-security-filescan-menu.php:464 +msgid "File" +msgstr "" + +#: admin/wp-security-filescan-menu.php:420 +#: admin/wp-security-filescan-menu.php:441 +#: admin/wp-security-filescan-menu.php:465 +msgid "File size" +msgstr "" + +#: admin/wp-security-filescan-menu.php:421 +#: admin/wp-security-filescan-menu.php:442 +#: admin/wp-security-filescan-menu.php:466 +msgid "File modified" +msgstr "" + +#: admin/wp-security-filescan-menu.php:437 +msgid "The following files were removed from your host." +msgstr "" + +#: admin/wp-security-filescan-menu.php:461 +msgid "The following files were changed on your host." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:26 +#: classes/grade-system/wp-security-feature-item-manager.php:69 +msgid "File permissions" +msgstr "파일 사용 권한" + +#: admin/wp-security-filesystem-menu.php:27 +msgid "PHP file editing" +msgstr "PHP 파일 편집" + +#: admin/wp-security-filesystem-menu.php:28 +msgid "WP file access" +msgstr "WP 파일 액세스" + +#: admin/wp-security-filesystem-menu.php:29 +msgid "Host system logs" +msgstr "호스트 시스템 로그" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filesystem-menu.php:55 +msgid "Filesystem security" +msgstr "파일 시스템 보안" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filesystem-menu.php:80 +msgid "Nonce check failed for manual DB backup operation!" +msgstr "Nonce 확인 수동 DB 백업 작업에 대 한 실패!" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filesystem-menu.php:90 +msgid "The permissions for %s were successfully changed to %s" +msgstr "%s에 대한 사용 권한은 %s로 성공적으로 변경되었습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filesystem-menu.php:94 +msgid "Unable to change permissions for %s!" +msgstr "%s에 대한 권한을 변경할 수 없습니다!" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filesystem-menu.php:100 +msgid "File permissions scan" +msgstr "파일 권한 검사" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filesystem-menu.php:103 +msgid "Your WordPress file and folder permission settings govern the accessibility and read/write privileges of the files and folders which make up your WP installation." +msgstr "워드 프레스 파일 및 폴더 권한 설정은 액세스 가능성을 제어하고 WP 설치를 구성하는 파일 및 폴더의 권한을 읽고 작성합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filesystem-menu.php:104 +msgid "Your WP installation already comes with reasonably secure file permission settings for the filesystem." +msgstr "WP 설치에는 파일 시스템에 대한 합리적으로 안전한 파일 권한 설정이 이미 함께 제공됩니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filesystem-menu.php:105 +msgid "However, sometimes people or other plugins modify the various permission settings of certain core WP folders or files such that they end up making their site less secure because they chose the wrong permission values." +msgstr "그러나 때로는 사람 또는 다른 플러그인이 잘못된 권한 값을 선택했기 때문에 사이트를 덜 안전하게 만들 수 있도록 특정 핵심 WP 폴더 또는 파일의 다양한 권한 설정을 수정합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filesystem-menu.php:106 +msgid "This feature will scan the critical WP core folders and files and will highlight any permission settings which are insecure." +msgstr "이 기능은 중요한 WP 핵심 폴더와 파일을 스캔하고 안전하지 않은 모든 권한 설정을 강조 표시합니다." + +#: admin/wp-security-filesystem-menu.php:114 +msgid "This plugin has detected that your site is running on a Windows server." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:115 +msgid "This feature is not applicable for Windows server installations." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:121 +msgid "WP directory and file permissions scan results" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filesystem-menu.php:133 +#: admin/wp-security-filesystem-menu.php:152 +msgid "Name" +msgstr "이름" + +#: admin/wp-security-filesystem-menu.php:134 +#: admin/wp-security-filesystem-menu.php:153 +msgid "File/Folder" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:135 +#: admin/wp-security-filesystem-menu.php:154 +msgid "Current permissions" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:136 +#: admin/wp-security-filesystem-menu.php:155 +msgid "Recommended permissions" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:137 +#: admin/wp-security-filesystem-menu.php:156 +msgid "Recommended action" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:195 +msgid "Your PHP file editing settings were saved successfully." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:199 +msgid "Operation failed! Unable to modify or make a backup of wp-config.php file!" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:212 +#: classes/grade-system/wp-security-feature-item-manager.php:71 +msgid "File editing" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:215 +msgid "The WordPress Dashboard by default allows administrators to edit PHP files, such as plugin and theme files." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:216 +msgid "This is often the first tool an attacker will use if able to login, since it allows code execution." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:217 +msgid "This feature will disable the ability for people to edit PHP files via the dashboard." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:223 +msgid "Disable PHP file editing" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:235 +msgid "Disable ability to edit PHP files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:238 +msgid "Check this if you want to remove the ability for people to edit PHP files via the WP dashboard" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:282 +msgid "You have successfully saved the Prevent Access to Default WP Files configuration." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filesystem-menu.php:286 +#: admin/wp-security-firewall-menu.php:126 +#: admin/wp-security-firewall-menu.php:346 +#: admin/wp-security-firewall-menu.php:613 +#: admin/wp-security-firewall-menu.php:912 +#: admin/wp-security-settings-menu.php:772 +#: admin/wp-security-spam-menu.php:124 +msgid "Could not write to the .htaccess file. Please check the file permissions." +msgstr ".htaccess 파일에 쓸 수 없습니다. 파일 권한을 확인하십시오." + +#: admin/wp-security-filesystem-menu.php:291 +msgid "WordPress files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:294 +msgid "This feature allows you to prevent access to files such as %s, %s and %s which are delivered with all WP installations." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:295 +msgid "By preventing access to these files you are hiding some key pieces of information (such as WordPress version info) from potential hackers." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:300 +msgid "Prevent access to default WP files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:311 +msgid "Prevent access to WP default install files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:314 +msgid "Check this if you want to prevent access to readme.html, license.txt and wp-config-sample.php." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:318 +msgid "Save setting" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:342 +msgid "System logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:345 +msgid "Sometimes your hosting platform will produce error or warning logs in a file called \"error_log\"." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:346 +msgid "Depending on the nature and cause of the error or warning, your hosting server can create multiple instances of this file in numerous directory locations of your WordPress installation." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:347 +msgid "By occasionally viewing the contents of these logs files you can keep informed of any underlying problems on your system which you might need to address." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:353 +msgid "View system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:355 +msgid "Please click the button below to view the latest system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:358 +msgid "Enter System Log File Name" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:360 +msgid "Enter your system log file name. (Defaults to error_log)" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:363 +msgid "View latest system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:365 +msgid "Loading..." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:382 +msgid "No system logs were found." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:435 +msgid "Set recommended permissions" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filesystem-menu.php:441 +msgid "No action required" +msgstr "필요한 조치가 없습니다." + +#: admin/wp-security-filesystem-menu.php:481 +msgid "Showing latest entries of error_log file: %s" +msgstr "" + +#: admin/wp-security-firewall-menu.php:28 +msgid "Basic firewall rules" +msgstr "기본 방화벽 규칙" + +#: admin/wp-security-firewall-menu.php:29 +msgid "Additional firewall rules" +msgstr "추가 방화벽 규칙" + +#: admin/wp-security-firewall-menu.php:30 +msgid "6G Blacklist firewall rules" +msgstr "6G 블랙리스트 방화벽 규칙" + +#: admin/wp-security-firewall-menu.php:31 +msgid "Internet bots" +msgstr "인터넷 봇" + +#: admin/wp-security-firewall-menu.php:32 +msgid "Prevent hotlinks" +msgstr "핫링크 방지" + +#: admin/wp-security-firewall-menu.php:33 +msgid "404 detection" +msgstr "404 감지" + +#: admin/wp-security-firewall-menu.php:34 +msgid "Custom rules" +msgstr "사용자 지정 규칙" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:122 +#: admin/wp-security-firewall-menu.php:908 +#: admin/wp-security-spam-menu.php:120 +#: admin/wp-security-spam-menu.php:494 +#: admin/wp-security-spam-menu.php:556 +#: admin/wp-security-user-registration-menu.php:95 +msgid "Settings were successfully saved" +msgstr "설정이 저장되었습니다" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:131 +#: admin/wp-security-firewall-menu.php:651 +msgid "Firewall settings" +msgstr "방화벽 설정" + +#: admin/wp-security-firewall-menu.php:138 +msgid "This should not have any impact on your site's general functionality but if you wish you can take a %s of your .htaccess file before proceeding." +msgstr "" + +#: admin/wp-security-firewall-menu.php:139 +msgid "The features in this tab allow you to activate some basic firewall security protection rules for your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:140 +msgid "The firewall functionality is achieved via the insertion of special code into your currently active .htaccess file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:151 +msgid "You have enabled the \"Completely Block Access To XMLRPC\" checkbox which means all XMLRPC functionality will be blocked." +msgstr "" + +#: admin/wp-security-firewall-menu.php:152 +msgid "By leaving this feature enabled you will prevent Jetpack or Wordpress iOS or other apps which need XMLRPC from working correctly on your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:153 +msgid "If you still need XMLRPC then uncheck the \"Completely Block Access To XMLRPC\" checkbox and enable only the \"Disable Pingback Functionality From XMLRPC\" checkbox." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:163 +msgid "Basic firewall settings" +msgstr "기본 방화벽 설정" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:171 +msgid "Enable basic firewall protection" +msgstr "기본 방화벽 보호 활성화" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:174 +msgid "Check this if you want to apply basic firewall protection to your site." +msgstr "사이트에 기본 방화벽 보호를 적용하려는 경우 이 방법을 확인합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:178 +msgid "This setting will implement the following basic firewall protection mechanisms on your site:" +msgstr "이 설정은 사이트에서 다음과 같은 기본 방화벽 보호 메커니즘을 구현합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:179 +msgid "1) Protect your htaccess file by denying access to it." +msgstr "1) 액세스 권한을 거부하여 htaccess 파일을 보호합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:180 +msgid "2) Disable the server signature." +msgstr "2) 서버 서명을 사용하지 않도록 설정합니다." + +#: admin/wp-security-firewall-menu.php:181 +msgid "3) Limit file upload size (%sMB)." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:182 +msgid "4) Protect your wp-config.php file by denying access to it." +msgstr "4) 그것에 대한 액세스를 거부하여 wp-config.php 파일을 보호합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:183 +msgid "The above firewall features will be applied via your .htaccess file and should not affect your site's overall functionality." +msgstr "위의 방화벽 기능은 .htaccess 파일을 통해 적용되며 사이트의 전반적인 기능에영향을 미치지 않아야 합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:184 +msgid "You are still advised to take a backup of your active .htaccess file just in case." +msgstr "활성 .htaccess 파일의 백업을 하는 것이 좋습니다." + +#: admin/wp-security-firewall-menu.php:190 +msgid "Max file upload size (MB)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:192 +msgid "The value for the maximum file upload size used in the .htaccess file. (Defaults to %sMB if left blank)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:200 +msgid "WordPress XMLRPC and pingback vulnerability protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:208 +msgid "Completely block access to XMLRPC" +msgstr "XMLRPC에 대한 액세스를 완전히 차단합니다." + +#: admin/wp-security-firewall-menu.php:211 +msgid "Check this if you are not using the WP XML-RPC functionality and you want to completely block external access to XMLRPC." +msgstr "WP XML-RPC 기능을 사용하지 않고 XMLRPC에 대한 외부 액세스를 완전히 차단하려는 경우 이 기능을 확인합니다." + +#: admin/wp-security-firewall-menu.php:215 +msgid "This setting will add a directive in your .htaccess to disable access to the WordPress xmlrpc.php file which is responsible for the XML-RPC functionality in WordPress." +msgstr "이 설정은 워드 프레스의 XML-RPC 기능에 대한 책임이있는 워드 프레스 xmlrpc.php 파일에 대한 액세스를 비활성화하려면 .htaccess에 지시문을 추가합니다." + +#: admin/wp-security-firewall-menu.php:216 +msgid "Hackers can exploit various vulnerabilities in the WordPress XML-RPC API in a number of ways such as:" +msgstr "해커는 다음과 같은 여러 가지 방법으로 워드 프레스 XML-RPC API의 다양한 취약점을 악용 할 수 있습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:217 +msgid "1) Denial of Service (DoS) attacks" +msgstr "1) 서비스 거부(DoS) 공격" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:218 +msgid "2) Hacking internal routers." +msgstr "2) 해킹 내부 라우터." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:219 +msgid "3) Scanning ports in internal networks to get info from various hosts." +msgstr "3) 다양한 호스트로부터 정보를 얻기 위해 내부 네트워크에서 포트를 스캔합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:220 +msgid "Apart from the security protection benefit, this feature may also help reduce load on your server, particularly if your site currently has a lot of unwanted traffic hitting the XML-RPC API on your installation." +msgstr "보안 보호 이점 외에도 이 기능은 특히 사이트에 현재 설치시 XML-RPC API에 영향을 미치는 원치 않는 트래픽이 많은 경우 서버의 부하를 줄이는 데 도움이 될 수 있습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:221 +msgid "NOTE: You should only enable this feature if you are not currently using the XML-RPC functionality on your WordPress installation." +msgstr "참고: 현재 WordPress 설치에서 XML-RPC 기능을 사용하지 않는 경우에만 이 기능을 사용하도록 설정해야 합니다." + +#: admin/wp-security-firewall-menu.php:222 +msgid "Leave this feature disabled and use the feature below if you want pingback protection but you still need XMLRPC." +msgstr "이 기능을 사용하지 않도록 두고 pingback 보호를 원하지만 여전히 XMLRPC가 필요한 경우 아래 기능을 사용합니다." + +#: admin/wp-security-firewall-menu.php:228 +msgid "Disable pingback functionality from XMLRPC" +msgstr "XMLRPC에서 Pingback 기능 비활성화" + +#: admin/wp-security-firewall-menu.php:231 +msgid "If you use Jetpack or WP iOS or other apps which need WP XML-RPC functionality then check this. This will enable protection against WordPress pingback vulnerabilities." +msgstr "Jetpack 또는 WP iOS 또는 WP XML-RPC 기능이 필요한 기타 앱을 사용하는 경우 이 기능을 확인합니다. 이렇게 하면 워드프레스 핑백 취약점을 보호할 수 있습니다." + +#: admin/wp-security-firewall-menu.php:235 +msgid "NOTE: If you use Jetpack or the Wordpress iOS or other apps then you should enable this feature but leave the \"Completely Block Access To XMLRPC\" checkbox unchecked." +msgstr "참고: Jetpack 또는 워드프레스 iOS 또는 기타 앱을 사용하는 경우 이 기능을 사용하도록 설정하지만 \"XMLRPC에 대한 완전히 차단\" 확인란을 선택하지 않은 상태로 두어야 합니다." + +#: admin/wp-security-firewall-menu.php:236 +msgid "The feature will still allow XMLRPC functionality on your site but will disable the pingback methods." +msgstr "이 기능은 여전히 사이트에서 XMLRPC 기능을 허용하지만 pingback 메서드를 비활성화합니다." + +#: admin/wp-security-firewall-menu.php:237 +msgid "This feature will also remove the \"X-Pingback\" header if it is present." +msgstr "이 기능은 \"X-Pingback\" 헤더가 있는 경우에도 제거합니다." + +#: admin/wp-security-firewall-menu.php:246 +msgid "Block access to debug log file" +msgstr "" + +#: admin/wp-security-firewall-menu.php:254 +msgid "Block access to debug.log file" +msgstr "디버그.로그 파일에 대한 액세스 차단" + +#: admin/wp-security-firewall-menu.php:257 +msgid "Check this if you want to block access to the debug.log file that WordPress creates when debug logging is enabled." +msgstr "디버그 로깅을 사용할 때 워드프레스가 만드는 debug.log 파일에 대한 액세스를 차단하려면 이 옵션을 확인합니다." + +#: admin/wp-security-firewall-menu.php:261 +msgid "WordPress has an option to turn on the debug logging to a file located in wp-content/debug.log. This file may contain sensitive information." +msgstr "워드 프레스는 wp-content/debug.log에 있는 파일에 디버그 로깅을 켤 수 있는 옵션이 있습니다. 이 파일에는 중요한 정보가 포함될 수 있습니다." + +#: admin/wp-security-firewall-menu.php:262 +msgid "Using this option will block external access to this file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:262 +msgid "You can still access this file by logging into your site via FTP." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:270 +msgid "Save basic firewall settings" +msgstr "기본 방화벽 설정 저장" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:342 +msgid "You have successfully saved the Additional Firewall Protection configuration" +msgstr "추가 방화벽 보호 구성을 성공적으로 저장했습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:356 +msgid "Additional firewall protection" +msgstr "추가 방화벽 보호" + +#: admin/wp-security-firewall-menu.php:360 +msgid "Due to the nature of the code being inserted to the .htaccess file, this feature may break some functionality for certain plugins and you are therefore advised to take a %s of .htaccess before applying this configuration." +msgstr "" + +#: admin/wp-security-firewall-menu.php:362 +msgid "This feature allows you to activate more advanced firewall settings to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:363 +msgid "The advanced firewall rules are applied via the insertion of special code to your currently active .htaccess file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:372 +msgid "Listing of directory contents" +msgstr "" + +#: admin/wp-security-firewall-menu.php:381 +#: classes/grade-system/wp-security-feature-item-manager.php:85 +msgid "Disable index views" +msgstr "" + +#: admin/wp-security-firewall-menu.php:384 +msgid "Check this if you want to disable directory and file listing." +msgstr "" + +#: admin/wp-security-firewall-menu.php:389 +msgid "By default, an Apache server will allow the listing of the contents of a directory if it doesn't contain an index.php file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:391 +msgid "This feature will prevent the listing of contents for all directories." +msgstr "" + +#: admin/wp-security-firewall-menu.php:393 +msgid "NOTE: In order for this feature to work \"AllowOverride\" of the Indexes directive must be enabled in your httpd.conf file. Ask your hosting provider to check this if you don't have access to httpd.conf" +msgstr "" + +#: admin/wp-security-firewall-menu.php:402 +msgid "Trace and track" +msgstr "" + +#: admin/wp-security-firewall-menu.php:411 +#: classes/grade-system/wp-security-feature-item-manager.php:86 +msgid "Disable trace and track" +msgstr "" + +#: admin/wp-security-firewall-menu.php:414 +msgid "Check this if you want to disable trace and track." +msgstr "" + +#: admin/wp-security-firewall-menu.php:419 +msgid "HTTP Trace attack (XST) can be used to return header requests and grab cookies and other information." +msgstr "" + +#: admin/wp-security-firewall-menu.php:421 +msgid "This hacking technique is usually used together with cross site scripting attacks (XSS)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:423 +msgid "Disabling trace and track on your site will help prevent HTTP Trace attacks." +msgstr "" + +#: admin/wp-security-firewall-menu.php:432 +msgid "Proxy comment posting" +msgstr "" + +#: admin/wp-security-firewall-menu.php:442 +msgid "Forbid proxy comment posting" +msgstr "" + +#: admin/wp-security-firewall-menu.php:445 +msgid "Check this if you want to forbid proxy comment posting." +msgstr "" + +#: admin/wp-security-firewall-menu.php:450 +msgid "This setting will deny any requests that use a proxy server when posting comments." +msgstr "" + +#: admin/wp-security-firewall-menu.php:451 +msgid "By forbidding proxy comments you are in effect eliminating some spam and other proxy requests." +msgstr "" + +#: admin/wp-security-firewall-menu.php:460 +msgid "Bad query strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:470 +msgid "Deny bad query strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:473 +msgid "This will help protect you against malicious queries via XSS." +msgstr "" + +#: admin/wp-security-firewall-menu.php:478 +msgid "This feature will write rules in your .htaccess file to prevent malicious string attacks on your site using XSS." +msgstr "" + +#: admin/wp-security-firewall-menu.php:479 +msgid "NOTE: Some of these strings might be used for plugins or themes and hence this might break some functionality." +msgstr "" + +#: admin/wp-security-firewall-menu.php:480 +#: admin/wp-security-firewall-menu.php:510 +msgid "You are therefore strongly advised to take a backup of your active .htaccess file before applying this feature." +msgstr "" + +#: admin/wp-security-firewall-menu.php:489 +#: classes/grade-system/wp-security-feature-item-manager.php:89 +msgid "Advanced character string filter" +msgstr "" + +#: admin/wp-security-firewall-menu.php:499 +msgid "Enable advanced character string filter" +msgstr "" + +#: admin/wp-security-firewall-menu.php:502 +msgid "This will block bad character matches from XSS." +msgstr "" + +#: admin/wp-security-firewall-menu.php:507 +msgid "This is an advanced character string filter to prevent malicious string attacks on your site coming from Cross Site Scripting (XSS)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:508 +msgid "This setting matches for common malicious string patterns and exploits and will produce a 403 error for the hacker attempting the query." +msgstr "" + +#: admin/wp-security-firewall-menu.php:509 +msgid "NOTE: Some strings for this setting might break some functionality." +msgstr "" + +#: admin/wp-security-firewall-menu.php:518 +msgid "Save additional firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:609 +msgid "You have successfully saved the 5G/6G Firewall Protection configuration" +msgstr "" + +#: admin/wp-security-firewall-menu.php:633 +msgid "All in One WP Security and Firewall" +msgstr "" + +#: admin/wp-security-firewall-menu.php:634 +msgid "We were unable to access the firewall's configuration file:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:636 +msgid "As a result, the firewall will be unavailable." +msgstr "" + +#: admin/wp-security-firewall-menu.php:637 +msgid "Please check your PHP error log for further information." +msgstr "" + +#: admin/wp-security-firewall-menu.php:638 +msgid "If you're unable to locate your PHP log file, please contact your web hosting company to ask them where it can be found on their setup." +msgstr "" + +#: admin/wp-security-firewall-menu.php:655 +msgid "This feature allows you to activate the %s (or legacy %s) firewall security protection rules designed and produced by %s." +msgstr "" + +#: admin/wp-security-firewall-menu.php:656 +msgid "The 6G Blacklist is updated and improved version of 5G Blacklist. If you have 5G Blacklist active, you might consider activating 6G Blacklist instead." +msgstr "" + +#: admin/wp-security-firewall-menu.php:657 +msgid "The 6G Blacklist is a simple, flexible blacklist that helps reduce the number of malicious URL requests that hit your website." +msgstr "" + +#: admin/wp-security-firewall-menu.php:658 +msgid "The added advantage of applying the 6G firewall to your site is that it has been tested and confirmed by the people at PerishablePress.com to be an optimal and least disruptive set of .htaccess security rules for general WP sites running on an Apache server or similar." +msgstr "" + +#: admin/wp-security-firewall-menu.php:659 +msgid "Therefore the 6G firewall rules should not have any impact on your site's general functionality but if you wish you can take a %s of your .htaccess file before proceeding." +msgstr "" + +#: admin/wp-security-firewall-menu.php:665 +msgid "6G blacklist/firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:677 +msgid "Enable 6G firewall protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:680 +msgid "Check this if you want to apply the 6G Blacklist firewall protection from perishablepress.com to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:684 +msgid "This setting will implement the 6G security firewall protection mechanisms on your site which include the following things:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:685 +#: admin/wp-security-firewall-menu.php:703 +msgid "1) Block forbidden characters commonly used in exploitative attacks." +msgstr "" + +#: admin/wp-security-firewall-menu.php:686 +#: admin/wp-security-firewall-menu.php:704 +msgid "2) Block malicious encoded URL characters such as the \".css(\" string." +msgstr "" + +#: admin/wp-security-firewall-menu.php:687 +#: admin/wp-security-firewall-menu.php:705 +msgid "3) Guard against the common patterns and specific exploits in the root portion of targeted URLs." +msgstr "" + +#: admin/wp-security-firewall-menu.php:688 +#: admin/wp-security-firewall-menu.php:706 +msgid "4) Stop attackers from manipulating query strings by disallowing illicit characters." +msgstr "" + +#: admin/wp-security-firewall-menu.php:689 +#: admin/wp-security-firewall-menu.php:707 +msgid "....and much more." +msgstr "" + +#: admin/wp-security-firewall-menu.php:695 +msgid "Enable legacy 5G firewall protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:698 +msgid "Check this if you want to apply the 5G Blacklist firewall protection from perishablepress.com to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:702 +msgid "This setting will implement the 5G security firewall protection mechanisms on your site which include the following things:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:713 +msgid "Save 5G/6G firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:721 +msgid "6G block request methods" +msgstr "" + +#: admin/wp-security-firewall-menu.php:725 +msgid "HTTP Request methods are used by browsers and clients to communicate with servers to get responses." +msgstr "" + +#: admin/wp-security-firewall-menu.php:726 +msgid "GET and POST are the most commonly used methods to request and submit data for specified resources of the server." +msgstr "" + +#: admin/wp-security-firewall-menu.php:732 +msgid "Block %s method" +msgstr "" + +#: admin/wp-security-firewall-menu.php:735 +msgid "Check this to block the %s request method" +msgstr "" + +#: admin/wp-security-firewall-menu.php:740 +msgid "Some WooCommerce extensions use the PUT request method in addition to GET and POST." +msgstr "" + +#: admin/wp-security-firewall-menu.php:740 +msgid "This means WooCommerce users shouldn't block the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:741 +msgid "A few REST requests use the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:741 +msgid "If your site is communicated by the WP REST API, you should not block the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:749 +msgid "Save request methods settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:757 +msgid "6G other settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:761 +msgid "Block query strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:764 +msgid "Check this to block all query strings recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:768 +msgid "Block request strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:771 +msgid "Check this to block all request strings recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:775 +msgid "Block referrers" +msgstr "" + +#: admin/wp-security-firewall-menu.php:778 +msgid "Check this to block all referrers recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:782 +msgid "Block user-agents" +msgstr "" + +#: admin/wp-security-firewall-menu.php:785 +msgid "Check this to block all user-agents recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:789 +msgid "Save other settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:823 +msgid "The Internet bot settings were successfully saved" +msgstr "" + +#: admin/wp-security-firewall-menu.php:827 +msgid "Internet bot settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:833 +msgid "What is an Internet Bot" +msgstr "" + +#: admin/wp-security-firewall-menu.php:834 +msgid "%s?" +msgstr "" + +#: admin/wp-security-firewall-menu.php:836 +msgid "A bot is a piece of software which runs on the Internet and performs automatic tasks. For example when Google indexes your pages it uses automatic bots to achieve this task." +msgstr "" + +#: admin/wp-security-firewall-menu.php:837 +msgid "A lot of bots are legitimate and non-malicious but not all bots are good and often you will find some which try to impersonate legitimate bots such as \"Googlebot\" but in reality they have nohing to do with Google at all." +msgstr "" + +#: admin/wp-security-firewall-menu.php:838 +msgid "Although most of the bots out there are relatively harmless sometimes website owners want to have more control over which bots they allow into their site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:839 +msgid "This feature allows you to block bots which are impersonating as a Googlebot but actually aren't. (In other words they are fake Google bots)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:840 +msgid "Googlebots have a unique identity which cannot easily be forged and this feature will identify any fake Google bots and block them from reading your site's pages." +msgstr "" + +#: admin/wp-security-firewall-menu.php:846 +msgid "Attention: Sometimes non-malicious Internet organizations might have bots which impersonate as a \"Googlebot\"." +msgstr "" + +#: admin/wp-security-firewall-menu.php:847 +msgid "Just be aware that if you activate this feature the plugin will block all bots which use the \"Googlebot\" string in their User Agent information but are NOT officially from Google (irrespective whether they are malicious or not)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:848 +msgid "All other bots from other organizations such as \"Yahoo\", \"Bing\" etc will not be affected by this feature." +msgstr "" + +#: admin/wp-security-firewall-menu.php:854 +#: admin/wp-security-firewall-menu.php:864 +#: classes/grade-system/wp-security-feature-item-manager.php:93 +msgid "Block fake Googlebots" +msgstr "" + +#: admin/wp-security-firewall-menu.php:867 +msgid "Check this if you want to block all fake Googlebots." +msgstr "" + +#: admin/wp-security-firewall-menu.php:871 +msgid "This feature will check if the User Agent information of a bot contains the string \"Googlebot\"." +msgstr "" + +#: admin/wp-security-firewall-menu.php:872 +msgid "It will then perform a few tests to verify if the bot is legitimately from Google and if so it will allow the bot to proceed." +msgstr "" + +#: admin/wp-security-firewall-menu.php:873 +msgid "If the bot fails the checks then the plugin will mark it as being a fake Googlebot and it will block it" +msgstr "" + +#: admin/wp-security-firewall-menu.php:880 +msgid "Save internet bot settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:916 +#: admin/wp-security-firewall-menu.php:938 +#: classes/grade-system/wp-security-feature-item-manager.php:95 +msgid "Prevent image hotlinking" +msgstr "" + +#: admin/wp-security-firewall-menu.php:919 +msgid "A Hotlink is where someone displays an image on their site which is actually located on your site by using a direct link to the source of the image on your server." +msgstr "" + +#: admin/wp-security-firewall-menu.php:920 +msgid "Due to the fact that the image being displayed on the other person's site is coming from your server, this can cause leaking of bandwidth and resources for you because your server has to present this image for the people viewing it on someone elses's site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:921 +msgid "This feature will prevent people from directly hotlinking images from your site's pages by writing some directives in your .htaccess file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:926 +msgid "Prevent hotlinking" +msgstr "" + +#: admin/wp-security-firewall-menu.php:941 +msgid "Check this if you want to prevent hotlinking to images on your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:961 +msgid "Nonce check failed for delete all 404 event logs operation!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:972 +msgid "404 Detection Feature - Delete all 404 event logs operation failed!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:976 +msgid "All 404 event logs were deleted from the DB successfully!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1000 +msgid "You entered a non numeric value for the lockout time length field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1006 +msgid "You entered an incorrect format for the \"Redirect URL\" field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1039 +msgid "404 detection configuration" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1042 +msgid "A 404 or Not Found error occurs when somebody tries to access a non-existent page on your website." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1043 +msgid "Typically, most 404 errors happen quite innocently when people have mis-typed a URL or used an old link to page which doesn't exist anymore." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1044 +msgid "However, in some cases you may find many repeated 404 errors which occur in a relatively short space of time and from the same IP address which are all attempting to access a variety of non-existent page URLs." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1045 +msgid "Such behaviour can mean that a hacker might be trying to find a particular page or URL for sinister reasons." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1046 +msgid "This feature allows you to monitor all 404 events which occur on your site, and it also gives you the option of blocking IP addresses for a configured length of time." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1047 +msgid "If you want to temporarily block or blacklist an IP address, simply click the \"Temp Block\" or \"Blacklist IP\" link for the applicable IP entry in the \"404 Event Logs\" table below." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1071 +msgid "404 detection options" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1083 +msgid "Enable 404 IP detection and lockout" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1086 +msgid "Check this if you want to enable the lockout of selected IP addresses." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1091 +msgid "When you enable this checkbox, all 404 events on your site will be logged in the table below. You can monitor these events and select some IP addresses listed in the table below and block them for a specified amount of time. All IP addresses you select to be blocked from the \"404 Event Logs\" table section will be unable to access your site during the time specified." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1099 +msgid "Enable 404 event logging" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1102 +msgid "Check this if you want to enable the logging of 404 events" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1107 +msgid "Time length of 404 lockout (minutes)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1109 +msgid "Set the length of time for which a blocked IP address will be prevented from visiting your site" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1114 +msgid "You can lock any IP address which is recorded in the \"404 Event Logs\" table section below." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1116 +msgid "To temporarily lock an IP address, hover over the ID column and click the \"Temp Block\" link for the applicable IP entry." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1123 +msgid "404 lockout redirect URL" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1125 +msgid "A blocked visitor will be automatically redirected to this URL." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1135 +msgid "This list displays the 404 event logs when somebody tries to access a non-existent page on your website." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1136 +msgid "404 event logs that are older than %1$d days are purged automatically." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1141 +msgid "404 event logs" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1163 +#: admin/wp-security-firewall-menu.php:1172 +#: admin/wp-security-user-login-menu.php:495 +#: admin/wp-security-user-login-menu.php:504 +#: admin/wp-security-user-login-menu.php:653 +#: admin/wp-security-user-login-menu.php:662 +msgid "Export to CSV" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1169 +#: admin/wp-security-user-login-menu.php:501 +#: admin/wp-security-user-login-menu.php:659 +msgid "Click this button if you wish to download this log in CSV format." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1176 +#: admin/wp-security-firewall-menu.php:1185 +msgid "Delete all 404 event logs" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1182 +msgid "Click this button if you wish to purge all 404 event logs from the DB." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1241 +msgid "Custom .htaccess rules settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1248 +msgid "This feature can be used to apply your own custom .htaccess rules and directives." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1249 +msgid "It is useful for when you want to tweak our existing firewall rules or when you want to add your own." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1250 +msgid "NOTE: This feature can only be used if your site is hosted in an apache or similar web server." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1256 +msgid "Warning: Only use this feature if you know what you are doing." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1257 +msgid "Incorrect .htaccess rules or directives can break or prevent access to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1258 +msgid "It is your responsibility to ensure that you are entering the correct code!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1259 +msgid "If you break your site you will need to access your server via FTP or something similar and then edit your .htaccess file and delete the changes you made." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1265 +msgid "Custom .htaccess rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1269 +msgid "Enable custom .htaccess rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1272 +msgid "Check this if you want to enable custom rules entered in the text box below" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1276 +msgid "Place custom rules at the top" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1279 +msgid "Check this if you want to place your custom rules at the beginning of all the rules applied by this plugin" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1283 +msgid "Enter custom .htaccess rules:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1287 +msgid "Enter your custom .htaccess rules/directives." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1292 +msgid "Save custom rules" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:338 +#: admin/wp-security-firewall-setup-notice.php:407 +#: admin/wp-security-firewall-setup-notice.php:479 +#: admin/wp-security-firewall-setup-notice.php:595 +#: wp-security.php:43 +msgid "All In One WP Security and Firewall" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:340 +msgid "We were unable to create the file necessary to give you the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:341 +msgid "Your firewall will have reduced protection which means some of your firewall's functionality will be unavailable." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:342 +msgid "If you would like to manually set up the necessary file, please follow these steps:" +msgstr "" + +#. translators: %s Bootstrap file name. +#. translators: %s Firewall file name. +#: admin/wp-security-firewall-setup-notice.php:346 +#: admin/wp-security-firewall-setup-notice.php:453 +msgid "1. Create a file with the name %s in the same directory as your WordPress install is in, i.e.:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:350 +msgid "2. Paste in the following code:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:352 +#: admin/wp-security-firewall-setup-notice.php:462 +msgid "3. Save the file and press the 'Try again' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:372 +msgid "1. Open the following file:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:378 +msgid "2. Look for the auto_prepend_file directive." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:382 +msgid "2. Look for the following:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:388 +msgid "3. Change it to the following:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:392 +msgid "4. Save the file and press the 'Try again' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:392 +#: admin/wp-security-firewall-setup-notice.php:441 +msgid "You may have to wait up to 5 minutes before the settings take effect." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:410 +msgid "Your firewall has been installed with the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:411 +msgid "You may have to wait 5 minutes for the changes to take effect." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:434 +msgid "1. Open your php.ini file." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:437 +msgid "2. Set the auto_prepend_file directive like below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:441 +msgid "3. Restart the webserver and refresh the page" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:458 +msgid "2. Paste in the following directives:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:482 +msgid "We were unable to set up your firewall with the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:483 +msgid "Your firewall will have reduced functionality." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:487 +msgid "To give your site the highest level of protection, please follow these steps:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:500 +msgid "Note: if you're unable to perform any of the aforementioned steps, please ask your web hosting provider for further assistance." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:517 +msgid "Try again" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:539 +msgid "We have detected that your AIOS firewall is not fully installed, and therefore does not have the highest level of protection. " +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:540 +msgid "Your firewall will have reduced functionality until it has been upgraded. " +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:542 +msgid "Upgrade your protection now" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:598 +msgid "Our PHP-based firewall has been created to give you even greater protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:602 +msgid "If you already have our .htaccess-based firewall enabled, you will still need to set up the PHP-based firewall to benefit from its protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:605 +msgid "To set up the PHP-based firewall, press the 'Set up now' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:608 +msgid "Set up now" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:614 +#: templates/notices/custom-notice.php:10 +#: templates/notices/custom-notice.php:12 +#: templates/notices/horizontal-notice.php:50 +#: templates/notices/horizontal-notice.php:52 +#: templates/notices/htaccess-to-php-feature-notice.php:10 +#: templates/notices/htaccess-to-php-feature-notice.php:12 +msgid "Dismiss" +msgstr "" + +#: admin/wp-security-list-404.php:91 +msgid "Event type" +msgstr "" + +#: admin/wp-security-list-404.php:92 +#: admin/wp-security-list-logged-in-users.php:46 +#: admin/wp-security-list-registered-users.php:74 +msgid "IP address" +msgstr "" + +#: admin/wp-security-list-404.php:93 +msgid "Attempted URL" +msgstr "" + +#: admin/wp-security-list-404.php:94 +msgid "Referer" +msgstr "" + +#: admin/wp-security-list-404.php:96 +msgid "Lock status" +msgstr "" + +#: admin/wp-security-list-404.php:118 +msgid "Temp block IP" +msgstr "" + +#: admin/wp-security-list-404.php:119 +msgid "Blacklist IP" +msgstr "" + +#: admin/wp-security-list-404.php:120 +#: admin/wp-security-list-acct-activity.php:82 +#: admin/wp-security-list-locked-ip.php:37 +#: admin/wp-security-list-locked-ip.php:84 +#: admin/wp-security-list-login-fails.php:73 +#: admin/wp-security-list-registered-users.php:93 +msgid "Delete" +msgstr "" + +#: admin/wp-security-list-404.php:128 +#: admin/wp-security-list-404.php:136 +#: admin/wp-security-list-404.php:143 +#: admin/wp-security-list-acct-activity.php:92 +#: admin/wp-security-list-comment-spammer-ip.php:95 +#: admin/wp-security-list-locked-ip.php:97 +#: admin/wp-security-list-locked-ip.php:105 +#: admin/wp-security-list-login-fails.php:85 +#: admin/wp-security-list-permanent-blocked-ip.php:96 +#: admin/wp-security-list-registered-users.php:107 +#: admin/wp-security-list-registered-users.php:115 +#: admin/wp-security-list-registered-users.php:123 +msgid "Please select some records using the checkboxes" +msgstr "" + +#: admin/wp-security-list-404.php:278 +msgid "Nonce check failed for delete selected 404 event logs operation!" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:35 +msgid "Are you sure you want to delete this item?" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:46 +msgid "Login session still active" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:60 +#: admin/wp-security-list-locked-ip.php:60 +#: admin/wp-security-list-logged-in-users.php:44 +#: admin/wp-security-list-login-fails.php:54 +#: admin/wp-security-list-registered-users.php:69 +msgid "User ID" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:61 +#: admin/wp-security-list-locked-ip.php:61 +#: admin/wp-security-list-login-fails.php:55 +msgid "Username" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:62 +msgid "Login date" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:63 +msgid "Logout date" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:136 +msgid "Nonce check failed for delete selected account activity logs operation!" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:59 +msgid "Spammer IP" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:60 +msgid "Number of spam comments from this IP" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:61 +msgid "Status" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:81 +msgid "Block" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:130 +#: admin/wp-security-list-comment-spammer-ip.php:179 +msgid "Nonce check failed for delete selected blocked IP operation!" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:137 +msgid "The selected IP addresses are now permanently blocked!" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:193 +msgid "The selected IP addresses were saved in the blacklist configuration settings." +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:201 +msgid "The .htaccess file was successfully modified to include the selected IP addresses." +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:212 +msgid "NOTE: The .htaccess file was not modified because you have disabled the \"Enable IP or User Agent Blacklisting\" check box." +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:213 +msgid "To block these IP addresses you will need to enable the above flag in the %s menu" +msgstr "" + +#: admin/wp-security-list-debug.php:47 +msgid "Level" +msgstr "" + +#: admin/wp-security-list-debug.php:48 +msgid "Message" +msgstr "" + +#: admin/wp-security-list-debug.php:49 +msgid "Type" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:36 +#: admin/wp-security-list-locked-ip.php:83 +msgid "Unlock" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:59 +msgid "Locked IP/range" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:62 +#: admin/wp-security-list-permanent-blocked-ip.php:67 +msgid "Reason" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:63 +msgid "Date locked" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:64 +msgid "Release date" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:134 +msgid "The selected IP entries were unlocked successfully." +msgstr "선택한 IP 항목이 성공적으로 잠금 해제되었습니다." + +#: admin/wp-security-list-locked-ip.php:140 +msgid "Nonce check failed for unlock IP operation!" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:147 +msgid "The selected IP entry was unlocked successfully." +msgstr "" + +#: admin/wp-security-list-logged-in-users.php:45 +#: admin/wp-security-list-registered-users.php:70 +msgid "Login name" +msgstr "" + +#: admin/wp-security-list-logged-in-users.php:87 +msgid "Nonce check failed for force user logout operation!" +msgstr "" + +#: admin/wp-security-list-logged-in-users.php:96 +msgid "The selected user was logged out successfully!" +msgstr "" + +#: admin/wp-security-list-login-fails.php:53 +msgid "Login IP range" +msgstr "" + +#: admin/wp-security-list-login-fails.php:130 +msgid "Nonce check failed for delete failed login record operation!" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:66 +msgid "Blocked IP" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:87 +msgid "Unblock" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:122 +#: admin/wp-security-list-permanent-blocked-ip.php:139 +msgid "Successfully unblocked and deleted the selected record(s)." +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:126 +#: admin/wp-security-list-permanent-blocked-ip.php:143 +msgid "Failed to unblock and delete the selected record(s)." +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:133 +msgid "Nonce check failed for unblock IP operation!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:71 +msgid "Email" +msgstr "" + +#: admin/wp-security-list-registered-users.php:72 +msgid "Register date" +msgstr "" + +#: admin/wp-security-list-registered-users.php:73 +msgid "Account status" +msgstr "" + +#: admin/wp-security-list-registered-users.php:92 +msgid "Approve" +msgstr "" + +#: admin/wp-security-list-registered-users.php:94 +msgid "Block IP" +msgstr "" + +#: admin/wp-security-list-registered-users.php:159 +msgid "The selected accounts were approved successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:163 +msgid "The following accounts failed to update successfully: " +msgstr "" + +#: admin/wp-security-list-registered-users.php:171 +msgid "The selected account was approved successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:190 +msgid "Your account is now active" +msgstr "" + +#: admin/wp-security-list-registered-users.php:191 +msgid "Your account with username: " +msgstr "" + +#: admin/wp-security-list-registered-users.php:191 +msgid " is now active" +msgstr "" + +#: admin/wp-security-list-registered-users.php:222 +msgid "The selected accounts were deleted successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:230 +msgid "Nonce check failed for delete registered user account operation!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:238 +msgid "The selected account was deleted successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:264 +msgid "The selected IP addresses were successfully added to the permanent block list!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:265 +#: admin/wp-security-list-registered-users.php:282 +msgid "View Blocked IPs" +msgstr "" + +#: admin/wp-security-list-registered-users.php:274 +msgid "Nonce check failed for block IP operation of registered user!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:281 +msgid "The selected IP was successfully added to the permanent block list!" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:25 +msgid "Visitor lockout" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:85 +msgid "Site lockout feature settings saved!" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:92 +msgid "General visitor lockout" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:98 +msgid "This feature allows you to put your site into \"maintenance mode\" by locking down the front-end to all visitors except logged in users with super admin privileges." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:99 +msgid "Locking your site down to general visitors can be useful if you are investigating some issues on your site or perhaps you might be doing some maintenance and wish to keep out all traffic for security reasons." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:104 +msgid "Enable front-end lockout" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:107 +msgid "Check this if you want all visitors except those who are logged in as administrator to be locked out of the front-end of your site." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:111 +msgid "Enter a message:" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:123 +msgid "Enter a message you wish to display to visitors when your site is in maintenance mode." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:130 +msgid "Save site lockout settings" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:28 +msgid "Copy protection" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:29 +msgid "Frames" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:30 +msgid "Users enumeration" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:31 +msgid "WP REST API" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:89 +msgid "Copy Protection feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:94 +msgid "Disable the ability to copy text" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:100 +msgid "This feature allows you to disable the ability to select and copy text from your front end." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:101 +msgid "When admin user is logged in, the feature is automatically disabled for his session." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:106 +msgid "Enable copy protection" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:109 +msgid "Check this if you want to disable the \"Right click\", \"Text selection\" and \"Copy\" option on the front end of your site." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:116 +msgid "Save copy protection settings" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:140 +msgid "Frame Display Prevention feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:145 +msgid "Prevent your site from being displayed in a frame" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:151 +msgid "This feature allows you to prevent other sites from displaying any of your content via a frame or iframe." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:152 +msgid "When enabled, this feature will set the \"X-Frame-Options\" parameter to \"sameorigin\" in the HTTP header." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:157 +msgid "Enable iFrame protection" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:160 +msgid "Check this if you want to stop other sites from displaying your content in a frame or iframe." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:191 +msgid "Users Enumeration Prevention feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:196 +msgid "Prevent users enumeration" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:202 +msgid "This feature allows you to prevent external users/bots from fetching the user info with urls like \"/?author=1\"." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:203 +msgid "When enabled, this feature will print a \"forbidden\" error rather than the user information." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:208 +msgid "Disable users enumeration" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:211 +msgid "Check this if you want to stop users enumeration." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:242 +msgid "WP REST API Security feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:253 +msgid "This feature allows you to block WordPress REST API access for unauthorized requests." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:254 +msgid "When enabled this feature will only allow REST requests to be processed if the user is logged in." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:260 +msgid "Beware that if you are using other plugins which have registered REST endpoints (eg, Contact Form 7), then this feature will also block REST requests used by these plugins if the user is not logged in. It is recommended that you leave this feature disabled if you want uninterrupted functionality for such plugins." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:268 +msgid "Disallow unauthorized REST requests" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:271 +msgid "Check this if you want to stop REST API access for non-logged in requests." +msgstr "" + +#: admin/wp-security-settings-menu.php:25 +msgid "General settings" +msgstr "일반 설정" + +#: admin/wp-security-settings-menu.php:29 +#: admin/wp-security-settings-menu.php:33 +msgid "file" +msgstr "" + +#: admin/wp-security-settings-menu.php:37 +msgid "Delete plugin settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:41 +msgid "WP version info" +msgstr "WP 버전 정보" + +#: admin/wp-security-settings-menu.php:45 +msgid "Import/Export" +msgstr "가져오기/내보내기" + +#: admin/wp-security-settings-menu.php:52 +msgid "Advanced settings" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:128 +msgid "All the security features have been disabled successfully!" +msgstr "모든 보안 기능이 성공적으로 비활성화되었습니다!" + +#: admin/wp-security-settings-menu.php:132 +#: admin/wp-security-settings-menu.php:159 +msgid "Could not write to the .htaccess file. Please restore your .htaccess file manually using the restore functionality in the \".htaccess File\"." +msgstr "" + +#: admin/wp-security-settings-menu.php:137 +msgid "Could not write to the wp-config.php. Please restore your wp-config.php file manually using the restore functionality in the \"wp-config.php File\"." +msgstr "" + +#: admin/wp-security-settings-menu.php:155 +msgid "All firewall rules have been disabled successfully!" +msgstr "" + +#: admin/wp-security-settings-menu.php:177 +msgid "Deletion of aio_wp_security_configs option and .htaccess directives failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:179 +msgid "Reset of aio_wp_security_configs option failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:181 +msgid "Deletion of .htaccess directives failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:183 +msgid "All settings have been successfully reset." +msgstr "" + +#: admin/wp-security-settings-menu.php:203 +msgid "For information, updates and documentation, please visit the" +msgstr "For information, updates and documentation, please visit the" + +#: admin/wp-security-settings-menu.php:203 +msgid "Page" +msgstr "페이지" + +#: admin/wp-security-settings-menu.php:204 +msgid "Follow us" +msgstr "팔로우" + +#: admin/wp-security-settings-menu.php:204 +msgid "on Twitter, Google+ or via Email to stay up to date about the new security features of this plugin." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:208 +msgid "WP Security plugin" +msgstr "WP 보안 플러그인" + +#: admin/wp-security-settings-menu.php:212 +msgid "Thank you for using the AIOS security plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:216 +msgid "There are a lot of security features in this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:221 +msgid "To start, go through each security option and enable the \"basic\" options." +msgstr "" + +#: admin/wp-security-settings-menu.php:225 +msgid "The more features you enable, the more security points you will achieve." +msgstr "" + +#: admin/wp-security-settings-menu.php:228 +msgid "Before doing anything we advise taking a backup of your .htaccess file, database and wp-config.php." +msgstr "" + +#: admin/wp-security-settings-menu.php:231 +msgid "Backup your database" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:232 +#: admin/wp-security-settings-menu.php:433 +msgid "Backup .htaccess file" +msgstr "백업 .htaccess 파일" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:233 +#: admin/wp-security-settings-menu.php:534 +msgid "Backup wp-config.php file" +msgstr "백업 wp-config.php 파일" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:240 +msgid "Disable security features" +msgstr "보안 기능 비활성화" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:246 +msgid "If you think that some plugin functionality on your site is broken due to a security feature you enabled in this plugin, then use the following option to turn off all the security features of this plugin." +msgstr "이 플러그인에서 활성화 된 보안 기능으로 인해 사이트의 일부 플러그인 기능이 손상된 것으로 생각되면 다음 옵션을 사용하여이 플러그인의 모든 보안 기능을 끕니다." + +# @ default +#: admin/wp-security-settings-menu.php:250 +msgid "Disable all security features" +msgstr "모든 보안 기능 비활성화" + +# @ all-in-one-wp-security-and-firewall +# @ default +#: admin/wp-security-settings-menu.php:257 +#: admin/wp-security-settings-menu.php:267 +msgid "Disable all firewall rules" +msgstr "모든 방화벽 규칙 비활성화" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:263 +msgid "This feature will disable all firewall rules which are currently active in this plugin and it will also delete these rules from your .htacess file. Use it if you think one of the firewall rules is causing an issue on your site." +msgstr "이 기능은 현재이 플러그인에서 활성화된 모든 방화벽 규칙을 비활성화하고 .htacess 파일에서 이러한 규칙을 삭제합니다. 방화벽 규칙 중 하나가 사이트에서 문제를 일으킨다고 생각되면 사용하십시오." + +#: admin/wp-security-settings-menu.php:274 +#: admin/wp-security-settings-menu.php:287 +msgid "Reset settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:279 +msgid "This button click will delete all of your settings related to the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:280 +msgid "This button click will reset/empty all the database tables of the security plugin also." +msgstr "" + +#: admin/wp-security-settings-menu.php:281 +msgid "Use this plugin if you were locked out by the All In One WP Security & Firewall Plugin and/or you are having issues logging in when that plugin is activated." +msgstr "" + +#: admin/wp-security-settings-menu.php:282 +msgid "In addition to the settings it will also delete any directives which were added to the .htaccess file by the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:283 +msgid "%1$sNOTE: %2$sAfter deleting the settings you will need to re-configure the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:295 +msgid "Debug settings" +msgstr "디버그 설정" + +#: admin/wp-security-settings-menu.php:301 +msgid "This setting allows you to enable/disable debug for this plugin." +msgstr "이 설정을 사용하면 이 플러그인에 대한 디버그를 활성화/비활성화할 수 있습니다." + +#: admin/wp-security-settings-menu.php:307 +msgid "Enable debug" +msgstr "디버그 사용" + +#: admin/wp-security-settings-menu.php:310 +msgid "Check this if you want to enable debug. You should keep this option disabled after you have finished debugging the issue." +msgstr "디버그를 사용하도록 설정하려면 이 방법을 확인합니다. 문제 디버깅을 완료한 후에도 이 옵션을 사용하지 않도록 설정해야 합니다." + +#: admin/wp-security-settings-menu.php:314 +msgid "Save debug settings" +msgstr "디버그 설정 저장" + +#: admin/wp-security-settings-menu.php:350 +msgid "Your .htaccess file was successfully backed up! Using an FTP program go to the \"/wp-content/aiowps_backups\" directory to save a copy of the file to your computer." +msgstr ".htaccess 파일이 성공적으로 백업되었습니다! FTP 프로그램을 사용하여 \"/wp-content/aiowps_backups\" 디렉터리로 이동하여 파일의 복사본을 컴퓨터에 저장합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:356 +msgid "htaccess file rename failed during backup. Please check your root directory for the backup file using FTP." +msgstr "htaccess 파일 이름 바꾸기 백업 중에 실패했습니다. FTP를 사용하여 백업 파일에 대한 루트 디렉토리를 확인하십시오." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:362 +msgid "htaccess backup failed." +msgstr "htaccess 백업에 실패했습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:377 +msgid "Please choose a .htaccess to restore from." +msgstr "복원하려면 .htaccess를 선택하십시오." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:392 +msgid "htaccess file restore failed. Please attempt to restore the .htaccess manually using FTP." +msgstr "htaccess 파일 복원에 실패했습니다. FTP를 사용하여 수동으로 .htaccess를 복원하십시오." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:396 +msgid "Your .htaccess file has successfully been restored!" +msgstr ".htaccess 파일이 성공적으로 복원되었습니다!" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:402 +msgid "htaccess Restore operation failed! Please check the contents of the file you are trying to restore from." +msgstr "htaccess 복원 작업이 실패했습니다! 복원하려는 파일의 내용을 확인하십시오." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:408 +msgid ".htaccess file operations" +msgstr ".htaccess 파일 작업" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:411 +msgid "Your \".htaccess\" file is a key component of your website's security and it can be modified to implement various levels of protection mechanisms." +msgstr "\".htaccess\" 파일은 웹 사이트 보안의 핵심 구성 요소이며 다양한 수준의 보호 메커니즘을 구현하도록 수정할 수 있습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:412 +msgid "This feature allows you to backup and save your currently active .htaccess file should you need to re-use the the backed up file in the future." +msgstr "이 기능을 사용하면 나중에 백업된 파일을 다시 사용해야 하는 경우 현재 활성 .htaccess 파일을 백업하고 저장할 수 있습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:413 +msgid "You can also restore your site's .htaccess settings using a backed up .htaccess file." +msgstr "백업된 .htaccess 파일을 사용하여 사이트의 .htaccess 설정을 복원할 수도 있습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:428 +msgid "Save the current .htaccess file" +msgstr "현재 .htaccess 파일 저장" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:432 +msgid "Click the button below to backup and save the currently active .htaccess file." +msgstr "아래 버튼을 클릭하여 현재 활성 .htaccess 파일을 백업하고 저장합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:437 +msgid "Restore from a backed up .htaccess file" +msgstr "백업된 .htaccess 파일에서 복원" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:443 +msgid ".htaccess file to restore from" +msgstr "복원할 .htaccess 파일" + +#: admin/wp-security-settings-menu.php:445 +msgid "Select Your htaccess File" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:449 +msgid "After selecting your file, click the button below to restore your site using the backed up htaccess file (htaccess_backup.txt)." +msgstr "파일을 선택한 후 아래 버튼을 클릭하여 백업된 htaccess 파일(htaccess_backup.txt)을 사용하여 사이트를 복원합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:455 +msgid "Restore .htaccess file" +msgstr ".htaccess 파일 복원" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:477 +msgid "Please choose a wp-config.php file to restore from." +msgstr "복원하려면 wp-config.php 파일을 선택하십시오." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:493 +msgid "wp-config.php file restore failed. Please attempt to restore this file manually using FTP." +msgstr "wp-config.php 파일 복원에 실패했습니다. FTP를 사용하여 수동으로 이 파일을 복원해 보십시오." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:497 +msgid "Your wp-config.php file has successfully been restored!" +msgstr "wp-config.php 파일이 성공적으로 복원되었습니다!" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:503 +msgid "wp-config.php Restore operation failed! Please check the contents of the file you are trying to restore from." +msgstr "wp-config.php 복원 작업이 실패했습니다! 복원하려는 파일의 내용을 확인하십시오." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:509 +msgid "wp-config.php file operations" +msgstr "wp-config.php 파일 작업" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:512 +msgid "Your \"wp-config.php\" file is one of the most important in your WordPress installation. It is a primary configuration file and contains crucial things such as details of your database and other critical components." +msgstr "\"wp-config.php\" 파일은 워드 프레스 설치에서 가장 중요한 파일 중 하나입니다. 기본 구성 파일이며 데이터베이스 및 기타 중요한 구성 요소의 세부 정보와 같은 중요한 항목을 포함합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:513 +msgid "This feature allows you to backup and save your currently active wp-config.php file should you need to re-use the the backed up file in the future." +msgstr "이 기능을 사용하면 나중에 백업된 파일을 다시 사용해야 하는 경우 현재 활성 중인 wp-config.php 파일을 백업하고 저장할 수 있습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:514 +msgid "You can also restore your site's wp-config.php settings using a backed up wp-config.php file." +msgstr "백업된 wp-config.php 파일을 사용하여 사이트의 wp-config.php 설정을 복원할 수도 있습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:529 +msgid "Save the current wp-config.php file" +msgstr "현재 wp-config.php 파일 저장" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:533 +msgid "Click the button below to backup and download the contents of the currently active wp-config.php file." +msgstr "아래 버튼을 클릭하여 현재 활성 중인 wp-config.php 파일의 내용을 백업하고 다운로드합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:539 +msgid "Restore from a backed up wp-config file" +msgstr "백업된 wp-config 파일에서 복원" + +#: admin/wp-security-settings-menu.php:545 +msgid "wp-config file to restore from" +msgstr "" + +#: admin/wp-security-settings-menu.php:547 +msgid "Select Your wp-config File" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:551 +msgid "After selecting your file click the button below to restore your site using the backed up wp-config file (wp-config.php.backup.txt)." +msgstr "파일을 선택한 후 아래 버튼을 클릭하여 백업된 wp-config 파일(wp-config.php.backup.txt)을 사용하여 사이트를 복원합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:557 +msgid "Restore wp-config file" +msgstr "wp-config 파일 복원" + +#: admin/wp-security-settings-menu.php:591 +msgid "Manage delete plugin settings saved." +msgstr "" + +#: admin/wp-security-settings-menu.php:596 +msgid "Manage delete plugin tasks" +msgstr "" + +#: admin/wp-security-settings-menu.php:603 +msgid "Delete database tables" +msgstr "" + +#: admin/wp-security-settings-menu.php:606 +msgid "Check this if you want to remove database tables when the plugin is uninstalled." +msgstr "" + +#: admin/wp-security-settings-menu.php:610 +msgid "Delete settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:613 +msgid "Check this if you want to remove all plugin settings when uninstalling the plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:613 +msgid "It will also remove all custom htaccess rules that were added by this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:647 +msgid "WP generator meta tag and version info" +msgstr "" + +#: admin/wp-security-settings-menu.php:650 +msgid "WordPress generator automatically adds some meta information inside the \"head\" tags of every page on your site's front end. Below is an example of this:" +msgstr "" + +#: admin/wp-security-settings-menu.php:652 +msgid "The above meta information shows which version of WordPress your site is currently running and thus can help hackers or crawlers scan your site to see if you have an older version of WordPress or one with a known exploit." +msgstr "" + +#: admin/wp-security-settings-menu.php:653 +msgid "There are also other ways wordpress reveals version info such as during style and script loading. An example of this is:" +msgstr "" + +#: admin/wp-security-settings-menu.php:655 +msgid "This feature will allow you to remove the WP generator meta info and other version info from your site's pages." +msgstr "" + +#: admin/wp-security-settings-menu.php:661 +msgid "WP generator meta info" +msgstr "" + +#: admin/wp-security-settings-menu.php:673 +msgid "Remove WP generator meta info" +msgstr "" + +#: admin/wp-security-settings-menu.php:676 +msgid "Check this if you want to remove the version and meta info produced by WP from all pages" +msgstr "" + +#: admin/wp-security-settings-menu.php:704 +msgid "Please choose a file to import your settings from." +msgstr "" + +#: admin/wp-security-settings-menu.php:736 +msgid "Import AIOS settings from " +msgstr "" + +#: admin/wp-security-settings-menu.php:742 +#: admin/wp-security-settings-menu.php:786 +msgid "The deletion of the import file failed. Please delete this file manually via the media menu for security purposes." +msgstr "" + +#: admin/wp-security-settings-menu.php:744 +#: admin/wp-security-settings-menu.php:788 +msgid "The file you uploaded was also deleted for security purposes because it contains security settings details." +msgstr "" + +#: admin/wp-security-settings-menu.php:759 +msgid "Your AIOS settings were successfully imported via file input." +msgstr "" + +#: admin/wp-security-settings-menu.php:760 +msgid "The deletion of the import file failed. Please delete this file manually via the media menu for security purposes because it contains security settings details." +msgstr "" + +#: admin/wp-security-settings-menu.php:762 +msgid "Your AIOS settings were successfully imported. The file you uploaded was also deleted for security purposes because it contains security settings details." +msgstr "" + +#: admin/wp-security-settings-menu.php:765 +msgid "Your AIOS settings were successfully imported via text entry." +msgstr "" + +#: admin/wp-security-settings-menu.php:780 +msgid "The contents of your settings file appear invalid. Please check the contents of the file you are trying to import settings from." +msgstr "" + +#: admin/wp-security-settings-menu.php:797 +msgid "Export or import your AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:800 +msgid "This section allows you to export or import your All In One WP Security & Firewall settings." +msgstr "이 섹션에서는 모든 WP 보안 및 방화벽 설정을 내보내거나 가져올 수 있습니다." + +#: admin/wp-security-settings-menu.php:801 +msgid "This can be handy if you wanted to save time by applying the settings from one site to another site." +msgstr "이 기능은 한 사이트에서 다른 사이트로 설정을 적용하여 시간을 절약하려는 경우에 유용할 수 있습니다." + +#: admin/wp-security-settings-menu.php:802 +msgid "NOTE: Before importing, it is your responsibility to know what settings you are trying to import. Importing settings blindly can cause you to be locked out of your site." +msgstr "참고: 가져오기 전에 가져오려는 설정을 파악하는 것은 사용자의 책임입니다. 설정을 맹목적으로 가져오면 사이트에서 잠길 수 있습니다." + +#: admin/wp-security-settings-menu.php:803 +msgid "For Example: If a settings item relies on the domain URL then it may not work correctly when imported into a site with a different domain." +msgstr "예를 들어 설정 항목이 도메인 URL에 의존하는 경우 다른 도메인이 있는 사이트로 가져올 때 제대로 작동하지 않을 수 있습니다." + +#: admin/wp-security-settings-menu.php:809 +#: admin/wp-security-settings-menu.php:818 +msgid "Export AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:815 +msgid "To export your All In One WP Security & Firewall settings click the button below." +msgstr "모든 WP 보안 및 방화벽 설정을 내보내려면 아래 버튼을 클릭하십시오." + +#: admin/wp-security-settings-menu.php:822 +#: admin/wp-security-settings-menu.php:851 +msgid "Import AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:828 +msgid "Use this section to import your All In One WP Security & Firewall settings from a file. Alternatively, copy/paste the contents of your import file into the textarea below." +msgstr "" + +#: admin/wp-security-settings-menu.php:830 +msgid "Import file" +msgstr "파일 가져오기" + +#: admin/wp-security-settings-menu.php:833 +msgid "Select Your Import Settings File" +msgstr "" + +#: admin/wp-security-settings-menu.php:837 +msgid "After selecting your file, click the button below to apply the settings to your site." +msgstr "" + +#: admin/wp-security-settings-menu.php:844 +msgid "Copy/Paste import data" +msgstr "가져오기 데이터 복사/붙여넣기" + +#: admin/wp-security-settings-menu.php:893 +msgid "Default - if correct, then this is the best option" +msgstr "" + +#: admin/wp-security-settings-menu.php:894 +msgid "Only use if you're using Cloudflare." +msgstr "" + +#: admin/wp-security-settings-menu.php:902 +msgid "(current value: %s)" +msgstr "" + +#: admin/wp-security-settings-menu.php:905 +msgid "no value (i.e. empty) on your server" +msgstr "" + +#: admin/wp-security-spam-menu.php:28 +msgid "Comment spam" +msgstr "" + +#: admin/wp-security-spam-menu.php:29 +msgid "Comment spam IP monitoring" +msgstr "" + +#: admin/wp-security-spam-menu.php:30 +msgid "BuddyPress" +msgstr "" + +#: admin/wp-security-spam-menu.php:31 +msgid "bbPress" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-spam-menu.php:57 +msgid "Spam prevention" +msgstr "스팸 예방" + +#: admin/wp-security-spam-menu.php:99 +msgid "You entered a non numeric value for the \"move spam comments to trash after number of days\" field." +msgstr "" + +#: admin/wp-security-spam-menu.php:99 +#: admin/wp-security-spam-menu.php:297 +#: admin/wp-security-user-login-menu.php:118 +#: admin/wp-security-user-login-menu.php:124 +#: admin/wp-security-user-login-menu.php:130 +#: admin/wp-security-user-login-menu.php:136 +msgid "It has been set to the default value." +msgstr "" + +#: admin/wp-security-spam-menu.php:129 +msgid "Comment spam settings" +msgstr "" + +#: admin/wp-security-spam-menu.php:134 +msgid "Add CAPTCHA to comments form" +msgstr "" + +#: admin/wp-security-spam-menu.php:138 +msgid "This feature will add a CAPTCHA field in the WordPress comments form." +msgstr "" + +#: admin/wp-security-spam-menu.php:139 +msgid "Adding a CAPTCHA field in the comment form is a simple way of greatly reducing spam comments from bots without using .htaccess rules." +msgstr "" + +#: admin/wp-security-spam-menu.php:148 +msgid "Enable CAPTCHA on comment forms" +msgstr "" + +#: admin/wp-security-spam-menu.php:151 +msgid "Check this if you want to insert a CAPTCHA field on the comment forms." +msgstr "" + +#: admin/wp-security-spam-menu.php:158 +msgid "Block spambot comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:162 +msgid "A large portion of WordPress blog comment spam is mainly produced by automated bots and not necessarily by humans." +msgstr "" + +#: admin/wp-security-spam-menu.php:163 +msgid "This feature will greatly minimize the useless and unnecessary traffic and load on your server resulting from spam comments by blocking all comment requests which do not originate from your domain." +msgstr "" + +#: admin/wp-security-spam-menu.php:164 +msgid "In other words, if the comment was not submitted by a human who physically submitted the comment on your site, the request will be blocked." +msgstr "" + +#: admin/wp-security-spam-menu.php:182 +msgid "Block spambots from posting comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:185 +msgid "Check this if you want to apply a firewall rule which will block comments originating from spambots." +msgstr "" + +#: admin/wp-security-spam-menu.php:189 +msgid "This feature will implement a firewall rule to block all comment attempts which do not originate from your domain." +msgstr "" + +#: admin/wp-security-spam-menu.php:190 +msgid "A legitimate comment is one which is submitted by a human who physically fills out the comment form and clicks the submit button. For such events, the HTTP_REFERRER is always set to your own domain." +msgstr "" + +#: admin/wp-security-spam-menu.php:191 +msgid "A comment submitted by a spambot is done by directly calling the comments.php file, which usually means that the HTTP_REFERRER value is not your domain and often times empty." +msgstr "" + +#: admin/wp-security-spam-menu.php:192 +msgid "This feature will check and block comment requests which are not referred by your domain thus greatly reducing your overall blog spam and PHP requests done by the server to process these comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:202 +msgid "Comment processing" +msgstr "" + +#: admin/wp-security-spam-menu.php:207 +msgid "Trash spam comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:216 +msgid "Move spam comments to trash after %s days." +msgstr "" + +#: admin/wp-security-spam-menu.php:224 +msgid "Enable this feature in order to move the spam comments to trash after given number of days." +msgstr "" + +#: admin/wp-security-spam-menu.php:262 +msgid "You entered a non numeric value for the minimum number of spam comments field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-spam-menu.php:265 +msgid "You must enter an integer greater than zero for minimum number of spam comments field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-spam-menu.php:292 +msgid "Nonce check failed for list spam comment IPs." +msgstr "" + +#: admin/wp-security-spam-menu.php:297 +msgid "You entered a non numeric value for the minimum spam comments per IP field." +msgstr "" + +#: admin/wp-security-spam-menu.php:308 +msgid "Displaying results for IP addresses which have posted a minimum of %s spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:323 +msgid "Auto block spammer IPs" +msgstr "" + +#: admin/wp-security-spam-menu.php:328 +msgid "This feature has detected that %s is not active. It is highly recommended that you activate the Akismet plugin to make the most of this feature." +msgstr "" + +#: admin/wp-security-spam-menu.php:337 +msgid "This feature allows you to automatically and permanently block IP addresses which have exceeded a certain number of comments labelled as spam." +msgstr "" + +#: admin/wp-security-spam-menu.php:338 +msgid "Comments are usually labelled as spam either by the Akismet plugin or manually by the WP administrator when they mark a comment as \"spam\" from the WordPress Comments menu." +msgstr "" + +#: admin/wp-security-spam-menu.php:352 +msgid "You currently have no IP addresses permanently blocked due to spam." +msgstr "" + +#: admin/wp-security-spam-menu.php:365 +msgid "Spammer IPs added to permanent block list today: " +msgstr "" + +#: admin/wp-security-spam-menu.php:366 +msgid "All time total: " +msgstr "" + +#: admin/wp-security-spam-menu.php:367 +msgid "View blocked IPs" +msgstr "" + +#: admin/wp-security-spam-menu.php:380 +msgid "Enable auto block of spam comment IPs" +msgstr "" + +#: admin/wp-security-spam-menu.php:383 +msgid "Check this box if you want this plugin to automatically block IP addresses which submit spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:387 +msgid "Minimum number of spam comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:389 +msgid "Specify the minimum number of spam comments for an IP address before it is permanently blocked." +msgstr "" + +#: admin/wp-security-spam-menu.php:393 +msgid "Example 1: Setting this value to \"1\" will block ALL IP addresses which were used to submit at least one spam comment." +msgstr "" + +#: admin/wp-security-spam-menu.php:394 +msgid "Example 2: Setting this value to \"5\" will block only those IP addresses which were used to submit 5 spam comments or more on your site." +msgstr "" + +#: admin/wp-security-spam-menu.php:412 +msgid "List spammer IP addresses" +msgstr "" + +#: admin/wp-security-spam-menu.php:416 +msgid "This section displays a list of the IP addresses of the people or bots who have left spam comments on your site." +msgstr "" + +#: admin/wp-security-spam-menu.php:417 +msgid "This information can be handy for identifying the most persistent IP addresses or ranges used by spammers." +msgstr "" + +#: admin/wp-security-spam-menu.php:418 +msgid "By inspecting the IP address data coming from spammers you will be in a better position to determine which addresses or address ranges you should block by adding them to the permanent block list." +msgstr "" + +#: admin/wp-security-spam-menu.php:419 +msgid "To add one or more of the IP addresses displayed in the table below to your blacklist, simply click the \"Block\" link for the individual row or select more than one address using the checkboxes and then choose the \"block\" option from the Bulk Actions dropdown list and click the \"Apply\" button." +msgstr "" + +#: admin/wp-security-spam-menu.php:427 +msgid "Minimum number of spam comments per IP" +msgstr "" + +#: admin/wp-security-spam-menu.php:429 +msgid "This field allows you to list only those IP addresses which have been used to post X or more spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:433 +msgid "Example 1: Setting this value to \"0\" or \"1\" will list ALL IP addresses which were used to submit spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:434 +msgid "Example 2: Setting this value to \"5\" will list only those IP addresses which were used to submit 5 spam comments or more on your site." +msgstr "" + +#: admin/wp-security-spam-menu.php:441 +msgid "Find IP addresses" +msgstr "" + +#: admin/wp-security-spam-menu.php:445 +msgid "Spammer IP address results" +msgstr "" + +#: admin/wp-security-spam-menu.php:451 +#: classes/wp-security-utility.php:253 +msgid "The plugin has detected that you are using a Multi-Site WordPress installation." +msgstr "" + +#: admin/wp-security-spam-menu.php:452 +msgid "Only the \"superadmin\" can block IP addresses from the main site." +msgstr "" + +#: admin/wp-security-spam-menu.php:453 +msgid "Take note of the IP addresses you want blocked and ask the superadmin to add these to the blacklist using the \"Blacklist Manager\" on the main site." +msgstr "" + +#: admin/wp-security-spam-menu.php:498 +msgid "BuddyPress spam settings" +msgstr "" + +#: admin/wp-security-spam-menu.php:503 +msgid "Add CAPTCHA to BuddyPress registration form" +msgstr "" + +#: admin/wp-security-spam-menu.php:507 +msgid "This feature will add a simple math CAPTCHA field in the BuddyPress registration form." +msgstr "" + +#: admin/wp-security-spam-menu.php:508 +msgid "Adding a CAPTCHA field in the registration form is a simple way of greatly reducing spam signups from bots without using .htaccess rules." +msgstr "" + +#: admin/wp-security-spam-menu.php:518 +msgid "Enable CAPTCHA on BuddyPress registration form" +msgstr "" + +#: admin/wp-security-spam-menu.php:521 +msgid "Check this if you want to insert a CAPTCHA field on the BuddyPress registration forms." +msgstr "" + +#: admin/wp-security-spam-menu.php:530 +msgid "BuddyPress is not active! In order to use this feature you will need to have BuddyPress installed and activated." +msgstr "" + +#: admin/wp-security-spam-menu.php:560 +msgid "bbPress spam settings" +msgstr "" + +#: admin/wp-security-spam-menu.php:565 +msgid "Add CAPTCHA to bbPress new topic form" +msgstr "" + +#: admin/wp-security-spam-menu.php:569 +msgid "This feature will add a simple math CAPTCHA field in the bbPress new topic form." +msgstr "" + +#: admin/wp-security-spam-menu.php:570 +msgid "Adding a CAPTCHA field in this form is a simple way of greatly reducing spam submitted from bots." +msgstr "" + +#: admin/wp-security-spam-menu.php:580 +msgid "Enable CAPTCHA on bbPress new topic form" +msgstr "" + +#: admin/wp-security-spam-menu.php:583 +msgid "Check this if you want to insert a CAPTCHA field on the bbPress new topic forms." +msgstr "" + +#: admin/wp-security-spam-menu.php:592 +msgid "bbPress is not active. In order to use this feature you will need to have bbPress installed and activated." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-tools-menu.php:34 +msgid "WHOIS lookup" +msgstr "후이스 조회" + +#: admin/wp-security-tools-menu.php:95 +#: admin/wp-security-tools-menu.php:136 +msgid "Querying %s: %s" +msgstr "" + +#: admin/wp-security-tools-menu.php:103 +#: admin/wp-security-tools-menu.php:112 +#: admin/wp-security-tools-menu.php:151 +msgid "Redirected to %s" +msgstr "" + +#: admin/wp-security-tools-menu.php:173 +msgid "The WHOIS lookup feature gives you a way to look up who owns an IP address or domain name." +msgstr "" + +#: admin/wp-security-tools-menu.php:173 +msgid "You can use this to investigate users engaging in malicious activity on your site." +msgstr "" + +#: admin/wp-security-tools-menu.php:176 +msgid "WHOIS lookup on IP or domain" +msgstr "" + +#: admin/wp-security-tools-menu.php:183 +msgid "IP address or domain name:" +msgstr "" + +#: admin/wp-security-tools-menu.php:190 +msgid "Look up IP or domain" +msgstr "" + +#: admin/wp-security-tools-menu.php:219 +msgid "Please enter a valid IP address or domain name to look up." +msgstr "" + +#: admin/wp-security-tools-menu.php:220 +#: admin/wp-security-tools-menu.php:226 +msgid "Nothing to show." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:32 +msgid "WP username" +msgstr "WP 사용자 이름" + +#: admin/wp-security-user-accounts-menu.php:33 +msgid "Display name" +msgstr "표시 이름" + +#: admin/wp-security-user-accounts-menu.php:34 +msgid "Password" +msgstr "비밀번호" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:60 +msgid "User accounts" +msgstr "사용자 계정" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:82 +msgid "Admin user security" +msgstr "관리자 사용자 보안" + +#: admin/wp-security-user-accounts-menu.php:85 +msgid "By default, WordPress sets the administrator username to \"admin\" at installation time." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:86 +msgid "A lot of hackers try to take advantage of this information by attempting \"Brute force login attacks\" where they repeatedly try to guess the password by using \"admin\" for username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:87 +msgid "From a security perspective, changing the default \"admin\" user name is one of the first and smartest things you should do on your site." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:88 +msgid "This feature will allow you to change your default \"admin\" user name to a more secure name of your choosing." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:95 +msgid "List of administrator accounts" +msgstr "관리자 계정 목록" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:104 +#: classes/grade-system/wp-security-feature-item-manager.php:43 +msgid "Change admin username" +msgstr "관리자 사용자 이름 변경" + +#: admin/wp-security-user-accounts-menu.php:112 +msgid "Your site currently has an account which uses the default \"admin\" username. It is highly recommended that you change this name to something else. Use the following field to change the admin username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:118 +msgid "New admin username" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:120 +msgid "Choose a new username for admin." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:124 +msgid "Change username" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:126 +msgid "NOTE: If you are currently logged in as \"admin\" you will be automatically logged out after changing your username and will be required to log back in." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:133 +msgid "No action required! " +msgstr "필요한 조치가 없습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:135 +msgid "Your site does not have any account which uses the default \"admin\" username. " +msgstr "사이트에기본 \"관리자\" 사용자 이름을 사용하는 계정이 없습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:136 +msgid "This is good security practice." +msgstr "이것은 좋은 보안 관행입니다." + +#: admin/wp-security-user-accounts-menu.php:148 +msgid "Display name security" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:151 +msgid "When you submit a post or answer a comment, WordPress will usually display your \"nickname\"." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:152 +msgid "By default the nickname is set to the login (or user) name of your account." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:153 +msgid "From a security perspective, leaving your nickname the same as your user name is bad practice because it gives a hacker at least half of your account's login credentials." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:154 +msgid "Therefore to further tighten your site's security you are advised to change your nickname and Display name to be different from your Username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:160 +msgid "Modify accounts with identical login name and display name" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:169 +msgid "Your site currently has the following accounts which have an identical login name and display name." +msgstr "사이트에는 현재 로그인 이름과 표시 이름이 동일한 다음 계정이 있습니다." + +#: admin/wp-security-user-accounts-menu.php:170 +msgid "Follow the link to edit the user profile of that particular user account, change Nickname, choose a different Display name compared to Username, and press the \"Update User\" button.)" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:185 +msgid "No action required." +msgstr "필요한 조치가 없습니다." + +#: admin/wp-security-user-accounts-menu.php:186 +msgid "Your site does not have a user account where the display name is identical to the username." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:197 +msgid "Password tool" +msgstr "암호 도구" + +#: admin/wp-security-user-accounts-menu.php:200 +msgid "Poor password selection is one of the most common weak points of many sites and is usually the first thing a hacker will try to exploit when attempting to break into your site." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:201 +msgid "Many people fall into the trap of using a simple word or series of numbers as their password. Such a predictable and simple password would take a competent hacker merely minutes to guess your password by using a simple script which cycles through the easy and most common combinations." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:202 +msgid "The longer and more complex your password is the harder it is for hackers to \"crack\" because more complex passwords require much greater computing power and time." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:203 +msgid "This section contains a useful password strength tool which you can use to check whether your password is sufficiently strong enough." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:208 +msgid "Password strength tool" +msgstr "암호 강도 도구" + +#: admin/wp-security-user-accounts-menu.php:210 +msgid "This password tool uses an algorithm which calculates how long it would take for your password to be cracked using the computing power of an off-the-shelf current model desktop PC with high end processor, graphics card and appropriate password cracking software." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:213 +msgid "Start typing a password." +msgstr "암호 입력을 시작합니다." + +#: admin/wp-security-user-accounts-menu.php:216 +msgid "It would take a desktop PC approximately" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:217 +msgid "1 sec" +msgstr "1 초" + +#: admin/wp-security-user-accounts-menu.php:217 +msgid "to crack your password!" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:222 +msgid "Password Strength" +msgstr "비밀번호 보안수준" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:245 +msgid "Username " +msgstr "이용자명" + +#: admin/wp-security-user-accounts-menu.php:245 +msgid " already exists. Please enter another value. " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:262 +msgid "The database update operation of the user account failed!" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:291 +msgid "You entered an invalid username. Please enter another value. " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:295 +msgid "Please enter a value for your username. " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:302 +msgid "Username successfully changed." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:322 +msgid "Account login name" +msgstr "계정 로그인 이름" + +#: admin/wp-security-user-accounts-menu.php:331 +msgid "Edit user" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:54 +#: admin/wp-security-user-login-menu.php:474 +msgid "Failed login records" +msgstr "실패한 로그인 레코드" + +#: admin/wp-security-user-login-menu.php:55 +#: classes/grade-system/wp-security-feature-item-manager.php:51 +msgid "Force logout" +msgstr "강제 로그아웃" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:56 +#: admin/wp-security-user-login-menu.php:632 +msgid "Account activity logs" +msgstr "계정 활동 로그" + +#: admin/wp-security-user-login-menu.php:58 +#: admin/wp-security-user-login-menu.php:769 +msgid "Additional settings" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:81 +msgid "User login" +msgstr "사용자 로그인" + +#: admin/wp-security-user-login-menu.php:118 +msgid "You entered a non-numeric value for the max login attempts field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:124 +msgid "You entered a non numeric value for the login retry time period field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:130 +msgid "You entered a non numeric value for the lockout time length field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:136 +msgid "You entered a non numeric value for the maximum lockout time length field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:141 +msgid "You entered an invalid minimum lockout time length, it must be less than the maximum lockout time length value." +msgstr "" + +#: admin/wp-security-user-login-menu.php:141 +msgid "Both have been set to the default values." +msgstr "" + +#: admin/wp-security-user-login-menu.php:160 +msgid "Please fill in one or more email addresses to notify." +msgstr "" + +#: admin/wp-security-user-login-menu.php:162 +msgid "You have entered one or more invalid email addresses." +msgstr "" + +#: admin/wp-security-user-login-menu.php:165 +msgid "It has been set to your WordPress admin email as default." +msgstr "" + +#: admin/wp-security-user-login-menu.php:250 +msgid "Login lockout configuration" +msgstr "" + +#: admin/wp-security-user-login-menu.php:254 +msgid "One of the ways hackers try to compromise sites is via a " +msgstr "" + +#: admin/wp-security-user-login-menu.php:254 +msgid "Brute force login attack" +msgstr "" + +#: admin/wp-security-user-login-menu.php:254 +msgid "This is where attackers use repeated login attempts until they guess the password." +msgstr "" + +#: admin/wp-security-user-login-menu.php:255 +msgid "Apart from choosing strong passwords, monitoring and blocking IP addresses which are involved in repeated login failures in a short period of time is a very effective way to stop these types of attacks." +msgstr "" + +#: admin/wp-security-user-login-menu.php:256 +msgid "You may also want to checkout our %s feature for another secure way to protect against these types of attacks." +msgstr "" + +#: admin/wp-security-user-login-menu.php:261 +msgid "Login lockout options" +msgstr "" + +#: admin/wp-security-user-login-menu.php:272 +msgid "Enable login lockout feature" +msgstr "" + +#: admin/wp-security-user-login-menu.php:275 +msgid "Check this if you want to enable the login lockout feature and apply the settings below" +msgstr "" + +#: admin/wp-security-user-login-menu.php:279 +msgid "Allow unlock requests" +msgstr "잠금 해제 요청 허용" + +#: admin/wp-security-user-login-menu.php:282 +msgid "Check this if you want to allow users to generate an automated unlock request link which will unlock their account" +msgstr "사용자가 계정잠금을 해제하는 자동 잠금 해제 요청 링크를 생성하도록 허용하려면 이 방법을 확인합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:286 +msgid "Max login attempts" +msgstr "최대 로그인 시도" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:288 +msgid "Set the value for the maximum login retries before IP address is locked out" +msgstr "IP 주소가 잠기기 전에 최대 로그인 리트리에 대한 값을 설정합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:292 +msgid "Login retry time period (min)" +msgstr "로그인 재시도 기간(최소)" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:294 +msgid "If the maximum number of failed login attempts for a particular IP address occur within this time period the plugin will lock out that address" +msgstr "특정 IP 주소에 대한 로그인 시도가 최대 실패한 경우 이 기간 내에 플러그인이 해당 주소를 잠그게 됩니다." + +#: admin/wp-security-user-login-menu.php:299 +msgid "Minimum lockout time length" +msgstr "" + +#: admin/wp-security-user-login-menu.php:305 +msgid "Set the minimum time period in minutes of lockout." +msgstr "" + +#: admin/wp-security-user-login-menu.php:306 +msgid "This failed login lockout time will be tripled on each failed login." +msgstr "" + +#: admin/wp-security-user-login-menu.php:313 +msgid "Maximum lockout time length" +msgstr "" + +#: admin/wp-security-user-login-menu.php:318 +msgid "Set the maximum time period in minutes of lockout." +msgstr "" + +#: admin/wp-security-user-login-menu.php:319 +msgid "No IP address will be blocked for more than this time period after making a failed login attempt." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:324 +msgid "Display generic error message" +msgstr "일반 오류 메시지 표시" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:327 +msgid "Check this if you want to show a generic error message when a login attempt fails" +msgstr "로그인 시도가 실패할 때 일반 오류 메시지를 표시하려는 경우 이 방법을 확인합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:331 +msgid "Instantly lockout invalid usernames" +msgstr "즉시 잘못된 사용자 이름을 잠그기" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:334 +msgid "Check this if you want to instantly lockout login attempts with usernames which do not exist on your system" +msgstr "시스템에 존재하지 않는 사용자 이름으로 로그인 시도를 즉시 잠그려면 이 방법을 확인하십시오." + +#: admin/wp-security-user-login-menu.php:339 +msgid "Instantly lockout specific usernames" +msgstr "특정 사용자 이름을 즉시 잠그기" + +#: admin/wp-security-user-login-menu.php:349 +msgid "Insert one username per line. Existing usernames are not blocked even if present in the list." +msgstr "줄당 하나의 사용자 이름을 삽입합니다. 목록에 있는 경우에도 기존 사용자 이름은 차단되지 않습니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:354 +msgid "Notify by email" +msgstr "이메일로 알림" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:358 +msgid "Check this if you want to receive an email when someone has been locked out due to maximum failed login attempts" +msgstr "로그인 시도가 최대 실패로 인해 다른 사람이 잠긴 경우 이메일을 수신하려는 경우 이 방법을 확인하십시오." + +#: admin/wp-security-user-login-menu.php:361 +msgid "Fill in one email address per line." +msgstr "" + +#: admin/wp-security-user-login-menu.php:365 +msgid "Each email address must be on a new line." +msgstr "" + +#: admin/wp-security-user-login-menu.php:366 +msgid "If a valid email address has not been filled in, it will not be saved." +msgstr "" + +#: admin/wp-security-user-login-menu.php:367 +msgid "The valid email address format is userid@example.com" +msgstr "" + +#: admin/wp-security-user-login-menu.php:368 +msgid "Example: %s" +msgstr "" + +#: admin/wp-security-user-login-menu.php:375 +msgid "Enable PHP backtrace in email" +msgstr "" + +#: admin/wp-security-user-login-menu.php:379 +msgid "Check this if you want to include the PHP backtrace in notification emails." +msgstr "" + +#: admin/wp-security-user-login-menu.php:379 +msgid "This is internal coding information which makes it easier to investigate where an issued occurred." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:389 +msgid "Currently locked out IP address ranges" +msgstr "현재 잠긴 IP 주소 범위" + +#: admin/wp-security-user-login-menu.php:394 +msgid "To see a list of all locked IP addresses and ranges go to the %s tab in the dashboard menu." +msgstr "잠긴 모든 IP 주소 와 범위 목록을 보려면 대시보드 메뉴의 %s 탭으로 이동합니다." + +#: admin/wp-security-user-login-menu.php:399 +msgid "Login lockout IP whitelist settings" +msgstr "" + +#: admin/wp-security-user-login-menu.php:405 +msgid "Enable login lockout IP whitelist" +msgstr "" + +#: admin/wp-security-user-login-menu.php:416 +msgid "The addresses specified here will never be blocked by the login lockout feature." +msgstr "" + +#: admin/wp-security-user-login-menu.php:450 +msgid "User login feature - Delete all failed login records operation failed." +msgstr "" + +#: admin/wp-security-user-login-menu.php:452 +msgid "All records from the failed logins table were deleted successfully." +msgstr "" + +#: admin/wp-security-user-login-menu.php:467 +msgid "This tab displays the failed login attempts for your site." +msgstr "" + +#: admin/wp-security-user-login-menu.php:468 +msgid "The information below can be handy if you need to do security investigations because it will show you the IP range, username and ID (if applicable) and the time/date of the failed login attempt." +msgstr "" + +#: admin/wp-security-user-login-menu.php:469 +msgid "Failed login records that are older than %1$d days are purged automatically." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:508 +#: admin/wp-security-user-login-menu.php:517 +msgid "Delete all failed login records" +msgstr "실패한 로그인 레코드 모두 삭제" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:514 +msgid "Click this button if you wish to delete all failed login records in one go." +msgstr "한 번에 모든 실패한 로그인 레코드를 삭제하려면 이 단추를 클릭합니다." + +#: admin/wp-security-user-login-menu.php:544 +msgid "You entered a non numeric value for the logout time period field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-user-login-menu.php:569 +msgid "Setting an expiry period for your WP administration session is a simple way to protect against unauthorized access to your site from your computer." +msgstr "" + +#: admin/wp-security-user-login-menu.php:570 +msgid "This feature allows you to specify a time period in minutes after which the admin session will expire and the user will be forced to log back in." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:575 +msgid "Force user logout options" +msgstr "사용자 로그아웃 옵션 강제" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:587 +msgid "Enable force WP user logout" +msgstr "강제 WP 사용자 로그아웃 사용" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:590 +msgid "Check this if you want to force a wp user to be logged out after a configured amount of time" +msgstr "구성된 시간 이후에 WP 사용자를 강제로 로그아웃하도록 하려면 이 방법을 확인합니다." + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:594 +msgid "Logout the WP user after XX minutes" +msgstr "XX 분 후 WP 사용자 로그아웃" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:596 +msgid "(Minutes) The user will be forced to log back in after this time period has elapased." +msgstr "(분) 이 기간이 중복된 후에는 사용자가 다시 로그인해야 합니다." + +#: admin/wp-security-user-login-menu.php:625 +msgid "This tab displays the activity for accounts registered with your site that have logged in using the WordPress login form." +msgstr "" + +#: admin/wp-security-user-login-menu.php:626 +msgid "The information below can be handy if you need to do security investigations because it will show you the last 100 recent login events by username, IP address and time/date." +msgstr "" + +#: admin/wp-security-user-login-menu.php:627 +msgid "Account activity logs that are older than %1$d days are purged automatically." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:697 +msgid "Refresh logged in user data" +msgstr "사용자 데이터에 로그인한 새로 고침" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:701 +msgid "Refresh data" +msgstr "데이터 새로 고침" + +#: admin/wp-security-user-login-menu.php:706 +msgid "This tab displays all users who are currently logged into your site." +msgstr "" + +#: admin/wp-security-user-login-menu.php:707 +msgid "If you suspect there is a user or users who are logged in which should not be, you can block them by inspecting the IP addresses from the data below and adding them to your blacklist." +msgstr "" + +#: admin/wp-security-user-login-menu.php:708 +msgid "You can also instantly log them out by clicking on the \"Force logout\" link when you hover over the row in the user id column." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:713 +msgid "Currently logged in users" +msgstr "현재 로그인한 사용자" + +#: admin/wp-security-user-login-menu.php:761 +msgid "WordPress 5.6 introduced a new feature called \"Application passwords\"." +msgstr "" + +#: admin/wp-security-user-login-menu.php:762 +msgid "This allows you to create a token from the WordPress dashboard which then can be used in the authorization header." +msgstr "" + +#: admin/wp-security-user-login-menu.php:763 +msgid "This feature allows you to disable application passwords as they can leave your site vulnerable to social engineering and phishing scams." +msgstr "" + +#: admin/wp-security-user-login-menu.php:780 +#: classes/grade-system/wp-security-feature-item-manager.php:53 +msgid "Disable application password" +msgstr "" + +#: admin/wp-security-user-login-menu.php:783 +msgid "Check this if you want to disable the application password." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:27 +msgid "Manual approval" +msgstr "수동 승인" + +#: admin/wp-security-user-registration-menu.php:28 +#: classes/grade-system/wp-security-feature-item-manager.php:59 +msgid "Registration CAPTCHA" +msgstr "등록 캡차" + +#: admin/wp-security-user-registration-menu.php:29 +msgid "Registration honeypot" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:55 +msgid "User registration" +msgstr "회원가입" + +#: admin/wp-security-user-registration-menu.php:115 +msgid "User registration settings" +msgstr "사용자 등록 설정" + +#: admin/wp-security-user-registration-menu.php:119 +msgid "Manually approve new registrations" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:123 +msgid "If your site allows people to create their own accounts via the WordPress registration form, then you can minimize spam or bogus registrations by manually approving each registration." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:124 +msgid "This feature will automatically set a newly registered account to \"pending\" until the administrator activates it. Therefore undesirable registrants will be unable to log in without your express approval." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:125 +msgid "You can view all accounts which have been newly registered via the handy table below and you can also perform bulk activation/deactivation/deletion tasks on each account." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:142 +msgid "Enable manual approval of new registrations" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:145 +msgid "Check this if you want to automatically disable all newly registered accounts so that you can approve them manually." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:154 +msgid "Approve registered users" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:206 +msgid "This feature allows you to add a CAPTCHA form on the WordPress registration page." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:207 +msgid "Users who attempt to register will also need to enter the answer to a simple mathematical question - if they enter the wrong answer, the plugin will not allow them to register." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:208 +msgid "Therefore, adding a CAPTCHA form on the registration page is another effective yet simple spam registration prevention technique." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:212 +msgid "Registration page CAPTCHA settings" +msgstr "등록 페이지 캡차 설정" + +#: admin/wp-security-user-registration-menu.php:219 +msgid "The core default behaviour for WordPress Multi Site regarding user registration is that all users are registered via the main site." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:220 +msgid "Therefore, if you would like to add a CAPTCHA form to the registration page for a Multi Site, please go to \"Registration CAPTCHA\" settings on the main site." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:235 +msgid "Enable CAPTCHA on registration page" +msgstr "등록시 보안 문자 사용" + +#: admin/wp-security-user-registration-menu.php:238 +msgid "Check this if you want to insert a CAPTCHA form on the WordPress user registration page (if you allow user registration)." +msgstr "워드 프레스 사용자 등록 페이지에 captcha 양식을 삽입하려는 경우 (사용자 등록을 허용하는 경우)을 확인하십시오." + +#: admin/wp-security-user-registration-menu.php:276 +msgid "This feature allows you to add a special hidden \"honeypot\" field on the WordPress registration page. This will only be visible to robots and not humans." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:277 +msgid "Since robots usually fill in every input field from a registration form, they will also submit a value for the special hidden honeypot field." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:279 +msgid "Therefore, if the plugin detects that this field has a value when the registration form is submitted, then the robot which is attempting to register on your site will be redirected to its localhost address - http://127.0.0.1." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:285 +msgid "Registration form honeypot settings" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:296 +msgid "Enable honeypot on registration page" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:299 +msgid "Check this if you want to enable the honeypot feature for the registration page" +msgstr "" + +#: classes/aios-ajax.php:89 +msgid "Invalid IP retrieve method." +msgstr "" + +#: classes/aios-ajax.php:131 +#: wp-security-core.php:258 +msgid "The security check failed; try refreshing the page." +msgstr "" + +#: classes/aios-ajax.php:152 +#: wp-security-core.php:268 +msgid "You are not allowed to run this command." +msgstr "" + +#: classes/aios-ajax.php:173 +#: wp-security-core.php:282 +msgid "Options can only be saved by network admin" +msgstr "" + +#: classes/aios-ajax.php:202 +msgid "The command \"%s\" was not found" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:39 +msgid "Remove WP generator meta tag" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:45 +msgid "Change display name" +msgstr "표시 이름 변경" + +#: classes/grade-system/wp-security-feature-item-manager.php:57 +msgid "Registration approval" +msgstr "등록 승인" + +#: classes/grade-system/wp-security-feature-item-manager.php:61 +msgid "Enable registration honeypot" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:73 +msgid "WordPress files access" +msgstr "워드 프레스 파일 액세스" + +#: classes/grade-system/wp-security-feature-item-manager.php:77 +msgid "IP and user agent blacklisting" +msgstr "IP 또는 사용자 에이전트 블랙리스트 사용" + +#: classes/grade-system/wp-security-feature-item-manager.php:81 +msgid "Enable basic firewall" +msgstr "기본 방화벽 사용" + +#: classes/grade-system/wp-security-feature-item-manager.php:82 +msgid "Enable pingback vulnerability protection" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:83 +msgid "Block access to debug log file" +msgstr "디버그 로그 파일에 대한 액세스 차단" + +#: classes/grade-system/wp-security-feature-item-manager.php:87 +msgid "Forbid proxy comments" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:88 +msgid "Deny bad queries" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:91 +msgid "5G/6G blacklist" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:97 +msgid "Enable IP blocking for 404 detection" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:101 +msgid "Enable rename login page" +msgstr "이름 바꾸기 페이지 기능 사용" + +#: classes/grade-system/wp-security-feature-item-manager.php:106 +msgid "Lost password CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:107 +msgid "Custom login CAPTCHA" +msgstr "사용자 정의 로그인 캡타" + +#: classes/grade-system/wp-security-feature-item-manager.php:108 +msgid "Woo login CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:109 +msgid "Woo lost password CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:110 +msgid "Woo register CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:112 +msgid "Login IP whitelisting" +msgstr "로그인 IP 화이트리스팅" + +#: classes/grade-system/wp-security-feature-item-manager.php:114 +msgid "Enable login honeypot" +msgstr "로그인 허니팟 사용" + +#: classes/grade-system/wp-security-feature-item-manager.php:118 +msgid "Comment CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:119 +msgid "Block spambots" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:121 +msgid "BuddyPress registration CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:123 +msgid "bbPress new topic CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item.php:29 +msgid "Basic" +msgstr "기본" + +#: classes/grade-system/wp-security-feature-item.php:31 +msgid "Intermediate" +msgstr "중급" + +#: classes/grade-system/wp-security-feature-item.php:33 +msgid "Advanced" +msgstr "고급" + +#: classes/wp-security-captcha.php:47 +#: classes/wp-security-general-init-tasks.php:407 +msgid "Please enter an answer in digits:" +msgstr "숫자로 답변을 입력하십시오." + +#: classes/wp-security-captcha.php:127 +msgid "one" +msgstr "1" + +#: classes/wp-security-captcha.php:128 +msgid "two" +msgstr "2" + +#: classes/wp-security-captcha.php:129 +msgid "three" +msgstr "3" + +#: classes/wp-security-captcha.php:130 +msgid "four" +msgstr "4" + +#: classes/wp-security-captcha.php:131 +msgid "five" +msgstr "5" + +#: classes/wp-security-captcha.php:132 +msgid "six" +msgstr "6" + +#: classes/wp-security-captcha.php:133 +msgid "seven" +msgstr "7" + +#: classes/wp-security-captcha.php:134 +msgid "eight" +msgstr "8" + +#: classes/wp-security-captcha.php:135 +msgid "nine" +msgstr "9" + +#: classes/wp-security-captcha.php:136 +msgid "ten" +msgstr "10" + +#: classes/wp-security-captcha.php:137 +msgid "eleven" +msgstr "11" + +#: classes/wp-security-captcha.php:138 +msgid "twelve" +msgstr "12" + +#: classes/wp-security-captcha.php:139 +msgid "thirteen" +msgstr "13" + +#: classes/wp-security-captcha.php:140 +msgid "fourteen" +msgstr "14" + +#: classes/wp-security-captcha.php:141 +msgid "fifteen" +msgstr "15" + +#: classes/wp-security-captcha.php:142 +msgid "sixteen" +msgstr "16" + +#: classes/wp-security-captcha.php:143 +msgid "seventeen" +msgstr "17" + +#: classes/wp-security-captcha.php:144 +msgid "eighteen" +msgstr "18" + +#: classes/wp-security-captcha.php:145 +msgid "nineteen" +msgstr "19" + +#: classes/wp-security-captcha.php:146 +msgid "twenty" +msgstr "20" + +#: classes/wp-security-cronjob-handler.php:34 +msgid "Every 15 minutes" +msgstr "" + +#: classes/wp-security-debug-logger.php:46 +msgid "Unable to get the reason why" +msgstr "" + +#: classes/wp-security-debug-logger.php:47 +msgid "Unable to clear the logs" +msgstr "" + +#: classes/wp-security-file-scan.php:85 +msgid "All In One WP Security - File change detected!" +msgstr "" + +#: classes/wp-security-file-scan.php:87 +msgid "A file change was detected on your system for site URL" +msgstr "" + +#: classes/wp-security-file-scan.php:87 +msgid ". Scan was generated on" +msgstr "" + +#: classes/wp-security-file-scan.php:88 +msgid "A summary of the scan results is shown below:" +msgstr "" + +#: classes/wp-security-file-scan.php:91 +msgid "Login to your site to view the scan details." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-file-scan.php:313 +msgid "The following files were added to your host" +msgstr "호스트에 다음 파일이 추가되었습니다." + +#: classes/wp-security-file-scan.php:315 +#: classes/wp-security-file-scan.php:323 +#: classes/wp-security-file-scan.php:332 +msgid "modified on: " +msgstr "" + +#: classes/wp-security-file-scan.php:321 +msgid "The following files were removed from your host" +msgstr "" + +#: classes/wp-security-file-scan.php:330 +msgid "The following files were changed on your host" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:212 +#: classes/wp-security-general-init-tasks.php:481 +msgid "Application passwords have been disabled by All In One WP Security & Firewall plugin." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:428 +#: classes/wp-security-general-init-tasks.php:541 +#: classes/wp-security-general-init-tasks.php:574 +#: classes/wp-security-user-login.php:137 +#: classes/wp-security-user-registration.php:74 +msgid "ERROR: Your answer was incorrect - please try again." +msgstr "오류: 당신의 대답은 잘못되었습니다 - 다시 시도하십시오." + +#: classes/wp-security-general-init-tasks.php:463 +msgid "Enter something special:" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:476 +msgid "Application passwords" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:485 +msgid "Change setting" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:487 +msgid "Site admin can only change this setting." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:516 +msgid "Error: You entered an incorrect CAPTCHA answer. Please go back and try again." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:558 +msgid "Your CAPTCHA answer was incorrect - please try again." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:567 +msgid "ERROR: Your IP address is currently locked please contact the administrator!" +msgstr "" + +#. translators: %s: Admin Dashboard > WP Security > Brute Force > Login CAPTCHA Tab Link +#: classes/wp-security-general-init-tasks.php:642 +msgid "Your Google reCAPTCHA site key is wrong. Please fill the correct reCAPTCHA keys %s to use the Google reCAPTCHA feature." +msgstr "" + +#. translators: %s: Admin Dashboard > WP Security > Brute Force > Login CAPTCHA Tab Link +#: classes/wp-security-general-init-tasks.php:642 +#: classes/wp-security-notices.php:99 +msgid "here" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +msgid "Would you like All In One WP Security & Firewall to re-insert the security rules in your .htaccess file which were cleared when you deactivated the plugin?" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +#: templates/may-also-like.php:40 +#: templates/may-also-like.php:43 +#: templates/may-also-like.php:54 +#: templates/may-also-like.php:57 +#: templates/may-also-like.php:68 +#: templates/may-also-like.php:71 +#: templates/may-also-like.php:91 +#: templates/may-also-like.php:103 +#: templates/may-also-like.php:115 +#: templates/may-also-like.php:127 +#: templates/may-also-like.php:139 +#: templates/may-also-like.php:151 +#: templates/may-also-like.php:168 +#: templates/may-also-like.php:171 +#: templates/may-also-like.php:183 +#: templates/may-also-like.php:195 +#: templates/may-also-like.php:207 +#: templates/may-also-like.php:219 +#: templates/may-also-like.php:231 +#: templates/may-also-like.php:243 +#: templates/may-also-like.php:252 +#: templates/may-also-like.php:255 +#: templates/may-also-like.php:264 +#: templates/may-also-like.php:267 +#: templates/may-also-like.php:279 +#: templates/may-also-like.php:297 +#: templates/may-also-like.php:309 +#: templates/may-also-like.php:327 +#: templates/may-also-like.php:339 +#: templates/may-also-like.php:351 +#: templates/may-also-like.php:368 +#: templates/may-also-like.php:380 +msgid "Yes" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +#: templates/may-also-like.php:88 +#: templates/may-also-like.php:100 +#: templates/may-also-like.php:112 +#: templates/may-also-like.php:124 +#: templates/may-also-like.php:136 +#: templates/may-also-like.php:148 +#: templates/may-also-like.php:180 +#: templates/may-also-like.php:192 +#: templates/may-also-like.php:204 +#: templates/may-also-like.php:216 +#: templates/may-also-like.php:228 +#: templates/may-also-like.php:240 +#: templates/may-also-like.php:276 +#: templates/may-also-like.php:294 +#: templates/may-also-like.php:306 +#: templates/may-also-like.php:324 +#: templates/may-also-like.php:336 +#: templates/may-also-like.php:348 +#: templates/may-also-like.php:365 +#: templates/may-also-like.php:377 +#: templates/notices/custom-notice.php:27 +msgid "No" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:674 +msgid "Your registration is pending approval." +msgstr "" + +#: classes/wp-security-notices.php:25 +msgid "The All in One Security plugin has disabled the login whitelist setting that you have enabled in the past." +msgstr "" + +#: classes/wp-security-notices.php:29 +msgid "Your website is running on an Apache webserver, the login whitelisting might not be functional until the recent update of AIOS (because it relied upon Apache-specific module features)." +msgstr "" + +#: classes/wp-security-notices.php:31 +msgid "Your website is running on a non-Apache webserver, so the login whitelisting was not functional until the recent update of AIOS (because it relied upon Apache-specific features)." +msgstr "" + +#: classes/wp-security-notices.php:33 +msgid "It began working with AIOS version 5.0.8." +msgstr "" + +#: classes/wp-security-notices.php:33 +msgid "We have disabled it so that your login page will not be blocked unexpectedly." +msgstr "" + +#: classes/wp-security-notices.php:42 +msgid "Would you like to re-enable login whitelisting?" +msgstr "" + +#: classes/wp-security-notices.php:48 +msgid "Removed database backup feature from the All In One WP Security & Firewall plugin" +msgstr "" + +#: classes/wp-security-notices.php:50 +msgid "Beginning with version 5.0.0, AIOS has replaced the AIOS backup method with the superior UpdraftPlus method." +msgstr "" + +#: classes/wp-security-notices.php:51 +msgid "It remains free and is fully supported by the UpdraftPlus team." +msgstr "" + +#: classes/wp-security-notices.php:54 +msgid "You are seeing this notice because you have previously set up automated database backups in AIOS." +msgstr "" + +#: classes/wp-security-notices.php:55 +msgid "Would you like to set up scheduled backups with UpdraftPlus?" +msgstr "" + +#: classes/wp-security-notices.php:61 +msgid "Setup UpdraftPlus backup plugin" +msgstr "" + +#: classes/wp-security-notices.php:67 +msgid "Important: set up your IP address detection settings" +msgstr "" + +#: classes/wp-security-notices.php:69 +msgid "The All in One Security plugin couldn't be certain about the correct method to detect the IP address for your site visitors with your currently-configured IP address detection settings." +msgstr "" + +#: classes/wp-security-notices.php:70 +msgid "It is important for your security to set the IP address detection settings properly." +msgstr "" + +#: classes/wp-security-notices.php:73 +msgid "Please go to the settings and set them now." +msgstr "" + +#: classes/wp-security-notices.php:79 +msgid "Setup IP address detection settings" +msgstr "" + +#: classes/wp-security-notices.php:85 +msgid "Important: Disabled login whitelist setting" +msgstr "" + +#: classes/wp-security-notices.php:91 +msgid "Turn it back on" +msgstr "" + +#: classes/wp-security-notices.php:92 +msgid "Edit the settings" +msgstr "" + +#: classes/wp-security-notices.php:95 +msgid "Keep it off" +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Hey - We noticed All In One WP Security & Firewall has kept your site safe for a while. If you like us, please consider leaving a positive review to spread the word. Or if you have any issues or questions please leave us a support message %s." +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Thank you so much!" +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Team All In One WP Security & Firewall" +msgstr "" + +#: classes/wp-security-notices.php:109 +msgid "Enhance your security even more by backing up your site" +msgstr "" + +#: classes/wp-security-notices.php:110 +msgid "UpdraftPlus is the world's most trusted backup plugin from the owners of All In One WP Security & Firewall" +msgstr "" + +#: classes/wp-security-notices.php:121 +msgid "After you've secured your site, we recommend you install our WP-Optimize plugin to streamline it for better website performance." +msgstr "" + +#: classes/wp-security-process-renamed-login-page.php:152 +msgid "Not available." +msgstr "" + +#: classes/wp-security-two-factor-login.php:34 +msgid "Two factor authentication - Admin settings" +msgstr "" + +#: classes/wp-security-two-factor-login.php:97 +msgid "Two Factor Auth" +msgstr "" + +#: classes/wp-security-two-factor-login.php:153 +msgid "PHP OpenSSL or mcrypt module required" +msgstr "" + +#: classes/wp-security-two-factor-login.php:153 +msgid "The All In One WP Security plugin's Two Factor Authentication module requires either the PHP openssl (preferred) or mcrypt module to be installed. Please ask your web hosting company to install one of them." +msgstr "" + +#: classes/wp-security-user-login.php:71 +msgid "You have disabled login lockout by defining the AIOS_DISABLE_LOGIN_LOCKOUT constant value as true, and the login lockout setting has enabled it." +msgstr "" + +#. translators: 1: Locked IP Addresses admin page link +#: classes/wp-security-user-login.php:73 +msgid "Delete your login lockout IP from %s and define the AIOS_DISABLE_LOGIN_LOCKOUT constant value as false." +msgstr "" + +#: classes/wp-security-user-login.php:100 +msgid "ERROR: Access from your IP address has been blocked for security reasons. Please contact the administrator." +msgstr "오류: 보안상의 이유로 IP 주소의 액세스가 차단되었습니다. 관리자에게 문의하십시오." + +#: classes/wp-security-user-login.php:108 +msgid "Service temporarily unavailable" +msgstr "일시적으로 사용할 수 없는 서비스" + +#: classes/wp-security-user-login.php:163 +msgid "ACCOUNT PENDING: Your account is currently not active. An administrator needs to activate your account before you can login." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-user-login.php:242 +msgid "ERROR: Invalid login credentials." +msgstr "오류: 잘못된 로그인 자격 증명." + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-user-login.php:392 +msgid "Site Lockout Notification" +msgstr "사이트 잠금 알림" + +#: classes/wp-security-user-login.php:393 +msgid "User login lockout events had occurred due to too many failed login attempts or invalid username:" +msgstr "" + +#: classes/wp-security-user-login.php:396 +msgid "Username:" +msgstr "사용자 이름:" + +#: classes/wp-security-user-login.php:397 +msgid "IP address:" +msgstr "IP 주소:" + +#: classes/wp-security-user-login.php:399 +msgid "IP range:" +msgstr "IP 범위:" + +#: classes/wp-security-user-login.php:404 +msgid "Log into your site WordPress administration panel to see the duration of the lockout or to unlock the user." +msgstr "" + +#: classes/wp-security-user-login.php:515 +msgid "Unlock request notification" +msgstr "요청 알림 잠금 해제" + +#: classes/wp-security-user-login.php:516 +msgid "You have requested for the account with email address %s to be unlocked. Please click the link below to unlock your account:" +msgstr "이메일 주소 %s가 있는 계정의 잠금을 해제하도록 요청했습니다. 계정 잠금을 해제하려면 아래 링크를 클릭하십시오." + +#: classes/wp-security-user-login.php:516 +msgid "Unlock link: %s" +msgstr "링크 잠금 해제: %s" + +#: classes/wp-security-user-login.php:516 +msgid "After clicking the above link you will be able to login to the WordPress administration panel." +msgstr "위의 링크를 클릭하면 WordPress 관리 패널에 로그인할 수 있습니다." + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-user-login.php:739 +msgid "Your session has expired because it has been over %d minutes since your last login." +msgstr "마지막 로그인 이후 %d 분 이상되었기 때문에 세션이 만료되었습니다." + +#: classes/wp-security-user-login.php:740 +#: classes/wp-security-user-login.php:744 +msgid "Please log back in to continue." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-user-login.php:743 +msgid "You were logged out because you just changed the \"admin\" username." +msgstr "방금 \"관리자\" 사용자 이름을 변경했기 때문에 로그아웃되었습니다." + +#: classes/wp-security-user-login.php:773 +msgid "Request unlock" +msgstr "잠금 해제 요청" + +#: classes/wp-security-user-registration.php:68 +msgid "ERROR: You are not allowed to register because your IP address is currently locked!" +msgstr "오류: IP 주소가 현재 잠겨 있기 때문에 등록할 수 없습니다!" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-utility-ip-address.php:217 +#: classes/wp-security-utility-ip-address.php:231 +#: classes/wp-security-utility-ip-address.php:245 +#: classes/wp-security-utility-ip-address.php:257 +#: classes/wp-security-utility-ip-address.php:269 +msgid " is not a valid ip address format." +msgstr "유효한 IP 주소 형식이 아닙니다." + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-utility-ip-address.php:274 +msgid "You cannot ban your own IP address: " +msgstr "자신의 IP 주소를 금지할 수 없습니다." + +#: classes/wp-security-utility.php:254 +msgid "This feature can only be configured by the \"superadmin\" on the main site." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:32 +msgid "ERROR: Unable to process your request!" +msgstr "" + +#: other-includes/wp-security-unlock-request.php:45 +msgid "Please enter a valid email address" +msgstr "올바은 이메일 주소를 입력하세요" + +#: other-includes/wp-security-unlock-request.php:57 +msgid "User account not found!" +msgstr "계정을 찾지 못했습니다." + +#: other-includes/wp-security-unlock-request.php:71 +msgid "Error: No locked entry was found in the database with your IP address range." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:76 +msgid "An email has been sent to you with the unlock instructions." +msgstr "잠금 해제 지침과 함께 이메일이 전송되었습니다." + +#: other-includes/wp-security-unlock-request.php:93 +msgid "You are here because you have been locked out due to too many incorrect login attempts." +msgstr "잘못된 로그인 시도가 너무 많아 서 잠겨 있기 때문에 여기에 있습니다." + +#: other-includes/wp-security-unlock-request.php:94 +msgid "Please enter your email address and you will receive an email with instructions on how to unlock yourself." +msgstr "이메일 주소를 입력하면 잠금을 해제하는 방법에 대한 지침이 있는 이메일을 받게 됩니다." + +#: other-includes/wp-security-unlock-request.php:104 +msgid "Email Address" +msgstr "이메일 주소" + +#: other-includes/wp-security-unlock-request.php:108 +msgid "Send unlock request" +msgstr "" + +#: templates/admin/incompatible-plugin.php:6 +msgid "Two Factor Authentication" +msgstr "" + +#: templates/admin/incompatible-plugin.php:10 +msgid "Two Factor Authentication currently disabled" +msgstr "" + +#: templates/admin/incompatible-plugin.php:12 +#: templates/admin/incompatible-plugin.php:16 +msgid "Two factor authentication in All In One WP Security is currently disabled because the incompatible plugin %s is active." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: templates/automated-database-backup.php:4 +msgid "Automated scheduled backups" +msgstr "자동 예약된 백업" + +#: templates/automated-database-backup.php:9 +msgid "Automate backup in the UpdraftPlus plugin" +msgstr "" + +#: templates/automated-database-backup.php:19 +msgid "The AIOS 5.0.0 version release has removed the automated backup feature." +msgstr "" + +#: templates/automated-database-backup.php:20 +msgid "The AIOS automated backup had issues that made it less robust than we could be happy with." +msgstr "" + +#: templates/automated-database-backup.php:21 +msgid "Follow this link to automate backups in the superior UpdraftPlus backup plugin." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: templates/info/ip-address-ip-range-info.php:5 +msgid "Each IP address must be on a new line." +msgstr "각 IP 주소는 새 줄에 있어야 합니다." + +#: templates/info/ip-address-ip-range-info.php:6 +msgid "To specify an IPv4 range use a wildcard \"*\" character. Acceptable ways to use wildcards is shown in the examples below:" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: templates/info/ip-address-ip-range-info.php:7 +msgid "Example 1: 195.47.89.*" +msgstr "예 1: 195.47.89.*" + +# @ all-in-one-wp-security-and-firewall +#: templates/info/ip-address-ip-range-info.php:8 +msgid "Example 2: 195.47.*.*" +msgstr "示例 2:195.47.*.*" + +# @ all-in-one-wp-security-and-firewall +#: templates/info/ip-address-ip-range-info.php:9 +msgid "Example 3: 195.*.*.*" +msgstr "示例 3:195.*.*.*" + +#: templates/info/ip-address-ip-range-info.php:10 +msgid "To specify an IPv6 range use CIDR format as shown in the examples below:" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:11 +msgid "Example 4: 2401:4900:54c3:af15:2:2:5dc0:0/112" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:12 +msgid "Example 5: 2001:db8:1263::/48" +msgstr "" + +#: templates/may-also-like.php:5 +msgid "All-In-One Security (AIOS) Free vs Premium Comparison Chart" +msgstr "" + +#: templates/may-also-like.php:7 +msgid "FAQs" +msgstr "" + +#: templates/may-also-like.php:9 +msgid "Ask a pre-sales question" +msgstr "" + +#: templates/may-also-like.php:17 +msgid "All In One WP Security & Firewall Free" +msgstr "" + +#: templates/may-also-like.php:26 +#: templates/may-also-like.php:386 +msgid "Installed" +msgstr "" + +#: templates/may-also-like.php:29 +#: templates/may-also-like.php:389 +msgid "Upgrade now" +msgstr "" + +#: templates/may-also-like.php:34 +msgid "Login security feature suite" +msgstr "" + +#: templates/may-also-like.php:35 +msgid "Protect against brute-force attacks and keep bots at bay." +msgstr "" + +#: templates/may-also-like.php:35 +msgid "AIOS takes WordPress' default login security features to a whole new level." +msgstr "" + +#: templates/may-also-like.php:37 +msgid "To see all login security features, visit %s" +msgstr "" + +#: templates/may-also-like.php:48 +msgid "Firewall and file protection feature suite" +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Protection from the latest exploits." +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Activate firewall settings ranging from basic, intermediate and advanced." +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Get comprehensive, instant protection with All-in-One Security." +msgstr "" + +#: templates/may-also-like.php:51 +msgid "To see all firewall and file protection features, visit %s" +msgstr "" + +#: templates/may-also-like.php:62 +msgid "Content protection feature suite" +msgstr "" + +#: templates/may-also-like.php:63 +msgid "Eliminate spam and protect your content to dramatically improve your website's interactions with search engines." +msgstr "" + +#: templates/may-also-like.php:65 +msgid "To see all content protection features, visit %s" +msgstr "" + +#: templates/may-also-like.php:76 +msgid "Malware scanning" +msgstr "" + +#: templates/may-also-like.php:77 +msgid "Finding out by accident that your site has been infected with malware is too late." +msgstr "" + +#: templates/may-also-like.php:79 +msgid "Malware can have a dramatic effect on your site's search rankings and you may not even know about it." +msgstr "" + +#: templates/may-also-like.php:79 +msgid "It can slow your website down, access customer data, send unsolicited emails, change your content or prevent users from accessing it." +msgstr "" + +#: templates/may-also-like.php:84 +msgid "Automatic malware scanning" +msgstr "" + +#: templates/may-also-like.php:85 +msgid "Best-in-class scanning for the latest malware, trojans and spyware 24/7." +msgstr "" + +#: templates/may-also-like.php:96 +msgid "Response time monitoring" +msgstr "" + +#: templates/may-also-like.php:97 +msgid "You'll know immediately if your website's response time is negatively affected." +msgstr "" + +#: templates/may-also-like.php:108 +msgid "Up-time monitoring" +msgstr "" + +#: templates/may-also-like.php:109 +msgid "AIOS checks your website's uptime every 5 minutes." +msgstr "" + +#: templates/may-also-like.php:109 +msgid "We'll notify you straight away if your site/server goes down." +msgstr "" + +#: templates/may-also-like.php:120 +msgid "Prevents blacklisting by search engines" +msgstr "" + +#: templates/may-also-like.php:121 +msgid "AIOS monitors your site's blacklist status daily." +msgstr "" + +#: templates/may-also-like.php:121 +msgid "We'll notify you within 24 hours if something's amiss so you can take action, before it's too late." +msgstr "" + +#: templates/may-also-like.php:132 +msgid "Flexible assignment" +msgstr "" + +#: templates/may-also-like.php:133 +msgid "Register and remove websites from the scanning service at any time." +msgstr "" + +#: templates/may-also-like.php:144 +msgid "Malware reports" +msgstr "" + +#: templates/may-also-like.php:145 +msgid "Reports are available via the 'My Account' page and directly via email." +msgstr "" + +#: templates/may-also-like.php:156 +msgid "Flexible two-factor authentication" +msgstr "" + +#: templates/may-also-like.php:157 +msgid "With Two-Factor Authentication (TFA) users enter their username and password and a one-time code sent to a device to login." +msgstr "" + +#: templates/may-also-like.php:159 +msgid "TFA is a feature in both our free and premium packages, but AIOS Premium affords whole new levels of control over how TFA is implemented." +msgstr "" + +#: templates/may-also-like.php:164 +msgid "Authenticator apps" +msgstr "" + +#: templates/may-also-like.php:165 +msgid "Supports TOTP and HOTP protocols." +msgstr "" + +#: templates/may-also-like.php:165 +msgid "TFA Can be used with Google Authenticator, Microsoft Authenticator, Authy and many more." +msgstr "" + +#: templates/may-also-like.php:176 +msgid "Role specific configuration" +msgstr "" + +#: templates/may-also-like.php:177 +msgid "Make it compulsory for certain roles e.g. for admin and editor roles." +msgstr "" + +#: templates/may-also-like.php:188 +msgid "Require TFA after a set time period" +msgstr "" + +#: templates/may-also-like.php:189 +msgid "For example you could require all admins to have TFA once their accounts are a week old." +msgstr "" + +#: templates/may-also-like.php:200 +msgid "Trusted devices - control how often TFA is required" +msgstr "" + +#: templates/may-also-like.php:201 +msgid "Ask for TFA after a chosen number of days for trusted devices instead of on every login." +msgstr "" + +#: templates/may-also-like.php:212 +msgid "Anti-bot protection" +msgstr "" + +#: templates/may-also-like.php:213 +msgid "Option to hide the existence of forms on WooCommerce login pages unless JavaScript is active." +msgstr "" + +#: templates/may-also-like.php:224 +msgid "Customise TFA design layout" +msgstr "" + +#: templates/may-also-like.php:225 +msgid "Customise the design of TFA so it aligns with your existing web design." +msgstr "" + +#: templates/may-also-like.php:236 +msgid "TFA emergency codes" +msgstr "" + +#: templates/may-also-like.php:237 +msgid "Generate a one-time use emergency code to allow access if your device is lost." +msgstr "" + +#: templates/may-also-like.php:248 +msgid "TFA multisite compatibility" +msgstr "" + +#: templates/may-also-like.php:249 +msgid "TFA is Compatible with multisite networks and sub-sites." +msgstr "" + +#: templates/may-also-like.php:260 +msgid "TFA support for common login forms" +msgstr "" + +#: templates/may-also-like.php:261 +msgid "Supports WooCommerce, Affiliates-WP and Theme my Login login forms." +msgstr "" + +#: templates/may-also-like.php:272 +msgid "TFA support for other login forms" +msgstr "" + +#: templates/may-also-like.php:273 +msgid "Supports Elementor Pro, bbPress and all third-party login forms without any further coding needed." +msgstr "" + +#: templates/may-also-like.php:284 +msgid "Smart 404 blocking" +msgstr "" + +#: templates/may-also-like.php:285 +msgid "404 errors can occur when someone legitimately mistypes a URL, but they're also generated by hackers searching for weaknesses in your site." +msgstr "" + +#: templates/may-also-like.php:290 +msgid "Automatically and permanently blocks bots producing 404s" +msgstr "" + +#: templates/may-also-like.php:291 +msgid "AIOS Premium provides more protection than the competition by automatically and permanently blocking IP addresses of bots and hackers based on how many 404 errors they generate." +msgstr "" + +#: templates/may-also-like.php:302 +msgid "404 error charts" +msgstr "" + +#: templates/may-also-like.php:303 +msgid "Handy charts keep you informed of how many 404s have occurred and which IP address or country is producing them." +msgstr "" + +#: templates/may-also-like.php:314 +msgid "Country blocking" +msgstr "" + +#: templates/may-also-like.php:315 +msgid "Most malicious attacks come from a handful of countries and so it's possible to prevent most attacks with our country blocking tool." +msgstr "" + +#: templates/may-also-like.php:320 +msgid "Block traffic based on country of origin" +msgstr "" + +#: templates/may-also-like.php:321 +msgid "AIOS Premium utilises an IP database that promises 99.5% accuracy." +msgstr "" + +#: templates/may-also-like.php:332 +msgid "Block traffic to specific pages based on country of origin" +msgstr "" + +#: templates/may-also-like.php:333 +msgid "Block access to your whole site or on a page-by-page basis." +msgstr "" + +#: templates/may-also-like.php:344 +msgid "Whitelist some users from blocked countries" +msgstr "" + +#: templates/may-also-like.php:345 +msgid "Whitelist IP addresses or IP ranges even if they are part of a blocked country." +msgstr "" + +#: templates/may-also-like.php:356 +msgid "Premium support" +msgstr "" + +#: templates/may-also-like.php:361 +msgid "Unlimited support" +msgstr "" + +#: templates/may-also-like.php:362 +msgid "Personalised, email support from our team of Security experts, as and when you need it." +msgstr "" + +#: templates/may-also-like.php:373 +msgid "Guaranteed response time" +msgstr "" + +#: templates/may-also-like.php:374 +msgid "We offer a guaranteed response time of three days." +msgstr "" + +#: templates/may-also-like.php:374 +msgid "99% of our Premium customers receive a response to their enquiry within 24 hours during the working week." +msgstr "" + +#: templates/may-also-like.php:397 +msgid "Our other plugins" +msgstr "" + +#: templates/may-also-like.php:411 +msgid "UpdraftPlus – the ultimate protection for your site, hard work and business" +msgstr "" + +#: templates/may-also-like.php:412 +msgid "Simplifies backups and restoration." +msgstr "" + +#: templates/may-also-like.php:412 +msgid "It is the world's highest ranking and most popular scheduled backup plugin, with over three million currently-active installs." +msgstr "" + +#: templates/may-also-like.php:413 +#: templates/may-also-like.php:419 +#: templates/may-also-like.php:425 +#: templates/may-also-like.php:431 +msgid "Try for free" +msgstr "" + +#: templates/may-also-like.php:417 +msgid "WP-Optimize – keep your database fast and efficient" +msgstr "" + +#: templates/may-also-like.php:418 +msgid "Makes your site fast and efficient." +msgstr "" + +#: templates/may-also-like.php:418 +msgid "It cleans the database, compresses images and caches pages for ultimate speed." +msgstr "" + +#: templates/may-also-like.php:423 +msgid "UpdraftCentral – save hours managing multiple WP sites from one place" +msgstr "" + +#: templates/may-also-like.php:424 +msgid "Highly efficient way to manage, optimize, update and backup multiple websites from one place." +msgstr "" + +#: templates/may-also-like.php:429 +msgid "Easy Updates Manager" +msgstr "" + +#: templates/may-also-like.php:430 +msgid "Keeps your WordPress site up to date and bug free." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:2 +msgid "IP address detection settings" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:6 +msgid "The IP address detection settings allow you to specify how visitors' IP addresses are made known to PHP (and hence to WordPress and its plugins)." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:7 +msgid "Usually, this is automatic and there is only one choice." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:8 +msgid "However in some setups, such as those using proxies (including load-balancers and security firewalls like Cloudflare), it may be necessary to set this manually." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: templates/menus/settings/advanced-settings.php:9 +msgid "Attention" +msgstr "주의!" + +#: templates/menus/settings/advanced-settings.php:9 +msgid "It is important to set this correctly - otherwise you may make it possible for a hacker to ban all your visitors (e.g. via banning Cloudflare from connecting to you) instead of being banned himself." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:9 +msgid "The default is to use the REMOTE_ADDR PHP server variable. If this variable does not contain the visitor's IP address, then whilst you can make a different selection below, it is better to ask your web hosting company to have it correctly set." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:10 +msgid "This is the most secure setup, because when set correctly it is immune from being spoofed by an attacker." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:16 +msgid "You have no available IP address detection method(s); you must contact your web hosting company." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:22 +#: templates/menus/settings/advanced-settings.php:27 +#: templates/menus/settings/advanced-settings.php:32 +msgid "Your detected IP address according to %s:" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:38 +msgid "If your site is setup on localhost, you won't see your external IP address using your server's IP detection setting; but on a localhost-served site (not available to the outside world), the setting is irrelevant and can be ignored." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:61 +msgid "Choose a $_SERVER variable you would like to detect visitors' IP address using." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:67 +msgid "If your chosen server variable fails the plugin will automatically fall back to retrieving the IP address from $_SERVER[\"REMOTE_ADDR\"]" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:73 +msgid "Your IP address if using this setting:" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:75 +msgid "fetching..." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:81 +#: templates/menus/settings/advanced-settings.php:190 +msgid "getting..." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:89 +msgid "look-up possibly blocked by an ad-blocker or similar tool" +msgstr "" + +#: templates/notices/cookie-based-brute-force-prevention-disabled.php:4 +msgid "Cookie based brute force login prevention currently disabled" +msgstr "" + +#: templates/notices/cookie-based-brute-force-prevention-disabled.php:6 +msgid "Cookie based brute force login prevention is currently disabled via the AIOS_DISABLE_COOKIE_BRUTE_FORCE_PREVENTION constant (which is mostly likely to be defined in your wp-config.php)" +msgstr "" + +#: templates/notices/disable-login-whitelist.php:4 +msgid "Login whitelisting currently disabled" +msgstr "" + +#: templates/notices/disable-login-whitelist.php:6 +msgid "Login whitelisting is currently disabled via the AIOS_DISABLE_LOGIN_WHITELIST constant (which is mostly likely to be defined in your wp-config.php)" +msgstr "" + +#: templates/notices/horizontal-notice.php:8 +#: templates/notices/horizontal-notice.php:40 +msgid "notice image" +msgstr "" + +#: templates/notices/horizontal-notice.php:18 +msgid "Ok, you deserve it" +msgstr "" + +#: templates/notices/horizontal-notice.php:22 +msgid "Maybe later" +msgstr "" + +#: templates/notices/horizontal-notice.php:26 +msgid "Never" +msgstr "" + +#: templates/notices/horizontal-notice.php:66 +msgid "Get UpdraftCentral" +msgstr "" + +#: templates/notices/horizontal-notice.php:68 +msgid "Get UpdraftPlus" +msgstr "" + +#: templates/notices/horizontal-notice.php:70 +msgid "Get WP-Optimize" +msgstr "" + +#: templates/notices/horizontal-notice.php:72 +msgid "Find out more." +msgstr "" + +#: templates/notices/horizontal-notice.php:74 +msgid "Sign up" +msgstr "" + +#: templates/notices/horizontal-notice.php:76 +msgid "Go there" +msgstr "" + +#: templates/notices/horizontal-notice.php:78 +msgid "Read more" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:4 +msgid "Dismiss (for %s months)" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:6 +msgid "Thank you for installing All In One WP Security & Firewall!" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:13 +msgid "Super-charge and secure your WordPress site even more with our other top plugins:" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:17 +msgid "%s makes your site fast and efficient. It cleans the database, compresses images and caches pages for ultimate speed." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:21 +msgid "%s simplifies backups and restoration. It is the world's highest ranking and most popular scheduled backup plugin, with over three million currently-active installs." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:25 +msgid "%s is a highly efficient way to manage, optimize, update and backup multiple websites from one place." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:29 +msgid "%s is a WordPress subscription extension for WooCommerce store owners." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:33 +msgid "More quality plugins" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:33 +msgid "Premium WooCommerce plugins" +msgstr "" + +#: templates/partials/non-apache-feature-notice.php:9 +msgid "This feature works only on the Apache server." +msgstr "" + +#: templates/partials/non-apache-feature-notice.php:10 +msgid "You are using the non-apache server %s, so this feature won't work on your site." +msgstr "" + +#: wp-security-core.php:236 +#: wp-security.php:45 +msgid "This plugin requires PHP version %s." +msgstr "" + +#: wp-security-core.php:237 +msgid "Current site PHP version is %s." +msgstr "" + +#: wp-security-core.php:238 +#: wp-security.php:47 +msgid "You will need to ask your web hosting company to upgrade." +msgstr "" + +#: wp-security-core.php:397 +msgid "Error:" +msgstr "" + +#: wp-security-core.php:397 +msgid "template not found" +msgstr "" + +#: wp-security.php:44 +msgid "All In One WP Security and Firewall plugin has been deactivated." +msgstr "" + +#: wp-security.php:46 +msgid "Your current PHP version is %s." +msgstr "" diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-pl_PL.mo b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-pl_PL.mo new file mode 100755 index 00000000..14094369 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-pl_PL.mo differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-pl_PL.po b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-pl_PL.po new file mode 100755 index 00000000..c3d34581 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-pl_PL.po @@ -0,0 +1,6015 @@ +msgid "" +msgstr "" +"Project-Id-Version: All In One WP Security vv3.7.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2021-03-13 21:52+0100\n" +"Last-Translator: manuel \n" +"Language-Team: \n" +"Language: pl_PL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 2.4.2\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Textdomain-Support: yes\n" + +#. Plugin Name of the plugin +msgid "All In One WP Security" +msgstr "" + +#. Plugin URI of the plugin +msgid "https://wordpress.org/plugins/all-in-one-wp-security-and-firewall/" +msgstr "" + +#. Description of the plugin +msgid "All round best WordPress security plugin!" +msgstr "" + +#. Author of the plugin +msgid "All In One WP Security & Firewall Team" +msgstr "" + +#. Author URI of the plugin +msgid "https://teamupdraft.com/" +msgstr "" + +#: admin/general/wp-security-list-table.php:483 +msgid "Are you sure you want to perform this bulk action?" +msgstr "" + +#: admin/wp-security-admin-init.php:259 +msgid "Unexpected response:" +msgstr "" + +#: admin/wp-security-admin-init.php:290 +msgid "Enjoyed %1$s? Please leave us a %2$s rating. We really appreciate your support!" +msgstr "" + +#: admin/wp-security-admin-init.php:414 +#: classes/wp-security-two-factor-login.php:95 +msgid "WP Security" +msgstr "" + +#: admin/wp-security-admin-init.php:415 +#: admin/wp-security-dashboard-menu.php:26 +#: admin/wp-security-dashboard-menu.php:76 +msgid "Dashboard" +msgstr "" + +#: admin/wp-security-admin-init.php:416 +#: admin/wp-security-settings-menu.php:95 +msgid "Settings" +msgstr "" + +#: admin/wp-security-admin-init.php:417 +msgid "User Accounts" +msgstr "" + +#: admin/wp-security-admin-init.php:418 +msgid "User Login" +msgstr "" + +#: admin/wp-security-admin-init.php:419 +msgid "User Registration" +msgstr "" + +#: admin/wp-security-admin-init.php:420 +msgid "Database Security" +msgstr "" + +#: admin/wp-security-admin-init.php:424 +msgid "Filesystem Security" +msgstr "" + +#: admin/wp-security-admin-init.php:429 +msgid "Blacklist Manager" +msgstr "" + +#: admin/wp-security-admin-init.php:434 +#: admin/wp-security-firewall-menu.php:60 +msgid "Firewall" +msgstr "" + +#: admin/wp-security-admin-init.php:436 +msgid "Brute Force" +msgstr "" + +#: admin/wp-security-admin-init.php:437 +msgid "Spam Prevention" +msgstr "" + +#: admin/wp-security-admin-init.php:441 +#: admin/wp-security-filescan-menu.php:53 +msgid "Scanner" +msgstr "" + +#: admin/wp-security-admin-init.php:443 +#: admin/wp-security-maintenance-menu.php:51 +msgid "Maintenance" +msgstr "" + +#: admin/wp-security-admin-init.php:444 +#: admin/wp-security-misc-options-menu.php:57 +msgid "Miscellaneous" +msgstr "" + +#: admin/wp-security-admin-init.php:445 +#: admin/wp-security-tools-menu.php:64 +msgid "Tools" +msgstr "" + +#: admin/wp-security-admin-init.php:457 +msgid "Premium Upgrade" +msgstr "" + +#: admin/wp-security-admin-menu.php:67 +msgid "Settings successfully updated." +msgstr "" + +#: admin/wp-security-admin-menu.php:77 +msgid "Successfully deleted the selected record(s)." +msgstr "" + +#: admin/wp-security-admin-menu.php:86 +msgid "Failed to delete the selected record(s)." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:25 +msgid "Ban users" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:51 +msgid "Blacklist manager" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:132 +#: admin/wp-security-firewall-menu.php:1233 +#: admin/wp-security-list-404.php:234 +#: admin/wp-security-list-comment-spammer-ip.php:205 +msgid "The plugin was unable to write to the .htaccess file. Please edit file manually." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:139 +msgid "Ban IPs or user agents" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:142 +msgid "The All In One WP Security Blacklist feature gives you the option of banning certain host IP addresses or ranges and also user agents." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:143 +msgid "This feature will deny total site access for users which have IP addresses or user agents matching those which you have configured in the settings below." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:144 +msgid "The plugin achieves this by making appropriate modifications to your .htaccess file." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:145 +msgid "By blocking people, you are using the most secure first line of defence, which denies all access to blacklisted visitors as soon as they hit your hosting server." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:154 +#: admin/wp-security-firewall-menu.php:1055 +#: templates/may-also-like.php:20 +msgid "All In One WP Security & Firewall Premium" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:155 +#: admin/wp-security-firewall-menu.php:1056 +msgid "You may also be interested in %s." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "This plugin adds a number of extra features including %s and %s." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "smart 404 blocking" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "country IP blocking" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:170 +msgid "IP hosts and user agent blacklist settings" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:182 +#: admin/wp-security-brute-force-menu.php:193 +#: admin/wp-security-brute-force-menu.php:331 +msgid "must read this message" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:183 +#: admin/wp-security-brute-force-menu.php:194 +msgid "This feature can lock you out of admin if it doesn't work correctly on your site. You %s before activating this feature." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:189 +msgid "Enable IP or user agent blacklisting" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:192 +msgid "Check this if you want to enable the banning (or blacklisting) of selected IP addresses and/or user agents specified in the settings below" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:196 +msgid "Enter IP addresses:" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:200 +msgid "Enter one or more IP addresses or IP ranges." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:205 +msgid "Enter user agents:" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:210 +msgid "Enter one or more user agent strings." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:211 +#: admin/wp-security-brute-force-menu.php:374 +#: admin/wp-security-brute-force-menu.php:408 +#: admin/wp-security-brute-force-menu.php:431 +#: admin/wp-security-brute-force-menu.php:452 +#: admin/wp-security-filescan-menu.php:309 +#: admin/wp-security-filescan-menu.php:326 +#: admin/wp-security-firewall-menu.php:175 +#: admin/wp-security-firewall-menu.php:212 +#: admin/wp-security-firewall-menu.php:232 +#: admin/wp-security-firewall-menu.php:258 +#: admin/wp-security-firewall-menu.php:385 +#: admin/wp-security-firewall-menu.php:415 +#: admin/wp-security-firewall-menu.php:446 +#: admin/wp-security-firewall-menu.php:474 +#: admin/wp-security-firewall-menu.php:503 +#: admin/wp-security-firewall-menu.php:681 +#: admin/wp-security-firewall-menu.php:699 +#: admin/wp-security-firewall-menu.php:737 +#: admin/wp-security-firewall-menu.php:868 +#: admin/wp-security-firewall-menu.php:1087 +#: admin/wp-security-firewall-menu.php:1110 +#: admin/wp-security-spam-menu.php:186 +#: admin/wp-security-spam-menu.php:221 +#: admin/wp-security-spam-menu.php:390 +#: admin/wp-security-spam-menu.php:430 +#: admin/wp-security-user-login-menu.php:362 +#: templates/info/ip-address-ip-range-info.php:2 +#: templates/menus/settings/advanced-settings.php:63 +msgid "More info" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:214 +msgid "Each user agent string must be on a new line." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:215 +msgid "Example 1 - A single user agent string to block:" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:217 +msgid "Example 2 - A list of more than 1 user agent strings to block" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:225 +#: admin/wp-security-brute-force-menu.php:213 +#: admin/wp-security-brute-force-menu.php:686 +#: admin/wp-security-brute-force-menu.php:806 +#: admin/wp-security-brute-force-menu.php:868 +#: admin/wp-security-filescan-menu.php:351 +#: admin/wp-security-filesystem-menu.php:242 +#: admin/wp-security-firewall-menu.php:945 +#: admin/wp-security-firewall-menu.php:1129 +#: admin/wp-security-misc-options-menu.php:167 +#: admin/wp-security-misc-options-menu.php:218 +#: admin/wp-security-misc-options-menu.php:278 +#: admin/wp-security-settings-menu.php:619 +#: admin/wp-security-settings-menu.php:680 +#: admin/wp-security-spam-menu.php:233 +#: admin/wp-security-spam-menu.php:407 +#: admin/wp-security-spam-menu.php:526 +#: admin/wp-security-spam-menu.php:588 +#: admin/wp-security-user-login-menu.php:384 +#: admin/wp-security-user-login-menu.php:422 +#: admin/wp-security-user-login-menu.php:601 +#: admin/wp-security-user-login-menu.php:788 +#: admin/wp-security-user-registration-menu.php:150 +#: admin/wp-security-user-registration-menu.php:242 +#: admin/wp-security-user-registration-menu.php:305 +#: templates/menus/settings/advanced-settings.php:217 +msgid "Save settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:33 +#: admin/wp-security-brute-force-menu.php:759 +#: admin/wp-security-dashboard-menu.php:651 +msgid "Rename login page" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:34 +#: admin/wp-security-brute-force-menu.php:154 +msgid "Cookie based brute force prevention" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:35 +#: classes/grade-system/wp-security-feature-item-manager.php:105 +msgid "Login CAPTCHA" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:36 +#: admin/wp-security-brute-force-menu.php:746 +msgid "Login whitelist" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:37 +msgid "Honeypot" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:67 +msgid "Brute force" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:105 +msgid "Please enter a value for your login page slug." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:109 +msgid "You cannot use the value \"wp-admin\" for your login page slug." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:111 +msgid "You must use alpha numeric characters for your login page slug." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:116 +#: admin/wp-security-filescan-menu.php:174 +#: admin/wp-security-firewall-menu.php:151 +#: admin/wp-security-firewall-menu.php:1011 +#: admin/wp-security-spam-menu.php:101 +#: admin/wp-security-spam-menu.php:270 +#: admin/wp-security-spam-menu.php:302 +#: admin/wp-security-user-login-menu.php:184 +#: admin/wp-security-user-login-menu.php:553 +#: templates/partials/non-apache-feature-notice.php:9 +msgid "Attention:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:133 +msgid "Could not delete the Cookie-based directives from the .htaccess file. Please check the file permissions." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:155 +msgid "Login page white list" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:156 +msgid "An effective Brute Force prevention technique is to change the default WordPress login page URL." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:157 +msgid "Normally if you wanted to login to WordPress you would type your site's home URL followed by wp-login.php." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:158 +msgid "This feature allows you to change the login URL by setting your own slug and renaming the last portion of the login URL which contains the wp-login.php to any string that you like." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:159 +msgid "By doing this, malicious bots and hackers will not be able to access your login page because they will not know the correct login page URL." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:161 +msgid "You may also be interested in the following alternative brute force prevention features:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:172 +msgid "Your WordPress login page URL has been renamed." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:173 +msgid "Your current login URL is:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:181 +msgid "Rename login page settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:195 +msgid "NOTE: If you are hosting your site on WPEngine or a provider which performs server caching, you will need to ask the host support people to NOT cache your renamed login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:200 +msgid "Enable rename login page feature" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:203 +msgid "Check this if you want to enable the rename login page feature" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:207 +msgid "Login page URL" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:209 +msgid "Enter a string which will represent your secure login page slug. You are encouraged to choose something which is hard to guess and only you will remember." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:243 +msgid "Settings have not been saved - your secret word must consist only of alphanumeric characters, ie, letters and/or numbers only." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:257 +msgid "You have successfully enabled the cookie based brute force prevention feature" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:258 +msgid "From now on you will need to log into your WP Admin using the following URL:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:260 +msgid "It is important that you save this URL value somewhere in case you forget it, OR," +msgstr "" + +#: admin/wp-security-brute-force-menu.php:261 +msgid "simply remember to add a \"?%s=1\" to your current site URL address." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:265 +msgid "You have successfully saved cookie based brute force prevention feature settings." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:295 +msgid "Brute force prevention firewall settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:300 +msgid "A Brute Force Attack is when a hacker tries many combinations of usernames and passwords until they succeed in guessing the right combination." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:301 +msgid "Due to the fact that at any one time there may be many concurrent login attempts occurring on your site via malicious automated robots, this also has a negative impact on your server's memory and performance." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:302 +msgid "The features in this tab will stop the majority of brute force login attacks thus providing even better protection for your WP login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:307 +#: admin/wp-security-firewall-menu.php:654 +msgid "backup" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:308 +msgid "video tutorial" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:309 +msgid "To learn more about how to use this feature, please watch the following %s." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:310 +#: admin/wp-security-brute-force-menu.php:758 +msgid "Cookie-Based Brute Force Login Prevention" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:320 +#: admin/wp-security-user-login-menu.php:253 +msgid "Cookie based brute force login prevention" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:331 +msgid "This feature can lock you out of admin if it doesn't work correctly on your site. You " +msgstr "" + +#: admin/wp-security-brute-force-menu.php:342 +msgid "The cookie test was successful. You can now enable this feature." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:350 +msgid "The cookie test failed on this server. Consequently, this feature cannot be used on this site." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:357 +msgid "Before using this feature, you must perform a cookie test first." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:359 +msgid "This ensures that your browser cookie is working correctly and that you won't lock yourself out." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:364 +msgid "Perform cookie test" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:370 +#: classes/grade-system/wp-security-feature-item-manager.php:103 +msgid "Enable brute force attack prevention" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:373 +msgid "Check this if you want to protect your login page from Brute Force Attack." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:378 +msgid "This feature will deny access to your WordPress login page for all people except those who have a special cookie in their browser." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:380 +msgid "To use this feature do the following:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:382 +msgid "1) Enable the checkbox." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:384 +msgid "2) Enter a secret word consisting of alphanumeric characters which will be difficult to guess. This secret word will be useful whenever you need to know the special URL which you will use to access the login page (see point below)." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:386 +msgid "3) You will then be provided with a special login URL. You will need to use this URL to login to your WordPress site instead of the usual login URL. NOTE: The system will deposit a special cookie in your browser which will allow you access to the WordPress administration login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:388 +msgid "Any person trying to access your login page who does not have the special cookie in their browser will be automatically blocked." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:395 +msgid "Secret word" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:397 +msgid "Choose a secret word consisting of alphanumeric characters which you can use to access your special URL. Your are highly encouraged to choose a word which will be difficult to guess." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:401 +msgid "Re-direct URL" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:405 +msgid "Specify a URL to redirect a hacker to when they try to access your WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:412 +msgid "The URL specified here can be any site's URL and does not have to be your own. For example you can be as creative as you like and send hackers to the CIA or NSA home page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:414 +msgid "This field will default to: http://127.0.0.1 if you do not enter a value." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:416 +msgid "Useful Tip:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:418 +msgid "It's a good idea to not redirect attempted brute force login attempts to your site because it increases the load on your server." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:420 +msgid "Redirecting a hacker or malicious bot back to \"http://127.0.0.1\" is ideal because it deflects them back to their own local host and puts the load on their server instead of yours." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:427 +msgid "My site has posts or pages which are password protected" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:430 +msgid "Check this if you are using the native WordPress password protection feature for some or all of your blog posts or pages." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:435 +msgid "In the cases where you are protecting some of your posts or pages using the in-built WordPress password protection feature, a few extra lines of directives and exceptions need to be added so that people trying to access pages are not automatically blocked." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:437 +msgid "By enabling this checkbox, the plugin will add the necessary rules and exceptions so that people trying to access these pages are not automatically blocked." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:439 +msgid "Helpful Tip:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:441 +msgid "If you do not use the WordPress password protection feature for your posts or pages then it is highly recommended that you leave this checkbox disabled." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:448 +msgid "My site has a theme or plugins which use AJAX" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:451 +msgid "Check this if your site uses AJAX functionality." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:456 +msgid "In the cases where your WordPress installation has a theme or plugin that uses AJAX, a few extra lines of directives and exceptions need to be added to prevent AJAX requests from being automatically blocked by the brute force prevention feature." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:458 +msgid "By enabling this checkbox, the plugin will add the necessary rules and exceptions so that AJAX operations will work as expected." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:467 +msgid "Save feature settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:525 +msgid "This feature allows you to add a CAPTCHA form on various WordPress login pages and forms." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:526 +msgid "Adding a CAPTCHA form on a login page or form is another effective yet simple \"Brute Force\" prevention technique." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:527 +msgid "You have the option of using either %s or a plain maths CAPTCHA form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:528 +msgid "If you enable Google reCAPTCHA the reCAPTCHA widget will be displayed for all forms the CAPTCHA settings below." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:529 +msgid "If Google reCAPTCHA is disabled the simple maths CAPTCHA form will apply and users will need to enter the answer to a simple mathematical question." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:535 +msgid "Google reCAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:540 +msgid "By enabling these settings the Google reCAPTCHA v2 widget will be applied by default for all forms with CAPTCHA enabled." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:549 +msgid "reCAPTCHA will not work because you have disabled login lockout by activating the AIOS_DISABLE_LOGIN_LOCKOUT constant value in a configuration file." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:550 +msgid "To enable it, define AIOS_DISABLE_LOGIN_LOCKOUT constant value as false, or remove it." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:558 +msgid "Use Google reCAPTCHA as default" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:561 +msgid "Check this if you want to default to Google reCAPTCHA for all settings below. (If this is left unchecked, all CAPTCHA forms will revert to the plain maths CAPTCHA)" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:565 +msgid "Site key" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:571 +msgid "Secret key" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:580 +msgid "Login form CAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:589 +msgid "Enable CAPTCHA on login page" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:592 +msgid "Check this if you want to insert a CAPTCHA form on the login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:598 +msgid "Lost password form CAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:608 +msgid "Enable CAPTCHA on lost password page" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:611 +msgid "Check this if you want to insert a CAPTCHA form on the lost password page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:617 +msgid "Custom login form CAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:626 +msgid "Enable CAPTCHA on custom login form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:629 +msgid "Check this if you want to insert CAPTCHA on a custom login form generated by the following WP function: wp_login_form()" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:639 +msgid "WooCommerce forms CAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:648 +msgid "Enable CAPTCHA on WooCommerce login form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:651 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce login form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:661 +msgid "Enable CAPTCHA on WooCommerce lost password form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:664 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce lost password form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:674 +msgid "Enable CAPTCHA on WooCommerce registration form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:677 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce registration form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:749 +msgid "The All In One WP Security Whitelist feature gives you the option of only allowing certain IP addresses or ranges to have access to your WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:750 +msgid "This feature will deny login access for all IP addresses which are not in your whitelist as configured in the settings below." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:751 +msgid "The plugin achieves this by writing the appropriate directives to your .htaccess file." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:752 +msgid "By allowing/blocking IP addresses, you are using the most secure first line of defence because login access will only be granted to whitelisted IP addresses and other addresses will be blocked as soon as they try to access your login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:760 +msgid "Attention: If in addition to enabling the white list feature, you also have one of the %s or %s features enabled, you will still need to use your secret word or special slug in the URL when trying to access your WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:761 +msgid "These features are NOT functionally related. Having both of them enabled on your site means you are creating 2 layers of security." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:772 +msgid "Login IP whitelist settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:783 +msgid "Enable IP whitelisting" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:786 +#: admin/wp-security-user-login-menu.php:408 +msgid "Check this if you want to enable the whitelisting of selected IP addresses specified in the settings below" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:790 +msgid "Your current IP address" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:793 +msgid "You can copy and paste this address in the text box below if you want to include it in your login whitelist." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:797 +#: admin/wp-security-user-login-menu.php:412 +msgid "Enter whitelisted IP addresses:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:801 +#: admin/wp-security-user-login-menu.php:416 +msgid "Enter one or more IP addresses or IP ranges you wish to include in your whitelist." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:801 +msgid "Only the addresses specified here will have access to the WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:839 +msgid "This feature allows you to add a special hidden \"honeypot\" field on the WordPress login page. This will only be visible to robots and not humans." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:840 +msgid "Since robots usually fill in every input field from a login form, they will also submit a value for the special hidden honeypot field." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:841 +#: admin/wp-security-user-registration-menu.php:278 +msgid "The way honeypots work is that a hidden field is placed somewhere inside a form which only robots will submit. If that field contains a value when the form is submitted then a robot has most likely submitted the form and it is consequently dealt with." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:842 +msgid "Therefore, if the plugin detects that this field has a value when the login form is submitted, then the robot which is attempting to login to your site will be redirected to its localhost address - http://127.0.0.1." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:848 +msgid "Login form honeypot settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:859 +msgid "Enable honeypot on login page" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:862 +msgid "Check this if you want to enable the honeypot feature for the login page" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:27 +#: admin/wp-security-dashboard-menu.php:374 +#: classes/wp-security-user-login.php:74 +msgid "Locked IP addresses" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:28 +msgid "Permanent block list" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:29 +msgid "Logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:33 +msgid "Premium upgrade" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:131 +#: admin/wp-security-dashboard-menu.php:518 +#: admin/wp-security-user-login-menu.php:53 +#: classes/grade-system/wp-security-feature-item-manager.php:49 +msgid "Login lockout" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:132 +msgid "This tab displays the list of all IP addresses which are currently temporarily locked out due to the login lockout feature:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:138 +msgid "Currently locked out IP addresses and ranges" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:183 +msgid "This tab displays the list of all permanently blocked IP addresses." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:184 +#: admin/wp-security-spam-menu.php:339 +msgid "NOTE: This feature does NOT use the .htaccess file to permanently block the IP addresses so it should be compatible with all web servers running WordPress." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:189 +msgid "Permanently blocked IP addresses" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:200 +#: admin/wp-security-firewall-menu.php:1151 +#: admin/wp-security-user-login-menu.php:485 +#: admin/wp-security-user-login-menu.php:643 +#: admin/wp-security-user-registration-menu.php:164 +msgid "Search" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:238 +#: admin/wp-security-dashboard-menu.php:249 +#: admin/wp-security-dashboard-menu.php:260 +msgid "All In One WP Security & Firewall" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:250 +msgid "Debug logs have been cleared." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:261 +msgid "Unable to clear the logs; an invalid nonce was provided" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:274 +msgid "Debug log options" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:281 +msgid "Clear logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:289 +msgid "Debug logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:362 +msgid "Security strength meter" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:363 +msgid "Security points breakdown" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:364 +msgid "Spread the word" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:365 +msgid "Get to know the developers" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:366 +msgid "Critical feature status" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:367 +msgid "Last 5 logins" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:368 +msgid "Maintenance mode status" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:373 +#: admin/wp-security-dashboard-menu.php:664 +#: admin/wp-security-user-login-menu.php:57 +msgid "Logged in users" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:417 +msgid "Total Achievable Points: " +msgstr "" + +#: admin/wp-security-dashboard-menu.php:419 +msgid "Current Score of Your Site: " +msgstr "" + +#: admin/wp-security-dashboard-menu.php:472 +msgid "We are working hard to make your WordPress site more secure. Please support us, here is how:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:473 +msgid "Follow us on" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:477 +msgid "Post to Twitter" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:481 +msgid "Give us a good rating" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:488 +msgid "Wanna know more about the developers behind this plugin?" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:499 +msgid "Below is the current status of the critical features that you should activate on your site to achieve a minimum level of recommended security" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:503 +msgid "Admin username" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:533 +msgid "File permission" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:548 +msgid "Basic firewall" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:577 +msgid "No data found." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:581 +msgid "Last 5 logins summary:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:585 +msgid "User" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:586 +#: admin/wp-security-list-404.php:95 +#: admin/wp-security-list-login-fails.php:56 +#: admin/wp-security-list-permanent-blocked-ip.php:68 +msgid "Date" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:587 +msgid "IP" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:608 +msgid "Maintenance mode is currently enabled. Remember to turn it off when you are done" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:610 +msgid "Maintenance mode is currently off." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:614 +msgid "Maintenance mode" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:632 +msgid "Cookie based brute force" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:636 +#: admin/wp-security-dashboard-menu.php:654 +msgid "The %s feature is currently active." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:637 +#: admin/wp-security-dashboard-menu.php:655 +msgid "Your new WordPress login URL is now:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:666 +msgid "Number of users currently logged into your site (including you) is:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:667 +msgid "There are no other users currently logged in." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:680 +msgid "Number of users currently logged in site-wide (including you) is:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:681 +msgid "There are no other site-wide users currently logged in." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:694 +#: admin/wp-security-dashboard-menu.php:711 +msgid "Go to the %s menu to see more details" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:707 +msgid "There are no IP addresses currently locked out." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:710 +msgid "Number of temporarily locked out IP addresses: " +msgstr "" + +#: admin/wp-security-database-menu.php:52 +msgid "UpdraftPlus is installed but currently not active." +msgstr "" + +#: admin/wp-security-database-menu.php:52 +msgid "Follow this link to activate UpdraftPlus, to take a backup." +msgstr "" + +#: admin/wp-security-database-menu.php:57 +msgid "Follow this link to install UpdraftPlus, to take a database backup." +msgstr "" + +#: admin/wp-security-database-menu.php:87 +#: admin/wp-security-database-menu.php:92 +msgid "Database backup" +msgstr "" + +#: admin/wp-security-database-menu.php:91 +#: classes/grade-system/wp-security-feature-item-manager.php:65 +msgid "Database prefix" +msgstr "" + +#: admin/wp-security-database-menu.php:119 +msgid "Database security" +msgstr "" + +#: admin/wp-security-database-menu.php:147 +msgid "Nonce check failed for DB prefix change operation!" +msgstr "" + +#: admin/wp-security-database-menu.php:155 +msgid "The plugin has detected that it cannot write to the wp-config.php file. This feature can only be used if the plugin can successfully write to the wp-config.php file." +msgstr "" + +#: admin/wp-security-database-menu.php:168 +msgid "Please enter a value for the DB prefix." +msgstr "" + +#: admin/wp-security-database-menu.php:177 +msgid "ERROR: The table prefix can only contain numbers, letters, and underscores." +msgstr "" + +#: admin/wp-security-database-menu.php:186 +#: admin/wp-security-database-menu.php:245 +msgid "Change database prefix" +msgstr "" + +#: admin/wp-security-database-menu.php:189 +msgid "Your WordPress database is the most important asset of your website because it contains a lot of your site's precious information." +msgstr "" + +#: admin/wp-security-database-menu.php:190 +msgid "The database is also a target for hackers via methods such as SQL injections and malicious and automated code which targets certain tables." +msgstr "" + +#: admin/wp-security-database-menu.php:191 +msgid "One way to add a layer of protection for your DB is to change the default WordPress table prefix from \"wp_\" to something else which will be difficult for hackers to guess." +msgstr "" + +#: admin/wp-security-database-menu.php:192 +msgid "This feature allows you to easily change the prefix to a value of your choice or to a random value set by this plugin." +msgstr "" + +#: admin/wp-security-database-menu.php:198 +msgid "Database prefix options" +msgstr "" + +#: admin/wp-security-database-menu.php:210 +msgid "database backup" +msgstr "" + +#: admin/wp-security-database-menu.php:211 +msgid "It is recommended that you perform a %s before using this feature" +msgstr "" + +#: admin/wp-security-database-menu.php:221 +msgid "Current database table prefix" +msgstr "" + +#: admin/wp-security-database-menu.php:227 +msgid "Your site is currently using the default WordPress database prefix value of \"wp_\"." +msgstr "" + +#: admin/wp-security-database-menu.php:227 +msgid "To increase your site's security you should consider changing the database prefix value to another value." +msgstr "" + +#: admin/wp-security-database-menu.php:234 +msgid "Generate new database table prefix" +msgstr "" + +#: admin/wp-security-database-menu.php:238 +msgid "Check this if you want the plugin to generate a random 6 character string for the table prefix" +msgstr "" + +#: admin/wp-security-database-menu.php:239 +msgid "OR" +msgstr "" + +#: admin/wp-security-database-menu.php:241 +msgid "Choose your own database prefix by specifying a string which contains letters and/or numbers and/or underscores. Example: xyz_" +msgstr "" + +#: admin/wp-security-database-menu.php:265 +msgid "Take a database backup using UpdraftPlus" +msgstr "" + +#: admin/wp-security-database-menu.php:270 +msgid "Manual backup" +msgstr "" + +#: admin/wp-security-database-menu.php:274 +msgid "UpdraftPlus Backup/Restore" +msgstr "" + +#: admin/wp-security-database-menu.php:274 +msgid "Your backups are on the UpdraftPlus Backup/Restore admin page." +msgstr "" + +#: admin/wp-security-database-menu.php:276 +msgid "Create database backup now" +msgstr "" + +#: admin/wp-security-database-menu.php:308 +msgid "Error - Could not get tables or no tables found!" +msgstr "" + +#: admin/wp-security-database-menu.php:312 +msgid "Starting DB prefix change operations....." +msgstr "" + +#: admin/wp-security-database-menu.php:314 +msgid "Your WordPress system has a total of %s tables and your new DB prefix will be: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:320 +#: classes/wp-security-utility.php:306 +msgid "Failed to make a backup of the wp-config.php file. This operation will not go ahead." +msgstr "" + +#: admin/wp-security-database-menu.php:324 +msgid "A backup copy of your wp-config.php file was created successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:351 +msgid "%s table name update failed" +msgstr "" + +#: admin/wp-security-database-menu.php:363 +msgid "Please change the prefix manually for the above tables to: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:366 +msgid "%s tables had their prefix updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:387 +msgid "wp-config.php file was updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:390 +msgid "The \"wp-config.php\" file was not able to be modified." +msgstr "" + +#: admin/wp-security-database-menu.php:390 +msgid "Please modify this file manually using your favourite editor and search for variable \"$table_prefix\" and assign the following value to that variable: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:401 +#: admin/wp-security-database-menu.php:420 +msgid "Update of table %s failed: unable to change %s to %s" +msgstr "" + +#: admin/wp-security-database-menu.php:405 +msgid "The options table records which had references to the old DB prefix were updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:424 +msgid "The %s table records which had references to the old DB prefix were updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:452 +msgid "Error updating user_meta table where new meta_key = %s, old meta_key = %s and user_id = %s." +msgstr "" + +#: admin/wp-security-database-menu.php:457 +msgid "The usermeta table records which had references to the old DB prefix were updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:459 +msgid "The database prefix change tasks have been completed." +msgstr "" + +#: admin/wp-security-database-menu.php:503 +msgid "Checking for MySQL tables of type \"view\"....." +msgstr "" + +#: admin/wp-security-database-menu.php:520 +msgid "Update of the following MySQL view definition failed: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:527 +msgid "%s view definitions were updated successfully!" +msgstr "" + +#: admin/wp-security-filescan-menu.php:26 +#: classes/grade-system/wp-security-feature-item-manager.php:127 +msgid "File change detection" +msgstr "" + +#: admin/wp-security-filescan-menu.php:27 +msgid "Malware scan" +msgstr "" + +#: admin/wp-security-filescan-menu.php:88 +msgid "There have been no file changes since the last scan." +msgstr "" + +#: admin/wp-security-filescan-menu.php:98 +msgid "Nonce check failed for manual file change detection scan operation!" +msgstr "" + +#: admin/wp-security-filescan-menu.php:104 +msgid "There was an error during the file change detection scan. Please check the AIOS logs." +msgstr "" + +#: admin/wp-security-filescan-menu.php:110 +msgid "The plugin has detected that this is your first file change detection scan. The file details from this scan will be used to detect file changes for future scans." +msgstr "" + +#: admin/wp-security-filescan-menu.php:112 +msgid "Scan complete - There were no file changes detected!" +msgstr "" + +#: admin/wp-security-filescan-menu.php:133 +msgid "You entered a non numeric value for the \"backup time interval\" field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-filescan-menu.php:167 +msgid "The following address was removed because it is not a valid email address: " +msgstr "" + +#: admin/wp-security-filescan-menu.php:206 +msgid "NEW SCAN COMPLETED: The plugin has detected that you have made changes to the \"File Types To Ignore\" or \"Files To Ignore\" fields." +msgstr "" + +#: admin/wp-security-filescan-menu.php:206 +msgid "In order to ensure that future scan results are accurate, the old scan data has been refreshed." +msgstr "" + +#: admin/wp-security-filescan-menu.php:215 +msgid "All In One WP Security & Firewall has detected that there was a change in your host's files." +msgstr "" + +#: admin/wp-security-filescan-menu.php:217 +msgid "View scan details and clear this message" +msgstr "" + +#: admin/wp-security-filescan-menu.php:226 +msgid "If given an opportunity hackers can insert their code or files into your system which they can then use to carry out malicious acts on your site." +msgstr "" + +#: admin/wp-security-filescan-menu.php:227 +msgid "Being informed of any changes in your files can be a good way to quickly prevent a hacker from causing damage to your website." +msgstr "" + +#: admin/wp-security-filescan-menu.php:228 +msgid "In general, WordPress core and plugin files and file types such as \".php\" or \".js\" should not change often and when they do, it is important that you are made aware when a change occurs and which file was affected." +msgstr "" + +#: admin/wp-security-filescan-menu.php:229 +msgid "The \"File Change Detection Feature\" will notify you of any file change which occurs on your system, including the addition and deletion of files by performing a regular automated or manual scan of your system's files." +msgstr "" + +#: admin/wp-security-filescan-menu.php:230 +msgid "This feature also allows you to exclude certain files or folders from the scan in cases where you know that they change often as part of their normal operation. (For example log files and certain caching plugin files may change often and hence you may choose to exclude such files from the file change detection scan)" +msgstr "" + +#: admin/wp-security-filescan-menu.php:241 +msgid "It appears that your server is using an old PHP version which is missing the %s. The file scanner feature needs this class in order to work. If you would like to use this feature please upgrade your server PHP version to 5.3 or greater." +msgstr "" + +#: admin/wp-security-filescan-menu.php:249 +msgid "Manual file change detection scan" +msgstr "" + +#: admin/wp-security-filescan-menu.php:255 +msgid "To perform a manual file change detection scan click on the button below." +msgstr "" + +#: admin/wp-security-filescan-menu.php:258 +msgid "Perform scan now" +msgstr "" + +#: admin/wp-security-filescan-menu.php:262 +msgid "View last saved file change results" +msgstr "" + +#: admin/wp-security-filescan-menu.php:268 +msgid "Click the button below to view the saved file change results from the last scan." +msgstr "" + +#: admin/wp-security-filescan-menu.php:271 +msgid "View last file change" +msgstr "" + +#: admin/wp-security-filescan-menu.php:275 +msgid "File change detection settings" +msgstr "" + +#: admin/wp-security-filescan-menu.php:287 +msgid "Enable automated file change detection scan" +msgstr "" + +#: admin/wp-security-filescan-menu.php:290 +msgid "Check this if you want the system to automatically/periodically scan your files to check for file changes based on the settings below" +msgstr "" + +#: admin/wp-security-filescan-menu.php:294 +msgid "Scan time interval" +msgstr "" + +#: admin/wp-security-filescan-menu.php:297 +msgid "Hours" +msgstr "" + +#: admin/wp-security-filescan-menu.php:298 +msgid "Days" +msgstr "" + +#: admin/wp-security-filescan-menu.php:299 +msgid "Weeks" +msgstr "" + +#: admin/wp-security-filescan-menu.php:301 +msgid "Set the value for how often you would like a scan to occur" +msgstr "" + +#: admin/wp-security-filescan-menu.php:305 +msgid "File types to ignore" +msgstr "" + +#: admin/wp-security-filescan-menu.php:308 +msgid "Enter each file type or extension on a new line which you wish to exclude from the file change detection scan." +msgstr "" + +#: admin/wp-security-filescan-menu.php:312 +msgid "You can exclude file types from the scan which would not normally pose any security threat if they were changed. These can include things such as image files." +msgstr "" + +#: admin/wp-security-filescan-menu.php:313 +msgid "Example: If you want the scanner to ignore files of type jpg, png, and bmp, then you would enter the following:" +msgstr "" + +#: admin/wp-security-filescan-menu.php:314 +msgid "jpg" +msgstr "" + +#: admin/wp-security-filescan-menu.php:315 +msgid "png" +msgstr "" + +#: admin/wp-security-filescan-menu.php:316 +msgid "bmp" +msgstr "" + +#: admin/wp-security-filescan-menu.php:322 +msgid "Files/Directories to ignore" +msgstr "" + +#: admin/wp-security-filescan-menu.php:325 +msgid "Enter each file or directory on a new line which you wish to exclude from the file change detection scan." +msgstr "" + +#: admin/wp-security-filescan-menu.php:329 +msgid "You can exclude specific files/directories from the scan which would not normally pose any security threat if they were changed. These can include things such as log files." +msgstr "" + +#: admin/wp-security-filescan-menu.php:330 +msgid "Example: If you want the scanner to ignore certain files in different directories or whole directories, then you would enter the following:" +msgstr "" + +#: admin/wp-security-filescan-menu.php:331 +msgid "cache/config/master.php" +msgstr "" + +#: admin/wp-security-filescan-menu.php:332 +msgid "somedirectory" +msgstr "" + +#: admin/wp-security-filescan-menu.php:339 +msgid "Send email when change detected" +msgstr "" + +#: admin/wp-security-filescan-menu.php:343 +msgid "Check this if you want the system to email you if a file change was detected" +msgstr "" + +#: admin/wp-security-filescan-menu.php:347 +msgid "Enter one or more email addresses on a new line." +msgstr "" + +#: admin/wp-security-filescan-menu.php:364 +msgid "What is malware?" +msgstr "" + +#: admin/wp-security-filescan-menu.php:365 +msgid "The word malware stands for Malicious Software. It can consist of things like trojan horses, adware, worms, spyware and any other undesirable code which a hacker will try to inject into your website." +msgstr "" + +#: admin/wp-security-filescan-menu.php:366 +msgid "Often when malware code has been inserted into your site you will normally not notice anything out of the ordinary based on appearances, but it can have a dramatic effect on your site's search ranking." +msgstr "" + +#: admin/wp-security-filescan-menu.php:367 +msgid "This is because the bots and spiders from search engines such as Google have the capability to detect malware when they are indexing the pages on your site, and consequently they can blacklist your website which will in turn affect your search rankings." +msgstr "" + +#: admin/wp-security-filescan-menu.php:369 +msgid "CLICK HERE" +msgstr "" + +#: admin/wp-security-filescan-menu.php:371 +msgid "Scanning for malware" +msgstr "" + +#: admin/wp-security-filescan-menu.php:372 +msgid "Due to the constantly changing and complex nature of Malware, scanning for such things using a standalone plugin will not work reliably. This is something best done via an external scan of your site regularly." +msgstr "" + +#: admin/wp-security-filescan-menu.php:373 +msgid "This is why we have created an easy-to-use scanning service which is hosted off our own server which will scan your site for malware once every day and notify you if it finds anything." +msgstr "" + +#: admin/wp-security-filescan-menu.php:374 +msgid "When you sign up for this service you will get the following:" +msgstr "" + +#: admin/wp-security-filescan-menu.php:376 +msgid "Automatic daily scan of 1 website" +msgstr "" + +#: admin/wp-security-filescan-menu.php:377 +msgid "Automatic malware and blacklist monitoring" +msgstr "" + +#: admin/wp-security-filescan-menu.php:378 +msgid "Automatic email alerting" +msgstr "" + +#: admin/wp-security-filescan-menu.php:379 +msgid "Site uptime monitoring" +msgstr "" + +#: admin/wp-security-filescan-menu.php:380 +msgid "Site response time monitoring" +msgstr "" + +#: admin/wp-security-filescan-menu.php:381 +msgid "We provide advice for malware cleanup" +msgstr "" + +#: admin/wp-security-filescan-menu.php:382 +msgid "Blacklist removal" +msgstr "" + +#: admin/wp-security-filescan-menu.php:383 +msgid "No contract (cancel anytime)" +msgstr "" + +#: admin/wp-security-filescan-menu.php:385 +msgid "To learn more please %s." +msgstr "" + +#: admin/wp-security-filescan-menu.php:406 +msgid "Latest file change scan results" +msgstr "" + +#: admin/wp-security-filescan-menu.php:416 +msgid "The following files were added to your host." +msgstr "" + +#: admin/wp-security-filescan-menu.php:419 +#: admin/wp-security-filescan-menu.php:440 +#: admin/wp-security-filescan-menu.php:464 +msgid "File" +msgstr "" + +#: admin/wp-security-filescan-menu.php:420 +#: admin/wp-security-filescan-menu.php:441 +#: admin/wp-security-filescan-menu.php:465 +msgid "File size" +msgstr "" + +#: admin/wp-security-filescan-menu.php:421 +#: admin/wp-security-filescan-menu.php:442 +#: admin/wp-security-filescan-menu.php:466 +msgid "File modified" +msgstr "" + +#: admin/wp-security-filescan-menu.php:437 +msgid "The following files were removed from your host." +msgstr "" + +#: admin/wp-security-filescan-menu.php:461 +msgid "The following files were changed on your host." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:26 +#: classes/grade-system/wp-security-feature-item-manager.php:69 +msgid "File permissions" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:27 +msgid "PHP file editing" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:28 +msgid "WP file access" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:29 +msgid "Host system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:55 +msgid "Filesystem security" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:80 +msgid "Nonce check failed for manual DB backup operation!" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:90 +msgid "The permissions for %s were successfully changed to %s" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:94 +msgid "Unable to change permissions for %s!" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:100 +msgid "File permissions scan" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:103 +msgid "Your WordPress file and folder permission settings govern the accessibility and read/write privileges of the files and folders which make up your WP installation." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:104 +msgid "Your WP installation already comes with reasonably secure file permission settings for the filesystem." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:105 +msgid "However, sometimes people or other plugins modify the various permission settings of certain core WP folders or files such that they end up making their site less secure because they chose the wrong permission values." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:106 +msgid "This feature will scan the critical WP core folders and files and will highlight any permission settings which are insecure." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:114 +msgid "This plugin has detected that your site is running on a Windows server." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:115 +msgid "This feature is not applicable for Windows server installations." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:121 +msgid "WP directory and file permissions scan results" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:133 +#: admin/wp-security-filesystem-menu.php:152 +msgid "Name" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:134 +#: admin/wp-security-filesystem-menu.php:153 +msgid "File/Folder" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:135 +#: admin/wp-security-filesystem-menu.php:154 +msgid "Current permissions" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:136 +#: admin/wp-security-filesystem-menu.php:155 +msgid "Recommended permissions" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:137 +#: admin/wp-security-filesystem-menu.php:156 +msgid "Recommended action" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:195 +msgid "Your PHP file editing settings were saved successfully." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:199 +msgid "Operation failed! Unable to modify or make a backup of wp-config.php file!" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:212 +#: classes/grade-system/wp-security-feature-item-manager.php:71 +msgid "File editing" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:215 +msgid "The WordPress Dashboard by default allows administrators to edit PHP files, such as plugin and theme files." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:216 +msgid "This is often the first tool an attacker will use if able to login, since it allows code execution." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:217 +msgid "This feature will disable the ability for people to edit PHP files via the dashboard." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:223 +msgid "Disable PHP file editing" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:235 +msgid "Disable ability to edit PHP files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:238 +msgid "Check this if you want to remove the ability for people to edit PHP files via the WP dashboard" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:282 +msgid "You have successfully saved the Prevent Access to Default WP Files configuration." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:286 +#: admin/wp-security-firewall-menu.php:126 +#: admin/wp-security-firewall-menu.php:346 +#: admin/wp-security-firewall-menu.php:613 +#: admin/wp-security-firewall-menu.php:912 +#: admin/wp-security-settings-menu.php:772 +#: admin/wp-security-spam-menu.php:124 +msgid "Could not write to the .htaccess file. Please check the file permissions." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:291 +msgid "WordPress files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:294 +msgid "This feature allows you to prevent access to files such as %s, %s and %s which are delivered with all WP installations." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:295 +msgid "By preventing access to these files you are hiding some key pieces of information (such as WordPress version info) from potential hackers." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:300 +msgid "Prevent access to default WP files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:311 +msgid "Prevent access to WP default install files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:314 +msgid "Check this if you want to prevent access to readme.html, license.txt and wp-config-sample.php." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:318 +msgid "Save setting" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:342 +msgid "System logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:345 +msgid "Sometimes your hosting platform will produce error or warning logs in a file called \"error_log\"." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:346 +msgid "Depending on the nature and cause of the error or warning, your hosting server can create multiple instances of this file in numerous directory locations of your WordPress installation." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:347 +msgid "By occasionally viewing the contents of these logs files you can keep informed of any underlying problems on your system which you might need to address." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:353 +msgid "View system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:355 +msgid "Please click the button below to view the latest system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:358 +msgid "Enter System Log File Name" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:360 +msgid "Enter your system log file name. (Defaults to error_log)" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:363 +msgid "View latest system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:365 +msgid "Loading..." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:382 +msgid "No system logs were found." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:435 +msgid "Set recommended permissions" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:441 +msgid "No action required" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:481 +msgid "Showing latest entries of error_log file: %s" +msgstr "" + +#: admin/wp-security-firewall-menu.php:28 +msgid "Basic firewall rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:29 +msgid "Additional firewall rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:30 +msgid "6G Blacklist firewall rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:31 +msgid "Internet bots" +msgstr "" + +#: admin/wp-security-firewall-menu.php:32 +msgid "Prevent hotlinks" +msgstr "" + +#: admin/wp-security-firewall-menu.php:33 +msgid "404 detection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:34 +msgid "Custom rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:122 +#: admin/wp-security-firewall-menu.php:908 +#: admin/wp-security-spam-menu.php:120 +#: admin/wp-security-spam-menu.php:494 +#: admin/wp-security-spam-menu.php:556 +#: admin/wp-security-user-registration-menu.php:95 +msgid "Settings were successfully saved" +msgstr "" + +#: admin/wp-security-firewall-menu.php:131 +#: admin/wp-security-firewall-menu.php:651 +msgid "Firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:138 +msgid "This should not have any impact on your site's general functionality but if you wish you can take a %s of your .htaccess file before proceeding." +msgstr "" + +#: admin/wp-security-firewall-menu.php:139 +msgid "The features in this tab allow you to activate some basic firewall security protection rules for your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:140 +msgid "The firewall functionality is achieved via the insertion of special code into your currently active .htaccess file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:151 +msgid "You have enabled the \"Completely Block Access To XMLRPC\" checkbox which means all XMLRPC functionality will be blocked." +msgstr "" + +#: admin/wp-security-firewall-menu.php:152 +msgid "By leaving this feature enabled you will prevent Jetpack or Wordpress iOS or other apps which need XMLRPC from working correctly on your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:153 +msgid "If you still need XMLRPC then uncheck the \"Completely Block Access To XMLRPC\" checkbox and enable only the \"Disable Pingback Functionality From XMLRPC\" checkbox." +msgstr "" + +#: admin/wp-security-firewall-menu.php:163 +msgid "Basic firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:171 +msgid "Enable basic firewall protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:174 +msgid "Check this if you want to apply basic firewall protection to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:178 +msgid "This setting will implement the following basic firewall protection mechanisms on your site:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:179 +msgid "1) Protect your htaccess file by denying access to it." +msgstr "" + +#: admin/wp-security-firewall-menu.php:180 +msgid "2) Disable the server signature." +msgstr "" + +#: admin/wp-security-firewall-menu.php:181 +msgid "3) Limit file upload size (%sMB)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:182 +msgid "4) Protect your wp-config.php file by denying access to it." +msgstr "" + +#: admin/wp-security-firewall-menu.php:183 +msgid "The above firewall features will be applied via your .htaccess file and should not affect your site's overall functionality." +msgstr "" + +#: admin/wp-security-firewall-menu.php:184 +msgid "You are still advised to take a backup of your active .htaccess file just in case." +msgstr "" + +#: admin/wp-security-firewall-menu.php:190 +msgid "Max file upload size (MB)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:192 +msgid "The value for the maximum file upload size used in the .htaccess file. (Defaults to %sMB if left blank)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:200 +msgid "WordPress XMLRPC and pingback vulnerability protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:208 +msgid "Completely block access to XMLRPC" +msgstr "" + +#: admin/wp-security-firewall-menu.php:211 +msgid "Check this if you are not using the WP XML-RPC functionality and you want to completely block external access to XMLRPC." +msgstr "" + +#: admin/wp-security-firewall-menu.php:215 +msgid "This setting will add a directive in your .htaccess to disable access to the WordPress xmlrpc.php file which is responsible for the XML-RPC functionality in WordPress." +msgstr "" + +#: admin/wp-security-firewall-menu.php:216 +msgid "Hackers can exploit various vulnerabilities in the WordPress XML-RPC API in a number of ways such as:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:217 +msgid "1) Denial of Service (DoS) attacks" +msgstr "" + +#: admin/wp-security-firewall-menu.php:218 +msgid "2) Hacking internal routers." +msgstr "" + +#: admin/wp-security-firewall-menu.php:219 +msgid "3) Scanning ports in internal networks to get info from various hosts." +msgstr "" + +#: admin/wp-security-firewall-menu.php:220 +msgid "Apart from the security protection benefit, this feature may also help reduce load on your server, particularly if your site currently has a lot of unwanted traffic hitting the XML-RPC API on your installation." +msgstr "" + +#: admin/wp-security-firewall-menu.php:221 +msgid "NOTE: You should only enable this feature if you are not currently using the XML-RPC functionality on your WordPress installation." +msgstr "" + +#: admin/wp-security-firewall-menu.php:222 +msgid "Leave this feature disabled and use the feature below if you want pingback protection but you still need XMLRPC." +msgstr "" + +#: admin/wp-security-firewall-menu.php:228 +msgid "Disable pingback functionality from XMLRPC" +msgstr "" + +#: admin/wp-security-firewall-menu.php:231 +msgid "If you use Jetpack or WP iOS or other apps which need WP XML-RPC functionality then check this. This will enable protection against WordPress pingback vulnerabilities." +msgstr "" + +#: admin/wp-security-firewall-menu.php:235 +msgid "NOTE: If you use Jetpack or the Wordpress iOS or other apps then you should enable this feature but leave the \"Completely Block Access To XMLRPC\" checkbox unchecked." +msgstr "" + +#: admin/wp-security-firewall-menu.php:236 +msgid "The feature will still allow XMLRPC functionality on your site but will disable the pingback methods." +msgstr "" + +#: admin/wp-security-firewall-menu.php:237 +msgid "This feature will also remove the \"X-Pingback\" header if it is present." +msgstr "" + +#: admin/wp-security-firewall-menu.php:246 +msgid "Block access to debug log file" +msgstr "" + +#: admin/wp-security-firewall-menu.php:254 +msgid "Block access to debug.log file" +msgstr "" + +#: admin/wp-security-firewall-menu.php:257 +msgid "Check this if you want to block access to the debug.log file that WordPress creates when debug logging is enabled." +msgstr "" + +#: admin/wp-security-firewall-menu.php:261 +msgid "WordPress has an option to turn on the debug logging to a file located in wp-content/debug.log. This file may contain sensitive information." +msgstr "" + +#: admin/wp-security-firewall-menu.php:262 +msgid "Using this option will block external access to this file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:262 +msgid "You can still access this file by logging into your site via FTP." +msgstr "" + +#: admin/wp-security-firewall-menu.php:270 +msgid "Save basic firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:342 +msgid "You have successfully saved the Additional Firewall Protection configuration" +msgstr "" + +#: admin/wp-security-firewall-menu.php:356 +msgid "Additional firewall protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:360 +msgid "Due to the nature of the code being inserted to the .htaccess file, this feature may break some functionality for certain plugins and you are therefore advised to take a %s of .htaccess before applying this configuration." +msgstr "" + +#: admin/wp-security-firewall-menu.php:362 +msgid "This feature allows you to activate more advanced firewall settings to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:363 +msgid "The advanced firewall rules are applied via the insertion of special code to your currently active .htaccess file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:372 +msgid "Listing of directory contents" +msgstr "" + +#: admin/wp-security-firewall-menu.php:381 +#: classes/grade-system/wp-security-feature-item-manager.php:85 +msgid "Disable index views" +msgstr "" + +#: admin/wp-security-firewall-menu.php:384 +msgid "Check this if you want to disable directory and file listing." +msgstr "" + +#: admin/wp-security-firewall-menu.php:389 +msgid "By default, an Apache server will allow the listing of the contents of a directory if it doesn't contain an index.php file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:391 +msgid "This feature will prevent the listing of contents for all directories." +msgstr "" + +#: admin/wp-security-firewall-menu.php:393 +msgid "NOTE: In order for this feature to work \"AllowOverride\" of the Indexes directive must be enabled in your httpd.conf file. Ask your hosting provider to check this if you don't have access to httpd.conf" +msgstr "" + +#: admin/wp-security-firewall-menu.php:402 +msgid "Trace and track" +msgstr "" + +#: admin/wp-security-firewall-menu.php:411 +#: classes/grade-system/wp-security-feature-item-manager.php:86 +msgid "Disable trace and track" +msgstr "" + +#: admin/wp-security-firewall-menu.php:414 +msgid "Check this if you want to disable trace and track." +msgstr "" + +#: admin/wp-security-firewall-menu.php:419 +msgid "HTTP Trace attack (XST) can be used to return header requests and grab cookies and other information." +msgstr "" + +#: admin/wp-security-firewall-menu.php:421 +msgid "This hacking technique is usually used together with cross site scripting attacks (XSS)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:423 +msgid "Disabling trace and track on your site will help prevent HTTP Trace attacks." +msgstr "" + +#: admin/wp-security-firewall-menu.php:432 +msgid "Proxy comment posting" +msgstr "" + +#: admin/wp-security-firewall-menu.php:442 +msgid "Forbid proxy comment posting" +msgstr "" + +#: admin/wp-security-firewall-menu.php:445 +msgid "Check this if you want to forbid proxy comment posting." +msgstr "" + +#: admin/wp-security-firewall-menu.php:450 +msgid "This setting will deny any requests that use a proxy server when posting comments." +msgstr "" + +#: admin/wp-security-firewall-menu.php:451 +msgid "By forbidding proxy comments you are in effect eliminating some spam and other proxy requests." +msgstr "" + +#: admin/wp-security-firewall-menu.php:460 +msgid "Bad query strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:470 +msgid "Deny bad query strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:473 +msgid "This will help protect you against malicious queries via XSS." +msgstr "" + +#: admin/wp-security-firewall-menu.php:478 +msgid "This feature will write rules in your .htaccess file to prevent malicious string attacks on your site using XSS." +msgstr "" + +#: admin/wp-security-firewall-menu.php:479 +msgid "NOTE: Some of these strings might be used for plugins or themes and hence this might break some functionality." +msgstr "" + +#: admin/wp-security-firewall-menu.php:480 +#: admin/wp-security-firewall-menu.php:510 +msgid "You are therefore strongly advised to take a backup of your active .htaccess file before applying this feature." +msgstr "" + +#: admin/wp-security-firewall-menu.php:489 +#: classes/grade-system/wp-security-feature-item-manager.php:89 +msgid "Advanced character string filter" +msgstr "" + +#: admin/wp-security-firewall-menu.php:499 +msgid "Enable advanced character string filter" +msgstr "" + +#: admin/wp-security-firewall-menu.php:502 +msgid "This will block bad character matches from XSS." +msgstr "" + +#: admin/wp-security-firewall-menu.php:507 +msgid "This is an advanced character string filter to prevent malicious string attacks on your site coming from Cross Site Scripting (XSS)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:508 +msgid "This setting matches for common malicious string patterns and exploits and will produce a 403 error for the hacker attempting the query." +msgstr "" + +#: admin/wp-security-firewall-menu.php:509 +msgid "NOTE: Some strings for this setting might break some functionality." +msgstr "" + +#: admin/wp-security-firewall-menu.php:518 +msgid "Save additional firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:609 +msgid "You have successfully saved the 5G/6G Firewall Protection configuration" +msgstr "" + +#: admin/wp-security-firewall-menu.php:633 +msgid "All in One WP Security and Firewall" +msgstr "" + +#: admin/wp-security-firewall-menu.php:634 +msgid "We were unable to access the firewall's configuration file:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:636 +msgid "As a result, the firewall will be unavailable." +msgstr "" + +#: admin/wp-security-firewall-menu.php:637 +msgid "Please check your PHP error log for further information." +msgstr "" + +#: admin/wp-security-firewall-menu.php:638 +msgid "If you're unable to locate your PHP log file, please contact your web hosting company to ask them where it can be found on their setup." +msgstr "" + +#: admin/wp-security-firewall-menu.php:655 +msgid "This feature allows you to activate the %s (or legacy %s) firewall security protection rules designed and produced by %s." +msgstr "" + +#: admin/wp-security-firewall-menu.php:656 +msgid "The 6G Blacklist is updated and improved version of 5G Blacklist. If you have 5G Blacklist active, you might consider activating 6G Blacklist instead." +msgstr "" + +#: admin/wp-security-firewall-menu.php:657 +msgid "The 6G Blacklist is a simple, flexible blacklist that helps reduce the number of malicious URL requests that hit your website." +msgstr "" + +#: admin/wp-security-firewall-menu.php:658 +msgid "The added advantage of applying the 6G firewall to your site is that it has been tested and confirmed by the people at PerishablePress.com to be an optimal and least disruptive set of .htaccess security rules for general WP sites running on an Apache server or similar." +msgstr "" + +#: admin/wp-security-firewall-menu.php:659 +msgid "Therefore the 6G firewall rules should not have any impact on your site's general functionality but if you wish you can take a %s of your .htaccess file before proceeding." +msgstr "" + +#: admin/wp-security-firewall-menu.php:665 +msgid "6G blacklist/firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:677 +msgid "Enable 6G firewall protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:680 +msgid "Check this if you want to apply the 6G Blacklist firewall protection from perishablepress.com to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:684 +msgid "This setting will implement the 6G security firewall protection mechanisms on your site which include the following things:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:685 +#: admin/wp-security-firewall-menu.php:703 +msgid "1) Block forbidden characters commonly used in exploitative attacks." +msgstr "" + +#: admin/wp-security-firewall-menu.php:686 +#: admin/wp-security-firewall-menu.php:704 +msgid "2) Block malicious encoded URL characters such as the \".css(\" string." +msgstr "" + +#: admin/wp-security-firewall-menu.php:687 +#: admin/wp-security-firewall-menu.php:705 +msgid "3) Guard against the common patterns and specific exploits in the root portion of targeted URLs." +msgstr "" + +#: admin/wp-security-firewall-menu.php:688 +#: admin/wp-security-firewall-menu.php:706 +msgid "4) Stop attackers from manipulating query strings by disallowing illicit characters." +msgstr "" + +#: admin/wp-security-firewall-menu.php:689 +#: admin/wp-security-firewall-menu.php:707 +msgid "....and much more." +msgstr "" + +#: admin/wp-security-firewall-menu.php:695 +msgid "Enable legacy 5G firewall protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:698 +msgid "Check this if you want to apply the 5G Blacklist firewall protection from perishablepress.com to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:702 +msgid "This setting will implement the 5G security firewall protection mechanisms on your site which include the following things:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:713 +msgid "Save 5G/6G firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:721 +msgid "6G block request methods" +msgstr "" + +#: admin/wp-security-firewall-menu.php:725 +msgid "HTTP Request methods are used by browsers and clients to communicate with servers to get responses." +msgstr "" + +#: admin/wp-security-firewall-menu.php:726 +msgid "GET and POST are the most commonly used methods to request and submit data for specified resources of the server." +msgstr "" + +#: admin/wp-security-firewall-menu.php:732 +msgid "Block %s method" +msgstr "" + +#: admin/wp-security-firewall-menu.php:735 +msgid "Check this to block the %s request method" +msgstr "" + +#: admin/wp-security-firewall-menu.php:740 +msgid "Some WooCommerce extensions use the PUT request method in addition to GET and POST." +msgstr "" + +#: admin/wp-security-firewall-menu.php:740 +msgid "This means WooCommerce users shouldn't block the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:741 +msgid "A few REST requests use the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:741 +msgid "If your site is communicated by the WP REST API, you should not block the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:749 +msgid "Save request methods settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:757 +msgid "6G other settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:761 +msgid "Block query strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:764 +msgid "Check this to block all query strings recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:768 +msgid "Block request strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:771 +msgid "Check this to block all request strings recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:775 +msgid "Block referrers" +msgstr "" + +#: admin/wp-security-firewall-menu.php:778 +msgid "Check this to block all referrers recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:782 +msgid "Block user-agents" +msgstr "" + +#: admin/wp-security-firewall-menu.php:785 +msgid "Check this to block all user-agents recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:789 +msgid "Save other settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:823 +msgid "The Internet bot settings were successfully saved" +msgstr "" + +#: admin/wp-security-firewall-menu.php:827 +msgid "Internet bot settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:833 +msgid "What is an Internet Bot" +msgstr "" + +#: admin/wp-security-firewall-menu.php:834 +msgid "%s?" +msgstr "" + +#: admin/wp-security-firewall-menu.php:836 +msgid "A bot is a piece of software which runs on the Internet and performs automatic tasks. For example when Google indexes your pages it uses automatic bots to achieve this task." +msgstr "" + +#: admin/wp-security-firewall-menu.php:837 +msgid "A lot of bots are legitimate and non-malicious but not all bots are good and often you will find some which try to impersonate legitimate bots such as \"Googlebot\" but in reality they have nohing to do with Google at all." +msgstr "" + +#: admin/wp-security-firewall-menu.php:838 +msgid "Although most of the bots out there are relatively harmless sometimes website owners want to have more control over which bots they allow into their site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:839 +msgid "This feature allows you to block bots which are impersonating as a Googlebot but actually aren't. (In other words they are fake Google bots)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:840 +msgid "Googlebots have a unique identity which cannot easily be forged and this feature will identify any fake Google bots and block them from reading your site's pages." +msgstr "" + +#: admin/wp-security-firewall-menu.php:846 +msgid "Attention: Sometimes non-malicious Internet organizations might have bots which impersonate as a \"Googlebot\"." +msgstr "" + +#: admin/wp-security-firewall-menu.php:847 +msgid "Just be aware that if you activate this feature the plugin will block all bots which use the \"Googlebot\" string in their User Agent information but are NOT officially from Google (irrespective whether they are malicious or not)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:848 +msgid "All other bots from other organizations such as \"Yahoo\", \"Bing\" etc will not be affected by this feature." +msgstr "" + +#: admin/wp-security-firewall-menu.php:854 +#: admin/wp-security-firewall-menu.php:864 +#: classes/grade-system/wp-security-feature-item-manager.php:93 +msgid "Block fake Googlebots" +msgstr "" + +#: admin/wp-security-firewall-menu.php:867 +msgid "Check this if you want to block all fake Googlebots." +msgstr "" + +#: admin/wp-security-firewall-menu.php:871 +msgid "This feature will check if the User Agent information of a bot contains the string \"Googlebot\"." +msgstr "" + +#: admin/wp-security-firewall-menu.php:872 +msgid "It will then perform a few tests to verify if the bot is legitimately from Google and if so it will allow the bot to proceed." +msgstr "" + +#: admin/wp-security-firewall-menu.php:873 +msgid "If the bot fails the checks then the plugin will mark it as being a fake Googlebot and it will block it" +msgstr "" + +#: admin/wp-security-firewall-menu.php:880 +msgid "Save internet bot settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:916 +#: admin/wp-security-firewall-menu.php:938 +#: classes/grade-system/wp-security-feature-item-manager.php:95 +msgid "Prevent image hotlinking" +msgstr "" + +#: admin/wp-security-firewall-menu.php:919 +msgid "A Hotlink is where someone displays an image on their site which is actually located on your site by using a direct link to the source of the image on your server." +msgstr "" + +#: admin/wp-security-firewall-menu.php:920 +msgid "Due to the fact that the image being displayed on the other person's site is coming from your server, this can cause leaking of bandwidth and resources for you because your server has to present this image for the people viewing it on someone elses's site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:921 +msgid "This feature will prevent people from directly hotlinking images from your site's pages by writing some directives in your .htaccess file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:926 +msgid "Prevent hotlinking" +msgstr "" + +#: admin/wp-security-firewall-menu.php:941 +msgid "Check this if you want to prevent hotlinking to images on your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:961 +msgid "Nonce check failed for delete all 404 event logs operation!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:972 +msgid "404 Detection Feature - Delete all 404 event logs operation failed!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:976 +msgid "All 404 event logs were deleted from the DB successfully!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1000 +msgid "You entered a non numeric value for the lockout time length field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1006 +msgid "You entered an incorrect format for the \"Redirect URL\" field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1039 +msgid "404 detection configuration" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1042 +msgid "A 404 or Not Found error occurs when somebody tries to access a non-existent page on your website." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1043 +msgid "Typically, most 404 errors happen quite innocently when people have mis-typed a URL or used an old link to page which doesn't exist anymore." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1044 +msgid "However, in some cases you may find many repeated 404 errors which occur in a relatively short space of time and from the same IP address which are all attempting to access a variety of non-existent page URLs." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1045 +msgid "Such behaviour can mean that a hacker might be trying to find a particular page or URL for sinister reasons." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1046 +msgid "This feature allows you to monitor all 404 events which occur on your site, and it also gives you the option of blocking IP addresses for a configured length of time." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1047 +msgid "If you want to temporarily block or blacklist an IP address, simply click the \"Temp Block\" or \"Blacklist IP\" link for the applicable IP entry in the \"404 Event Logs\" table below." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1071 +msgid "404 detection options" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1083 +msgid "Enable 404 IP detection and lockout" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1086 +msgid "Check this if you want to enable the lockout of selected IP addresses." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1091 +msgid "When you enable this checkbox, all 404 events on your site will be logged in the table below. You can monitor these events and select some IP addresses listed in the table below and block them for a specified amount of time. All IP addresses you select to be blocked from the \"404 Event Logs\" table section will be unable to access your site during the time specified." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1099 +msgid "Enable 404 event logging" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1102 +msgid "Check this if you want to enable the logging of 404 events" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1107 +msgid "Time length of 404 lockout (minutes)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1109 +msgid "Set the length of time for which a blocked IP address will be prevented from visiting your site" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1114 +msgid "You can lock any IP address which is recorded in the \"404 Event Logs\" table section below." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1116 +msgid "To temporarily lock an IP address, hover over the ID column and click the \"Temp Block\" link for the applicable IP entry." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1123 +msgid "404 lockout redirect URL" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1125 +msgid "A blocked visitor will be automatically redirected to this URL." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1135 +msgid "This list displays the 404 event logs when somebody tries to access a non-existent page on your website." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1136 +msgid "404 event logs that are older than %1$d days are purged automatically." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1141 +msgid "404 event logs" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1163 +#: admin/wp-security-firewall-menu.php:1172 +#: admin/wp-security-user-login-menu.php:495 +#: admin/wp-security-user-login-menu.php:504 +#: admin/wp-security-user-login-menu.php:653 +#: admin/wp-security-user-login-menu.php:662 +msgid "Export to CSV" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1169 +#: admin/wp-security-user-login-menu.php:501 +#: admin/wp-security-user-login-menu.php:659 +msgid "Click this button if you wish to download this log in CSV format." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1176 +#: admin/wp-security-firewall-menu.php:1185 +msgid "Delete all 404 event logs" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1182 +msgid "Click this button if you wish to purge all 404 event logs from the DB." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1241 +msgid "Custom .htaccess rules settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1248 +msgid "This feature can be used to apply your own custom .htaccess rules and directives." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1249 +msgid "It is useful for when you want to tweak our existing firewall rules or when you want to add your own." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1250 +msgid "NOTE: This feature can only be used if your site is hosted in an apache or similar web server." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1256 +msgid "Warning: Only use this feature if you know what you are doing." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1257 +msgid "Incorrect .htaccess rules or directives can break or prevent access to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1258 +msgid "It is your responsibility to ensure that you are entering the correct code!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1259 +msgid "If you break your site you will need to access your server via FTP or something similar and then edit your .htaccess file and delete the changes you made." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1265 +msgid "Custom .htaccess rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1269 +msgid "Enable custom .htaccess rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1272 +msgid "Check this if you want to enable custom rules entered in the text box below" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1276 +msgid "Place custom rules at the top" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1279 +msgid "Check this if you want to place your custom rules at the beginning of all the rules applied by this plugin" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1283 +msgid "Enter custom .htaccess rules:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1287 +msgid "Enter your custom .htaccess rules/directives." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1292 +msgid "Save custom rules" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:338 +#: admin/wp-security-firewall-setup-notice.php:407 +#: admin/wp-security-firewall-setup-notice.php:479 +#: admin/wp-security-firewall-setup-notice.php:595 +#: wp-security.php:43 +msgid "All In One WP Security and Firewall" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:340 +msgid "We were unable to create the file necessary to give you the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:341 +msgid "Your firewall will have reduced protection which means some of your firewall's functionality will be unavailable." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:342 +msgid "If you would like to manually set up the necessary file, please follow these steps:" +msgstr "" + +#. translators: %s Bootstrap file name. +#. translators: %s Firewall file name. +#: admin/wp-security-firewall-setup-notice.php:346 +#: admin/wp-security-firewall-setup-notice.php:453 +msgid "1. Create a file with the name %s in the same directory as your WordPress install is in, i.e.:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:350 +msgid "2. Paste in the following code:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:352 +#: admin/wp-security-firewall-setup-notice.php:462 +msgid "3. Save the file and press the 'Try again' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:372 +msgid "1. Open the following file:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:378 +msgid "2. Look for the auto_prepend_file directive." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:382 +msgid "2. Look for the following:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:388 +msgid "3. Change it to the following:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:392 +msgid "4. Save the file and press the 'Try again' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:392 +#: admin/wp-security-firewall-setup-notice.php:441 +msgid "You may have to wait up to 5 minutes before the settings take effect." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:410 +msgid "Your firewall has been installed with the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:411 +msgid "You may have to wait 5 minutes for the changes to take effect." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:434 +msgid "1. Open your php.ini file." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:437 +msgid "2. Set the auto_prepend_file directive like below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:441 +msgid "3. Restart the webserver and refresh the page" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:458 +msgid "2. Paste in the following directives:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:482 +msgid "We were unable to set up your firewall with the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:483 +msgid "Your firewall will have reduced functionality." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:487 +msgid "To give your site the highest level of protection, please follow these steps:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:500 +msgid "Note: if you're unable to perform any of the aforementioned steps, please ask your web hosting provider for further assistance." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:517 +msgid "Try again" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:539 +msgid "We have detected that your AIOS firewall is not fully installed, and therefore does not have the highest level of protection. " +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:540 +msgid "Your firewall will have reduced functionality until it has been upgraded. " +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:542 +msgid "Upgrade your protection now" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:598 +msgid "Our PHP-based firewall has been created to give you even greater protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:602 +msgid "If you already have our .htaccess-based firewall enabled, you will still need to set up the PHP-based firewall to benefit from its protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:605 +msgid "To set up the PHP-based firewall, press the 'Set up now' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:608 +msgid "Set up now" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:614 +#: templates/notices/custom-notice.php:10 +#: templates/notices/custom-notice.php:12 +#: templates/notices/horizontal-notice.php:50 +#: templates/notices/horizontal-notice.php:52 +#: templates/notices/htaccess-to-php-feature-notice.php:10 +#: templates/notices/htaccess-to-php-feature-notice.php:12 +msgid "Dismiss" +msgstr "" + +#: admin/wp-security-list-404.php:91 +msgid "Event type" +msgstr "" + +#: admin/wp-security-list-404.php:92 +#: admin/wp-security-list-logged-in-users.php:46 +#: admin/wp-security-list-registered-users.php:74 +msgid "IP address" +msgstr "" + +#: admin/wp-security-list-404.php:93 +msgid "Attempted URL" +msgstr "" + +#: admin/wp-security-list-404.php:94 +msgid "Referer" +msgstr "" + +#: admin/wp-security-list-404.php:96 +msgid "Lock status" +msgstr "" + +#: admin/wp-security-list-404.php:118 +msgid "Temp block IP" +msgstr "" + +#: admin/wp-security-list-404.php:119 +msgid "Blacklist IP" +msgstr "" + +#: admin/wp-security-list-404.php:120 +#: admin/wp-security-list-acct-activity.php:82 +#: admin/wp-security-list-locked-ip.php:37 +#: admin/wp-security-list-locked-ip.php:84 +#: admin/wp-security-list-login-fails.php:73 +#: admin/wp-security-list-registered-users.php:93 +msgid "Delete" +msgstr "" + +#: admin/wp-security-list-404.php:128 +#: admin/wp-security-list-404.php:136 +#: admin/wp-security-list-404.php:143 +#: admin/wp-security-list-acct-activity.php:92 +#: admin/wp-security-list-comment-spammer-ip.php:95 +#: admin/wp-security-list-locked-ip.php:97 +#: admin/wp-security-list-locked-ip.php:105 +#: admin/wp-security-list-login-fails.php:85 +#: admin/wp-security-list-permanent-blocked-ip.php:96 +#: admin/wp-security-list-registered-users.php:107 +#: admin/wp-security-list-registered-users.php:115 +#: admin/wp-security-list-registered-users.php:123 +msgid "Please select some records using the checkboxes" +msgstr "" + +#: admin/wp-security-list-404.php:278 +msgid "Nonce check failed for delete selected 404 event logs operation!" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:35 +msgid "Are you sure you want to delete this item?" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:46 +msgid "Login session still active" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:60 +#: admin/wp-security-list-locked-ip.php:60 +#: admin/wp-security-list-logged-in-users.php:44 +#: admin/wp-security-list-login-fails.php:54 +#: admin/wp-security-list-registered-users.php:69 +msgid "User ID" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:61 +#: admin/wp-security-list-locked-ip.php:61 +#: admin/wp-security-list-login-fails.php:55 +msgid "Username" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:62 +msgid "Login date" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:63 +msgid "Logout date" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:136 +msgid "Nonce check failed for delete selected account activity logs operation!" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:59 +msgid "Spammer IP" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:60 +msgid "Number of spam comments from this IP" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:61 +msgid "Status" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:81 +msgid "Block" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:130 +#: admin/wp-security-list-comment-spammer-ip.php:179 +msgid "Nonce check failed for delete selected blocked IP operation!" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:137 +msgid "The selected IP addresses are now permanently blocked!" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:193 +msgid "The selected IP addresses were saved in the blacklist configuration settings." +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:201 +msgid "The .htaccess file was successfully modified to include the selected IP addresses." +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:212 +msgid "NOTE: The .htaccess file was not modified because you have disabled the \"Enable IP or User Agent Blacklisting\" check box." +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:213 +msgid "To block these IP addresses you will need to enable the above flag in the %s menu" +msgstr "" + +#: admin/wp-security-list-debug.php:47 +msgid "Level" +msgstr "" + +#: admin/wp-security-list-debug.php:48 +msgid "Message" +msgstr "" + +#: admin/wp-security-list-debug.php:49 +msgid "Type" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:36 +#: admin/wp-security-list-locked-ip.php:83 +msgid "Unlock" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:59 +msgid "Locked IP/range" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:62 +#: admin/wp-security-list-permanent-blocked-ip.php:67 +msgid "Reason" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:63 +msgid "Date locked" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:64 +msgid "Release date" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:134 +msgid "The selected IP entries were unlocked successfully." +msgstr "" + +#: admin/wp-security-list-locked-ip.php:140 +msgid "Nonce check failed for unlock IP operation!" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:147 +msgid "The selected IP entry was unlocked successfully." +msgstr "" + +#: admin/wp-security-list-logged-in-users.php:45 +#: admin/wp-security-list-registered-users.php:70 +msgid "Login name" +msgstr "" + +#: admin/wp-security-list-logged-in-users.php:87 +msgid "Nonce check failed for force user logout operation!" +msgstr "" + +#: admin/wp-security-list-logged-in-users.php:96 +msgid "The selected user was logged out successfully!" +msgstr "" + +#: admin/wp-security-list-login-fails.php:53 +msgid "Login IP range" +msgstr "" + +#: admin/wp-security-list-login-fails.php:130 +msgid "Nonce check failed for delete failed login record operation!" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:66 +msgid "Blocked IP" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:87 +msgid "Unblock" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:122 +#: admin/wp-security-list-permanent-blocked-ip.php:139 +msgid "Successfully unblocked and deleted the selected record(s)." +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:126 +#: admin/wp-security-list-permanent-blocked-ip.php:143 +msgid "Failed to unblock and delete the selected record(s)." +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:133 +msgid "Nonce check failed for unblock IP operation!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:71 +msgid "Email" +msgstr "" + +#: admin/wp-security-list-registered-users.php:72 +msgid "Register date" +msgstr "" + +#: admin/wp-security-list-registered-users.php:73 +msgid "Account status" +msgstr "" + +#: admin/wp-security-list-registered-users.php:92 +msgid "Approve" +msgstr "" + +#: admin/wp-security-list-registered-users.php:94 +msgid "Block IP" +msgstr "" + +#: admin/wp-security-list-registered-users.php:159 +msgid "The selected accounts were approved successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:163 +msgid "The following accounts failed to update successfully: " +msgstr "" + +#: admin/wp-security-list-registered-users.php:171 +msgid "The selected account was approved successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:190 +msgid "Your account is now active" +msgstr "" + +#: admin/wp-security-list-registered-users.php:191 +msgid "Your account with username: " +msgstr "" + +#: admin/wp-security-list-registered-users.php:191 +msgid " is now active" +msgstr "" + +#: admin/wp-security-list-registered-users.php:222 +msgid "The selected accounts were deleted successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:230 +msgid "Nonce check failed for delete registered user account operation!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:238 +msgid "The selected account was deleted successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:264 +msgid "The selected IP addresses were successfully added to the permanent block list!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:265 +#: admin/wp-security-list-registered-users.php:282 +msgid "View Blocked IPs" +msgstr "" + +#: admin/wp-security-list-registered-users.php:274 +msgid "Nonce check failed for block IP operation of registered user!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:281 +msgid "The selected IP was successfully added to the permanent block list!" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:25 +msgid "Visitor lockout" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:85 +msgid "Site lockout feature settings saved!" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:92 +msgid "General visitor lockout" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:98 +msgid "This feature allows you to put your site into \"maintenance mode\" by locking down the front-end to all visitors except logged in users with super admin privileges." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:99 +msgid "Locking your site down to general visitors can be useful if you are investigating some issues on your site or perhaps you might be doing some maintenance and wish to keep out all traffic for security reasons." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:104 +msgid "Enable front-end lockout" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:107 +msgid "Check this if you want all visitors except those who are logged in as administrator to be locked out of the front-end of your site." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:111 +msgid "Enter a message:" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:123 +msgid "Enter a message you wish to display to visitors when your site is in maintenance mode." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:130 +msgid "Save site lockout settings" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:28 +msgid "Copy protection" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:29 +msgid "Frames" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:30 +msgid "Users enumeration" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:31 +msgid "WP REST API" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:89 +msgid "Copy Protection feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:94 +msgid "Disable the ability to copy text" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:100 +msgid "This feature allows you to disable the ability to select and copy text from your front end." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:101 +msgid "When admin user is logged in, the feature is automatically disabled for his session." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:106 +msgid "Enable copy protection" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:109 +msgid "Check this if you want to disable the \"Right click\", \"Text selection\" and \"Copy\" option on the front end of your site." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:116 +msgid "Save copy protection settings" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:140 +msgid "Frame Display Prevention feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:145 +msgid "Prevent your site from being displayed in a frame" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:151 +msgid "This feature allows you to prevent other sites from displaying any of your content via a frame or iframe." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:152 +msgid "When enabled, this feature will set the \"X-Frame-Options\" parameter to \"sameorigin\" in the HTTP header." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:157 +msgid "Enable iFrame protection" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:160 +msgid "Check this if you want to stop other sites from displaying your content in a frame or iframe." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:191 +msgid "Users Enumeration Prevention feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:196 +msgid "Prevent users enumeration" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:202 +msgid "This feature allows you to prevent external users/bots from fetching the user info with urls like \"/?author=1\"." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:203 +msgid "When enabled, this feature will print a \"forbidden\" error rather than the user information." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:208 +msgid "Disable users enumeration" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:211 +msgid "Check this if you want to stop users enumeration." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:242 +msgid "WP REST API Security feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:253 +msgid "This feature allows you to block WordPress REST API access for unauthorized requests." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:254 +msgid "When enabled this feature will only allow REST requests to be processed if the user is logged in." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:260 +msgid "Beware that if you are using other plugins which have registered REST endpoints (eg, Contact Form 7), then this feature will also block REST requests used by these plugins if the user is not logged in. It is recommended that you leave this feature disabled if you want uninterrupted functionality for such plugins." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:268 +msgid "Disallow unauthorized REST requests" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:271 +msgid "Check this if you want to stop REST API access for non-logged in requests." +msgstr "" + +#: admin/wp-security-settings-menu.php:25 +msgid "General settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:29 +#: admin/wp-security-settings-menu.php:33 +msgid "file" +msgstr "" + +#: admin/wp-security-settings-menu.php:37 +msgid "Delete plugin settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:41 +msgid "WP version info" +msgstr "" + +#: admin/wp-security-settings-menu.php:45 +msgid "Import/Export" +msgstr "" + +#: admin/wp-security-settings-menu.php:52 +msgid "Advanced settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:128 +msgid "All the security features have been disabled successfully!" +msgstr "" + +#: admin/wp-security-settings-menu.php:132 +#: admin/wp-security-settings-menu.php:159 +msgid "Could not write to the .htaccess file. Please restore your .htaccess file manually using the restore functionality in the \".htaccess File\"." +msgstr "" + +#: admin/wp-security-settings-menu.php:137 +msgid "Could not write to the wp-config.php. Please restore your wp-config.php file manually using the restore functionality in the \"wp-config.php File\"." +msgstr "" + +#: admin/wp-security-settings-menu.php:155 +msgid "All firewall rules have been disabled successfully!" +msgstr "" + +#: admin/wp-security-settings-menu.php:177 +msgid "Deletion of aio_wp_security_configs option and .htaccess directives failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:179 +msgid "Reset of aio_wp_security_configs option failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:181 +msgid "Deletion of .htaccess directives failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:183 +msgid "All settings have been successfully reset." +msgstr "" + +#: admin/wp-security-settings-menu.php:203 +msgid "For information, updates and documentation, please visit the" +msgstr "" + +#: admin/wp-security-settings-menu.php:203 +msgid "Page" +msgstr "" + +#: admin/wp-security-settings-menu.php:204 +msgid "Follow us" +msgstr "" + +#: admin/wp-security-settings-menu.php:204 +msgid "on Twitter, Google+ or via Email to stay up to date about the new security features of this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:208 +msgid "WP Security plugin" +msgstr "" + +#: admin/wp-security-settings-menu.php:212 +msgid "Thank you for using the AIOS security plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:216 +msgid "There are a lot of security features in this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:221 +msgid "To start, go through each security option and enable the \"basic\" options." +msgstr "" + +#: admin/wp-security-settings-menu.php:225 +msgid "The more features you enable, the more security points you will achieve." +msgstr "" + +#: admin/wp-security-settings-menu.php:228 +msgid "Before doing anything we advise taking a backup of your .htaccess file, database and wp-config.php." +msgstr "" + +#: admin/wp-security-settings-menu.php:231 +msgid "Backup your database" +msgstr "" + +#: admin/wp-security-settings-menu.php:232 +#: admin/wp-security-settings-menu.php:433 +msgid "Backup .htaccess file" +msgstr "" + +#: admin/wp-security-settings-menu.php:233 +#: admin/wp-security-settings-menu.php:534 +msgid "Backup wp-config.php file" +msgstr "" + +#: admin/wp-security-settings-menu.php:240 +msgid "Disable security features" +msgstr "" + +#: admin/wp-security-settings-menu.php:246 +msgid "If you think that some plugin functionality on your site is broken due to a security feature you enabled in this plugin, then use the following option to turn off all the security features of this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:250 +msgid "Disable all security features" +msgstr "" + +#: admin/wp-security-settings-menu.php:257 +#: admin/wp-security-settings-menu.php:267 +msgid "Disable all firewall rules" +msgstr "" + +#: admin/wp-security-settings-menu.php:263 +msgid "This feature will disable all firewall rules which are currently active in this plugin and it will also delete these rules from your .htacess file. Use it if you think one of the firewall rules is causing an issue on your site." +msgstr "" + +#: admin/wp-security-settings-menu.php:274 +#: admin/wp-security-settings-menu.php:287 +msgid "Reset settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:279 +msgid "This button click will delete all of your settings related to the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:280 +msgid "This button click will reset/empty all the database tables of the security plugin also." +msgstr "" + +#: admin/wp-security-settings-menu.php:281 +msgid "Use this plugin if you were locked out by the All In One WP Security & Firewall Plugin and/or you are having issues logging in when that plugin is activated." +msgstr "" + +#: admin/wp-security-settings-menu.php:282 +msgid "In addition to the settings it will also delete any directives which were added to the .htaccess file by the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:283 +msgid "%1$sNOTE: %2$sAfter deleting the settings you will need to re-configure the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:295 +msgid "Debug settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:301 +msgid "This setting allows you to enable/disable debug for this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:307 +msgid "Enable debug" +msgstr "" + +#: admin/wp-security-settings-menu.php:310 +msgid "Check this if you want to enable debug. You should keep this option disabled after you have finished debugging the issue." +msgstr "" + +#: admin/wp-security-settings-menu.php:314 +msgid "Save debug settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:350 +msgid "Your .htaccess file was successfully backed up! Using an FTP program go to the \"/wp-content/aiowps_backups\" directory to save a copy of the file to your computer." +msgstr "" + +#: admin/wp-security-settings-menu.php:356 +msgid "htaccess file rename failed during backup. Please check your root directory for the backup file using FTP." +msgstr "" + +#: admin/wp-security-settings-menu.php:362 +msgid "htaccess backup failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:377 +msgid "Please choose a .htaccess to restore from." +msgstr "" + +#: admin/wp-security-settings-menu.php:392 +msgid "htaccess file restore failed. Please attempt to restore the .htaccess manually using FTP." +msgstr "" + +#: admin/wp-security-settings-menu.php:396 +msgid "Your .htaccess file has successfully been restored!" +msgstr "" + +#: admin/wp-security-settings-menu.php:402 +msgid "htaccess Restore operation failed! Please check the contents of the file you are trying to restore from." +msgstr "" + +#: admin/wp-security-settings-menu.php:408 +msgid ".htaccess file operations" +msgstr "" + +#: admin/wp-security-settings-menu.php:411 +msgid "Your \".htaccess\" file is a key component of your website's security and it can be modified to implement various levels of protection mechanisms." +msgstr "" + +#: admin/wp-security-settings-menu.php:412 +msgid "This feature allows you to backup and save your currently active .htaccess file should you need to re-use the the backed up file in the future." +msgstr "" + +#: admin/wp-security-settings-menu.php:413 +msgid "You can also restore your site's .htaccess settings using a backed up .htaccess file." +msgstr "" + +#: admin/wp-security-settings-menu.php:428 +msgid "Save the current .htaccess file" +msgstr "" + +#: admin/wp-security-settings-menu.php:432 +msgid "Click the button below to backup and save the currently active .htaccess file." +msgstr "" + +#: admin/wp-security-settings-menu.php:437 +msgid "Restore from a backed up .htaccess file" +msgstr "" + +#: admin/wp-security-settings-menu.php:443 +msgid ".htaccess file to restore from" +msgstr "" + +#: admin/wp-security-settings-menu.php:445 +msgid "Select Your htaccess File" +msgstr "" + +#: admin/wp-security-settings-menu.php:449 +msgid "After selecting your file, click the button below to restore your site using the backed up htaccess file (htaccess_backup.txt)." +msgstr "" + +#: admin/wp-security-settings-menu.php:455 +msgid "Restore .htaccess file" +msgstr "" + +#: admin/wp-security-settings-menu.php:477 +msgid "Please choose a wp-config.php file to restore from." +msgstr "" + +#: admin/wp-security-settings-menu.php:493 +msgid "wp-config.php file restore failed. Please attempt to restore this file manually using FTP." +msgstr "" + +#: admin/wp-security-settings-menu.php:497 +msgid "Your wp-config.php file has successfully been restored!" +msgstr "" + +#: admin/wp-security-settings-menu.php:503 +msgid "wp-config.php Restore operation failed! Please check the contents of the file you are trying to restore from." +msgstr "" + +#: admin/wp-security-settings-menu.php:509 +msgid "wp-config.php file operations" +msgstr "" + +#: admin/wp-security-settings-menu.php:512 +msgid "Your \"wp-config.php\" file is one of the most important in your WordPress installation. It is a primary configuration file and contains crucial things such as details of your database and other critical components." +msgstr "" + +#: admin/wp-security-settings-menu.php:513 +msgid "This feature allows you to backup and save your currently active wp-config.php file should you need to re-use the the backed up file in the future." +msgstr "" + +#: admin/wp-security-settings-menu.php:514 +msgid "You can also restore your site's wp-config.php settings using a backed up wp-config.php file." +msgstr "" + +#: admin/wp-security-settings-menu.php:529 +msgid "Save the current wp-config.php file" +msgstr "" + +#: admin/wp-security-settings-menu.php:533 +msgid "Click the button below to backup and download the contents of the currently active wp-config.php file." +msgstr "" + +#: admin/wp-security-settings-menu.php:539 +msgid "Restore from a backed up wp-config file" +msgstr "" + +#: admin/wp-security-settings-menu.php:545 +msgid "wp-config file to restore from" +msgstr "" + +#: admin/wp-security-settings-menu.php:547 +msgid "Select Your wp-config File" +msgstr "" + +#: admin/wp-security-settings-menu.php:551 +msgid "After selecting your file click the button below to restore your site using the backed up wp-config file (wp-config.php.backup.txt)." +msgstr "" + +#: admin/wp-security-settings-menu.php:557 +msgid "Restore wp-config file" +msgstr "" + +#: admin/wp-security-settings-menu.php:591 +msgid "Manage delete plugin settings saved." +msgstr "" + +#: admin/wp-security-settings-menu.php:596 +msgid "Manage delete plugin tasks" +msgstr "" + +#: admin/wp-security-settings-menu.php:603 +msgid "Delete database tables" +msgstr "" + +#: admin/wp-security-settings-menu.php:606 +msgid "Check this if you want to remove database tables when the plugin is uninstalled." +msgstr "" + +#: admin/wp-security-settings-menu.php:610 +msgid "Delete settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:613 +msgid "Check this if you want to remove all plugin settings when uninstalling the plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:613 +msgid "It will also remove all custom htaccess rules that were added by this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:647 +msgid "WP generator meta tag and version info" +msgstr "" + +#: admin/wp-security-settings-menu.php:650 +msgid "WordPress generator automatically adds some meta information inside the \"head\" tags of every page on your site's front end. Below is an example of this:" +msgstr "" + +#: admin/wp-security-settings-menu.php:652 +msgid "The above meta information shows which version of WordPress your site is currently running and thus can help hackers or crawlers scan your site to see if you have an older version of WordPress or one with a known exploit." +msgstr "" + +#: admin/wp-security-settings-menu.php:653 +msgid "There are also other ways wordpress reveals version info such as during style and script loading. An example of this is:" +msgstr "" + +#: admin/wp-security-settings-menu.php:655 +msgid "This feature will allow you to remove the WP generator meta info and other version info from your site's pages." +msgstr "" + +#: admin/wp-security-settings-menu.php:661 +msgid "WP generator meta info" +msgstr "" + +#: admin/wp-security-settings-menu.php:673 +msgid "Remove WP generator meta info" +msgstr "" + +#: admin/wp-security-settings-menu.php:676 +msgid "Check this if you want to remove the version and meta info produced by WP from all pages" +msgstr "" + +#: admin/wp-security-settings-menu.php:704 +msgid "Please choose a file to import your settings from." +msgstr "" + +#: admin/wp-security-settings-menu.php:736 +msgid "Import AIOS settings from " +msgstr "" + +#: admin/wp-security-settings-menu.php:742 +#: admin/wp-security-settings-menu.php:786 +msgid "The deletion of the import file failed. Please delete this file manually via the media menu for security purposes." +msgstr "" + +#: admin/wp-security-settings-menu.php:744 +#: admin/wp-security-settings-menu.php:788 +msgid "The file you uploaded was also deleted for security purposes because it contains security settings details." +msgstr "" + +#: admin/wp-security-settings-menu.php:759 +msgid "Your AIOS settings were successfully imported via file input." +msgstr "" + +#: admin/wp-security-settings-menu.php:760 +msgid "The deletion of the import file failed. Please delete this file manually via the media menu for security purposes because it contains security settings details." +msgstr "" + +#: admin/wp-security-settings-menu.php:762 +msgid "Your AIOS settings were successfully imported. The file you uploaded was also deleted for security purposes because it contains security settings details." +msgstr "" + +#: admin/wp-security-settings-menu.php:765 +msgid "Your AIOS settings were successfully imported via text entry." +msgstr "" + +#: admin/wp-security-settings-menu.php:780 +msgid "The contents of your settings file appear invalid. Please check the contents of the file you are trying to import settings from." +msgstr "" + +#: admin/wp-security-settings-menu.php:797 +msgid "Export or import your AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:800 +msgid "This section allows you to export or import your All In One WP Security & Firewall settings." +msgstr "" + +#: admin/wp-security-settings-menu.php:801 +msgid "This can be handy if you wanted to save time by applying the settings from one site to another site." +msgstr "" + +#: admin/wp-security-settings-menu.php:802 +msgid "NOTE: Before importing, it is your responsibility to know what settings you are trying to import. Importing settings blindly can cause you to be locked out of your site." +msgstr "" + +#: admin/wp-security-settings-menu.php:803 +msgid "For Example: If a settings item relies on the domain URL then it may not work correctly when imported into a site with a different domain." +msgstr "" + +#: admin/wp-security-settings-menu.php:809 +#: admin/wp-security-settings-menu.php:818 +msgid "Export AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:815 +msgid "To export your All In One WP Security & Firewall settings click the button below." +msgstr "" + +#: admin/wp-security-settings-menu.php:822 +#: admin/wp-security-settings-menu.php:851 +msgid "Import AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:828 +msgid "Use this section to import your All In One WP Security & Firewall settings from a file. Alternatively, copy/paste the contents of your import file into the textarea below." +msgstr "" + +#: admin/wp-security-settings-menu.php:830 +msgid "Import file" +msgstr "" + +#: admin/wp-security-settings-menu.php:833 +msgid "Select Your Import Settings File" +msgstr "" + +#: admin/wp-security-settings-menu.php:837 +msgid "After selecting your file, click the button below to apply the settings to your site." +msgstr "" + +#: admin/wp-security-settings-menu.php:844 +msgid "Copy/Paste import data" +msgstr "" + +#: admin/wp-security-settings-menu.php:893 +msgid "Default - if correct, then this is the best option" +msgstr "" + +#: admin/wp-security-settings-menu.php:894 +msgid "Only use if you're using Cloudflare." +msgstr "" + +#: admin/wp-security-settings-menu.php:902 +msgid "(current value: %s)" +msgstr "" + +#: admin/wp-security-settings-menu.php:905 +msgid "no value (i.e. empty) on your server" +msgstr "" + +#: admin/wp-security-spam-menu.php:28 +msgid "Comment spam" +msgstr "" + +#: admin/wp-security-spam-menu.php:29 +msgid "Comment spam IP monitoring" +msgstr "" + +#: admin/wp-security-spam-menu.php:30 +msgid "BuddyPress" +msgstr "" + +#: admin/wp-security-spam-menu.php:31 +msgid "bbPress" +msgstr "" + +#: admin/wp-security-spam-menu.php:57 +msgid "Spam prevention" +msgstr "" + +#: admin/wp-security-spam-menu.php:99 +msgid "You entered a non numeric value for the \"move spam comments to trash after number of days\" field." +msgstr "" + +#: admin/wp-security-spam-menu.php:99 +#: admin/wp-security-spam-menu.php:297 +#: admin/wp-security-user-login-menu.php:118 +#: admin/wp-security-user-login-menu.php:124 +#: admin/wp-security-user-login-menu.php:130 +#: admin/wp-security-user-login-menu.php:136 +msgid "It has been set to the default value." +msgstr "" + +#: admin/wp-security-spam-menu.php:129 +msgid "Comment spam settings" +msgstr "" + +#: admin/wp-security-spam-menu.php:134 +msgid "Add CAPTCHA to comments form" +msgstr "" + +#: admin/wp-security-spam-menu.php:138 +msgid "This feature will add a CAPTCHA field in the WordPress comments form." +msgstr "" + +#: admin/wp-security-spam-menu.php:139 +msgid "Adding a CAPTCHA field in the comment form is a simple way of greatly reducing spam comments from bots without using .htaccess rules." +msgstr "" + +#: admin/wp-security-spam-menu.php:148 +msgid "Enable CAPTCHA on comment forms" +msgstr "" + +#: admin/wp-security-spam-menu.php:151 +msgid "Check this if you want to insert a CAPTCHA field on the comment forms." +msgstr "" + +#: admin/wp-security-spam-menu.php:158 +msgid "Block spambot comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:162 +msgid "A large portion of WordPress blog comment spam is mainly produced by automated bots and not necessarily by humans." +msgstr "" + +#: admin/wp-security-spam-menu.php:163 +msgid "This feature will greatly minimize the useless and unnecessary traffic and load on your server resulting from spam comments by blocking all comment requests which do not originate from your domain." +msgstr "" + +#: admin/wp-security-spam-menu.php:164 +msgid "In other words, if the comment was not submitted by a human who physically submitted the comment on your site, the request will be blocked." +msgstr "" + +#: admin/wp-security-spam-menu.php:182 +msgid "Block spambots from posting comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:185 +msgid "Check this if you want to apply a firewall rule which will block comments originating from spambots." +msgstr "" + +#: admin/wp-security-spam-menu.php:189 +msgid "This feature will implement a firewall rule to block all comment attempts which do not originate from your domain." +msgstr "" + +#: admin/wp-security-spam-menu.php:190 +msgid "A legitimate comment is one which is submitted by a human who physically fills out the comment form and clicks the submit button. For such events, the HTTP_REFERRER is always set to your own domain." +msgstr "" + +#: admin/wp-security-spam-menu.php:191 +msgid "A comment submitted by a spambot is done by directly calling the comments.php file, which usually means that the HTTP_REFERRER value is not your domain and often times empty." +msgstr "" + +#: admin/wp-security-spam-menu.php:192 +msgid "This feature will check and block comment requests which are not referred by your domain thus greatly reducing your overall blog spam and PHP requests done by the server to process these comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:202 +msgid "Comment processing" +msgstr "" + +#: admin/wp-security-spam-menu.php:207 +msgid "Trash spam comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:216 +msgid "Move spam comments to trash after %s days." +msgstr "" + +#: admin/wp-security-spam-menu.php:224 +msgid "Enable this feature in order to move the spam comments to trash after given number of days." +msgstr "" + +#: admin/wp-security-spam-menu.php:262 +msgid "You entered a non numeric value for the minimum number of spam comments field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-spam-menu.php:265 +msgid "You must enter an integer greater than zero for minimum number of spam comments field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-spam-menu.php:292 +msgid "Nonce check failed for list spam comment IPs." +msgstr "" + +#: admin/wp-security-spam-menu.php:297 +msgid "You entered a non numeric value for the minimum spam comments per IP field." +msgstr "" + +#: admin/wp-security-spam-menu.php:308 +msgid "Displaying results for IP addresses which have posted a minimum of %s spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:323 +msgid "Auto block spammer IPs" +msgstr "" + +#: admin/wp-security-spam-menu.php:328 +msgid "This feature has detected that %s is not active. It is highly recommended that you activate the Akismet plugin to make the most of this feature." +msgstr "" + +#: admin/wp-security-spam-menu.php:337 +msgid "This feature allows you to automatically and permanently block IP addresses which have exceeded a certain number of comments labelled as spam." +msgstr "" + +#: admin/wp-security-spam-menu.php:338 +msgid "Comments are usually labelled as spam either by the Akismet plugin or manually by the WP administrator when they mark a comment as \"spam\" from the WordPress Comments menu." +msgstr "" + +#: admin/wp-security-spam-menu.php:352 +msgid "You currently have no IP addresses permanently blocked due to spam." +msgstr "" + +#: admin/wp-security-spam-menu.php:365 +msgid "Spammer IPs added to permanent block list today: " +msgstr "" + +#: admin/wp-security-spam-menu.php:366 +msgid "All time total: " +msgstr "" + +#: admin/wp-security-spam-menu.php:367 +msgid "View blocked IPs" +msgstr "" + +#: admin/wp-security-spam-menu.php:380 +msgid "Enable auto block of spam comment IPs" +msgstr "" + +#: admin/wp-security-spam-menu.php:383 +msgid "Check this box if you want this plugin to automatically block IP addresses which submit spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:387 +msgid "Minimum number of spam comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:389 +msgid "Specify the minimum number of spam comments for an IP address before it is permanently blocked." +msgstr "" + +#: admin/wp-security-spam-menu.php:393 +msgid "Example 1: Setting this value to \"1\" will block ALL IP addresses which were used to submit at least one spam comment." +msgstr "" + +#: admin/wp-security-spam-menu.php:394 +msgid "Example 2: Setting this value to \"5\" will block only those IP addresses which were used to submit 5 spam comments or more on your site." +msgstr "" + +#: admin/wp-security-spam-menu.php:412 +msgid "List spammer IP addresses" +msgstr "" + +#: admin/wp-security-spam-menu.php:416 +msgid "This section displays a list of the IP addresses of the people or bots who have left spam comments on your site." +msgstr "" + +#: admin/wp-security-spam-menu.php:417 +msgid "This information can be handy for identifying the most persistent IP addresses or ranges used by spammers." +msgstr "" + +#: admin/wp-security-spam-menu.php:418 +msgid "By inspecting the IP address data coming from spammers you will be in a better position to determine which addresses or address ranges you should block by adding them to the permanent block list." +msgstr "" + +#: admin/wp-security-spam-menu.php:419 +msgid "To add one or more of the IP addresses displayed in the table below to your blacklist, simply click the \"Block\" link for the individual row or select more than one address using the checkboxes and then choose the \"block\" option from the Bulk Actions dropdown list and click the \"Apply\" button." +msgstr "" + +#: admin/wp-security-spam-menu.php:427 +msgid "Minimum number of spam comments per IP" +msgstr "" + +#: admin/wp-security-spam-menu.php:429 +msgid "This field allows you to list only those IP addresses which have been used to post X or more spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:433 +msgid "Example 1: Setting this value to \"0\" or \"1\" will list ALL IP addresses which were used to submit spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:434 +msgid "Example 2: Setting this value to \"5\" will list only those IP addresses which were used to submit 5 spam comments or more on your site." +msgstr "" + +#: admin/wp-security-spam-menu.php:441 +msgid "Find IP addresses" +msgstr "" + +#: admin/wp-security-spam-menu.php:445 +msgid "Spammer IP address results" +msgstr "" + +#: admin/wp-security-spam-menu.php:451 +#: classes/wp-security-utility.php:253 +msgid "The plugin has detected that you are using a Multi-Site WordPress installation." +msgstr "" + +#: admin/wp-security-spam-menu.php:452 +msgid "Only the \"superadmin\" can block IP addresses from the main site." +msgstr "" + +#: admin/wp-security-spam-menu.php:453 +msgid "Take note of the IP addresses you want blocked and ask the superadmin to add these to the blacklist using the \"Blacklist Manager\" on the main site." +msgstr "" + +#: admin/wp-security-spam-menu.php:498 +msgid "BuddyPress spam settings" +msgstr "" + +#: admin/wp-security-spam-menu.php:503 +msgid "Add CAPTCHA to BuddyPress registration form" +msgstr "" + +#: admin/wp-security-spam-menu.php:507 +msgid "This feature will add a simple math CAPTCHA field in the BuddyPress registration form." +msgstr "" + +#: admin/wp-security-spam-menu.php:508 +msgid "Adding a CAPTCHA field in the registration form is a simple way of greatly reducing spam signups from bots without using .htaccess rules." +msgstr "" + +#: admin/wp-security-spam-menu.php:518 +msgid "Enable CAPTCHA on BuddyPress registration form" +msgstr "" + +#: admin/wp-security-spam-menu.php:521 +msgid "Check this if you want to insert a CAPTCHA field on the BuddyPress registration forms." +msgstr "" + +#: admin/wp-security-spam-menu.php:530 +msgid "BuddyPress is not active! In order to use this feature you will need to have BuddyPress installed and activated." +msgstr "" + +#: admin/wp-security-spam-menu.php:560 +msgid "bbPress spam settings" +msgstr "" + +#: admin/wp-security-spam-menu.php:565 +msgid "Add CAPTCHA to bbPress new topic form" +msgstr "" + +#: admin/wp-security-spam-menu.php:569 +msgid "This feature will add a simple math CAPTCHA field in the bbPress new topic form." +msgstr "" + +#: admin/wp-security-spam-menu.php:570 +msgid "Adding a CAPTCHA field in this form is a simple way of greatly reducing spam submitted from bots." +msgstr "" + +#: admin/wp-security-spam-menu.php:580 +msgid "Enable CAPTCHA on bbPress new topic form" +msgstr "" + +#: admin/wp-security-spam-menu.php:583 +msgid "Check this if you want to insert a CAPTCHA field on the bbPress new topic forms." +msgstr "" + +#: admin/wp-security-spam-menu.php:592 +msgid "bbPress is not active. In order to use this feature you will need to have bbPress installed and activated." +msgstr "" + +#: admin/wp-security-tools-menu.php:34 +msgid "WHOIS lookup" +msgstr "" + +#: admin/wp-security-tools-menu.php:95 +#: admin/wp-security-tools-menu.php:136 +msgid "Querying %s: %s" +msgstr "" + +#: admin/wp-security-tools-menu.php:103 +#: admin/wp-security-tools-menu.php:112 +#: admin/wp-security-tools-menu.php:151 +msgid "Redirected to %s" +msgstr "" + +#: admin/wp-security-tools-menu.php:173 +msgid "The WHOIS lookup feature gives you a way to look up who owns an IP address or domain name." +msgstr "" + +#: admin/wp-security-tools-menu.php:173 +msgid "You can use this to investigate users engaging in malicious activity on your site." +msgstr "" + +#: admin/wp-security-tools-menu.php:176 +msgid "WHOIS lookup on IP or domain" +msgstr "" + +#: admin/wp-security-tools-menu.php:183 +msgid "IP address or domain name:" +msgstr "" + +#: admin/wp-security-tools-menu.php:190 +msgid "Look up IP or domain" +msgstr "" + +#: admin/wp-security-tools-menu.php:219 +msgid "Please enter a valid IP address or domain name to look up." +msgstr "" + +#: admin/wp-security-tools-menu.php:220 +#: admin/wp-security-tools-menu.php:226 +msgid "Nothing to show." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:32 +msgid "WP username" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:33 +msgid "Display name" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:34 +msgid "Password" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:60 +msgid "User accounts" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:82 +msgid "Admin user security" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:85 +msgid "By default, WordPress sets the administrator username to \"admin\" at installation time." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:86 +msgid "A lot of hackers try to take advantage of this information by attempting \"Brute force login attacks\" where they repeatedly try to guess the password by using \"admin\" for username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:87 +msgid "From a security perspective, changing the default \"admin\" user name is one of the first and smartest things you should do on your site." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:88 +msgid "This feature will allow you to change your default \"admin\" user name to a more secure name of your choosing." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:95 +msgid "List of administrator accounts" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:104 +#: classes/grade-system/wp-security-feature-item-manager.php:43 +msgid "Change admin username" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:112 +msgid "Your site currently has an account which uses the default \"admin\" username. It is highly recommended that you change this name to something else. Use the following field to change the admin username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:118 +msgid "New admin username" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:120 +msgid "Choose a new username for admin." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:124 +msgid "Change username" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:126 +msgid "NOTE: If you are currently logged in as \"admin\" you will be automatically logged out after changing your username and will be required to log back in." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:133 +msgid "No action required! " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:135 +msgid "Your site does not have any account which uses the default \"admin\" username. " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:136 +msgid "This is good security practice." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:148 +msgid "Display name security" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:151 +msgid "When you submit a post or answer a comment, WordPress will usually display your \"nickname\"." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:152 +msgid "By default the nickname is set to the login (or user) name of your account." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:153 +msgid "From a security perspective, leaving your nickname the same as your user name is bad practice because it gives a hacker at least half of your account's login credentials." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:154 +msgid "Therefore to further tighten your site's security you are advised to change your nickname and Display name to be different from your Username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:160 +msgid "Modify accounts with identical login name and display name" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:169 +msgid "Your site currently has the following accounts which have an identical login name and display name." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:170 +msgid "Follow the link to edit the user profile of that particular user account, change Nickname, choose a different Display name compared to Username, and press the \"Update User\" button.)" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:185 +msgid "No action required." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:186 +msgid "Your site does not have a user account where the display name is identical to the username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:197 +msgid "Password tool" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:200 +msgid "Poor password selection is one of the most common weak points of many sites and is usually the first thing a hacker will try to exploit when attempting to break into your site." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:201 +msgid "Many people fall into the trap of using a simple word or series of numbers as their password. Such a predictable and simple password would take a competent hacker merely minutes to guess your password by using a simple script which cycles through the easy and most common combinations." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:202 +msgid "The longer and more complex your password is the harder it is for hackers to \"crack\" because more complex passwords require much greater computing power and time." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:203 +msgid "This section contains a useful password strength tool which you can use to check whether your password is sufficiently strong enough." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:208 +msgid "Password strength tool" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:210 +msgid "This password tool uses an algorithm which calculates how long it would take for your password to be cracked using the computing power of an off-the-shelf current model desktop PC with high end processor, graphics card and appropriate password cracking software." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:213 +msgid "Start typing a password." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:216 +msgid "It would take a desktop PC approximately" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:217 +msgid "1 sec" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:217 +msgid "to crack your password!" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:222 +msgid "Password Strength" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:245 +msgid "Username " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:245 +msgid " already exists. Please enter another value. " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:262 +msgid "The database update operation of the user account failed!" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:291 +msgid "You entered an invalid username. Please enter another value. " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:295 +msgid "Please enter a value for your username. " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:302 +msgid "Username successfully changed." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:322 +msgid "Account login name" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:331 +msgid "Edit user" +msgstr "" + +#: admin/wp-security-user-login-menu.php:54 +#: admin/wp-security-user-login-menu.php:474 +msgid "Failed login records" +msgstr "" + +#: admin/wp-security-user-login-menu.php:55 +#: classes/grade-system/wp-security-feature-item-manager.php:51 +msgid "Force logout" +msgstr "" + +#: admin/wp-security-user-login-menu.php:56 +#: admin/wp-security-user-login-menu.php:632 +msgid "Account activity logs" +msgstr "" + +#: admin/wp-security-user-login-menu.php:58 +#: admin/wp-security-user-login-menu.php:769 +msgid "Additional settings" +msgstr "" + +#: admin/wp-security-user-login-menu.php:81 +msgid "User login" +msgstr "" + +#: admin/wp-security-user-login-menu.php:118 +msgid "You entered a non-numeric value for the max login attempts field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:124 +msgid "You entered a non numeric value for the login retry time period field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:130 +msgid "You entered a non numeric value for the lockout time length field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:136 +msgid "You entered a non numeric value for the maximum lockout time length field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:141 +msgid "You entered an invalid minimum lockout time length, it must be less than the maximum lockout time length value." +msgstr "" + +#: admin/wp-security-user-login-menu.php:141 +msgid "Both have been set to the default values." +msgstr "" + +#: admin/wp-security-user-login-menu.php:160 +msgid "Please fill in one or more email addresses to notify." +msgstr "" + +#: admin/wp-security-user-login-menu.php:162 +msgid "You have entered one or more invalid email addresses." +msgstr "" + +#: admin/wp-security-user-login-menu.php:165 +msgid "It has been set to your WordPress admin email as default." +msgstr "" + +#: admin/wp-security-user-login-menu.php:250 +msgid "Login lockout configuration" +msgstr "" + +#: admin/wp-security-user-login-menu.php:254 +msgid "One of the ways hackers try to compromise sites is via a " +msgstr "" + +#: admin/wp-security-user-login-menu.php:254 +msgid "Brute force login attack" +msgstr "" + +#: admin/wp-security-user-login-menu.php:254 +msgid "This is where attackers use repeated login attempts until they guess the password." +msgstr "" + +#: admin/wp-security-user-login-menu.php:255 +msgid "Apart from choosing strong passwords, monitoring and blocking IP addresses which are involved in repeated login failures in a short period of time is a very effective way to stop these types of attacks." +msgstr "" + +#: admin/wp-security-user-login-menu.php:256 +msgid "You may also want to checkout our %s feature for another secure way to protect against these types of attacks." +msgstr "" + +#: admin/wp-security-user-login-menu.php:261 +msgid "Login lockout options" +msgstr "" + +#: admin/wp-security-user-login-menu.php:272 +msgid "Enable login lockout feature" +msgstr "" + +#: admin/wp-security-user-login-menu.php:275 +msgid "Check this if you want to enable the login lockout feature and apply the settings below" +msgstr "" + +#: admin/wp-security-user-login-menu.php:279 +msgid "Allow unlock requests" +msgstr "" + +#: admin/wp-security-user-login-menu.php:282 +msgid "Check this if you want to allow users to generate an automated unlock request link which will unlock their account" +msgstr "" + +#: admin/wp-security-user-login-menu.php:286 +msgid "Max login attempts" +msgstr "" + +#: admin/wp-security-user-login-menu.php:288 +msgid "Set the value for the maximum login retries before IP address is locked out" +msgstr "" + +#: admin/wp-security-user-login-menu.php:292 +msgid "Login retry time period (min)" +msgstr "" + +#: admin/wp-security-user-login-menu.php:294 +msgid "If the maximum number of failed login attempts for a particular IP address occur within this time period the plugin will lock out that address" +msgstr "" + +#: admin/wp-security-user-login-menu.php:299 +msgid "Minimum lockout time length" +msgstr "" + +#: admin/wp-security-user-login-menu.php:305 +msgid "Set the minimum time period in minutes of lockout." +msgstr "" + +#: admin/wp-security-user-login-menu.php:306 +msgid "This failed login lockout time will be tripled on each failed login." +msgstr "" + +#: admin/wp-security-user-login-menu.php:313 +msgid "Maximum lockout time length" +msgstr "" + +#: admin/wp-security-user-login-menu.php:318 +msgid "Set the maximum time period in minutes of lockout." +msgstr "" + +#: admin/wp-security-user-login-menu.php:319 +msgid "No IP address will be blocked for more than this time period after making a failed login attempt." +msgstr "" + +#: admin/wp-security-user-login-menu.php:324 +msgid "Display generic error message" +msgstr "" + +#: admin/wp-security-user-login-menu.php:327 +msgid "Check this if you want to show a generic error message when a login attempt fails" +msgstr "" + +#: admin/wp-security-user-login-menu.php:331 +msgid "Instantly lockout invalid usernames" +msgstr "" + +#: admin/wp-security-user-login-menu.php:334 +msgid "Check this if you want to instantly lockout login attempts with usernames which do not exist on your system" +msgstr "" + +#: admin/wp-security-user-login-menu.php:339 +msgid "Instantly lockout specific usernames" +msgstr "" + +#: admin/wp-security-user-login-menu.php:349 +msgid "Insert one username per line. Existing usernames are not blocked even if present in the list." +msgstr "" + +#: admin/wp-security-user-login-menu.php:354 +msgid "Notify by email" +msgstr "" + +#: admin/wp-security-user-login-menu.php:358 +msgid "Check this if you want to receive an email when someone has been locked out due to maximum failed login attempts" +msgstr "" + +#: admin/wp-security-user-login-menu.php:361 +msgid "Fill in one email address per line." +msgstr "" + +#: admin/wp-security-user-login-menu.php:365 +msgid "Each email address must be on a new line." +msgstr "" + +#: admin/wp-security-user-login-menu.php:366 +msgid "If a valid email address has not been filled in, it will not be saved." +msgstr "" + +#: admin/wp-security-user-login-menu.php:367 +msgid "The valid email address format is userid@example.com" +msgstr "" + +#: admin/wp-security-user-login-menu.php:368 +msgid "Example: %s" +msgstr "" + +#: admin/wp-security-user-login-menu.php:375 +msgid "Enable PHP backtrace in email" +msgstr "" + +#: admin/wp-security-user-login-menu.php:379 +msgid "Check this if you want to include the PHP backtrace in notification emails." +msgstr "" + +#: admin/wp-security-user-login-menu.php:379 +msgid "This is internal coding information which makes it easier to investigate where an issued occurred." +msgstr "" + +#: admin/wp-security-user-login-menu.php:389 +msgid "Currently locked out IP address ranges" +msgstr "" + +#: admin/wp-security-user-login-menu.php:394 +msgid "To see a list of all locked IP addresses and ranges go to the %s tab in the dashboard menu." +msgstr "" + +#: admin/wp-security-user-login-menu.php:399 +msgid "Login lockout IP whitelist settings" +msgstr "" + +#: admin/wp-security-user-login-menu.php:405 +msgid "Enable login lockout IP whitelist" +msgstr "" + +#: admin/wp-security-user-login-menu.php:416 +msgid "The addresses specified here will never be blocked by the login lockout feature." +msgstr "" + +#: admin/wp-security-user-login-menu.php:450 +msgid "User login feature - Delete all failed login records operation failed." +msgstr "" + +#: admin/wp-security-user-login-menu.php:452 +msgid "All records from the failed logins table were deleted successfully." +msgstr "" + +#: admin/wp-security-user-login-menu.php:467 +msgid "This tab displays the failed login attempts for your site." +msgstr "" + +#: admin/wp-security-user-login-menu.php:468 +msgid "The information below can be handy if you need to do security investigations because it will show you the IP range, username and ID (if applicable) and the time/date of the failed login attempt." +msgstr "" + +#: admin/wp-security-user-login-menu.php:469 +msgid "Failed login records that are older than %1$d days are purged automatically." +msgstr "" + +#: admin/wp-security-user-login-menu.php:508 +#: admin/wp-security-user-login-menu.php:517 +msgid "Delete all failed login records" +msgstr "" + +#: admin/wp-security-user-login-menu.php:514 +msgid "Click this button if you wish to delete all failed login records in one go." +msgstr "" + +#: admin/wp-security-user-login-menu.php:544 +msgid "You entered a non numeric value for the logout time period field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-user-login-menu.php:569 +msgid "Setting an expiry period for your WP administration session is a simple way to protect against unauthorized access to your site from your computer." +msgstr "" + +#: admin/wp-security-user-login-menu.php:570 +msgid "This feature allows you to specify a time period in minutes after which the admin session will expire and the user will be forced to log back in." +msgstr "" + +#: admin/wp-security-user-login-menu.php:575 +msgid "Force user logout options" +msgstr "" + +#: admin/wp-security-user-login-menu.php:587 +msgid "Enable force WP user logout" +msgstr "" + +#: admin/wp-security-user-login-menu.php:590 +msgid "Check this if you want to force a wp user to be logged out after a configured amount of time" +msgstr "" + +#: admin/wp-security-user-login-menu.php:594 +msgid "Logout the WP user after XX minutes" +msgstr "" + +#: admin/wp-security-user-login-menu.php:596 +msgid "(Minutes) The user will be forced to log back in after this time period has elapased." +msgstr "" + +#: admin/wp-security-user-login-menu.php:625 +msgid "This tab displays the activity for accounts registered with your site that have logged in using the WordPress login form." +msgstr "" + +#: admin/wp-security-user-login-menu.php:626 +msgid "The information below can be handy if you need to do security investigations because it will show you the last 100 recent login events by username, IP address and time/date." +msgstr "" + +#: admin/wp-security-user-login-menu.php:627 +msgid "Account activity logs that are older than %1$d days are purged automatically." +msgstr "" + +#: admin/wp-security-user-login-menu.php:697 +msgid "Refresh logged in user data" +msgstr "" + +#: admin/wp-security-user-login-menu.php:701 +msgid "Refresh data" +msgstr "" + +#: admin/wp-security-user-login-menu.php:706 +msgid "This tab displays all users who are currently logged into your site." +msgstr "" + +#: admin/wp-security-user-login-menu.php:707 +msgid "If you suspect there is a user or users who are logged in which should not be, you can block them by inspecting the IP addresses from the data below and adding them to your blacklist." +msgstr "" + +#: admin/wp-security-user-login-menu.php:708 +msgid "You can also instantly log them out by clicking on the \"Force logout\" link when you hover over the row in the user id column." +msgstr "" + +#: admin/wp-security-user-login-menu.php:713 +msgid "Currently logged in users" +msgstr "" + +#: admin/wp-security-user-login-menu.php:761 +msgid "WordPress 5.6 introduced a new feature called \"Application passwords\"." +msgstr "" + +#: admin/wp-security-user-login-menu.php:762 +msgid "This allows you to create a token from the WordPress dashboard which then can be used in the authorization header." +msgstr "" + +#: admin/wp-security-user-login-menu.php:763 +msgid "This feature allows you to disable application passwords as they can leave your site vulnerable to social engineering and phishing scams." +msgstr "" + +#: admin/wp-security-user-login-menu.php:780 +#: classes/grade-system/wp-security-feature-item-manager.php:53 +msgid "Disable application password" +msgstr "" + +#: admin/wp-security-user-login-menu.php:783 +msgid "Check this if you want to disable the application password." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:27 +msgid "Manual approval" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:28 +#: classes/grade-system/wp-security-feature-item-manager.php:59 +msgid "Registration CAPTCHA" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:29 +msgid "Registration honeypot" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:55 +msgid "User registration" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:115 +msgid "User registration settings" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:119 +msgid "Manually approve new registrations" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:123 +msgid "If your site allows people to create their own accounts via the WordPress registration form, then you can minimize spam or bogus registrations by manually approving each registration." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:124 +msgid "This feature will automatically set a newly registered account to \"pending\" until the administrator activates it. Therefore undesirable registrants will be unable to log in without your express approval." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:125 +msgid "You can view all accounts which have been newly registered via the handy table below and you can also perform bulk activation/deactivation/deletion tasks on each account." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:142 +msgid "Enable manual approval of new registrations" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:145 +msgid "Check this if you want to automatically disable all newly registered accounts so that you can approve them manually." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:154 +msgid "Approve registered users" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:206 +msgid "This feature allows you to add a CAPTCHA form on the WordPress registration page." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:207 +msgid "Users who attempt to register will also need to enter the answer to a simple mathematical question - if they enter the wrong answer, the plugin will not allow them to register." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:208 +msgid "Therefore, adding a CAPTCHA form on the registration page is another effective yet simple spam registration prevention technique." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:212 +msgid "Registration page CAPTCHA settings" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:219 +msgid "The core default behaviour for WordPress Multi Site regarding user registration is that all users are registered via the main site." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:220 +msgid "Therefore, if you would like to add a CAPTCHA form to the registration page for a Multi Site, please go to \"Registration CAPTCHA\" settings on the main site." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:235 +msgid "Enable CAPTCHA on registration page" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:238 +msgid "Check this if you want to insert a CAPTCHA form on the WordPress user registration page (if you allow user registration)." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:276 +msgid "This feature allows you to add a special hidden \"honeypot\" field on the WordPress registration page. This will only be visible to robots and not humans." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:277 +msgid "Since robots usually fill in every input field from a registration form, they will also submit a value for the special hidden honeypot field." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:279 +msgid "Therefore, if the plugin detects that this field has a value when the registration form is submitted, then the robot which is attempting to register on your site will be redirected to its localhost address - http://127.0.0.1." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:285 +msgid "Registration form honeypot settings" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:296 +msgid "Enable honeypot on registration page" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:299 +msgid "Check this if you want to enable the honeypot feature for the registration page" +msgstr "" + +#: classes/aios-ajax.php:89 +msgid "Invalid IP retrieve method." +msgstr "" + +#: classes/aios-ajax.php:131 +#: wp-security-core.php:258 +msgid "The security check failed; try refreshing the page." +msgstr "" + +#: classes/aios-ajax.php:152 +#: wp-security-core.php:268 +msgid "You are not allowed to run this command." +msgstr "" + +#: classes/aios-ajax.php:173 +#: wp-security-core.php:282 +msgid "Options can only be saved by network admin" +msgstr "" + +#: classes/aios-ajax.php:202 +msgid "The command \"%s\" was not found" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:39 +msgid "Remove WP generator meta tag" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:45 +msgid "Change display name" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:57 +msgid "Registration approval" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:61 +msgid "Enable registration honeypot" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:73 +msgid "WordPress files access" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:77 +msgid "IP and user agent blacklisting" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:81 +msgid "Enable basic firewall" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:82 +msgid "Enable pingback vulnerability protection" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:83 +msgid "Block access to debug log file" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:87 +msgid "Forbid proxy comments" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:88 +msgid "Deny bad queries" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:91 +msgid "5G/6G blacklist" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:97 +msgid "Enable IP blocking for 404 detection" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:101 +msgid "Enable rename login page" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:106 +msgid "Lost password CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:107 +msgid "Custom login CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:108 +msgid "Woo login CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:109 +msgid "Woo lost password CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:110 +msgid "Woo register CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:112 +msgid "Login IP whitelisting" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:114 +msgid "Enable login honeypot" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:118 +msgid "Comment CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:119 +msgid "Block spambots" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:121 +msgid "BuddyPress registration CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:123 +msgid "bbPress new topic CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item.php:29 +msgid "Basic" +msgstr "" + +#: classes/grade-system/wp-security-feature-item.php:31 +msgid "Intermediate" +msgstr "" + +#: classes/grade-system/wp-security-feature-item.php:33 +msgid "Advanced" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:47 +#: classes/wp-security-general-init-tasks.php:407 +msgid "Please enter an answer in digits:" +msgstr "Podaj wynik (liczba):" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:127 +msgid "one" +msgstr "jeden" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:128 +msgid "two" +msgstr "dwa" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:129 +msgid "three" +msgstr "trzy" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:130 +msgid "four" +msgstr "cztery" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:131 +msgid "five" +msgstr "pięć" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:132 +msgid "six" +msgstr "sześć" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:133 +msgid "seven" +msgstr "siedem" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:134 +msgid "eight" +msgstr "osiem" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:135 +msgid "nine" +msgstr "dziewięć" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:136 +msgid "ten" +msgstr "dziesięć" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:137 +msgid "eleven" +msgstr "jedenaście" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:138 +msgid "twelve" +msgstr "dwanaście" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:139 +msgid "thirteen" +msgstr "trzynaście" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:140 +msgid "fourteen" +msgstr "czternaście" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:141 +msgid "fifteen" +msgstr "piętnaście" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:142 +msgid "sixteen" +msgstr "szesnaście" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:143 +msgid "seventeen" +msgstr "siedemnaście" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:144 +msgid "eighteen" +msgstr "osiemnaście" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:145 +msgid "nineteen" +msgstr "dziewiętnaście" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-captcha.php:146 +msgid "twenty" +msgstr "dwadzieścia" + +#: classes/wp-security-cronjob-handler.php:34 +msgid "Every 15 minutes" +msgstr "" + +#: classes/wp-security-debug-logger.php:46 +msgid "Unable to get the reason why" +msgstr "" + +#: classes/wp-security-debug-logger.php:47 +msgid "Unable to clear the logs" +msgstr "" + +#: classes/wp-security-file-scan.php:85 +msgid "All In One WP Security - File change detected!" +msgstr "" + +#: classes/wp-security-file-scan.php:87 +msgid "A file change was detected on your system for site URL" +msgstr "" + +#: classes/wp-security-file-scan.php:87 +msgid ". Scan was generated on" +msgstr "" + +#: classes/wp-security-file-scan.php:88 +msgid "A summary of the scan results is shown below:" +msgstr "" + +#: classes/wp-security-file-scan.php:91 +msgid "Login to your site to view the scan details." +msgstr "" + +#: classes/wp-security-file-scan.php:313 +msgid "The following files were added to your host" +msgstr "" + +#: classes/wp-security-file-scan.php:315 +#: classes/wp-security-file-scan.php:323 +#: classes/wp-security-file-scan.php:332 +msgid "modified on: " +msgstr "" + +#: classes/wp-security-file-scan.php:321 +msgid "The following files were removed from your host" +msgstr "" + +#: classes/wp-security-file-scan.php:330 +msgid "The following files were changed on your host" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:212 +#: classes/wp-security-general-init-tasks.php:481 +msgid "Application passwords have been disabled by All In One WP Security & Firewall plugin." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:428 +#: classes/wp-security-general-init-tasks.php:541 +#: classes/wp-security-general-init-tasks.php:574 +#: classes/wp-security-user-login.php:137 +#: classes/wp-security-user-registration.php:74 +msgid "ERROR: Your answer was incorrect - please try again." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:463 +msgid "Enter something special:" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:476 +msgid "Application passwords" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:485 +msgid "Change setting" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:487 +msgid "Site admin can only change this setting." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:516 +msgid "Error: You entered an incorrect CAPTCHA answer. Please go back and try again." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:558 +msgid "Your CAPTCHA answer was incorrect - please try again." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:567 +msgid "ERROR: Your IP address is currently locked please contact the administrator!" +msgstr "" + +#. translators: %s: Admin Dashboard > WP Security > Brute Force > Login CAPTCHA Tab Link +#: classes/wp-security-general-init-tasks.php:642 +msgid "Your Google reCAPTCHA site key is wrong. Please fill the correct reCAPTCHA keys %s to use the Google reCAPTCHA feature." +msgstr "" + +#. translators: %s: Admin Dashboard > WP Security > Brute Force > Login CAPTCHA Tab Link +#: classes/wp-security-general-init-tasks.php:642 +#: classes/wp-security-notices.php:99 +msgid "here" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +msgid "Would you like All In One WP Security & Firewall to re-insert the security rules in your .htaccess file which were cleared when you deactivated the plugin?" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +#: templates/may-also-like.php:40 +#: templates/may-also-like.php:43 +#: templates/may-also-like.php:54 +#: templates/may-also-like.php:57 +#: templates/may-also-like.php:68 +#: templates/may-also-like.php:71 +#: templates/may-also-like.php:91 +#: templates/may-also-like.php:103 +#: templates/may-also-like.php:115 +#: templates/may-also-like.php:127 +#: templates/may-also-like.php:139 +#: templates/may-also-like.php:151 +#: templates/may-also-like.php:168 +#: templates/may-also-like.php:171 +#: templates/may-also-like.php:183 +#: templates/may-also-like.php:195 +#: templates/may-also-like.php:207 +#: templates/may-also-like.php:219 +#: templates/may-also-like.php:231 +#: templates/may-also-like.php:243 +#: templates/may-also-like.php:252 +#: templates/may-also-like.php:255 +#: templates/may-also-like.php:264 +#: templates/may-also-like.php:267 +#: templates/may-also-like.php:279 +#: templates/may-also-like.php:297 +#: templates/may-also-like.php:309 +#: templates/may-also-like.php:327 +#: templates/may-also-like.php:339 +#: templates/may-also-like.php:351 +#: templates/may-also-like.php:368 +#: templates/may-also-like.php:380 +msgid "Yes" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +#: templates/may-also-like.php:88 +#: templates/may-also-like.php:100 +#: templates/may-also-like.php:112 +#: templates/may-also-like.php:124 +#: templates/may-also-like.php:136 +#: templates/may-also-like.php:148 +#: templates/may-also-like.php:180 +#: templates/may-also-like.php:192 +#: templates/may-also-like.php:204 +#: templates/may-also-like.php:216 +#: templates/may-also-like.php:228 +#: templates/may-also-like.php:240 +#: templates/may-also-like.php:276 +#: templates/may-also-like.php:294 +#: templates/may-also-like.php:306 +#: templates/may-also-like.php:324 +#: templates/may-also-like.php:336 +#: templates/may-also-like.php:348 +#: templates/may-also-like.php:365 +#: templates/may-also-like.php:377 +#: templates/notices/custom-notice.php:27 +msgid "No" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:674 +msgid "Your registration is pending approval." +msgstr "" + +#: classes/wp-security-notices.php:25 +msgid "The All in One Security plugin has disabled the login whitelist setting that you have enabled in the past." +msgstr "" + +#: classes/wp-security-notices.php:29 +msgid "Your website is running on an Apache webserver, the login whitelisting might not be functional until the recent update of AIOS (because it relied upon Apache-specific module features)." +msgstr "" + +#: classes/wp-security-notices.php:31 +msgid "Your website is running on a non-Apache webserver, so the login whitelisting was not functional until the recent update of AIOS (because it relied upon Apache-specific features)." +msgstr "" + +#: classes/wp-security-notices.php:33 +msgid "It began working with AIOS version 5.0.8." +msgstr "" + +#: classes/wp-security-notices.php:33 +msgid "We have disabled it so that your login page will not be blocked unexpectedly." +msgstr "" + +#: classes/wp-security-notices.php:42 +msgid "Would you like to re-enable login whitelisting?" +msgstr "" + +#: classes/wp-security-notices.php:48 +msgid "Removed database backup feature from the All In One WP Security & Firewall plugin" +msgstr "" + +#: classes/wp-security-notices.php:50 +msgid "Beginning with version 5.0.0, AIOS has replaced the AIOS backup method with the superior UpdraftPlus method." +msgstr "" + +#: classes/wp-security-notices.php:51 +msgid "It remains free and is fully supported by the UpdraftPlus team." +msgstr "" + +#: classes/wp-security-notices.php:54 +msgid "You are seeing this notice because you have previously set up automated database backups in AIOS." +msgstr "" + +#: classes/wp-security-notices.php:55 +msgid "Would you like to set up scheduled backups with UpdraftPlus?" +msgstr "" + +#: classes/wp-security-notices.php:61 +msgid "Setup UpdraftPlus backup plugin" +msgstr "" + +#: classes/wp-security-notices.php:67 +msgid "Important: set up your IP address detection settings" +msgstr "" + +#: classes/wp-security-notices.php:69 +msgid "The All in One Security plugin couldn't be certain about the correct method to detect the IP address for your site visitors with your currently-configured IP address detection settings." +msgstr "" + +#: classes/wp-security-notices.php:70 +msgid "It is important for your security to set the IP address detection settings properly." +msgstr "" + +#: classes/wp-security-notices.php:73 +msgid "Please go to the settings and set them now." +msgstr "" + +#: classes/wp-security-notices.php:79 +msgid "Setup IP address detection settings" +msgstr "" + +#: classes/wp-security-notices.php:85 +msgid "Important: Disabled login whitelist setting" +msgstr "" + +#: classes/wp-security-notices.php:91 +msgid "Turn it back on" +msgstr "" + +#: classes/wp-security-notices.php:92 +msgid "Edit the settings" +msgstr "" + +#: classes/wp-security-notices.php:95 +msgid "Keep it off" +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Hey - We noticed All In One WP Security & Firewall has kept your site safe for a while. If you like us, please consider leaving a positive review to spread the word. Or if you have any issues or questions please leave us a support message %s." +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Thank you so much!" +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Team All In One WP Security & Firewall" +msgstr "" + +#: classes/wp-security-notices.php:109 +msgid "Enhance your security even more by backing up your site" +msgstr "" + +#: classes/wp-security-notices.php:110 +msgid "UpdraftPlus is the world's most trusted backup plugin from the owners of All In One WP Security & Firewall" +msgstr "" + +#: classes/wp-security-notices.php:121 +msgid "After you've secured your site, we recommend you install our WP-Optimize plugin to streamline it for better website performance." +msgstr "" + +#: classes/wp-security-process-renamed-login-page.php:152 +msgid "Not available." +msgstr "" + +#: classes/wp-security-two-factor-login.php:34 +msgid "Two factor authentication - Admin settings" +msgstr "" + +#: classes/wp-security-two-factor-login.php:97 +msgid "Two Factor Auth" +msgstr "" + +#: classes/wp-security-two-factor-login.php:153 +msgid "PHP OpenSSL or mcrypt module required" +msgstr "" + +#: classes/wp-security-two-factor-login.php:153 +msgid "The All In One WP Security plugin's Two Factor Authentication module requires either the PHP openssl (preferred) or mcrypt module to be installed. Please ask your web hosting company to install one of them." +msgstr "" + +#: classes/wp-security-user-login.php:71 +msgid "You have disabled login lockout by defining the AIOS_DISABLE_LOGIN_LOCKOUT constant value as true, and the login lockout setting has enabled it." +msgstr "" + +#. translators: 1: Locked IP Addresses admin page link +#: classes/wp-security-user-login.php:73 +msgid "Delete your login lockout IP from %s and define the AIOS_DISABLE_LOGIN_LOCKOUT constant value as false." +msgstr "" + +#: classes/wp-security-user-login.php:100 +msgid "ERROR: Access from your IP address has been blocked for security reasons. Please contact the administrator." +msgstr "" + +#: classes/wp-security-user-login.php:108 +msgid "Service temporarily unavailable" +msgstr "" + +#: classes/wp-security-user-login.php:163 +msgid "ACCOUNT PENDING: Your account is currently not active. An administrator needs to activate your account before you can login." +msgstr "" + +#: classes/wp-security-user-login.php:242 +msgid "ERROR: Invalid login credentials." +msgstr "" + +#: classes/wp-security-user-login.php:392 +msgid "Site Lockout Notification" +msgstr "" + +#: classes/wp-security-user-login.php:393 +msgid "User login lockout events had occurred due to too many failed login attempts or invalid username:" +msgstr "" + +#: classes/wp-security-user-login.php:396 +msgid "Username:" +msgstr "" + +#: classes/wp-security-user-login.php:397 +msgid "IP address:" +msgstr "" + +#: classes/wp-security-user-login.php:399 +msgid "IP range:" +msgstr "" + +#: classes/wp-security-user-login.php:404 +msgid "Log into your site WordPress administration panel to see the duration of the lockout or to unlock the user." +msgstr "" + +#: classes/wp-security-user-login.php:515 +msgid "Unlock request notification" +msgstr "" + +#: classes/wp-security-user-login.php:516 +msgid "You have requested for the account with email address %s to be unlocked. Please click the link below to unlock your account:" +msgstr "" + +#: classes/wp-security-user-login.php:516 +msgid "Unlock link: %s" +msgstr "" + +#: classes/wp-security-user-login.php:516 +msgid "After clicking the above link you will be able to login to the WordPress administration panel." +msgstr "" + +#: classes/wp-security-user-login.php:739 +msgid "Your session has expired because it has been over %d minutes since your last login." +msgstr "" + +#: classes/wp-security-user-login.php:740 +#: classes/wp-security-user-login.php:744 +msgid "Please log back in to continue." +msgstr "" + +#: classes/wp-security-user-login.php:743 +msgid "You were logged out because you just changed the \"admin\" username." +msgstr "" + +#: classes/wp-security-user-login.php:773 +msgid "Request unlock" +msgstr "" + +#: classes/wp-security-user-registration.php:68 +msgid "ERROR: You are not allowed to register because your IP address is currently locked!" +msgstr "" + +#: classes/wp-security-utility-ip-address.php:217 +#: classes/wp-security-utility-ip-address.php:231 +#: classes/wp-security-utility-ip-address.php:245 +#: classes/wp-security-utility-ip-address.php:257 +#: classes/wp-security-utility-ip-address.php:269 +msgid " is not a valid ip address format." +msgstr "" + +#: classes/wp-security-utility-ip-address.php:274 +msgid "You cannot ban your own IP address: " +msgstr "" + +#: classes/wp-security-utility.php:254 +msgid "This feature can only be configured by the \"superadmin\" on the main site." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:32 +msgid "ERROR: Unable to process your request!" +msgstr "" + +#: other-includes/wp-security-unlock-request.php:45 +msgid "Please enter a valid email address" +msgstr "" + +#: other-includes/wp-security-unlock-request.php:57 +msgid "User account not found!" +msgstr "" + +#: other-includes/wp-security-unlock-request.php:71 +msgid "Error: No locked entry was found in the database with your IP address range." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:76 +msgid "An email has been sent to you with the unlock instructions." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:93 +msgid "You are here because you have been locked out due to too many incorrect login attempts." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:94 +msgid "Please enter your email address and you will receive an email with instructions on how to unlock yourself." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:104 +msgid "Email Address" +msgstr "" + +#: other-includes/wp-security-unlock-request.php:108 +msgid "Send unlock request" +msgstr "" + +#: templates/admin/incompatible-plugin.php:6 +msgid "Two Factor Authentication" +msgstr "" + +#: templates/admin/incompatible-plugin.php:10 +msgid "Two Factor Authentication currently disabled" +msgstr "" + +#: templates/admin/incompatible-plugin.php:12 +#: templates/admin/incompatible-plugin.php:16 +msgid "Two factor authentication in All In One WP Security is currently disabled because the incompatible plugin %s is active." +msgstr "" + +#: templates/automated-database-backup.php:4 +msgid "Automated scheduled backups" +msgstr "" + +#: templates/automated-database-backup.php:9 +msgid "Automate backup in the UpdraftPlus plugin" +msgstr "" + +#: templates/automated-database-backup.php:19 +msgid "The AIOS 5.0.0 version release has removed the automated backup feature." +msgstr "" + +#: templates/automated-database-backup.php:20 +msgid "The AIOS automated backup had issues that made it less robust than we could be happy with." +msgstr "" + +#: templates/automated-database-backup.php:21 +msgid "Follow this link to automate backups in the superior UpdraftPlus backup plugin." +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:5 +msgid "Each IP address must be on a new line." +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:6 +msgid "To specify an IPv4 range use a wildcard \"*\" character. Acceptable ways to use wildcards is shown in the examples below:" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:7 +msgid "Example 1: 195.47.89.*" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:8 +msgid "Example 2: 195.47.*.*" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:9 +msgid "Example 3: 195.*.*.*" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:10 +msgid "To specify an IPv6 range use CIDR format as shown in the examples below:" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:11 +msgid "Example 4: 2401:4900:54c3:af15:2:2:5dc0:0/112" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:12 +msgid "Example 5: 2001:db8:1263::/48" +msgstr "" + +#: templates/may-also-like.php:5 +msgid "All-In-One Security (AIOS) Free vs Premium Comparison Chart" +msgstr "" + +#: templates/may-also-like.php:7 +msgid "FAQs" +msgstr "" + +#: templates/may-also-like.php:9 +msgid "Ask a pre-sales question" +msgstr "" + +#: templates/may-also-like.php:17 +msgid "All In One WP Security & Firewall Free" +msgstr "" + +#: templates/may-also-like.php:26 +#: templates/may-also-like.php:386 +msgid "Installed" +msgstr "" + +#: templates/may-also-like.php:29 +#: templates/may-also-like.php:389 +msgid "Upgrade now" +msgstr "" + +#: templates/may-also-like.php:34 +msgid "Login security feature suite" +msgstr "" + +#: templates/may-also-like.php:35 +msgid "Protect against brute-force attacks and keep bots at bay." +msgstr "" + +#: templates/may-also-like.php:35 +msgid "AIOS takes WordPress' default login security features to a whole new level." +msgstr "" + +#: templates/may-also-like.php:37 +msgid "To see all login security features, visit %s" +msgstr "" + +#: templates/may-also-like.php:48 +msgid "Firewall and file protection feature suite" +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Protection from the latest exploits." +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Activate firewall settings ranging from basic, intermediate and advanced." +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Get comprehensive, instant protection with All-in-One Security." +msgstr "" + +#: templates/may-also-like.php:51 +msgid "To see all firewall and file protection features, visit %s" +msgstr "" + +#: templates/may-also-like.php:62 +msgid "Content protection feature suite" +msgstr "" + +#: templates/may-also-like.php:63 +msgid "Eliminate spam and protect your content to dramatically improve your website's interactions with search engines." +msgstr "" + +#: templates/may-also-like.php:65 +msgid "To see all content protection features, visit %s" +msgstr "" + +#: templates/may-also-like.php:76 +msgid "Malware scanning" +msgstr "" + +#: templates/may-also-like.php:77 +msgid "Finding out by accident that your site has been infected with malware is too late." +msgstr "" + +#: templates/may-also-like.php:79 +msgid "Malware can have a dramatic effect on your site's search rankings and you may not even know about it." +msgstr "" + +#: templates/may-also-like.php:79 +msgid "It can slow your website down, access customer data, send unsolicited emails, change your content or prevent users from accessing it." +msgstr "" + +#: templates/may-also-like.php:84 +msgid "Automatic malware scanning" +msgstr "" + +#: templates/may-also-like.php:85 +msgid "Best-in-class scanning for the latest malware, trojans and spyware 24/7." +msgstr "" + +#: templates/may-also-like.php:96 +msgid "Response time monitoring" +msgstr "" + +#: templates/may-also-like.php:97 +msgid "You'll know immediately if your website's response time is negatively affected." +msgstr "" + +#: templates/may-also-like.php:108 +msgid "Up-time monitoring" +msgstr "" + +#: templates/may-also-like.php:109 +msgid "AIOS checks your website's uptime every 5 minutes." +msgstr "" + +#: templates/may-also-like.php:109 +msgid "We'll notify you straight away if your site/server goes down." +msgstr "" + +#: templates/may-also-like.php:120 +msgid "Prevents blacklisting by search engines" +msgstr "" + +#: templates/may-also-like.php:121 +msgid "AIOS monitors your site's blacklist status daily." +msgstr "" + +#: templates/may-also-like.php:121 +msgid "We'll notify you within 24 hours if something's amiss so you can take action, before it's too late." +msgstr "" + +#: templates/may-also-like.php:132 +msgid "Flexible assignment" +msgstr "" + +#: templates/may-also-like.php:133 +msgid "Register and remove websites from the scanning service at any time." +msgstr "" + +#: templates/may-also-like.php:144 +msgid "Malware reports" +msgstr "" + +#: templates/may-also-like.php:145 +msgid "Reports are available via the 'My Account' page and directly via email." +msgstr "" + +#: templates/may-also-like.php:156 +msgid "Flexible two-factor authentication" +msgstr "" + +#: templates/may-also-like.php:157 +msgid "With Two-Factor Authentication (TFA) users enter their username and password and a one-time code sent to a device to login." +msgstr "" + +#: templates/may-also-like.php:159 +msgid "TFA is a feature in both our free and premium packages, but AIOS Premium affords whole new levels of control over how TFA is implemented." +msgstr "" + +#: templates/may-also-like.php:164 +msgid "Authenticator apps" +msgstr "" + +#: templates/may-also-like.php:165 +msgid "Supports TOTP and HOTP protocols." +msgstr "" + +#: templates/may-also-like.php:165 +msgid "TFA Can be used with Google Authenticator, Microsoft Authenticator, Authy and many more." +msgstr "" + +#: templates/may-also-like.php:176 +msgid "Role specific configuration" +msgstr "" + +#: templates/may-also-like.php:177 +msgid "Make it compulsory for certain roles e.g. for admin and editor roles." +msgstr "" + +#: templates/may-also-like.php:188 +msgid "Require TFA after a set time period" +msgstr "" + +#: templates/may-also-like.php:189 +msgid "For example you could require all admins to have TFA once their accounts are a week old." +msgstr "" + +#: templates/may-also-like.php:200 +msgid "Trusted devices - control how often TFA is required" +msgstr "" + +#: templates/may-also-like.php:201 +msgid "Ask for TFA after a chosen number of days for trusted devices instead of on every login." +msgstr "" + +#: templates/may-also-like.php:212 +msgid "Anti-bot protection" +msgstr "" + +#: templates/may-also-like.php:213 +msgid "Option to hide the existence of forms on WooCommerce login pages unless JavaScript is active." +msgstr "" + +#: templates/may-also-like.php:224 +msgid "Customise TFA design layout" +msgstr "" + +#: templates/may-also-like.php:225 +msgid "Customise the design of TFA so it aligns with your existing web design." +msgstr "" + +#: templates/may-also-like.php:236 +msgid "TFA emergency codes" +msgstr "" + +#: templates/may-also-like.php:237 +msgid "Generate a one-time use emergency code to allow access if your device is lost." +msgstr "" + +#: templates/may-also-like.php:248 +msgid "TFA multisite compatibility" +msgstr "" + +#: templates/may-also-like.php:249 +msgid "TFA is Compatible with multisite networks and sub-sites." +msgstr "" + +#: templates/may-also-like.php:260 +msgid "TFA support for common login forms" +msgstr "" + +#: templates/may-also-like.php:261 +msgid "Supports WooCommerce, Affiliates-WP and Theme my Login login forms." +msgstr "" + +#: templates/may-also-like.php:272 +msgid "TFA support for other login forms" +msgstr "" + +#: templates/may-also-like.php:273 +msgid "Supports Elementor Pro, bbPress and all third-party login forms without any further coding needed." +msgstr "" + +#: templates/may-also-like.php:284 +msgid "Smart 404 blocking" +msgstr "" + +#: templates/may-also-like.php:285 +msgid "404 errors can occur when someone legitimately mistypes a URL, but they're also generated by hackers searching for weaknesses in your site." +msgstr "" + +#: templates/may-also-like.php:290 +msgid "Automatically and permanently blocks bots producing 404s" +msgstr "" + +#: templates/may-also-like.php:291 +msgid "AIOS Premium provides more protection than the competition by automatically and permanently blocking IP addresses of bots and hackers based on how many 404 errors they generate." +msgstr "" + +#: templates/may-also-like.php:302 +msgid "404 error charts" +msgstr "" + +#: templates/may-also-like.php:303 +msgid "Handy charts keep you informed of how many 404s have occurred and which IP address or country is producing them." +msgstr "" + +#: templates/may-also-like.php:314 +msgid "Country blocking" +msgstr "" + +#: templates/may-also-like.php:315 +msgid "Most malicious attacks come from a handful of countries and so it's possible to prevent most attacks with our country blocking tool." +msgstr "" + +#: templates/may-also-like.php:320 +msgid "Block traffic based on country of origin" +msgstr "" + +#: templates/may-also-like.php:321 +msgid "AIOS Premium utilises an IP database that promises 99.5% accuracy." +msgstr "" + +#: templates/may-also-like.php:332 +msgid "Block traffic to specific pages based on country of origin" +msgstr "" + +#: templates/may-also-like.php:333 +msgid "Block access to your whole site or on a page-by-page basis." +msgstr "" + +#: templates/may-also-like.php:344 +msgid "Whitelist some users from blocked countries" +msgstr "" + +#: templates/may-also-like.php:345 +msgid "Whitelist IP addresses or IP ranges even if they are part of a blocked country." +msgstr "" + +#: templates/may-also-like.php:356 +msgid "Premium support" +msgstr "" + +#: templates/may-also-like.php:361 +msgid "Unlimited support" +msgstr "" + +#: templates/may-also-like.php:362 +msgid "Personalised, email support from our team of Security experts, as and when you need it." +msgstr "" + +#: templates/may-also-like.php:373 +msgid "Guaranteed response time" +msgstr "" + +#: templates/may-also-like.php:374 +msgid "We offer a guaranteed response time of three days." +msgstr "" + +#: templates/may-also-like.php:374 +msgid "99% of our Premium customers receive a response to their enquiry within 24 hours during the working week." +msgstr "" + +#: templates/may-also-like.php:397 +msgid "Our other plugins" +msgstr "" + +#: templates/may-also-like.php:411 +msgid "UpdraftPlus – the ultimate protection for your site, hard work and business" +msgstr "" + +#: templates/may-also-like.php:412 +msgid "Simplifies backups and restoration." +msgstr "" + +#: templates/may-also-like.php:412 +msgid "It is the world's highest ranking and most popular scheduled backup plugin, with over three million currently-active installs." +msgstr "" + +#: templates/may-also-like.php:413 +#: templates/may-also-like.php:419 +#: templates/may-also-like.php:425 +#: templates/may-also-like.php:431 +msgid "Try for free" +msgstr "" + +#: templates/may-also-like.php:417 +msgid "WP-Optimize – keep your database fast and efficient" +msgstr "" + +#: templates/may-also-like.php:418 +msgid "Makes your site fast and efficient." +msgstr "" + +#: templates/may-also-like.php:418 +msgid "It cleans the database, compresses images and caches pages for ultimate speed." +msgstr "" + +#: templates/may-also-like.php:423 +msgid "UpdraftCentral – save hours managing multiple WP sites from one place" +msgstr "" + +#: templates/may-also-like.php:424 +msgid "Highly efficient way to manage, optimize, update and backup multiple websites from one place." +msgstr "" + +#: templates/may-also-like.php:429 +msgid "Easy Updates Manager" +msgstr "" + +#: templates/may-also-like.php:430 +msgid "Keeps your WordPress site up to date and bug free." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:2 +msgid "IP address detection settings" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:6 +msgid "The IP address detection settings allow you to specify how visitors' IP addresses are made known to PHP (and hence to WordPress and its plugins)." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:7 +msgid "Usually, this is automatic and there is only one choice." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:8 +msgid "However in some setups, such as those using proxies (including load-balancers and security firewalls like Cloudflare), it may be necessary to set this manually." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:9 +msgid "Attention" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:9 +msgid "It is important to set this correctly - otherwise you may make it possible for a hacker to ban all your visitors (e.g. via banning Cloudflare from connecting to you) instead of being banned himself." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:9 +msgid "The default is to use the REMOTE_ADDR PHP server variable. If this variable does not contain the visitor's IP address, then whilst you can make a different selection below, it is better to ask your web hosting company to have it correctly set." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:10 +msgid "This is the most secure setup, because when set correctly it is immune from being spoofed by an attacker." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:16 +msgid "You have no available IP address detection method(s); you must contact your web hosting company." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:22 +#: templates/menus/settings/advanced-settings.php:27 +#: templates/menus/settings/advanced-settings.php:32 +msgid "Your detected IP address according to %s:" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:38 +msgid "If your site is setup on localhost, you won't see your external IP address using your server's IP detection setting; but on a localhost-served site (not available to the outside world), the setting is irrelevant and can be ignored." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:61 +msgid "Choose a $_SERVER variable you would like to detect visitors' IP address using." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:67 +msgid "If your chosen server variable fails the plugin will automatically fall back to retrieving the IP address from $_SERVER[\"REMOTE_ADDR\"]" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:73 +msgid "Your IP address if using this setting:" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:75 +msgid "fetching..." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:81 +#: templates/menus/settings/advanced-settings.php:190 +msgid "getting..." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:89 +msgid "look-up possibly blocked by an ad-blocker or similar tool" +msgstr "" + +#: templates/notices/cookie-based-brute-force-prevention-disabled.php:4 +msgid "Cookie based brute force login prevention currently disabled" +msgstr "" + +#: templates/notices/cookie-based-brute-force-prevention-disabled.php:6 +msgid "Cookie based brute force login prevention is currently disabled via the AIOS_DISABLE_COOKIE_BRUTE_FORCE_PREVENTION constant (which is mostly likely to be defined in your wp-config.php)" +msgstr "" + +#: templates/notices/disable-login-whitelist.php:4 +msgid "Login whitelisting currently disabled" +msgstr "" + +#: templates/notices/disable-login-whitelist.php:6 +msgid "Login whitelisting is currently disabled via the AIOS_DISABLE_LOGIN_WHITELIST constant (which is mostly likely to be defined in your wp-config.php)" +msgstr "" + +#: templates/notices/horizontal-notice.php:8 +#: templates/notices/horizontal-notice.php:40 +msgid "notice image" +msgstr "" + +#: templates/notices/horizontal-notice.php:18 +msgid "Ok, you deserve it" +msgstr "" + +#: templates/notices/horizontal-notice.php:22 +msgid "Maybe later" +msgstr "" + +#: templates/notices/horizontal-notice.php:26 +msgid "Never" +msgstr "" + +#: templates/notices/horizontal-notice.php:66 +msgid "Get UpdraftCentral" +msgstr "" + +#: templates/notices/horizontal-notice.php:68 +msgid "Get UpdraftPlus" +msgstr "" + +#: templates/notices/horizontal-notice.php:70 +msgid "Get WP-Optimize" +msgstr "" + +#: templates/notices/horizontal-notice.php:72 +msgid "Find out more." +msgstr "" + +#: templates/notices/horizontal-notice.php:74 +msgid "Sign up" +msgstr "" + +#: templates/notices/horizontal-notice.php:76 +msgid "Go there" +msgstr "" + +#: templates/notices/horizontal-notice.php:78 +msgid "Read more" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:4 +msgid "Dismiss (for %s months)" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:6 +msgid "Thank you for installing All In One WP Security & Firewall!" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:13 +msgid "Super-charge and secure your WordPress site even more with our other top plugins:" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:17 +msgid "%s makes your site fast and efficient. It cleans the database, compresses images and caches pages for ultimate speed." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:21 +msgid "%s simplifies backups and restoration. It is the world's highest ranking and most popular scheduled backup plugin, with over three million currently-active installs." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:25 +msgid "%s is a highly efficient way to manage, optimize, update and backup multiple websites from one place." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:29 +msgid "%s is a WordPress subscription extension for WooCommerce store owners." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:33 +msgid "More quality plugins" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:33 +msgid "Premium WooCommerce plugins" +msgstr "" + +#: templates/partials/non-apache-feature-notice.php:9 +msgid "This feature works only on the Apache server." +msgstr "" + +#: templates/partials/non-apache-feature-notice.php:10 +msgid "You are using the non-apache server %s, so this feature won't work on your site." +msgstr "" + +#: wp-security-core.php:236 +#: wp-security.php:45 +msgid "This plugin requires PHP version %s." +msgstr "" + +#: wp-security-core.php:237 +msgid "Current site PHP version is %s." +msgstr "" + +#: wp-security-core.php:238 +#: wp-security.php:47 +msgid "You will need to ask your web hosting company to upgrade." +msgstr "" + +#: wp-security-core.php:397 +msgid "Error:" +msgstr "" + +#: wp-security-core.php:397 +msgid "template not found" +msgstr "" + +#: wp-security.php:44 +msgid "All In One WP Security and Firewall plugin has been deactivated." +msgstr "" + +#: wp-security.php:46 +msgid "Your current PHP version is %s." +msgstr "" diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-pt_BR.mo b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-pt_BR.mo new file mode 100755 index 00000000..2e549237 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-pt_BR.mo differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-pt_BR.po b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-pt_BR.po new file mode 100755 index 00000000..f9f7fb83 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-pt_BR.po @@ -0,0 +1,5994 @@ +msgid "" +msgstr "" +"Project-Id-Version: All In One WP Security v4.0.7\n" +"POT-Creation-Date: 2016-04-14 11:14-0300\n" +"PO-Revision-Date: 2016-04-18 13:26-0300\n" +"Last-Translator: Gilvanilson Santos \n" +"Language-Team: GVSANTOS Group \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 1.8.7\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-KeywordsList: _:1;gettext:1;dgettext:2;ngettext:1,2;dngettext:2,3;__:1;_e:1;_c:1;_n:1,2;_n_noop:1,2;_nc:1,2;__ngettext:1,2;__ngettext_noop:1,2;_x:1,2c;_ex:1,2c;_nx:1,2,4c;_nx_noop:1,2,3c;_n_js:1,2;_nx_js:1,2,3c;esc_attr__:1;esc_html__:1;esc_attr_e:1;esc_html_e:1;esc_attr_x:1,2c;esc_html_x:1,2c;comments_number_link:2,3;t:1;st:1;trans:1;transChoice:1,2\n" +"X-Poedit-SearchPath-0: ../../plugins/all-in-one-wp-security-and-firewall\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Textdomain-Support: yes\n" + +#. Plugin Name of the plugin +msgid "All In One WP Security" +msgstr "" + +#. Plugin URI of the plugin +msgid "https://wordpress.org/plugins/all-in-one-wp-security-and-firewall/" +msgstr "" + +#. Description of the plugin +# @ all-in-one-wp-security-and-firewall +msgid "All round best WordPress security plugin!" +msgstr "Em todas as partes o melhor plugin de segurança WordPress!" + +#. Author of the plugin +msgid "All In One WP Security & Firewall Team" +msgstr "" + +#. Author URI of the plugin +msgid "https://teamupdraft.com/" +msgstr "" + +#: admin/general/wp-security-list-table.php:483 +msgid "Are you sure you want to perform this bulk action?" +msgstr "" + +#: admin/wp-security-admin-init.php:259 +msgid "Unexpected response:" +msgstr "" + +#: admin/wp-security-admin-init.php:290 +msgid "Enjoyed %1$s? Please leave us a %2$s rating. We really appreciate your support!" +msgstr "" + +#: admin/wp-security-admin-init.php:414 +#: classes/wp-security-two-factor-login.php:95 +msgid "WP Security" +msgstr "Segurança WP" + +#: admin/wp-security-admin-init.php:415 +#: admin/wp-security-dashboard-menu.php:26 +#: admin/wp-security-dashboard-menu.php:76 +msgid "Dashboard" +msgstr "Painel" + +#: admin/wp-security-admin-init.php:416 +#: admin/wp-security-settings-menu.php:95 +msgid "Settings" +msgstr "Configurações" + +#: admin/wp-security-admin-init.php:417 +msgid "User Accounts" +msgstr "Contas de usuários" + +#: admin/wp-security-admin-init.php:418 +msgid "User Login" +msgstr "Login de usuário" + +#: admin/wp-security-admin-init.php:419 +msgid "User Registration" +msgstr "Registro de usuário" + +#: admin/wp-security-admin-init.php:420 +msgid "Database Security" +msgstr "Segurança do DB" + +#: admin/wp-security-admin-init.php:424 +msgid "Filesystem Security" +msgstr "Segurança de arquivos" + +#: admin/wp-security-admin-init.php:429 +msgid "Blacklist Manager" +msgstr "Gerenciar lista negra" + +#: admin/wp-security-admin-init.php:434 +#: admin/wp-security-firewall-menu.php:60 +msgid "Firewall" +msgstr "Firewall" + +#: admin/wp-security-admin-init.php:436 +msgid "Brute Force" +msgstr "Força bruta" + +#: admin/wp-security-admin-init.php:437 +msgid "Spam Prevention" +msgstr "Prevenção SPAM" + +#: admin/wp-security-admin-init.php:441 +#: admin/wp-security-filescan-menu.php:53 +msgid "Scanner" +msgstr "Verificador" + +#: admin/wp-security-admin-init.php:443 +#: admin/wp-security-maintenance-menu.php:51 +msgid "Maintenance" +msgstr "Manutenção" + +#: admin/wp-security-admin-init.php:444 +#: admin/wp-security-misc-options-menu.php:57 +msgid "Miscellaneous" +msgstr "Diversos" + +#: admin/wp-security-admin-init.php:445 +#: admin/wp-security-tools-menu.php:64 +msgid "Tools" +msgstr "" + +#: admin/wp-security-admin-init.php:457 +msgid "Premium Upgrade" +msgstr "" + +#: admin/wp-security-admin-menu.php:67 +msgid "Settings successfully updated." +msgstr "Configurações autalizadas com sucesso." + +#: admin/wp-security-admin-menu.php:77 +msgid "Successfully deleted the selected record(s)." +msgstr "" + +#: admin/wp-security-admin-menu.php:86 +msgid "Failed to delete the selected record(s)." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:25 +msgid "Ban users" +msgstr "Usuários banidos" + +#: admin/wp-security-blacklist-menu.php:51 +msgid "Blacklist manager" +msgstr "Gerenciar lista negra" + +#: admin/wp-security-blacklist-menu.php:132 +#: admin/wp-security-firewall-menu.php:1233 +#: admin/wp-security-list-404.php:234 +#: admin/wp-security-list-comment-spammer-ip.php:205 +msgid "The plugin was unable to write to the .htaccess file. Please edit file manually." +msgstr "O plugin não foi capaz de gravar no arquivo .htaccess. Por favor, edite o arquivo manualmente." + +#: admin/wp-security-blacklist-menu.php:139 +msgid "Ban IPs or user agents" +msgstr "Banir IPs ou agentes de usuário" + +#: admin/wp-security-blacklist-menu.php:142 +msgid "The All In One WP Security Blacklist feature gives you the option of banning certain host IP addresses or ranges and also user agents." +msgstr "O recurso de lista negra do All In One WP Security lhe dá a opção de proibir determinados endereços IP de host ou intervalos e também agentes de usuário." + +#: admin/wp-security-blacklist-menu.php:143 +msgid "This feature will deny total site access for users which have IP addresses or user agents matching those which you have configured in the settings below." +msgstr "Este recurso irá negar o acesso total do local para os usuários que têm endereços IP ou os agentes de usuário correspondentes aos que você configurou nas configurações abaixo." + +#: admin/wp-security-blacklist-menu.php:144 +msgid "The plugin achieves this by making appropriate modifications to your .htaccess file." +msgstr "O plugin consegue isso fazendo modificações apropriadas ao seu arquivo .htaccess." + +#: admin/wp-security-blacklist-menu.php:145 +msgid "By blocking people, you are using the most secure first line of defence, which denies all access to blacklisted visitors as soon as they hit your hosting server." +msgstr "Ao bloquear as pessoas através do arquivo .htaccess você está usando a primeira linha mais seguro de defesa que nega todo o acesso a visitantes na lista negra, assim que atingirem o seu servidor de hospedagem." + +#: admin/wp-security-blacklist-menu.php:154 +#: admin/wp-security-firewall-menu.php:1055 +#: templates/may-also-like.php:20 +msgid "All In One WP Security & Firewall Premium" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:155 +#: admin/wp-security-firewall-menu.php:1056 +msgid "You may also be interested in %s." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "This plugin adds a number of extra features including %s and %s." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "smart 404 blocking" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "country IP blocking" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:170 +msgid "IP hosts and user agent blacklist settings" +msgstr "Hosts IP e configurações de lista negra de agente do usuário" + +#: admin/wp-security-blacklist-menu.php:182 +#: admin/wp-security-brute-force-menu.php:193 +#: admin/wp-security-brute-force-menu.php:331 +msgid "must read this message" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:183 +#: admin/wp-security-brute-force-menu.php:194 +msgid "This feature can lock you out of admin if it doesn't work correctly on your site. You %s before activating this feature." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:189 +msgid "Enable IP or user agent blacklisting" +msgstr "Habilitar IP ou agente de usuário obstrução na lista negra" + +#: admin/wp-security-blacklist-menu.php:192 +msgid "Check this if you want to enable the banning (or blacklisting) of selected IP addresses and/or user agents specified in the settings below" +msgstr "Marque esta opção se você deseja ativar a proibição (ou obstrução da lista negra) de endereços IP selecionados e / ou agentes de usuário especificados nas configurações abaixo" + +#: admin/wp-security-blacklist-menu.php:196 +msgid "Enter IP addresses:" +msgstr "Digite o endereço IP:" + +#: admin/wp-security-blacklist-menu.php:200 +msgid "Enter one or more IP addresses or IP ranges." +msgstr "Digite um ou mais endereços IP ou intervalos de IP." + +#: admin/wp-security-blacklist-menu.php:205 +msgid "Enter user agents:" +msgstr "Digite os agentes do usuário:" + +#: admin/wp-security-blacklist-menu.php:210 +msgid "Enter one or more user agent strings." +msgstr "Digite uma ou mais sequências de caracteres de agente de usuário." + +#: admin/wp-security-blacklist-menu.php:211 +#: admin/wp-security-brute-force-menu.php:374 +#: admin/wp-security-brute-force-menu.php:408 +#: admin/wp-security-brute-force-menu.php:431 +#: admin/wp-security-brute-force-menu.php:452 +#: admin/wp-security-filescan-menu.php:309 +#: admin/wp-security-filescan-menu.php:326 +#: admin/wp-security-firewall-menu.php:175 +#: admin/wp-security-firewall-menu.php:212 +#: admin/wp-security-firewall-menu.php:232 +#: admin/wp-security-firewall-menu.php:258 +#: admin/wp-security-firewall-menu.php:385 +#: admin/wp-security-firewall-menu.php:415 +#: admin/wp-security-firewall-menu.php:446 +#: admin/wp-security-firewall-menu.php:474 +#: admin/wp-security-firewall-menu.php:503 +#: admin/wp-security-firewall-menu.php:681 +#: admin/wp-security-firewall-menu.php:699 +#: admin/wp-security-firewall-menu.php:737 +#: admin/wp-security-firewall-menu.php:868 +#: admin/wp-security-firewall-menu.php:1087 +#: admin/wp-security-firewall-menu.php:1110 +#: admin/wp-security-spam-menu.php:186 +#: admin/wp-security-spam-menu.php:221 +#: admin/wp-security-spam-menu.php:390 +#: admin/wp-security-spam-menu.php:430 +#: admin/wp-security-user-login-menu.php:362 +#: templates/info/ip-address-ip-range-info.php:2 +#: templates/menus/settings/advanced-settings.php:63 +msgid "More info" +msgstr "Mais informação" + +#: admin/wp-security-blacklist-menu.php:214 +msgid "Each user agent string must be on a new line." +msgstr "Cada sequência do agente de usuário deve estar em uma nova linha." + +#: admin/wp-security-blacklist-menu.php:215 +msgid "Example 1 - A single user agent string to block:" +msgstr "Exemplo 1 - Uma sequência de caracteres de agente de usuário único para bloquear:" + +#: admin/wp-security-blacklist-menu.php:217 +msgid "Example 2 - A list of more than 1 user agent strings to block" +msgstr "Exemplo 2 - Uma lista de mais de 1 sequências de agente de usuário para bloquear" + +#: admin/wp-security-blacklist-menu.php:225 +#: admin/wp-security-brute-force-menu.php:213 +#: admin/wp-security-brute-force-menu.php:686 +#: admin/wp-security-brute-force-menu.php:806 +#: admin/wp-security-brute-force-menu.php:868 +#: admin/wp-security-filescan-menu.php:351 +#: admin/wp-security-filesystem-menu.php:242 +#: admin/wp-security-firewall-menu.php:945 +#: admin/wp-security-firewall-menu.php:1129 +#: admin/wp-security-misc-options-menu.php:167 +#: admin/wp-security-misc-options-menu.php:218 +#: admin/wp-security-misc-options-menu.php:278 +#: admin/wp-security-settings-menu.php:619 +#: admin/wp-security-settings-menu.php:680 +#: admin/wp-security-spam-menu.php:233 +#: admin/wp-security-spam-menu.php:407 +#: admin/wp-security-spam-menu.php:526 +#: admin/wp-security-spam-menu.php:588 +#: admin/wp-security-user-login-menu.php:384 +#: admin/wp-security-user-login-menu.php:422 +#: admin/wp-security-user-login-menu.php:601 +#: admin/wp-security-user-login-menu.php:788 +#: admin/wp-security-user-registration-menu.php:150 +#: admin/wp-security-user-registration-menu.php:242 +#: admin/wp-security-user-registration-menu.php:305 +#: templates/menus/settings/advanced-settings.php:217 +msgid "Save settings" +msgstr "Salvar configurações" + +#: admin/wp-security-brute-force-menu.php:33 +#: admin/wp-security-brute-force-menu.php:759 +#: admin/wp-security-dashboard-menu.php:651 +msgid "Rename login page" +msgstr "Renomeação da página de login" + +#: admin/wp-security-brute-force-menu.php:34 +#: admin/wp-security-brute-force-menu.php:154 +msgid "Cookie based brute force prevention" +msgstr "Prevenção baseadas em cookies de força bruta" + +#: admin/wp-security-brute-force-menu.php:35 +#: classes/grade-system/wp-security-feature-item-manager.php:105 +msgid "Login CAPTCHA" +msgstr "Captcha login" + +#: admin/wp-security-brute-force-menu.php:36 +#: admin/wp-security-brute-force-menu.php:746 +msgid "Login whitelist" +msgstr "Lista branca de login" + +#: admin/wp-security-brute-force-menu.php:37 +msgid "Honeypot" +msgstr "Pote de mel" + +#: admin/wp-security-brute-force-menu.php:67 +msgid "Brute force" +msgstr "Força bruta" + +#: admin/wp-security-brute-force-menu.php:105 +msgid "Please enter a value for your login page slug." +msgstr "Por favor, insira um valor para sua lesma/apelido da página de login." + +#: admin/wp-security-brute-force-menu.php:109 +msgid "You cannot use the value \"wp-admin\" for your login page slug." +msgstr "Você não pode usar o valor \"wp-admin\" para sua lesma/apelido da página de login." + +#: admin/wp-security-brute-force-menu.php:111 +msgid "You must use alpha numeric characters for your login page slug." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:116 +#: admin/wp-security-filescan-menu.php:174 +#: admin/wp-security-firewall-menu.php:151 +#: admin/wp-security-firewall-menu.php:1011 +#: admin/wp-security-spam-menu.php:101 +#: admin/wp-security-spam-menu.php:270 +#: admin/wp-security-spam-menu.php:302 +#: admin/wp-security-user-login-menu.php:184 +#: admin/wp-security-user-login-menu.php:553 +#: templates/partials/non-apache-feature-notice.php:9 +msgid "Attention:" +msgstr "Atenção:" + +#: admin/wp-security-brute-force-menu.php:133 +msgid "Could not delete the Cookie-based directives from the .htaccess file. Please check the file permissions." +msgstr "Não foi possível excluir as diretrizes baseadas em cookie do arquivo .htaccess. Por favor, verifique as permissões do arquivo." + +#: admin/wp-security-brute-force-menu.php:155 +msgid "Login page white list" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:156 +msgid "An effective Brute Force prevention technique is to change the default WordPress login page URL." +msgstr "Uma técnica eficaz para a prevenção de força bruta é alterar a URL padrão da página de login do WordPress." + +#: admin/wp-security-brute-force-menu.php:157 +msgid "Normally if you wanted to login to WordPress you would type your site's home URL followed by wp-login.php." +msgstr "Normalmente, se você deseja fazer login para WordPress você deve digitar uma URL home do seu site, seguido de wp-login.php." + +#: admin/wp-security-brute-force-menu.php:158 +msgid "This feature allows you to change the login URL by setting your own slug and renaming the last portion of the login URL which contains the wp-login.php to any string that you like." +msgstr "Esse recurso permite você alterar a URL de login definindo sua própria lesma/apelido e renomeando a última parte da URL de login que contém o wp-login.php para qualquer sequência de caracteres que você gosta." + +#: admin/wp-security-brute-force-menu.php:159 +msgid "By doing this, malicious bots and hackers will not be able to access your login page because they will not know the correct login page URL." +msgstr "Ao fazer isso, os hackers e robôs maliciosos não serão capazes de acessar a página de login, porque eles não vão saber a URL da página de login correta." + +#: admin/wp-security-brute-force-menu.php:161 +msgid "You may also be interested in the following alternative brute force prevention features:" +msgstr "Você pode também estar interessado nos seguintes recursos alternativos de prevenção de força bruta:" + +#: admin/wp-security-brute-force-menu.php:172 +msgid "Your WordPress login page URL has been renamed." +msgstr "Seu URL da página de login do WordPress foi renomeada." + +#: admin/wp-security-brute-force-menu.php:173 +msgid "Your current login URL is:" +msgstr "Seu URL de login atual é:" + +#: admin/wp-security-brute-force-menu.php:181 +msgid "Rename login page settings" +msgstr "Configurações de renomeação da página de login" + +#: admin/wp-security-brute-force-menu.php:195 +msgid "NOTE: If you are hosting your site on WPEngine or a provider which performs server caching, you will need to ask the host support people to NOT cache your renamed login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:200 +msgid "Enable rename login page feature" +msgstr "Habilitar recurso de renomeação da página de login" + +#: admin/wp-security-brute-force-menu.php:203 +msgid "Check this if you want to enable the rename login page feature" +msgstr "Marque esta opção se você deseja ativar o recurso de renomeação da página de login" + +#: admin/wp-security-brute-force-menu.php:207 +msgid "Login page URL" +msgstr "URL da página de login" + +#: admin/wp-security-brute-force-menu.php:209 +msgid "Enter a string which will represent your secure login page slug. You are encouraged to choose something which is hard to guess and only you will remember." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:243 +msgid "Settings have not been saved - your secret word must consist only of alphanumeric characters, ie, letters and/or numbers only." +msgstr "Configurações não foram salvas - sua palavra secreta deve consistir apenas de caracteres alfanuméricos, ou seja, letras e/ou números apenas." + +#: admin/wp-security-brute-force-menu.php:257 +msgid "You have successfully enabled the cookie based brute force prevention feature" +msgstr "Você ativou com sucesso o recurso de prevenção de força bruta baseada em cookie" + +#: admin/wp-security-brute-force-menu.php:258 +msgid "From now on you will need to log into your WP Admin using the following URL:" +msgstr "De agora em diante, você precisará fazer login em sua administração WP usando a seguinte URL:" + +#: admin/wp-security-brute-force-menu.php:260 +msgid "It is important that you save this URL value somewhere in case you forget it, OR," +msgstr "É importante que você salve esse valor de URL em algum lugar caso você esqueça, OU," + +#: admin/wp-security-brute-force-menu.php:261 +msgid "simply remember to add a \"?%s=1\" to your current site URL address." +msgstr "simplesmente lembre-se de adicionar um \"?%s=1\" para o seu endereço de URL do site atual." + +#: admin/wp-security-brute-force-menu.php:265 +msgid "You have successfully saved cookie based brute force prevention feature settings." +msgstr "Você salvou com sucesso as configurações de recursos de prevenção de força bruta baseadas em cookies." + +#: admin/wp-security-brute-force-menu.php:295 +msgid "Brute force prevention firewall settings" +msgstr "Configurações de firewall de prevenção de força bruta" + +#: admin/wp-security-brute-force-menu.php:300 +msgid "A Brute Force Attack is when a hacker tries many combinations of usernames and passwords until they succeed in guessing the right combination." +msgstr "Um ataque de força bruta é quando um hacker tenta muitas combinações de nomes de usuário e senhas até que eles conseguem adivinhar a combinação certa." + +#: admin/wp-security-brute-force-menu.php:301 +msgid "Due to the fact that at any one time there may be many concurrent login attempts occurring on your site via malicious automated robots, this also has a negative impact on your server's memory and performance." +msgstr "Devido ao fato de que a qualquer momento, pode haver muitas tentativas de login simultâneas ocorrendo no seu site através de robôs automatizados maliciosos, este também tem um impacto negativo sobre a memória e o desempenho do seu servidor." + +#: admin/wp-security-brute-force-menu.php:302 +msgid "The features in this tab will stop the majority of brute force login attacks thus providing even better protection for your WP login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:307 +#: admin/wp-security-firewall-menu.php:654 +msgid "backup" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:308 +msgid "video tutorial" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:309 +msgid "To learn more about how to use this feature, please watch the following %s." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:310 +#: admin/wp-security-brute-force-menu.php:758 +msgid "Cookie-Based Brute Force Login Prevention" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:320 +#: admin/wp-security-user-login-menu.php:253 +msgid "Cookie based brute force login prevention" +msgstr "Prevenção de acesso baseadas em cookies de força bruta" + +#: admin/wp-security-brute-force-menu.php:331 +msgid "This feature can lock you out of admin if it doesn't work correctly on your site. You " +msgstr "" + +#: admin/wp-security-brute-force-menu.php:342 +msgid "The cookie test was successful. You can now enable this feature." +msgstr "O teste de cookie foi bem sucedido. Agora, você pode ativar esse recurso." + +#: admin/wp-security-brute-force-menu.php:350 +msgid "The cookie test failed on this server. Consequently, this feature cannot be used on this site." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:357 +msgid "Before using this feature, you must perform a cookie test first." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:359 +msgid "This ensures that your browser cookie is working correctly and that you won't lock yourself out." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:364 +msgid "Perform cookie test" +msgstr "Executar teste de cookies" + +#: admin/wp-security-brute-force-menu.php:370 +#: classes/grade-system/wp-security-feature-item-manager.php:103 +msgid "Enable brute force attack prevention" +msgstr "Habilitar prevenção contra ataque de força bruta" + +#: admin/wp-security-brute-force-menu.php:373 +msgid "Check this if you want to protect your login page from Brute Force Attack." +msgstr "Marque esta opção se você deseja proteger sua página de login de ataque de força bruta." + +#: admin/wp-security-brute-force-menu.php:378 +msgid "This feature will deny access to your WordPress login page for all people except those who have a special cookie in their browser." +msgstr "Esse recurso irá negar o acesso à sua página de login do WordPress para todas as pessoas, exceto aqueles que têm um cookie especial em seu navegador." + +#: admin/wp-security-brute-force-menu.php:380 +msgid "To use this feature do the following:" +msgstr "Para usar este recurso faça o seguinte:" + +#: admin/wp-security-brute-force-menu.php:382 +msgid "1) Enable the checkbox." +msgstr "1) Habilite a caixa de seleção." + +#: admin/wp-security-brute-force-menu.php:384 +msgid "2) Enter a secret word consisting of alphanumeric characters which will be difficult to guess. This secret word will be useful whenever you need to know the special URL which you will use to access the login page (see point below)." +msgstr "2) Digite uma palavra secreta, constituída por caracteres alfanuméricos, que será difícil de adivinhar. Esta palavra secreta será útil sempre que você precisa saber a URL especial que você usará para acessar a página de login (ver ponto abaixo)." + +#: admin/wp-security-brute-force-menu.php:386 +msgid "3) You will then be provided with a special login URL. You will need to use this URL to login to your WordPress site instead of the usual login URL. NOTE: The system will deposit a special cookie in your browser which will allow you access to the WordPress administration login page." +msgstr "3) Em seguida, será fornecido com uma URL de login especial. Você precisará usar esta URL para acessar o seu site WordPress em vez da URL de login habitual. NOTA: O sistema irá depositar um cookie especial em seu navegador, que lhe permitirá aceder à página de login de administração do WordPress." + +#: admin/wp-security-brute-force-menu.php:388 +msgid "Any person trying to access your login page who does not have the special cookie in their browser will be automatically blocked." +msgstr "Qualquer pessoa que tentar acessar a página de login que não tem o cookie especial em seu navegador será bloqueado automaticamente." + +#: admin/wp-security-brute-force-menu.php:395 +msgid "Secret word" +msgstr "Palavra secreta" + +#: admin/wp-security-brute-force-menu.php:397 +msgid "Choose a secret word consisting of alphanumeric characters which you can use to access your special URL. Your are highly encouraged to choose a word which will be difficult to guess." +msgstr "Escolha uma palavra secreta composta de caracteres alfanuméricos, que você pode usar para acessar sua URL especial. Você estar altamente incentivados a escolher uma palavra que será difícil de adivinhar." + +#: admin/wp-security-brute-force-menu.php:401 +msgid "Re-direct URL" +msgstr "Redirecionar URL" + +#: admin/wp-security-brute-force-menu.php:405 +msgid "Specify a URL to redirect a hacker to when they try to access your WordPress login page." +msgstr "Especifique uma URL para redirecionar um hacker para quando eles tentam acessar a página de login do WordPress." + +#: admin/wp-security-brute-force-menu.php:412 +msgid "The URL specified here can be any site's URL and does not have to be your own. For example you can be as creative as you like and send hackers to the CIA or NSA home page." +msgstr "A URL especificada aqui pode ser URL de qualquer site e não tem que ser o seu próprio. Por exemplo, você pode ser tão criativo como você gosta e enviar os hackers para a página inicial da CIA ou NSA." + +#: admin/wp-security-brute-force-menu.php:414 +msgid "This field will default to: http://127.0.0.1 if you do not enter a value." +msgstr "Este campo será o padrão para: http://127.0.0.1 se você não digitar um valor." + +#: admin/wp-security-brute-force-menu.php:416 +msgid "Useful Tip:" +msgstr "Dica útil:" + +#: admin/wp-security-brute-force-menu.php:418 +msgid "It's a good idea to not redirect attempted brute force login attempts to your site because it increases the load on your server." +msgstr "É uma boa ideia não redirecionar tentativas de login de tentativa de força bruta para seu site, porque aumenta a carga no seu servidor." + +#: admin/wp-security-brute-force-menu.php:420 +msgid "Redirecting a hacker or malicious bot back to \"http://127.0.0.1\" is ideal because it deflects them back to their own local host and puts the load on their server instead of yours." +msgstr "Redirecionando um hacker ou robô malicioso de volta para \"http://127.0.0.1\" é ideal, pois desvia-los de volta ao seu próprio host local e coloca a carga em seu servidor ao invés do seu." + +#: admin/wp-security-brute-force-menu.php:427 +msgid "My site has posts or pages which are password protected" +msgstr "Meu site tem posts ou páginas que são protegidos por senha" + +#: admin/wp-security-brute-force-menu.php:430 +msgid "Check this if you are using the native WordPress password protection feature for some or all of your blog posts or pages." +msgstr "Marque esta opção se você estiver usando o recurso de proteção de senha nativo do WordPress para alguns ou todos os seus posts no blog ou páginas." + +#: admin/wp-security-brute-force-menu.php:435 +msgid "In the cases where you are protecting some of your posts or pages using the in-built WordPress password protection feature, a few extra lines of directives and exceptions need to be added so that people trying to access pages are not automatically blocked." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:437 +msgid "By enabling this checkbox, the plugin will add the necessary rules and exceptions so that people trying to access these pages are not automatically blocked." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:439 +msgid "Helpful Tip:" +msgstr "Dica útil:" + +#: admin/wp-security-brute-force-menu.php:441 +msgid "If you do not use the WordPress password protection feature for your posts or pages then it is highly recommended that you leave this checkbox disabled." +msgstr "Se você não usar o recurso de proteção de senha do WordPress para seus posts ou páginas, então é altamente recomendado que você deixe essa caixa de seleção desativada." + +#: admin/wp-security-brute-force-menu.php:448 +msgid "My site has a theme or plugins which use AJAX" +msgstr "Meu site tem um tema ou plugins que usam AJAX" + +#: admin/wp-security-brute-force-menu.php:451 +msgid "Check this if your site uses AJAX functionality." +msgstr "Marque esta opção se o seu site usa a funcionalidade AJAX." + +#: admin/wp-security-brute-force-menu.php:456 +msgid "In the cases where your WordPress installation has a theme or plugin that uses AJAX, a few extra lines of directives and exceptions need to be added to prevent AJAX requests from being automatically blocked by the brute force prevention feature." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:458 +msgid "By enabling this checkbox, the plugin will add the necessary rules and exceptions so that AJAX operations will work as expected." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:467 +msgid "Save feature settings" +msgstr "Salvar configurações de recurso" + +#: admin/wp-security-brute-force-menu.php:525 +msgid "This feature allows you to add a CAPTCHA form on various WordPress login pages and forms." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:526 +msgid "Adding a CAPTCHA form on a login page or form is another effective yet simple \"Brute Force\" prevention technique." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:527 +msgid "You have the option of using either %s or a plain maths CAPTCHA form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:528 +msgid "If you enable Google reCAPTCHA the reCAPTCHA widget will be displayed for all forms the CAPTCHA settings below." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:529 +msgid "If Google reCAPTCHA is disabled the simple maths CAPTCHA form will apply and users will need to enter the answer to a simple mathematical question." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:535 +msgid "Google reCAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:540 +msgid "By enabling these settings the Google reCAPTCHA v2 widget will be applied by default for all forms with CAPTCHA enabled." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:549 +msgid "reCAPTCHA will not work because you have disabled login lockout by activating the AIOS_DISABLE_LOGIN_LOCKOUT constant value in a configuration file." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:550 +msgid "To enable it, define AIOS_DISABLE_LOGIN_LOCKOUT constant value as false, or remove it." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:558 +msgid "Use Google reCAPTCHA as default" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:561 +msgid "Check this if you want to default to Google reCAPTCHA for all settings below. (If this is left unchecked, all CAPTCHA forms will revert to the plain maths CAPTCHA)" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:565 +msgid "Site key" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:571 +msgid "Secret key" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:580 +msgid "Login form CAPTCHA settings" +msgstr "Configurações do formulário captcha de login" + +#: admin/wp-security-brute-force-menu.php:589 +msgid "Enable CAPTCHA on login page" +msgstr "Habilitar captcha na página de login" + +#: admin/wp-security-brute-force-menu.php:592 +msgid "Check this if you want to insert a CAPTCHA form on the login page." +msgstr "Marque esta opção se você deseja inserir um formulário captcha na página de login" + +#: admin/wp-security-brute-force-menu.php:598 +msgid "Lost password form CAPTCHA settings" +msgstr "Configurações do formulário captcha de senha perdida" + +#: admin/wp-security-brute-force-menu.php:608 +msgid "Enable CAPTCHA on lost password page" +msgstr "Habilitar captcha na página senha perdida" + +#: admin/wp-security-brute-force-menu.php:611 +msgid "Check this if you want to insert a CAPTCHA form on the lost password page." +msgstr "Marque esta opção se você deseja inserir um formulário captcha na página de senha perdida" + +#: admin/wp-security-brute-force-menu.php:617 +msgid "Custom login form CAPTCHA settings" +msgstr "Configurações personalizadas do formulário captcha de login" + +#: admin/wp-security-brute-force-menu.php:626 +msgid "Enable CAPTCHA on custom login form" +msgstr "Habilitar captcha no formulário de login personalizado" + +#: admin/wp-security-brute-force-menu.php:629 +msgid "Check this if you want to insert CAPTCHA on a custom login form generated by the following WP function: wp_login_form()" +msgstr "Marque esta opção se você deseja inserir o captcha em um formulário de login personalizado gerado pela seguinte função WP: wp_login_form()" + +#: admin/wp-security-brute-force-menu.php:639 +msgid "WooCommerce forms CAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:648 +msgid "Enable CAPTCHA on WooCommerce login form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:651 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce login form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:661 +msgid "Enable CAPTCHA on WooCommerce lost password form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:664 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce lost password form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:674 +msgid "Enable CAPTCHA on WooCommerce registration form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:677 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce registration form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:749 +msgid "The All In One WP Security Whitelist feature gives you the option of only allowing certain IP addresses or ranges to have access to your WordPress login page." +msgstr "O recurso de lista branca de All In One WP Security lhe dá a opção de permitir apenas determinados endereços IP ou intervalos para ter acesso à sua página de login do WordPress." + +#: admin/wp-security-brute-force-menu.php:750 +msgid "This feature will deny login access for all IP addresses which are not in your whitelist as configured in the settings below." +msgstr "Este recurso irá negar o acesso de login para todos os endereços IP que não estão em sua lista branca conforme configurado nas configurações abaixo." + +#: admin/wp-security-brute-force-menu.php:751 +msgid "The plugin achieves this by writing the appropriate directives to your .htaccess file." +msgstr "O plugin consegue isso por escrito as diretivas apropriadas para o seu arquivo .htaccess." + +#: admin/wp-security-brute-force-menu.php:752 +msgid "By allowing/blocking IP addresses, you are using the most secure first line of defence because login access will only be granted to whitelisted IP addresses and other addresses will be blocked as soon as they try to access your login page." +msgstr "Ao permitir / bloquear endereços IP via arquivo .htaccess você está usando a primeira linha mais seguro de defesa porque o acesso de login será concedido somente a endereços IP autorizados na lista branca e outros endereços serão bloqueadas assim que eles tentam acessar a página de login." + +#: admin/wp-security-brute-force-menu.php:760 +msgid "Attention: If in addition to enabling the white list feature, you also have one of the %s or %s features enabled, you will still need to use your secret word or special slug in the URL when trying to access your WordPress login page." +msgstr "Atenção: Se além de habilitar o recurso de lista branca, você também tem um dos %s ou %s recursos habilitados, você ainda precisará usar sua palavra secreta ou lesma/apelido especial na URL quando você tentar acessar a página de login do WordPress." + +#: admin/wp-security-brute-force-menu.php:761 +msgid "These features are NOT functionally related. Having both of them enabled on your site means you are creating 2 layers of security." +msgstr "Esses recursos não estão funcionalmente relacionados. Tendo ambos habilitado em seu site significa que você está criando 2 camadas de segurança." + +#: admin/wp-security-brute-force-menu.php:772 +msgid "Login IP whitelist settings" +msgstr "Configurações de login de lista branca IP" + +#: admin/wp-security-brute-force-menu.php:783 +msgid "Enable IP whitelisting" +msgstr "Habilitar lista branca de IP" + +#: admin/wp-security-brute-force-menu.php:786 +#: admin/wp-security-user-login-menu.php:408 +msgid "Check this if you want to enable the whitelisting of selected IP addresses specified in the settings below" +msgstr "Marque esta opção se você deseja ativar o lista branca de endereços IP selecionados especificados nas configurações abaixo" + +#: admin/wp-security-brute-force-menu.php:790 +msgid "Your current IP address" +msgstr "Seu endereço IP atual" + +#: admin/wp-security-brute-force-menu.php:793 +msgid "You can copy and paste this address in the text box below if you want to include it in your login whitelist." +msgstr "Você pode copiar e colar esse endereço na caixa de texto abaixo, se você deseja incluí-lo em sua lista branca de login." + +#: admin/wp-security-brute-force-menu.php:797 +#: admin/wp-security-user-login-menu.php:412 +msgid "Enter whitelisted IP addresses:" +msgstr "Digite endereços IP na lista branca:" + +#: admin/wp-security-brute-force-menu.php:801 +#: admin/wp-security-user-login-menu.php:416 +msgid "Enter one or more IP addresses or IP ranges you wish to include in your whitelist." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:801 +msgid "Only the addresses specified here will have access to the WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:839 +msgid "This feature allows you to add a special hidden \"honeypot\" field on the WordPress login page. This will only be visible to robots and not humans." +msgstr "Esse recurso permite que você adicione um campo oculto especial \"pote de mel\" na página de login do WordPress. Isso só será visível para os robôs e não seres humanos." + +#: admin/wp-security-brute-force-menu.php:840 +msgid "Since robots usually fill in every input field from a login form, they will also submit a value for the special hidden honeypot field." +msgstr "Desde que os robôs geralmente preencher cada campo de entrada de um formulário de login, eles também apresentará um valor para o campo de pote de mel oculto especial." + +#: admin/wp-security-brute-force-menu.php:841 +#: admin/wp-security-user-registration-menu.php:278 +msgid "The way honeypots work is that a hidden field is placed somewhere inside a form which only robots will submit. If that field contains a value when the form is submitted then a robot has most likely submitted the form and it is consequently dealt with." +msgstr "A maneira de trabalho de potes de mel é que um campo oculto é colocado em algum lugar dentro de uma forma que apenas os robôs irão apresentar. Se esse campo contém um valor quando o formulário é enviado, em seguida, um robô muito provavelmente apresentou a forma e isso consequentemente é tratado com." + +#: admin/wp-security-brute-force-menu.php:842 +msgid "Therefore, if the plugin detects that this field has a value when the login form is submitted, then the robot which is attempting to login to your site will be redirected to its localhost address - http://127.0.0.1." +msgstr "Portanto, se o plugin detecta que este campo tem um valor quando o formulário de login é enviado, então o robô que está tentando fazer o login para o seu site será redirecionado para seu endereço localhost - http://127.0.0.1." + +#: admin/wp-security-brute-force-menu.php:848 +msgid "Login form honeypot settings" +msgstr "Configurações do formulário de login pote de mel" + +#: admin/wp-security-brute-force-menu.php:859 +msgid "Enable honeypot on login page" +msgstr "Habilitar pote de mel na página de login" + +#: admin/wp-security-brute-force-menu.php:862 +msgid "Check this if you want to enable the honeypot feature for the login page" +msgstr "Marque esta opção se você deseja ativar o recurso pote de mel para a página de login" + +#: admin/wp-security-dashboard-menu.php:27 +#: admin/wp-security-dashboard-menu.php:374 +#: classes/wp-security-user-login.php:74 +msgid "Locked IP addresses" +msgstr "Endereços IP bloqueados" + +#: admin/wp-security-dashboard-menu.php:28 +msgid "Permanent block list" +msgstr "Lista de bloqueio permanente" + +#: admin/wp-security-dashboard-menu.php:29 +msgid "Logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:33 +msgid "Premium upgrade" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:131 +#: admin/wp-security-dashboard-menu.php:518 +#: admin/wp-security-user-login-menu.php:53 +#: classes/grade-system/wp-security-feature-item-manager.php:49 +msgid "Login lockout" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:132 +msgid "This tab displays the list of all IP addresses which are currently temporarily locked out due to the login lockout feature:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:138 +msgid "Currently locked out IP addresses and ranges" +msgstr "Endereços IP e intervalos atualmente bloqueado" + +#: admin/wp-security-dashboard-menu.php:183 +msgid "This tab displays the list of all permanently blocked IP addresses." +msgstr "Esta guia exibe a lista de todos os endereços IP bloqueados permanentemente." + +#: admin/wp-security-dashboard-menu.php:184 +#: admin/wp-security-spam-menu.php:339 +msgid "NOTE: This feature does NOT use the .htaccess file to permanently block the IP addresses so it should be compatible with all web servers running WordPress." +msgstr "Nota: Esse recurso não usa o arquivo .htaccess para bloquear permanentemente os endereços IP, por isso deve ser compatível com todos os servidores web executando o WordPress." + +#: admin/wp-security-dashboard-menu.php:189 +msgid "Permanently blocked IP addresses" +msgstr "Endereços IP bloqueados permanentemente" + +#: admin/wp-security-dashboard-menu.php:200 +#: admin/wp-security-firewall-menu.php:1151 +#: admin/wp-security-user-login-menu.php:485 +#: admin/wp-security-user-login-menu.php:643 +#: admin/wp-security-user-registration-menu.php:164 +msgid "Search" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:238 +#: admin/wp-security-dashboard-menu.php:249 +#: admin/wp-security-dashboard-menu.php:260 +msgid "All In One WP Security & Firewall" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:250 +msgid "Debug logs have been cleared." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:261 +msgid "Unable to clear the logs; an invalid nonce was provided" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:274 +msgid "Debug log options" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:281 +msgid "Clear logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:289 +msgid "Debug logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:362 +msgid "Security strength meter" +msgstr "Medidor de força de segurança" + +#: admin/wp-security-dashboard-menu.php:363 +msgid "Security points breakdown" +msgstr "Segurança aponta esgotamento" + +#: admin/wp-security-dashboard-menu.php:364 +msgid "Spread the word" +msgstr "Estenda a palavra" + +#: admin/wp-security-dashboard-menu.php:365 +msgid "Get to know the developers" +msgstr "Conheça os desenvolvedores" + +#: admin/wp-security-dashboard-menu.php:366 +msgid "Critical feature status" +msgstr "Status de característica crítica" + +#: admin/wp-security-dashboard-menu.php:367 +msgid "Last 5 logins" +msgstr "Últimos 5 logins" + +#: admin/wp-security-dashboard-menu.php:368 +msgid "Maintenance mode status" +msgstr "Status do modo de manutenção" + +#: admin/wp-security-dashboard-menu.php:373 +#: admin/wp-security-dashboard-menu.php:664 +#: admin/wp-security-user-login-menu.php:57 +msgid "Logged in users" +msgstr "Usuários conectados" + +#: admin/wp-security-dashboard-menu.php:417 +msgid "Total Achievable Points: " +msgstr "Total de pontos alcançáveis: " + +#: admin/wp-security-dashboard-menu.php:419 +msgid "Current Score of Your Site: " +msgstr "Avaliação atual do seu site: " + +#: admin/wp-security-dashboard-menu.php:472 +msgid "We are working hard to make your WordPress site more secure. Please support us, here is how:" +msgstr "Estamos trabalhando duro para tornar seu site WordPress mais seguro. Por favor, apoiem-nos, aqui está como:" + +#: admin/wp-security-dashboard-menu.php:473 +msgid "Follow us on" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:477 +msgid "Post to Twitter" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:481 +msgid "Give us a good rating" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:488 +msgid "Wanna know more about the developers behind this plugin?" +msgstr "Quer saber mais sobre os desenvolvedores por trás deste plugin?" + +#: admin/wp-security-dashboard-menu.php:499 +msgid "Below is the current status of the critical features that you should activate on your site to achieve a minimum level of recommended security" +msgstr "Abaixo está o estado atual dos recursos críticos que você deve ativar em seu site para atingir um nível mínimo de segurança recomendado" + +#: admin/wp-security-dashboard-menu.php:503 +msgid "Admin username" +msgstr "Nome de usuário admin" + +#: admin/wp-security-dashboard-menu.php:533 +msgid "File permission" +msgstr "Permissão de arquivo" + +#: admin/wp-security-dashboard-menu.php:548 +msgid "Basic firewall" +msgstr "Firewall básico" + +#: admin/wp-security-dashboard-menu.php:577 +msgid "No data found." +msgstr "Nenhum dado encontrado!" + +#: admin/wp-security-dashboard-menu.php:581 +msgid "Last 5 logins summary:" +msgstr "Últimos 5 logins resumidos:" + +#: admin/wp-security-dashboard-menu.php:585 +msgid "User" +msgstr "Usuário" + +#: admin/wp-security-dashboard-menu.php:586 +#: admin/wp-security-list-404.php:95 +#: admin/wp-security-list-login-fails.php:56 +#: admin/wp-security-list-permanent-blocked-ip.php:68 +msgid "Date" +msgstr "Data" + +#: admin/wp-security-dashboard-menu.php:587 +msgid "IP" +msgstr "IP" + +#: admin/wp-security-dashboard-menu.php:608 +msgid "Maintenance mode is currently enabled. Remember to turn it off when you are done" +msgstr "Modo de manutenção está habilitado no momento. Lembre-se de desabilita-lo quando você terminar" + +#: admin/wp-security-dashboard-menu.php:610 +msgid "Maintenance mode is currently off." +msgstr "Modo de manutenção atualmente está desligado." + +#: admin/wp-security-dashboard-menu.php:614 +msgid "Maintenance mode" +msgstr "Modo de manutenção" + +#: admin/wp-security-dashboard-menu.php:632 +msgid "Cookie based brute force" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:636 +#: admin/wp-security-dashboard-menu.php:654 +msgid "The %s feature is currently active." +msgstr "O recurso %s está atualmente ativo." + +#: admin/wp-security-dashboard-menu.php:637 +#: admin/wp-security-dashboard-menu.php:655 +msgid "Your new WordPress login URL is now:" +msgstr "Sua nova URL de login WordPress agora é:" + +#: admin/wp-security-dashboard-menu.php:666 +msgid "Number of users currently logged into your site (including you) is:" +msgstr "Número de usuários atualmente conectados a seu site (incluindo você) é:" + +#: admin/wp-security-dashboard-menu.php:667 +msgid "There are no other users currently logged in." +msgstr "Não há nenhum outros usuários atualmente conectado." + +#: admin/wp-security-dashboard-menu.php:680 +msgid "Number of users currently logged in site-wide (including you) is:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:681 +msgid "There are no other site-wide users currently logged in." +msgstr "Não há nenhum outro usuário por todo o sítio atualmente conectado." + +#: admin/wp-security-dashboard-menu.php:694 +#: admin/wp-security-dashboard-menu.php:711 +msgid "Go to the %s menu to see more details" +msgstr "Vá para o %s menu para ver mais detalhes" + +#: admin/wp-security-dashboard-menu.php:707 +msgid "There are no IP addresses currently locked out." +msgstr "Não há nenhum endereço IP atualmente bloqueado." + +#: admin/wp-security-dashboard-menu.php:710 +msgid "Number of temporarily locked out IP addresses: " +msgstr "Número de endereços IP temporariamente bloqueado: " + +#: admin/wp-security-database-menu.php:52 +msgid "UpdraftPlus is installed but currently not active." +msgstr "" + +#: admin/wp-security-database-menu.php:52 +msgid "Follow this link to activate UpdraftPlus, to take a backup." +msgstr "" + +#: admin/wp-security-database-menu.php:57 +msgid "Follow this link to install UpdraftPlus, to take a database backup." +msgstr "" + +#: admin/wp-security-database-menu.php:87 +#: admin/wp-security-database-menu.php:92 +msgid "Database backup" +msgstr "Backup do BD" + +#: admin/wp-security-database-menu.php:91 +#: classes/grade-system/wp-security-feature-item-manager.php:65 +msgid "Database prefix" +msgstr "Prefixo de BD" + +#: admin/wp-security-database-menu.php:119 +msgid "Database security" +msgstr "Segurança do DB" + +#: admin/wp-security-database-menu.php:147 +msgid "Nonce check failed for DB prefix change operation!" +msgstr "Verificação núncio falhou para operação de alteração de prefixo do banco de dados!" + +#: admin/wp-security-database-menu.php:155 +msgid "The plugin has detected that it cannot write to the wp-config.php file. This feature can only be used if the plugin can successfully write to the wp-config.php file." +msgstr "O plugin detectou que não é possível gravar o arquivo wp-config.php. Este recurso só pode ser usado se o plugin com sucesso pode gravar o arquivo wp-config.php." + +#: admin/wp-security-database-menu.php:168 +msgid "Please enter a value for the DB prefix." +msgstr "Por favor, insira um valor para o prefixo do banco de dados." + +#: admin/wp-security-database-menu.php:177 +msgid "ERROR: The table prefix can only contain numbers, letters, and underscores." +msgstr "ERRO: O prefixo da tabela pode conter apenas números, letras e sublinhados." + +#: admin/wp-security-database-menu.php:186 +#: admin/wp-security-database-menu.php:245 +msgid "Change database prefix" +msgstr "Alterar prefixo do banco de dados" + +#: admin/wp-security-database-menu.php:189 +msgid "Your WordPress database is the most important asset of your website because it contains a lot of your site's precious information." +msgstr "Seu banco de dados WordPress é o ativo mais importante de seu site, porque ele contém muitas informações preciosas do seu site." + +#: admin/wp-security-database-menu.php:190 +msgid "The database is also a target for hackers via methods such as SQL injections and malicious and automated code which targets certain tables." +msgstr "O banco de dados também é um alvo para hackers através de métodos tais como injeções de SQL e código malicioso e automatizado que tem como alvo determinadas tabelas." + +#: admin/wp-security-database-menu.php:191 +msgid "One way to add a layer of protection for your DB is to change the default WordPress table prefix from \"wp_\" to something else which will be difficult for hackers to guess." +msgstr "Uma maneira de adicionar uma camada de proteção para seu Banco de Dados é alterar o prefixo da tabela padrão WordPress \"wp_\" para outra coisa que será difícil para os hackers de adivinhar." + +#: admin/wp-security-database-menu.php:192 +msgid "This feature allows you to easily change the prefix to a value of your choice or to a random value set by this plugin." +msgstr "Esse recurso permite que você altere facilmente o prefixo para um valor de sua escolha ou para um valor aleatório definido por este plugin." + +#: admin/wp-security-database-menu.php:198 +msgid "Database prefix options" +msgstr "Opções de prefixo do banco de dados" + +#: admin/wp-security-database-menu.php:210 +msgid "database backup" +msgstr "Backup do BD" + +#: admin/wp-security-database-menu.php:211 +msgid "It is recommended that you perform a %s before using this feature" +msgstr "É recomendável que você execute um %s antes de usar este recurso" + +#: admin/wp-security-database-menu.php:221 +msgid "Current database table prefix" +msgstr "Atual prefixo da tabela BD" + +#: admin/wp-security-database-menu.php:227 +msgid "Your site is currently using the default WordPress database prefix value of \"wp_\"." +msgstr "" + +#: admin/wp-security-database-menu.php:227 +msgid "To increase your site's security you should consider changing the database prefix value to another value." +msgstr "" + +#: admin/wp-security-database-menu.php:234 +msgid "Generate new database table prefix" +msgstr "Gerar novo prefixo da tabela BD" + +#: admin/wp-security-database-menu.php:238 +msgid "Check this if you want the plugin to generate a random 6 character string for the table prefix" +msgstr "Marque esta opção se você deseja que o plugin para gerar uma sequência de 6 caracteres aleatórios para o prefixo da tabela" + +#: admin/wp-security-database-menu.php:239 +msgid "OR" +msgstr "OU" + +#: admin/wp-security-database-menu.php:241 +msgid "Choose your own database prefix by specifying a string which contains letters and/or numbers and/or underscores. Example: xyz_" +msgstr "" + +#: admin/wp-security-database-menu.php:265 +msgid "Take a database backup using UpdraftPlus" +msgstr "" + +#: admin/wp-security-database-menu.php:270 +msgid "Manual backup" +msgstr "Backup manual" + +#: admin/wp-security-database-menu.php:274 +msgid "UpdraftPlus Backup/Restore" +msgstr "" + +#: admin/wp-security-database-menu.php:274 +msgid "Your backups are on the UpdraftPlus Backup/Restore admin page." +msgstr "" + +#: admin/wp-security-database-menu.php:276 +msgid "Create database backup now" +msgstr "" + +#: admin/wp-security-database-menu.php:308 +msgid "Error - Could not get tables or no tables found!" +msgstr "Erro - Não foi possível obter tabelas ou sem tabelas encontradas!" + +#: admin/wp-security-database-menu.php:312 +msgid "Starting DB prefix change operations....." +msgstr "Iniciando operações de alteração do prefixo do banco de dados....." + +#: admin/wp-security-database-menu.php:314 +msgid "Your WordPress system has a total of %s tables and your new DB prefix will be: %s" +msgstr "Seu sistema WordPress tem um total de %s tabelas e seu novo prefixo DB será: %s" + +#: admin/wp-security-database-menu.php:320 +#: classes/wp-security-utility.php:306 +msgid "Failed to make a backup of the wp-config.php file. This operation will not go ahead." +msgstr "Falha ao fazer um backup do arquivo wp-config.php. Esta operação não irá em frente." + +#: admin/wp-security-database-menu.php:324 +msgid "A backup copy of your wp-config.php file was created successfully!" +msgstr "Uma cópia de backup de seu arquivo wp-config.php foi criada com sucesso!" + +#: admin/wp-security-database-menu.php:351 +msgid "%s table name update failed" +msgstr "Falha na atualização do nome da tabela %s" + +#: admin/wp-security-database-menu.php:363 +msgid "Please change the prefix manually for the above tables to: %s" +msgstr "Por favor, altere o prefixo manualmente para as tabelas acima para: %s" + +#: admin/wp-security-database-menu.php:366 +msgid "%s tables had their prefix updated successfully!" +msgstr "O prefixo da tabela %s foi atualizado com sucesso!" + +#: admin/wp-security-database-menu.php:387 +msgid "wp-config.php file was updated successfully!" +msgstr "O arquivo wp-config.php foi atualizado com sucesso!" + +#: admin/wp-security-database-menu.php:390 +msgid "The \"wp-config.php\" file was not able to be modified." +msgstr "" + +#: admin/wp-security-database-menu.php:390 +msgid "Please modify this file manually using your favourite editor and search for variable \"$table_prefix\" and assign the following value to that variable: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:401 +#: admin/wp-security-database-menu.php:420 +msgid "Update of table %s failed: unable to change %s to %s" +msgstr "Falha na atualização da tabela de %s: Não é possível alterar %s para %s" + +#: admin/wp-security-database-menu.php:405 +msgid "The options table records which had references to the old DB prefix were updated successfully!" +msgstr "Os registros da tabela de opções que tinham referências ao antigo prefixo DB foram atualizados com sucesso!" + +#: admin/wp-security-database-menu.php:424 +msgid "The %s table records which had references to the old DB prefix were updated successfully!" +msgstr "Os registros da tabela %s que tinham referências ao antigo prefixo DB foram atualizados com sucesso!" + +#: admin/wp-security-database-menu.php:452 +msgid "Error updating user_meta table where new meta_key = %s, old meta_key = %s and user_id = %s." +msgstr "Erro ao atualizar a tabela de user_meta onde novo meta_key = %s, velho meta_key = %s e user_id = %s." + +#: admin/wp-security-database-menu.php:457 +msgid "The usermeta table records which had references to the old DB prefix were updated successfully!" +msgstr "Os registros da tabela usermeta que tinham referências ao antigo prefixo DB foram atualizados com sucesso!" + +#: admin/wp-security-database-menu.php:459 +msgid "The database prefix change tasks have been completed." +msgstr "As tarefas de mudança de prefixo do banco de dados foram concluídas." + +#: admin/wp-security-database-menu.php:503 +msgid "Checking for MySQL tables of type \"view\"....." +msgstr "" + +#: admin/wp-security-database-menu.php:520 +msgid "Update of the following MySQL view definition failed: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:527 +msgid "%s view definitions were updated successfully!" +msgstr "" + +#: admin/wp-security-filescan-menu.php:26 +#: classes/grade-system/wp-security-feature-item-manager.php:127 +msgid "File change detection" +msgstr "Detecção de alteração de arquivo" + +#: admin/wp-security-filescan-menu.php:27 +msgid "Malware scan" +msgstr "Examinar malware" + +#: admin/wp-security-filescan-menu.php:88 +msgid "There have been no file changes since the last scan." +msgstr "Não houve nenhuma alteração de arquivo desde a última verificação." + +#: admin/wp-security-filescan-menu.php:98 +msgid "Nonce check failed for manual file change detection scan operation!" +msgstr "Verificação núncio falhou para operação de verificação de detecção de alteração de arquivo manual!" + +#: admin/wp-security-filescan-menu.php:104 +msgid "There was an error during the file change detection scan. Please check the AIOS logs." +msgstr "" + +#: admin/wp-security-filescan-menu.php:110 +msgid "The plugin has detected that this is your first file change detection scan. The file details from this scan will be used to detect file changes for future scans." +msgstr "O plugin detectou que este é a sua primeira verificação de detecção de alteração de arquivo. Os detalhes do arquivo desta verificação serão usados para detectar alterações de arquivo para futuras verificações!" + +#: admin/wp-security-filescan-menu.php:112 +msgid "Scan complete - There were no file changes detected!" +msgstr "Verificação completa - não houve nenhuma alteração de arquivo detectado!" + +#: admin/wp-security-filescan-menu.php:133 +msgid "You entered a non numeric value for the \"backup time interval\" field. It has been set to the default value." +msgstr "Você digitou um valor não numérico para o campo \"intervalo de tempo de backup\". Foi definido como o valor padrão." + +#: admin/wp-security-filescan-menu.php:167 +msgid "The following address was removed because it is not a valid email address: " +msgstr "" + +#: admin/wp-security-filescan-menu.php:206 +msgid "NEW SCAN COMPLETED: The plugin has detected that you have made changes to the \"File Types To Ignore\" or \"Files To Ignore\" fields." +msgstr "" + +#: admin/wp-security-filescan-menu.php:206 +msgid "In order to ensure that future scan results are accurate, the old scan data has been refreshed." +msgstr "" + +#: admin/wp-security-filescan-menu.php:215 +msgid "All In One WP Security & Firewall has detected that there was a change in your host's files." +msgstr "All In One WP Security e Firewall detectou que houve uma mudança nos arquivos do seu hospedeiro." + +#: admin/wp-security-filescan-menu.php:217 +msgid "View scan details and clear this message" +msgstr "" + +#: admin/wp-security-filescan-menu.php:226 +msgid "If given an opportunity hackers can insert their code or files into your system which they can then use to carry out malicious acts on your site." +msgstr "Se lhe for dada uma oportunidade os hackers podem inserir o seu código ou arquivos em seu sistema que eles podem usar para realizar atos maliciosos em seu site." + +#: admin/wp-security-filescan-menu.php:227 +msgid "Being informed of any changes in your files can be a good way to quickly prevent a hacker from causing damage to your website." +msgstr "Sendo informado de quaisquer alterações em seus arquivos pode ser uma boa maneira de evitar rapidamente um hacker de causar danos ao seu site." + +#: admin/wp-security-filescan-menu.php:228 +msgid "In general, WordPress core and plugin files and file types such as \".php\" or \".js\" should not change often and when they do, it is important that you are made aware when a change occurs and which file was affected." +msgstr "Em geral, arquivos de núcleo e plugin do WordPress e tipos de arquivo como \".php\" ou \".js\" não devem mudar frequentemente e quando o fazem, é importante que você esteja ciente quando uma alteração ocorre e qual arquivo foi afetado." + +#: admin/wp-security-filescan-menu.php:229 +msgid "The \"File Change Detection Feature\" will notify you of any file change which occurs on your system, including the addition and deletion of files by performing a regular automated or manual scan of your system's files." +msgstr "O \"recurso de detecção de alteração de arquivo\" irá notificá-lo de qualquer alteração de arquivo que ocorre em seu sistema, incluindo a adição e exclusão de arquivos através da realização de uma verificação regular, automatizado ou manual de arquivos do seu sistema." + +#: admin/wp-security-filescan-menu.php:230 +msgid "This feature also allows you to exclude certain files or folders from the scan in cases where you know that they change often as part of their normal operation. (For example log files and certain caching plugin files may change often and hence you may choose to exclude such files from the file change detection scan)" +msgstr "Este recurso também permite excluir determinados arquivos ou pastas da verificação nos casos em que você sabe que eles mudam frequentemente como parte de sua operação normal. (Por exemplo arquivos de log e determinados arquivos de plugin de cache podem mudar muitas vezes e, portanto, você pode optar por excluir esses arquivos da verificação de detecção de alteração de arquivo)" + +#: admin/wp-security-filescan-menu.php:241 +msgid "It appears that your server is using an old PHP version which is missing the %s. The file scanner feature needs this class in order to work. If you would like to use this feature please upgrade your server PHP version to 5.3 or greater." +msgstr "" + +#: admin/wp-security-filescan-menu.php:249 +msgid "Manual file change detection scan" +msgstr "Verificação de detecção de alteração manual de arquivo" + +#: admin/wp-security-filescan-menu.php:255 +msgid "To perform a manual file change detection scan click on the button below." +msgstr "Para realizar uma verificação de detecção de alteração manual de arquivo clique no botão abaixo." + +#: admin/wp-security-filescan-menu.php:258 +msgid "Perform scan now" +msgstr "Efetuar uma verificação agora" + +#: admin/wp-security-filescan-menu.php:262 +msgid "View last saved file change results" +msgstr "Exibir últimos resultados salvos de alteração de arquivo" + +#: admin/wp-security-filescan-menu.php:268 +msgid "Click the button below to view the saved file change results from the last scan." +msgstr "Clique no botão abaixo para visualizar os resultados de alteração de arquivos salvos da última verificação." + +#: admin/wp-security-filescan-menu.php:271 +msgid "View last file change" +msgstr "Visualizar últimas alterações de arquivo" + +#: admin/wp-security-filescan-menu.php:275 +msgid "File change detection settings" +msgstr "Configuração de detecção de alteração de arquivo" + +#: admin/wp-security-filescan-menu.php:287 +msgid "Enable automated file change detection scan" +msgstr "Habilitar a verificação de detecção automatizada de alteração de arquivos" + +#: admin/wp-security-filescan-menu.php:290 +msgid "Check this if you want the system to automatically/periodically scan your files to check for file changes based on the settings below" +msgstr "Marque isso, se você deseja que o sistema automaticamente/periodicamente digitalizar seus arquivos para verificar se há alterações de arquivo com base nas configurações abaixo" + +#: admin/wp-security-filescan-menu.php:294 +msgid "Scan time interval" +msgstr "Intervalo de tempo para verificação" + +#: admin/wp-security-filescan-menu.php:297 +msgid "Hours" +msgstr "Horas" + +#: admin/wp-security-filescan-menu.php:298 +msgid "Days" +msgstr "Dias" + +#: admin/wp-security-filescan-menu.php:299 +msgid "Weeks" +msgstr "Semanas" + +#: admin/wp-security-filescan-menu.php:301 +msgid "Set the value for how often you would like a scan to occur" +msgstr "Defina o valor para quantas vezes você gostaria de ter uma verificação para ocorrer" + +#: admin/wp-security-filescan-menu.php:305 +msgid "File types to ignore" +msgstr "Tipos de arquivo para ignorar" + +#: admin/wp-security-filescan-menu.php:308 +msgid "Enter each file type or extension on a new line which you wish to exclude from the file change detection scan." +msgstr "Digite cada tipo de arquivo ou extensão em uma nova linha que você deseja excluir da análise de detecção de alteração de arquivo." + +#: admin/wp-security-filescan-menu.php:312 +msgid "You can exclude file types from the scan which would not normally pose any security threat if they were changed. These can include things such as image files." +msgstr "Você pode excluir tipos de arquivo da verificação que normalmente não representa qualquer ameaça de segurança se eles foram alterados. Estes podem incluir coisas tais como arquivos de imagem." + +#: admin/wp-security-filescan-menu.php:313 +msgid "Example: If you want the scanner to ignore files of type jpg, png, and bmp, then you would enter the following:" +msgstr "Exemplo: Se você deseja que a verificação ignore arquivos do tipo jpg, png e bmp, em seguida, você deve digitar o seguinte:" + +#: admin/wp-security-filescan-menu.php:314 +msgid "jpg" +msgstr "jpg" + +#: admin/wp-security-filescan-menu.php:315 +msgid "png" +msgstr "png" + +#: admin/wp-security-filescan-menu.php:316 +msgid "bmp" +msgstr "bmp" + +#: admin/wp-security-filescan-menu.php:322 +msgid "Files/Directories to ignore" +msgstr "Arquivos/Diretórios para ignorar" + +#: admin/wp-security-filescan-menu.php:325 +msgid "Enter each file or directory on a new line which you wish to exclude from the file change detection scan." +msgstr "Digite cada arquivo ou diretório em uma nova linha que você deseja excluir da análise de detecção de alteração de arquivo." + +#: admin/wp-security-filescan-menu.php:329 +msgid "You can exclude specific files/directories from the scan which would not normally pose any security threat if they were changed. These can include things such as log files." +msgstr "Você pode excluir arquivos/diretórios específicos da verificação que normalmente não representem qualquer ameaça à segurança se eles foram alterados. Estes podem incluir coisas tais como arquivos de log." + +#: admin/wp-security-filescan-menu.php:330 +msgid "Example: If you want the scanner to ignore certain files in different directories or whole directories, then you would enter the following:" +msgstr "Exemplo: Se você deseja que a verificação ignore determinados arquivos em diferentes pastas ou diretórios inteiros, então você deve digitar o seguinte:" + +#: admin/wp-security-filescan-menu.php:331 +msgid "cache/config/master.php" +msgstr "cache/config/master.php" + +#: admin/wp-security-filescan-menu.php:332 +msgid "somedirectory" +msgstr "somedirectory" + +#: admin/wp-security-filescan-menu.php:339 +msgid "Send email when change detected" +msgstr "Enviar e-mail quando detectada alteração" + +#: admin/wp-security-filescan-menu.php:343 +msgid "Check this if you want the system to email you if a file change was detected" +msgstr "Marque esta opção se você deseja que o sistema envie um e-mail, se foi detectada uma alteração no arquivo" + +#: admin/wp-security-filescan-menu.php:347 +msgid "Enter one or more email addresses on a new line." +msgstr "Digite um ou mais endereços de e-mail em uma nova linha." + +#: admin/wp-security-filescan-menu.php:364 +msgid "What is malware?" +msgstr "O que é Malware?" + +#: admin/wp-security-filescan-menu.php:365 +msgid "The word malware stands for Malicious Software. It can consist of things like trojan horses, adware, worms, spyware and any other undesirable code which a hacker will try to inject into your website." +msgstr "A palavra Malware significa software malicioso. Ele pode consistir de coisas como cavalos de tróia, adware, worms, spyware e qualquer outro código indesejável que um hacker irá tentar injetar em seu site." + +#: admin/wp-security-filescan-menu.php:366 +msgid "Often when malware code has been inserted into your site you will normally not notice anything out of the ordinary based on appearances, but it can have a dramatic effect on your site's search ranking." +msgstr "Muitas vezes, quando código de malware foi inserido em seu site você normalmente não vai notar nada fora do comum, com base em aparências, mas pode ter um efeito dramático no ranking de busca do seu site." + +#: admin/wp-security-filescan-menu.php:367 +msgid "This is because the bots and spiders from search engines such as Google have the capability to detect malware when they are indexing the pages on your site, and consequently they can blacklist your website which will in turn affect your search rankings." +msgstr "Isso ocorre porque os robôs e aranhas dos motores de busca como o Google tem a capacidade de detectar malware quando eles estão indexando as páginas do seu site, e, consequentemente, pode barrar seu site, que por sua vez irá afetar seus rankings de busca." + +#: admin/wp-security-filescan-menu.php:369 +msgid "CLICK HERE" +msgstr "" + +#: admin/wp-security-filescan-menu.php:371 +msgid "Scanning for malware" +msgstr "Verificação de Malware" + +#: admin/wp-security-filescan-menu.php:372 +msgid "Due to the constantly changing and complex nature of Malware, scanning for such things using a standalone plugin will not work reliably. This is something best done via an external scan of your site regularly." +msgstr "Devido à natureza de constante mudança e complexo de Malware, verificação para tais coisas usando um plugin autônomo não vai funcionar de forma confiável. Isso é algo melhor feito através de uma verificação externa de seu site regularmente." + +#: admin/wp-security-filescan-menu.php:373 +msgid "This is why we have created an easy-to-use scanning service which is hosted off our own server which will scan your site for malware once every day and notify you if it finds anything." +msgstr "É por isso que criamos um serviço de verificação de fácil utilização que está hospedado fora de nosso próprio servidor, que irá analisar o seu site em busca de malware, uma vez por dia e notificá-lo se ele encontrar qualquer coisa." + +#: admin/wp-security-filescan-menu.php:374 +msgid "When you sign up for this service you will get the following:" +msgstr "Quando você se inscrever para este serviço, você receberá o seguinte:" + +#: admin/wp-security-filescan-menu.php:376 +msgid "Automatic daily scan of 1 website" +msgstr "Verificação automática diária de 1 site" + +#: admin/wp-security-filescan-menu.php:377 +msgid "Automatic malware and blacklist monitoring" +msgstr "" + +#: admin/wp-security-filescan-menu.php:378 +msgid "Automatic email alerting" +msgstr "Alerta automático por e-mail" + +#: admin/wp-security-filescan-menu.php:379 +msgid "Site uptime monitoring" +msgstr "Monitoramento do tempo de atividade do site" + +#: admin/wp-security-filescan-menu.php:380 +msgid "Site response time monitoring" +msgstr "Monitoramento do tempo de resposta do site" + +#: admin/wp-security-filescan-menu.php:381 +msgid "We provide advice for malware cleanup" +msgstr "" + +#: admin/wp-security-filescan-menu.php:382 +msgid "Blacklist removal" +msgstr "Remoção da lista negra" + +#: admin/wp-security-filescan-menu.php:383 +msgid "No contract (cancel anytime)" +msgstr "Não há contrato (cancelar a qualquer momento)" + +#: admin/wp-security-filescan-menu.php:385 +msgid "To learn more please %s." +msgstr "Para saber mais, por favor %s." + +#: admin/wp-security-filescan-menu.php:406 +msgid "Latest file change scan results" +msgstr "Últimos resultados de verificação de alteração de arquivo" + +#: admin/wp-security-filescan-menu.php:416 +msgid "The following files were added to your host." +msgstr "Os seguintes arquivos foram adicionados ao seu host" + +#: admin/wp-security-filescan-menu.php:419 +#: admin/wp-security-filescan-menu.php:440 +#: admin/wp-security-filescan-menu.php:464 +msgid "File" +msgstr "Arquivo" + +#: admin/wp-security-filescan-menu.php:420 +#: admin/wp-security-filescan-menu.php:441 +#: admin/wp-security-filescan-menu.php:465 +msgid "File size" +msgstr "Tamanho do arquivo" + +#: admin/wp-security-filescan-menu.php:421 +#: admin/wp-security-filescan-menu.php:442 +#: admin/wp-security-filescan-menu.php:466 +msgid "File modified" +msgstr "Arquivo modificado" + +#: admin/wp-security-filescan-menu.php:437 +msgid "The following files were removed from your host." +msgstr "Os seguintes arquivos foram removidos do seu hospedeiro" + +#: admin/wp-security-filescan-menu.php:461 +msgid "The following files were changed on your host." +msgstr "Os seguintes arquivos foram alterados em seu hospedeiro" + +#: admin/wp-security-filesystem-menu.php:26 +#: classes/grade-system/wp-security-feature-item-manager.php:69 +msgid "File permissions" +msgstr "Permissões de arquivos" + +#: admin/wp-security-filesystem-menu.php:27 +msgid "PHP file editing" +msgstr "Edição de arquivo PHP" + +#: admin/wp-security-filesystem-menu.php:28 +msgid "WP file access" +msgstr "Acesso ao arquivo WP" + +#: admin/wp-security-filesystem-menu.php:29 +msgid "Host system logs" +msgstr "Logs do sistema hospedeiro" + +#: admin/wp-security-filesystem-menu.php:55 +msgid "Filesystem security" +msgstr "Segurança de arquivos" + +#: admin/wp-security-filesystem-menu.php:80 +msgid "Nonce check failed for manual DB backup operation!" +msgstr "Verificação núncio falhou para operação de backup manual do banco de dados!" + +#: admin/wp-security-filesystem-menu.php:90 +msgid "The permissions for %s were succesfully changed to %s" +msgstr "As permissões de %s foram alteradas com sucesso para %s" + +#: admin/wp-security-filesystem-menu.php:94 +msgid "Unable to change permissions for %s!" +msgstr "Não foi possível alterar as permissões de %s!" + +#: admin/wp-security-filesystem-menu.php:100 +msgid "File permissions scan" +msgstr "Verificação de permissão de arquivos" + +#: admin/wp-security-filesystem-menu.php:103 +msgid "Your WordPress file and folder permission settings govern the accessability and read/write privileges of the files and folders which make up your WP installation." +msgstr "Suas configurações de permissão de arquivo e pasta WordPress governam os privilégios de acessibilidades e leitura/gravação de arquivos e pastas que compõem sua instalação do WP." + +#: admin/wp-security-filesystem-menu.php:104 +msgid "Your WP installation already comes with reasonably secure file permission settings for the filesystem." +msgstr "Sua instalação WP já vem com configurações de permissão de arquivo razoavelmente segura para o sistema de arquivos." + +#: admin/wp-security-filesystem-menu.php:105 +msgid "However, sometimes people or other plugins modify the various permission settings of certain core WP folders or files such that they end up making their site less secure because they chose the wrong permission values." +msgstr "No entanto, às vezes as pessoas ou outros plugins modificar as várias configurações de permissão de determinados arquivos ou pastas do núcleo WP tal que eles acabam fazendo com que seu site menos seguro porque eles escolheram os valores de permissão errados." + +#: admin/wp-security-filesystem-menu.php:106 +msgid "This feature will scan the critical WP core folders and files and will highlight any permission settings which are insecure." +msgstr "Esta recurso irá verificar as pastas e arquivos críticos do núcleo WP e irá destacar quaisquer configurações de permissão que são inseguros." + +#: admin/wp-security-filesystem-menu.php:114 +msgid "This plugin has detected that your site is running on a Windows server." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:115 +msgid "This feature is not applicable for Windows server installations." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:121 +msgid "WP directory and file permissions scan results" +msgstr "Resultados de pesquisa de permissões de arquivo e diretório WP" + +#: admin/wp-security-filesystem-menu.php:133 +#: admin/wp-security-filesystem-menu.php:152 +msgid "Name" +msgstr "Nome" + +#: admin/wp-security-filesystem-menu.php:134 +#: admin/wp-security-filesystem-menu.php:153 +msgid "File/Folder" +msgstr "Arquivo / Pasta" + +#: admin/wp-security-filesystem-menu.php:135 +#: admin/wp-security-filesystem-menu.php:154 +msgid "Current permissions" +msgstr "Permissões atuais" + +#: admin/wp-security-filesystem-menu.php:136 +#: admin/wp-security-filesystem-menu.php:155 +msgid "Recommended permissions" +msgstr "Permissões recomendadas" + +#: admin/wp-security-filesystem-menu.php:137 +#: admin/wp-security-filesystem-menu.php:156 +msgid "Recommended action" +msgstr "Ação recomendada" + +#: admin/wp-security-filesystem-menu.php:195 +msgid "Your PHP file editing settings were saved successfully." +msgstr "Suas configurações de edição de arquivos PHP foram salvas com sucesso." + +#: admin/wp-security-filesystem-menu.php:199 +msgid "Operation failed! Unable to modify or make a backup of wp-config.php file!" +msgstr "Operação falhou! Não é possível modificar ou fazer um backup do arquivo wp-config.php!" + +#: admin/wp-security-filesystem-menu.php:212 +#: classes/grade-system/wp-security-feature-item-manager.php:71 +msgid "File editing" +msgstr "Edição de arquivo" + +#: admin/wp-security-filesystem-menu.php:215 +msgid "The WordPress Dashboard by default allows administrators to edit PHP files, such as plugin and theme files." +msgstr "O painel do Wordpress por padrão permite que os administradores editar arquivos PHP, tais como arquivos de plugin e tema." + +#: admin/wp-security-filesystem-menu.php:216 +msgid "This is often the first tool an attacker will use if able to login, since it allows code execution." +msgstr "Isso é muitas vezes a primeira ferramenta que um invasor irá usar se for capaz de fazer o login, uma vez que permite a execução de código." + +#: admin/wp-security-filesystem-menu.php:217 +msgid "This feature will disable the ability for people to edit PHP files via the dashboard." +msgstr "Este recurso irá desativar a capacidade para as pessoas editar arquivos PHP através do painel de controle." + +#: admin/wp-security-filesystem-menu.php:223 +msgid "Disable PHP file editing" +msgstr "Desativar edição de arquivo PHP" + +#: admin/wp-security-filesystem-menu.php:235 +msgid "Disable ability to edit PHP files" +msgstr "Desativar a capacidade para editar arquivos PHP" + +#: admin/wp-security-filesystem-menu.php:238 +msgid "Check this if you want to remove the ability for people to edit PHP files via the WP dashboard" +msgstr "Marque esta opção se você deseja remover a capacidade de pessoas para editar arquivos PHP através do painel WP" + +#: admin/wp-security-filesystem-menu.php:282 +msgid "You have successfully saved the Prevent Access to Default WP Files configuration." +msgstr "Você salvou com sucesso a impedir acesso à configuração de arquivos padrão do WP." + +#: admin/wp-security-filesystem-menu.php:286 +#: admin/wp-security-firewall-menu.php:126 +#: admin/wp-security-firewall-menu.php:346 +#: admin/wp-security-firewall-menu.php:613 +#: admin/wp-security-firewall-menu.php:912 +#: admin/wp-security-settings-menu.php:772 +#: admin/wp-security-spam-menu.php:124 +msgid "Could not write to the .htaccess file. Please check the file permissions." +msgstr "Não foi possível gravar no arquivo .htaccess. Por favor, verifique as permissões do arquivo." + +#: admin/wp-security-filesystem-menu.php:291 +msgid "WordPress files" +msgstr "Arquivos WordPress" + +#: admin/wp-security-filesystem-menu.php:294 +msgid "This feature allows you to prevent access to files such as %s, %s and %s which are delivered with all WP installations." +msgstr "Esse recurso permite-lhe impedir o acesso a arquivos, como %s, %s e %s, que são entregues com todas as instalações WP." + +#: admin/wp-security-filesystem-menu.php:295 +msgid "By preventing access to these files you are hiding some key pieces of information (such as WordPress version info) from potential hackers." +msgstr "Ao impedir o acesso a esses arquivos que você está escondendo algumas peças-chave de informação (por exemplo, informações de versão do WordPress) dos potenciais hackers." + +#: admin/wp-security-filesystem-menu.php:300 +msgid "Prevent access to default WP files" +msgstr "Impedir o acesso a arquivos padrão do WP" + +#: admin/wp-security-filesystem-menu.php:311 +msgid "Prevent access to WP default install files" +msgstr "Impedir o acesso a arquivos de instalação padrão do WP" + +#: admin/wp-security-filesystem-menu.php:314 +msgid "Check this if you want to prevent access to readme.html, license.txt and wp-config-sample.php." +msgstr "Marque esta opção se você deseja impedir o acesso a readme.html, license.txt and wp-config-sample.php." + +#: admin/wp-security-filesystem-menu.php:318 +msgid "Save setting" +msgstr "Salvar configuração" + +#: admin/wp-security-filesystem-menu.php:342 +msgid "System logs" +msgstr "Logs do sistema" + +#: admin/wp-security-filesystem-menu.php:345 +msgid "Sometimes your hosting platform will produce error or warning logs in a file called \"error_log\"." +msgstr "Às vezes sua plataforma de hospedagem irá produzir erro ou logs de aviso em um arquivo chamado \"error_log\"." + +#: admin/wp-security-filesystem-menu.php:346 +msgid "Depending on the nature and cause of the error or warning, your hosting server can create multiple instances of this file in numerous directory locations of your WordPress installation." +msgstr "Dependendo da natureza e da causa do erro ou aviso, seu servidor de hospedagem pode criar várias instâncias deste arquivo em vários locais do diretório de sua instalação do WordPress." + +#: admin/wp-security-filesystem-menu.php:347 +msgid "By occassionally viewing the contents of these logs files you can keep informed of any underlying problems on your system which you might need to address." +msgstr "Por ocasionalmente exibindo o conteúdo desses arquivos de logs que pode manter-se informado de quaisquer problemas subjacentes em seu sistema que você pode precisar do endereço para resolver." + +#: admin/wp-security-filesystem-menu.php:353 +msgid "View system logs" +msgstr "Ver logs do sistema" + +#: admin/wp-security-filesystem-menu.php:355 +msgid "Please click the button below to view the latest system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:358 +msgid "Enter System Log File Name" +msgstr "Digite o nome do arquivo de log do sistema" + +#: admin/wp-security-filesystem-menu.php:360 +msgid "Enter your system log file name. (Defaults to error_log)" +msgstr "Digite seu nome de arquivo de log do sistema. (Padrões para error_log)" + +#: admin/wp-security-filesystem-menu.php:363 +msgid "View latest system logs" +msgstr "Ver logs mais recentes do sistema" + +#: admin/wp-security-filesystem-menu.php:365 +msgid "Loading..." +msgstr "Carregando..." + +#: admin/wp-security-filesystem-menu.php:382 +msgid "No system logs were found." +msgstr "Nenhum registro de logs do sistema foram encontrados!" + +#: admin/wp-security-filesystem-menu.php:435 +msgid "Set recommended permissions" +msgstr "Conjunto recomendado de permissões" + +#: admin/wp-security-filesystem-menu.php:441 +msgid "No action required" +msgstr "Nenhuma ação necessária." + +#: admin/wp-security-filesystem-menu.php:481 +msgid "Showing latest entries of error_log file: %s" +msgstr "Mostrando as últimas entradas de arquivo error_log: %s" + +#: admin/wp-security-firewall-menu.php:28 +msgid "Basic firewall rules" +msgstr "Regras básicas do firewall" + +#: admin/wp-security-firewall-menu.php:29 +msgid "Additional firewall rules" +msgstr "Regras adicionais do firewall" + +#: admin/wp-security-firewall-menu.php:30 +msgid "6G Blacklist firewall rules" +msgstr "Regras do firewall de lista negra 6G" + +#: admin/wp-security-firewall-menu.php:31 +msgid "Internet bots" +msgstr "Robôs da internet" + +#: admin/wp-security-firewall-menu.php:32 +msgid "Prevent hotlinks" +msgstr "Impedir hotlinks" + +#: admin/wp-security-firewall-menu.php:33 +msgid "404 detection" +msgstr "Detecção 404" + +#: admin/wp-security-firewall-menu.php:34 +msgid "Custom rules" +msgstr "Regras personalizadas" + +#: admin/wp-security-firewall-menu.php:122 +#: admin/wp-security-firewall-menu.php:908 +#: admin/wp-security-spam-menu.php:120 +#: admin/wp-security-spam-menu.php:494 +#: admin/wp-security-spam-menu.php:556 +#: admin/wp-security-user-registration-menu.php:95 +msgid "Settings were successfully saved" +msgstr "Configurações foram salvas com sucesso" + +#: admin/wp-security-firewall-menu.php:131 +#: admin/wp-security-firewall-menu.php:651 +msgid "Firewall settings" +msgstr "Configurações do firewall" + +#: admin/wp-security-firewall-menu.php:138 +msgid "This should not have any impact on your site's general functionality but if you wish you can take a %s of your .htaccess file before proceeding." +msgstr "Isto não deve ter nenhum impacto sobre a funcionalidade geral do seu site, mas se você quiser, você pode tomar um %s do seu arquivo .htaccess antes de prosseguir." + +#: admin/wp-security-firewall-menu.php:139 +msgid "The features in this tab allow you to activate some basic firewall security protection rules for your site." +msgstr "Os recursos neste guia permitem que você ative algumas regras básicas de proteção de segurança de firewall para o seu site." + +#: admin/wp-security-firewall-menu.php:140 +msgid "The firewall functionality is achieved via the insertion of special code into your currently active .htaccess file." +msgstr "A funcionalidade de firewall é conseguida através da inserção de código especial em seu arquivo .htaccess atualmente ativo." + +#: admin/wp-security-firewall-menu.php:151 +msgid "You have enabled the \"Completely Block Access To XMLRPC\" checkbox which means all XMLRPC functionality will be blocked." +msgstr "" + +#: admin/wp-security-firewall-menu.php:152 +msgid "By leaving this feature enabled you will prevent Jetpack or Wordpress iOS or other apps which need XMLRPC from working correctly on your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:153 +msgid "If you still need XMLRPC then uncheck the \"Completely Block Access To XMLRPC\" checkbox and enable only the \"Disable Pingback Functionality From XMLRPC\" checkbox." +msgstr "" + +#: admin/wp-security-firewall-menu.php:163 +msgid "Basic firewall settings" +msgstr "Configurações de firewall básico" + +#: admin/wp-security-firewall-menu.php:171 +msgid "Enable basic firewall protection" +msgstr "Habilitar proteção de firewall básico" + +#: admin/wp-security-firewall-menu.php:174 +msgid "Check this if you want to apply basic firewall protection to your site." +msgstr "Marque esta opção se você deseja aplicar a proteção de firewall básico para o seu site." + +#: admin/wp-security-firewall-menu.php:178 +msgid "This setting will implement the following basic firewall protection mechanisms on your site:" +msgstr "Esta configuração irá implementar os seguintes mecanismos de proteção básica do firewall no seu site:" + +#: admin/wp-security-firewall-menu.php:179 +msgid "1) Protect your htaccess file by denying access to it." +msgstr "1) Proteja o seu arquivo .htaccess, negando o acesso a ele." + +#: admin/wp-security-firewall-menu.php:180 +msgid "2) Disable the server signature." +msgstr "2) Desativa a assinatura do servidor." + +#: admin/wp-security-firewall-menu.php:181 +msgid "3) Limit file upload size (%sMB)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:182 +msgid "4) Protect your wp-config.php file by denying access to it." +msgstr "4) Protege seu arquivo wp-config.php, negando o acesso a ele." + +#: admin/wp-security-firewall-menu.php:183 +msgid "The above firewall features will be applied via your .htaccess file and should not affect your site's overall functionality." +msgstr "Os recursos de firewall acima serão aplicados através de seu arquivo .htaccess e não devem afetar a funcionalidade geral do seu site." + +#: admin/wp-security-firewall-menu.php:184 +msgid "You are still advised to take a backup of your active .htaccess file just in case." +msgstr "Ainda é aconselhável fazer um backup de seu arquivo .htaccess ativo apenas no caso." + +#: admin/wp-security-firewall-menu.php:190 +msgid "Max file upload size (MB)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:192 +msgid "The value for the maximum file upload size used in the .htaccess file. (Defaults to %sMB if left blank)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:200 +msgid "WordPress XMLRPC and pingback vulnerability protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:208 +msgid "Completely block access to XMLRPC" +msgstr "" + +#: admin/wp-security-firewall-menu.php:211 +msgid "Check this if you are not using the WP XML-RPC functionality and you want to completely block external access to XMLRPC." +msgstr "" + +#: admin/wp-security-firewall-menu.php:215 +msgid "This setting will add a directive in your .htaccess to disable access to the WordPress xmlrpc.php file which is responsible for the XML-RPC functionality in WordPress." +msgstr "" + +#: admin/wp-security-firewall-menu.php:216 +msgid "Hackers can exploit various vulnerabilities in the WordPress XML-RPC API in a number of ways such as:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:217 +msgid "1) Denial of Service (DoS) attacks" +msgstr "1) Ataques de negação de serviço (DoS)" + +#: admin/wp-security-firewall-menu.php:218 +msgid "2) Hacking internal routers." +msgstr "2) Roteadores internos pirata." + +#: admin/wp-security-firewall-menu.php:219 +msgid "3) Scanning ports in internal networks to get info from various hosts." +msgstr "3) Varredura de portas em redes internas para obter informações de vários hosts." + +#: admin/wp-security-firewall-menu.php:220 +msgid "Apart from the security protection benefit, this feature may also help reduce load on your server, particularly if your site currently has a lot of unwanted traffic hitting the XML-RPC API on your installation." +msgstr "Além do benefício de proteção de segurança, esse recurso também pode ajudar a reduzir a carga no seu servidor, especialmente quando o site tem atualmente uma grande quantidade de tráfego indesejado, batendo o XML-RPC API em sua instalação." + +#: admin/wp-security-firewall-menu.php:221 +msgid "NOTE: You should only enable this feature if you are not currently using the XML-RPC functionality on your WordPress installation." +msgstr "NOTA: Você só deve ativar esse recurso se você não estiver usando atualmente a funcionalidade XML-RPC em sua instalação do WordPress." + +#: admin/wp-security-firewall-menu.php:222 +msgid "Leave this feature disabled and use the feature below if you want pingback protection but you still need XMLRPC." +msgstr "" + +#: admin/wp-security-firewall-menu.php:228 +msgid "Disable pingback functionality from XMLRPC" +msgstr "" + +#: admin/wp-security-firewall-menu.php:231 +msgid "If you use Jetpack or WP iOS or other apps which need WP XML-RPC functionality then check this. This will enable protection against WordPress pingback vulnerabilities." +msgstr "" + +#: admin/wp-security-firewall-menu.php:235 +msgid "NOTE: If you use Jetpack or the Wordpress iOS or other apps then you should enable this feature but leave the \"Completely Block Access To XMLRPC\" checkbox unchecked." +msgstr "" + +#: admin/wp-security-firewall-menu.php:236 +msgid "The feature will still allow XMLRPC functionality on your site but will disable the pingback methods." +msgstr "" + +#: admin/wp-security-firewall-menu.php:237 +msgid "This feature will also remove the \"X-Pingback\" header if it is present." +msgstr "" + +#: admin/wp-security-firewall-menu.php:246 +msgid "Block access to debug log file" +msgstr "" + +#: admin/wp-security-firewall-menu.php:254 +msgid "Block access to debug.log file" +msgstr "Bloquear o acesso ao arquivo debug.log" + +#: admin/wp-security-firewall-menu.php:257 +msgid "Check this if you want to block access to the debug.log file that WordPress creates when debug logging is enabled." +msgstr "Marque esta opção se você deseja bloquear o acesso ao arquivo debug.log que o WordPress cria quando o registo de depuração está habilitado." + +#: admin/wp-security-firewall-menu.php:261 +msgid "WordPress has an option to turn on the debug logging to a file located in wp-content/debug.log. This file may contain sensitive information." +msgstr "WordPress tem uma opção para ativar o registro de depuração para um arquivo localizado em wp-content/debug.log. Este arquivo pode conter informações confidenciais." + +#: admin/wp-security-firewall-menu.php:262 +msgid "Using this option will block external access to this file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:262 +msgid "You can still access this file by logging into your site via FTP." +msgstr "" + +#: admin/wp-security-firewall-menu.php:270 +msgid "Save basic firewall settings" +msgstr "Salvar configurações de firewall básico" + +#: admin/wp-security-firewall-menu.php:342 +msgid "You have successfully saved the Additional Firewall Protection configuration" +msgstr "Você salvou com sucesso a configuração adicional de proteção por firewall" + +#: admin/wp-security-firewall-menu.php:356 +msgid "Additional firewall protection" +msgstr "Proteção de firewall adicional" + +#: admin/wp-security-firewall-menu.php:360 +msgid "Due to the nature of the code being inserted to the .htaccess file, this feature may break some functionality for certain plugins and you are therefore advised to take a %s of .htaccess before applying this configuration." +msgstr "Devido à natureza do código que está sendo inserido no arquivo .htaccess, esse recurso pode quebrar algumas funcionalidades para certos plugins e, portanto, você é aconselhado a tomar um %s do .htaccess antes de aplicar essa configuração." + +#: admin/wp-security-firewall-menu.php:362 +msgid "This feature allows you to activate more advanced firewall settings to your site." +msgstr "Este recurso permite que você ative as configurações de firewall mais avançadas para o seu site." + +#: admin/wp-security-firewall-menu.php:363 +msgid "The advanced firewall rules are applied via the insertion of special code to your currently active .htaccess file." +msgstr "As regras de firewall avançado são aplicadas através da inserção de código especial para seu arquivo .htaccess atualmente ativo." + +#: admin/wp-security-firewall-menu.php:372 +msgid "Listing of directory contents" +msgstr "Listagem do conteúdo do diretório" + +#: admin/wp-security-firewall-menu.php:381 +#: classes/grade-system/wp-security-feature-item-manager.php:85 +msgid "Disable index views" +msgstr "Desabilitar visualizações de índice" + +#: admin/wp-security-firewall-menu.php:384 +msgid "Check this if you want to disable directory and file listing." +msgstr "Marque esta opção se você deseja desativar o diretório e lista de arquivos." + +#: admin/wp-security-firewall-menu.php:389 +msgid "By default, an Apache server will allow the listing of the contents of a directory if it doesn't contain an index.php file." +msgstr "Por padrão, um servidor Apache permitirá a listagem do conteúdo de um diretório, se ele não contém um arquivo index.php." + +#: admin/wp-security-firewall-menu.php:391 +msgid "This feature will prevent the listing of contents for all directories." +msgstr "Este recurso impedirá a listagem de conteúdos para todos os diretórios." + +#: admin/wp-security-firewall-menu.php:393 +msgid "NOTE: In order for this feature to work \"AllowOverride\" of the Indexes directive must be enabled in your httpd.conf file. Ask your hosting provider to check this if you don't have access to httpd.conf" +msgstr "NOTA: Para que este recurso funcione \"AllowOverride\" da directiva índices deve estar habilitada no seu arquivo httpd.conf. Pergunte ao seu provedor de hospedagem para verificar isso, se você não tem acesso ao httpd.conf " + +#: admin/wp-security-firewall-menu.php:402 +msgid "Trace and track" +msgstr "Rastrear e acompanhar" + +#: admin/wp-security-firewall-menu.php:411 +#: classes/grade-system/wp-security-feature-item-manager.php:86 +msgid "Disable trace and track" +msgstr "Desabilitar o rastreamento e acompanhamento" + +#: admin/wp-security-firewall-menu.php:414 +msgid "Check this if you want to disable trace and track." +msgstr "Marque esta opção se você deseja desativar o rastreamento e acompanhamento." + +#: admin/wp-security-firewall-menu.php:419 +msgid "HTTP Trace attack (XST) can be used to return header requests and grab cookies and other information." +msgstr "Ataque de rastreamento HTTP (XST) pode ser usado para retornar solicitações de cabeçalho e cookies de apoio e outras informações." + +#: admin/wp-security-firewall-menu.php:421 +msgid "This hacking technique is usually used together with cross site scripting attacks (XSS)." +msgstr "Esta técnica de hacking é geralmente usado em conjunto com ataques de script entre sites (XSS)." + +#: admin/wp-security-firewall-menu.php:423 +msgid "Disabling trace and track on your site will help prevent HTTP Trace attacks." +msgstr "Desabilitação de rastreamento e acompanhamento em seu site irá ajudar a evitar ataques de rastreamento HTTP." + +#: admin/wp-security-firewall-menu.php:432 +msgid "Proxy comment posting" +msgstr "Postagem de comentário proxy" + +#: admin/wp-security-firewall-menu.php:442 +msgid "Forbid proxy comment posting" +msgstr "Proibir postagem de comentários de proxy" + +#: admin/wp-security-firewall-menu.php:445 +msgid "Check this if you want to forbid proxy comment posting." +msgstr "Marque esta opção se você deseja proibir postagem de comentários de proxy." + +#: admin/wp-security-firewall-menu.php:450 +msgid "This setting will deny any requests that use a proxy server when posting comments." +msgstr "Essa configuração negará quaisquer solicitações que usam um servidor proxy ao postar comentários." + +#: admin/wp-security-firewall-menu.php:451 +msgid "By forbidding proxy comments you are in effect eliminating some spam and other proxy requests." +msgstr "Proibindo comentários de proxy, você está em efeito, eliminando alguns SPAM e outras solicitações de proxy." + +#: admin/wp-security-firewall-menu.php:460 +msgid "Bad query strings" +msgstr "Sequências de caracteres de consulta ruim" + +#: admin/wp-security-firewall-menu.php:470 +msgid "Deny bad query strings" +msgstr "Negar sequências de caracteres de consulta ruim" + +#: admin/wp-security-firewall-menu.php:473 +msgid "This will help protect you against malicious queries via XSS." +msgstr "Isso ajudará a protegê-lo contra consultas maliciosas via XSS." + +#: admin/wp-security-firewall-menu.php:478 +msgid "This feature will write rules in your .htaccess file to prevent malicious string attacks on your site using XSS." +msgstr "Esse recurso irá escrever regras em seu arquivo .htaccess para impedir ataques maliciosos de sequência de caracteres no seu site usando XSS." + +#: admin/wp-security-firewall-menu.php:479 +msgid "NOTE: Some of these strings might be used for plugins or themes and hence this might break some functionality." +msgstr "NOTA: Algumas destas sequências de caracteres podem ser usadas para plugins ou temas e, portanto, isso pode quebrar algumas funcionalidades." + +#: admin/wp-security-firewall-menu.php:480 +#: admin/wp-security-firewall-menu.php:510 +msgid "You are therefore strongly advised to take a backup of your active .htaccess file before applying this feature." +msgstr "É, portanto, fortemente aconselhável fazer um backup de seu arquivo .htaccess ativo antes de aplicar esse recurso." + +#: admin/wp-security-firewall-menu.php:489 +#: classes/grade-system/wp-security-feature-item-manager.php:89 +msgid "Advanced character string filter" +msgstr "Filtro de sequência de caráter avançado" + +#: admin/wp-security-firewall-menu.php:499 +msgid "Enable advanced character string filter" +msgstr "Habilitar filtro de sequência de caráter avançado" + +#: admin/wp-security-firewall-menu.php:502 +msgid "This will block bad character matches from XSS." +msgstr "Isto irá bloquear mau caráter corresponde de XSS." + +#: admin/wp-security-firewall-menu.php:507 +msgid "This is an advanced character string filter to prevent malicious string attacks on your site coming from Cross Site Scripting (XSS)." +msgstr "Este é um filtro de sequência de caracteres de caráter avançado para impedir ataques maliciosos de sequência de caracteres em seu site vindo de Cross Site Scripting (XSS)." + +#: admin/wp-security-firewall-menu.php:508 +msgid "This setting matches for common malicious string patterns and exploits and will produce a 403 error for the hacker attempting the query." +msgstr "Essa configuração corresponde para exploits e padrões comuns de sequência malicioso e produzirá um erro 403 para o hacker tentar a consulta." + +#: admin/wp-security-firewall-menu.php:509 +msgid "NOTE: Some strings for this setting might break some functionality." +msgstr "NOTA: Algumas sequências de caracteres para esta configuração podem quebrar algumas funcionalidades." + +#: admin/wp-security-firewall-menu.php:518 +msgid "Save additional firewall settings" +msgstr "Salvar configurações de firewall adicional" + +#: admin/wp-security-firewall-menu.php:609 +msgid "You have successfully saved the 5G/6G Firewall Protection configuration" +msgstr "Você salvou com sucesso a configuração de proteção de firewall 5G/6G" + +#: admin/wp-security-firewall-menu.php:633 +msgid "All in One WP Security and Firewall" +msgstr "" + +#: admin/wp-security-firewall-menu.php:634 +msgid "We were unable to access the firewall's configuration file:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:636 +msgid "As a result, the firewall will be unavailable." +msgstr "" + +#: admin/wp-security-firewall-menu.php:637 +msgid "Please check your PHP error log for further information." +msgstr "" + +#: admin/wp-security-firewall-menu.php:638 +msgid "If you're unable to locate your PHP log file, please contact your web hosting company to ask them where it can be found on their setup." +msgstr "" + +#: admin/wp-security-firewall-menu.php:655 +msgid "This feature allows you to activate the %s (or legacy %s) firewall security protection rules designed and produced by %s." +msgstr "Esse recurso permite que você ative o %s (ou %s legado) regras de proteção de segurança de firewall projetado e produzido por %s." + +#: admin/wp-security-firewall-menu.php:656 +msgid "The 6G Blacklist is updated and improved version of 5G Blacklist. If you have 5G Blacklist active, you might consider activating 6G Blacklist instead." +msgstr "A lista negra 6G é atualizada e melhorada da versão da lista negra 5G. Se você tem lista negra 5G ativa, você pode considerar ativando a lista negra 6G em vez disso." + +#: admin/wp-security-firewall-menu.php:657 +msgid "The 6G Blacklist is a simple, flexible blacklist that helps reduce the number of malicious URL requests that hit your website." +msgstr "Lista negra 6G é uma lista negra simples, flexível, que ajuda a reduzir o número de solicitações de URL maliciosas que atingem seu site." + +#: admin/wp-security-firewall-menu.php:658 +msgid "The added advantage of applying the 6G firewall to your site is that it has been tested and confirmed by the people at PerishablePress.com to be an optimal and least disruptive set of .htaccess security rules for general WP sites running on an Apache server or similar." +msgstr "A vantagem de aplicar o firewall 6G para o seu site é que ele foi testado e confirmado pelas pessoas em PerishablePress.com ser um conjunto ideal e menos perturbadora de regras de segurança de .htaccess para sites gerais WP, executando em um servidor Apache ou similar." + +#: admin/wp-security-firewall-menu.php:659 +msgid "Therefore the 6G firewall rules should not have any impact on your site's general functionality but if you wish you can take a %s of your .htaccess file before proceeding." +msgstr "Portanto, as regras de firewall 6G não devem ter qualquer impacto na funcionalidade geral do seu site, mas se quiser você pode tomar um %s de seu arquivo .htaccess antes de prosseguir." + +#: admin/wp-security-firewall-menu.php:665 +msgid "6G blacklist/firewall settings" +msgstr "Configurações de firewall / lista negra 6G" + +#: admin/wp-security-firewall-menu.php:677 +msgid "Enable 6G firewall protection" +msgstr "Habilitar proteção de firewall 6G" + +#: admin/wp-security-firewall-menu.php:680 +msgid "Check this if you want to apply the 6G Blacklist firewall protection from perishablepress.com to your site." +msgstr "Marque esta opção se você deseja aplicar a proteção de firewall de lista negra 6G de perishablepress.com para o seu site." + +#: admin/wp-security-firewall-menu.php:684 +msgid "This setting will implement the 6G security firewall protection mechanisms on your site which include the following things:" +msgstr "Esta configuração irá implementar os mecanismos de proteção de firewall de segurança 6G em seu site que incluem as seguintes coisas:" + +#: admin/wp-security-firewall-menu.php:685 +#: admin/wp-security-firewall-menu.php:703 +msgid "1) Block forbidden characters commonly used in exploitative attacks." +msgstr "1) Caracteres em bloco proibido comumente usado em ataques de exploração." + +#: admin/wp-security-firewall-menu.php:686 +#: admin/wp-security-firewall-menu.php:704 +msgid "2) Block malicious encoded URL characters such as the \".css(\" string." +msgstr "2) Bloquear caracteres codificados de URL maliciosos, tais como o \".css(\" sequências." + +#: admin/wp-security-firewall-menu.php:687 +#: admin/wp-security-firewall-menu.php:705 +msgid "3) Guard against the common patterns and specific exploits in the root portion of targeted URLs." +msgstr "3) Proteja-se contra os padrões comuns e exploração específicas na parte de raiz de URLs de destino." + +#: admin/wp-security-firewall-menu.php:688 +#: admin/wp-security-firewall-menu.php:706 +msgid "4) Stop attackers from manipulating query strings by disallowing illicit characters." +msgstr "4) Pare atacantes de manipular sequências de consulta por não permitir caracteres ilícitos." + +#: admin/wp-security-firewall-menu.php:689 +#: admin/wp-security-firewall-menu.php:707 +msgid "....and much more." +msgstr "....e muito mais." + +#: admin/wp-security-firewall-menu.php:695 +msgid "Enable legacy 5G firewall protection" +msgstr "Habilitar proteção de firewall 5G legado" + +#: admin/wp-security-firewall-menu.php:698 +msgid "Check this if you want to apply the 5G Blacklist firewall protection from perishablepress.com to your site." +msgstr "Marque esta opção se você deseja aplicar a proteção de firewall de lista negra 5G de perishablepress.com para o seu site." + +#: admin/wp-security-firewall-menu.php:702 +msgid "This setting will implement the 5G security firewall protection mechanisms on your site which include the following things:" +msgstr "Esta configuração irá implementar os mecanismos de proteção de firewall de segurança 5G em seu site que incluem as seguintes coisas:" + +#: admin/wp-security-firewall-menu.php:713 +msgid "Save 5G/6G firewall settings" +msgstr "Salvar configurações de firewall 5G/6G" + +#: admin/wp-security-firewall-menu.php:721 +msgid "6G block request methods" +msgstr "" + +#: admin/wp-security-firewall-menu.php:725 +msgid "HTTP Request methods are used by browsers and clients to communicate with servers to get responses." +msgstr "" + +#: admin/wp-security-firewall-menu.php:726 +msgid "GET and POST are the most commonly used methods to request and submit data for specified resources of the server." +msgstr "" + +#: admin/wp-security-firewall-menu.php:732 +msgid "Block %s method" +msgstr "" + +#: admin/wp-security-firewall-menu.php:735 +msgid "Check this to block the %s request method" +msgstr "" + +#: admin/wp-security-firewall-menu.php:740 +msgid "Some WooCommerce extensions use the PUT request method in addition to GET and POST." +msgstr "" + +#: admin/wp-security-firewall-menu.php:740 +msgid "This means WooCommerce users shouldn't block the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:741 +msgid "A few REST requests use the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:741 +msgid "If your site is communicated by the WP REST API, you should not block the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:749 +msgid "Save request methods settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:757 +msgid "6G other settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:761 +msgid "Block query strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:764 +msgid "Check this to block all query strings recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:768 +msgid "Block request strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:771 +msgid "Check this to block all request strings recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:775 +msgid "Block referrers" +msgstr "" + +#: admin/wp-security-firewall-menu.php:778 +msgid "Check this to block all referrers recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:782 +msgid "Block user-agents" +msgstr "" + +#: admin/wp-security-firewall-menu.php:785 +msgid "Check this to block all user-agents recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:789 +msgid "Save other settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:823 +msgid "The Internet bot settings were successfully saved" +msgstr "As configurações de robôs da internet foram salvas com sucesso" + +#: admin/wp-security-firewall-menu.php:827 +msgid "Internet bot settings" +msgstr "Configurações de robôs da internet" + +#: admin/wp-security-firewall-menu.php:833 +msgid "What is an Internet Bot" +msgstr "" + +#: admin/wp-security-firewall-menu.php:834 +msgid "%s?" +msgstr "%s?" + +#: admin/wp-security-firewall-menu.php:836 +msgid "A bot is a piece of software which runs on the Internet and performs automatic tasks. For example when Google indexes your pages it uses automatic bots to achieve this task." +msgstr "Um robô é um pedaço de software que é executado na internet e executa tarefas automáticas. Por exemplo, quando o Google indexa suas páginas ele usa robôs automáticos para realizar esta tarefa." + +#: admin/wp-security-firewall-menu.php:837 +msgid "A lot of bots are legitimate and non-malicous but not all bots are good and often you will find some which try to impersonate legitimate bots such as \"Googlebot\" but in reality they have nohing to do with Google at all." +msgstr "Um monte de robôs são legítimos e não malicioso mas não todos os robôs são bons e muitas vezes você vai encontrar alguns que tentam representar legítimo robôs como \"Googlebot\" mas na realidade eles não têm nada a ver com o Google em tudo." + +#: admin/wp-security-firewall-menu.php:838 +msgid "Although most of the bots out there are relatively harmless sometimes website owners want to have more control over which bots they allow into their site." +msgstr "Embora a maioria dos robôs lá fora, são relativamente inofensivos, às vezes proprietários de site querem ter mais controle sobre quais robôs permitem em seu site." + +#: admin/wp-security-firewall-menu.php:839 +msgid "This feature allows you to block bots which are impersonating as a Googlebot but actually aren't. (In other words they are fake Google bots)" +msgstr "Esse recurso permite você bloquear robôs que estão representando como um Googlebot, mas na verdade não são. (Em outras palavras, eles são falsos robôs do Google)" + +#: admin/wp-security-firewall-menu.php:840 +msgid "Googlebots have a unique indentity which cannot easily be forged and this feature will indentify any fake Google bots and block them from reading your site's pages." +msgstr "Googlebots tem uma identidade exclusiva, que não pode ser facilmente forjado e esse recurso irá identificar quaisquer falsos robôs do Google e bloqueá-los de ler as páginas do seu site." + +#: admin/wp-security-firewall-menu.php:846 +msgid "Attention: Sometimes non-malicious Internet organizations might have bots which impersonate as a \"Googlebot\"." +msgstr "Atenção: Organizações da internet, por vezes, não maliciosos podem ter robôs que imitam como um \"Googlebot\"." + +#: admin/wp-security-firewall-menu.php:847 +msgid "Just be aware that if you activate this feature the plugin will block all bots which use the \"Googlebot\" string in their User Agent information but are NOT officially from Google (irrespective whether they are malicious or not)." +msgstr "Esteja ciente de que, se você ativar esse recurso o plugin irá bloquear todos os robôs que usar a sequência de \"Googlebot\" em suas informações de agente de usuário, mas não são oficialmente do Google (independentemente se eles são mal-intencionados ou não). " + +#: admin/wp-security-firewall-menu.php:848 +msgid "All other bots from other organizations such as \"Yahoo\", \"Bing\" etc will not be affected by this feature." +msgstr "Todos os outros robôs de outras organizações, tais como \"Yahoo\", \"Bing\" etc não serão afetados por esse recurso." + +#: admin/wp-security-firewall-menu.php:854 +#: admin/wp-security-firewall-menu.php:864 +#: classes/grade-system/wp-security-feature-item-manager.php:93 +msgid "Block fake Googlebots" +msgstr "Bloquear Googlebots falsos" + +#: admin/wp-security-firewall-menu.php:867 +msgid "Check this if you want to block all fake Googlebots." +msgstr "Marque esta opção se você deseja bloquear todos os Googlebots falsos." + +#: admin/wp-security-firewall-menu.php:871 +msgid "This feature will check if the User Agent information of a bot contains the string \"Googlebot\"." +msgstr "Esta característica irá verificar se as informações do agente de usuário de um robô contém a sequência de caracteres \"Googlebot\"." + +#: admin/wp-security-firewall-menu.php:872 +msgid "It will then perform a few tests to verify if the bot is legitimately from Google and if so it will allow the bot to proceed." +msgstr "Em seguida, ele irá executar alguns testes para verificar se o robô é legitimamente do Google e se assim permitirá que o robô prosseguir." + +#: admin/wp-security-firewall-menu.php:873 +msgid "If the bot fails the checks then the plugin will mark it as being a fake Googlebot and it will block it" +msgstr "Se o robô falha nas verificações em seguida, o plugin irá marcá-lo como sendo um Googlebot falso e ele vai bloqueá-lo" + +#: admin/wp-security-firewall-menu.php:880 +msgid "Save internet bot settings" +msgstr "Salvar configurações de robô da internet" + +#: admin/wp-security-firewall-menu.php:916 +#: admin/wp-security-firewall-menu.php:938 +#: classes/grade-system/wp-security-feature-item-manager.php:95 +msgid "Prevent image hotlinking" +msgstr "Evitar hotlinking de imagem" + +#: admin/wp-security-firewall-menu.php:919 +msgid "A Hotlink is where someone displays an image on their site which is actually located on your site by using a direct link to the source of the image on your server." +msgstr "Um hotlink é onde alguém exibe uma imagem em seu site que encontra em seu site usando um link direto para a fonte da imagem no seu servidor." + +#: admin/wp-security-firewall-menu.php:920 +msgid "Due to the fact that the image being displayed on the other person's site is coming from your server, this can cause leaking of bandwidth and resources for you because your server has to present this image for the people viewing it on someone elses's site." +msgstr "Devido ao fato de que a imagem seja exibida no site da outra pessoa está vindo do seu servidor, isso pode causar vazamento de largura de banda e recursos para você, porque o servidor tem de apresentar essa imagem para as pessoas vê-lo em algum local do site da elses." + +#: admin/wp-security-firewall-menu.php:921 +msgid "This feature will prevent people from directly hotlinking images from your site's pages by writing some directives in your .htaccess file." +msgstr "Este recurso irá impedir pessoas de diretamente de hotlinking de imagens de páginas de seu site, escrevendo algumas diretivas em seu arquivo .htaccess." + +#: admin/wp-security-firewall-menu.php:926 +msgid "Prevent hotlinking" +msgstr "Evitar hotlinking" + +#: admin/wp-security-firewall-menu.php:941 +msgid "Check this if you want to prevent hotlinking to images on your site." +msgstr "Marque esta opção se você deseja evitar hotlinking de imagens no seu site." + +#: admin/wp-security-firewall-menu.php:961 +msgid "Nonce check failed for delete all 404 event logs operation!" +msgstr "Verificação núncio falhou para operação de exclusão de todos os registros de eventos 404!" + +#: admin/wp-security-firewall-menu.php:972 +msgid "404 Detection Feature - Delete all 404 event logs operation failed!" +msgstr "Recurso de detecção 404 - Excluir todos os registros de eventos 404 com falha na operação!" + +#: admin/wp-security-firewall-menu.php:976 +msgid "All 404 event logs were deleted from the DB successfully!" +msgstr "Todos os registros de eventos 404 foram excluídos do banco de dados com sucesso!" + +#: admin/wp-security-firewall-menu.php:1000 +msgid "You entered a non numeric value for the lockout time length field. It has been set to the default value." +msgstr "Você digitou um valor não numérico para o campo de comprimento tempo de bloqueio. Foi definido como o valor padrão." + +#: admin/wp-security-firewall-menu.php:1006 +msgid "You entered an incorrect format for the \"Redirect URL\" field. It has been set to the default value." +msgstr "Você digitou um formato incorreto para o campo \"Redirecionamento de URL\". Foi definido como o valor padrão." + +#: admin/wp-security-firewall-menu.php:1039 +msgid "404 detection configuration" +msgstr "Configuração de detecção 404" + +#: admin/wp-security-firewall-menu.php:1042 +msgid "A 404 or Not Found error occurs when somebody tries to access a non-existent page on your website." +msgstr "Um 404 ou nenhum erro encontrado ocorre quando alguém tenta acessar uma página inexistente em seu site." + +#: admin/wp-security-firewall-menu.php:1043 +msgid "Typically, most 404 errors happen quite innocently when people have mis-typed a URL or used an old link to page which doesn't exist anymore." +msgstr "Normalmente, a maioria dos erros 404 acontecer muito inocentemente quando as pessoas têm mal digitado uma URL ou usado um link antigo para a página que não existe mais." + +#: admin/wp-security-firewall-menu.php:1044 +msgid "However, in some cases you may find many repeated 404 errors which occur in a relatively short space of time and from the same IP address which are all attempting to access a variety of non-existent page URLs." +msgstr "No entanto, em alguns casos, você pode encontrar muitos repetidos erros 404 que ocorrem em um espaço relativamente curto de tempo e com o mesmo endereço IP que estão todos tentando acessar uma variedade de URLs de páginas inexistentes." + +#: admin/wp-security-firewall-menu.php:1045 +msgid "Such behaviour can mean that a hacker might be trying to find a particular page or URL for sinister reasons." +msgstr "Tal comportamento pode significar que um hacker pode estar tentando encontrar uma determinada página ou URL por razões sinistras." + +#: admin/wp-security-firewall-menu.php:1046 +msgid "This feature allows you to monitor all 404 events which occur on your site, and it also gives you the option of blocking IP addresses for a configured length of time." +msgstr "Este recurso permite que você monitore todos os eventos 404 que ocorrem em seu site, e também lhe dá a opção de bloquear endereços IP configurado por um período de tempo." + +#: admin/wp-security-firewall-menu.php:1047 +msgid "If you want to temporarily block or blacklist an IP address, simply click the \"Temp Block\" or \"Blacklist IP\" link for the applicable IP entry in the \"404 Event Logs\" table below." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1071 +msgid "404 detection options" +msgstr "Opções de detecção 404" + +#: admin/wp-security-firewall-menu.php:1083 +msgid "Enable 404 IP detection and lockout" +msgstr "Habilita detecção 404 de IP e bloqueio" + +#: admin/wp-security-firewall-menu.php:1086 +msgid "Check this if you want to enable the lockout of selected IP addresses." +msgstr "Marque esta opção se você deseja ativar o bloqueio de endereços IP selecionados." + +#: admin/wp-security-firewall-menu.php:1091 +msgid "When you enable this checkbox, all 404 events on your site will be logged in the table below. You can monitor these events and select some IP addresses listed in the table below and block them for a specified amount of time. All IP addresses you select to be blocked from the \"404 Event Logs\" table section will be unable to access your site during the time specified." +msgstr "Quando você ativa esta opção, todos os eventos 404 em seu site serão registrados na tabela abaixo. Você pode monitorar esses eventos e selecionar alguns endereços IP listados na tabela abaixo e bloqueá-los para um determinado período de tempo. Todos os endereços IP que você selecionar a ser bloqueado a partir da secção da tabela \"registros de evento 404\" não será capaz de acessar seu site durante o tempo especificado." + +#: admin/wp-security-firewall-menu.php:1099 +msgid "Enable 404 event logging" +msgstr "Habilitar registro de eventos 404" + +#: admin/wp-security-firewall-menu.php:1102 +msgid "Check this if you want to enable the logging of 404 events" +msgstr "Marque esta opção se você deseja ativar o registro de eventos 404" + +#: admin/wp-security-firewall-menu.php:1107 +msgid "Time length of 404 lockout (minutes)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1109 +msgid "Set the length of time for which a blocked IP address will be prevented from visiting your site" +msgstr "Defina o período de tempo durante o qual um endereço IP bloqueado será impedido de visitar o seu site" + +#: admin/wp-security-firewall-menu.php:1114 +msgid "You can lock any IP address which is recorded in the \"404 Event Logs\" table section below." +msgstr "Você pode bloquear qualquer endereço IP que está registrado na seção de tabela \"registros de evento 404\" abaixo." + +#: admin/wp-security-firewall-menu.php:1116 +msgid "To temporarily lock an IP address, hover over the ID column and click the \"Temp Block\" link for the applicable IP entry." +msgstr "Para bloquear temporariamente um endereço IP, passe o mouse sobre a coluna ID e clique no link \"Temp Block\" para a entrada IP aplicável." + +#: admin/wp-security-firewall-menu.php:1123 +msgid "404 lockout redirect URL" +msgstr "Redirecionamento de URL 404 bloqueada" + +#: admin/wp-security-firewall-menu.php:1125 +msgid "A blocked visitor will be automatically redirected to this URL." +msgstr "Um visitante bloqueado será automaticamente redirecionado para esta URL." + +#: admin/wp-security-firewall-menu.php:1135 +msgid "This list displays the 404 event logs when somebody tries to access a non-existent page on your website." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1136 +msgid "404 event logs that are older than %1$d days are purged automatically." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1141 +msgid "404 event logs" +msgstr "Registros de eventos 404" + +#: admin/wp-security-firewall-menu.php:1163 +#: admin/wp-security-firewall-menu.php:1172 +#: admin/wp-security-user-login-menu.php:495 +#: admin/wp-security-user-login-menu.php:504 +#: admin/wp-security-user-login-menu.php:653 +#: admin/wp-security-user-login-menu.php:662 +msgid "Export to CSV" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1169 +#: admin/wp-security-user-login-menu.php:501 +#: admin/wp-security-user-login-menu.php:659 +msgid "Click this button if you wish to download this log in CSV format." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1176 +#: admin/wp-security-firewall-menu.php:1185 +msgid "Delete all 404 event logs" +msgstr "Excluir todos os registros de eventos 404" + +#: admin/wp-security-firewall-menu.php:1182 +msgid "Click this button if you wish to purge all 404 event logs from the DB." +msgstr "Clique nesse botão se você deseja limpar todos os registros de eventos 404 do banco de dados." + +#: admin/wp-security-firewall-menu.php:1241 +msgid "Custom .htaccess rules settings" +msgstr "Configurações de regras .htaccess personalizadas" + +#: admin/wp-security-firewall-menu.php:1248 +msgid "This feature can be used to apply your own custom .htaccess rules and directives." +msgstr "Esse recurso pode ser usado para aplicar suas próprias regras .htaccess e diretivas personalizadas." + +#: admin/wp-security-firewall-menu.php:1249 +msgid "It is useful for when you want to tweak our existing firewall rules or when you want to add your own." +msgstr "É útil para quando você quer ajustar as nossas regras de firewall existentes ou quando você deseja adicionar o seu próprio." + +#: admin/wp-security-firewall-menu.php:1250 +msgid "NOTE: This feature can only be used if your site is hosted in an apache or similar web server." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1256 +msgid "Warning: Only use this feature if you know what you are doing." +msgstr "Aviso: Só use esse recurso se você sabe o que está fazendo." + +#: admin/wp-security-firewall-menu.php:1257 +msgid "Incorrect .htaccess rules or directives can break or prevent access to your site." +msgstr "Regras .htaccess ou diretivas incorretas podem quebrar ou impedir o acesso ao seu site." + +#: admin/wp-security-firewall-menu.php:1258 +msgid "It is your responsibility to ensure that you are entering the correct code!" +msgstr "É de sua responsabilidade para garantir que você está digitando o código correto!" + +#: admin/wp-security-firewall-menu.php:1259 +msgid "If you break your site you will need to access your server via FTP or something similar and then edit your .htaccess file and delete the changes you made." +msgstr "Se você quebrar seu site, você precisará acessar o servidor via FTP ou algo similar e, em seguida, editar o seu arquivo .htaccess e excluir as alterações feitas." + +#: admin/wp-security-firewall-menu.php:1265 +msgid "Custom .htaccess rules" +msgstr "Regras .htaccess personalizadas" + +#: admin/wp-security-firewall-menu.php:1269 +msgid "Enable custom .htaccess rules" +msgstr "Habilitar regras .htaccess personalizadas" + +#: admin/wp-security-firewall-menu.php:1272 +msgid "Check this if you want to enable custom rules entered in the text box below" +msgstr "Marque esta opção se você deseja ativar regras personalizadas inseridas na caixa de texto abaixo" + +#: admin/wp-security-firewall-menu.php:1276 +msgid "Place custom rules at the top" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1279 +msgid "Check this if you want to place your custom rules at the beginning of all the rules applied by this plugin" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1283 +msgid "Enter custom .htaccess rules:" +msgstr "Digite regras .htaccess personalizadas:" + +#: admin/wp-security-firewall-menu.php:1287 +msgid "Enter your custom .htaccess rules/directives." +msgstr "Digite suas regras/diretivas .htaccess personalizadas" + +#: admin/wp-security-firewall-menu.php:1292 +msgid "Save custom rules" +msgstr "Salvar regras personalizadas" + +#: admin/wp-security-firewall-setup-notice.php:338 +#: admin/wp-security-firewall-setup-notice.php:407 +#: admin/wp-security-firewall-setup-notice.php:479 +#: admin/wp-security-firewall-setup-notice.php:595 +#: wp-security.php:43 +msgid "All In One WP Security and Firewall" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:340 +msgid "We were unable to create the file necessary to give you the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:341 +msgid "Your firewall will have reduced protection which means some of your firewall's functionality will be unavailable." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:342 +msgid "If you would like to manually set up the necessary file, please follow these steps:" +msgstr "" + +#. translators: %s Boostrap file name. +#. translators: %s Firewall file name. +#: admin/wp-security-firewall-setup-notice.php:346 +#: admin/wp-security-firewall-setup-notice.php:453 +msgid "1. Create a file with the name %s in the same directory as your WordPress install is in, i.e.:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:350 +msgid "2. Paste in the following code:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:352 +#: admin/wp-security-firewall-setup-notice.php:462 +msgid "3. Save the file and press the 'Try again' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:372 +msgid "1. Open the following file:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:378 +msgid "2. Look for the auto_prepend_file directive." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:382 +msgid "2. Look for the following:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:388 +msgid "3. Change it to the following:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:392 +msgid "4. Save the file and press the 'Try again' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:392 +#: admin/wp-security-firewall-setup-notice.php:441 +msgid "You may have to wait up to 5 minutes before the settings take effect." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:410 +msgid "Your firewall has been installed with the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:411 +msgid "You may have to wait 5 minutes for the changes to take effect." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:434 +msgid "1. Open your php.ini file." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:437 +msgid "2. Set the auto_prepend_file directive like below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:441 +msgid "3. Restart the webserver and refresh the page" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:458 +msgid "2. Paste in the following directives:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:482 +msgid "We were unable to set up your firewall with the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:483 +msgid "Your firewall will have reduced functionality." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:487 +msgid "To give your site the highest level of protection, please follow these steps:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:500 +msgid "Note: if you're unable to perform any of the aforementioned steps, please ask your web hosting provider for further assistance." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:517 +msgid "Try again" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:539 +msgid "We have detected that your AIOS firewall is not fully installed, and therefore does not have the highest level of protection. " +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:540 +msgid "Your firewall will have reduced functionality until it has been upgraded. " +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:542 +msgid "Upgrade your protection now" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:598 +msgid "Our PHP-based firewall has been created to give you even greater protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:602 +msgid "If you already have our .htaccess-based firewall enabled, you will still need to set up the PHP-based firewall to benefit from its protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:605 +msgid "To set up the PHP-based firewall, press the 'Set up now' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:608 +msgid "Set up now" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:614 +#: templates/notices/custom-notice.php:10 +#: templates/notices/custom-notice.php:12 +#: templates/notices/horizontal-notice.php:50 +#: templates/notices/horizontal-notice.php:52 +#: templates/notices/htaccess-to-php-feature-notice.php:10 +#: templates/notices/htaccess-to-php-feature-notice.php:12 +msgid "Dismiss" +msgstr "" + +#: admin/wp-security-list-404.php:91 +msgid "Event type" +msgstr "" + +#: admin/wp-security-list-404.php:92 +#: admin/wp-security-list-logged-in-users.php:46 +#: admin/wp-security-list-registered-users.php:74 +msgid "IP address" +msgstr "" + +#: admin/wp-security-list-404.php:93 +msgid "Attempted URL" +msgstr "" + +#: admin/wp-security-list-404.php:94 +msgid "Referer" +msgstr "" + +#: admin/wp-security-list-404.php:96 +msgid "Lock status" +msgstr "" + +#: admin/wp-security-list-404.php:118 +msgid "Temp block IP" +msgstr "" + +#: admin/wp-security-list-404.php:119 +msgid "Blacklist IP" +msgstr "" + +#: admin/wp-security-list-404.php:120 +#: admin/wp-security-list-acct-activity.php:82 +#: admin/wp-security-list-locked-ip.php:37 +#: admin/wp-security-list-locked-ip.php:84 +#: admin/wp-security-list-login-fails.php:73 +#: admin/wp-security-list-registered-users.php:93 +msgid "Delete" +msgstr "" + +#: admin/wp-security-list-404.php:128 +#: admin/wp-security-list-404.php:136 +#: admin/wp-security-list-404.php:143 +#: admin/wp-security-list-acct-activity.php:92 +#: admin/wp-security-list-comment-spammer-ip.php:95 +#: admin/wp-security-list-locked-ip.php:97 +#: admin/wp-security-list-locked-ip.php:105 +#: admin/wp-security-list-login-fails.php:85 +#: admin/wp-security-list-permanent-blocked-ip.php:96 +#: admin/wp-security-list-registered-users.php:107 +#: admin/wp-security-list-registered-users.php:115 +#: admin/wp-security-list-registered-users.php:123 +msgid "Please select some records using the checkboxes" +msgstr "Por favor, selecione alguns registros usando as caixas de seleção" + +#: admin/wp-security-list-404.php:278 +msgid "Nonce check failed for delete selected 404 event logs operation!" +msgstr "Verificação núncio falhou para operação de exclusão dos registros de eventos 404 selecionados!" + +#: admin/wp-security-list-acct-activity.php:35 +msgid "Are you sure you want to delete this item?" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:46 +msgid "Login session still active" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:60 +#: admin/wp-security-list-locked-ip.php:60 +#: admin/wp-security-list-logged-in-users.php:44 +#: admin/wp-security-list-login-fails.php:54 +#: admin/wp-security-list-registered-users.php:69 +msgid "User ID" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:61 +#: admin/wp-security-list-locked-ip.php:61 +#: admin/wp-security-list-login-fails.php:55 +msgid "Username" +msgstr "Nome de usuário" + +#: admin/wp-security-list-acct-activity.php:62 +msgid "Login date" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:63 +msgid "Logout date" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:136 +msgid "Nonce check failed for delete selected account activity logs operation!" +msgstr "Verificação núncio falhou para operação de exclusão dos registros de atividade das contas selecionadas!" + +#: admin/wp-security-list-comment-spammer-ip.php:59 +msgid "Spammer IP" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:60 +msgid "Number of spam comments from this IP" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:61 +msgid "Status" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:81 +msgid "Block" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:130 +#: admin/wp-security-list-comment-spammer-ip.php:179 +msgid "Nonce check failed for delete selected blocked IP operation!" +msgstr "Verificação núncio falhou para operação de exclusão de IP bloqueado selecionado!" + +#: admin/wp-security-list-comment-spammer-ip.php:137 +msgid "The selected IP addresses are now permanently blocked!" +msgstr "Os endereços IP selecionados agora estão permanentemente bloqueados!" + +#: admin/wp-security-list-comment-spammer-ip.php:193 +msgid "The selected IP addresses were saved in the blacklist configuration settings." +msgstr "Os endereços IP selecionados foram salvas nas definições de configuração de lista negra." + +#: admin/wp-security-list-comment-spammer-ip.php:201 +msgid "The .htaccess file was successfully modified to include the selected IP addresses." +msgstr "O arquivo .htaccess foi modificado com sucesso para incluir os endereços IP selecionados." + +#: admin/wp-security-list-comment-spammer-ip.php:212 +msgid "NOTE: The .htaccess file was not modified because you have disabled the \"Enable IP or User Agent Blacklisting\" check box." +msgstr "NOTA: O arquivo .htaccess não foi modificado porque você desativou a caixa de seleção \"Ativar IP ou lista negra de agente de usuário\"." + +#: admin/wp-security-list-comment-spammer-ip.php:213 +msgid "To block these IP addresses you will need to enable the above flag in the %s menu" +msgstr "Para bloquear esses endereços IP você precisará habilitar o sinalizador acima no menu %s" + +#: admin/wp-security-list-debug.php:47 +msgid "Level" +msgstr "" + +#: admin/wp-security-list-debug.php:48 +msgid "Message" +msgstr "" + +#: admin/wp-security-list-debug.php:49 +msgid "Type" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:36 +#: admin/wp-security-list-locked-ip.php:83 +msgid "Unlock" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:59 +msgid "Locked IP/range" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:62 +#: admin/wp-security-list-permanent-blocked-ip.php:67 +msgid "Reason" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:63 +msgid "Date locked" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:64 +msgid "Release date" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:134 +msgid "The selected IP entries were unlocked successfully." +msgstr "As entradas selecionadas do IP foram desbloqueadas com sucesso." + +#: admin/wp-security-list-locked-ip.php:140 +msgid "Nonce check failed for unlock IP operation!" +msgstr "Verificação núncio falhou para operação de desbloqueio de IP!" + +#: admin/wp-security-list-locked-ip.php:147 +msgid "The selected IP entry was unlocked successfully." +msgstr "A entrada IP selecionado foi desbloqueado com sucesso!" + +#: admin/wp-security-list-logged-in-users.php:45 +#: admin/wp-security-list-registered-users.php:70 +msgid "Login name" +msgstr "" + +#: admin/wp-security-list-logged-in-users.php:87 +msgid "Nonce check failed for force user logout operation!" +msgstr "Verificação núncio falhou para operação de saída do usuário à força!" + +#: admin/wp-security-list-logged-in-users.php:96 +msgid "The selected user was logged out successfully!" +msgstr "O usuário selecionado foi desconectado com sucesso!" + +#: admin/wp-security-list-login-fails.php:53 +msgid "Login IP range" +msgstr "" + +#: admin/wp-security-list-login-fails.php:130 +msgid "Nonce check failed for delete failed login record operation!" +msgstr "Verificação núncio falhou para operação de exclusão de registro de login com falha!" + +#: admin/wp-security-list-permanent-blocked-ip.php:66 +msgid "Blocked IP" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:87 +msgid "Unblock" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:122 +#: admin/wp-security-list-permanent-blocked-ip.php:139 +msgid "Successfully unblocked and deleted the selected record(s)." +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:126 +#: admin/wp-security-list-permanent-blocked-ip.php:143 +msgid "Failed to unblock and delete the selected record(s)." +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:133 +msgid "Nonce check failed for unblock IP operation!" +msgstr "Verificação núncio falhou para operação de desbloqueio de IP!" + +#: admin/wp-security-list-registered-users.php:71 +msgid "Email" +msgstr "" + +#: admin/wp-security-list-registered-users.php:72 +msgid "Register date" +msgstr "" + +#: admin/wp-security-list-registered-users.php:73 +msgid "Account status" +msgstr "" + +#: admin/wp-security-list-registered-users.php:92 +msgid "Approve" +msgstr "" + +#: admin/wp-security-list-registered-users.php:94 +msgid "Block IP" +msgstr "" + +#: admin/wp-security-list-registered-users.php:159 +msgid "The selected accounts were approved successfully!" +msgstr "As contas selecionadas foram aprovados com sucesso!" + +#: admin/wp-security-list-registered-users.php:163 +msgid "The following accounts failed to update successfully: " +msgstr "As seguintes contas falharam ao atualizar com sucesso: " + +#: admin/wp-security-list-registered-users.php:171 +msgid "The selected account was approved successfully!" +msgstr "A conta selecionada foi aprovada com sucesso!" + +#: admin/wp-security-list-registered-users.php:190 +msgid "Your account is now active" +msgstr "Sua conta já está ativa" + +#: admin/wp-security-list-registered-users.php:191 +msgid "Your account with username: " +msgstr "Sua conta com nome de usuário: " + +#: admin/wp-security-list-registered-users.php:191 +msgid " is now active" +msgstr " agora está ativa" + +#: admin/wp-security-list-registered-users.php:222 +msgid "The selected accounts were deleted successfully!" +msgstr "As contas selecionadas foram excluídas com sucesso!" + +#: admin/wp-security-list-registered-users.php:230 +msgid "Nonce check failed for delete registered user account operation!" +msgstr "Verificação núncio falhou para operação de exclusão de conta de usuário registrado!" + +#: admin/wp-security-list-registered-users.php:238 +msgid "The selected account was deleted successfully!" +msgstr "A conta selecionada foi excluída com sucesso!" + +#: admin/wp-security-list-registered-users.php:264 +msgid "The selected IP addresses were successfully added to the permanent block list!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:265 +#: admin/wp-security-list-registered-users.php:282 +msgid "View Blocked IPs" +msgstr "Ver IPs bloqueados" + +#: admin/wp-security-list-registered-users.php:274 +msgid "Nonce check failed for block IP operation of registered user!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:281 +msgid "The selected IP was successfully added to the permanent block list!" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:25 +msgid "Visitor lockout" +msgstr "Bloqueio de visitantes" + +#: admin/wp-security-maintenance-menu.php:85 +msgid "Site lockout feature settings saved!" +msgstr "Configurações de recurso de bloqueio de site salvas!" + +#: admin/wp-security-maintenance-menu.php:92 +msgid "General visitor lockout" +msgstr "Bloqueio de visitante geral" + +#: admin/wp-security-maintenance-menu.php:98 +msgid "This feature allows you to put your site into \"maintenance mode\" by locking down the front-end to all visitors except logged in users with super admin privileges." +msgstr "Esse recurso permite à você colocar seu site no \"modo de manutenção\" por bloquear o front-end para todos os visitantes, exceto usuários logados com privilégios de super administrador." + +#: admin/wp-security-maintenance-menu.php:99 +msgid "Locking your site down to general visitors can be useful if you are investigating some issues on your site or perhaps you might be doing some maintenance and wish to keep out all traffic for security reasons." +msgstr "Bloquear o seu site no ar para os visitantes em geral pode ser útil se você está investigando alguns problemas em seu site ou talvez você poderia estar fazendo alguma manutenção e deseja manter fora todo o tráfego por razões de segurança." + +#: admin/wp-security-maintenance-menu.php:104 +msgid "Enable front-end lockout" +msgstr "Habilitar bloqueio de front-end" + +#: admin/wp-security-maintenance-menu.php:107 +msgid "Check this if you want all visitors except those who are logged in as administrator to be locked out of the front-end of your site." +msgstr "Marque esta opção se você deseja que todos os visitantes, exceto aqueles que estão logado como administrador para ser bloqueado para fora do front-end do seu site." + +#: admin/wp-security-maintenance-menu.php:111 +msgid "Enter a message:" +msgstr "Digite uma mensagem:" + +#: admin/wp-security-maintenance-menu.php:123 +msgid "Enter a message you wish to display to visitors when your site is in maintenance mode." +msgstr "Digite uma mensagem que você deseja exibir aos visitantes, quando seu site estiver em modo de manutenção." + +#: admin/wp-security-maintenance-menu.php:130 +msgid "Save site lockout settings" +msgstr "Salvar configurações de bloqueio do site" + +#: admin/wp-security-misc-options-menu.php:28 +msgid "Copy protection" +msgstr "Proteção de cópia" + +#: admin/wp-security-misc-options-menu.php:29 +msgid "Frames" +msgstr "Quadros" + +#: admin/wp-security-misc-options-menu.php:30 +msgid "Users enumeration" +msgstr "Enumeração de usuários" + +#: admin/wp-security-misc-options-menu.php:31 +msgid "WP REST API" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:89 +msgid "Copy Protection feature settings saved!" +msgstr "Configurações de recurso de proteção contra cópia salvas!" + +#: admin/wp-security-misc-options-menu.php:94 +msgid "Disable the ability to copy text" +msgstr "Desabilitar a capacidade de copiar o texto" + +#: admin/wp-security-misc-options-menu.php:100 +msgid "This feature allows you to disable the ability to select and copy text from your front end." +msgstr "Esse recurso permite que você desative a capacidade de selecionar e copiar texto do seu front-end." + +#: admin/wp-security-misc-options-menu.php:101 +msgid "When admin user is logged in, the feature is automatically disabled for his session." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:106 +msgid "Enable copy protection" +msgstr "Habilitar proteção de cópia" + +#: admin/wp-security-misc-options-menu.php:109 +msgid "Check this if you want to disable the \"Right click\", \"Text selection\" and \"Copy\" option on the front end of your site." +msgstr "Marque esta opção se você deseja desativar o \"Clique Direito\", \"Seleção de Texto\" e a opção \"Copiar\" no front-end do seu site." + +#: admin/wp-security-misc-options-menu.php:116 +msgid "Save copy protection settings" +msgstr "Salvar configurações de proteção de cópia" + +#: admin/wp-security-misc-options-menu.php:140 +msgid "Frame Display Prevention feature settings saved!" +msgstr "Configurações de recursos de prevenção de exposição de quadro salvas!" + +#: admin/wp-security-misc-options-menu.php:145 +msgid "Prevent your site from being displayed in a frame" +msgstr "Impedir que o seu site seja exibido em um quadro" + +#: admin/wp-security-misc-options-menu.php:151 +msgid "This feature allows you to prevent other sites from displaying any of your content via a frame or iframe." +msgstr "Esse recurso permite que você impeça que outros sites de exibir qualquer um dos seus conteúdos através de um frame ou iframe." + +#: admin/wp-security-misc-options-menu.php:152 +msgid "When enabled, this feature will set the \"X-Frame-Options\" paramater to \"sameorigin\" in the HTTP header." +msgstr "Quando habilitado, esse recurso irá definir o parâmetro inválido \"X-Frame-Options\" para \"sameorigin\" no cabeçalho HTTP." + +#: admin/wp-security-misc-options-menu.php:157 +msgid "Enable iFrame protection" +msgstr "Habilitar proteção iFrame" + +#: admin/wp-security-misc-options-menu.php:160 +msgid "Check this if you want to stop other sites from displaying your content in a frame or iframe." +msgstr "Marque esta opção se você deseja impedir que outros sites exiba seu conteúdo em um frame ou iframe." + +#: admin/wp-security-misc-options-menu.php:191 +msgid "Users Enumeration Prevention feature settings saved!" +msgstr "Configurações de recurso de prevenção de enumeração de usuários salvas!" + +#: admin/wp-security-misc-options-menu.php:196 +msgid "Prevent users enumeration" +msgstr "Evitar enumeração de usuários" + +#: admin/wp-security-misc-options-menu.php:202 +msgid "This feature allows you to prevent external users/bots from fetching the user info with urls like \"/?author=1\"." +msgstr "Esse recurso permite-lhe evitar externas de usuários/robôs de buscar a informação do usuário com urls como \"/?author=1\"." + +#: admin/wp-security-misc-options-menu.php:203 +msgid "When enabled, this feature will print a \"forbidden\" error rather than the user information." +msgstr "Quando habilitado, esse recurso irá imprimir um erro \"proibido\", em vez das informações do usuário." + +#: admin/wp-security-misc-options-menu.php:208 +msgid "Disable users enumeration" +msgstr "Desabilitar enumeração de usuários" + +#: admin/wp-security-misc-options-menu.php:211 +msgid "Check this if you want to stop users enumeration." +msgstr "Marque esta opção se você deseja parar com a enumeração de usuários." + +#: admin/wp-security-misc-options-menu.php:242 +msgid "WP REST API Security feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:253 +msgid "This feature allows you to block WordPress REST API access for unauthorized requests." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:254 +msgid "When enabled this feature will only allow REST requests to be processed if the user is logged in." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:260 +msgid "Beware that if you are using other plugins which have registered REST endpoints (eg, Contact Form 7), then this feature will also block REST requests used by these plugins if the user is not logged in. It is recommended that you leave this feature disabled if you want uninterrupted functionality for such plugins." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:268 +msgid "Disallow unauthorized REST requests" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:271 +msgid "Check this if you want to stop REST API access for non-logged in requests." +msgstr "" + +#: admin/wp-security-settings-menu.php:25 +msgid "General settings" +msgstr "Configurações gerais" + +#: admin/wp-security-settings-menu.php:29 +#: admin/wp-security-settings-menu.php:33 +msgid "file" +msgstr "Arquivo" + +#: admin/wp-security-settings-menu.php:37 +msgid "Delete plugin settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:41 +msgid "WP version info" +msgstr "" + +#: admin/wp-security-settings-menu.php:45 +msgid "Import/Export" +msgstr "Importar / Exportar" + +#: admin/wp-security-settings-menu.php:52 +msgid "Advanced settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:128 +msgid "All the security features have been disabled successfully!" +msgstr "Todos os recursos de segurança foram desativados com sucesso!" + +#: admin/wp-security-settings-menu.php:132 +#: admin/wp-security-settings-menu.php:159 +msgid "Could not write to the .htaccess file. Please restore your .htaccess file manually using the restore functionality in the \".htaccess File\"." +msgstr "Não foi possível gravar no arquivo .htaccess. Por favor, restaure o arquivo .htaccess manualmente usando a funcionalidade de restauração do \"arquivo .htaccess\"." + +#: admin/wp-security-settings-menu.php:137 +msgid "Could not write to the wp-config.php. Please restore your wp-config.php file manually using the restore functionality in the \"wp-config.php File\"." +msgstr "Não foi possível escrever para o wp-config.php. Por favor, restaure o arquivo wp-config.php manualmente usando a funcionalidade de restauração do \"arquivo wp-config.php\"." + +#: admin/wp-security-settings-menu.php:155 +msgid "All firewall rules have been disabled successfully!" +msgstr "Todas as regras de firewall foram desativadas com sucesso!" + +#: admin/wp-security-settings-menu.php:177 +msgid "Deletion of aio_wp_security_configs option and .htaccess directives failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:179 +msgid "Reset of aio_wp_security_configs option failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:181 +msgid "Deletion of .htaccess directives failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:183 +msgid "All settings have been successfully reset." +msgstr "" + +#: admin/wp-security-settings-menu.php:203 +msgid "For information, updates and documentation, please visit the" +msgstr "Para informações, atualizações e documentação, por favor visite o" + +#: admin/wp-security-settings-menu.php:203 +msgid "Page" +msgstr "Página" + +#: admin/wp-security-settings-menu.php:204 +msgid "Follow us" +msgstr "Siga-nos" + +#: admin/wp-security-settings-menu.php:204 +msgid "on Twitter, Google+ or via Email to stay up to date about the new security features of this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:208 +msgid "WP Security plugin" +msgstr "Plugin de segurança WP" + +#: admin/wp-security-settings-menu.php:212 +msgid "Thank you for using the AIOS security plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:216 +msgid "There are a lot of security features in this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:221 +msgid "To start, go through each security option and enable the \"basic\" options." +msgstr "" + +#: admin/wp-security-settings-menu.php:225 +msgid "The more features you enable, the more security points you will achieve." +msgstr "" + +#: admin/wp-security-settings-menu.php:228 +msgid "Before doing anything we advise taking a backup of your .htaccess file, database and wp-config.php." +msgstr "" + +#: admin/wp-security-settings-menu.php:231 +msgid "Backup your database" +msgstr "Fazer backup de seu banco de dados" + +#: admin/wp-security-settings-menu.php:232 +#: admin/wp-security-settings-menu.php:433 +msgid "Backup .htaccess file" +msgstr "Fazer backup do arquivo .htaccess" + +#: admin/wp-security-settings-menu.php:233 +#: admin/wp-security-settings-menu.php:534 +msgid "Backup wp-config.php file" +msgstr "Fazer backup do arquivo wp-config.php" + +#: admin/wp-security-settings-menu.php:240 +msgid "Disable security features" +msgstr "Desabilitar recursos de segurança" + +#: admin/wp-security-settings-menu.php:246 +msgid "If you think that some plugin functionality on your site is broken due to a security feature you enabled in this plugin, then use the following option to turn off all the security features of this plugin." +msgstr "Se você acha que algumas funcionalidades do plugin em seu site estão quebrado devido a um recurso de segurança que você habilitou neste plugin, então use a seguinte opção para desativar todos os recursos de segurança deste plugin." + +#: admin/wp-security-settings-menu.php:250 +msgid "Disable all security features" +msgstr "Desabilitar todos os recursos de segurança" + +#: admin/wp-security-settings-menu.php:257 +#: admin/wp-security-settings-menu.php:267 +msgid "Disable all firewall rules" +msgstr "Desabilitar todas as regras de firewall" + +#: admin/wp-security-settings-menu.php:263 +msgid "This feature will disable all firewall rules which are currently active in this plugin and it will also delete these rules from your .htacess file. Use it if you think one of the firewall rules is causing an issue on your site." +msgstr "Este recurso irá desabilitar todas as regras de firewall que estão atualmente ativas neste plugin e também irá excluir essas regras do seu arquivo .htacess. Usá-lo, se você acha que uma das regras de firewall está causando um problema no seu site." + +#: admin/wp-security-settings-menu.php:274 +#: admin/wp-security-settings-menu.php:287 +msgid "Reset settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:279 +msgid "This button click will delete all of your settings related to the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:280 +msgid "This button click will reset/empty all the database tables of the security plugin also." +msgstr "" + +#: admin/wp-security-settings-menu.php:281 +msgid "Use this plugin if you were locked out by the All In One WP Security & Firewall Plugin and/or you are having issues logging in when that plugin is activated." +msgstr "" + +#: admin/wp-security-settings-menu.php:282 +msgid "In addition to the settings it will also delete any directives which were added to the .htaccess file by the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:283 +msgid "%1$sNOTE: %2$sAfter deleting the settings you will need to re-configure the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:295 +msgid "Debug settings" +msgstr "Configurações de depuração" + +#: admin/wp-security-settings-menu.php:301 +msgid "This setting allows you to enable/disable debug for this plugin." +msgstr "Essa configuração permite você ativar / desativar depuração para este plugin." + +#: admin/wp-security-settings-menu.php:307 +msgid "Enable debug" +msgstr "Habilitar depuração" + +#: admin/wp-security-settings-menu.php:310 +msgid "Check this if you want to enable debug. You should keep this option disabled after you have finished debugging the issue." +msgstr "" + +#: admin/wp-security-settings-menu.php:314 +msgid "Save debug settings" +msgstr "Salvar configurações de depuração" + +#: admin/wp-security-settings-menu.php:350 +msgid "Your .htaccess file was successfully backed up! Using an FTP program go to the \"/wp-content/aiowps_backups\" directory to save a copy of the file to your computer." +msgstr "Seu backup do arquivo .htaccess foi feito com sucesso! Usando um programa de FTP vá para o diretório \"/wp-content/aiowps_backups\" para salvar uma cópia do arquivo em seu computador." + +#: admin/wp-security-settings-menu.php:356 +msgid "htaccess file rename failed during backup. Please check your root directory for the backup file using FTP." +msgstr "Renomeação do arquivo .htaccess falhou durante o backup. Por favor, verifique o diretório raiz do arquivo de backup usando FTP." + +#: admin/wp-security-settings-menu.php:362 +msgid "htaccess backup failed." +msgstr "Backup htaccess falhou." + +#: admin/wp-security-settings-menu.php:377 +msgid "Please choose a .htaccess to restore from." +msgstr "Por favor, escolha um .htaccess para restaurar." + +#: admin/wp-security-settings-menu.php:392 +msgid "htaccess file restore failed. Please attempt to restore the .htaccess manually using FTP." +msgstr "Restauração do arquivo .htaccess falhou. Por favor, tente restaurar o .htaccess manualmente usando FTP." + +#: admin/wp-security-settings-menu.php:396 +msgid "Your .htaccess file has successfully been restored!" +msgstr "Seu arquivo .htaccess foi restaurado com sucesso!" + +#: admin/wp-security-settings-menu.php:402 +msgid "htaccess Restore operation failed! Please check the contents of the file you are trying to restore from." +msgstr "Operação de restauração htaccess falhou! Por favor, verifique o conteúdo do arquivo que você está tentando restaurar." + +#: admin/wp-security-settings-menu.php:408 +msgid ".htaccess file operations" +msgstr "Operações do arquivo .htaccess" + +#: admin/wp-security-settings-menu.php:411 +msgid "Your \".htaccess\" file is a key component of your website's security and it can be modified to implement various levels of protection mechanisms." +msgstr "Seu arquivo \".htaccess\" é um componente essencial de segurança do seu site e pode ser modificado para implementar vários níveis de mecanismos de proteção." + +#: admin/wp-security-settings-menu.php:412 +msgid "This feature allows you to backup and save your currently active .htaccess file should you need to re-use the the backed up file in the future." +msgstr "Este recurso permite fazer backup e salvar o seu arquivo .htaccess atualmente ativo, caso haja necessidade de voltar a usar o arquivo de backup no futuro." + +#: admin/wp-security-settings-menu.php:413 +msgid "You can also restore your site's .htaccess settings using a backed up .htaccess file." +msgstr "Você também pode restaurar as configurações .htaccess do seu site usando um backup do arquivo .htaccess." + +#: admin/wp-security-settings-menu.php:428 +msgid "Save the current .htaccess file" +msgstr "Salvar o arquivo .htaccess atual" + +#: admin/wp-security-settings-menu.php:432 +msgid "Click the button below to backup and save the currently active .htaccess file." +msgstr "Clique no botão abaixo para fazer backup e salvar o arquivo .htaccess atualmente ativo." + +#: admin/wp-security-settings-menu.php:437 +msgid "Restore from a backed up .htaccess file" +msgstr "Restaurar backup de um arquivo .htaccess" + +#: admin/wp-security-settings-menu.php:443 +msgid ".htaccess file to restore from" +msgstr "Arquivo .htaccess para restaurar" + +#: admin/wp-security-settings-menu.php:445 +msgid "Select Your htaccess File" +msgstr "" + +#: admin/wp-security-settings-menu.php:449 +msgid "After selecting your file, click the button below to restore your site using the backed up htaccess file (htaccess_backup.txt)." +msgstr "Depois de selecionar o arquivo, clique no botão abaixo para restaurar seu site usando o backup do arquivo .htaccess (htaccess_backup.txt)." + +#: admin/wp-security-settings-menu.php:455 +msgid "Restore .htaccess file" +msgstr "Restaurar arquivo .htaccess" + +#: admin/wp-security-settings-menu.php:477 +msgid "Please choose a wp-config.php file to restore from." +msgstr "Por favor, escolha um arquivo wp-config.php para restaurar." + +#: admin/wp-security-settings-menu.php:493 +msgid "wp-config.php file restore failed. Please attempt to restore this file manually using FTP." +msgstr "Restauração do arquivo wp-config.php falhou. Por favor, tente restaurar este arquivo manualmente usando o FTP." + +#: admin/wp-security-settings-menu.php:497 +msgid "Your wp-config.php file has successfully been restored!" +msgstr "Seu arquivo wp-config.php foi restaurado com sucesso!" + +#: admin/wp-security-settings-menu.php:503 +msgid "wp-config.php Restore operation failed! Please check the contents of the file you are trying to restore from." +msgstr "Operação de restauração wp-config.php falhou! Por favor, verifique o conteúdo do arquivo que você está tentando restaurar." + +#: admin/wp-security-settings-menu.php:509 +msgid "wp-config.php file operations" +msgstr "Operações do arquivo wp-config.php" + +#: admin/wp-security-settings-menu.php:512 +msgid "Your \"wp-config.php\" file is one of the most important in your WordPress installation. It is a primary configuration file and contains crucial things such as details of your database and other critical components." +msgstr "Seu arquivo \"wp-config.php\" é um dos mais importantes em sua instalação do WordPress. É um arquivo de configuração principal e contém coisas cruciais, tais como detalhes de seu banco de dados e outros componentes críticos." + +#: admin/wp-security-settings-menu.php:513 +msgid "This feature allows you to backup and save your currently active wp-config.php file should you need to re-use the the backed up file in the future." +msgstr "Este recurso permite fazer backup e salvar o seu arquivo wp-config.php atualmente ativo, caso haja necessidade de voltar a usar o arquivo de backup no futuro." + +#: admin/wp-security-settings-menu.php:514 +msgid "You can also restore your site's wp-config.php settings using a backed up wp-config.php file." +msgstr "Você também pode restaurar as configurações wp-config.php do seu site usando um backup do arquivo wp-config.php." + +#: admin/wp-security-settings-menu.php:529 +msgid "Save the current wp-config.php file" +msgstr "Salvar o arquivo wp-config.php atual" + +#: admin/wp-security-settings-menu.php:533 +msgid "Click the button below to backup and download the contents of the currently active wp-config.php file." +msgstr "Clique no botão abaixo para fazer backup e transferir o conteúdo do arquivo wp-config.php atualmente ativo." + +#: admin/wp-security-settings-menu.php:539 +msgid "Restore from a backed up wp-config file" +msgstr "Restaurar backup de um arquivo wp-config" + +#: admin/wp-security-settings-menu.php:545 +msgid "wp-config file to restore from" +msgstr "Arquivo wp-config para restaurar" + +#: admin/wp-security-settings-menu.php:547 +msgid "Select Your wp-config File" +msgstr "" + +#: admin/wp-security-settings-menu.php:551 +msgid "After selecting your file click the button below to restore your site using the backed up wp-config file (wp-config.php.backup.txt)." +msgstr "Depois de selecionar o arquivo, clique no botão abaixo para restaurar seu site usando o backup do arquivo wp-config (wp-config.php.backup.txt)." + +#: admin/wp-security-settings-menu.php:557 +msgid "Restore wp-config file" +msgstr "Restaurar arquivo wp-config" + +#: admin/wp-security-settings-menu.php:591 +msgid "Manage delete plugin settings saved." +msgstr "" + +#: admin/wp-security-settings-menu.php:596 +msgid "Manage delete plugin tasks" +msgstr "" + +#: admin/wp-security-settings-menu.php:603 +msgid "Delete database tables" +msgstr "" + +#: admin/wp-security-settings-menu.php:606 +msgid "Check this if you want to remove database tables when the plugin is uninstalled." +msgstr "" + +#: admin/wp-security-settings-menu.php:610 +msgid "Delete settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:613 +msgid "Check this if you want to remove all plugin settings when uninstalling the plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:613 +msgid "It will also remove all custom htaccess rules that were added by this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:647 +msgid "WP generator meta tag and version info" +msgstr "" + +#: admin/wp-security-settings-menu.php:650 +msgid "WordPress generator automatically adds some meta information inside the \"head\" tags of every page on your site's front end. Below is an example of this:" +msgstr "Gerador WordPress adiciona automaticamente algumas informações de meta dentro das tags \"head\" de cada página em front-end do seu site. Abaixo está um exemplo disso:" + +#: admin/wp-security-settings-menu.php:652 +msgid "The above meta information shows which version of WordPress your site is currently running and thus can help hackers or crawlers scan your site to see if you have an older version of WordPress or one with a known exploit." +msgstr "As informações de meta acima mostram qual versão do WordPress, seu site está atualmente em execução e, portanto, pode ajudar hackers ou rastreadores analisar o seu site para ver se você tem uma versão antiga do WordPress ou um com uma exploração conhecida." + +#: admin/wp-security-settings-menu.php:653 +msgid "There are also other ways wordpress reveals version info such as during style and script loading. An example of this is:" +msgstr "" + +#: admin/wp-security-settings-menu.php:655 +msgid "This feature will allow you to remove the WP generator meta info and other version info from your site's pages." +msgstr "" + +#: admin/wp-security-settings-menu.php:661 +msgid "WP generator meta info" +msgstr "Gerador de informações de meta WP" + +#: admin/wp-security-settings-menu.php:673 +msgid "Remove WP generator meta info" +msgstr "Remover gerador de informações de meta WP" + +#: admin/wp-security-settings-menu.php:676 +msgid "Check this if you want to remove the version and meta info produced by WP from all pages" +msgstr "" + +#: admin/wp-security-settings-menu.php:704 +msgid "Please choose a file to import your settings from." +msgstr "Por favor, escolha um arquivo para importar suas definições." + +#: admin/wp-security-settings-menu.php:736 +msgid "Import AIOS settings from " +msgstr "" + +#: admin/wp-security-settings-menu.php:742 +#: admin/wp-security-settings-menu.php:786 +msgid "The deletion of the import file failed. Please delete this file manually via the media menu for security purposes." +msgstr "A exclusão do arquivo de importação falhou. Por favor, apague este arquivo manualmente através do menu de mídia para fins de segurança." + +#: admin/wp-security-settings-menu.php:744 +#: admin/wp-security-settings-menu.php:788 +msgid "The file you uploaded was also deleted for security purposes because it contains security settings details." +msgstr "O arquivo que você carregou também foi excluído para fins de segurança, pois ele contém detalhes de configurações de segurança." + +#: admin/wp-security-settings-menu.php:759 +msgid "Your AIOS settings were successfully imported via file input." +msgstr "" + +#: admin/wp-security-settings-menu.php:760 +msgid "The deletion of the import file failed. Please delete this file manually via the media menu for security purposes because it contains security settings details." +msgstr "A exclusão do arquivo de importação falhou. Por favor, apague este arquivo manualmente através do menu de mídia para fins de segurança, pois ele contém detalhes de configurações de segurança." + +#: admin/wp-security-settings-menu.php:762 +msgid "Your AIOS settings were successfully imported. The file you uploaded was also deleted for security purposes because it contains security settings details." +msgstr "" + +#: admin/wp-security-settings-menu.php:765 +msgid "Your AIOS settings were successfully imported via text entry." +msgstr "" + +#: admin/wp-security-settings-menu.php:780 +msgid "The contents of your settings file appear invalid. Please check the contents of the file you are trying to import settings from." +msgstr "O conteúdo do seu arquivo de configurações aparece inválido. Por favor, verifique o conteúdo do arquivo que você está tentando importar configurações de." + +#: admin/wp-security-settings-menu.php:797 +msgid "Export or import your AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:800 +msgid "This section allows you to export or import your All In One WP Security & Firewall settings." +msgstr "Esta seção permite-lhe exportar ou importar suas configurações de All In One WP Security e Firewall" + +#: admin/wp-security-settings-menu.php:801 +msgid "This can be handy if you wanted to save time by applying the settings from one site to another site." +msgstr "Isto pode ser útil se você quiser economizar tempo aplicando as configurações de um site para outro site." + +#: admin/wp-security-settings-menu.php:802 +msgid "NOTE: Before importing, it is your responsibility to know what settings you are trying to import. Importing settings blindly can cause you to be locked out of your site." +msgstr "Antes de importar, é sua responsabilidade saber quais configurações que você está tentando importar. Importando configurações cegamente pode causar-lhe ser trancado para fora de seu site." + +#: admin/wp-security-settings-menu.php:803 +msgid "For Example: If a settings item relies on the domain URL then it may not work correctly when imported into a site with a different domain." +msgstr "Por exemplo: se um item de configurações depende do domínio URL, então pode não funcionar corretamente quando importado para um site com um domínio diferente." + +#: admin/wp-security-settings-menu.php:809 +#: admin/wp-security-settings-menu.php:818 +msgid "Export AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:815 +msgid "To export your All In One WP Security & Firewall settings click the button below." +msgstr "Para exportar as configurações All In One WP Security e Firewall, clique no botão abaixo." + +#: admin/wp-security-settings-menu.php:822 +#: admin/wp-security-settings-menu.php:851 +msgid "Import AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:828 +msgid "Use this section to import your All In One WP Security & Firewall settings from a file. Alternatively, copy/paste the contents of your import file into the textarea below." +msgstr "Use esta seção para importar as configurações de All In One WP Security e Firewall de um arquivo. Alternativamente, copiar / colar o conteúdo do seu arquivo de importação para a área de texto abaixo." + +#: admin/wp-security-settings-menu.php:830 +msgid "Import file" +msgstr "Importar arquivo" + +#: admin/wp-security-settings-menu.php:833 +msgid "Select Your Import Settings File" +msgstr "" + +#: admin/wp-security-settings-menu.php:837 +msgid "After selecting your file, click the button below to apply the settings to your site." +msgstr "Depois de selecionar o arquivo, clique no botão abaixo para aplicar as configurações para o seu site." + +#: admin/wp-security-settings-menu.php:844 +msgid "Copy/Paste import data" +msgstr "Copiar/Colar dados de importação" + +#: admin/wp-security-settings-menu.php:893 +msgid "Default - if correct, then this is the best option" +msgstr "" + +#: admin/wp-security-settings-menu.php:894 +msgid "Only use if you're using Cloudflare." +msgstr "" + +#: admin/wp-security-settings-menu.php:902 +msgid "(current value: %s)" +msgstr "" + +#: admin/wp-security-settings-menu.php:905 +msgid "no value (i.e. empty) on your server" +msgstr "" + +#: admin/wp-security-spam-menu.php:28 +msgid "Comment spam" +msgstr "SPAM de comentário" + +#: admin/wp-security-spam-menu.php:29 +msgid "Comment spam IP monitoring" +msgstr "Monitoramento de IP SPAM de comentário" + +#: admin/wp-security-spam-menu.php:30 +msgid "BuddyPress" +msgstr "BuddyPress" + +#: admin/wp-security-spam-menu.php:31 +msgid "bbPress" +msgstr "" + +#: admin/wp-security-spam-menu.php:57 +msgid "Spam prevention" +msgstr "Prevenção SPAM" + +#: admin/wp-security-spam-menu.php:99 +msgid "You entered a non numeric value for the \"move spam comments to trash after number of days\" field." +msgstr "" + +#: admin/wp-security-spam-menu.php:99 +#: admin/wp-security-spam-menu.php:297 +#: admin/wp-security-user-login-menu.php:118 +#: admin/wp-security-user-login-menu.php:124 +#: admin/wp-security-user-login-menu.php:130 +#: admin/wp-security-user-login-menu.php:136 +msgid "It has been set to the default value." +msgstr "" + +#: admin/wp-security-spam-menu.php:129 +msgid "Comment spam settings" +msgstr "Configurações de SPAM de comentário" + +#: admin/wp-security-spam-menu.php:134 +msgid "Add CAPTCHA to comments form" +msgstr "Adicionar captcha para formulário de comentários" + +#: admin/wp-security-spam-menu.php:138 +msgid "This feature will add a CAPTCHA field in the WordPress comments form." +msgstr "" + +#: admin/wp-security-spam-menu.php:139 +msgid "Adding a CAPTCHA field in the comment form is a simple way of greatly reducing spam comments from bots without using .htaccess rules." +msgstr "Adicionando um campo de captcha no formulário de comentário é uma maneira simples de reduzir grandemente SPAM de comentários de robôs sem usar regras .htaccess." + +#: admin/wp-security-spam-menu.php:148 +msgid "Enable CAPTCHA on comment forms" +msgstr "Habilitar captcha em formulários de comentário" + +#: admin/wp-security-spam-menu.php:151 +msgid "Check this if you want to insert a CAPTCHA field on the comment forms." +msgstr "Marque esta opção se você deseja inserir um campo captcha em formulários o comentário" + +#: admin/wp-security-spam-menu.php:158 +msgid "Block spambot comments" +msgstr "Bloquear comentários spambot" + +#: admin/wp-security-spam-menu.php:162 +msgid "A large portion of WordPress blog comment spam is mainly produced by automated bots and not necessarily by humans." +msgstr "" + +#: admin/wp-security-spam-menu.php:163 +msgid "This feature will greatly minimize the useless and unecessary traffic and load on your server resulting from spam comments by blocking all comment requests which do not originate from your domain." +msgstr "Este recurso irá minimizar consideravelmente o tráfego e carga inútil e desnecessário em seu servidor, resultante de comentários de spam, bloqueando todas as solicitações de comentário que não são originários do seu domínio." + +#: admin/wp-security-spam-menu.php:164 +msgid "In other words, if the comment was not submitted by a human who physically submitted the comment on your site, the request will be blocked." +msgstr "Em outras palavras, se o comentário não foi enviado por um ser humano que fisicamente apresentou o comentário em seu site, a solicitação será bloqueada." + +#: admin/wp-security-spam-menu.php:182 +msgid "Block spambots from posting comments" +msgstr "Bloquear spambots de publicar comentários" + +#: admin/wp-security-spam-menu.php:185 +msgid "Check this if you want to apply a firewall rule which will block comments originating from spambots." +msgstr "Marque esta opção se você deseja aplicar uma regra de firewall que irá bloquear comentários provenientes de spambots." + +#: admin/wp-security-spam-menu.php:189 +msgid "This feature will implement a firewall rule to block all comment attempts which do not originate from your domain." +msgstr "Este recurso irá implementar uma regra de firewall para bloquear todas as tentativas de comentário que não são originários do seu domínio." + +#: admin/wp-security-spam-menu.php:190 +msgid "A legitimate comment is one which is submitted by a human who physically fills out the comment form and clicks the submit button. For such events, the HTTP_REFERRER is always set to your own domain." +msgstr "Um comentário legítimo é aquele que é enviado por um ser humano que fisicamente preenche o formulário de comentário e clica no botão enviar. Para tais eventos, a HTTP_REFERRER é sempre definido para seu próprio domínio." + +#: admin/wp-security-spam-menu.php:191 +msgid "A comment submitted by a spambot is done by directly calling the comments.php file, which usually means that the HTTP_REFERRER value is not your domain and often times empty." +msgstr "Um comentário enviado por um spambot é feito chamando diretamente o arquivo comments.php, que geralmente significa que o valor HTTP_REFERRER não é o seu domínio e muitas vezes vazio." + +#: admin/wp-security-spam-menu.php:192 +msgid "This feature will check and block comment requests which are not referred by your domain thus greatly reducing your overall blog spam and PHP requests done by the server to process these comments." +msgstr "Esta função irá verificar e bloquear solicitações de comentário que não são referidos por seu domínio reduzindo assim significativamente as suas solicitações globais do blog de SPAM e PHP feito pelo servidor para processar esses comentários." + +#: admin/wp-security-spam-menu.php:202 +msgid "Comment processing" +msgstr "" + +#: admin/wp-security-spam-menu.php:207 +msgid "Trash spam comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:216 +msgid "Move spam comments to trash after %s days." +msgstr "" + +#: admin/wp-security-spam-menu.php:224 +msgid "Enble this feature in order to move the spam comments to trash after given number of days." +msgstr "" + +#: admin/wp-security-spam-menu.php:262 +msgid "You entered a non numeric value for the minimum number of spam comments field. It has been set to the default value." +msgstr "Você digitou um valor não numérico para o número mínimo de campo de comentários de spam. Foi definido como o valor padrão." + +#: admin/wp-security-spam-menu.php:265 +msgid "You must enter an integer greater than zero for minimum number of spam comments field. It has been set to the default value." +msgstr "Você deve digitar um número inteiro maior que zero para o número mínimo de campo de comentários de spam. Foi definido como o valor padrão." + +#: admin/wp-security-spam-menu.php:292 +msgid "Nonce check failed for list spam comment IPs." +msgstr "Verificação núncio falhou para a lista de SPAM de comentários IPs!" + +#: admin/wp-security-spam-menu.php:297 +msgid "You entered a non numeric value for the minimum spam comments per IP field." +msgstr "" + +#: admin/wp-security-spam-menu.php:308 +msgid "Displaying results for IP addresses which have posted a minimum of %s spam comments." +msgstr "Mostrar resultados para endereços IP, que postaram um mínimo de %s SPAM de comentários" + +#: admin/wp-security-spam-menu.php:323 +msgid "Auto block spammer IPs" +msgstr "Bloquear automaticamente IPs SPAMMER" + +#: admin/wp-security-spam-menu.php:328 +msgid "This feature has detected that %s is not active. It is highly recommended that you activate the Akismet plugin to make the most of this feature." +msgstr "Esse recurso detectou que o %s não está ativo. É altamente recomendável que você ative o plugin Akismet para aproveitar ao máximo este recurso." + +#: admin/wp-security-spam-menu.php:337 +msgid "This feature allows you to automatically and permanently block IP addresses which have exceeded a certain number of comments labelled as spam." +msgstr "Esse recurso permite que você automaticamente e permanentemente bloquear endereços IP que tenham ultrapassado um determinado número de comentários marcados como SPAM." + +#: admin/wp-security-spam-menu.php:338 +msgid "Comments are usually labelled as spam either by the Akismet plugin or manually by the WP administrator when they mark a comment as \"spam\" from the WordPress Comments menu." +msgstr "Comentários são geralmente marcados como SPAM pelo plugin Akismet ou manualmente pelo administrador do WP quando eles marcar um comentário como \"spam\" no menu comentários do WordPress." + +#: admin/wp-security-spam-menu.php:352 +msgid "You currently have no IP addresses permanently blocked due to spam." +msgstr "Atualmente você não tem endereços IP permanentemente bloqueados devido à SPAM." + +#: admin/wp-security-spam-menu.php:365 +msgid "Spammer IPs added to permanent block list today: " +msgstr "IPs spammer adicionado a lista de bloqueios permanente hoje: " + +#: admin/wp-security-spam-menu.php:366 +msgid "All time total: " +msgstr "Total de todo tempo: " + +#: admin/wp-security-spam-menu.php:367 +msgid "View blocked IPs" +msgstr "Ver IPs bloqueados" + +#: admin/wp-security-spam-menu.php:380 +msgid "Enable auto block of spam comment IPs" +msgstr "Ativar o bloqueio automático de IPs de comentário SPAM" + +#: admin/wp-security-spam-menu.php:383 +msgid "Check this box if you want this plugin to automatically block IP addresses which submit spam comments." +msgstr "Marque esta caixa se você deseja que este plugin para bloquear automaticamente endereços IP que apresentem comentários SPAM." + +#: admin/wp-security-spam-menu.php:387 +msgid "Minimum number of spam comments" +msgstr "Número mínimo de comentários SPAM" + +#: admin/wp-security-spam-menu.php:389 +msgid "Specify the minimum number of spam comments for an IP address before it is permanently blocked." +msgstr "Especifica o número mínimo de comentários SPAM para um endereço IP antes que seja permanentemente bloqueado." + +#: admin/wp-security-spam-menu.php:393 +msgid "Example 1: Setting this value to \"1\" will block ALL IP addresses which were used to submit at least one spam comment." +msgstr "Exemplo 1: Definir esse valor para \"1\" irá bloquear todos os endereços IP que foram usados ​​para enviar pelo menos um comentário SPAM." + +#: admin/wp-security-spam-menu.php:394 +msgid "Example 2: Setting this value to \"5\" will block only those IP addresses which were used to submit 5 spam comments or more on your site." +msgstr "Exemplo 2: Definir esse valor para \"5\" irá bloquear apenas os endereços IP que foram usados ​​para enviar 5 comentários SPAM ou mais em seu site." + +#: admin/wp-security-spam-menu.php:412 +msgid "List spammer IP addresses" +msgstr "Lista de endereços IP SPAMMER" + +#: admin/wp-security-spam-menu.php:416 +msgid "This section displays a list of the IP addresses of the people or bots who have left spam comments on your site." +msgstr "Esta seção exibe uma lista dos endereços IP das pessoas ou robôs que deixaram comentários SPAM em seu site." + +#: admin/wp-security-spam-menu.php:417 +msgid "This information can be handy for identifying the most persistent IP addresses or ranges used by spammers." +msgstr "Esta informação pode ser útil para identificar os endereços IP mais persistentes ou intervalos usados ​​por spammers." + +#: admin/wp-security-spam-menu.php:418 +msgid "By inspecting the IP address data coming from spammers you will be in a better position to determine which addresses or address ranges you should block by adding them to the permanent block list." +msgstr "" + +#: admin/wp-security-spam-menu.php:419 +msgid "To add one or more of the IP addresses displayed in the table below to your blacklist, simply click the \"Block\" link for the individual row or select more than one address using the checkboxes and then choose the \"block\" option from the Bulk Actions dropdown list and click the \"Apply\" button." +msgstr "" + +#: admin/wp-security-spam-menu.php:427 +msgid "Minimum number of spam comments per IP" +msgstr "Número mínimo de comentários SPAM por IP" + +#: admin/wp-security-spam-menu.php:429 +msgid "This field allows you to list only those IP addresses which have been used to post X or more spam comments." +msgstr "Este campo permite listar apenas os endereços IP que foram usados ​​para postar X ou mais comentários SPAM." + +#: admin/wp-security-spam-menu.php:433 +msgid "Example 1: Setting this value to \"0\" or \"1\" will list ALL IP addresses which were used to submit spam comments." +msgstr "Exemplo 1: Definir esse valor para \"0\" ou \"1\" irá listar todos os endereços IP que foram usados ​​para enviar comentários SPAM." + +#: admin/wp-security-spam-menu.php:434 +msgid "Example 2: Setting this value to \"5\" will list only those IP addresses which were used to submit 5 spam comments or more on your site." +msgstr "Exemplo 2: Definir esse valor para \"5\" irá listar apenas os endereços IP que foram usados ​​para enviar 5 comentários SPAM ou mais em seu site." + +#: admin/wp-security-spam-menu.php:441 +msgid "Find IP addresses" +msgstr "Encontrar endereços IP" + +#: admin/wp-security-spam-menu.php:445 +msgid "Spammer IP address results" +msgstr "Resultados de endereço IP SPAMMER" + +#: admin/wp-security-spam-menu.php:451 +#: classes/wp-security-utility.php:253 +msgid "The plugin has detected that you are using a Multi-Site WordPress installation." +msgstr "O plugin detectou que você está usando uma instalação de WordPress Multi site." + +#: admin/wp-security-spam-menu.php:452 +msgid "Only the \"superadmin\" can block IP addresses from the main site." +msgstr "Somente o \"super administrador\" pode bloquear endereços IP a partir do site principal." + +#: admin/wp-security-spam-menu.php:453 +msgid "Take note of the IP addresses you want blocked and ask the superadmin to add these to the blacklist using the \"Blacklist Manager\" on the main site." +msgstr "Tome nota dos endereços IP que deseja bloquear e pedir ao super administrador para adicioná-los à lista negra usando o \"Gerenciador de lista negra\" no site principal." + +#: admin/wp-security-spam-menu.php:498 +msgid "BuddyPress spam settings" +msgstr "Configurações de SPAM BuddyPress" + +#: admin/wp-security-spam-menu.php:503 +msgid "Add CAPTCHA to BuddyPress registration form" +msgstr "Adicionar captcha para formulário de registro BuddyPress" + +#: admin/wp-security-spam-menu.php:507 +msgid "This feature will add a simple math CAPTCHA field in the BuddyPress registration form." +msgstr "Este recurso irá adicionar um campo de matemática captcha simples no formulário de inscrição BuddyPress." + +#: admin/wp-security-spam-menu.php:508 +msgid "Adding a CAPTCHA field in the registration form is a simple way of greatly reducing spam signups from bots without using .htaccess rules." +msgstr "Adicionando um campo de captcha no formulário de inscrição é uma maneira simples de reduzir grandemente inscrições SPAM de robôs sem usar regras .htaccess." + +#: admin/wp-security-spam-menu.php:518 +msgid "Enable CAPTCHA on BuddyPress registration form" +msgstr "Habilitar captcha no formulário de registro BuddyPress" + +#: admin/wp-security-spam-menu.php:521 +msgid "Check this if you want to insert a CAPTCHA field on the BuddyPress registration forms." +msgstr "Marque esta opção se você deseja inserir um campo captcha no formulários de registro BuddyPress" + +#: admin/wp-security-spam-menu.php:530 +msgid "BuddyPress is not active! In order to use this feature you will need to have BuddyPress installed and activated." +msgstr "BuddyPress não está ativo! Para utilizar este recurso, você precisará ter o BuddyPress instalado e ativado." + +#: admin/wp-security-spam-menu.php:560 +msgid "bbPress spam settings" +msgstr "" + +#: admin/wp-security-spam-menu.php:565 +msgid "Add CAPTCHA to bbPress new topic form" +msgstr "" + +#: admin/wp-security-spam-menu.php:569 +msgid "This feature will add a simple math CAPTCHA field in the bbPress new topic form." +msgstr "" + +#: admin/wp-security-spam-menu.php:570 +msgid "Adding a CAPTCHA field in this form is a simple way of greatly reducing spam submitted from bots." +msgstr "" + +#: admin/wp-security-spam-menu.php:580 +msgid "Enable CAPTCHA on bbPress new topic form" +msgstr "" + +#: admin/wp-security-spam-menu.php:583 +msgid "Check this if you want to insert a CAPTCHA field on the bbPress new topic forms." +msgstr "" + +#: admin/wp-security-spam-menu.php:592 +msgid "bbPress is not active. In order to use this feature you will need to have bbPress installed and activated." +msgstr "" + +#: admin/wp-security-tools-menu.php:34 +msgid "WHOIS lookup" +msgstr "Pesquisa WHOIS" + +#: admin/wp-security-tools-menu.php:95 +#: admin/wp-security-tools-menu.php:136 +msgid "Querying %s: %s" +msgstr "" + +#: admin/wp-security-tools-menu.php:103 +#: admin/wp-security-tools-menu.php:112 +#: admin/wp-security-tools-menu.php:151 +msgid "Redirected to %s" +msgstr "" + +#: admin/wp-security-tools-menu.php:173 +msgid "The WHOIS lookup feature gives you a way to look up who owns an IP address or domain name." +msgstr "" + +#: admin/wp-security-tools-menu.php:173 +msgid "You can use this to investigate users engaging in malicious activity on your site." +msgstr "" + +#: admin/wp-security-tools-menu.php:176 +msgid "WHOIS lookup on IP or domain" +msgstr "" + +#: admin/wp-security-tools-menu.php:183 +msgid "IP address or domain name:" +msgstr "" + +#: admin/wp-security-tools-menu.php:190 +msgid "Look up IP or domain" +msgstr "" + +#: admin/wp-security-tools-menu.php:219 +msgid "Please enter a valid IP address or domain name to look up." +msgstr "" + +#: admin/wp-security-tools-menu.php:220 +#: admin/wp-security-tools-menu.php:226 +msgid "Nothing to show." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:32 +msgid "WP username" +msgstr "Nome de usuário WP" + +#: admin/wp-security-user-accounts-menu.php:33 +msgid "Display name" +msgstr "Nome de exibição" + +#: admin/wp-security-user-accounts-menu.php:34 +msgid "Password" +msgstr "Senha" + +#: admin/wp-security-user-accounts-menu.php:60 +msgid "User accounts" +msgstr "Contas de usuários" + +#: admin/wp-security-user-accounts-menu.php:82 +msgid "Admin user security" +msgstr "Segurança do usuário administrador" + +#: admin/wp-security-user-accounts-menu.php:85 +msgid "By default, WordPress sets the administrator username to \"admin\" at installation time." +msgstr "Por padrão, o WordPress define o nome do usuário administrador para \"admin\" no momento da instalação." + +#: admin/wp-security-user-accounts-menu.php:86 +msgid "A lot of hackers try to take advantage of this information by attempting \"Brute force login attacks\" where they repeatedly try to guess the password by using \"admin\" for username." +msgstr "Um monte de hackers tentam tirar proveito desta informação pela tentativa \"Ataques Acesso de Força Bruta\" onde eles repetidamente tentam adivinhar a senha usando \"admin\" para o nome de usuário." + +#: admin/wp-security-user-accounts-menu.php:87 +msgid "From a security perspective, changing the default \"admin\" user name is one of the first and smartest things you should do on your site." +msgstr "Numa perspectiva de segurança, alterar o nome de usuário padrão \"admin\" é uma das primeiras e mais inteligentes coisas que você deve fazer em seu site." + +#: admin/wp-security-user-accounts-menu.php:88 +msgid "This feature will allow you to change your default \"admin\" user name to a more secure name of your choosing." +msgstr "Este recurso permitirá que você altere seu nome de usuário \"admin\" padrão para um nome mais seguro de sua escolha." + +#: admin/wp-security-user-accounts-menu.php:95 +msgid "List of administrator accounts" +msgstr "Lista de contas de administrador" + +#: admin/wp-security-user-accounts-menu.php:104 +#: classes/grade-system/wp-security-feature-item-manager.php:43 +msgid "Change admin username" +msgstr "Alterar nome de usuário admin" + +#: admin/wp-security-user-accounts-menu.php:112 +msgid "Your site currently has an account which uses the default \"admin\" username. It is highly recommended that you change this name to something else. Use the following field to change the admin username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:118 +msgid "New admin username" +msgstr "Novo nome de usuário admin" + +#: admin/wp-security-user-accounts-menu.php:120 +msgid "Choose a new username for admin." +msgstr "Escolha um novo nome de usuário para o administrador." + +#: admin/wp-security-user-accounts-menu.php:124 +msgid "Change username" +msgstr "Alterar nome de usuário" + +#: admin/wp-security-user-accounts-menu.php:126 +msgid "NOTE: If you are currently logged in as \"admin\" you will be automatically logged out after changing your username and will be required to log back in." +msgstr "NOTA: Se você está conectado no momento como \"admin\" você será automaticamente desconectado depois de mudar seu nome de usuário e será necessário fazer login novamente." + +#: admin/wp-security-user-accounts-menu.php:133 +msgid "No action required! " +msgstr "Nenhuma ação necessária! " + +#: admin/wp-security-user-accounts-menu.php:135 +msgid "Your site does not have any account which uses the default \"admin\" username. " +msgstr "Seu site não tem qualquer conta que usa o nome de usuário padrão \"admin\"." + +#: admin/wp-security-user-accounts-menu.php:136 +msgid "This is good security practice." +msgstr "Esta é uma boa prática de segurança." + +#: admin/wp-security-user-accounts-menu.php:148 +msgid "Display name security" +msgstr "Segurança do nome de exibição" + +#: admin/wp-security-user-accounts-menu.php:151 +msgid "When you submit a post or answer a comment, WordPress will usually display your \"nickname\"." +msgstr "Quando você envia uma mensagem ou responde a um comentário, o WordPress normalmente exibirá o seu \"apelido\"." + +#: admin/wp-security-user-accounts-menu.php:152 +msgid "By default the nickname is set to the login (or user) name of your account." +msgstr "Por padrão, o apelido é definido para o nome de login (ou usuário) da sua conta." + +#: admin/wp-security-user-accounts-menu.php:153 +msgid "From a security perspective, leaving your nickname the same as your user name is bad practice because it gives a hacker at least half of your account's login credentials." +msgstr "De uma perspectiva de segurança, deixar seu apelido o mesmo que seu nome de usuário é uma prática ruim, porque dá um hacker pelo menos metade das credenciais de login da sua conta." + +#: admin/wp-security-user-accounts-menu.php:154 +msgid "Therefore to further tighten your site's security you are advised to change your nickname and Display name to be different from your Username." +msgstr "Portanto, para apertar ainda mais a segurança do seu site você é aconselhado a alterar o seu apelido e nome de exibição para ser diferente do seu nome de usuário." + +#: admin/wp-security-user-accounts-menu.php:160 +msgid "Modify accounts with identical login name and display name" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:169 +msgid "Your site currently has the following accounts which have an identical login name and display name." +msgstr "Seu site tem atualmente as seguintes contas que têm um nome de login e nome de exibição idêntico." + +#: admin/wp-security-user-accounts-menu.php:170 +msgid "Follow the link to edit the user profile of that particular user account, change Nickname, choose a different Display name compared to Username, and press the \"Update User\" button.)" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:185 +msgid "No action required." +msgstr "Nenhuma ação necessária." + +#: admin/wp-security-user-accounts-menu.php:186 +msgid "Your site does not have a user account where the display name is identical to the username." +msgstr "Seu site não tem uma conta de usuário onde o nome de exibição é idêntico ao nome de usuário." + +#: admin/wp-security-user-accounts-menu.php:197 +msgid "Password tool" +msgstr "Ferramenta de senha" + +#: admin/wp-security-user-accounts-menu.php:200 +msgid "Poor password selection is one of the most common weak points of many sites and is usually the first thing a hacker will try to exploit when attempting to break into your site." +msgstr "Seleção de senha pobres é um dos pontos fracos mais comuns de muitos sites, e é geralmente a primeira coisa que um hacker vai tentar explorar ao tentar entrar no seu site." + +#: admin/wp-security-user-accounts-menu.php:201 +msgid "Many people fall into the trap of using a simple word or series of numbers as their password. Such a predictable and simple password would take a competent hacker merely minutes to guess your password by using a simple script which cycles through the easy and most common combinations." +msgstr "Muitas pessoas caem na armadilha de usar uma palavra simples ou uma série de números como sua senha. Uma senha tão previsível e simples levaria um hacker competente apenas minutos para adivinhar sua senha usando um script simples que percorre as combinações mais comuns e fácil." + +#: admin/wp-security-user-accounts-menu.php:202 +msgid "The longer and more complex your password is the harder it is for hackers to \"crack\" because more complex passwords require much greater computing power and time." +msgstr "O mais longo e mais complexo sua senha é o mais difícil é para os hackers \"crack\" porque as senhas mais complexas exigem muito maior poder de computação e tempo." + +#: admin/wp-security-user-accounts-menu.php:203 +msgid "This section contains a useful password strength tool which you can use to check whether your password is sufficiently strong enough." +msgstr "Esta seção contém uma ferramenta de força de senha útil que você pode usar para verificar se sua senha é suficientemente forte o suficiente." + +#: admin/wp-security-user-accounts-menu.php:208 +msgid "Password strength tool" +msgstr "Ferramenta de força de senha" + +#: admin/wp-security-user-accounts-menu.php:210 +msgid "This password tool uses an algorithm which calculates how long it would take for your password to be cracked using the computing power of an off-the-shelf current model desktop PC with high end processor, graphics card and appropriate password cracking software." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:213 +msgid "Start typing a password." +msgstr "Comece a digitar uma senha." + +#: admin/wp-security-user-accounts-menu.php:216 +msgid "It would take a desktop PC approximately" +msgstr "Demora aproximadamente um PC desktop" + +#: admin/wp-security-user-accounts-menu.php:217 +msgid "1 sec" +msgstr "1 segundo" + +#: admin/wp-security-user-accounts-menu.php:217 +msgid "to crack your password!" +msgstr "para quebrar sua senha!" + +#: admin/wp-security-user-accounts-menu.php:222 +msgid "Password Strength" +msgstr "Força da senha" + +#: admin/wp-security-user-accounts-menu.php:245 +msgid "Username " +msgstr "Nome de usuário " + +#: admin/wp-security-user-accounts-menu.php:245 +msgid " already exists. Please enter another value. " +msgstr " já existe. Por favor, digite outro valor. " + +#: admin/wp-security-user-accounts-menu.php:262 +msgid "The database update operation of the user account failed!" +msgstr "Falha na operação de atualização do banco de dados da conta de usuário!" + +#: admin/wp-security-user-accounts-menu.php:291 +msgid "You entered an invalid username. Please enter another value. " +msgstr "Você digitou um nome de usuário inválido. Por favor, digite outro valor." + +#: admin/wp-security-user-accounts-menu.php:295 +msgid "Please enter a value for your username. " +msgstr "Por favor, digite o seu nome de usuário." + +#: admin/wp-security-user-accounts-menu.php:302 +msgid "Username successfully changed." +msgstr "Nome de usuário alterado com sucesso!" + +#: admin/wp-security-user-accounts-menu.php:322 +msgid "Account login name" +msgstr "Nome de login de conta" + +#: admin/wp-security-user-accounts-menu.php:331 +msgid "Edit user" +msgstr "" + +#: admin/wp-security-user-login-menu.php:54 +#: admin/wp-security-user-login-menu.php:474 +msgid "Failed login records" +msgstr "Registros de falhas de login" + +#: admin/wp-security-user-login-menu.php:55 +#: classes/grade-system/wp-security-feature-item-manager.php:51 +msgid "Force logout" +msgstr "Forçar saída" + +#: admin/wp-security-user-login-menu.php:56 +#: admin/wp-security-user-login-menu.php:632 +msgid "Account activity logs" +msgstr "Logs de atividade de conta" + +#: admin/wp-security-user-login-menu.php:58 +#: admin/wp-security-user-login-menu.php:769 +msgid "Additional settings" +msgstr "" + +#: admin/wp-security-user-login-menu.php:81 +msgid "User login" +msgstr "Login de usuário" + +#: admin/wp-security-user-login-menu.php:118 +msgid "You entered a non-numeric value for the max login attempts field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:124 +msgid "You entered a non numeric value for the login retry time period field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:130 +msgid "You entered a non numeric value for the lockout time length field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:136 +msgid "You entered a non numeric value for the maximim lockout time length field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:141 +msgid "You entered an invalid minimum lockout time length, it must be less than the maximum lockout time length value." +msgstr "" + +#: admin/wp-security-user-login-menu.php:141 +msgid "Both have been set to the default values." +msgstr "" + +#: admin/wp-security-user-login-menu.php:160 +msgid "Please fill in one or more email addresses to notify." +msgstr "" + +#: admin/wp-security-user-login-menu.php:162 +msgid "You have entered one or more invalid email addresses." +msgstr "" + +#: admin/wp-security-user-login-menu.php:165 +msgid "It has been set to your WordPress admin email as default." +msgstr "" + +#: admin/wp-security-user-login-menu.php:250 +msgid "Login lockout configuration" +msgstr "" + +#: admin/wp-security-user-login-menu.php:254 +msgid "One of the ways hackers try to compromise sites is via a " +msgstr "Uma das maneiras que hackers tentam comprometer sites é através de um " + +#: admin/wp-security-user-login-menu.php:254 +msgid "Brute force login attack" +msgstr "Ataque de Login de Força Bruta" + +#: admin/wp-security-user-login-menu.php:254 +msgid "This is where attackers use repeated login attempts until they guess the password." +msgstr "Isto é onde os atacantes usam tentativas de login repetidos até eles adivinhar a senha." + +#: admin/wp-security-user-login-menu.php:255 +msgid "Apart from choosing strong passwords, monitoring and blocking IP addresses which are involved in repeated login failures in a short period of time is a very effective way to stop these types of attacks." +msgstr "Além de escolher senhas fortes, monitoramento e bloqueio de endereços IP que estão envolvidos em falhas de login repetidos em um curto período de tempo é uma maneira muito eficaz de parar esses tipos de ataques." + +#: admin/wp-security-user-login-menu.php:256 +msgid "You may also want to checkout our %s feature for another secure way to protect against these types of attacks." +msgstr "Você também pode querer fazer o check-out em nosso recurso de %s para uma outra forma segura de proteger contra esses tipos de ataques." + +#: admin/wp-security-user-login-menu.php:261 +msgid "Login lockout options" +msgstr "" + +#: admin/wp-security-user-login-menu.php:272 +msgid "Enable login lockout feature" +msgstr "" + +#: admin/wp-security-user-login-menu.php:275 +msgid "Check this if you want to enable the login lockout feature and apply the settings below" +msgstr "" + +#: admin/wp-security-user-login-menu.php:279 +msgid "Allow unlock requests" +msgstr "Permite desbloquear pedidos" + +#: admin/wp-security-user-login-menu.php:282 +msgid "Check this if you want to allow users to generate an automated unlock request link which will unlock their account" +msgstr "Marque esta opção se você deseja permitir que os usuários para gerar um link de solicitação de desbloqueio automático que irá desbloquear as suas contas" + +#: admin/wp-security-user-login-menu.php:286 +msgid "Max login attempts" +msgstr "Tentativas de login máximo" + +#: admin/wp-security-user-login-menu.php:288 +msgid "Set the value for the maximum login retries before IP address is locked out" +msgstr "Defina o valor para o número máximo de tentativas de login antes de endereço IP está bloqueado" + +#: admin/wp-security-user-login-menu.php:292 +msgid "Login retry time period (min)" +msgstr "Período de tempo (min) para fazer login novamente" + +#: admin/wp-security-user-login-menu.php:294 +msgid "If the maximum number of failed login attempts for a particular IP address occur within this time period the plugin will lock out that address" +msgstr "Se o número máximo de tentativas de login para um determinado endereço IP ocorrer dentro deste período de tempo o plugin irá bloquear esse endereço" + +#: admin/wp-security-user-login-menu.php:299 +msgid "Minimum lockout time length" +msgstr "" + +#: admin/wp-security-user-login-menu.php:305 +msgid "Set the minimum time period in minutes of lockout." +msgstr "" + +#: admin/wp-security-user-login-menu.php:306 +msgid "This failed login lockout time will be tripled on each failed login." +msgstr "" + +#: admin/wp-security-user-login-menu.php:313 +msgid "Maximum lockout time length" +msgstr "" + +#: admin/wp-security-user-login-menu.php:318 +msgid "Set the maximum time period in minutes of lockout." +msgstr "" + +#: admin/wp-security-user-login-menu.php:319 +msgid "No IP address will be blocked for more than this time period after making a failed login attempt." +msgstr "" + +#: admin/wp-security-user-login-menu.php:324 +msgid "Display generic error message" +msgstr "Exibir mensagem de erro genérico" + +#: admin/wp-security-user-login-menu.php:327 +msgid "Check this if you want to show a generic error message when a login attempt fails" +msgstr "Marque esta opção se deseja mostrar uma mensagem de erro genérico quando uma tentativa de login falhar" + +#: admin/wp-security-user-login-menu.php:331 +msgid "Instantly lockout invalid usernames" +msgstr "Bloquear instantaneamente nome de usuário inválido" + +#: admin/wp-security-user-login-menu.php:334 +msgid "Check this if you want to instantly lockout login attempts with usernames which do not exist on your system" +msgstr "Marque esta opção se você deseja instantaneamente o bloqueio de tentativas de login com nomes de usuários que não existem em seu sistema" + +#: admin/wp-security-user-login-menu.php:339 +msgid "Instantly lockout specific usernames" +msgstr "" + +#: admin/wp-security-user-login-menu.php:349 +msgid "Insert one username per line. Existing usernames are not blocked even if present in the list." +msgstr "" + +#: admin/wp-security-user-login-menu.php:354 +msgid "Notify by email" +msgstr "Notificar por e-mail" + +#: admin/wp-security-user-login-menu.php:358 +msgid "Check this if you want to receive an email when someone has been locked out due to maximum failed login attempts" +msgstr "Marque esta opção se você deseja receber um e-mail quando alguém foi bloqueado devido a tentativas máximas na falha de login" + +#: admin/wp-security-user-login-menu.php:361 +msgid "Fill in one email address per line." +msgstr "" + +#: admin/wp-security-user-login-menu.php:365 +msgid "Each email address must be on a new line." +msgstr "" + +#: admin/wp-security-user-login-menu.php:366 +msgid "If a valid email address has not been filled in, it will not be saved." +msgstr "" + +#: admin/wp-security-user-login-menu.php:367 +msgid "The valid email address format is userid@example.com" +msgstr "" + +#: admin/wp-security-user-login-menu.php:368 +msgid "Example: %s" +msgstr "" + +#: admin/wp-security-user-login-menu.php:375 +msgid "Enable PHP backtrace in email" +msgstr "" + +#: admin/wp-security-user-login-menu.php:379 +msgid "Check this if you want to include the PHP backtrace in notification emails." +msgstr "" + +#: admin/wp-security-user-login-menu.php:379 +msgid "This is internal coding information which makes it easier to investigate where an issued occurred." +msgstr "" + +#: admin/wp-security-user-login-menu.php:389 +msgid "Currently locked out IP address ranges" +msgstr "Atualmente bloqueado intervalos de endereços IP" + +#: admin/wp-security-user-login-menu.php:394 +msgid "To see a list of all locked IP addresses and ranges go to the %s tab in the dashboard menu." +msgstr "Para ver uma lista de todos os endereços IP bloqueados e intervalos ir para a aba %s no menu do painel." + +#: admin/wp-security-user-login-menu.php:399 +msgid "Login lockout IP whitelist settings" +msgstr "" + +#: admin/wp-security-user-login-menu.php:405 +msgid "Enable login lockout IP whitelist" +msgstr "" + +#: admin/wp-security-user-login-menu.php:416 +msgid "The addresses specified here will never be blocked by the login lockout feature." +msgstr "" + +#: admin/wp-security-user-login-menu.php:450 +msgid "User login feature - Delete all failed login records operation failed." +msgstr "Recurso de login de usuário - Excluir todas as falhas de operação de registros de falhas de login!" + +#: admin/wp-security-user-login-menu.php:452 +msgid "All records from the failed logins table were deleted successfully." +msgstr "Todos os registros da tabela falhas de logins foram excluídos com sucesso!" + +#: admin/wp-security-user-login-menu.php:467 +msgid "This tab displays the failed login attempts for your site." +msgstr "Essa guia exibe as tentativas de login para o seu site." + +#: admin/wp-security-user-login-menu.php:468 +msgid "The information below can be handy if you need to do security investigations because it will show you the IP range, username and ID (if applicable) and the time/date of the failed login attempt." +msgstr "As informações abaixo podem ser útil se você precisa fazer investigações de segurança porque ele lhe mostrará o intervalo de IP, nome de usuário e ID (se aplicável) e a hora/data da falha de tentativa de login." + +#: admin/wp-security-user-login-menu.php:469 +msgid "Failed login records that are older than %1$d days are purged automatically." +msgstr "" + +#: admin/wp-security-user-login-menu.php:508 +#: admin/wp-security-user-login-menu.php:517 +msgid "Delete all failed login records" +msgstr "Excluir todos os registros de falha de login" + +#: admin/wp-security-user-login-menu.php:514 +msgid "Click this button if you wish to delete all failed login records in one go." +msgstr "Clique nesse botão se você deseja excluir todos os registros de falhas de login de uma só vez." + +#: admin/wp-security-user-login-menu.php:544 +msgid "You entered a non numeric value for the logout time period field. It has been set to the default value." +msgstr "Você digitou um valor não numérico para o campo de período de tempo de saída. Foi definido como o valor padrão." + +#: admin/wp-security-user-login-menu.php:569 +msgid "Setting an expiry period for your WP administration session is a simple way to protect against unauthorized access to your site from your computer." +msgstr "Definir um período de expiração para a sessão de administração do WP é uma maneira simples para proteger contra o acesso não autorizado ao seu site a partir do seu computador." + +#: admin/wp-security-user-login-menu.php:570 +msgid "This feature allows you to specify a time period in minutes after which the admin session will expire and the user will be forced to log back in." +msgstr "Este recurso permite que você especifique um período de tempo em minutos, após o qual a sessão de administração irá expirar e o usuário será forçado a voltar a iniciar sessão." + +#: admin/wp-security-user-login-menu.php:575 +msgid "Force user logout options" +msgstr "Opções de saída do usuário à força" + +#: admin/wp-security-user-login-menu.php:587 +msgid "Enable force WP user logout" +msgstr "Habilitar saída do usuário WP à força" + +#: admin/wp-security-user-login-menu.php:590 +msgid "Check this if you want to force a wp user to be logged out after a configured amount of time" +msgstr "Marque esta opção se você deseja forçar um usuário wp a ser desconectado após um período de tempo configurado" + +#: admin/wp-security-user-login-menu.php:594 +msgid "Logout the WP user after XX minutes" +msgstr "Desconectar usuário WP após XX minutos" + +#: admin/wp-security-user-login-menu.php:596 +msgid "(Minutes) The user will be forced to log back in after this time period has elapased." +msgstr "(Minutos) O usuário será obrigado a efetuar login novamente após este período de tempo tem passado." + +#: admin/wp-security-user-login-menu.php:625 +msgid "This tab displays the activity for accounts registered with your site that have logged in using the WordPress login form." +msgstr "" + +#: admin/wp-security-user-login-menu.php:626 +msgid "The information below can be handy if you need to do security investigations because it will show you the last 100 recent login events by username, IP address and time/date." +msgstr "" + +#: admin/wp-security-user-login-menu.php:627 +msgid "Account activity logs that are older than %1$d days are purged automatically." +msgstr "" + +#: admin/wp-security-user-login-menu.php:697 +msgid "Refresh logged in user data" +msgstr "Atualizar dados de usuários conectados" + +#: admin/wp-security-user-login-menu.php:701 +msgid "Refresh data" +msgstr "Atualizar dados" + +#: admin/wp-security-user-login-menu.php:706 +msgid "This tab displays all users who are currently logged into your site." +msgstr "Essa guia exibe todos os usuários que estão atualmente conectados no seu site." + +#: admin/wp-security-user-login-menu.php:707 +msgid "If you suspect there is a user or users who are logged in which should not be, you can block them by inspecting the IP addresses from the data below and adding them to your blacklist." +msgstr "Se você suspeitar que há um ou mais usuários que estão conectados que não deve ser, você pode bloqueá-los inspecionando os endereços IP a partir dos dados abaixo e adicioná-los à sua lista negra." + +#: admin/wp-security-user-login-menu.php:708 +msgid "You can also instantly log them out by clicking on the \"Force logout\" link when you hover over the row in the user id column." +msgstr "Você também pode imediatamente desconecta-los clicando no link \"Força Saída\" quando você passa o mouse sobre a linha na coluna Id do usuário." + +#: admin/wp-security-user-login-menu.php:713 +msgid "Currently logged in users" +msgstr "Usuários atualmente conectados" + +#: admin/wp-security-user-login-menu.php:761 +msgid "WordPress 5.6 introduced a new feature called \"Application passwords\"." +msgstr "" + +#: admin/wp-security-user-login-menu.php:762 +msgid "This allows you to create a token from the WordPress dashboard which then can be used in the authorization header." +msgstr "" + +#: admin/wp-security-user-login-menu.php:763 +msgid "This feature allows you to disable application passwords as they can leave your site vulnerable to social engineering and phishing scams." +msgstr "" + +#: admin/wp-security-user-login-menu.php:780 +#: classes/grade-system/wp-security-feature-item-manager.php:53 +msgid "Disable application password" +msgstr "" + +#: admin/wp-security-user-login-menu.php:783 +msgid "Check this if you want to disable the application password." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:27 +msgid "Manual approval" +msgstr "Aprovação manual" + +#: admin/wp-security-user-registration-menu.php:28 +#: classes/grade-system/wp-security-feature-item-manager.php:59 +msgid "Registration CAPTCHA" +msgstr "Captcha em registro" + +#: admin/wp-security-user-registration-menu.php:29 +msgid "Registration honeypot" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:55 +msgid "User registration" +msgstr "Registro de usuário" + +#: admin/wp-security-user-registration-menu.php:115 +msgid "User registration settings" +msgstr "Configurações de registro de usuários" + +#: admin/wp-security-user-registration-menu.php:119 +msgid "Manually approve new registrations" +msgstr "Aprovar manualmente novos registros" + +#: admin/wp-security-user-registration-menu.php:123 +msgid "If your site allows people to create their own accounts via the WordPress registration form, then you can minimize spam or bogus registrations by manually approving each registration." +msgstr "Se o seu site permite que as pessoas criem suas próprias contas, através do formulário de inscrição WordPress, então você pode minimizar SPAM ou registros falsos, aprovando manualmente cada registro." + +#: admin/wp-security-user-registration-menu.php:124 +msgid "This feature will automatically set a newly registered account to \"pending\" until the administrator activates it. Therefore undesirable registrants will be unable to log in without your express approval." +msgstr "Este recurso irá definir automaticamente uma conta recém registrada para \"pendente\" até que o administrador a ative. Portanto inscritos indesejáveis ​​não serão capazes de entrar sem a sua autorização expressa." + +#: admin/wp-security-user-registration-menu.php:125 +msgid "You can view all accounts which have been newly registered via the handy table below and you can also perform bulk activation/deactivation/deletion tasks on each account." +msgstr "Você pode ver todas as contas que foram recentemente registradas através da tabela acessível abaixo e você também pode executar tarefas de ativação / desativação / exclusão em massa em cada conta." + +#: admin/wp-security-user-registration-menu.php:142 +msgid "Enable manual approval of new registrations" +msgstr "Habilitar aprovação manual de novos registros" + +#: admin/wp-security-user-registration-menu.php:145 +msgid "Check this if you want to automatically disable all newly registered accounts so that you can approve them manually." +msgstr "Marque esta opção se você deseja desabilitar automaticamente todas as contas recém registradas de modo que você possa aprová-las manualmente." + +#: admin/wp-security-user-registration-menu.php:154 +msgid "Approve registered users" +msgstr "Aprovar os usuários registrados" + +#: admin/wp-security-user-registration-menu.php:206 +msgid "This feature allows you to add a CAPTCHA form on the WordPress registration page." +msgstr "Este recurso permite que você adicione uma formulário captcha na página de registro WordPress." + +#: admin/wp-security-user-registration-menu.php:207 +msgid "Users who attempt to register will also need to enter the answer to a simple mathematical question - if they enter the wrong answer, the plugin will not allow them to register." +msgstr "Usuários que tentam registrar também precisará digitar a resposta a uma simples questão de matemática - se entrarem com a resposta errada, o plugin não irá permitir-lhes para se registrar." + +#: admin/wp-security-user-registration-menu.php:208 +msgid "Therefore, adding a CAPTCHA form on the registration page is another effective yet simple spam registration prevention technique." +msgstr "Portanto, adicionando um formulário captcha na página de registro é outra técnica de prevenção de registro SPAM eficaz, ainda que simples." + +#: admin/wp-security-user-registration-menu.php:212 +msgid "Registration page CAPTCHA settings" +msgstr "Configurações de captcha na página de registro" + +#: admin/wp-security-user-registration-menu.php:219 +msgid "The core default behaviour for WordPress Multi Site regarding user registration is that all users are registered via the main site." +msgstr "O comportamento padrão de núcleo para WordPress Multi Site sobre registro de usuário é que todos os usuários são registrados através do site principal." + +#: admin/wp-security-user-registration-menu.php:220 +msgid "Therefore, if you would like to add a CAPTCHA form to the registration page for a Multi Site, please go to \"Registration CAPTCHA\" settings on the main site." +msgstr "Portanto, se você gostaria de adicionar um formulário captcha à página de registro para um multi site, por favor, vá para Configurações \"Captcha Registro\" no site principal." + +#: admin/wp-security-user-registration-menu.php:235 +msgid "Enable CAPTCHA on registration page" +msgstr "Habilitar captcha na página de registro" + +#: admin/wp-security-user-registration-menu.php:238 +msgid "Check this if you want to insert a CAPTCHA form on the WordPress user registration page (if you allow user registration)." +msgstr "Marque esta opção se você deseja inserir um formulário captcha na página de registro de usuário do WordPress (se você permitir o registo do usuário)." + +#: admin/wp-security-user-registration-menu.php:276 +msgid "This feature allows you to add a special hidden \"honeypot\" field on the WordPress registration page. This will only be visible to robots and not humans." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:277 +msgid "Since robots usually fill in every input field from a registration form, they will also submit a value for the special hidden honeypot field." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:279 +msgid "Therefore, if the plugin detects that this field has a value when the registration form is submitted, then the robot which is attempting to register on your site will be redirected to its localhost address - http://127.0.0.1." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:285 +msgid "Registration form honeypot settings" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:296 +msgid "Enable honeypot on registration page" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:299 +msgid "Check this if you want to enable the honeypot feature for the registration page" +msgstr "" + +#: classes/aios-ajax.php:89 +msgid "Invalid IP retrieve method." +msgstr "" + +#: classes/aios-ajax.php:131 +#: wp-security-core.php:258 +msgid "The security check failed; try refreshing the page." +msgstr "" + +#: classes/aios-ajax.php:152 +#: wp-security-core.php:268 +msgid "You are not allowed to run this command." +msgstr "" + +#: classes/aios-ajax.php:173 +#: wp-security-core.php:282 +msgid "Options can only be saved by network admin" +msgstr "" + +#: classes/aios-ajax.php:202 +msgid "The command \"%s\" was not found" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:39 +msgid "Remove WP generator meta tag" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:45 +msgid "Change display name" +msgstr "Alterar nome de exibição" + +#: classes/grade-system/wp-security-feature-item-manager.php:57 +msgid "Registration approval" +msgstr "Aprovação do registro" + +#: classes/grade-system/wp-security-feature-item-manager.php:61 +msgid "Enable registration honeypot" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:73 +msgid "WordPress files access" +msgstr "Acesso arquivos WordPress" + +#: classes/grade-system/wp-security-feature-item-manager.php:77 +msgid "IP and user agent blacklisting" +msgstr "Lista negra de agente de usuário e IP" + +#: classes/grade-system/wp-security-feature-item-manager.php:81 +msgid "Enable basic firewall" +msgstr "Habilitar firewall básico" + +#: classes/grade-system/wp-security-feature-item-manager.php:82 +msgid "Enable pingback vulnerability protection" +msgstr "Habilitar proteção vulnerabilidade pingback" + +#: classes/grade-system/wp-security-feature-item-manager.php:83 +msgid "Block accesss to debug log file" +msgstr "Bloquear o acesso ao arquivo de registro de depuração" + +#: classes/grade-system/wp-security-feature-item-manager.php:87 +msgid "Forbid proxy comments" +msgstr "Proibir comentários proxy" + +#: classes/grade-system/wp-security-feature-item-manager.php:88 +msgid "Deny bad queries" +msgstr "Impedir consultas duvidosas" + +#: classes/grade-system/wp-security-feature-item-manager.php:91 +msgid "5G/6G blacklist" +msgstr "Lista negra 5G/6G" + +#: classes/grade-system/wp-security-feature-item-manager.php:97 +msgid "Enable IP blocking for 404 detection" +msgstr "Habilitar o bloqueio de IP para a detecção de 404" + +#: classes/grade-system/wp-security-feature-item-manager.php:101 +msgid "Enable rename login page" +msgstr "Habilitar renomeação da página de login" + +#: classes/grade-system/wp-security-feature-item-manager.php:106 +msgid "Lost password CAPTCHA" +msgstr "Captcha senha perdida" + +#: classes/grade-system/wp-security-feature-item-manager.php:107 +msgid "Custom login CAPTCHA" +msgstr "Captcha login personalizado" + +#: classes/grade-system/wp-security-feature-item-manager.php:108 +msgid "Woo login CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:109 +msgid "Woo lost password CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:110 +msgid "Woo register CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:112 +msgid "Login IP whitelisting" +msgstr "Lista branca IP login" + +#: classes/grade-system/wp-security-feature-item-manager.php:114 +msgid "Enable login honeypot" +msgstr "Habilitar pote de mel em login" + +#: classes/grade-system/wp-security-feature-item-manager.php:118 +msgid "Comment CAPTCHA" +msgstr "Captcha comentário" + +#: classes/grade-system/wp-security-feature-item-manager.php:119 +msgid "Block spambots" +msgstr "Bloquear Spambots" + +#: classes/grade-system/wp-security-feature-item-manager.php:121 +msgid "BuddyPress registration CAPTCHA" +msgstr "Captcha registro BuddyPress" + +#: classes/grade-system/wp-security-feature-item-manager.php:123 +msgid "bbPress new topic CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item.php:29 +msgid "Basic" +msgstr "Básico" + +#: classes/grade-system/wp-security-feature-item.php:31 +msgid "Intermediate" +msgstr "Intermediario" + +#: classes/grade-system/wp-security-feature-item.php:33 +msgid "Advanced" +msgstr "Avançado" + +#: classes/wp-security-captcha.php:47 +#: classes/wp-security-general-init-tasks.php:407 +msgid "Please enter an answer in digits:" +msgstr "Favor digite a resposta em dígitos:" + +#: classes/wp-security-captcha.php:127 +msgid "one" +msgstr "um" + +#: classes/wp-security-captcha.php:128 +msgid "two" +msgstr "dois" + +#: classes/wp-security-captcha.php:129 +msgid "three" +msgstr "três" + +#: classes/wp-security-captcha.php:130 +msgid "four" +msgstr "quatro" + +#: classes/wp-security-captcha.php:131 +msgid "five" +msgstr "cinco" + +#: classes/wp-security-captcha.php:132 +msgid "six" +msgstr "seis" + +#: classes/wp-security-captcha.php:133 +msgid "seven" +msgstr "sete" + +#: classes/wp-security-captcha.php:134 +msgid "eight" +msgstr "oito" + +#: classes/wp-security-captcha.php:135 +msgid "nine" +msgstr "nove" + +#: classes/wp-security-captcha.php:136 +msgid "ten" +msgstr "dez" + +#: classes/wp-security-captcha.php:137 +msgid "eleven" +msgstr "onze" + +#: classes/wp-security-captcha.php:138 +msgid "twelve" +msgstr "doze" + +#: classes/wp-security-captcha.php:139 +msgid "thirteen" +msgstr "treze" + +#: classes/wp-security-captcha.php:140 +msgid "fourteen" +msgstr "catorze" + +#: classes/wp-security-captcha.php:141 +msgid "fifteen" +msgstr "quinze" + +#: classes/wp-security-captcha.php:142 +msgid "sixteen" +msgstr "dezesseis" + +#: classes/wp-security-captcha.php:143 +msgid "seventeen" +msgstr "dezessete" + +#: classes/wp-security-captcha.php:144 +msgid "eighteen" +msgstr "dezoito" + +#: classes/wp-security-captcha.php:145 +msgid "nineteen" +msgstr "dezenove" + +#: classes/wp-security-captcha.php:146 +msgid "twenty" +msgstr "vinte" + +#: classes/wp-security-cronjob-handler.php:34 +msgid "Every 15 minutes" +msgstr "" + +#: classes/wp-security-debug-logger.php:46 +msgid "Unable to get the reason why" +msgstr "" + +#: classes/wp-security-debug-logger.php:47 +msgid "Unable to clear the logs" +msgstr "" + +#: classes/wp-security-file-scan.php:85 +msgid "All In One WP Security - File change detected!" +msgstr "All In One WP Security - Alteração de arquivo detectada!" + +#: classes/wp-security-file-scan.php:87 +msgid "A file change was detected on your system for site URL" +msgstr "Um arquivo substituido foi detectado em seu sistema do website URL" + +#: classes/wp-security-file-scan.php:87 +msgid ". Scan was generated on" +msgstr ". Verificação foi gerada em" + +#: classes/wp-security-file-scan.php:88 +msgid "A summary of the scan results is shown below:" +msgstr "Um resumo dos resultados da verificação é mostrado abaixo:" + +#: classes/wp-security-file-scan.php:91 +msgid "Login to your site to view the scan details." +msgstr "Logue-se em seu website para ver os detalhes da verificação." + +#: classes/wp-security-file-scan.php:313 +msgid "The following files were added to your host" +msgstr "Os seguintes arquivos foram adicionados ao seu host" + +#: classes/wp-security-file-scan.php:315 +#: classes/wp-security-file-scan.php:323 +#: classes/wp-security-file-scan.php:332 +msgid "modified on: " +msgstr "modificado em: " + +#: classes/wp-security-file-scan.php:321 +msgid "The following files were removed from your host" +msgstr "Os seguintes arquivos foram removidos do seu hospedeiro" + +#: classes/wp-security-file-scan.php:330 +msgid "The following files were changed on your host" +msgstr "Os seguintes arquivos foram alterados em seu hospedeiro" + +#: classes/wp-security-general-init-tasks.php:212 +#: classes/wp-security-general-init-tasks.php:481 +msgid "Application passwords have been disabled by All In One WP Security & Firewall plugin." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:428 +#: classes/wp-security-general-init-tasks.php:541 +#: classes/wp-security-general-init-tasks.php:574 +#: classes/wp-security-user-login.php:137 +#: classes/wp-security-user-registration.php:74 +msgid "ERROR: Your answer was incorrect - please try again." +msgstr "ERRO: A sua resposta está INCORRETA - por favor, tente novamente." + +#: classes/wp-security-general-init-tasks.php:463 +msgid "Enter something special:" +msgstr "Digite algo especial:" + +#: classes/wp-security-general-init-tasks.php:476 +msgid "Application passwords" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:485 +msgid "Change setting" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:487 +msgid "Site admin can only change this setting." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:516 +msgid "Error: You entered an incorrect CAPTCHA answer. Please go back and try again." +msgstr "Erro: Você digitou a resposta CAPTCHA, de forma incorreta. Por favor, volte e tente NOVAMENTE." + +#: classes/wp-security-general-init-tasks.php:558 +msgid "Your CAPTCHA answer was incorrect - please try again." +msgstr "Sua resposta CAPTCHA estava errada - por favor, tente novamente." + +#: classes/wp-security-general-init-tasks.php:567 +msgid "ERROR: Your IP address is currently locked please contact the administrator!" +msgstr "" + +#. translators: %s: Admin Dashboard > WP Security > Brute Force > Login CAPTCHA Tab Link +#: classes/wp-security-general-init-tasks.php:642 +msgid "Your Google reCAPTCHA site key is wrong. Please fill the correct reCAPTCHA keys %s to use the Google reCAPTCHA feature." +msgstr "" + +#. translators: %s: Admin Dashboard > WP Security > Brute Force > Login CAPTCHA Tab Link +#: classes/wp-security-general-init-tasks.php:642 +#: classes/wp-security-notices.php:99 +msgid "here" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +msgid "Would you like All In One WP Security & Firewall to re-insert the security rules in your .htaccess file which were cleared when you deactivated the plugin?" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +#: templates/may-also-like.php:40 +#: templates/may-also-like.php:43 +#: templates/may-also-like.php:54 +#: templates/may-also-like.php:57 +#: templates/may-also-like.php:68 +#: templates/may-also-like.php:71 +#: templates/may-also-like.php:91 +#: templates/may-also-like.php:103 +#: templates/may-also-like.php:115 +#: templates/may-also-like.php:127 +#: templates/may-also-like.php:139 +#: templates/may-also-like.php:151 +#: templates/may-also-like.php:168 +#: templates/may-also-like.php:171 +#: templates/may-also-like.php:183 +#: templates/may-also-like.php:195 +#: templates/may-also-like.php:207 +#: templates/may-also-like.php:219 +#: templates/may-also-like.php:231 +#: templates/may-also-like.php:243 +#: templates/may-also-like.php:252 +#: templates/may-also-like.php:255 +#: templates/may-also-like.php:264 +#: templates/may-also-like.php:267 +#: templates/may-also-like.php:279 +#: templates/may-also-like.php:297 +#: templates/may-also-like.php:309 +#: templates/may-also-like.php:327 +#: templates/may-also-like.php:339 +#: templates/may-also-like.php:351 +#: templates/may-also-like.php:368 +#: templates/may-also-like.php:380 +msgid "Yes" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +#: templates/may-also-like.php:88 +#: templates/may-also-like.php:100 +#: templates/may-also-like.php:112 +#: templates/may-also-like.php:124 +#: templates/may-also-like.php:136 +#: templates/may-also-like.php:148 +#: templates/may-also-like.php:180 +#: templates/may-also-like.php:192 +#: templates/may-also-like.php:204 +#: templates/may-also-like.php:216 +#: templates/may-also-like.php:228 +#: templates/may-also-like.php:240 +#: templates/may-also-like.php:276 +#: templates/may-also-like.php:294 +#: templates/may-also-like.php:306 +#: templates/may-also-like.php:324 +#: templates/may-also-like.php:336 +#: templates/may-also-like.php:348 +#: templates/may-also-like.php:365 +#: templates/may-also-like.php:377 +#: templates/notices/custom-notice.php:27 +msgid "No" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:674 +msgid "Your registration is pending approval." +msgstr "" + +#: classes/wp-security-notices.php:25 +msgid "The All in One Security plugin has disabled the login whitelist setting that you have enabled in the past." +msgstr "" + +#: classes/wp-security-notices.php:29 +msgid "Your website is running on an Apache webserver, the login whitelisting might not be functional until the recent update of AIOS (because it relied upon Apache-specific module features)." +msgstr "" + +#: classes/wp-security-notices.php:31 +msgid "Your website is running on a non-Apache webserver, so the login whitelisting was not functional until the recent update of AIOS (because it relied upon Apache-specific features)." +msgstr "" + +#: classes/wp-security-notices.php:33 +msgid "It began working with AIOS version 5.0.8." +msgstr "" + +#: classes/wp-security-notices.php:33 +msgid "We have disabled it so that your login page will not be blocked unexpectedly." +msgstr "" + +#: classes/wp-security-notices.php:42 +msgid "Would you like to re-enable login whitelisting?" +msgstr "" + +#: classes/wp-security-notices.php:48 +msgid "Removed database backup feature from the All In One WP Security & Firewall plugin" +msgstr "" + +#: classes/wp-security-notices.php:50 +msgid "Beginning with version 5.0.0, AIOS has replaced the AIOS backup method with the superior UpdraftPlus method." +msgstr "" + +#: classes/wp-security-notices.php:51 +msgid "It remains free and is fully supported by the UpdraftPlus team." +msgstr "" + +#: classes/wp-security-notices.php:54 +msgid "You are seeing this notice because you have previously set up automated database backups in AIOS." +msgstr "" + +#: classes/wp-security-notices.php:55 +msgid "Would you like to set up scheduled backups with UpdraftPlus?" +msgstr "" + +#: classes/wp-security-notices.php:61 +msgid "Setup UpdraftPlus backup plugin" +msgstr "" + +#: classes/wp-security-notices.php:67 +msgid "Important: set up your IP address detection settings" +msgstr "" + +#: classes/wp-security-notices.php:69 +msgid "The All in One Security plugin couldn't be certain about the correct method to detect the IP address for your site visitors with your currently-configured IP address detection settings." +msgstr "" + +#: classes/wp-security-notices.php:70 +msgid "It is important for your security to set the IP address detection settings properly." +msgstr "" + +#: classes/wp-security-notices.php:73 +msgid "Please go to the settings and set them now." +msgstr "" + +#: classes/wp-security-notices.php:79 +msgid "Setup IP address detection settings" +msgstr "" + +#: classes/wp-security-notices.php:85 +msgid "Important: Disabled login whitelist setting" +msgstr "" + +#: classes/wp-security-notices.php:91 +msgid "Turn it back on" +msgstr "" + +#: classes/wp-security-notices.php:92 +msgid "Edit the settings" +msgstr "" + +#: classes/wp-security-notices.php:95 +msgid "Keep it off" +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Hey - We noticed All In One WP Security & Firewall has kept your site safe for a while. If you like us, please consider leaving a positive review to spread the word. Or if you have any issues or questions please leave us a support message %s." +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Thank you so much!" +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Team All In One WP Security & Firewall" +msgstr "" + +#: classes/wp-security-notices.php:109 +msgid "Enhance your security even more by backing up your site" +msgstr "" + +#: classes/wp-security-notices.php:110 +msgid "UpdraftPlus is the world's most trusted backup plugin from the owners of All In One WP Security & Firewall" +msgstr "" + +#: classes/wp-security-notices.php:121 +msgid "After you've secured your site, we recommend you install our WP-Optimize plugin to streamline it for better website performance." +msgstr "" + +#: classes/wp-security-process-renamed-login-page.php:152 +msgid "Not available." +msgstr "" + +#: classes/wp-security-two-factor-login.php:34 +msgid "Two factor authentication - Admin settings" +msgstr "" + +#: classes/wp-security-two-factor-login.php:97 +msgid "Two Factor Auth" +msgstr "" + +#: classes/wp-security-two-factor-login.php:153 +msgid "PHP OpenSSL or mcrypt module required" +msgstr "" + +#: classes/wp-security-two-factor-login.php:153 +msgid "The All In One WP Security plugin's Two Factor Authentication module requires either the PHP openssl (preferred) or mcrypt module to be installed. Please ask your web hosting company to install one of them." +msgstr "" + +#: classes/wp-security-user-login.php:71 +msgid "You have disabled login lockout by defining the AIOS_DISABLE_LOGIN_LOCKOUT constant value as true, and the login lockout setting has enabled it." +msgstr "" + +#. translators: 1: Locked IP Addresses admin page link +#: classes/wp-security-user-login.php:73 +msgid "Delete your login lockout IP from %s and define the AIOS_DISABLE_LOGIN_LOCKOUT constant value as false." +msgstr "" + +#: classes/wp-security-user-login.php:100 +msgid "ERROR: Access from your IP address has been blocked for security reasons. Please contact the administrator." +msgstr "" + +#: classes/wp-security-user-login.php:108 +msgid "Service temporarily unavailable" +msgstr "" + +#: classes/wp-security-user-login.php:163 +msgid "ACCOUNT PENDING: Your account is currently not active. An administrator needs to activate your account before you can login." +msgstr "CONTA PENDENTE: A sua CONTA não está ativa. Um administrador precisa ativar a sua conta antes de você efetuar o LOGIN." + +#: classes/wp-security-user-login.php:242 +msgid "ERROR: Invalid login credentials." +msgstr "ERRO: As suas informações de login são INVÁLIDAS." + +#: classes/wp-security-user-login.php:392 +msgid "Site Lockout Notification" +msgstr "Notificação de bloqueio do site" + +#: classes/wp-security-user-login.php:393 +msgid "User login lockout events had occurred due to too many failed login attempts or invalid username:" +msgstr "" + +#: classes/wp-security-user-login.php:396 +msgid "Username:" +msgstr "" + +#: classes/wp-security-user-login.php:397 +msgid "IP address:" +msgstr "" + +#: classes/wp-security-user-login.php:399 +msgid "IP range:" +msgstr "" + +#: classes/wp-security-user-login.php:404 +msgid "Log into your site WordPress administration panel to see the duration of the lockout or to unlock the user." +msgstr "" + +#: classes/wp-security-user-login.php:515 +msgid "Unlock request notification" +msgstr "Desbloquear solicitação de notificação" + +#: classes/wp-security-user-login.php:516 +msgid "You have requested for the account with email address %s to be unlocked. Please click the link below to unlock your account:" +msgstr "" + +#: classes/wp-security-user-login.php:516 +msgid "Unlock link: %s" +msgstr "" + +#: classes/wp-security-user-login.php:516 +msgid "After clicking the above link you will be able to login to the WordPress administration panel." +msgstr "Após clicar no link acima, você será capaz de acessar o painel de administração do WordPress." + +#: classes/wp-security-user-login.php:739 +msgid "Your session has expired because it has been over %d minutes since your last login." +msgstr "A sua sessão foi encerrada porque já se passaram %d minutos do seu último login." + +#: classes/wp-security-user-login.php:740 +#: classes/wp-security-user-login.php:744 +msgid "Please log back in to continue." +msgstr "Por favor efetue o login novamente para continuar." + +#: classes/wp-security-user-login.php:743 +msgid "You were logged out because you just changed the \"admin\" username." +msgstr "Você foi desconectado porque você apenas alterou o nome de usuário \"admin\"." + +#: classes/wp-security-user-login.php:773 +msgid "Request unlock" +msgstr "Solicitação de desbloqueio" + +#: classes/wp-security-user-registration.php:68 +msgid "ERROR: You are not allowed to register because your IP address is currently locked!" +msgstr "ERRO: Você não tem permissão para se registrar porque seu endereço IP está atualmente bloqueado!" + +#: classes/wp-security-utility-ip-address.php:217 +#: classes/wp-security-utility-ip-address.php:231 +#: classes/wp-security-utility-ip-address.php:245 +#: classes/wp-security-utility-ip-address.php:257 +#: classes/wp-security-utility-ip-address.php:269 +msgid " is not a valid ip address format." +msgstr " esse formato de endereço de IP não é válido." + +#: classes/wp-security-utility-ip-address.php:274 +msgid "You cannot ban your own IP address: " +msgstr "Você não pode banir o seu próprio endereço IP" + +#: classes/wp-security-utility.php:254 +msgid "This feature can only be configured by the \"superadmin\" on the main site." +msgstr "Este recurso só pode ser configurado pelo \"super administrador\" no site principal." + +#: other-includes/wp-security-unlock-request.php:32 +msgid "ERROR: Unable to process your request!" +msgstr "ERRO: Não é possível processar o seu pedido!" + +#: other-includes/wp-security-unlock-request.php:45 +msgid "Please enter a valid email address" +msgstr "Por favor digite um endereço de e-mail válido" + +#: other-includes/wp-security-unlock-request.php:57 +msgid "User account not found!" +msgstr "Conta de usuário não encontrada!" + +#: other-includes/wp-security-unlock-request.php:71 +msgid "Error: No locked entry was found in the database with your IP address range." +msgstr "Erro: Nenhuma entrada bloqueada foi encontrada no banco de dados com seu intervalo de endereços IP!" + +#: other-includes/wp-security-unlock-request.php:76 +msgid "An email has been sent to you with the unlock instructions." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:93 +msgid "You are here because you have been locked out due to too many incorrect login attempts." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:94 +msgid "Please enter your email address and you will receive an email with instructions on how to unlock yourself." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:104 +msgid "Email Address" +msgstr "Endereço de e-mail" + +#: other-includes/wp-security-unlock-request.php:108 +msgid "Send unlock request" +msgstr "" + +#: templates/admin/incompatible-plugin.php:6 +msgid "Two Factor Authentication" +msgstr "" + +#: templates/admin/incompatible-plugin.php:10 +msgid "Two Factor Authentication currently disabled" +msgstr "" + +#: templates/admin/incompatible-plugin.php:12 +#: templates/admin/incompatible-plugin.php:16 +msgid "Two factor authentication in All In One WP Security is currently disabled because the incompatible plugin %s is active." +msgstr "" + +#: templates/automated-database-backup.php:4 +msgid "Automated scheduled backups" +msgstr "Backups agendados automatizados" + +#: templates/automated-database-backup.php:9 +msgid "Automate backup in the UpdraftPlus plugin" +msgstr "" + +#: templates/automated-database-backup.php:19 +msgid "The AIOS 5.0.0 version release has removed the automated backup feature." +msgstr "" + +#: templates/automated-database-backup.php:20 +msgid "The AIOS automated backup had issues that made it less robust than we could be happy with." +msgstr "" + +#: templates/automated-database-backup.php:21 +msgid "Follow this link to automate backups in the superior UpdraftPlus backup plugin." +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:5 +msgid "Each IP address must be on a new line." +msgstr "Cada endereço IP deve estar em uma nova linha." + +#: templates/info/ip-address-ip-range-info.php:6 +msgid "To specify an IPv4 range use a wildcard \"*\" character. Acceptable ways to use wildcards is shown in the examples below:" +msgstr "Para especificar um endereço IPv4 escala usar um caractere curinga \"*\". Maneiras aceitáveis para usar caracteres curinga é mostrada nos exemplos abaixo:" + +#: templates/info/ip-address-ip-range-info.php:7 +msgid "Example 1: 195.47.89.*" +msgstr "Exemplo 1: 195.47.89.*" + +#: templates/info/ip-address-ip-range-info.php:8 +msgid "Example 2: 195.47.*.*" +msgstr "Exemplo 2: 195.47.*.*" + +#: templates/info/ip-address-ip-range-info.php:9 +msgid "Example 3: 195.*.*.*" +msgstr "Exemplo 3: 195.*.*.*" + +#: templates/info/ip-address-ip-range-info.php:10 +msgid "To specify an IPv6 range use CIDR format as shown in the examples below:" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:11 +msgid "Example 4: 2401:4900:54c3:af15:2:2:5dc0:0/112" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:12 +msgid "Example 5: 2001:db8:1263::/48" +msgstr "" + +#: templates/may-also-like.php:5 +msgid "All-In-One Security (AIOS) Free vs Premium Comparison Chart" +msgstr "" + +#: templates/may-also-like.php:7 +msgid "FAQs" +msgstr "" + +#: templates/may-also-like.php:9 +msgid "Ask a pre-sales question" +msgstr "" + +#: templates/may-also-like.php:17 +msgid "All In One WP Security & Firewall Free" +msgstr "" + +#: templates/may-also-like.php:26 +#: templates/may-also-like.php:386 +msgid "Installed" +msgstr "" + +#: templates/may-also-like.php:29 +#: templates/may-also-like.php:389 +msgid "Upgrade now" +msgstr "" + +#: templates/may-also-like.php:34 +msgid "Login security feature suite" +msgstr "" + +#: templates/may-also-like.php:35 +msgid "Protect against brute-force attacks and keep bots at bay." +msgstr "" + +#: templates/may-also-like.php:35 +msgid "AIOS takes WordPress' default login security features to a whole new level." +msgstr "" + +#: templates/may-also-like.php:37 +msgid "To see all login security features, visit %s" +msgstr "" + +#: templates/may-also-like.php:48 +msgid "Firewall and file protection feature suite" +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Protection from the latest exploits." +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Activate firewall settings ranging from basic, intermediate and advanced." +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Get comprehensive, instant protection with All-in-One Security." +msgstr "" + +#: templates/may-also-like.php:51 +msgid "To see all firewall and file protection features, visit %s" +msgstr "" + +#: templates/may-also-like.php:62 +msgid "Content protection feature suite" +msgstr "" + +#: templates/may-also-like.php:63 +msgid "Eliminate spam and protect your content to dramatically improve your website's interactions with search engines." +msgstr "" + +#: templates/may-also-like.php:65 +msgid "To see all content protection features, visit %s" +msgstr "" + +#: templates/may-also-like.php:76 +msgid "Malware scanning" +msgstr "" + +#: templates/may-also-like.php:77 +msgid "Finding out by accident that your site has been infected with malware is too late." +msgstr "" + +#: templates/may-also-like.php:79 +msgid "Malware can have a dramatic effect on your site's search rankings and you may not even know about it." +msgstr "" + +#: templates/may-also-like.php:79 +msgid "It can slow your website down, access customer data, send unsolicited emails, change your content or prevent users from accessing it." +msgstr "" + +#: templates/may-also-like.php:84 +msgid "Automatic malware scanning" +msgstr "" + +#: templates/may-also-like.php:85 +msgid "Best-in-class scanning for the latest malware, trojans and spyware 24/7." +msgstr "" + +#: templates/may-also-like.php:96 +msgid "Response time monitoring" +msgstr "" + +#: templates/may-also-like.php:97 +msgid "You'll know immediately if your website's response time is negatively affected." +msgstr "" + +#: templates/may-also-like.php:108 +msgid "Up-time monitoring" +msgstr "" + +#: templates/may-also-like.php:109 +msgid "AIOS checks your website's uptime every 5 minutes." +msgstr "" + +#: templates/may-also-like.php:109 +msgid "We'll notify you straight away if your site/server goes down." +msgstr "" + +#: templates/may-also-like.php:120 +msgid "Prevents blacklisting by search engines" +msgstr "" + +#: templates/may-also-like.php:121 +msgid "AIOS monitors your site's blacklist status daily." +msgstr "" + +#: templates/may-also-like.php:121 +msgid "We'll notify you within 24 hours if something's amiss so you can take action, before it's too late." +msgstr "" + +#: templates/may-also-like.php:132 +msgid "Flexible assignment" +msgstr "" + +#: templates/may-also-like.php:133 +msgid "Register and remove websites from the scanning service at any time." +msgstr "" + +#: templates/may-also-like.php:144 +msgid "Malware reports" +msgstr "" + +#: templates/may-also-like.php:145 +msgid "Reports are available via the 'My Account' page and directly via email." +msgstr "" + +#: templates/may-also-like.php:156 +msgid "Flexible two-factor authentication" +msgstr "" + +#: templates/may-also-like.php:157 +msgid "With Two-Factor Authentication (TFA) users enter their username and password and a one-time code sent to a device to login." +msgstr "" + +#: templates/may-also-like.php:159 +msgid "TFA is a feature in both our free and premium packages, but AIOS Premium affords whole new levels of control over how TFA is implemented." +msgstr "" + +#: templates/may-also-like.php:164 +msgid "Authenticator apps" +msgstr "" + +#: templates/may-also-like.php:165 +msgid "Supports TOTP and HOTP protocols." +msgstr "" + +#: templates/may-also-like.php:165 +msgid "TFA Can be used with Google Authenticator, Microsoft Authenticator, Authy and many more." +msgstr "" + +#: templates/may-also-like.php:176 +msgid "Role specific configuration" +msgstr "" + +#: templates/may-also-like.php:177 +msgid "Make it compulsory for certain roles e.g. for admin and editor roles." +msgstr "" + +#: templates/may-also-like.php:188 +msgid "Require TFA after a set time period" +msgstr "" + +#: templates/may-also-like.php:189 +msgid "For example you could require all admins to have TFA once their accounts are a week old." +msgstr "" + +#: templates/may-also-like.php:200 +msgid "Trusted devices - control how often TFA is required" +msgstr "" + +#: templates/may-also-like.php:201 +msgid "Ask for TFA after a chosen number of days for trusted devices instead of on every login." +msgstr "" + +#: templates/may-also-like.php:212 +msgid "Anti-bot protection" +msgstr "" + +#: templates/may-also-like.php:213 +msgid "Option to hide the existence of forms on WooCommerce login pages unless JavaScript is active." +msgstr "" + +#: templates/may-also-like.php:224 +msgid "Customise TFA design layout" +msgstr "" + +#: templates/may-also-like.php:225 +msgid "Customise the design of TFA so it aligns with your existing web design." +msgstr "" + +#: templates/may-also-like.php:236 +msgid "TFA emergency codes" +msgstr "" + +#: templates/may-also-like.php:237 +msgid "Generate a one-time use emergency code to allow access if your device is lost." +msgstr "" + +#: templates/may-also-like.php:248 +msgid "TFA multisite compatibility" +msgstr "" + +#: templates/may-also-like.php:249 +msgid "TFA is Compatible with multisite networks and sub-sites." +msgstr "" + +#: templates/may-also-like.php:260 +msgid "TFA support for common login forms" +msgstr "" + +#: templates/may-also-like.php:261 +msgid "Supports WooCommerce, Affiliates-WP and Theme my Login login forms." +msgstr "" + +#: templates/may-also-like.php:272 +msgid "TFA support for other login forms" +msgstr "" + +#: templates/may-also-like.php:273 +msgid "Supports Elementor Pro, bbPress and all third-party login forms without any further coding needed." +msgstr "" + +#: templates/may-also-like.php:284 +msgid "Smart 404 blocking" +msgstr "" + +#: templates/may-also-like.php:285 +msgid "404 errors can occur when someone legitimately mistypes a URL, but they're also generated by hackers searching for weaknesses in your site." +msgstr "" + +#: templates/may-also-like.php:290 +msgid "Automatically and permanently blocks bots producing 404s" +msgstr "" + +#: templates/may-also-like.php:291 +msgid "AIOS Premium provides more protection than the competition by automatically and permanently blocking IP addresses of bots and hackers based on how many 404 errors they generate." +msgstr "" + +#: templates/may-also-like.php:302 +msgid "404 error charts" +msgstr "" + +#: templates/may-also-like.php:303 +msgid "Handy charts keep you informed of how many 404s have occurred and which IP address or country is producing them." +msgstr "" + +#: templates/may-also-like.php:314 +msgid "Country blocking" +msgstr "" + +#: templates/may-also-like.php:315 +msgid "Most malicious attacks come from a handful of countries and so it's possible to prevent most attacks with our country blocking tool." +msgstr "" + +#: templates/may-also-like.php:320 +msgid "Block traffic based on country of origin" +msgstr "" + +#: templates/may-also-like.php:321 +msgid "AIOS Premium utilises an IP database that promises 99.5% accuracy." +msgstr "" + +#: templates/may-also-like.php:332 +msgid "Block traffic to specific pages based on country of origin" +msgstr "" + +#: templates/may-also-like.php:333 +msgid "Block access to your whole site or on a page-by-page basis." +msgstr "" + +#: templates/may-also-like.php:344 +msgid "Whitelist some users from blocked countries" +msgstr "" + +#: templates/may-also-like.php:345 +msgid "Whitelist IP addresses or IP ranges even if they are part of a blocked country." +msgstr "" + +#: templates/may-also-like.php:356 +msgid "Premium support" +msgstr "" + +#: templates/may-also-like.php:361 +msgid "Unlimited support" +msgstr "" + +#: templates/may-also-like.php:362 +msgid "Personalised, email support from our team of Security experts, as and when you need it." +msgstr "" + +#: templates/may-also-like.php:373 +msgid "Guaranteed response time" +msgstr "" + +#: templates/may-also-like.php:374 +msgid "We offer a guaranteed response time of three days." +msgstr "" + +#: templates/may-also-like.php:374 +msgid "99% of our Premium customers receive a response to their enquiry within 24 hours during the working week." +msgstr "" + +#: templates/may-also-like.php:397 +msgid "Our other plugins" +msgstr "" + +#: templates/may-also-like.php:411 +msgid "UpdraftPlus – the ultimate protection for your site, hard work and business" +msgstr "" + +#: templates/may-also-like.php:412 +msgid "Simplifies backups and restoration." +msgstr "" + +#: templates/may-also-like.php:412 +msgid "It is the world's highest ranking and most popular scheduled backup plugin, with over three million currently-active installs." +msgstr "" + +#: templates/may-also-like.php:413 +#: templates/may-also-like.php:419 +#: templates/may-also-like.php:425 +#: templates/may-also-like.php:431 +msgid "Try for free" +msgstr "" + +#: templates/may-also-like.php:417 +msgid "WP-Optimize – keep your database fast and efficient" +msgstr "" + +#: templates/may-also-like.php:418 +msgid "Makes your site fast and efficient." +msgstr "" + +#: templates/may-also-like.php:418 +msgid "It cleans the database, compresses images and caches pages for ultimate speed." +msgstr "" + +#: templates/may-also-like.php:423 +msgid "UpdraftCentral – save hours managing multiple WP sites from one place" +msgstr "" + +#: templates/may-also-like.php:424 +msgid "Highly efficient way to manage, optimize, update and backup multiple websites from one place." +msgstr "" + +#: templates/may-also-like.php:429 +msgid "Easy Updates Manager" +msgstr "" + +#: templates/may-also-like.php:430 +msgid "Keeps your WordPress site up to date and bug free." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:2 +msgid "IP address detection settings" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:6 +msgid "The IP address detection settings allow you to specify how visitors' IP addresses are made known to PHP (and hence to WordPress and its plugins)." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:7 +msgid "Usually, this is automatic and there is only one choice." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:8 +msgid "However in some setups, such as those using proxies (including load-balancers and security firewalls like Cloudflare), it may be necessary to set this manually." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:9 +msgid "Attention" +msgstr "Atenção!" + +#: templates/menus/settings/advanced-settings.php:9 +msgid "It is important to set this correctly - otherwise you may make it possible for a hacker to ban all your visitors (e.g. via banning Cloudflare from connecting to you) instead of being banned himself." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:9 +msgid "The default is to use the REMOTE_ADDR PHP server variable. If this variable does not contain the visitor's IP address, then whilst you can make a different selection below, it is better to ask your web hosting company to have it correctly set." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:10 +msgid "This is the most secure setup, because when set correctly it is immune from being spoofed by an attacker." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:16 +msgid "You have no available IP address detection method(s); you must contact your web hosting company." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:22 +#: templates/menus/settings/advanced-settings.php:27 +#: templates/menus/settings/advanced-settings.php:32 +msgid "Your detected IP address according to %s:" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:38 +msgid "If your site is setup on localhost, you won't see your external IP address using your server's IP detection setting; but on a localhost-served site (not available to the outside world), the setting is irrelevant and can be ignored." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:61 +msgid "Choose a $_SERVER variable you would like to detect visitors' IP address using." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:67 +msgid "If your chosen server variable fails the plugin will automatically fall back to retrieving the IP address from $_SERVER[\"REMOTE_ADDR\"]" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:73 +msgid "Your IP address if using this setting:" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:75 +msgid "fetching..." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:81 +#: templates/menus/settings/advanced-settings.php:190 +msgid "getting..." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:89 +msgid "look-up possibly blocked by an ad-blocker or similar tool" +msgstr "" + +#: templates/notices/cookie-based-brute-force-prevention-disabled.php:4 +msgid "Cookie based brute force login prevention currently disabled" +msgstr "" + +#: templates/notices/cookie-based-brute-force-prevention-disabled.php:6 +msgid "Cookie based brute force login prevention is currently disabled via the AIOS_DISABLE_COOKIE_BRUTE_FORCE_PREVENTION constant (which is mostly likely to be defined in your wp-config.php)" +msgstr "" + +#: templates/notices/disable-login-whitelist.php:4 +msgid "Login whitelisting currently disabled" +msgstr "" + +#: templates/notices/disable-login-whitelist.php:6 +msgid "Login whitelisting is currently disabled via the AIOS_DISABLE_LOGIN_WHITELIST constant (which is mostly likely to be defined in your wp-config.php)" +msgstr "" + +#: templates/notices/horizontal-notice.php:8 +#: templates/notices/horizontal-notice.php:40 +msgid "notice image" +msgstr "" + +#: templates/notices/horizontal-notice.php:18 +msgid "Ok, you deserve it" +msgstr "" + +#: templates/notices/horizontal-notice.php:22 +msgid "Maybe later" +msgstr "" + +#: templates/notices/horizontal-notice.php:26 +msgid "Never" +msgstr "" + +#: templates/notices/horizontal-notice.php:66 +msgid "Get UpdraftCentral" +msgstr "" + +#: templates/notices/horizontal-notice.php:68 +msgid "Get UpdraftPlus" +msgstr "" + +#: templates/notices/horizontal-notice.php:70 +msgid "Get WP-Optimize" +msgstr "" + +#: templates/notices/horizontal-notice.php:72 +msgid "Find out more." +msgstr "" + +#: templates/notices/horizontal-notice.php:74 +msgid "Sign up" +msgstr "" + +#: templates/notices/horizontal-notice.php:76 +msgid "Go there" +msgstr "" + +#: templates/notices/horizontal-notice.php:78 +msgid "Read more" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:4 +msgid "Dismiss (for %s months)" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:6 +msgid "Thank you for installing All In One WP Security & Firewall!" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:13 +msgid "Super-charge and secure your WordPress site even more with our other top plugins:" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:17 +msgid "%s makes your site fast and efficient. It cleans the database, compresses images and caches pages for ultimate speed." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:21 +msgid "%s simplifies backups and restoration. It is the world's highest ranking and most popular scheduled backup plugin, with over three million currently-active installs." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:25 +msgid "%s is a highly efficient way to manage, optimize, update and backup multiple websites from one place." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:29 +msgid "%s is a WordPress subscription extension for WooCommerce store owners." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:33 +msgid "More quality plugins" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:33 +msgid "Premium WooCommerce plugins" +msgstr "" + +#: templates/partials/non-apache-feature-notice.php:9 +msgid "This feature works only on the Apache server." +msgstr "" + +#: templates/partials/non-apache-feature-notice.php:10 +msgid "You are using the non-apache server %s, so this feature won't work on your site." +msgstr "" + +#: wp-security-core.php:236 +#: wp-security.php:45 +msgid "This plugin requires PHP version %s." +msgstr "" + +#: wp-security-core.php:237 +msgid "Current site PHP version is %s." +msgstr "" + +#: wp-security-core.php:238 +#: wp-security.php:47 +msgid "You will need to ask your web hosting company to upgrade." +msgstr "" + +#: wp-security-core.php:397 +msgid "Error:" +msgstr "" + +#: wp-security-core.php:397 +msgid "template not found" +msgstr "" + +#: wp-security.php:44 +msgid "All In One WP Security and Firewall plugin has been deactivated." +msgstr "" + +#: wp-security.php:46 +msgid "Your current PHP version is %s." +msgstr "" diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-sv_SE.mo b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-sv_SE.mo new file mode 100755 index 00000000..093a7b98 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-sv_SE.mo differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-sv_SE.po b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-sv_SE.po new file mode 100755 index 00000000..1d25c952 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-sv_SE.po @@ -0,0 +1,5992 @@ +msgid "" +msgstr "" +"Project-Id-Version: AIOWPS Swedish translation of public parts\n" +"POT-Creation-Date: 2014-09-19 10:46+1000\n" +"PO-Revision-Date: 2014-11-06 16:31+0100\n" +"Last-Translator: Tor-Bjorn Fjellner \n" +"Language-Team: Tor-Bjorn Fjellner 6 Nov 2014 \n" +"Language: sv_SE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.5.7\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-KeywordsList: __;_e\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#. Plugin Name of the plugin +msgid "All In One WP Security" +msgstr "" + +#. Plugin URI of the plugin +msgid "https://wordpress.org/plugins/all-in-one-wp-security-and-firewall/" +msgstr "" + +#. Description of the plugin +msgid "All round best WordPress security plugin!" +msgstr "" + +#. Author of the plugin +msgid "All In One WP Security & Firewall Team" +msgstr "" + +#. Author URI of the plugin +msgid "https://teamupdraft.com/" +msgstr "" + +#: admin/general/wp-security-list-table.php:483 +msgid "Are you sure you want to perform this bulk action?" +msgstr "" + +#: admin/wp-security-admin-init.php:259 +msgid "Unexpected response:" +msgstr "" + +#: admin/wp-security-admin-init.php:290 +msgid "Enjoyed %1$s? Please leave us a %2$s rating. We really appreciate your support!" +msgstr "" + +#: admin/wp-security-admin-init.php:414 +#: classes/wp-security-two-factor-login.php:95 +msgid "WP Security" +msgstr "" + +#: admin/wp-security-admin-init.php:415 +#: admin/wp-security-dashboard-menu.php:26 +#: admin/wp-security-dashboard-menu.php:76 +msgid "Dashboard" +msgstr "" + +#: admin/wp-security-admin-init.php:416 +#: admin/wp-security-settings-menu.php:95 +msgid "Settings" +msgstr "" + +#: admin/wp-security-admin-init.php:417 +msgid "User Accounts" +msgstr "" + +#: admin/wp-security-admin-init.php:418 +msgid "User Login" +msgstr "" + +#: admin/wp-security-admin-init.php:419 +msgid "User Registration" +msgstr "" + +#: admin/wp-security-admin-init.php:420 +msgid "Database Security" +msgstr "" + +#: admin/wp-security-admin-init.php:424 +msgid "Filesystem Security" +msgstr "" + +#: admin/wp-security-admin-init.php:429 +msgid "Blacklist Manager" +msgstr "" + +#: admin/wp-security-admin-init.php:434 +#: admin/wp-security-firewall-menu.php:60 +msgid "Firewall" +msgstr "" + +#: admin/wp-security-admin-init.php:436 +msgid "Brute Force" +msgstr "" + +#: admin/wp-security-admin-init.php:437 +msgid "Spam Prevention" +msgstr "" + +#: admin/wp-security-admin-init.php:441 +#: admin/wp-security-filescan-menu.php:53 +msgid "Scanner" +msgstr "" + +#: admin/wp-security-admin-init.php:443 +#: admin/wp-security-maintenance-menu.php:51 +msgid "Maintenance" +msgstr "" + +#: admin/wp-security-admin-init.php:444 +#: admin/wp-security-misc-options-menu.php:57 +msgid "Miscellaneous" +msgstr "" + +#: admin/wp-security-admin-init.php:445 +#: admin/wp-security-tools-menu.php:64 +msgid "Tools" +msgstr "" + +#: admin/wp-security-admin-init.php:457 +msgid "Premium Upgrade" +msgstr "" + +#: admin/wp-security-admin-menu.php:67 +msgid "Settings successfully updated." +msgstr "" + +#: admin/wp-security-admin-menu.php:77 +msgid "Successfully deleted the selected record(s)." +msgstr "" + +#: admin/wp-security-admin-menu.php:86 +msgid "Failed to delete the selected record(s)." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:25 +msgid "Ban users" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:51 +msgid "Blacklist manager" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:132 +#: admin/wp-security-firewall-menu.php:1233 +#: admin/wp-security-list-404.php:234 +#: admin/wp-security-list-comment-spammer-ip.php:205 +msgid "The plugin was unable to write to the .htaccess file. Please edit file manually." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:139 +msgid "Ban IPs or user agents" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:142 +msgid "The All In One WP Security Blacklist feature gives you the option of banning certain host IP addresses or ranges and also user agents." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:143 +msgid "This feature will deny total site access for users which have IP addresses or user agents matching those which you have configured in the settings below." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:144 +msgid "The plugin achieves this by making appropriate modifications to your .htaccess file." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:145 +msgid "By blocking people, you are using the most secure first line of defence, which denies all access to blacklisted visitors as soon as they hit your hosting server." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:154 +#: admin/wp-security-firewall-menu.php:1055 +#: templates/may-also-like.php:20 +msgid "All In One WP Security & Firewall Premium" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:155 +#: admin/wp-security-firewall-menu.php:1056 +msgid "You may also be interested in %s." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "This plugin adds a number of extra features including %s and %s." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "smart 404 blocking" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "country IP blocking" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:170 +msgid "IP hosts and user agent blacklist settings" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:182 +#: admin/wp-security-brute-force-menu.php:193 +#: admin/wp-security-brute-force-menu.php:331 +msgid "must read this message" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:183 +#: admin/wp-security-brute-force-menu.php:194 +msgid "This feature can lock you out of admin if it doesn't work correctly on your site. You %s before activating this feature." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:189 +msgid "Enable IP or user agent blacklisting" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:192 +msgid "Check this if you want to enable the banning (or blacklisting) of selected IP addresses and/or user agents specified in the settings below" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:196 +msgid "Enter IP addresses:" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:200 +msgid "Enter one or more IP addresses or IP ranges." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:205 +msgid "Enter user agents:" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:210 +msgid "Enter one or more user agent strings." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:211 +#: admin/wp-security-brute-force-menu.php:374 +#: admin/wp-security-brute-force-menu.php:408 +#: admin/wp-security-brute-force-menu.php:431 +#: admin/wp-security-brute-force-menu.php:452 +#: admin/wp-security-filescan-menu.php:309 +#: admin/wp-security-filescan-menu.php:326 +#: admin/wp-security-firewall-menu.php:175 +#: admin/wp-security-firewall-menu.php:212 +#: admin/wp-security-firewall-menu.php:232 +#: admin/wp-security-firewall-menu.php:258 +#: admin/wp-security-firewall-menu.php:385 +#: admin/wp-security-firewall-menu.php:415 +#: admin/wp-security-firewall-menu.php:446 +#: admin/wp-security-firewall-menu.php:474 +#: admin/wp-security-firewall-menu.php:503 +#: admin/wp-security-firewall-menu.php:681 +#: admin/wp-security-firewall-menu.php:699 +#: admin/wp-security-firewall-menu.php:737 +#: admin/wp-security-firewall-menu.php:868 +#: admin/wp-security-firewall-menu.php:1087 +#: admin/wp-security-firewall-menu.php:1110 +#: admin/wp-security-spam-menu.php:186 +#: admin/wp-security-spam-menu.php:221 +#: admin/wp-security-spam-menu.php:390 +#: admin/wp-security-spam-menu.php:430 +#: admin/wp-security-user-login-menu.php:362 +#: templates/info/ip-address-ip-range-info.php:2 +#: templates/menus/settings/advanced-settings.php:63 +msgid "More info" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:214 +msgid "Each user agent string must be on a new line." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:215 +msgid "Example 1 - A single user agent string to block:" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:217 +msgid "Example 2 - A list of more than 1 user agent strings to block" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:225 +#: admin/wp-security-brute-force-menu.php:213 +#: admin/wp-security-brute-force-menu.php:686 +#: admin/wp-security-brute-force-menu.php:806 +#: admin/wp-security-brute-force-menu.php:868 +#: admin/wp-security-filescan-menu.php:351 +#: admin/wp-security-filesystem-menu.php:242 +#: admin/wp-security-firewall-menu.php:945 +#: admin/wp-security-firewall-menu.php:1129 +#: admin/wp-security-misc-options-menu.php:167 +#: admin/wp-security-misc-options-menu.php:218 +#: admin/wp-security-misc-options-menu.php:278 +#: admin/wp-security-settings-menu.php:619 +#: admin/wp-security-settings-menu.php:680 +#: admin/wp-security-spam-menu.php:233 +#: admin/wp-security-spam-menu.php:407 +#: admin/wp-security-spam-menu.php:526 +#: admin/wp-security-spam-menu.php:588 +#: admin/wp-security-user-login-menu.php:384 +#: admin/wp-security-user-login-menu.php:422 +#: admin/wp-security-user-login-menu.php:601 +#: admin/wp-security-user-login-menu.php:788 +#: admin/wp-security-user-registration-menu.php:150 +#: admin/wp-security-user-registration-menu.php:242 +#: admin/wp-security-user-registration-menu.php:305 +#: templates/menus/settings/advanced-settings.php:217 +msgid "Save settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:33 +#: admin/wp-security-brute-force-menu.php:759 +#: admin/wp-security-dashboard-menu.php:651 +msgid "Rename login page" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:34 +#: admin/wp-security-brute-force-menu.php:154 +msgid "Cookie based brute force prevention" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:35 +#: classes/grade-system/wp-security-feature-item-manager.php:105 +msgid "Login CAPTCHA" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:36 +#: admin/wp-security-brute-force-menu.php:746 +msgid "Login whitelist" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:37 +msgid "Honeypot" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:67 +msgid "Brute force" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:105 +msgid "Please enter a value for your login page slug." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:109 +msgid "You cannot use the value \"wp-admin\" for your login page slug." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:111 +msgid "You must use alpha numeric characters for your login page slug." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:116 +#: admin/wp-security-filescan-menu.php:174 +#: admin/wp-security-firewall-menu.php:151 +#: admin/wp-security-firewall-menu.php:1011 +#: admin/wp-security-spam-menu.php:101 +#: admin/wp-security-spam-menu.php:270 +#: admin/wp-security-spam-menu.php:302 +#: admin/wp-security-user-login-menu.php:184 +#: admin/wp-security-user-login-menu.php:553 +#: templates/partials/non-apache-feature-notice.php:9 +msgid "Attention:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:133 +msgid "Could not delete the Cookie-based directives from the .htaccess file. Please check the file permissions." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:155 +msgid "Login page white list" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:156 +msgid "An effective Brute Force prevention technique is to change the default WordPress login page URL." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:157 +msgid "Normally if you wanted to login to WordPress you would type your site's home URL followed by wp-login.php." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:158 +msgid "This feature allows you to change the login URL by setting your own slug and renaming the last portion of the login URL which contains the wp-login.php to any string that you like." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:159 +msgid "By doing this, malicious bots and hackers will not be able to access your login page because they will not know the correct login page URL." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:161 +msgid "You may also be interested in the following alternative brute force prevention features:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:172 +msgid "Your WordPress login page URL has been renamed." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:173 +msgid "Your current login URL is:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:181 +msgid "Rename login page settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:195 +msgid "NOTE: If you are hosting your site on WPEngine or a provider which performs server caching, you will need to ask the host support people to NOT cache your renamed login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:200 +msgid "Enable rename login page feature" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:203 +msgid "Check this if you want to enable the rename login page feature" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:207 +msgid "Login page URL" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:209 +msgid "Enter a string which will represent your secure login page slug. You are encouraged to choose something which is hard to guess and only you will remember." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:243 +msgid "Settings have not been saved - your secret word must consist only of alphanumeric characters, ie, letters and/or numbers only." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:257 +msgid "You have successfully enabled the cookie based brute force prevention feature" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:258 +msgid "From now on you will need to log into your WP Admin using the following URL:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:260 +msgid "It is important that you save this URL value somewhere in case you forget it, OR," +msgstr "" + +#: admin/wp-security-brute-force-menu.php:261 +msgid "simply remember to add a \"?%s=1\" to your current site URL address." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:265 +msgid "You have successfully saved cookie based brute force prevention feature settings." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:295 +msgid "Brute force prevention firewall settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:300 +msgid "A Brute Force Attack is when a hacker tries many combinations of usernames and passwords until they succeed in guessing the right combination." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:301 +msgid "Due to the fact that at any one time there may be many concurrent login attempts occurring on your site via malicious automated robots, this also has a negative impact on your server's memory and performance." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:302 +msgid "The features in this tab will stop the majority of brute force login attacks thus providing even better protection for your WP login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:307 +#: admin/wp-security-firewall-menu.php:654 +msgid "backup" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:308 +msgid "video tutorial" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:309 +msgid "To learn more about how to use this feature, please watch the following %s." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:310 +#: admin/wp-security-brute-force-menu.php:758 +msgid "Cookie-Based Brute Force Login Prevention" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:320 +#: admin/wp-security-user-login-menu.php:253 +msgid "Cookie based brute force login prevention" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:331 +msgid "This feature can lock you out of admin if it doesn't work correctly on your site. You " +msgstr "" + +#: admin/wp-security-brute-force-menu.php:342 +msgid "The cookie test was successful. You can now enable this feature." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:350 +msgid "The cookie test failed on this server. Consequently, this feature cannot be used on this site." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:357 +msgid "Before using this feature, you must perform a cookie test first." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:359 +msgid "This ensures that your browser cookie is working correctly and that you won't lock yourself out." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:364 +msgid "Perform cookie test" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:370 +#: classes/grade-system/wp-security-feature-item-manager.php:103 +msgid "Enable brute force attack prevention" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:373 +msgid "Check this if you want to protect your login page from Brute Force Attack." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:378 +msgid "This feature will deny access to your WordPress login page for all people except those who have a special cookie in their browser." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:380 +msgid "To use this feature do the following:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:382 +msgid "1) Enable the checkbox." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:384 +msgid "2) Enter a secret word consisting of alphanumeric characters which will be difficult to guess. This secret word will be useful whenever you need to know the special URL which you will use to access the login page (see point below)." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:386 +msgid "3) You will then be provided with a special login URL. You will need to use this URL to login to your WordPress site instead of the usual login URL. NOTE: The system will deposit a special cookie in your browser which will allow you access to the WordPress administration login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:388 +msgid "Any person trying to access your login page who does not have the special cookie in their browser will be automatically blocked." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:395 +msgid "Secret word" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:397 +msgid "Choose a secret word consisting of alphanumeric characters which you can use to access your special URL. Your are highly encouraged to choose a word which will be difficult to guess." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:401 +msgid "Re-direct URL" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:405 +msgid "Specify a URL to redirect a hacker to when they try to access your WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:412 +msgid "The URL specified here can be any site's URL and does not have to be your own. For example you can be as creative as you like and send hackers to the CIA or NSA home page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:414 +msgid "This field will default to: http://127.0.0.1 if you do not enter a value." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:416 +msgid "Useful Tip:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:418 +msgid "It's a good idea to not redirect attempted brute force login attempts to your site because it increases the load on your server." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:420 +msgid "Redirecting a hacker or malicious bot back to \"http://127.0.0.1\" is ideal because it deflects them back to their own local host and puts the load on their server instead of yours." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:427 +msgid "My site has posts or pages which are password protected" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:430 +msgid "Check this if you are using the native WordPress password protection feature for some or all of your blog posts or pages." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:435 +msgid "In the cases where you are protecting some of your posts or pages using the in-built WordPress password protection feature, a few extra lines of directives and exceptions need to be added so that people trying to access pages are not automatically blocked." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:437 +msgid "By enabling this checkbox, the plugin will add the necessary rules and exceptions so that people trying to access these pages are not automatically blocked." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:439 +msgid "Helpful Tip:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:441 +msgid "If you do not use the WordPress password protection feature for your posts or pages then it is highly recommended that you leave this checkbox disabled." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:448 +msgid "My site has a theme or plugins which use AJAX" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:451 +msgid "Check this if your site uses AJAX functionality." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:456 +msgid "In the cases where your WordPress installation has a theme or plugin that uses AJAX, a few extra lines of directives and exceptions need to be added to prevent AJAX requests from being automatically blocked by the brute force prevention feature." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:458 +msgid "By enabling this checkbox, the plugin will add the necessary rules and exceptions so that AJAX operations will work as expected." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:467 +msgid "Save feature settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:525 +msgid "This feature allows you to add a CAPTCHA form on various WordPress login pages and forms." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:526 +msgid "Adding a CAPTCHA form on a login page or form is another effective yet simple \"Brute Force\" prevention technique." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:527 +msgid "You have the option of using either %s or a plain maths CAPTCHA form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:528 +msgid "If you enable Google reCAPTCHA the reCAPTCHA widget will be displayed for all forms the CAPTCHA settings below." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:529 +msgid "If Google reCAPTCHA is disabled the simple maths CAPTCHA form will apply and users will need to enter the answer to a simple mathematical question." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:535 +msgid "Google reCAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:540 +msgid "By enabling these settings the Google reCAPTCHA v2 widget will be applied by default for all forms with CAPTCHA enabled." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:549 +msgid "reCAPTCHA will not work because you have disabled login lockout by activating the AIOS_DISABLE_LOGIN_LOCKOUT constant value in a configuration file." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:550 +msgid "To enable it, define AIOS_DISABLE_LOGIN_LOCKOUT constant value as false, or remove it." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:558 +msgid "Use Google reCAPTCHA as default" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:561 +msgid "Check this if you want to default to Google reCAPTCHA for all settings below. (If this is left unchecked, all CAPTCHA forms will revert to the plain maths CAPTCHA)" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:565 +msgid "Site key" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:571 +msgid "Secret key" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:580 +msgid "Login form CAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:589 +msgid "Enable CAPTCHA on login page" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:592 +msgid "Check this if you want to insert a CAPTCHA form on the login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:598 +msgid "Lost password form CAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:608 +msgid "Enable CAPTCHA on lost password page" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:611 +msgid "Check this if you want to insert a CAPTCHA form on the lost password page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:617 +msgid "Custom login form CAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:626 +msgid "Enable CAPTCHA on custom login form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:629 +msgid "Check this if you want to insert CAPTCHA on a custom login form generated by the following WP function: wp_login_form()" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:639 +msgid "WooCommerce forms CAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:648 +msgid "Enable CAPTCHA on WooCommerce login form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:651 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce login form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:661 +msgid "Enable CAPTCHA on WooCommerce lost password form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:664 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce lost password form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:674 +msgid "Enable CAPTCHA on WooCommerce registration form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:677 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce registration form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:749 +msgid "The All In One WP Security Whitelist feature gives you the option of only allowing certain IP addresses or ranges to have access to your WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:750 +msgid "This feature will deny login access for all IP addresses which are not in your whitelist as configured in the settings below." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:751 +msgid "The plugin achieves this by writing the appropriate directives to your .htaccess file." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:752 +msgid "By allowing/blocking IP addresses, you are using the most secure first line of defence because login access will only be granted to whitelisted IP addresses and other addresses will be blocked as soon as they try to access your login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:760 +msgid "Attention: If in addition to enabling the white list feature, you also have one of the %s or %s features enabled, you will still need to use your secret word or special slug in the URL when trying to access your WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:761 +msgid "These features are NOT functionally related. Having both of them enabled on your site means you are creating 2 layers of security." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:772 +msgid "Login IP whitelist settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:783 +msgid "Enable IP whitelisting" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:786 +#: admin/wp-security-user-login-menu.php:408 +msgid "Check this if you want to enable the whitelisting of selected IP addresses specified in the settings below" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:790 +msgid "Your current IP address" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:793 +msgid "You can copy and paste this address in the text box below if you want to include it in your login whitelist." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:797 +#: admin/wp-security-user-login-menu.php:412 +msgid "Enter whitelisted IP addresses:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:801 +#: admin/wp-security-user-login-menu.php:416 +msgid "Enter one or more IP addresses or IP ranges you wish to include in your whitelist." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:801 +msgid "Only the addresses specified here will have access to the WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:839 +msgid "This feature allows you to add a special hidden \"honeypot\" field on the WordPress login page. This will only be visible to robots and not humans." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:840 +msgid "Since robots usually fill in every input field from a login form, they will also submit a value for the special hidden honeypot field." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:841 +#: admin/wp-security-user-registration-menu.php:278 +msgid "The way honeypots work is that a hidden field is placed somewhere inside a form which only robots will submit. If that field contains a value when the form is submitted then a robot has most likely submitted the form and it is consequently dealt with." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:842 +msgid "Therefore, if the plugin detects that this field has a value when the login form is submitted, then the robot which is attempting to login to your site will be redirected to its localhost address - http://127.0.0.1." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:848 +msgid "Login form honeypot settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:859 +msgid "Enable honeypot on login page" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:862 +msgid "Check this if you want to enable the honeypot feature for the login page" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:27 +#: admin/wp-security-dashboard-menu.php:374 +#: classes/wp-security-user-login.php:74 +msgid "Locked IP addresses" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:28 +msgid "Permanent block list" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:29 +msgid "Logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:33 +msgid "Premium upgrade" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:131 +#: admin/wp-security-dashboard-menu.php:518 +#: admin/wp-security-user-login-menu.php:53 +#: classes/grade-system/wp-security-feature-item-manager.php:49 +msgid "Login lockout" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:132 +msgid "This tab displays the list of all IP addresses which are currently temporarily locked out due to the login lockout feature:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:138 +msgid "Currently locked out IP addresses and ranges" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:183 +msgid "This tab displays the list of all permanently blocked IP addresses." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:184 +#: admin/wp-security-spam-menu.php:339 +msgid "NOTE: This feature does NOT use the .htaccess file to permanently block the IP addresses so it should be compatible with all web servers running WordPress." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:189 +msgid "Permanently blocked IP addresses" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:200 +#: admin/wp-security-firewall-menu.php:1151 +#: admin/wp-security-user-login-menu.php:485 +#: admin/wp-security-user-login-menu.php:643 +#: admin/wp-security-user-registration-menu.php:164 +msgid "Search" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:238 +#: admin/wp-security-dashboard-menu.php:249 +#: admin/wp-security-dashboard-menu.php:260 +msgid "All In One WP Security & Firewall" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:250 +msgid "Debug logs have been cleared." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:261 +msgid "Unable to clear the logs; an invalid nonce was provided" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:274 +msgid "Debug log options" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:281 +msgid "Clear logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:289 +msgid "Debug logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:362 +msgid "Security strength meter" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:363 +msgid "Security points breakdown" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:364 +msgid "Spread the word" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:365 +msgid "Get to know the developers" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:366 +msgid "Critical feature status" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:367 +msgid "Last 5 logins" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:368 +msgid "Maintenance mode status" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:373 +#: admin/wp-security-dashboard-menu.php:664 +#: admin/wp-security-user-login-menu.php:57 +msgid "Logged in users" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:417 +msgid "Total Achievable Points: " +msgstr "" + +#: admin/wp-security-dashboard-menu.php:419 +msgid "Current Score of Your Site: " +msgstr "" + +#: admin/wp-security-dashboard-menu.php:472 +msgid "We are working hard to make your WordPress site more secure. Please support us, here is how:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:473 +msgid "Follow us on" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:477 +msgid "Post to Twitter" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:481 +msgid "Give us a good rating" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:488 +msgid "Wanna know more about the developers behind this plugin?" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:499 +msgid "Below is the current status of the critical features that you should activate on your site to achieve a minimum level of recommended security" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:503 +msgid "Admin username" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:533 +msgid "File permission" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:548 +msgid "Basic firewall" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:577 +msgid "No data found." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:581 +msgid "Last 5 logins summary:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:585 +msgid "User" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:586 +#: admin/wp-security-list-404.php:95 +#: admin/wp-security-list-login-fails.php:56 +#: admin/wp-security-list-permanent-blocked-ip.php:68 +msgid "Date" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:587 +msgid "IP" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:608 +msgid "Maintenance mode is currently enabled. Remember to turn it off when you are done" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:610 +msgid "Maintenance mode is currently off." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:614 +msgid "Maintenance mode" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:632 +msgid "Cookie based brute force" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:636 +#: admin/wp-security-dashboard-menu.php:654 +msgid "The %s feature is currently active." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:637 +#: admin/wp-security-dashboard-menu.php:655 +msgid "Your new WordPress login URL is now:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:666 +msgid "Number of users currently logged into your site (including you) is:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:667 +msgid "There are no other users currently logged in." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:680 +msgid "Number of users currently logged in site-wide (including you) is:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:681 +msgid "There are no other site-wide users currently logged in." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:694 +#: admin/wp-security-dashboard-menu.php:711 +msgid "Go to the %s menu to see more details" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:707 +msgid "There are no IP addresses currently locked out." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:710 +msgid "Number of temporarily locked out IP addresses: " +msgstr "" + +#: admin/wp-security-database-menu.php:52 +msgid "UpdraftPlus is installed but currently not active." +msgstr "" + +#: admin/wp-security-database-menu.php:52 +msgid "Follow this link to activate UpdraftPlus, to take a backup." +msgstr "" + +#: admin/wp-security-database-menu.php:57 +msgid "Follow this link to install UpdraftPlus, to take a database backup." +msgstr "" + +#: admin/wp-security-database-menu.php:87 +#: admin/wp-security-database-menu.php:92 +msgid "Database backup" +msgstr "" + +#: admin/wp-security-database-menu.php:91 +#: classes/grade-system/wp-security-feature-item-manager.php:65 +msgid "Database prefix" +msgstr "" + +#: admin/wp-security-database-menu.php:119 +msgid "Database security" +msgstr "" + +#: admin/wp-security-database-menu.php:147 +msgid "Nonce check failed for DB prefix change operation!" +msgstr "" + +#: admin/wp-security-database-menu.php:155 +msgid "The plugin has detected that it cannot write to the wp-config.php file. This feature can only be used if the plugin can successfully write to the wp-config.php file." +msgstr "" + +#: admin/wp-security-database-menu.php:168 +msgid "Please enter a value for the DB prefix." +msgstr "" + +#: admin/wp-security-database-menu.php:177 +msgid "ERROR: The table prefix can only contain numbers, letters, and underscores." +msgstr "" + +#: admin/wp-security-database-menu.php:186 +#: admin/wp-security-database-menu.php:245 +msgid "Change database prefix" +msgstr "" + +#: admin/wp-security-database-menu.php:189 +msgid "Your WordPress database is the most important asset of your website because it contains a lot of your site's precious information." +msgstr "" + +#: admin/wp-security-database-menu.php:190 +msgid "The database is also a target for hackers via methods such as SQL injections and malicious and automated code which targets certain tables." +msgstr "" + +#: admin/wp-security-database-menu.php:191 +msgid "One way to add a layer of protection for your DB is to change the default WordPress table prefix from \"wp_\" to something else which will be difficult for hackers to guess." +msgstr "" + +#: admin/wp-security-database-menu.php:192 +msgid "This feature allows you to easily change the prefix to a value of your choice or to a random value set by this plugin." +msgstr "" + +#: admin/wp-security-database-menu.php:198 +msgid "Database prefix options" +msgstr "" + +#: admin/wp-security-database-menu.php:210 +msgid "database backup" +msgstr "" + +#: admin/wp-security-database-menu.php:211 +msgid "It is recommended that you perform a %s before using this feature" +msgstr "" + +#: admin/wp-security-database-menu.php:221 +msgid "Current database table prefix" +msgstr "" + +#: admin/wp-security-database-menu.php:227 +msgid "Your site is currently using the default WordPress database prefix value of \"wp_\"." +msgstr "" + +#: admin/wp-security-database-menu.php:227 +msgid "To increase your site's security you should consider changing the database prefix value to another value." +msgstr "" + +#: admin/wp-security-database-menu.php:234 +msgid "Generate new database table prefix" +msgstr "" + +#: admin/wp-security-database-menu.php:238 +msgid "Check this if you want the plugin to generate a random 6 character string for the table prefix" +msgstr "" + +#: admin/wp-security-database-menu.php:239 +msgid "OR" +msgstr "" + +#: admin/wp-security-database-menu.php:241 +msgid "Choose your own database prefix by specifying a string which contains letters and/or numbers and/or underscores. Example: xyz_" +msgstr "" + +#: admin/wp-security-database-menu.php:265 +msgid "Take a database backup using UpdraftPlus" +msgstr "" + +#: admin/wp-security-database-menu.php:270 +msgid "Manual backup" +msgstr "" + +#: admin/wp-security-database-menu.php:274 +msgid "UpdraftPlus Backup/Restore" +msgstr "" + +#: admin/wp-security-database-menu.php:274 +msgid "Your backups are on the UpdraftPlus Backup/Restore admin page." +msgstr "" + +#: admin/wp-security-database-menu.php:276 +msgid "Create database backup now" +msgstr "" + +#: admin/wp-security-database-menu.php:308 +msgid "Error - Could not get tables or no tables found!" +msgstr "" + +#: admin/wp-security-database-menu.php:312 +msgid "Starting DB prefix change operations....." +msgstr "" + +#: admin/wp-security-database-menu.php:314 +msgid "Your WordPress system has a total of %s tables and your new DB prefix will be: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:320 +#: classes/wp-security-utility.php:306 +msgid "Failed to make a backup of the wp-config.php file. This operation will not go ahead." +msgstr "" + +#: admin/wp-security-database-menu.php:324 +msgid "A backup copy of your wp-config.php file was created successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:351 +msgid "%s table name update failed" +msgstr "" + +#: admin/wp-security-database-menu.php:363 +msgid "Please change the prefix manually for the above tables to: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:366 +msgid "%s tables had their prefix updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:387 +msgid "wp-config.php file was updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:390 +msgid "The \"wp-config.php\" file was not able to be modified." +msgstr "" + +#: admin/wp-security-database-menu.php:390 +msgid "Please modify this file manually using your favourite editor and search for variable \"$table_prefix\" and assign the following value to that variable: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:401 +#: admin/wp-security-database-menu.php:420 +msgid "Update of table %s failed: unable to change %s to %s" +msgstr "" + +#: admin/wp-security-database-menu.php:405 +msgid "The options table records which had references to the old DB prefix were updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:424 +msgid "The %s table records which had references to the old DB prefix were updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:452 +msgid "Error updating user_meta table where new meta_key = %s, old meta_key = %s and user_id = %s." +msgstr "" + +#: admin/wp-security-database-menu.php:457 +msgid "The usermeta table records which had references to the old DB prefix were updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:459 +msgid "The database prefix change tasks have been completed." +msgstr "" + +#: admin/wp-security-database-menu.php:503 +msgid "Checking for MySQL tables of type \"view\"....." +msgstr "" + +#: admin/wp-security-database-menu.php:520 +msgid "Update of the following MySQL view definition failed: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:527 +msgid "%s view definitions were updated successfully!" +msgstr "" + +#: admin/wp-security-filescan-menu.php:26 +#: classes/grade-system/wp-security-feature-item-manager.php:127 +msgid "File change detection" +msgstr "" + +#: admin/wp-security-filescan-menu.php:27 +msgid "Malware scan" +msgstr "" + +#: admin/wp-security-filescan-menu.php:88 +msgid "There have been no file changes since the last scan." +msgstr "" + +#: admin/wp-security-filescan-menu.php:98 +msgid "Nonce check failed for manual file change detection scan operation!" +msgstr "" + +#: admin/wp-security-filescan-menu.php:104 +msgid "There was an error during the file change detection scan. Please check the AIOS logs." +msgstr "" + +#: admin/wp-security-filescan-menu.php:110 +msgid "The plugin has detected that this is your first file change detection scan. The file details from this scan will be used to detect file changes for future scans." +msgstr "" + +#: admin/wp-security-filescan-menu.php:112 +msgid "Scan complete - There were no file changes detected!" +msgstr "" + +#: admin/wp-security-filescan-menu.php:133 +msgid "You entered a non numeric value for the \"backup time interval\" field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-filescan-menu.php:167 +msgid "The following address was removed because it is not a valid email address: " +msgstr "" + +#: admin/wp-security-filescan-menu.php:206 +msgid "NEW SCAN COMPLETED: The plugin has detected that you have made changes to the \"File Types To Ignore\" or \"Files To Ignore\" fields." +msgstr "" + +#: admin/wp-security-filescan-menu.php:206 +msgid "In order to ensure that future scan results are accurate, the old scan data has been refreshed." +msgstr "" + +#: admin/wp-security-filescan-menu.php:215 +msgid "All In One WP Security & Firewall has detected that there was a change in your host's files." +msgstr "" + +#: admin/wp-security-filescan-menu.php:217 +msgid "View scan details and clear this message" +msgstr "" + +#: admin/wp-security-filescan-menu.php:226 +msgid "If given an opportunity hackers can insert their code or files into your system which they can then use to carry out malicious acts on your site." +msgstr "" + +#: admin/wp-security-filescan-menu.php:227 +msgid "Being informed of any changes in your files can be a good way to quickly prevent a hacker from causing damage to your website." +msgstr "" + +#: admin/wp-security-filescan-menu.php:228 +msgid "In general, WordPress core and plugin files and file types such as \".php\" or \".js\" should not change often and when they do, it is important that you are made aware when a change occurs and which file was affected." +msgstr "" + +#: admin/wp-security-filescan-menu.php:229 +msgid "The \"File Change Detection Feature\" will notify you of any file change which occurs on your system, including the addition and deletion of files by performing a regular automated or manual scan of your system's files." +msgstr "" + +#: admin/wp-security-filescan-menu.php:230 +msgid "This feature also allows you to exclude certain files or folders from the scan in cases where you know that they change often as part of their normal operation. (For example log files and certain caching plugin files may change often and hence you may choose to exclude such files from the file change detection scan)" +msgstr "" + +#: admin/wp-security-filescan-menu.php:241 +msgid "It appears that your server is using an old PHP version which is missing the %s. The file scanner feature needs this class in order to work. If you would like to use this feature please upgrade your server PHP version to 5.3 or greater." +msgstr "" + +#: admin/wp-security-filescan-menu.php:249 +msgid "Manual file change detection scan" +msgstr "" + +#: admin/wp-security-filescan-menu.php:255 +msgid "To perform a manual file change detection scan click on the button below." +msgstr "" + +#: admin/wp-security-filescan-menu.php:258 +msgid "Perform scan now" +msgstr "" + +#: admin/wp-security-filescan-menu.php:262 +msgid "View last saved file change results" +msgstr "" + +#: admin/wp-security-filescan-menu.php:268 +msgid "Click the button below to view the saved file change results from the last scan." +msgstr "" + +#: admin/wp-security-filescan-menu.php:271 +msgid "View last file change" +msgstr "" + +#: admin/wp-security-filescan-menu.php:275 +msgid "File change detection settings" +msgstr "" + +#: admin/wp-security-filescan-menu.php:287 +msgid "Enable automated file change detection scan" +msgstr "" + +#: admin/wp-security-filescan-menu.php:290 +msgid "Check this if you want the system to automatically/periodically scan your files to check for file changes based on the settings below" +msgstr "" + +#: admin/wp-security-filescan-menu.php:294 +msgid "Scan time interval" +msgstr "" + +#: admin/wp-security-filescan-menu.php:297 +msgid "Hours" +msgstr "" + +#: admin/wp-security-filescan-menu.php:298 +msgid "Days" +msgstr "" + +#: admin/wp-security-filescan-menu.php:299 +msgid "Weeks" +msgstr "" + +#: admin/wp-security-filescan-menu.php:301 +msgid "Set the value for how often you would like a scan to occur" +msgstr "" + +#: admin/wp-security-filescan-menu.php:305 +msgid "File types to ignore" +msgstr "" + +#: admin/wp-security-filescan-menu.php:308 +msgid "Enter each file type or extension on a new line which you wish to exclude from the file change detection scan." +msgstr "" + +#: admin/wp-security-filescan-menu.php:312 +msgid "You can exclude file types from the scan which would not normally pose any security threat if they were changed. These can include things such as image files." +msgstr "" + +#: admin/wp-security-filescan-menu.php:313 +msgid "Example: If you want the scanner to ignore files of type jpg, png, and bmp, then you would enter the following:" +msgstr "" + +#: admin/wp-security-filescan-menu.php:314 +msgid "jpg" +msgstr "" + +#: admin/wp-security-filescan-menu.php:315 +msgid "png" +msgstr "" + +#: admin/wp-security-filescan-menu.php:316 +msgid "bmp" +msgstr "" + +#: admin/wp-security-filescan-menu.php:322 +msgid "Files/Directories to ignore" +msgstr "" + +#: admin/wp-security-filescan-menu.php:325 +msgid "Enter each file or directory on a new line which you wish to exclude from the file change detection scan." +msgstr "" + +#: admin/wp-security-filescan-menu.php:329 +msgid "You can exclude specific files/directories from the scan which would not normally pose any security threat if they were changed. These can include things such as log files." +msgstr "" + +#: admin/wp-security-filescan-menu.php:330 +msgid "Example: If you want the scanner to ignore certain files in different directories or whole directories, then you would enter the following:" +msgstr "" + +#: admin/wp-security-filescan-menu.php:331 +msgid "cache/config/master.php" +msgstr "" + +#: admin/wp-security-filescan-menu.php:332 +msgid "somedirectory" +msgstr "" + +#: admin/wp-security-filescan-menu.php:339 +msgid "Send email when change detected" +msgstr "" + +#: admin/wp-security-filescan-menu.php:343 +msgid "Check this if you want the system to email you if a file change was detected" +msgstr "" + +#: admin/wp-security-filescan-menu.php:347 +msgid "Enter one or more email addresses on a new line." +msgstr "" + +#: admin/wp-security-filescan-menu.php:364 +msgid "What is malware?" +msgstr "" + +#: admin/wp-security-filescan-menu.php:365 +msgid "The word malware stands for Malicious Software. It can consist of things like trojan horses, adware, worms, spyware and any other undesirable code which a hacker will try to inject into your website." +msgstr "" + +#: admin/wp-security-filescan-menu.php:366 +msgid "Often when malware code has been inserted into your site you will normally not notice anything out of the ordinary based on appearances, but it can have a dramatic effect on your site's search ranking." +msgstr "" + +#: admin/wp-security-filescan-menu.php:367 +msgid "This is because the bots and spiders from search engines such as Google have the capability to detect malware when they are indexing the pages on your site, and consequently they can blacklist your website which will in turn affect your search rankings." +msgstr "" + +#: admin/wp-security-filescan-menu.php:369 +msgid "CLICK HERE" +msgstr "" + +#: admin/wp-security-filescan-menu.php:371 +msgid "Scanning for malware" +msgstr "" + +#: admin/wp-security-filescan-menu.php:372 +msgid "Due to the constantly changing and complex nature of Malware, scanning for such things using a standalone plugin will not work reliably. This is something best done via an external scan of your site regularly." +msgstr "" + +#: admin/wp-security-filescan-menu.php:373 +msgid "This is why we have created an easy-to-use scanning service which is hosted off our own server which will scan your site for malware once every day and notify you if it finds anything." +msgstr "" + +#: admin/wp-security-filescan-menu.php:374 +msgid "When you sign up for this service you will get the following:" +msgstr "" + +#: admin/wp-security-filescan-menu.php:376 +msgid "Automatic daily scan of 1 website" +msgstr "" + +#: admin/wp-security-filescan-menu.php:377 +msgid "Automatic malware and blacklist monitoring" +msgstr "" + +#: admin/wp-security-filescan-menu.php:378 +msgid "Automatic email alerting" +msgstr "" + +#: admin/wp-security-filescan-menu.php:379 +msgid "Site uptime monitoring" +msgstr "" + +#: admin/wp-security-filescan-menu.php:380 +msgid "Site response time monitoring" +msgstr "" + +#: admin/wp-security-filescan-menu.php:381 +msgid "We provide advice for malware cleanup" +msgstr "" + +#: admin/wp-security-filescan-menu.php:382 +msgid "Blacklist removal" +msgstr "" + +#: admin/wp-security-filescan-menu.php:383 +msgid "No contract (cancel anytime)" +msgstr "" + +#: admin/wp-security-filescan-menu.php:385 +msgid "To learn more please %s." +msgstr "" + +#: admin/wp-security-filescan-menu.php:406 +msgid "Latest file change scan results" +msgstr "" + +#: admin/wp-security-filescan-menu.php:416 +msgid "The following files were added to your host." +msgstr "" + +#: admin/wp-security-filescan-menu.php:419 +#: admin/wp-security-filescan-menu.php:440 +#: admin/wp-security-filescan-menu.php:464 +msgid "File" +msgstr "" + +#: admin/wp-security-filescan-menu.php:420 +#: admin/wp-security-filescan-menu.php:441 +#: admin/wp-security-filescan-menu.php:465 +msgid "File size" +msgstr "" + +#: admin/wp-security-filescan-menu.php:421 +#: admin/wp-security-filescan-menu.php:442 +#: admin/wp-security-filescan-menu.php:466 +msgid "File modified" +msgstr "" + +#: admin/wp-security-filescan-menu.php:437 +msgid "The following files were removed from your host." +msgstr "" + +#: admin/wp-security-filescan-menu.php:461 +msgid "The following files were changed on your host." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:26 +#: classes/grade-system/wp-security-feature-item-manager.php:69 +msgid "File permissions" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:27 +msgid "PHP file editing" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:28 +msgid "WP file access" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:29 +msgid "Host system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:55 +msgid "Filesystem security" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:80 +msgid "Nonce check failed for manual DB backup operation!" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:90 +msgid "The permissions for %s were successfully changed to %s" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:94 +msgid "Unable to change permissions for %s!" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:100 +msgid "File permissions scan" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:103 +msgid "Your WordPress file and folder permission settings govern the accessibility and read/write privileges of the files and folders which make up your WP installation." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:104 +msgid "Your WP installation already comes with reasonably secure file permission settings for the filesystem." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:105 +msgid "However, sometimes people or other plugins modify the various permission settings of certain core WP folders or files such that they end up making their site less secure because they chose the wrong permission values." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:106 +msgid "This feature will scan the critical WP core folders and files and will highlight any permission settings which are insecure." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:114 +msgid "This plugin has detected that your site is running on a Windows server." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:115 +msgid "This feature is not applicable for Windows server installations." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:121 +msgid "WP directory and file permissions scan results" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:133 +#: admin/wp-security-filesystem-menu.php:152 +msgid "Name" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:134 +#: admin/wp-security-filesystem-menu.php:153 +msgid "File/Folder" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:135 +#: admin/wp-security-filesystem-menu.php:154 +msgid "Current permissions" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:136 +#: admin/wp-security-filesystem-menu.php:155 +msgid "Recommended permissions" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:137 +#: admin/wp-security-filesystem-menu.php:156 +msgid "Recommended action" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:195 +msgid "Your PHP file editing settings were saved successfully." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:199 +msgid "Operation failed! Unable to modify or make a backup of wp-config.php file!" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:212 +#: classes/grade-system/wp-security-feature-item-manager.php:71 +msgid "File editing" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:215 +msgid "The WordPress Dashboard by default allows administrators to edit PHP files, such as plugin and theme files." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:216 +msgid "This is often the first tool an attacker will use if able to login, since it allows code execution." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:217 +msgid "This feature will disable the ability for people to edit PHP files via the dashboard." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:223 +msgid "Disable PHP file editing" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:235 +msgid "Disable ability to edit PHP files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:238 +msgid "Check this if you want to remove the ability for people to edit PHP files via the WP dashboard" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:282 +msgid "You have successfully saved the Prevent Access to Default WP Files configuration." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:286 +#: admin/wp-security-firewall-menu.php:126 +#: admin/wp-security-firewall-menu.php:346 +#: admin/wp-security-firewall-menu.php:613 +#: admin/wp-security-firewall-menu.php:912 +#: admin/wp-security-settings-menu.php:772 +#: admin/wp-security-spam-menu.php:124 +msgid "Could not write to the .htaccess file. Please check the file permissions." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:291 +msgid "WordPress files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:294 +msgid "This feature allows you to prevent access to files such as %s, %s and %s which are delivered with all WP installations." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:295 +msgid "By preventing access to these files you are hiding some key pieces of information (such as WordPress version info) from potential hackers." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:300 +msgid "Prevent access to default WP files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:311 +msgid "Prevent access to WP default install files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:314 +msgid "Check this if you want to prevent access to readme.html, license.txt and wp-config-sample.php." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:318 +msgid "Save setting" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:342 +msgid "System logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:345 +msgid "Sometimes your hosting platform will produce error or warning logs in a file called \"error_log\"." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:346 +msgid "Depending on the nature and cause of the error or warning, your hosting server can create multiple instances of this file in numerous directory locations of your WordPress installation." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:347 +msgid "By occasionally viewing the contents of these logs files you can keep informed of any underlying problems on your system which you might need to address." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:353 +msgid "View system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:355 +msgid "Please click the button below to view the latest system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:358 +msgid "Enter System Log File Name" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:360 +msgid "Enter your system log file name. (Defaults to error_log)" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:363 +msgid "View latest system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:365 +msgid "Loading..." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:382 +msgid "No system logs were found." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:435 +msgid "Set recommended permissions" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:441 +msgid "No action required" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:481 +msgid "Showing latest entries of error_log file: %s" +msgstr "" + +#: admin/wp-security-firewall-menu.php:28 +msgid "Basic firewall rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:29 +msgid "Additional firewall rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:30 +msgid "6G Blacklist firewall rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:31 +msgid "Internet bots" +msgstr "" + +#: admin/wp-security-firewall-menu.php:32 +msgid "Prevent hotlinks" +msgstr "" + +#: admin/wp-security-firewall-menu.php:33 +msgid "404 detection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:34 +msgid "Custom rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:122 +#: admin/wp-security-firewall-menu.php:908 +#: admin/wp-security-spam-menu.php:120 +#: admin/wp-security-spam-menu.php:494 +#: admin/wp-security-spam-menu.php:556 +#: admin/wp-security-user-registration-menu.php:95 +msgid "Settings were successfully saved" +msgstr "" + +#: admin/wp-security-firewall-menu.php:131 +#: admin/wp-security-firewall-menu.php:651 +msgid "Firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:138 +msgid "This should not have any impact on your site's general functionality but if you wish you can take a %s of your .htaccess file before proceeding." +msgstr "" + +#: admin/wp-security-firewall-menu.php:139 +msgid "The features in this tab allow you to activate some basic firewall security protection rules for your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:140 +msgid "The firewall functionality is achieved via the insertion of special code into your currently active .htaccess file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:151 +msgid "You have enabled the \"Completely Block Access To XMLRPC\" checkbox which means all XMLRPC functionality will be blocked." +msgstr "" + +#: admin/wp-security-firewall-menu.php:152 +msgid "By leaving this feature enabled you will prevent Jetpack or Wordpress iOS or other apps which need XMLRPC from working correctly on your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:153 +msgid "If you still need XMLRPC then uncheck the \"Completely Block Access To XMLRPC\" checkbox and enable only the \"Disable Pingback Functionality From XMLRPC\" checkbox." +msgstr "" + +#: admin/wp-security-firewall-menu.php:163 +msgid "Basic firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:171 +msgid "Enable basic firewall protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:174 +msgid "Check this if you want to apply basic firewall protection to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:178 +msgid "This setting will implement the following basic firewall protection mechanisms on your site:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:179 +msgid "1) Protect your htaccess file by denying access to it." +msgstr "" + +#: admin/wp-security-firewall-menu.php:180 +msgid "2) Disable the server signature." +msgstr "" + +#: admin/wp-security-firewall-menu.php:181 +msgid "3) Limit file upload size (%sMB)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:182 +msgid "4) Protect your wp-config.php file by denying access to it." +msgstr "" + +#: admin/wp-security-firewall-menu.php:183 +msgid "The above firewall features will be applied via your .htaccess file and should not affect your site's overall functionality." +msgstr "" + +#: admin/wp-security-firewall-menu.php:184 +msgid "You are still advised to take a backup of your active .htaccess file just in case." +msgstr "" + +#: admin/wp-security-firewall-menu.php:190 +msgid "Max file upload size (MB)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:192 +msgid "The value for the maximum file upload size used in the .htaccess file. (Defaults to %sMB if left blank)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:200 +msgid "WordPress XMLRPC and pingback vulnerability protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:208 +msgid "Completely block access to XMLRPC" +msgstr "" + +#: admin/wp-security-firewall-menu.php:211 +msgid "Check this if you are not using the WP XML-RPC functionality and you want to completely block external access to XMLRPC." +msgstr "" + +#: admin/wp-security-firewall-menu.php:215 +msgid "This setting will add a directive in your .htaccess to disable access to the WordPress xmlrpc.php file which is responsible for the XML-RPC functionality in WordPress." +msgstr "" + +#: admin/wp-security-firewall-menu.php:216 +msgid "Hackers can exploit various vulnerabilities in the WordPress XML-RPC API in a number of ways such as:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:217 +msgid "1) Denial of Service (DoS) attacks" +msgstr "" + +#: admin/wp-security-firewall-menu.php:218 +msgid "2) Hacking internal routers." +msgstr "" + +#: admin/wp-security-firewall-menu.php:219 +msgid "3) Scanning ports in internal networks to get info from various hosts." +msgstr "" + +#: admin/wp-security-firewall-menu.php:220 +msgid "Apart from the security protection benefit, this feature may also help reduce load on your server, particularly if your site currently has a lot of unwanted traffic hitting the XML-RPC API on your installation." +msgstr "" + +#: admin/wp-security-firewall-menu.php:221 +msgid "NOTE: You should only enable this feature if you are not currently using the XML-RPC functionality on your WordPress installation." +msgstr "" + +#: admin/wp-security-firewall-menu.php:222 +msgid "Leave this feature disabled and use the feature below if you want pingback protection but you still need XMLRPC." +msgstr "" + +#: admin/wp-security-firewall-menu.php:228 +msgid "Disable pingback functionality from XMLRPC" +msgstr "" + +#: admin/wp-security-firewall-menu.php:231 +msgid "If you use Jetpack or WP iOS or other apps which need WP XML-RPC functionality then check this. This will enable protection against WordPress pingback vulnerabilities." +msgstr "" + +#: admin/wp-security-firewall-menu.php:235 +msgid "NOTE: If you use Jetpack or the Wordpress iOS or other apps then you should enable this feature but leave the \"Completely Block Access To XMLRPC\" checkbox unchecked." +msgstr "" + +#: admin/wp-security-firewall-menu.php:236 +msgid "The feature will still allow XMLRPC functionality on your site but will disable the pingback methods." +msgstr "" + +#: admin/wp-security-firewall-menu.php:237 +msgid "This feature will also remove the \"X-Pingback\" header if it is present." +msgstr "" + +#: admin/wp-security-firewall-menu.php:246 +msgid "Block access to debug log file" +msgstr "" + +#: admin/wp-security-firewall-menu.php:254 +msgid "Block access to debug.log file" +msgstr "" + +#: admin/wp-security-firewall-menu.php:257 +msgid "Check this if you want to block access to the debug.log file that WordPress creates when debug logging is enabled." +msgstr "" + +#: admin/wp-security-firewall-menu.php:261 +msgid "WordPress has an option to turn on the debug logging to a file located in wp-content/debug.log. This file may contain sensitive information." +msgstr "" + +#: admin/wp-security-firewall-menu.php:262 +msgid "Using this option will block external access to this file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:262 +msgid "You can still access this file by logging into your site via FTP." +msgstr "" + +#: admin/wp-security-firewall-menu.php:270 +msgid "Save basic firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:342 +msgid "You have successfully saved the Additional Firewall Protection configuration" +msgstr "" + +#: admin/wp-security-firewall-menu.php:356 +msgid "Additional firewall protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:360 +msgid "Due to the nature of the code being inserted to the .htaccess file, this feature may break some functionality for certain plugins and you are therefore advised to take a %s of .htaccess before applying this configuration." +msgstr "" + +#: admin/wp-security-firewall-menu.php:362 +msgid "This feature allows you to activate more advanced firewall settings to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:363 +msgid "The advanced firewall rules are applied via the insertion of special code to your currently active .htaccess file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:372 +msgid "Listing of directory contents" +msgstr "" + +#: admin/wp-security-firewall-menu.php:381 +#: classes/grade-system/wp-security-feature-item-manager.php:85 +msgid "Disable index views" +msgstr "" + +#: admin/wp-security-firewall-menu.php:384 +msgid "Check this if you want to disable directory and file listing." +msgstr "" + +#: admin/wp-security-firewall-menu.php:389 +msgid "By default, an Apache server will allow the listing of the contents of a directory if it doesn't contain an index.php file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:391 +msgid "This feature will prevent the listing of contents for all directories." +msgstr "" + +#: admin/wp-security-firewall-menu.php:393 +msgid "NOTE: In order for this feature to work \"AllowOverride\" of the Indexes directive must be enabled in your httpd.conf file. Ask your hosting provider to check this if you don't have access to httpd.conf" +msgstr "" + +#: admin/wp-security-firewall-menu.php:402 +msgid "Trace and track" +msgstr "" + +#: admin/wp-security-firewall-menu.php:411 +#: classes/grade-system/wp-security-feature-item-manager.php:86 +msgid "Disable trace and track" +msgstr "" + +#: admin/wp-security-firewall-menu.php:414 +msgid "Check this if you want to disable trace and track." +msgstr "" + +#: admin/wp-security-firewall-menu.php:419 +msgid "HTTP Trace attack (XST) can be used to return header requests and grab cookies and other information." +msgstr "" + +#: admin/wp-security-firewall-menu.php:421 +msgid "This hacking technique is usually used together with cross site scripting attacks (XSS)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:423 +msgid "Disabling trace and track on your site will help prevent HTTP Trace attacks." +msgstr "" + +#: admin/wp-security-firewall-menu.php:432 +msgid "Proxy comment posting" +msgstr "" + +#: admin/wp-security-firewall-menu.php:442 +msgid "Forbid proxy comment posting" +msgstr "" + +#: admin/wp-security-firewall-menu.php:445 +msgid "Check this if you want to forbid proxy comment posting." +msgstr "" + +#: admin/wp-security-firewall-menu.php:450 +msgid "This setting will deny any requests that use a proxy server when posting comments." +msgstr "" + +#: admin/wp-security-firewall-menu.php:451 +msgid "By forbidding proxy comments you are in effect eliminating some spam and other proxy requests." +msgstr "" + +#: admin/wp-security-firewall-menu.php:460 +msgid "Bad query strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:470 +msgid "Deny bad query strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:473 +msgid "This will help protect you against malicious queries via XSS." +msgstr "" + +#: admin/wp-security-firewall-menu.php:478 +msgid "This feature will write rules in your .htaccess file to prevent malicious string attacks on your site using XSS." +msgstr "" + +#: admin/wp-security-firewall-menu.php:479 +msgid "NOTE: Some of these strings might be used for plugins or themes and hence this might break some functionality." +msgstr "" + +#: admin/wp-security-firewall-menu.php:480 +#: admin/wp-security-firewall-menu.php:510 +msgid "You are therefore strongly advised to take a backup of your active .htaccess file before applying this feature." +msgstr "" + +#: admin/wp-security-firewall-menu.php:489 +#: classes/grade-system/wp-security-feature-item-manager.php:89 +msgid "Advanced character string filter" +msgstr "" + +#: admin/wp-security-firewall-menu.php:499 +msgid "Enable advanced character string filter" +msgstr "" + +#: admin/wp-security-firewall-menu.php:502 +msgid "This will block bad character matches from XSS." +msgstr "" + +#: admin/wp-security-firewall-menu.php:507 +msgid "This is an advanced character string filter to prevent malicious string attacks on your site coming from Cross Site Scripting (XSS)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:508 +msgid "This setting matches for common malicious string patterns and exploits and will produce a 403 error for the hacker attempting the query." +msgstr "" + +#: admin/wp-security-firewall-menu.php:509 +msgid "NOTE: Some strings for this setting might break some functionality." +msgstr "" + +#: admin/wp-security-firewall-menu.php:518 +msgid "Save additional firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:609 +msgid "You have successfully saved the 5G/6G Firewall Protection configuration" +msgstr "" + +#: admin/wp-security-firewall-menu.php:633 +msgid "All in One WP Security and Firewall" +msgstr "" + +#: admin/wp-security-firewall-menu.php:634 +msgid "We were unable to access the firewall's configuration file:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:636 +msgid "As a result, the firewall will be unavailable." +msgstr "" + +#: admin/wp-security-firewall-menu.php:637 +msgid "Please check your PHP error log for further information." +msgstr "" + +#: admin/wp-security-firewall-menu.php:638 +msgid "If you're unable to locate your PHP log file, please contact your web hosting company to ask them where it can be found on their setup." +msgstr "" + +#: admin/wp-security-firewall-menu.php:655 +msgid "This feature allows you to activate the %s (or legacy %s) firewall security protection rules designed and produced by %s." +msgstr "" + +#: admin/wp-security-firewall-menu.php:656 +msgid "The 6G Blacklist is updated and improved version of 5G Blacklist. If you have 5G Blacklist active, you might consider activating 6G Blacklist instead." +msgstr "" + +#: admin/wp-security-firewall-menu.php:657 +msgid "The 6G Blacklist is a simple, flexible blacklist that helps reduce the number of malicious URL requests that hit your website." +msgstr "" + +#: admin/wp-security-firewall-menu.php:658 +msgid "The added advantage of applying the 6G firewall to your site is that it has been tested and confirmed by the people at PerishablePress.com to be an optimal and least disruptive set of .htaccess security rules for general WP sites running on an Apache server or similar." +msgstr "" + +#: admin/wp-security-firewall-menu.php:659 +msgid "Therefore the 6G firewall rules should not have any impact on your site's general functionality but if you wish you can take a %s of your .htaccess file before proceeding." +msgstr "" + +#: admin/wp-security-firewall-menu.php:665 +msgid "6G blacklist/firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:677 +msgid "Enable 6G firewall protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:680 +msgid "Check this if you want to apply the 6G Blacklist firewall protection from perishablepress.com to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:684 +msgid "This setting will implement the 6G security firewall protection mechanisms on your site which include the following things:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:685 +#: admin/wp-security-firewall-menu.php:703 +msgid "1) Block forbidden characters commonly used in exploitative attacks." +msgstr "" + +#: admin/wp-security-firewall-menu.php:686 +#: admin/wp-security-firewall-menu.php:704 +msgid "2) Block malicious encoded URL characters such as the \".css(\" string." +msgstr "" + +#: admin/wp-security-firewall-menu.php:687 +#: admin/wp-security-firewall-menu.php:705 +msgid "3) Guard against the common patterns and specific exploits in the root portion of targeted URLs." +msgstr "" + +#: admin/wp-security-firewall-menu.php:688 +#: admin/wp-security-firewall-menu.php:706 +msgid "4) Stop attackers from manipulating query strings by disallowing illicit characters." +msgstr "" + +#: admin/wp-security-firewall-menu.php:689 +#: admin/wp-security-firewall-menu.php:707 +msgid "....and much more." +msgstr "" + +#: admin/wp-security-firewall-menu.php:695 +msgid "Enable legacy 5G firewall protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:698 +msgid "Check this if you want to apply the 5G Blacklist firewall protection from perishablepress.com to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:702 +msgid "This setting will implement the 5G security firewall protection mechanisms on your site which include the following things:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:713 +msgid "Save 5G/6G firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:721 +msgid "6G block request methods" +msgstr "" + +#: admin/wp-security-firewall-menu.php:725 +msgid "HTTP Request methods are used by browsers and clients to communicate with servers to get responses." +msgstr "" + +#: admin/wp-security-firewall-menu.php:726 +msgid "GET and POST are the most commonly used methods to request and submit data for specified resources of the server." +msgstr "" + +#: admin/wp-security-firewall-menu.php:732 +msgid "Block %s method" +msgstr "" + +#: admin/wp-security-firewall-menu.php:735 +msgid "Check this to block the %s request method" +msgstr "" + +#: admin/wp-security-firewall-menu.php:740 +msgid "Some WooCommerce extensions use the PUT request method in addition to GET and POST." +msgstr "" + +#: admin/wp-security-firewall-menu.php:740 +msgid "This means WooCommerce users shouldn't block the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:741 +msgid "A few REST requests use the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:741 +msgid "If your site is communicated by the WP REST API, you should not block the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:749 +msgid "Save request methods settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:757 +msgid "6G other settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:761 +msgid "Block query strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:764 +msgid "Check this to block all query strings recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:768 +msgid "Block request strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:771 +msgid "Check this to block all request strings recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:775 +msgid "Block referrers" +msgstr "" + +#: admin/wp-security-firewall-menu.php:778 +msgid "Check this to block all referrers recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:782 +msgid "Block user-agents" +msgstr "" + +#: admin/wp-security-firewall-menu.php:785 +msgid "Check this to block all user-agents recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:789 +msgid "Save other settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:823 +msgid "The Internet bot settings were successfully saved" +msgstr "" + +#: admin/wp-security-firewall-menu.php:827 +msgid "Internet bot settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:833 +msgid "What is an Internet Bot" +msgstr "" + +#: admin/wp-security-firewall-menu.php:834 +msgid "%s?" +msgstr "" + +#: admin/wp-security-firewall-menu.php:836 +msgid "A bot is a piece of software which runs on the Internet and performs automatic tasks. For example when Google indexes your pages it uses automatic bots to achieve this task." +msgstr "" + +#: admin/wp-security-firewall-menu.php:837 +msgid "A lot of bots are legitimate and non-malicious but not all bots are good and often you will find some which try to impersonate legitimate bots such as \"Googlebot\" but in reality they have nohing to do with Google at all." +msgstr "" + +#: admin/wp-security-firewall-menu.php:838 +msgid "Although most of the bots out there are relatively harmless sometimes website owners want to have more control over which bots they allow into their site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:839 +msgid "This feature allows you to block bots which are impersonating as a Googlebot but actually aren't. (In other words they are fake Google bots)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:840 +msgid "Googlebots have a unique identity which cannot easily be forged and this feature will identify any fake Google bots and block them from reading your site's pages." +msgstr "" + +#: admin/wp-security-firewall-menu.php:846 +msgid "Attention: Sometimes non-malicious Internet organizations might have bots which impersonate as a \"Googlebot\"." +msgstr "" + +#: admin/wp-security-firewall-menu.php:847 +msgid "Just be aware that if you activate this feature the plugin will block all bots which use the \"Googlebot\" string in their User Agent information but are NOT officially from Google (irrespective whether they are malicious or not)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:848 +msgid "All other bots from other organizations such as \"Yahoo\", \"Bing\" etc will not be affected by this feature." +msgstr "" + +#: admin/wp-security-firewall-menu.php:854 +#: admin/wp-security-firewall-menu.php:864 +#: classes/grade-system/wp-security-feature-item-manager.php:93 +msgid "Block fake Googlebots" +msgstr "" + +#: admin/wp-security-firewall-menu.php:867 +msgid "Check this if you want to block all fake Googlebots." +msgstr "" + +#: admin/wp-security-firewall-menu.php:871 +msgid "This feature will check if the User Agent information of a bot contains the string \"Googlebot\"." +msgstr "" + +#: admin/wp-security-firewall-menu.php:872 +msgid "It will then perform a few tests to verify if the bot is legitimately from Google and if so it will allow the bot to proceed." +msgstr "" + +#: admin/wp-security-firewall-menu.php:873 +msgid "If the bot fails the checks then the plugin will mark it as being a fake Googlebot and it will block it" +msgstr "" + +#: admin/wp-security-firewall-menu.php:880 +msgid "Save internet bot settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:916 +#: admin/wp-security-firewall-menu.php:938 +#: classes/grade-system/wp-security-feature-item-manager.php:95 +msgid "Prevent image hotlinking" +msgstr "" + +#: admin/wp-security-firewall-menu.php:919 +msgid "A Hotlink is where someone displays an image on their site which is actually located on your site by using a direct link to the source of the image on your server." +msgstr "" + +#: admin/wp-security-firewall-menu.php:920 +msgid "Due to the fact that the image being displayed on the other person's site is coming from your server, this can cause leaking of bandwidth and resources for you because your server has to present this image for the people viewing it on someone elses's site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:921 +msgid "This feature will prevent people from directly hotlinking images from your site's pages by writing some directives in your .htaccess file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:926 +msgid "Prevent hotlinking" +msgstr "" + +#: admin/wp-security-firewall-menu.php:941 +msgid "Check this if you want to prevent hotlinking to images on your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:961 +msgid "Nonce check failed for delete all 404 event logs operation!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:972 +msgid "404 Detection Feature - Delete all 404 event logs operation failed!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:976 +msgid "All 404 event logs were deleted from the DB successfully!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1000 +msgid "You entered a non numeric value for the lockout time length field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1006 +msgid "You entered an incorrect format for the \"Redirect URL\" field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1039 +msgid "404 detection configuration" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1042 +msgid "A 404 or Not Found error occurs when somebody tries to access a non-existent page on your website." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1043 +msgid "Typically, most 404 errors happen quite innocently when people have mis-typed a URL or used an old link to page which doesn't exist anymore." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1044 +msgid "However, in some cases you may find many repeated 404 errors which occur in a relatively short space of time and from the same IP address which are all attempting to access a variety of non-existent page URLs." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1045 +msgid "Such behaviour can mean that a hacker might be trying to find a particular page or URL for sinister reasons." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1046 +msgid "This feature allows you to monitor all 404 events which occur on your site, and it also gives you the option of blocking IP addresses for a configured length of time." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1047 +msgid "If you want to temporarily block or blacklist an IP address, simply click the \"Temp Block\" or \"Blacklist IP\" link for the applicable IP entry in the \"404 Event Logs\" table below." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1071 +msgid "404 detection options" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1083 +msgid "Enable 404 IP detection and lockout" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1086 +msgid "Check this if you want to enable the lockout of selected IP addresses." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1091 +msgid "When you enable this checkbox, all 404 events on your site will be logged in the table below. You can monitor these events and select some IP addresses listed in the table below and block them for a specified amount of time. All IP addresses you select to be blocked from the \"404 Event Logs\" table section will be unable to access your site during the time specified." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1099 +msgid "Enable 404 event logging" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1102 +msgid "Check this if you want to enable the logging of 404 events" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1107 +msgid "Time length of 404 lockout (minutes)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1109 +msgid "Set the length of time for which a blocked IP address will be prevented from visiting your site" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1114 +msgid "You can lock any IP address which is recorded in the \"404 Event Logs\" table section below." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1116 +msgid "To temporarily lock an IP address, hover over the ID column and click the \"Temp Block\" link for the applicable IP entry." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1123 +msgid "404 lockout redirect URL" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1125 +msgid "A blocked visitor will be automatically redirected to this URL." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1135 +msgid "This list displays the 404 event logs when somebody tries to access a non-existent page on your website." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1136 +msgid "404 event logs that are older than %1$d days are purged automatically." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1141 +msgid "404 event logs" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1163 +#: admin/wp-security-firewall-menu.php:1172 +#: admin/wp-security-user-login-menu.php:495 +#: admin/wp-security-user-login-menu.php:504 +#: admin/wp-security-user-login-menu.php:653 +#: admin/wp-security-user-login-menu.php:662 +msgid "Export to CSV" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1169 +#: admin/wp-security-user-login-menu.php:501 +#: admin/wp-security-user-login-menu.php:659 +msgid "Click this button if you wish to download this log in CSV format." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1176 +#: admin/wp-security-firewall-menu.php:1185 +msgid "Delete all 404 event logs" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1182 +msgid "Click this button if you wish to purge all 404 event logs from the DB." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1241 +msgid "Custom .htaccess rules settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1248 +msgid "This feature can be used to apply your own custom .htaccess rules and directives." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1249 +msgid "It is useful for when you want to tweak our existing firewall rules or when you want to add your own." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1250 +msgid "NOTE: This feature can only be used if your site is hosted in an apache or similar web server." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1256 +msgid "Warning: Only use this feature if you know what you are doing." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1257 +msgid "Incorrect .htaccess rules or directives can break or prevent access to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1258 +msgid "It is your responsibility to ensure that you are entering the correct code!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1259 +msgid "If you break your site you will need to access your server via FTP or something similar and then edit your .htaccess file and delete the changes you made." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1265 +msgid "Custom .htaccess rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1269 +msgid "Enable custom .htaccess rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1272 +msgid "Check this if you want to enable custom rules entered in the text box below" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1276 +msgid "Place custom rules at the top" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1279 +msgid "Check this if you want to place your custom rules at the beginning of all the rules applied by this plugin" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1283 +msgid "Enter custom .htaccess rules:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1287 +msgid "Enter your custom .htaccess rules/directives." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1292 +msgid "Save custom rules" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:338 +#: admin/wp-security-firewall-setup-notice.php:407 +#: admin/wp-security-firewall-setup-notice.php:479 +#: admin/wp-security-firewall-setup-notice.php:595 +#: wp-security.php:43 +msgid "All In One WP Security and Firewall" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:340 +msgid "We were unable to create the file necessary to give you the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:341 +msgid "Your firewall will have reduced protection which means some of your firewall's functionality will be unavailable." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:342 +msgid "If you would like to manually set up the necessary file, please follow these steps:" +msgstr "" + +#. translators: %s Bootstrap file name. +#. translators: %s Firewall file name. +#: admin/wp-security-firewall-setup-notice.php:346 +#: admin/wp-security-firewall-setup-notice.php:453 +msgid "1. Create a file with the name %s in the same directory as your WordPress install is in, i.e.:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:350 +msgid "2. Paste in the following code:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:352 +#: admin/wp-security-firewall-setup-notice.php:462 +msgid "3. Save the file and press the 'Try again' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:372 +msgid "1. Open the following file:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:378 +msgid "2. Look for the auto_prepend_file directive." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:382 +msgid "2. Look for the following:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:388 +msgid "3. Change it to the following:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:392 +msgid "4. Save the file and press the 'Try again' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:392 +#: admin/wp-security-firewall-setup-notice.php:441 +msgid "You may have to wait up to 5 minutes before the settings take effect." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:410 +msgid "Your firewall has been installed with the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:411 +msgid "You may have to wait 5 minutes for the changes to take effect." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:434 +msgid "1. Open your php.ini file." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:437 +msgid "2. Set the auto_prepend_file directive like below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:441 +msgid "3. Restart the webserver and refresh the page" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:458 +msgid "2. Paste in the following directives:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:482 +msgid "We were unable to set up your firewall with the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:483 +msgid "Your firewall will have reduced functionality." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:487 +msgid "To give your site the highest level of protection, please follow these steps:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:500 +msgid "Note: if you're unable to perform any of the aforementioned steps, please ask your web hosting provider for further assistance." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:517 +msgid "Try again" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:539 +msgid "We have detected that your AIOS firewall is not fully installed, and therefore does not have the highest level of protection. " +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:540 +msgid "Your firewall will have reduced functionality until it has been upgraded. " +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:542 +msgid "Upgrade your protection now" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:598 +msgid "Our PHP-based firewall has been created to give you even greater protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:602 +msgid "If you already have our .htaccess-based firewall enabled, you will still need to set up the PHP-based firewall to benefit from its protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:605 +msgid "To set up the PHP-based firewall, press the 'Set up now' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:608 +msgid "Set up now" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:614 +#: templates/notices/custom-notice.php:10 +#: templates/notices/custom-notice.php:12 +#: templates/notices/horizontal-notice.php:50 +#: templates/notices/horizontal-notice.php:52 +#: templates/notices/htaccess-to-php-feature-notice.php:10 +#: templates/notices/htaccess-to-php-feature-notice.php:12 +msgid "Dismiss" +msgstr "" + +#: admin/wp-security-list-404.php:91 +msgid "Event type" +msgstr "" + +#: admin/wp-security-list-404.php:92 +#: admin/wp-security-list-logged-in-users.php:46 +#: admin/wp-security-list-registered-users.php:74 +msgid "IP address" +msgstr "" + +#: admin/wp-security-list-404.php:93 +msgid "Attempted URL" +msgstr "" + +#: admin/wp-security-list-404.php:94 +msgid "Referer" +msgstr "" + +#: admin/wp-security-list-404.php:96 +msgid "Lock status" +msgstr "" + +#: admin/wp-security-list-404.php:118 +msgid "Temp block IP" +msgstr "" + +#: admin/wp-security-list-404.php:119 +msgid "Blacklist IP" +msgstr "" + +#: admin/wp-security-list-404.php:120 +#: admin/wp-security-list-acct-activity.php:82 +#: admin/wp-security-list-locked-ip.php:37 +#: admin/wp-security-list-locked-ip.php:84 +#: admin/wp-security-list-login-fails.php:73 +#: admin/wp-security-list-registered-users.php:93 +msgid "Delete" +msgstr "" + +#: admin/wp-security-list-404.php:128 +#: admin/wp-security-list-404.php:136 +#: admin/wp-security-list-404.php:143 +#: admin/wp-security-list-acct-activity.php:92 +#: admin/wp-security-list-comment-spammer-ip.php:95 +#: admin/wp-security-list-locked-ip.php:97 +#: admin/wp-security-list-locked-ip.php:105 +#: admin/wp-security-list-login-fails.php:85 +#: admin/wp-security-list-permanent-blocked-ip.php:96 +#: admin/wp-security-list-registered-users.php:107 +#: admin/wp-security-list-registered-users.php:115 +#: admin/wp-security-list-registered-users.php:123 +msgid "Please select some records using the checkboxes" +msgstr "" + +#: admin/wp-security-list-404.php:278 +msgid "Nonce check failed for delete selected 404 event logs operation!" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:35 +msgid "Are you sure you want to delete this item?" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:46 +msgid "Login session still active" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:60 +#: admin/wp-security-list-locked-ip.php:60 +#: admin/wp-security-list-logged-in-users.php:44 +#: admin/wp-security-list-login-fails.php:54 +#: admin/wp-security-list-registered-users.php:69 +msgid "User ID" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:61 +#: admin/wp-security-list-locked-ip.php:61 +#: admin/wp-security-list-login-fails.php:55 +msgid "Username" +msgstr "Användarnamn" + +#: admin/wp-security-list-acct-activity.php:62 +msgid "Login date" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:63 +msgid "Logout date" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:136 +msgid "Nonce check failed for delete selected account activity logs operation!" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:59 +msgid "Spammer IP" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:60 +msgid "Number of spam comments from this IP" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:61 +msgid "Status" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:81 +msgid "Block" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:130 +#: admin/wp-security-list-comment-spammer-ip.php:179 +msgid "Nonce check failed for delete selected blocked IP operation!" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:137 +msgid "The selected IP addresses are now permanently blocked!" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:193 +msgid "The selected IP addresses were saved in the blacklist configuration settings." +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:201 +msgid "The .htaccess file was successfully modified to include the selected IP addresses." +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:212 +msgid "NOTE: The .htaccess file was not modified because you have disabled the \"Enable IP or User Agent Blacklisting\" check box." +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:213 +msgid "To block these IP addresses you will need to enable the above flag in the %s menu" +msgstr "" + +#: admin/wp-security-list-debug.php:47 +msgid "Level" +msgstr "" + +#: admin/wp-security-list-debug.php:48 +msgid "Message" +msgstr "" + +#: admin/wp-security-list-debug.php:49 +msgid "Type" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:36 +#: admin/wp-security-list-locked-ip.php:83 +msgid "Unlock" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:59 +msgid "Locked IP/range" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:62 +#: admin/wp-security-list-permanent-blocked-ip.php:67 +msgid "Reason" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:63 +msgid "Date locked" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:64 +msgid "Release date" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:134 +msgid "The selected IP entries were unlocked successfully." +msgstr "" + +#: admin/wp-security-list-locked-ip.php:140 +msgid "Nonce check failed for unlock IP operation!" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:147 +msgid "The selected IP entry was unlocked successfully." +msgstr "" + +#: admin/wp-security-list-logged-in-users.php:45 +#: admin/wp-security-list-registered-users.php:70 +msgid "Login name" +msgstr "" + +#: admin/wp-security-list-logged-in-users.php:87 +msgid "Nonce check failed for force user logout operation!" +msgstr "" + +#: admin/wp-security-list-logged-in-users.php:96 +msgid "The selected user was logged out successfully!" +msgstr "" + +#: admin/wp-security-list-login-fails.php:53 +msgid "Login IP range" +msgstr "" + +#: admin/wp-security-list-login-fails.php:130 +msgid "Nonce check failed for delete failed login record operation!" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:66 +msgid "Blocked IP" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:87 +msgid "Unblock" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:122 +#: admin/wp-security-list-permanent-blocked-ip.php:139 +msgid "Successfully unblocked and deleted the selected record(s)." +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:126 +#: admin/wp-security-list-permanent-blocked-ip.php:143 +msgid "Failed to unblock and delete the selected record(s)." +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:133 +msgid "Nonce check failed for unblock IP operation!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:71 +msgid "Email" +msgstr "" + +#: admin/wp-security-list-registered-users.php:72 +msgid "Register date" +msgstr "" + +#: admin/wp-security-list-registered-users.php:73 +msgid "Account status" +msgstr "" + +#: admin/wp-security-list-registered-users.php:92 +msgid "Approve" +msgstr "" + +#: admin/wp-security-list-registered-users.php:94 +msgid "Block IP" +msgstr "" + +#: admin/wp-security-list-registered-users.php:159 +msgid "The selected accounts were approved successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:163 +msgid "The following accounts failed to update successfully: " +msgstr "" + +#: admin/wp-security-list-registered-users.php:171 +msgid "The selected account was approved successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:190 +msgid "Your account is now active" +msgstr "" + +#: admin/wp-security-list-registered-users.php:191 +msgid "Your account with username: " +msgstr "" + +#: admin/wp-security-list-registered-users.php:191 +msgid " is now active" +msgstr "" + +#: admin/wp-security-list-registered-users.php:222 +msgid "The selected accounts were deleted successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:230 +msgid "Nonce check failed for delete registered user account operation!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:238 +msgid "The selected account was deleted successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:264 +msgid "The selected IP addresses were successfully added to the permanent block list!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:265 +#: admin/wp-security-list-registered-users.php:282 +msgid "View Blocked IPs" +msgstr "" + +#: admin/wp-security-list-registered-users.php:274 +msgid "Nonce check failed for block IP operation of registered user!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:281 +msgid "The selected IP was successfully added to the permanent block list!" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:25 +msgid "Visitor lockout" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:85 +msgid "Site lockout feature settings saved!" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:92 +msgid "General visitor lockout" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:98 +msgid "This feature allows you to put your site into \"maintenance mode\" by locking down the front-end to all visitors except logged in users with super admin privileges." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:99 +msgid "Locking your site down to general visitors can be useful if you are investigating some issues on your site or perhaps you might be doing some maintenance and wish to keep out all traffic for security reasons." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:104 +msgid "Enable front-end lockout" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:107 +msgid "Check this if you want all visitors except those who are logged in as administrator to be locked out of the front-end of your site." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:111 +msgid "Enter a message:" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:123 +msgid "Enter a message you wish to display to visitors when your site is in maintenance mode." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:130 +msgid "Save site lockout settings" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:28 +msgid "Copy protection" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:29 +msgid "Frames" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:30 +msgid "Users enumeration" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:31 +msgid "WP REST API" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:89 +msgid "Copy Protection feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:94 +msgid "Disable the ability to copy text" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:100 +msgid "This feature allows you to disable the ability to select and copy text from your front end." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:101 +msgid "When admin user is logged in, the feature is automatically disabled for his session." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:106 +msgid "Enable copy protection" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:109 +msgid "Check this if you want to disable the \"Right click\", \"Text selection\" and \"Copy\" option on the front end of your site." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:116 +msgid "Save copy protection settings" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:140 +msgid "Frame Display Prevention feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:145 +msgid "Prevent your site from being displayed in a frame" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:151 +msgid "This feature allows you to prevent other sites from displaying any of your content via a frame or iframe." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:152 +msgid "When enabled, this feature will set the \"X-Frame-Options\" parameter to \"sameorigin\" in the HTTP header." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:157 +msgid "Enable iFrame protection" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:160 +msgid "Check this if you want to stop other sites from displaying your content in a frame or iframe." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:191 +msgid "Users Enumeration Prevention feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:196 +msgid "Prevent users enumeration" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:202 +msgid "This feature allows you to prevent external users/bots from fetching the user info with urls like \"/?author=1\"." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:203 +msgid "When enabled, this feature will print a \"forbidden\" error rather than the user information." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:208 +msgid "Disable users enumeration" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:211 +msgid "Check this if you want to stop users enumeration." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:242 +msgid "WP REST API Security feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:253 +msgid "This feature allows you to block WordPress REST API access for unauthorized requests." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:254 +msgid "When enabled this feature will only allow REST requests to be processed if the user is logged in." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:260 +msgid "Beware that if you are using other plugins which have registered REST endpoints (eg, Contact Form 7), then this feature will also block REST requests used by these plugins if the user is not logged in. It is recommended that you leave this feature disabled if you want uninterrupted functionality for such plugins." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:268 +msgid "Disallow unauthorized REST requests" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:271 +msgid "Check this if you want to stop REST API access for non-logged in requests." +msgstr "" + +#: admin/wp-security-settings-menu.php:25 +msgid "General settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:29 +#: admin/wp-security-settings-menu.php:33 +msgid "file" +msgstr "" + +#: admin/wp-security-settings-menu.php:37 +msgid "Delete plugin settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:41 +msgid "WP version info" +msgstr "" + +#: admin/wp-security-settings-menu.php:45 +msgid "Import/Export" +msgstr "" + +#: admin/wp-security-settings-menu.php:52 +msgid "Advanced settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:128 +msgid "All the security features have been disabled successfully!" +msgstr "" + +#: admin/wp-security-settings-menu.php:132 +#: admin/wp-security-settings-menu.php:159 +msgid "Could not write to the .htaccess file. Please restore your .htaccess file manually using the restore functionality in the \".htaccess File\"." +msgstr "" + +#: admin/wp-security-settings-menu.php:137 +msgid "Could not write to the wp-config.php. Please restore your wp-config.php file manually using the restore functionality in the \"wp-config.php File\"." +msgstr "" + +#: admin/wp-security-settings-menu.php:155 +msgid "All firewall rules have been disabled successfully!" +msgstr "" + +#: admin/wp-security-settings-menu.php:177 +msgid "Deletion of aio_wp_security_configs option and .htaccess directives failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:179 +msgid "Reset of aio_wp_security_configs option failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:181 +msgid "Deletion of .htaccess directives failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:183 +msgid "All settings have been successfully reset." +msgstr "" + +#: admin/wp-security-settings-menu.php:203 +msgid "For information, updates and documentation, please visit the" +msgstr "" + +#: admin/wp-security-settings-menu.php:203 +msgid "Page" +msgstr "" + +#: admin/wp-security-settings-menu.php:204 +msgid "Follow us" +msgstr "" + +#: admin/wp-security-settings-menu.php:204 +msgid "on Twitter, Google+ or via Email to stay up to date about the new security features of this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:208 +msgid "WP Security plugin" +msgstr "" + +#: admin/wp-security-settings-menu.php:212 +msgid "Thank you for using the AIOS security plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:216 +msgid "There are a lot of security features in this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:221 +msgid "To start, go through each security option and enable the \"basic\" options." +msgstr "" + +#: admin/wp-security-settings-menu.php:225 +msgid "The more features you enable, the more security points you will achieve." +msgstr "" + +#: admin/wp-security-settings-menu.php:228 +msgid "Before doing anything we advise taking a backup of your .htaccess file, database and wp-config.php." +msgstr "" + +#: admin/wp-security-settings-menu.php:231 +msgid "Backup your database" +msgstr "" + +#: admin/wp-security-settings-menu.php:232 +#: admin/wp-security-settings-menu.php:433 +msgid "Backup .htaccess file" +msgstr "" + +#: admin/wp-security-settings-menu.php:233 +#: admin/wp-security-settings-menu.php:534 +msgid "Backup wp-config.php file" +msgstr "" + +#: admin/wp-security-settings-menu.php:240 +msgid "Disable security features" +msgstr "" + +#: admin/wp-security-settings-menu.php:246 +msgid "If you think that some plugin functionality on your site is broken due to a security feature you enabled in this plugin, then use the following option to turn off all the security features of this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:250 +msgid "Disable all security features" +msgstr "" + +#: admin/wp-security-settings-menu.php:257 +#: admin/wp-security-settings-menu.php:267 +msgid "Disable all firewall rules" +msgstr "" + +#: admin/wp-security-settings-menu.php:263 +msgid "This feature will disable all firewall rules which are currently active in this plugin and it will also delete these rules from your .htacess file. Use it if you think one of the firewall rules is causing an issue on your site." +msgstr "" + +#: admin/wp-security-settings-menu.php:274 +#: admin/wp-security-settings-menu.php:287 +msgid "Reset settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:279 +msgid "This button click will delete all of your settings related to the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:280 +msgid "This button click will reset/empty all the database tables of the security plugin also." +msgstr "" + +#: admin/wp-security-settings-menu.php:281 +msgid "Use this plugin if you were locked out by the All In One WP Security & Firewall Plugin and/or you are having issues logging in when that plugin is activated." +msgstr "" + +#: admin/wp-security-settings-menu.php:282 +msgid "In addition to the settings it will also delete any directives which were added to the .htaccess file by the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:283 +msgid "%1$sNOTE: %2$sAfter deleting the settings you will need to re-configure the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:295 +msgid "Debug settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:301 +msgid "This setting allows you to enable/disable debug for this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:307 +msgid "Enable debug" +msgstr "" + +#: admin/wp-security-settings-menu.php:310 +msgid "Check this if you want to enable debug. You should keep this option disabled after you have finished debugging the issue." +msgstr "" + +#: admin/wp-security-settings-menu.php:314 +msgid "Save debug settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:350 +msgid "Your .htaccess file was successfully backed up! Using an FTP program go to the \"/wp-content/aiowps_backups\" directory to save a copy of the file to your computer." +msgstr "" + +#: admin/wp-security-settings-menu.php:356 +msgid "htaccess file rename failed during backup. Please check your root directory for the backup file using FTP." +msgstr "" + +#: admin/wp-security-settings-menu.php:362 +msgid "htaccess backup failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:377 +msgid "Please choose a .htaccess to restore from." +msgstr "" + +#: admin/wp-security-settings-menu.php:392 +msgid "htaccess file restore failed. Please attempt to restore the .htaccess manually using FTP." +msgstr "" + +#: admin/wp-security-settings-menu.php:396 +msgid "Your .htaccess file has successfully been restored!" +msgstr "" + +#: admin/wp-security-settings-menu.php:402 +msgid "htaccess Restore operation failed! Please check the contents of the file you are trying to restore from." +msgstr "" + +#: admin/wp-security-settings-menu.php:408 +msgid ".htaccess file operations" +msgstr "" + +#: admin/wp-security-settings-menu.php:411 +msgid "Your \".htaccess\" file is a key component of your website's security and it can be modified to implement various levels of protection mechanisms." +msgstr "" + +#: admin/wp-security-settings-menu.php:412 +msgid "This feature allows you to backup and save your currently active .htaccess file should you need to re-use the the backed up file in the future." +msgstr "" + +#: admin/wp-security-settings-menu.php:413 +msgid "You can also restore your site's .htaccess settings using a backed up .htaccess file." +msgstr "" + +#: admin/wp-security-settings-menu.php:428 +msgid "Save the current .htaccess file" +msgstr "" + +#: admin/wp-security-settings-menu.php:432 +msgid "Click the button below to backup and save the currently active .htaccess file." +msgstr "" + +#: admin/wp-security-settings-menu.php:437 +msgid "Restore from a backed up .htaccess file" +msgstr "" + +#: admin/wp-security-settings-menu.php:443 +msgid ".htaccess file to restore from" +msgstr "" + +#: admin/wp-security-settings-menu.php:445 +msgid "Select Your htaccess File" +msgstr "" + +#: admin/wp-security-settings-menu.php:449 +msgid "After selecting your file, click the button below to restore your site using the backed up htaccess file (htaccess_backup.txt)." +msgstr "" + +#: admin/wp-security-settings-menu.php:455 +msgid "Restore .htaccess file" +msgstr "" + +#: admin/wp-security-settings-menu.php:477 +msgid "Please choose a wp-config.php file to restore from." +msgstr "" + +#: admin/wp-security-settings-menu.php:493 +msgid "wp-config.php file restore failed. Please attempt to restore this file manually using FTP." +msgstr "" + +#: admin/wp-security-settings-menu.php:497 +msgid "Your wp-config.php file has successfully been restored!" +msgstr "" + +#: admin/wp-security-settings-menu.php:503 +msgid "wp-config.php Restore operation failed! Please check the contents of the file you are trying to restore from." +msgstr "" + +#: admin/wp-security-settings-menu.php:509 +msgid "wp-config.php file operations" +msgstr "" + +#: admin/wp-security-settings-menu.php:512 +msgid "Your \"wp-config.php\" file is one of the most important in your WordPress installation. It is a primary configuration file and contains crucial things such as details of your database and other critical components." +msgstr "" + +#: admin/wp-security-settings-menu.php:513 +msgid "This feature allows you to backup and save your currently active wp-config.php file should you need to re-use the the backed up file in the future." +msgstr "" + +#: admin/wp-security-settings-menu.php:514 +msgid "You can also restore your site's wp-config.php settings using a backed up wp-config.php file." +msgstr "" + +#: admin/wp-security-settings-menu.php:529 +msgid "Save the current wp-config.php file" +msgstr "" + +#: admin/wp-security-settings-menu.php:533 +msgid "Click the button below to backup and download the contents of the currently active wp-config.php file." +msgstr "" + +#: admin/wp-security-settings-menu.php:539 +msgid "Restore from a backed up wp-config file" +msgstr "" + +#: admin/wp-security-settings-menu.php:545 +msgid "wp-config file to restore from" +msgstr "" + +#: admin/wp-security-settings-menu.php:547 +msgid "Select Your wp-config File" +msgstr "" + +#: admin/wp-security-settings-menu.php:551 +msgid "After selecting your file click the button below to restore your site using the backed up wp-config file (wp-config.php.backup.txt)." +msgstr "" + +#: admin/wp-security-settings-menu.php:557 +msgid "Restore wp-config file" +msgstr "" + +#: admin/wp-security-settings-menu.php:591 +msgid "Manage delete plugin settings saved." +msgstr "" + +#: admin/wp-security-settings-menu.php:596 +msgid "Manage delete plugin tasks" +msgstr "" + +#: admin/wp-security-settings-menu.php:603 +msgid "Delete database tables" +msgstr "" + +#: admin/wp-security-settings-menu.php:606 +msgid "Check this if you want to remove database tables when the plugin is uninstalled." +msgstr "" + +#: admin/wp-security-settings-menu.php:610 +msgid "Delete settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:613 +msgid "Check this if you want to remove all plugin settings when uninstalling the plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:613 +msgid "It will also remove all custom htaccess rules that were added by this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:647 +msgid "WP generator meta tag and version info" +msgstr "" + +#: admin/wp-security-settings-menu.php:650 +msgid "WordPress generator automatically adds some meta information inside the \"head\" tags of every page on your site's front end. Below is an example of this:" +msgstr "" + +#: admin/wp-security-settings-menu.php:652 +msgid "The above meta information shows which version of WordPress your site is currently running and thus can help hackers or crawlers scan your site to see if you have an older version of WordPress or one with a known exploit." +msgstr "" + +#: admin/wp-security-settings-menu.php:653 +msgid "There are also other ways wordpress reveals version info such as during style and script loading. An example of this is:" +msgstr "" + +#: admin/wp-security-settings-menu.php:655 +msgid "This feature will allow you to remove the WP generator meta info and other version info from your site's pages." +msgstr "" + +#: admin/wp-security-settings-menu.php:661 +msgid "WP generator meta info" +msgstr "" + +#: admin/wp-security-settings-menu.php:673 +msgid "Remove WP generator meta info" +msgstr "" + +#: admin/wp-security-settings-menu.php:676 +msgid "Check this if you want to remove the version and meta info produced by WP from all pages" +msgstr "" + +#: admin/wp-security-settings-menu.php:704 +msgid "Please choose a file to import your settings from." +msgstr "" + +#: admin/wp-security-settings-menu.php:736 +msgid "Import AIOS settings from " +msgstr "" + +#: admin/wp-security-settings-menu.php:742 +#: admin/wp-security-settings-menu.php:786 +msgid "The deletion of the import file failed. Please delete this file manually via the media menu for security purposes." +msgstr "" + +#: admin/wp-security-settings-menu.php:744 +#: admin/wp-security-settings-menu.php:788 +msgid "The file you uploaded was also deleted for security purposes because it contains security settings details." +msgstr "" + +#: admin/wp-security-settings-menu.php:759 +msgid "Your AIOS settings were successfully imported via file input." +msgstr "" + +#: admin/wp-security-settings-menu.php:760 +msgid "The deletion of the import file failed. Please delete this file manually via the media menu for security purposes because it contains security settings details." +msgstr "" + +#: admin/wp-security-settings-menu.php:762 +msgid "Your AIOS settings were successfully imported. The file you uploaded was also deleted for security purposes because it contains security settings details." +msgstr "" + +#: admin/wp-security-settings-menu.php:765 +msgid "Your AIOS settings were successfully imported via text entry." +msgstr "" + +#: admin/wp-security-settings-menu.php:780 +msgid "The contents of your settings file appear invalid. Please check the contents of the file you are trying to import settings from." +msgstr "" + +#: admin/wp-security-settings-menu.php:797 +msgid "Export or import your AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:800 +msgid "This section allows you to export or import your All In One WP Security & Firewall settings." +msgstr "" + +#: admin/wp-security-settings-menu.php:801 +msgid "This can be handy if you wanted to save time by applying the settings from one site to another site." +msgstr "" + +#: admin/wp-security-settings-menu.php:802 +msgid "NOTE: Before importing, it is your responsibility to know what settings you are trying to import. Importing settings blindly can cause you to be locked out of your site." +msgstr "" + +#: admin/wp-security-settings-menu.php:803 +msgid "For Example: If a settings item relies on the domain URL then it may not work correctly when imported into a site with a different domain." +msgstr "" + +#: admin/wp-security-settings-menu.php:809 +#: admin/wp-security-settings-menu.php:818 +msgid "Export AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:815 +msgid "To export your All In One WP Security & Firewall settings click the button below." +msgstr "" + +#: admin/wp-security-settings-menu.php:822 +#: admin/wp-security-settings-menu.php:851 +msgid "Import AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:828 +msgid "Use this section to import your All In One WP Security & Firewall settings from a file. Alternatively, copy/paste the contents of your import file into the textarea below." +msgstr "" + +#: admin/wp-security-settings-menu.php:830 +msgid "Import file" +msgstr "" + +#: admin/wp-security-settings-menu.php:833 +msgid "Select Your Import Settings File" +msgstr "" + +#: admin/wp-security-settings-menu.php:837 +msgid "After selecting your file, click the button below to apply the settings to your site." +msgstr "" + +#: admin/wp-security-settings-menu.php:844 +msgid "Copy/Paste import data" +msgstr "" + +#: admin/wp-security-settings-menu.php:893 +msgid "Default - if correct, then this is the best option" +msgstr "" + +#: admin/wp-security-settings-menu.php:894 +msgid "Only use if you're using Cloudflare." +msgstr "" + +#: admin/wp-security-settings-menu.php:902 +msgid "(current value: %s)" +msgstr "" + +#: admin/wp-security-settings-menu.php:905 +msgid "no value (i.e. empty) on your server" +msgstr "" + +#: admin/wp-security-spam-menu.php:28 +msgid "Comment spam" +msgstr "" + +#: admin/wp-security-spam-menu.php:29 +msgid "Comment spam IP monitoring" +msgstr "" + +#: admin/wp-security-spam-menu.php:30 +msgid "BuddyPress" +msgstr "" + +#: admin/wp-security-spam-menu.php:31 +msgid "bbPress" +msgstr "" + +#: admin/wp-security-spam-menu.php:57 +msgid "Spam prevention" +msgstr "" + +#: admin/wp-security-spam-menu.php:99 +msgid "You entered a non numeric value for the \"move spam comments to trash after number of days\" field." +msgstr "" + +#: admin/wp-security-spam-menu.php:99 +#: admin/wp-security-spam-menu.php:297 +#: admin/wp-security-user-login-menu.php:118 +#: admin/wp-security-user-login-menu.php:124 +#: admin/wp-security-user-login-menu.php:130 +#: admin/wp-security-user-login-menu.php:136 +msgid "It has been set to the default value." +msgstr "" + +#: admin/wp-security-spam-menu.php:129 +msgid "Comment spam settings" +msgstr "" + +#: admin/wp-security-spam-menu.php:134 +msgid "Add CAPTCHA to comments form" +msgstr "" + +#: admin/wp-security-spam-menu.php:138 +msgid "This feature will add a CAPTCHA field in the WordPress comments form." +msgstr "" + +#: admin/wp-security-spam-menu.php:139 +msgid "Adding a CAPTCHA field in the comment form is a simple way of greatly reducing spam comments from bots without using .htaccess rules." +msgstr "" + +#: admin/wp-security-spam-menu.php:148 +msgid "Enable CAPTCHA on comment forms" +msgstr "" + +#: admin/wp-security-spam-menu.php:151 +msgid "Check this if you want to insert a CAPTCHA field on the comment forms." +msgstr "" + +#: admin/wp-security-spam-menu.php:158 +msgid "Block spambot comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:162 +msgid "A large portion of WordPress blog comment spam is mainly produced by automated bots and not necessarily by humans." +msgstr "" + +#: admin/wp-security-spam-menu.php:163 +msgid "This feature will greatly minimize the useless and unnecessary traffic and load on your server resulting from spam comments by blocking all comment requests which do not originate from your domain." +msgstr "" + +#: admin/wp-security-spam-menu.php:164 +msgid "In other words, if the comment was not submitted by a human who physically submitted the comment on your site, the request will be blocked." +msgstr "" + +#: admin/wp-security-spam-menu.php:182 +msgid "Block spambots from posting comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:185 +msgid "Check this if you want to apply a firewall rule which will block comments originating from spambots." +msgstr "" + +#: admin/wp-security-spam-menu.php:189 +msgid "This feature will implement a firewall rule to block all comment attempts which do not originate from your domain." +msgstr "" + +#: admin/wp-security-spam-menu.php:190 +msgid "A legitimate comment is one which is submitted by a human who physically fills out the comment form and clicks the submit button. For such events, the HTTP_REFERRER is always set to your own domain." +msgstr "" + +#: admin/wp-security-spam-menu.php:191 +msgid "A comment submitted by a spambot is done by directly calling the comments.php file, which usually means that the HTTP_REFERRER value is not your domain and often times empty." +msgstr "" + +#: admin/wp-security-spam-menu.php:192 +msgid "This feature will check and block comment requests which are not referred by your domain thus greatly reducing your overall blog spam and PHP requests done by the server to process these comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:202 +msgid "Comment processing" +msgstr "" + +#: admin/wp-security-spam-menu.php:207 +msgid "Trash spam comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:216 +msgid "Move spam comments to trash after %s days." +msgstr "" + +#: admin/wp-security-spam-menu.php:224 +msgid "Enable this feature in order to move the spam comments to trash after given number of days." +msgstr "" + +#: admin/wp-security-spam-menu.php:262 +msgid "You entered a non numeric value for the minimum number of spam comments field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-spam-menu.php:265 +msgid "You must enter an integer greater than zero for minimum number of spam comments field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-spam-menu.php:292 +msgid "Nonce check failed for list spam comment IPs." +msgstr "" + +#: admin/wp-security-spam-menu.php:297 +msgid "You entered a non numeric value for the minimum spam comments per IP field." +msgstr "" + +#: admin/wp-security-spam-menu.php:308 +msgid "Displaying results for IP addresses which have posted a minimum of %s spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:323 +msgid "Auto block spammer IPs" +msgstr "" + +#: admin/wp-security-spam-menu.php:328 +msgid "This feature has detected that %s is not active. It is highly recommended that you activate the Akismet plugin to make the most of this feature." +msgstr "" + +#: admin/wp-security-spam-menu.php:337 +msgid "This feature allows you to automatically and permanently block IP addresses which have exceeded a certain number of comments labelled as spam." +msgstr "" + +#: admin/wp-security-spam-menu.php:338 +msgid "Comments are usually labelled as spam either by the Akismet plugin or manually by the WP administrator when they mark a comment as \"spam\" from the WordPress Comments menu." +msgstr "" + +#: admin/wp-security-spam-menu.php:352 +msgid "You currently have no IP addresses permanently blocked due to spam." +msgstr "" + +#: admin/wp-security-spam-menu.php:365 +msgid "Spammer IPs added to permanent block list today: " +msgstr "" + +#: admin/wp-security-spam-menu.php:366 +msgid "All time total: " +msgstr "" + +#: admin/wp-security-spam-menu.php:367 +msgid "View blocked IPs" +msgstr "" + +#: admin/wp-security-spam-menu.php:380 +msgid "Enable auto block of spam comment IPs" +msgstr "" + +#: admin/wp-security-spam-menu.php:383 +msgid "Check this box if you want this plugin to automatically block IP addresses which submit spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:387 +msgid "Minimum number of spam comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:389 +msgid "Specify the minimum number of spam comments for an IP address before it is permanently blocked." +msgstr "" + +#: admin/wp-security-spam-menu.php:393 +msgid "Example 1: Setting this value to \"1\" will block ALL IP addresses which were used to submit at least one spam comment." +msgstr "" + +#: admin/wp-security-spam-menu.php:394 +msgid "Example 2: Setting this value to \"5\" will block only those IP addresses which were used to submit 5 spam comments or more on your site." +msgstr "" + +#: admin/wp-security-spam-menu.php:412 +msgid "List spammer IP addresses" +msgstr "" + +#: admin/wp-security-spam-menu.php:416 +msgid "This section displays a list of the IP addresses of the people or bots who have left spam comments on your site." +msgstr "" + +#: admin/wp-security-spam-menu.php:417 +msgid "This information can be handy for identifying the most persistent IP addresses or ranges used by spammers." +msgstr "" + +#: admin/wp-security-spam-menu.php:418 +msgid "By inspecting the IP address data coming from spammers you will be in a better position to determine which addresses or address ranges you should block by adding them to the permanent block list." +msgstr "" + +#: admin/wp-security-spam-menu.php:419 +msgid "To add one or more of the IP addresses displayed in the table below to your blacklist, simply click the \"Block\" link for the individual row or select more than one address using the checkboxes and then choose the \"block\" option from the Bulk Actions dropdown list and click the \"Apply\" button." +msgstr "" + +#: admin/wp-security-spam-menu.php:427 +msgid "Minimum number of spam comments per IP" +msgstr "" + +#: admin/wp-security-spam-menu.php:429 +msgid "This field allows you to list only those IP addresses which have been used to post X or more spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:433 +msgid "Example 1: Setting this value to \"0\" or \"1\" will list ALL IP addresses which were used to submit spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:434 +msgid "Example 2: Setting this value to \"5\" will list only those IP addresses which were used to submit 5 spam comments or more on your site." +msgstr "" + +#: admin/wp-security-spam-menu.php:441 +msgid "Find IP addresses" +msgstr "" + +#: admin/wp-security-spam-menu.php:445 +msgid "Spammer IP address results" +msgstr "" + +#: admin/wp-security-spam-menu.php:451 +#: classes/wp-security-utility.php:253 +msgid "The plugin has detected that you are using a Multi-Site WordPress installation." +msgstr "" + +#: admin/wp-security-spam-menu.php:452 +msgid "Only the \"superadmin\" can block IP addresses from the main site." +msgstr "" + +#: admin/wp-security-spam-menu.php:453 +msgid "Take note of the IP addresses you want blocked and ask the superadmin to add these to the blacklist using the \"Blacklist Manager\" on the main site." +msgstr "" + +#: admin/wp-security-spam-menu.php:498 +msgid "BuddyPress spam settings" +msgstr "" + +#: admin/wp-security-spam-menu.php:503 +msgid "Add CAPTCHA to BuddyPress registration form" +msgstr "" + +#: admin/wp-security-spam-menu.php:507 +msgid "This feature will add a simple math CAPTCHA field in the BuddyPress registration form." +msgstr "" + +#: admin/wp-security-spam-menu.php:508 +msgid "Adding a CAPTCHA field in the registration form is a simple way of greatly reducing spam signups from bots without using .htaccess rules." +msgstr "" + +#: admin/wp-security-spam-menu.php:518 +msgid "Enable CAPTCHA on BuddyPress registration form" +msgstr "" + +#: admin/wp-security-spam-menu.php:521 +msgid "Check this if you want to insert a CAPTCHA field on the BuddyPress registration forms." +msgstr "" + +#: admin/wp-security-spam-menu.php:530 +msgid "BuddyPress is not active! In order to use this feature you will need to have BuddyPress installed and activated." +msgstr "" + +#: admin/wp-security-spam-menu.php:560 +msgid "bbPress spam settings" +msgstr "" + +#: admin/wp-security-spam-menu.php:565 +msgid "Add CAPTCHA to bbPress new topic form" +msgstr "" + +#: admin/wp-security-spam-menu.php:569 +msgid "This feature will add a simple math CAPTCHA field in the bbPress new topic form." +msgstr "" + +#: admin/wp-security-spam-menu.php:570 +msgid "Adding a CAPTCHA field in this form is a simple way of greatly reducing spam submitted from bots." +msgstr "" + +#: admin/wp-security-spam-menu.php:580 +msgid "Enable CAPTCHA on bbPress new topic form" +msgstr "" + +#: admin/wp-security-spam-menu.php:583 +msgid "Check this if you want to insert a CAPTCHA field on the bbPress new topic forms." +msgstr "" + +#: admin/wp-security-spam-menu.php:592 +msgid "bbPress is not active. In order to use this feature you will need to have bbPress installed and activated." +msgstr "" + +#: admin/wp-security-tools-menu.php:34 +msgid "WHOIS lookup" +msgstr "" + +#: admin/wp-security-tools-menu.php:95 +#: admin/wp-security-tools-menu.php:136 +msgid "Querying %s: %s" +msgstr "" + +#: admin/wp-security-tools-menu.php:103 +#: admin/wp-security-tools-menu.php:112 +#: admin/wp-security-tools-menu.php:151 +msgid "Redirected to %s" +msgstr "" + +#: admin/wp-security-tools-menu.php:173 +msgid "The WHOIS lookup feature gives you a way to look up who owns an IP address or domain name." +msgstr "" + +#: admin/wp-security-tools-menu.php:173 +msgid "You can use this to investigate users engaging in malicious activity on your site." +msgstr "" + +#: admin/wp-security-tools-menu.php:176 +msgid "WHOIS lookup on IP or domain" +msgstr "" + +#: admin/wp-security-tools-menu.php:183 +msgid "IP address or domain name:" +msgstr "" + +#: admin/wp-security-tools-menu.php:190 +msgid "Look up IP or domain" +msgstr "" + +#: admin/wp-security-tools-menu.php:219 +msgid "Please enter a valid IP address or domain name to look up." +msgstr "" + +#: admin/wp-security-tools-menu.php:220 +#: admin/wp-security-tools-menu.php:226 +msgid "Nothing to show." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:32 +msgid "WP username" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:33 +msgid "Display name" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:34 +msgid "Password" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:60 +msgid "User accounts" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:82 +msgid "Admin user security" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:85 +msgid "By default, WordPress sets the administrator username to \"admin\" at installation time." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:86 +msgid "A lot of hackers try to take advantage of this information by attempting \"Brute force login attacks\" where they repeatedly try to guess the password by using \"admin\" for username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:87 +msgid "From a security perspective, changing the default \"admin\" user name is one of the first and smartest things you should do on your site." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:88 +msgid "This feature will allow you to change your default \"admin\" user name to a more secure name of your choosing." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:95 +msgid "List of administrator accounts" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:104 +#: classes/grade-system/wp-security-feature-item-manager.php:43 +msgid "Change admin username" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:112 +msgid "Your site currently has an account which uses the default \"admin\" username. It is highly recommended that you change this name to something else. Use the following field to change the admin username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:118 +msgid "New admin username" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:120 +msgid "Choose a new username for admin." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:124 +msgid "Change username" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:126 +msgid "NOTE: If you are currently logged in as \"admin\" you will be automatically logged out after changing your username and will be required to log back in." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:133 +msgid "No action required! " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:135 +msgid "Your site does not have any account which uses the default \"admin\" username. " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:136 +msgid "This is good security practice." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:148 +msgid "Display name security" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:151 +msgid "When you submit a post or answer a comment, WordPress will usually display your \"nickname\"." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:152 +msgid "By default the nickname is set to the login (or user) name of your account." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:153 +msgid "From a security perspective, leaving your nickname the same as your user name is bad practice because it gives a hacker at least half of your account's login credentials." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:154 +msgid "Therefore to further tighten your site's security you are advised to change your nickname and Display name to be different from your Username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:160 +msgid "Modify accounts with identical login name and display name" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:169 +msgid "Your site currently has the following accounts which have an identical login name and display name." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:170 +msgid "Follow the link to edit the user profile of that particular user account, change Nickname, choose a different Display name compared to Username, and press the \"Update User\" button.)" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:185 +msgid "No action required." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:186 +msgid "Your site does not have a user account where the display name is identical to the username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:197 +msgid "Password tool" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:200 +msgid "Poor password selection is one of the most common weak points of many sites and is usually the first thing a hacker will try to exploit when attempting to break into your site." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:201 +msgid "Many people fall into the trap of using a simple word or series of numbers as their password. Such a predictable and simple password would take a competent hacker merely minutes to guess your password by using a simple script which cycles through the easy and most common combinations." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:202 +msgid "The longer and more complex your password is the harder it is for hackers to \"crack\" because more complex passwords require much greater computing power and time." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:203 +msgid "This section contains a useful password strength tool which you can use to check whether your password is sufficiently strong enough." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:208 +msgid "Password strength tool" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:210 +msgid "This password tool uses an algorithm which calculates how long it would take for your password to be cracked using the computing power of an off-the-shelf current model desktop PC with high end processor, graphics card and appropriate password cracking software." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:213 +msgid "Start typing a password." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:216 +msgid "It would take a desktop PC approximately" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:217 +msgid "1 sec" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:217 +msgid "to crack your password!" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:222 +msgid "Password Strength" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:245 +msgid "Username " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:245 +msgid " already exists. Please enter another value. " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:262 +msgid "The database update operation of the user account failed!" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:291 +msgid "You entered an invalid username. Please enter another value. " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:295 +msgid "Please enter a value for your username. " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:302 +msgid "Username successfully changed." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:322 +msgid "Account login name" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:331 +msgid "Edit user" +msgstr "" + +#: admin/wp-security-user-login-menu.php:54 +#: admin/wp-security-user-login-menu.php:474 +msgid "Failed login records" +msgstr "" + +#: admin/wp-security-user-login-menu.php:55 +#: classes/grade-system/wp-security-feature-item-manager.php:51 +msgid "Force logout" +msgstr "" + +#: admin/wp-security-user-login-menu.php:56 +#: admin/wp-security-user-login-menu.php:632 +msgid "Account activity logs" +msgstr "" + +#: admin/wp-security-user-login-menu.php:58 +#: admin/wp-security-user-login-menu.php:769 +msgid "Additional settings" +msgstr "" + +#: admin/wp-security-user-login-menu.php:81 +msgid "User login" +msgstr "" + +#: admin/wp-security-user-login-menu.php:118 +msgid "You entered a non-numeric value for the max login attempts field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:124 +msgid "You entered a non numeric value for the login retry time period field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:130 +msgid "You entered a non numeric value for the lockout time length field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:136 +msgid "You entered a non numeric value for the maximum lockout time length field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:141 +msgid "You entered an invalid minimum lockout time length, it must be less than the maximum lockout time length value." +msgstr "" + +#: admin/wp-security-user-login-menu.php:141 +msgid "Both have been set to the default values." +msgstr "" + +#: admin/wp-security-user-login-menu.php:160 +msgid "Please fill in one or more email addresses to notify." +msgstr "" + +#: admin/wp-security-user-login-menu.php:162 +msgid "You have entered one or more invalid email addresses." +msgstr "" + +#: admin/wp-security-user-login-menu.php:165 +msgid "It has been set to your WordPress admin email as default." +msgstr "" + +#: admin/wp-security-user-login-menu.php:250 +msgid "Login lockout configuration" +msgstr "" + +#: admin/wp-security-user-login-menu.php:254 +msgid "One of the ways hackers try to compromise sites is via a " +msgstr "" + +#: admin/wp-security-user-login-menu.php:254 +msgid "Brute force login attack" +msgstr "" + +#: admin/wp-security-user-login-menu.php:254 +msgid "This is where attackers use repeated login attempts until they guess the password." +msgstr "" + +#: admin/wp-security-user-login-menu.php:255 +msgid "Apart from choosing strong passwords, monitoring and blocking IP addresses which are involved in repeated login failures in a short period of time is a very effective way to stop these types of attacks." +msgstr "" + +#: admin/wp-security-user-login-menu.php:256 +msgid "You may also want to checkout our %s feature for another secure way to protect against these types of attacks." +msgstr "" + +#: admin/wp-security-user-login-menu.php:261 +msgid "Login lockout options" +msgstr "" + +#: admin/wp-security-user-login-menu.php:272 +msgid "Enable login lockout feature" +msgstr "" + +#: admin/wp-security-user-login-menu.php:275 +msgid "Check this if you want to enable the login lockout feature and apply the settings below" +msgstr "" + +#: admin/wp-security-user-login-menu.php:279 +msgid "Allow unlock requests" +msgstr "" + +#: admin/wp-security-user-login-menu.php:282 +msgid "Check this if you want to allow users to generate an automated unlock request link which will unlock their account" +msgstr "" + +#: admin/wp-security-user-login-menu.php:286 +msgid "Max login attempts" +msgstr "" + +#: admin/wp-security-user-login-menu.php:288 +msgid "Set the value for the maximum login retries before IP address is locked out" +msgstr "" + +#: admin/wp-security-user-login-menu.php:292 +msgid "Login retry time period (min)" +msgstr "" + +#: admin/wp-security-user-login-menu.php:294 +msgid "If the maximum number of failed login attempts for a particular IP address occur within this time period the plugin will lock out that address" +msgstr "" + +#: admin/wp-security-user-login-menu.php:299 +msgid "Minimum lockout time length" +msgstr "" + +#: admin/wp-security-user-login-menu.php:305 +msgid "Set the minimum time period in minutes of lockout." +msgstr "" + +#: admin/wp-security-user-login-menu.php:306 +msgid "This failed login lockout time will be tripled on each failed login." +msgstr "" + +#: admin/wp-security-user-login-menu.php:313 +msgid "Maximum lockout time length" +msgstr "" + +#: admin/wp-security-user-login-menu.php:318 +msgid "Set the maximum time period in minutes of lockout." +msgstr "" + +#: admin/wp-security-user-login-menu.php:319 +msgid "No IP address will be blocked for more than this time period after making a failed login attempt." +msgstr "" + +#: admin/wp-security-user-login-menu.php:324 +msgid "Display generic error message" +msgstr "" + +#: admin/wp-security-user-login-menu.php:327 +msgid "Check this if you want to show a generic error message when a login attempt fails" +msgstr "" + +#: admin/wp-security-user-login-menu.php:331 +msgid "Instantly lockout invalid usernames" +msgstr "" + +#: admin/wp-security-user-login-menu.php:334 +msgid "Check this if you want to instantly lockout login attempts with usernames which do not exist on your system" +msgstr "" + +#: admin/wp-security-user-login-menu.php:339 +msgid "Instantly lockout specific usernames" +msgstr "" + +#: admin/wp-security-user-login-menu.php:349 +msgid "Insert one username per line. Existing usernames are not blocked even if present in the list." +msgstr "" + +#: admin/wp-security-user-login-menu.php:354 +msgid "Notify by email" +msgstr "" + +#: admin/wp-security-user-login-menu.php:358 +msgid "Check this if you want to receive an email when someone has been locked out due to maximum failed login attempts" +msgstr "" + +#: admin/wp-security-user-login-menu.php:361 +msgid "Fill in one email address per line." +msgstr "" + +#: admin/wp-security-user-login-menu.php:365 +msgid "Each email address must be on a new line." +msgstr "" + +#: admin/wp-security-user-login-menu.php:366 +msgid "If a valid email address has not been filled in, it will not be saved." +msgstr "" + +#: admin/wp-security-user-login-menu.php:367 +msgid "The valid email address format is userid@example.com" +msgstr "" + +#: admin/wp-security-user-login-menu.php:368 +msgid "Example: %s" +msgstr "" + +#: admin/wp-security-user-login-menu.php:375 +msgid "Enable PHP backtrace in email" +msgstr "" + +#: admin/wp-security-user-login-menu.php:379 +msgid "Check this if you want to include the PHP backtrace in notification emails." +msgstr "" + +#: admin/wp-security-user-login-menu.php:379 +msgid "This is internal coding information which makes it easier to investigate where an issued occurred." +msgstr "" + +#: admin/wp-security-user-login-menu.php:389 +msgid "Currently locked out IP address ranges" +msgstr "" + +#: admin/wp-security-user-login-menu.php:394 +msgid "To see a list of all locked IP addresses and ranges go to the %s tab in the dashboard menu." +msgstr "" + +#: admin/wp-security-user-login-menu.php:399 +msgid "Login lockout IP whitelist settings" +msgstr "" + +#: admin/wp-security-user-login-menu.php:405 +msgid "Enable login lockout IP whitelist" +msgstr "" + +#: admin/wp-security-user-login-menu.php:416 +msgid "The addresses specified here will never be blocked by the login lockout feature." +msgstr "" + +#: admin/wp-security-user-login-menu.php:450 +msgid "User login feature - Delete all failed login records operation failed." +msgstr "" + +#: admin/wp-security-user-login-menu.php:452 +msgid "All records from the failed logins table were deleted successfully." +msgstr "" + +#: admin/wp-security-user-login-menu.php:467 +msgid "This tab displays the failed login attempts for your site." +msgstr "" + +#: admin/wp-security-user-login-menu.php:468 +msgid "The information below can be handy if you need to do security investigations because it will show you the IP range, username and ID (if applicable) and the time/date of the failed login attempt." +msgstr "" + +#: admin/wp-security-user-login-menu.php:469 +msgid "Failed login records that are older than %1$d days are purged automatically." +msgstr "" + +#: admin/wp-security-user-login-menu.php:508 +#: admin/wp-security-user-login-menu.php:517 +msgid "Delete all failed login records" +msgstr "" + +#: admin/wp-security-user-login-menu.php:514 +msgid "Click this button if you wish to delete all failed login records in one go." +msgstr "" + +#: admin/wp-security-user-login-menu.php:544 +msgid "You entered a non numeric value for the logout time period field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-user-login-menu.php:569 +msgid "Setting an expiry period for your WP administration session is a simple way to protect against unauthorized access to your site from your computer." +msgstr "" + +#: admin/wp-security-user-login-menu.php:570 +msgid "This feature allows you to specify a time period in minutes after which the admin session will expire and the user will be forced to log back in." +msgstr "" + +#: admin/wp-security-user-login-menu.php:575 +msgid "Force user logout options" +msgstr "" + +#: admin/wp-security-user-login-menu.php:587 +msgid "Enable force WP user logout" +msgstr "" + +#: admin/wp-security-user-login-menu.php:590 +msgid "Check this if you want to force a wp user to be logged out after a configured amount of time" +msgstr "" + +#: admin/wp-security-user-login-menu.php:594 +msgid "Logout the WP user after XX minutes" +msgstr "" + +#: admin/wp-security-user-login-menu.php:596 +msgid "(Minutes) The user will be forced to log back in after this time period has elapased." +msgstr "" + +#: admin/wp-security-user-login-menu.php:625 +msgid "This tab displays the activity for accounts registered with your site that have logged in using the WordPress login form." +msgstr "" + +#: admin/wp-security-user-login-menu.php:626 +msgid "The information below can be handy if you need to do security investigations because it will show you the last 100 recent login events by username, IP address and time/date." +msgstr "" + +#: admin/wp-security-user-login-menu.php:627 +msgid "Account activity logs that are older than %1$d days are purged automatically." +msgstr "" + +#: admin/wp-security-user-login-menu.php:697 +msgid "Refresh logged in user data" +msgstr "" + +#: admin/wp-security-user-login-menu.php:701 +msgid "Refresh data" +msgstr "" + +#: admin/wp-security-user-login-menu.php:706 +msgid "This tab displays all users who are currently logged into your site." +msgstr "" + +#: admin/wp-security-user-login-menu.php:707 +msgid "If you suspect there is a user or users who are logged in which should not be, you can block them by inspecting the IP addresses from the data below and adding them to your blacklist." +msgstr "" + +#: admin/wp-security-user-login-menu.php:708 +msgid "You can also instantly log them out by clicking on the \"Force logout\" link when you hover over the row in the user id column." +msgstr "" + +#: admin/wp-security-user-login-menu.php:713 +msgid "Currently logged in users" +msgstr "" + +#: admin/wp-security-user-login-menu.php:761 +msgid "WordPress 5.6 introduced a new feature called \"Application passwords\"." +msgstr "" + +#: admin/wp-security-user-login-menu.php:762 +msgid "This allows you to create a token from the WordPress dashboard which then can be used in the authorization header." +msgstr "" + +#: admin/wp-security-user-login-menu.php:763 +msgid "This feature allows you to disable application passwords as they can leave your site vulnerable to social engineering and phishing scams." +msgstr "" + +#: admin/wp-security-user-login-menu.php:780 +#: classes/grade-system/wp-security-feature-item-manager.php:53 +msgid "Disable application password" +msgstr "" + +#: admin/wp-security-user-login-menu.php:783 +msgid "Check this if you want to disable the application password." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:27 +msgid "Manual approval" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:28 +#: classes/grade-system/wp-security-feature-item-manager.php:59 +msgid "Registration CAPTCHA" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:29 +msgid "Registration honeypot" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:55 +msgid "User registration" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:115 +msgid "User registration settings" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:119 +msgid "Manually approve new registrations" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:123 +msgid "If your site allows people to create their own accounts via the WordPress registration form, then you can minimize spam or bogus registrations by manually approving each registration." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:124 +msgid "This feature will automatically set a newly registered account to \"pending\" until the administrator activates it. Therefore undesirable registrants will be unable to log in without your express approval." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:125 +msgid "You can view all accounts which have been newly registered via the handy table below and you can also perform bulk activation/deactivation/deletion tasks on each account." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:142 +msgid "Enable manual approval of new registrations" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:145 +msgid "Check this if you want to automatically disable all newly registered accounts so that you can approve them manually." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:154 +msgid "Approve registered users" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:206 +msgid "This feature allows you to add a CAPTCHA form on the WordPress registration page." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:207 +msgid "Users who attempt to register will also need to enter the answer to a simple mathematical question - if they enter the wrong answer, the plugin will not allow them to register." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:208 +msgid "Therefore, adding a CAPTCHA form on the registration page is another effective yet simple spam registration prevention technique." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:212 +msgid "Registration page CAPTCHA settings" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:219 +msgid "The core default behaviour for WordPress Multi Site regarding user registration is that all users are registered via the main site." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:220 +msgid "Therefore, if you would like to add a CAPTCHA form to the registration page for a Multi Site, please go to \"Registration CAPTCHA\" settings on the main site." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:235 +msgid "Enable CAPTCHA on registration page" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:238 +msgid "Check this if you want to insert a CAPTCHA form on the WordPress user registration page (if you allow user registration)." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:276 +msgid "This feature allows you to add a special hidden \"honeypot\" field on the WordPress registration page. This will only be visible to robots and not humans." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:277 +msgid "Since robots usually fill in every input field from a registration form, they will also submit a value for the special hidden honeypot field." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:279 +msgid "Therefore, if the plugin detects that this field has a value when the registration form is submitted, then the robot which is attempting to register on your site will be redirected to its localhost address - http://127.0.0.1." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:285 +msgid "Registration form honeypot settings" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:296 +msgid "Enable honeypot on registration page" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:299 +msgid "Check this if you want to enable the honeypot feature for the registration page" +msgstr "" + +#: classes/aios-ajax.php:89 +msgid "Invalid IP retrieve method." +msgstr "" + +#: classes/aios-ajax.php:131 +#: wp-security-core.php:258 +msgid "The security check failed; try refreshing the page." +msgstr "" + +#: classes/aios-ajax.php:152 +#: wp-security-core.php:268 +msgid "You are not allowed to run this command." +msgstr "" + +#: classes/aios-ajax.php:173 +#: wp-security-core.php:282 +msgid "Options can only be saved by network admin" +msgstr "" + +#: classes/aios-ajax.php:202 +msgid "The command \"%s\" was not found" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:39 +msgid "Remove WP generator meta tag" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:45 +msgid "Change display name" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:57 +msgid "Registration approval" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:61 +msgid "Enable registration honeypot" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:73 +msgid "WordPress files access" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:77 +msgid "IP and user agent blacklisting" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:81 +msgid "Enable basic firewall" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:82 +msgid "Enable pingback vulnerability protection" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:83 +msgid "Block access to debug log file" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:87 +msgid "Forbid proxy comments" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:88 +msgid "Deny bad queries" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:91 +msgid "5G/6G blacklist" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:97 +msgid "Enable IP blocking for 404 detection" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:101 +msgid "Enable rename login page" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:106 +msgid "Lost password CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:107 +msgid "Custom login CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:108 +msgid "Woo login CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:109 +msgid "Woo lost password CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:110 +msgid "Woo register CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:112 +msgid "Login IP whitelisting" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:114 +msgid "Enable login honeypot" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:118 +msgid "Comment CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:119 +msgid "Block spambots" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:121 +msgid "BuddyPress registration CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:123 +msgid "bbPress new topic CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item.php:29 +msgid "Basic" +msgstr "" + +#: classes/grade-system/wp-security-feature-item.php:31 +msgid "Intermediate" +msgstr "" + +#: classes/grade-system/wp-security-feature-item.php:33 +msgid "Advanced" +msgstr "" + +#: classes/wp-security-captcha.php:47 +#: classes/wp-security-general-init-tasks.php:407 +msgid "Please enter an answer in digits:" +msgstr "Vänligen svara med siffror:" + +#: classes/wp-security-captcha.php:127 +msgid "one" +msgstr "ett" + +#: classes/wp-security-captcha.php:128 +msgid "two" +msgstr "två" + +#: classes/wp-security-captcha.php:129 +msgid "three" +msgstr "tree" + +#: classes/wp-security-captcha.php:130 +msgid "four" +msgstr "fyra" + +#: classes/wp-security-captcha.php:131 +msgid "five" +msgstr "fem" + +#: classes/wp-security-captcha.php:132 +msgid "six" +msgstr "sex" + +#: classes/wp-security-captcha.php:133 +msgid "seven" +msgstr "sju" + +#: classes/wp-security-captcha.php:134 +msgid "eight" +msgstr "åtta" + +#: classes/wp-security-captcha.php:135 +msgid "nine" +msgstr "nio" + +#: classes/wp-security-captcha.php:136 +msgid "ten" +msgstr "tio" + +#: classes/wp-security-captcha.php:137 +msgid "eleven" +msgstr "elva" + +#: classes/wp-security-captcha.php:138 +msgid "twelve" +msgstr "tolv" + +#: classes/wp-security-captcha.php:139 +msgid "thirteen" +msgstr "tretton" + +#: classes/wp-security-captcha.php:140 +msgid "fourteen" +msgstr "fjorton" + +#: classes/wp-security-captcha.php:141 +msgid "fifteen" +msgstr "femton" + +#: classes/wp-security-captcha.php:142 +msgid "sixteen" +msgstr "sexton" + +#: classes/wp-security-captcha.php:143 +msgid "seventeen" +msgstr "sjutton" + +#: classes/wp-security-captcha.php:144 +msgid "eighteen" +msgstr "arton" + +#: classes/wp-security-captcha.php:145 +msgid "nineteen" +msgstr "nitton" + +#: classes/wp-security-captcha.php:146 +msgid "twenty" +msgstr "tjugo" + +#: classes/wp-security-cronjob-handler.php:34 +msgid "Every 15 minutes" +msgstr "" + +#: classes/wp-security-debug-logger.php:46 +msgid "Unable to get the reason why" +msgstr "" + +#: classes/wp-security-debug-logger.php:47 +msgid "Unable to clear the logs" +msgstr "" + +#: classes/wp-security-file-scan.php:85 +msgid "All In One WP Security - File change detected!" +msgstr "" + +#: classes/wp-security-file-scan.php:87 +msgid "A file change was detected on your system for site URL" +msgstr "" + +#: classes/wp-security-file-scan.php:87 +msgid ". Scan was generated on" +msgstr "" + +#: classes/wp-security-file-scan.php:88 +msgid "A summary of the scan results is shown below:" +msgstr "" + +#: classes/wp-security-file-scan.php:91 +msgid "Login to your site to view the scan details." +msgstr "" + +#: classes/wp-security-file-scan.php:313 +msgid "The following files were added to your host" +msgstr "" + +#: classes/wp-security-file-scan.php:315 +#: classes/wp-security-file-scan.php:323 +#: classes/wp-security-file-scan.php:332 +msgid "modified on: " +msgstr "" + +#: classes/wp-security-file-scan.php:321 +msgid "The following files were removed from your host" +msgstr "" + +#: classes/wp-security-file-scan.php:330 +msgid "The following files were changed on your host" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:212 +#: classes/wp-security-general-init-tasks.php:481 +msgid "Application passwords have been disabled by All In One WP Security & Firewall plugin." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:428 +#: classes/wp-security-general-init-tasks.php:541 +#: classes/wp-security-general-init-tasks.php:574 +#: classes/wp-security-user-login.php:137 +#: classes/wp-security-user-registration.php:74 +msgid "ERROR: Your answer was incorrect - please try again." +msgstr "FEL: Ditt svar var fel. Försök igen." + +#: classes/wp-security-general-init-tasks.php:463 +msgid "Enter something special:" +msgstr "Skriv någonting här om du inte är människa:" + +#: classes/wp-security-general-init-tasks.php:476 +msgid "Application passwords" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:485 +msgid "Change setting" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:487 +msgid "Site admin can only change this setting." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:516 +msgid "Error: You entered an incorrect CAPTCHA answer. Please go back and try again." +msgstr "Fel: Du angav fel svar i CAPTCHA-fältet. Gå tillbaka och prova en gång till." + +#: classes/wp-security-general-init-tasks.php:558 +msgid "Your CAPTCHA answer was incorrect - please try again." +msgstr "Ditt CAPTCHA-svar var fel. Försök igen!" + +#: classes/wp-security-general-init-tasks.php:567 +msgid "ERROR: Your IP address is currently locked please contact the administrator!" +msgstr "" + +#. translators: %s: Admin Dashboard > WP Security > Brute Force > Login CAPTCHA Tab Link +#: classes/wp-security-general-init-tasks.php:642 +msgid "Your Google reCAPTCHA site key is wrong. Please fill the correct reCAPTCHA keys %s to use the Google reCAPTCHA feature." +msgstr "" + +#. translators: %s: Admin Dashboard > WP Security > Brute Force > Login CAPTCHA Tab Link +#: classes/wp-security-general-init-tasks.php:642 +#: classes/wp-security-notices.php:99 +msgid "here" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +msgid "Would you like All In One WP Security & Firewall to re-insert the security rules in your .htaccess file which were cleared when you deactivated the plugin?" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +#: templates/may-also-like.php:40 +#: templates/may-also-like.php:43 +#: templates/may-also-like.php:54 +#: templates/may-also-like.php:57 +#: templates/may-also-like.php:68 +#: templates/may-also-like.php:71 +#: templates/may-also-like.php:91 +#: templates/may-also-like.php:103 +#: templates/may-also-like.php:115 +#: templates/may-also-like.php:127 +#: templates/may-also-like.php:139 +#: templates/may-also-like.php:151 +#: templates/may-also-like.php:168 +#: templates/may-also-like.php:171 +#: templates/may-also-like.php:183 +#: templates/may-also-like.php:195 +#: templates/may-also-like.php:207 +#: templates/may-also-like.php:219 +#: templates/may-also-like.php:231 +#: templates/may-also-like.php:243 +#: templates/may-also-like.php:252 +#: templates/may-also-like.php:255 +#: templates/may-also-like.php:264 +#: templates/may-also-like.php:267 +#: templates/may-also-like.php:279 +#: templates/may-also-like.php:297 +#: templates/may-also-like.php:309 +#: templates/may-also-like.php:327 +#: templates/may-also-like.php:339 +#: templates/may-also-like.php:351 +#: templates/may-also-like.php:368 +#: templates/may-also-like.php:380 +msgid "Yes" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +#: templates/may-also-like.php:88 +#: templates/may-also-like.php:100 +#: templates/may-also-like.php:112 +#: templates/may-also-like.php:124 +#: templates/may-also-like.php:136 +#: templates/may-also-like.php:148 +#: templates/may-also-like.php:180 +#: templates/may-also-like.php:192 +#: templates/may-also-like.php:204 +#: templates/may-also-like.php:216 +#: templates/may-also-like.php:228 +#: templates/may-also-like.php:240 +#: templates/may-also-like.php:276 +#: templates/may-also-like.php:294 +#: templates/may-also-like.php:306 +#: templates/may-also-like.php:324 +#: templates/may-also-like.php:336 +#: templates/may-also-like.php:348 +#: templates/may-also-like.php:365 +#: templates/may-also-like.php:377 +#: templates/notices/custom-notice.php:27 +msgid "No" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:674 +msgid "Your registration is pending approval." +msgstr "" + +#: classes/wp-security-notices.php:25 +msgid "The All in One Security plugin has disabled the login whitelist setting that you have enabled in the past." +msgstr "" + +#: classes/wp-security-notices.php:29 +msgid "Your website is running on an Apache webserver, the login whitelisting might not be functional until the recent update of AIOS (because it relied upon Apache-specific module features)." +msgstr "" + +#: classes/wp-security-notices.php:31 +msgid "Your website is running on a non-Apache webserver, so the login whitelisting was not functional until the recent update of AIOS (because it relied upon Apache-specific features)." +msgstr "" + +#: classes/wp-security-notices.php:33 +msgid "It began working with AIOS version 5.0.8." +msgstr "" + +#: classes/wp-security-notices.php:33 +msgid "We have disabled it so that your login page will not be blocked unexpectedly." +msgstr "" + +#: classes/wp-security-notices.php:42 +msgid "Would you like to re-enable login whitelisting?" +msgstr "" + +#: classes/wp-security-notices.php:48 +msgid "Removed database backup feature from the All In One WP Security & Firewall plugin" +msgstr "" + +#: classes/wp-security-notices.php:50 +msgid "Beginning with version 5.0.0, AIOS has replaced the AIOS backup method with the superior UpdraftPlus method." +msgstr "" + +#: classes/wp-security-notices.php:51 +msgid "It remains free and is fully supported by the UpdraftPlus team." +msgstr "" + +#: classes/wp-security-notices.php:54 +msgid "You are seeing this notice because you have previously set up automated database backups in AIOS." +msgstr "" + +#: classes/wp-security-notices.php:55 +msgid "Would you like to set up scheduled backups with UpdraftPlus?" +msgstr "" + +#: classes/wp-security-notices.php:61 +msgid "Setup UpdraftPlus backup plugin" +msgstr "" + +#: classes/wp-security-notices.php:67 +msgid "Important: set up your IP address detection settings" +msgstr "" + +#: classes/wp-security-notices.php:69 +msgid "The All in One Security plugin couldn't be certain about the correct method to detect the IP address for your site visitors with your currently-configured IP address detection settings." +msgstr "" + +#: classes/wp-security-notices.php:70 +msgid "It is important for your security to set the IP address detection settings properly." +msgstr "" + +#: classes/wp-security-notices.php:73 +msgid "Please go to the settings and set them now." +msgstr "" + +#: classes/wp-security-notices.php:79 +msgid "Setup IP address detection settings" +msgstr "" + +#: classes/wp-security-notices.php:85 +msgid "Important: Disabled login whitelist setting" +msgstr "" + +#: classes/wp-security-notices.php:91 +msgid "Turn it back on" +msgstr "" + +#: classes/wp-security-notices.php:92 +msgid "Edit the settings" +msgstr "" + +#: classes/wp-security-notices.php:95 +msgid "Keep it off" +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Hey - We noticed All In One WP Security & Firewall has kept your site safe for a while. If you like us, please consider leaving a positive review to spread the word. Or if you have any issues or questions please leave us a support message %s." +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Thank you so much!" +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Team All In One WP Security & Firewall" +msgstr "" + +#: classes/wp-security-notices.php:109 +msgid "Enhance your security even more by backing up your site" +msgstr "" + +#: classes/wp-security-notices.php:110 +msgid "UpdraftPlus is the world's most trusted backup plugin from the owners of All In One WP Security & Firewall" +msgstr "" + +#: classes/wp-security-notices.php:121 +msgid "After you've secured your site, we recommend you install our WP-Optimize plugin to streamline it for better website performance." +msgstr "" + +#: classes/wp-security-process-renamed-login-page.php:152 +msgid "Not available." +msgstr "" + +#: classes/wp-security-two-factor-login.php:34 +msgid "Two factor authentication - Admin settings" +msgstr "" + +#: classes/wp-security-two-factor-login.php:97 +msgid "Two Factor Auth" +msgstr "" + +#: classes/wp-security-two-factor-login.php:153 +msgid "PHP OpenSSL or mcrypt module required" +msgstr "" + +#: classes/wp-security-two-factor-login.php:153 +msgid "The All In One WP Security plugin's Two Factor Authentication module requires either the PHP openssl (preferred) or mcrypt module to be installed. Please ask your web hosting company to install one of them." +msgstr "" + +#: classes/wp-security-user-login.php:71 +msgid "You have disabled login lockout by defining the AIOS_DISABLE_LOGIN_LOCKOUT constant value as true, and the login lockout setting has enabled it." +msgstr "" + +#. translators: 1: Locked IP Addresses admin page link +#: classes/wp-security-user-login.php:73 +msgid "Delete your login lockout IP from %s and define the AIOS_DISABLE_LOGIN_LOCKOUT constant value as false." +msgstr "" + +#: classes/wp-security-user-login.php:100 +msgid "ERROR: Access from your IP address has been blocked for security reasons. Please contact the administrator." +msgstr "" + +#: classes/wp-security-user-login.php:108 +msgid "Service temporarily unavailable" +msgstr "" + +#: classes/wp-security-user-login.php:163 +msgid "ACCOUNT PENDING: Your account is currently not active. An administrator needs to activate your account before you can login." +msgstr "KONTOT AVVAKTAR: Ditt konto är ännu inte aktivt. Innan du kan logga in, behöver en administratör aktivera kontot." + +#: classes/wp-security-user-login.php:242 +msgid "ERROR: Invalid login credentials." +msgstr "FEL: Inloggningsuppgifterna är felaktiga." + +#: classes/wp-security-user-login.php:392 +msgid "Site Lockout Notification" +msgstr "Blockerad från sajten" + +#: classes/wp-security-user-login.php:393 +msgid "User login lockout events had occurred due to too many failed login attempts or invalid username:" +msgstr "" + +#: classes/wp-security-user-login.php:396 +msgid "Username:" +msgstr "" + +#: classes/wp-security-user-login.php:397 +msgid "IP address:" +msgstr "" + +#: classes/wp-security-user-login.php:399 +msgid "IP range:" +msgstr "" + +#: classes/wp-security-user-login.php:404 +msgid "Log into your site WordPress administration panel to see the duration of the lockout or to unlock the user." +msgstr "" + +#: classes/wp-security-user-login.php:515 +msgid "Unlock request notification" +msgstr "Begäran att häva blockering" + +#: classes/wp-security-user-login.php:516 +msgid "You have requested for the account with email address %s to be unlocked. Please click the link below to unlock your account:" +msgstr "" + +#: classes/wp-security-user-login.php:516 +msgid "Unlock link: %s" +msgstr "" + +#: classes/wp-security-user-login.php:516 +msgid "After clicking the above link you will be able to login to the WordPress administration panel." +msgstr "När du klickat på denna länk så kan du logga in i WordPress administrationspanel." + +#: classes/wp-security-user-login.php:739 +msgid "Your session has expired because it has been over %d minutes since your last login." +msgstr "Din session har avslutets eftersom det gått mer än %d minuter sedan senaste inloggning." + +#: classes/wp-security-user-login.php:740 +#: classes/wp-security-user-login.php:744 +msgid "Please log back in to continue." +msgstr "Var vänlig logga in igen för att fortsätta." + +#: classes/wp-security-user-login.php:743 +msgid "You were logged out because you just changed the \"admin\" username." +msgstr "Du loggades ut eftersom du just bytte användarnamnet \"admin\"." + +#: classes/wp-security-user-login.php:773 +msgid "Request unlock" +msgstr "Begär upplåsning" + +#: classes/wp-security-user-registration.php:68 +msgid "ERROR: You are not allowed to register because your IP address is currently locked!" +msgstr "" + +#: classes/wp-security-utility-ip-address.php:217 +#: classes/wp-security-utility-ip-address.php:231 +#: classes/wp-security-utility-ip-address.php:245 +#: classes/wp-security-utility-ip-address.php:257 +#: classes/wp-security-utility-ip-address.php:269 +msgid " is not a valid ip address format." +msgstr "" + +#: classes/wp-security-utility-ip-address.php:274 +msgid "You cannot ban your own IP address: " +msgstr "" + +#: classes/wp-security-utility.php:254 +msgid "This feature can only be configured by the \"superadmin\" on the main site." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:32 +msgid "ERROR: Unable to process your request!" +msgstr "" + +#: other-includes/wp-security-unlock-request.php:45 +msgid "Please enter a valid email address" +msgstr "Skriv in en giltig e-postadress" + +#: other-includes/wp-security-unlock-request.php:57 +msgid "User account not found!" +msgstr "Användarkonto kunde inte hittas!" + +#: other-includes/wp-security-unlock-request.php:71 +msgid "Error: No locked entry was found in the database with your IP address range." +msgstr "Fel: Databasen innehåller inget låst adressblock med din IP-address!" + +#: other-includes/wp-security-unlock-request.php:76 +msgid "An email has been sent to you with the unlock instructions." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:93 +msgid "You are here because you have been locked out due to too many incorrect login attempts." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:94 +msgid "Please enter your email address and you will receive an email with instructions on how to unlock yourself." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:104 +msgid "Email Address" +msgstr "Mejladress" + +#: other-includes/wp-security-unlock-request.php:108 +msgid "Send unlock request" +msgstr "" + +#: templates/admin/incompatible-plugin.php:6 +msgid "Two Factor Authentication" +msgstr "" + +#: templates/admin/incompatible-plugin.php:10 +msgid "Two Factor Authentication currently disabled" +msgstr "" + +#: templates/admin/incompatible-plugin.php:12 +#: templates/admin/incompatible-plugin.php:16 +msgid "Two factor authentication in All In One WP Security is currently disabled because the incompatible plugin %s is active." +msgstr "" + +#: templates/automated-database-backup.php:4 +msgid "Automated scheduled backups" +msgstr "" + +#: templates/automated-database-backup.php:9 +msgid "Automate backup in the UpdraftPlus plugin" +msgstr "" + +#: templates/automated-database-backup.php:19 +msgid "The AIOS 5.0.0 version release has removed the automated backup feature." +msgstr "" + +#: templates/automated-database-backup.php:20 +msgid "The AIOS automated backup had issues that made it less robust than we could be happy with." +msgstr "" + +#: templates/automated-database-backup.php:21 +msgid "Follow this link to automate backups in the superior UpdraftPlus backup plugin." +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:5 +msgid "Each IP address must be on a new line." +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:6 +msgid "To specify an IPv4 range use a wildcard \"*\" character. Acceptable ways to use wildcards is shown in the examples below:" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:7 +msgid "Example 1: 195.47.89.*" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:8 +msgid "Example 2: 195.47.*.*" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:9 +msgid "Example 3: 195.*.*.*" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:10 +msgid "To specify an IPv6 range use CIDR format as shown in the examples below:" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:11 +msgid "Example 4: 2401:4900:54c3:af15:2:2:5dc0:0/112" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:12 +msgid "Example 5: 2001:db8:1263::/48" +msgstr "" + +#: templates/may-also-like.php:5 +msgid "All-In-One Security (AIOS) Free vs Premium Comparison Chart" +msgstr "" + +#: templates/may-also-like.php:7 +msgid "FAQs" +msgstr "" + +#: templates/may-also-like.php:9 +msgid "Ask a pre-sales question" +msgstr "" + +#: templates/may-also-like.php:17 +msgid "All In One WP Security & Firewall Free" +msgstr "" + +#: templates/may-also-like.php:26 +#: templates/may-also-like.php:386 +msgid "Installed" +msgstr "" + +#: templates/may-also-like.php:29 +#: templates/may-also-like.php:389 +msgid "Upgrade now" +msgstr "" + +#: templates/may-also-like.php:34 +msgid "Login security feature suite" +msgstr "" + +#: templates/may-also-like.php:35 +msgid "Protect against brute-force attacks and keep bots at bay." +msgstr "" + +#: templates/may-also-like.php:35 +msgid "AIOS takes WordPress' default login security features to a whole new level." +msgstr "" + +#: templates/may-also-like.php:37 +msgid "To see all login security features, visit %s" +msgstr "" + +#: templates/may-also-like.php:48 +msgid "Firewall and file protection feature suite" +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Protection from the latest exploits." +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Activate firewall settings ranging from basic, intermediate and advanced." +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Get comprehensive, instant protection with All-in-One Security." +msgstr "" + +#: templates/may-also-like.php:51 +msgid "To see all firewall and file protection features, visit %s" +msgstr "" + +#: templates/may-also-like.php:62 +msgid "Content protection feature suite" +msgstr "" + +#: templates/may-also-like.php:63 +msgid "Eliminate spam and protect your content to dramatically improve your website's interactions with search engines." +msgstr "" + +#: templates/may-also-like.php:65 +msgid "To see all content protection features, visit %s" +msgstr "" + +#: templates/may-also-like.php:76 +msgid "Malware scanning" +msgstr "" + +#: templates/may-also-like.php:77 +msgid "Finding out by accident that your site has been infected with malware is too late." +msgstr "" + +#: templates/may-also-like.php:79 +msgid "Malware can have a dramatic effect on your site's search rankings and you may not even know about it." +msgstr "" + +#: templates/may-also-like.php:79 +msgid "It can slow your website down, access customer data, send unsolicited emails, change your content or prevent users from accessing it." +msgstr "" + +#: templates/may-also-like.php:84 +msgid "Automatic malware scanning" +msgstr "" + +#: templates/may-also-like.php:85 +msgid "Best-in-class scanning for the latest malware, trojans and spyware 24/7." +msgstr "" + +#: templates/may-also-like.php:96 +msgid "Response time monitoring" +msgstr "" + +#: templates/may-also-like.php:97 +msgid "You'll know immediately if your website's response time is negatively affected." +msgstr "" + +#: templates/may-also-like.php:108 +msgid "Up-time monitoring" +msgstr "" + +#: templates/may-also-like.php:109 +msgid "AIOS checks your website's uptime every 5 minutes." +msgstr "" + +#: templates/may-also-like.php:109 +msgid "We'll notify you straight away if your site/server goes down." +msgstr "" + +#: templates/may-also-like.php:120 +msgid "Prevents blacklisting by search engines" +msgstr "" + +#: templates/may-also-like.php:121 +msgid "AIOS monitors your site's blacklist status daily." +msgstr "" + +#: templates/may-also-like.php:121 +msgid "We'll notify you within 24 hours if something's amiss so you can take action, before it's too late." +msgstr "" + +#: templates/may-also-like.php:132 +msgid "Flexible assignment" +msgstr "" + +#: templates/may-also-like.php:133 +msgid "Register and remove websites from the scanning service at any time." +msgstr "" + +#: templates/may-also-like.php:144 +msgid "Malware reports" +msgstr "" + +#: templates/may-also-like.php:145 +msgid "Reports are available via the 'My Account' page and directly via email." +msgstr "" + +#: templates/may-also-like.php:156 +msgid "Flexible two-factor authentication" +msgstr "" + +#: templates/may-also-like.php:157 +msgid "With Two-Factor Authentication (TFA) users enter their username and password and a one-time code sent to a device to login." +msgstr "" + +#: templates/may-also-like.php:159 +msgid "TFA is a feature in both our free and premium packages, but AIOS Premium affords whole new levels of control over how TFA is implemented." +msgstr "" + +#: templates/may-also-like.php:164 +msgid "Authenticator apps" +msgstr "" + +#: templates/may-also-like.php:165 +msgid "Supports TOTP and HOTP protocols." +msgstr "" + +#: templates/may-also-like.php:165 +msgid "TFA Can be used with Google Authenticator, Microsoft Authenticator, Authy and many more." +msgstr "" + +#: templates/may-also-like.php:176 +msgid "Role specific configuration" +msgstr "" + +#: templates/may-also-like.php:177 +msgid "Make it compulsory for certain roles e.g. for admin and editor roles." +msgstr "" + +#: templates/may-also-like.php:188 +msgid "Require TFA after a set time period" +msgstr "" + +#: templates/may-also-like.php:189 +msgid "For example you could require all admins to have TFA once their accounts are a week old." +msgstr "" + +#: templates/may-also-like.php:200 +msgid "Trusted devices - control how often TFA is required" +msgstr "" + +#: templates/may-also-like.php:201 +msgid "Ask for TFA after a chosen number of days for trusted devices instead of on every login." +msgstr "" + +#: templates/may-also-like.php:212 +msgid "Anti-bot protection" +msgstr "" + +#: templates/may-also-like.php:213 +msgid "Option to hide the existence of forms on WooCommerce login pages unless JavaScript is active." +msgstr "" + +#: templates/may-also-like.php:224 +msgid "Customise TFA design layout" +msgstr "" + +#: templates/may-also-like.php:225 +msgid "Customise the design of TFA so it aligns with your existing web design." +msgstr "" + +#: templates/may-also-like.php:236 +msgid "TFA emergency codes" +msgstr "" + +#: templates/may-also-like.php:237 +msgid "Generate a one-time use emergency code to allow access if your device is lost." +msgstr "" + +#: templates/may-also-like.php:248 +msgid "TFA multisite compatibility" +msgstr "" + +#: templates/may-also-like.php:249 +msgid "TFA is Compatible with multisite networks and sub-sites." +msgstr "" + +#: templates/may-also-like.php:260 +msgid "TFA support for common login forms" +msgstr "" + +#: templates/may-also-like.php:261 +msgid "Supports WooCommerce, Affiliates-WP and Theme my Login login forms." +msgstr "" + +#: templates/may-also-like.php:272 +msgid "TFA support for other login forms" +msgstr "" + +#: templates/may-also-like.php:273 +msgid "Supports Elementor Pro, bbPress and all third-party login forms without any further coding needed." +msgstr "" + +#: templates/may-also-like.php:284 +msgid "Smart 404 blocking" +msgstr "" + +#: templates/may-also-like.php:285 +msgid "404 errors can occur when someone legitimately mistypes a URL, but they're also generated by hackers searching for weaknesses in your site." +msgstr "" + +#: templates/may-also-like.php:290 +msgid "Automatically and permanently blocks bots producing 404s" +msgstr "" + +#: templates/may-also-like.php:291 +msgid "AIOS Premium provides more protection than the competition by automatically and permanently blocking IP addresses of bots and hackers based on how many 404 errors they generate." +msgstr "" + +#: templates/may-also-like.php:302 +msgid "404 error charts" +msgstr "" + +#: templates/may-also-like.php:303 +msgid "Handy charts keep you informed of how many 404s have occurred and which IP address or country is producing them." +msgstr "" + +#: templates/may-also-like.php:314 +msgid "Country blocking" +msgstr "" + +#: templates/may-also-like.php:315 +msgid "Most malicious attacks come from a handful of countries and so it's possible to prevent most attacks with our country blocking tool." +msgstr "" + +#: templates/may-also-like.php:320 +msgid "Block traffic based on country of origin" +msgstr "" + +#: templates/may-also-like.php:321 +msgid "AIOS Premium utilises an IP database that promises 99.5% accuracy." +msgstr "" + +#: templates/may-also-like.php:332 +msgid "Block traffic to specific pages based on country of origin" +msgstr "" + +#: templates/may-also-like.php:333 +msgid "Block access to your whole site or on a page-by-page basis." +msgstr "" + +#: templates/may-also-like.php:344 +msgid "Whitelist some users from blocked countries" +msgstr "" + +#: templates/may-also-like.php:345 +msgid "Whitelist IP addresses or IP ranges even if they are part of a blocked country." +msgstr "" + +#: templates/may-also-like.php:356 +msgid "Premium support" +msgstr "" + +#: templates/may-also-like.php:361 +msgid "Unlimited support" +msgstr "" + +#: templates/may-also-like.php:362 +msgid "Personalised, email support from our team of Security experts, as and when you need it." +msgstr "" + +#: templates/may-also-like.php:373 +msgid "Guaranteed response time" +msgstr "" + +#: templates/may-also-like.php:374 +msgid "We offer a guaranteed response time of three days." +msgstr "" + +#: templates/may-also-like.php:374 +msgid "99% of our Premium customers receive a response to their enquiry within 24 hours during the working week." +msgstr "" + +#: templates/may-also-like.php:397 +msgid "Our other plugins" +msgstr "" + +#: templates/may-also-like.php:411 +msgid "UpdraftPlus – the ultimate protection for your site, hard work and business" +msgstr "" + +#: templates/may-also-like.php:412 +msgid "Simplifies backups and restoration." +msgstr "" + +#: templates/may-also-like.php:412 +msgid "It is the world's highest ranking and most popular scheduled backup plugin, with over three million currently-active installs." +msgstr "" + +#: templates/may-also-like.php:413 +#: templates/may-also-like.php:419 +#: templates/may-also-like.php:425 +#: templates/may-also-like.php:431 +msgid "Try for free" +msgstr "" + +#: templates/may-also-like.php:417 +msgid "WP-Optimize – keep your database fast and efficient" +msgstr "" + +#: templates/may-also-like.php:418 +msgid "Makes your site fast and efficient." +msgstr "" + +#: templates/may-also-like.php:418 +msgid "It cleans the database, compresses images and caches pages for ultimate speed." +msgstr "" + +#: templates/may-also-like.php:423 +msgid "UpdraftCentral – save hours managing multiple WP sites from one place" +msgstr "" + +#: templates/may-also-like.php:424 +msgid "Highly efficient way to manage, optimize, update and backup multiple websites from one place." +msgstr "" + +#: templates/may-also-like.php:429 +msgid "Easy Updates Manager" +msgstr "" + +#: templates/may-also-like.php:430 +msgid "Keeps your WordPress site up to date and bug free." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:2 +msgid "IP address detection settings" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:6 +msgid "The IP address detection settings allow you to specify how visitors' IP addresses are made known to PHP (and hence to WordPress and its plugins)." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:7 +msgid "Usually, this is automatic and there is only one choice." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:8 +msgid "However in some setups, such as those using proxies (including load-balancers and security firewalls like Cloudflare), it may be necessary to set this manually." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:9 +msgid "Attention" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:9 +msgid "It is important to set this correctly - otherwise you may make it possible for a hacker to ban all your visitors (e.g. via banning Cloudflare from connecting to you) instead of being banned himself." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:9 +msgid "The default is to use the REMOTE_ADDR PHP server variable. If this variable does not contain the visitor's IP address, then whilst you can make a different selection below, it is better to ask your web hosting company to have it correctly set." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:10 +msgid "This is the most secure setup, because when set correctly it is immune from being spoofed by an attacker." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:16 +msgid "You have no available IP address detection method(s); you must contact your web hosting company." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:22 +#: templates/menus/settings/advanced-settings.php:27 +#: templates/menus/settings/advanced-settings.php:32 +msgid "Your detected IP address according to %s:" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:38 +msgid "If your site is setup on localhost, you won't see your external IP address using your server's IP detection setting; but on a localhost-served site (not available to the outside world), the setting is irrelevant and can be ignored." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:61 +msgid "Choose a $_SERVER variable you would like to detect visitors' IP address using." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:67 +msgid "If your chosen server variable fails the plugin will automatically fall back to retrieving the IP address from $_SERVER[\"REMOTE_ADDR\"]" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:73 +msgid "Your IP address if using this setting:" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:75 +msgid "fetching..." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:81 +#: templates/menus/settings/advanced-settings.php:190 +msgid "getting..." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:89 +msgid "look-up possibly blocked by an ad-blocker or similar tool" +msgstr "" + +#: templates/notices/cookie-based-brute-force-prevention-disabled.php:4 +msgid "Cookie based brute force login prevention currently disabled" +msgstr "" + +#: templates/notices/cookie-based-brute-force-prevention-disabled.php:6 +msgid "Cookie based brute force login prevention is currently disabled via the AIOS_DISABLE_COOKIE_BRUTE_FORCE_PREVENTION constant (which is mostly likely to be defined in your wp-config.php)" +msgstr "" + +#: templates/notices/disable-login-whitelist.php:4 +msgid "Login whitelisting currently disabled" +msgstr "" + +#: templates/notices/disable-login-whitelist.php:6 +msgid "Login whitelisting is currently disabled via the AIOS_DISABLE_LOGIN_WHITELIST constant (which is mostly likely to be defined in your wp-config.php)" +msgstr "" + +#: templates/notices/horizontal-notice.php:8 +#: templates/notices/horizontal-notice.php:40 +msgid "notice image" +msgstr "" + +#: templates/notices/horizontal-notice.php:18 +msgid "Ok, you deserve it" +msgstr "" + +#: templates/notices/horizontal-notice.php:22 +msgid "Maybe later" +msgstr "" + +#: templates/notices/horizontal-notice.php:26 +msgid "Never" +msgstr "" + +#: templates/notices/horizontal-notice.php:66 +msgid "Get UpdraftCentral" +msgstr "" + +#: templates/notices/horizontal-notice.php:68 +msgid "Get UpdraftPlus" +msgstr "" + +#: templates/notices/horizontal-notice.php:70 +msgid "Get WP-Optimize" +msgstr "" + +#: templates/notices/horizontal-notice.php:72 +msgid "Find out more." +msgstr "" + +#: templates/notices/horizontal-notice.php:74 +msgid "Sign up" +msgstr "" + +#: templates/notices/horizontal-notice.php:76 +msgid "Go there" +msgstr "" + +#: templates/notices/horizontal-notice.php:78 +msgid "Read more" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:4 +msgid "Dismiss (for %s months)" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:6 +msgid "Thank you for installing All In One WP Security & Firewall!" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:13 +msgid "Super-charge and secure your WordPress site even more with our other top plugins:" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:17 +msgid "%s makes your site fast and efficient. It cleans the database, compresses images and caches pages for ultimate speed." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:21 +msgid "%s simplifies backups and restoration. It is the world's highest ranking and most popular scheduled backup plugin, with over three million currently-active installs." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:25 +msgid "%s is a highly efficient way to manage, optimize, update and backup multiple websites from one place." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:29 +msgid "%s is a WordPress subscription extension for WooCommerce store owners." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:33 +msgid "More quality plugins" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:33 +msgid "Premium WooCommerce plugins" +msgstr "" + +#: templates/partials/non-apache-feature-notice.php:9 +msgid "This feature works only on the Apache server." +msgstr "" + +#: templates/partials/non-apache-feature-notice.php:10 +msgid "You are using the non-apache server %s, so this feature won't work on your site." +msgstr "" + +#: wp-security-core.php:236 +#: wp-security.php:45 +msgid "This plugin requires PHP version %s." +msgstr "" + +#: wp-security-core.php:237 +msgid "Current site PHP version is %s." +msgstr "" + +#: wp-security-core.php:238 +#: wp-security.php:47 +msgid "You will need to ask your web hosting company to upgrade." +msgstr "" + +#: wp-security-core.php:397 +msgid "Error:" +msgstr "" + +#: wp-security-core.php:397 +msgid "template not found" +msgstr "" + +#: wp-security.php:44 +msgid "All In One WP Security and Firewall plugin has been deactivated." +msgstr "" + +#: wp-security.php:46 +msgid "Your current PHP version is %s." +msgstr "" diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-zh_CN.mo b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-zh_CN.mo new file mode 100755 index 00000000..6207d690 Binary files /dev/null and b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-zh_CN.mo differ diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-zh_CN.po b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-zh_CN.po new file mode 100755 index 00000000..d4fc42e7 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall-zh_CN.po @@ -0,0 +1,6152 @@ +msgid "" +msgstr "" +"Project-Id-Version: All In One WP Security vv2.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-04-18 18:26+0800\n" +"PO-Revision-Date: 2017-04-18 18:26+0800\n" +"Last-Translator: 言午一郎 \n" +"Language-Team: \n" +"Language: zh\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=1;\n" +"X-Generator: Poedit 1.8.1\n" +"X-Poedit-Basepath: ../\n" +"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SourceCharset: utf-8\n" +"X-Textdomain-Support: yes\n" + +#. Plugin Name of the plugin +msgid "All In One WP Security" +msgstr "" + +#. Plugin URI of the plugin +msgid "https://wordpress.org/plugins/all-in-one-wp-security-and-firewall/" +msgstr "" + +#. Description of the plugin +msgid "All round best WordPress security plugin!" +msgstr "" + +#. Author of the plugin +msgid "All In One WP Security & Firewall Team" +msgstr "" + +#. Author URI of the plugin +msgid "https://teamupdraft.com/" +msgstr "" + +#: admin/general/wp-security-list-table.php:483 +msgid "Are you sure you want to perform this bulk action?" +msgstr "" + +#: admin/wp-security-admin-init.php:259 +msgid "Unexpected response:" +msgstr "" + +#: admin/wp-security-admin-init.php:290 +msgid "Enjoyed %1$s? Please leave us a %2$s rating. We really appreciate your support!" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:414 +#: classes/wp-security-two-factor-login.php:95 +msgid "WP Security" +msgstr "WP 安全" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:415 +#: admin/wp-security-dashboard-menu.php:26 +#: admin/wp-security-dashboard-menu.php:76 +msgid "Dashboard" +msgstr "控制板" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:416 +#: admin/wp-security-settings-menu.php:95 +msgid "Settings" +msgstr "设置" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:417 +msgid "User Accounts" +msgstr "用户账户" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:418 +msgid "User Login" +msgstr "用户登录" + +#: admin/wp-security-admin-init.php:419 +msgid "User Registration" +msgstr "用户注册" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:420 +msgid "Database Security" +msgstr "数据库安全" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:424 +msgid "Filesystem Security" +msgstr "文件系统安全" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:429 +msgid "Blacklist Manager" +msgstr "黑名单管理器" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:434 +#: admin/wp-security-firewall-menu.php:60 +msgid "Firewall" +msgstr "防火墙" + +#: admin/wp-security-admin-init.php:436 +msgid "Brute Force" +msgstr "暴力破解" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:437 +msgid "Spam Prevention" +msgstr "垃圾防护" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:441 +#: admin/wp-security-filescan-menu.php:53 +msgid "Scanner" +msgstr "扫描器" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-init.php:443 +#: admin/wp-security-maintenance-menu.php:51 +msgid "Maintenance" +msgstr "网站维护" + +#: admin/wp-security-admin-init.php:444 +#: admin/wp-security-misc-options-menu.php:57 +msgid "Miscellaneous" +msgstr "其他" + +#: admin/wp-security-admin-init.php:445 +#: admin/wp-security-tools-menu.php:64 +msgid "Tools" +msgstr "" + +#: admin/wp-security-admin-init.php:457 +msgid "Premium Upgrade" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-admin-menu.php:67 +msgid "Settings successfully updated." +msgstr "设置已成功更新" + +#: admin/wp-security-admin-menu.php:77 +msgid "Successfully deleted the selected record(s)." +msgstr "" + +#: admin/wp-security-admin-menu.php:86 +msgid "Failed to delete the selected record(s)." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:25 +msgid "Ban users" +msgstr "禁止用户" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:51 +msgid "Blacklist manager" +msgstr "黑名单管理器" + +#: admin/wp-security-blacklist-menu.php:132 +#: admin/wp-security-firewall-menu.php:1233 +#: admin/wp-security-list-404.php:234 +#: admin/wp-security-list-comment-spammer-ip.php:205 +msgid "The plugin was unable to write to the .htaccess file. Please edit file manually." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:139 +msgid "Ban IPs or user agents" +msgstr "禁止IP地址或用户代理" + +#: admin/wp-security-blacklist-menu.php:142 +msgid "The All In One WP Security Blacklist feature gives you the option of banning certain host IP addresses or ranges and also user agents." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:143 +msgid "This feature will deny total site access for users which have IP addresses or user agents matching those which you have configured in the settings below." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:144 +msgid "The plugin achieves this by making appropriate modifications to your .htaccess file." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:145 +msgid "By blocking people, you are using the most secure first line of defence, which denies all access to blacklisted visitors as soon as they hit your hosting server." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:154 +#: admin/wp-security-firewall-menu.php:1055 +#: templates/may-also-like.php:20 +msgid "All In One WP Security & Firewall Premium" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:155 +#: admin/wp-security-firewall-menu.php:1056 +msgid "You may also be interested in %s." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "This plugin adds a number of extra features including %s and %s." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "smart 404 blocking" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:156 +#: admin/wp-security-firewall-menu.php:1057 +msgid "country IP blocking" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:170 +msgid "IP hosts and user agent blacklist settings" +msgstr "IP和用户代理黑名单设置" + +#: admin/wp-security-blacklist-menu.php:182 +#: admin/wp-security-brute-force-menu.php:193 +#: admin/wp-security-brute-force-menu.php:331 +msgid "must read this message" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:183 +#: admin/wp-security-brute-force-menu.php:194 +msgid "This feature can lock you out of admin if it doesn't work correctly on your site. You %s before activating this feature." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:189 +msgid "Enable IP or user agent blacklisting" +msgstr "启用IP和用户代理黑名单" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:192 +msgid "Check this if you want to enable the banning (or blacklisting) of selected IP addresses and/or user agents specified in the settings below" +msgstr "如果你想禁止(或黑名单)指定IP地址或用户代理,请在下面设定。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:196 +msgid "Enter IP addresses:" +msgstr "输入IP地址:" + +#: admin/wp-security-blacklist-menu.php:200 +msgid "Enter one or more IP addresses or IP ranges." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:205 +msgid "Enter user agents:" +msgstr "输入用户代理:" + +#: admin/wp-security-blacklist-menu.php:210 +msgid "Enter one or more user agent strings." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:211 +#: admin/wp-security-brute-force-menu.php:374 +#: admin/wp-security-brute-force-menu.php:408 +#: admin/wp-security-brute-force-menu.php:431 +#: admin/wp-security-brute-force-menu.php:452 +#: admin/wp-security-filescan-menu.php:309 +#: admin/wp-security-filescan-menu.php:326 +#: admin/wp-security-firewall-menu.php:175 +#: admin/wp-security-firewall-menu.php:212 +#: admin/wp-security-firewall-menu.php:232 +#: admin/wp-security-firewall-menu.php:258 +#: admin/wp-security-firewall-menu.php:385 +#: admin/wp-security-firewall-menu.php:415 +#: admin/wp-security-firewall-menu.php:446 +#: admin/wp-security-firewall-menu.php:474 +#: admin/wp-security-firewall-menu.php:503 +#: admin/wp-security-firewall-menu.php:681 +#: admin/wp-security-firewall-menu.php:699 +#: admin/wp-security-firewall-menu.php:737 +#: admin/wp-security-firewall-menu.php:868 +#: admin/wp-security-firewall-menu.php:1087 +#: admin/wp-security-firewall-menu.php:1110 +#: admin/wp-security-spam-menu.php:186 +#: admin/wp-security-spam-menu.php:221 +#: admin/wp-security-spam-menu.php:390 +#: admin/wp-security-spam-menu.php:430 +#: admin/wp-security-user-login-menu.php:362 +#: templates/info/ip-address-ip-range-info.php:2 +#: templates/menus/settings/advanced-settings.php:63 +msgid "More info" +msgstr "更多信息" + +#: admin/wp-security-blacklist-menu.php:214 +msgid "Each user agent string must be on a new line." +msgstr "" + +#: admin/wp-security-blacklist-menu.php:215 +msgid "Example 1 - A single user agent string to block:" +msgstr "" + +#: admin/wp-security-blacklist-menu.php:217 +msgid "Example 2 - A list of more than 1 user agent strings to block" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-blacklist-menu.php:225 +#: admin/wp-security-brute-force-menu.php:213 +#: admin/wp-security-brute-force-menu.php:686 +#: admin/wp-security-brute-force-menu.php:806 +#: admin/wp-security-brute-force-menu.php:868 +#: admin/wp-security-filescan-menu.php:351 +#: admin/wp-security-filesystem-menu.php:242 +#: admin/wp-security-firewall-menu.php:945 +#: admin/wp-security-firewall-menu.php:1129 +#: admin/wp-security-misc-options-menu.php:167 +#: admin/wp-security-misc-options-menu.php:218 +#: admin/wp-security-misc-options-menu.php:278 +#: admin/wp-security-settings-menu.php:619 +#: admin/wp-security-settings-menu.php:680 +#: admin/wp-security-spam-menu.php:233 +#: admin/wp-security-spam-menu.php:407 +#: admin/wp-security-spam-menu.php:526 +#: admin/wp-security-spam-menu.php:588 +#: admin/wp-security-user-login-menu.php:384 +#: admin/wp-security-user-login-menu.php:422 +#: admin/wp-security-user-login-menu.php:601 +#: admin/wp-security-user-login-menu.php:788 +#: admin/wp-security-user-registration-menu.php:150 +#: admin/wp-security-user-registration-menu.php:242 +#: admin/wp-security-user-registration-menu.php:305 +#: templates/menus/settings/advanced-settings.php:217 +msgid "Save settings" +msgstr "保存设置" + +#: admin/wp-security-brute-force-menu.php:33 +#: admin/wp-security-brute-force-menu.php:759 +#: admin/wp-security-dashboard-menu.php:651 +msgid "Rename login page" +msgstr "重命名登录页面" + +#: admin/wp-security-brute-force-menu.php:34 +#: admin/wp-security-brute-force-menu.php:154 +msgid "Cookie based brute force prevention" +msgstr "基于 Cookie 的强力预防" + +#: admin/wp-security-brute-force-menu.php:35 +#: classes/grade-system/wp-security-feature-item-manager.php:105 +msgid "Login CAPTCHA" +msgstr "登录验证码" + +#: admin/wp-security-brute-force-menu.php:36 +#: admin/wp-security-brute-force-menu.php:746 +msgid "Login whitelist" +msgstr "登录白名单" + +#: admin/wp-security-brute-force-menu.php:37 +msgid "Honeypot" +msgstr "蜜罐" + +#: admin/wp-security-brute-force-menu.php:67 +msgid "Brute force" +msgstr "暴力破解" + +#: admin/wp-security-brute-force-menu.php:105 +msgid "Please enter a value for your login page slug." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:109 +msgid "You cannot use the value \"wp-admin\" for your login page slug." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:111 +msgid "You must use alpha numeric characters for your login page slug." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:116 +#: admin/wp-security-filescan-menu.php:174 +#: admin/wp-security-firewall-menu.php:151 +#: admin/wp-security-firewall-menu.php:1011 +#: admin/wp-security-spam-menu.php:101 +#: admin/wp-security-spam-menu.php:270 +#: admin/wp-security-spam-menu.php:302 +#: admin/wp-security-user-login-menu.php:184 +#: admin/wp-security-user-login-menu.php:553 +#: templates/partials/non-apache-feature-notice.php:9 +msgid "Attention:" +msgstr "注意:" + +#: admin/wp-security-brute-force-menu.php:133 +msgid "Could not delete the Cookie-based directives from the .htaccess file. Please check the file permissions." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:155 +msgid "Login page white list" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:156 +msgid "An effective Brute Force prevention technique is to change the default WordPress login page URL." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:157 +msgid "Normally if you wanted to login to WordPress you would type your site's home URL followed by wp-login.php." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:158 +msgid "This feature allows you to change the login URL by setting your own slug and renaming the last portion of the login URL which contains the wp-login.php to any string that you like." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:159 +msgid "By doing this, malicious bots and hackers will not be able to access your login page because they will not know the correct login page URL." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:161 +msgid "You may also be interested in the following alternative brute force prevention features:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:172 +msgid "Your WordPress login page URL has been renamed." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:173 +msgid "Your current login URL is:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:181 +msgid "Rename login page settings" +msgstr "重命名登录页面设置" + +#: admin/wp-security-brute-force-menu.php:195 +msgid "NOTE: If you are hosting your site on WPEngine or a provider which performs server caching, you will need to ask the host support people to NOT cache your renamed login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:200 +msgid "Enable rename login page feature" +msgstr "启用重命名登录页面功能" + +#: admin/wp-security-brute-force-menu.php:203 +msgid "Check this if you want to enable the rename login page feature" +msgstr "如果要启用重命名登录页功能,请选中此项" + +#: admin/wp-security-brute-force-menu.php:207 +msgid "Login page URL" +msgstr "登陆页链接" + +#: admin/wp-security-brute-force-menu.php:209 +msgid "Enter a string which will represent your secure login page slug. You are encouraged to choose something which is hard to guess and only you will remember." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:243 +msgid "Settings have not been saved - your secret word must consist only of alphanumeric characters, ie, letters and/or numbers only." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:257 +msgid "You have successfully enabled the cookie based brute force prevention feature" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:258 +msgid "From now on you will need to log into your WP Admin using the following URL:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:260 +msgid "It is important that you save this URL value somewhere in case you forget it, OR," +msgstr "" + +#: admin/wp-security-brute-force-menu.php:261 +msgid "simply remember to add a \"?%s=1\" to your current site URL address." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:265 +msgid "You have successfully saved cookie based brute force prevention feature settings." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-brute-force-menu.php:295 +msgid "Brute force prevention firewall settings" +msgstr "强力预防防火墙设置" + +#: admin/wp-security-brute-force-menu.php:300 +msgid "A Brute Force Attack is when a hacker tries many combinations of usernames and passwords until they succeed in guessing the right combination." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:301 +msgid "Due to the fact that at any one time there may be many concurrent login attempts occurring on your site via malicious automated robots, this also has a negative impact on your server's memory and performance." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:302 +msgid "The features in this tab will stop the majority of brute force login attacks thus providing even better protection for your WP login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:307 +#: admin/wp-security-firewall-menu.php:654 +msgid "backup" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:308 +msgid "video tutorial" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:309 +msgid "To learn more about how to use this feature, please watch the following %s." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:310 +#: admin/wp-security-brute-force-menu.php:758 +msgid "Cookie-Based Brute Force Login Prevention" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:320 +#: admin/wp-security-user-login-menu.php:253 +msgid "Cookie based brute force login prevention" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:331 +msgid "This feature can lock you out of admin if it doesn't work correctly on your site. You " +msgstr "" + +#: admin/wp-security-brute-force-menu.php:342 +msgid "The cookie test was successful. You can now enable this feature." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:350 +msgid "The cookie test failed on this server. Consequently, this feature cannot be used on this site." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:357 +msgid "Before using this feature, you must perform a cookie test first." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:359 +msgid "This ensures that your browser cookie is working correctly and that you won't lock yourself out." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:364 +msgid "Perform cookie test" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:370 +#: classes/grade-system/wp-security-feature-item-manager.php:103 +msgid "Enable brute force attack prevention" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:373 +msgid "Check this if you want to protect your login page from Brute Force Attack." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:378 +msgid "This feature will deny access to your WordPress login page for all people except those who have a special cookie in their browser." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:380 +msgid "To use this feature do the following:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:382 +msgid "1) Enable the checkbox." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:384 +msgid "2) Enter a secret word consisting of alphanumeric characters which will be difficult to guess. This secret word will be useful whenever you need to know the special URL which you will use to access the login page (see point below)." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:386 +msgid "3) You will then be provided with a special login URL. You will need to use this URL to login to your WordPress site instead of the usual login URL. NOTE: The system will deposit a special cookie in your browser which will allow you access to the WordPress administration login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:388 +msgid "Any person trying to access your login page who does not have the special cookie in their browser will be automatically blocked." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:395 +msgid "Secret word" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:397 +msgid "Choose a secret word consisting of alphanumeric characters which you can use to access your special URL. Your are highly encouraged to choose a word which will be difficult to guess." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:401 +msgid "Re-direct URL" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:405 +msgid "Specify a URL to redirect a hacker to when they try to access your WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:412 +msgid "The URL specified here can be any site's URL and does not have to be your own. For example you can be as creative as you like and send hackers to the CIA or NSA home page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:414 +msgid "This field will default to: http://127.0.0.1 if you do not enter a value." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:416 +msgid "Useful Tip:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:418 +msgid "It's a good idea to not redirect attempted brute force login attempts to your site because it increases the load on your server." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:420 +msgid "Redirecting a hacker or malicious bot back to \"http://127.0.0.1\" is ideal because it deflects them back to their own local host and puts the load on their server instead of yours." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:427 +msgid "My site has posts or pages which are password protected" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:430 +msgid "Check this if you are using the native WordPress password protection feature for some or all of your blog posts or pages." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:435 +msgid "In the cases where you are protecting some of your posts or pages using the in-built WordPress password protection feature, a few extra lines of directives and exceptions need to be added so that people trying to access pages are not automatically blocked." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:437 +msgid "By enabling this checkbox, the plugin will add the necessary rules and exceptions so that people trying to access these pages are not automatically blocked." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:439 +msgid "Helpful Tip:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:441 +msgid "If you do not use the WordPress password protection feature for your posts or pages then it is highly recommended that you leave this checkbox disabled." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:448 +msgid "My site has a theme or plugins which use AJAX" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:451 +msgid "Check this if your site uses AJAX functionality." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:456 +msgid "In the cases where your WordPress installation has a theme or plugin that uses AJAX, a few extra lines of directives and exceptions need to be added to prevent AJAX requests from being automatically blocked by the brute force prevention feature." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:458 +msgid "By enabling this checkbox, the plugin will add the necessary rules and exceptions so that AJAX operations will work as expected." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:467 +msgid "Save feature settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:525 +msgid "This feature allows you to add a CAPTCHA form on various WordPress login pages and forms." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:526 +msgid "Adding a CAPTCHA form on a login page or form is another effective yet simple \"Brute Force\" prevention technique." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:527 +msgid "You have the option of using either %s or a plain maths CAPTCHA form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:528 +msgid "If you enable Google reCAPTCHA the reCAPTCHA widget will be displayed for all forms the CAPTCHA settings below." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:529 +msgid "If Google reCAPTCHA is disabled the simple maths CAPTCHA form will apply and users will need to enter the answer to a simple mathematical question." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:535 +msgid "Google reCAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:540 +msgid "By enabling these settings the Google reCAPTCHA v2 widget will be applied by default for all forms with CAPTCHA enabled." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:549 +msgid "reCAPTCHA will not work because you have disabled login lockout by activating the AIOS_DISABLE_LOGIN_LOCKOUT constant value in a configuration file." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:550 +msgid "To enable it, define AIOS_DISABLE_LOGIN_LOCKOUT constant value as false, or remove it." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:558 +msgid "Use Google reCAPTCHA as default" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:561 +msgid "Check this if you want to default to Google reCAPTCHA for all settings below. (If this is left unchecked, all CAPTCHA forms will revert to the plain maths CAPTCHA)" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:565 +msgid "Site key" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:571 +msgid "Secret key" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:580 +msgid "Login form CAPTCHA settings" +msgstr "登录表单验证码设置" + +#: admin/wp-security-brute-force-menu.php:589 +msgid "Enable CAPTCHA on login page" +msgstr "在登录页面上启用验证码" + +#: admin/wp-security-brute-force-menu.php:592 +msgid "Check this if you want to insert a CAPTCHA form on the login page." +msgstr "如果您要在登录页面上插入验证码表格,请选中此项" + +#: admin/wp-security-brute-force-menu.php:598 +msgid "Lost password form CAPTCHA settings" +msgstr "忘记密码表单验证码设置" + +#: admin/wp-security-brute-force-menu.php:608 +msgid "Enable CAPTCHA on lost password page" +msgstr "启用忘记密码表单验证码" + +#: admin/wp-security-brute-force-menu.php:611 +msgid "Check this if you want to insert a CAPTCHA form on the lost password page." +msgstr "如果要在忘记密码页面上插入验证码表格,请选中此项" + +#: admin/wp-security-brute-force-menu.php:617 +msgid "Custom login form CAPTCHA settings" +msgstr "自定义登录表单验证码设置" + +#: admin/wp-security-brute-force-menu.php:626 +msgid "Enable CAPTCHA on custom login form" +msgstr "启用自定义登录表单的验证码" + +#: admin/wp-security-brute-force-menu.php:629 +msgid "Check this if you want to insert CAPTCHA on a custom login form generated by the following WP function: wp_login_form()" +msgstr "如果要在由WP函数wp_login_form()生成的自定义登录表单上插入验证码,请选中此项:" + +#: admin/wp-security-brute-force-menu.php:639 +msgid "WooCommerce forms CAPTCHA settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:648 +msgid "Enable CAPTCHA on WooCommerce login form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:651 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce login form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:661 +msgid "Enable CAPTCHA on WooCommerce lost password form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:664 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce lost password form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:674 +msgid "Enable CAPTCHA on WooCommerce registration form" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:677 +msgid "Check this if you want to insert CAPTCHA on a WooCommerce registration form." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:749 +msgid "The All In One WP Security Whitelist feature gives you the option of only allowing certain IP addresses or ranges to have access to your WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:750 +msgid "This feature will deny login access for all IP addresses which are not in your whitelist as configured in the settings below." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:751 +msgid "The plugin achieves this by writing the appropriate directives to your .htaccess file." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:752 +msgid "By allowing/blocking IP addresses, you are using the most secure first line of defence because login access will only be granted to whitelisted IP addresses and other addresses will be blocked as soon as they try to access your login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:760 +msgid "Attention: If in addition to enabling the white list feature, you also have one of the %s or %s features enabled, you will still need to use your secret word or special slug in the URL when trying to access your WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:761 +msgid "These features are NOT functionally related. Having both of them enabled on your site means you are creating 2 layers of security." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:772 +msgid "Login IP whitelist settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:783 +msgid "Enable IP whitelisting" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:786 +#: admin/wp-security-user-login-menu.php:408 +msgid "Check this if you want to enable the whitelisting of selected IP addresses specified in the settings below" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:790 +msgid "Your current IP address" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:793 +msgid "You can copy and paste this address in the text box below if you want to include it in your login whitelist." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:797 +#: admin/wp-security-user-login-menu.php:412 +msgid "Enter whitelisted IP addresses:" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:801 +#: admin/wp-security-user-login-menu.php:416 +msgid "Enter one or more IP addresses or IP ranges you wish to include in your whitelist." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:801 +msgid "Only the addresses specified here will have access to the WordPress login page." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:839 +msgid "This feature allows you to add a special hidden \"honeypot\" field on the WordPress login page. This will only be visible to robots and not humans." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:840 +msgid "Since robots usually fill in every input field from a login form, they will also submit a value for the special hidden honeypot field." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:841 +#: admin/wp-security-user-registration-menu.php:278 +msgid "The way honeypots work is that a hidden field is placed somewhere inside a form which only robots will submit. If that field contains a value when the form is submitted then a robot has most likely submitted the form and it is consequently dealt with." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:842 +msgid "Therefore, if the plugin detects that this field has a value when the login form is submitted, then the robot which is attempting to login to your site will be redirected to its localhost address - http://127.0.0.1." +msgstr "" + +#: admin/wp-security-brute-force-menu.php:848 +msgid "Login form honeypot settings" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:859 +msgid "Enable honeypot on login page" +msgstr "" + +#: admin/wp-security-brute-force-menu.php:862 +msgid "Check this if you want to enable the honeypot feature for the login page" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:27 +#: admin/wp-security-dashboard-menu.php:374 +#: classes/wp-security-user-login.php:74 +msgid "Locked IP addresses" +msgstr "已锁定的IP地址" + +#: admin/wp-security-dashboard-menu.php:28 +msgid "Permanent block list" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:29 +msgid "Logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:33 +msgid "Premium upgrade" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:131 +#: admin/wp-security-dashboard-menu.php:518 +#: admin/wp-security-user-login-menu.php:53 +#: classes/grade-system/wp-security-feature-item-manager.php:49 +msgid "Login lockout" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:132 +msgid "This tab displays the list of all IP addresses which are currently temporarily locked out due to the login lockout feature:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:138 +msgid "Currently locked out IP addresses and ranges" +msgstr "当前被锁定的 IP 地址和范围" + +#: admin/wp-security-dashboard-menu.php:183 +msgid "This tab displays the list of all permanently blocked IP addresses." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:184 +#: admin/wp-security-spam-menu.php:339 +msgid "NOTE: This feature does NOT use the .htaccess file to permanently block the IP addresses so it should be compatible with all web servers running WordPress." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:189 +msgid "Permanently blocked IP addresses" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:200 +#: admin/wp-security-firewall-menu.php:1151 +#: admin/wp-security-user-login-menu.php:485 +#: admin/wp-security-user-login-menu.php:643 +#: admin/wp-security-user-registration-menu.php:164 +msgid "Search" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:238 +#: admin/wp-security-dashboard-menu.php:249 +#: admin/wp-security-dashboard-menu.php:260 +msgid "All In One WP Security & Firewall" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:250 +msgid "Debug logs have been cleared." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:261 +msgid "Unable to clear the logs; an invalid nonce was provided" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:274 +msgid "Debug log options" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:281 +msgid "Clear logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:289 +msgid "Debug logs" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:362 +msgid "Security strength meter" +msgstr "安全强度计" + +#: admin/wp-security-dashboard-menu.php:363 +msgid "Security points breakdown" +msgstr "安全点分析" + +#: admin/wp-security-dashboard-menu.php:364 +msgid "Spread the word" +msgstr "宣传我们" + +#: admin/wp-security-dashboard-menu.php:365 +msgid "Get to know the developers" +msgstr "了解开发人员" + +#: admin/wp-security-dashboard-menu.php:366 +msgid "Critical feature status" +msgstr "关键功能状态" + +#: admin/wp-security-dashboard-menu.php:367 +msgid "Last 5 logins" +msgstr "最近5次登录" + +#: admin/wp-security-dashboard-menu.php:368 +msgid "Maintenance mode status" +msgstr "维护模式状态" + +#: admin/wp-security-dashboard-menu.php:373 +#: admin/wp-security-dashboard-menu.php:664 +#: admin/wp-security-user-login-menu.php:57 +msgid "Logged in users" +msgstr "已登录用户" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:417 +msgid "Total Achievable Points: " +msgstr "总计可得点数:" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:419 +msgid "Current Score of Your Site: " +msgstr "网站当前分数:" + +#: admin/wp-security-dashboard-menu.php:472 +msgid "We are working hard to make your WordPress site more secure. Please support us, here is how:" +msgstr "我们正在努力使你的 WordPress 网站更安全。请用下列方式支持我们:" + +#: admin/wp-security-dashboard-menu.php:473 +msgid "Follow us on" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:477 +msgid "Post to Twitter" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:481 +msgid "Give us a good rating" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:488 +msgid "Wanna know more about the developers behind this plugin?" +msgstr "想知道更多关于这个插件背后的开发人员?" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:499 +msgid "Below is the current status of the critical features that you should activate on your site to achieve a minimum level of recommended security" +msgstr "为保证您的网站达到最低安全水平,建议激活以下关键功能。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:503 +msgid "Admin username" +msgstr "管理员用户名" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:533 +msgid "File permission" +msgstr "文件权限" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:548 +msgid "Basic firewall" +msgstr "基本防火墙" + +#: admin/wp-security-dashboard-menu.php:577 +msgid "No data found." +msgstr "未找到数据!" + +#: admin/wp-security-dashboard-menu.php:581 +msgid "Last 5 logins summary:" +msgstr "最后5次登录摘要:" + +#: admin/wp-security-dashboard-menu.php:585 +msgid "User" +msgstr "用户" + +#: admin/wp-security-dashboard-menu.php:586 +#: admin/wp-security-list-404.php:95 +#: admin/wp-security-list-login-fails.php:56 +#: admin/wp-security-list-permanent-blocked-ip.php:68 +msgid "Date" +msgstr "日期" + +#: admin/wp-security-dashboard-menu.php:587 +msgid "IP" +msgstr "IP地址" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:608 +msgid "Maintenance mode is currently enabled. Remember to turn it off when you are done" +msgstr "维护模式目前已启用。当您完成维护后,请关闭它。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:610 +msgid "Maintenance mode is currently off." +msgstr "维护模式目前已关闭。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:614 +msgid "Maintenance mode" +msgstr "维护模式" + +#: admin/wp-security-dashboard-menu.php:632 +msgid "Cookie based brute force" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:636 +#: admin/wp-security-dashboard-menu.php:654 +msgid "The %s feature is currently active." +msgstr "" + +#: admin/wp-security-dashboard-menu.php:637 +#: admin/wp-security-dashboard-menu.php:655 +msgid "Your new WordPress login URL is now:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:666 +msgid "Number of users currently logged into your site (including you) is:" +msgstr "当前登录您的网站 (包括您) 的用户数量为:" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:667 +msgid "There are no other users currently logged in." +msgstr "目前没有其他用户登陆。" + +#: admin/wp-security-dashboard-menu.php:680 +msgid "Number of users currently logged in site-wide (including you) is:" +msgstr "" + +#: admin/wp-security-dashboard-menu.php:681 +msgid "There are no other site-wide users currently logged in." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-dashboard-menu.php:694 +#: admin/wp-security-dashboard-menu.php:711 +msgid "Go to the %s menu to see more details" +msgstr "单击 %s 菜单,查看更多详细信息" + +#: admin/wp-security-dashboard-menu.php:707 +msgid "There are no IP addresses currently locked out." +msgstr "目前没有锁定的IP地址。" + +#: admin/wp-security-dashboard-menu.php:710 +msgid "Number of temporarily locked out IP addresses: " +msgstr "暂时锁定的 IP 地址数:" + +#: admin/wp-security-database-menu.php:52 +msgid "UpdraftPlus is installed but currently not active." +msgstr "" + +#: admin/wp-security-database-menu.php:52 +msgid "Follow this link to activate UpdraftPlus, to take a backup." +msgstr "" + +#: admin/wp-security-database-menu.php:57 +msgid "Follow this link to install UpdraftPlus, to take a database backup." +msgstr "" + +#: admin/wp-security-database-menu.php:87 +#: admin/wp-security-database-menu.php:92 +msgid "Database backup" +msgstr "数据备份" + +#: admin/wp-security-database-menu.php:91 +#: classes/grade-system/wp-security-feature-item-manager.php:65 +msgid "Database prefix" +msgstr "数据库前缀" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:119 +msgid "Database security" +msgstr "数据库安全" + +#: admin/wp-security-database-menu.php:147 +msgid "Nonce check failed for DB prefix change operation!" +msgstr "" + +#: admin/wp-security-database-menu.php:155 +msgid "The plugin has detected that it cannot write to the wp-config.php file. This feature can only be used if the plugin can successfully write to the wp-config.php file." +msgstr "" + +#: admin/wp-security-database-menu.php:168 +msgid "Please enter a value for the DB prefix." +msgstr "" + +#: admin/wp-security-database-menu.php:177 +msgid "ERROR: The table prefix can only contain numbers, letters, and underscores." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:186 +#: admin/wp-security-database-menu.php:245 +msgid "Change database prefix" +msgstr "更改数据库前缀" + +#: admin/wp-security-database-menu.php:189 +msgid "Your WordPress database is the most important asset of your website because it contains a lot of your site's precious information." +msgstr "" + +#: admin/wp-security-database-menu.php:190 +msgid "The database is also a target for hackers via methods such as SQL injections and malicious and automated code which targets certain tables." +msgstr "" + +#: admin/wp-security-database-menu.php:191 +msgid "One way to add a layer of protection for your DB is to change the default WordPress table prefix from \"wp_\" to something else which will be difficult for hackers to guess." +msgstr "" + +#: admin/wp-security-database-menu.php:192 +msgid "This feature allows you to easily change the prefix to a value of your choice or to a random value set by this plugin." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:198 +msgid "Database prefix options" +msgstr "数据库前缀选项" + +#: admin/wp-security-database-menu.php:210 +msgid "database backup" +msgstr "数据备份" + +#: admin/wp-security-database-menu.php:211 +msgid "It is recommended that you perform a %s before using this feature" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:221 +msgid "Current database table prefix" +msgstr "当前数据库表前缀" + +#: admin/wp-security-database-menu.php:227 +msgid "Your site is currently using the default WordPress database prefix value of \"wp_\"." +msgstr "" + +#: admin/wp-security-database-menu.php:227 +msgid "To increase your site's security you should consider changing the database prefix value to another value." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:234 +msgid "Generate new database table prefix" +msgstr "生成新的数据库表前缀" + +#: admin/wp-security-database-menu.php:238 +msgid "Check this if you want the plugin to generate a random 6 character string for the table prefix" +msgstr "" + +#: admin/wp-security-database-menu.php:239 +msgid "OR" +msgstr "" + +#: admin/wp-security-database-menu.php:241 +msgid "Choose your own database prefix by specifying a string which contains letters and/or numbers and/or underscores. Example: xyz_" +msgstr "" + +#: admin/wp-security-database-menu.php:265 +msgid "Take a database backup using UpdraftPlus" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-database-menu.php:270 +msgid "Manual backup" +msgstr "手动备份" + +#: admin/wp-security-database-menu.php:274 +msgid "UpdraftPlus Backup/Restore" +msgstr "" + +#: admin/wp-security-database-menu.php:274 +msgid "Your backups are on the UpdraftPlus Backup/Restore admin page." +msgstr "" + +#: admin/wp-security-database-menu.php:276 +msgid "Create database backup now" +msgstr "" + +#: admin/wp-security-database-menu.php:308 +msgid "Error - Could not get tables or no tables found!" +msgstr "" + +#: admin/wp-security-database-menu.php:312 +msgid "Starting DB prefix change operations....." +msgstr "" + +#: admin/wp-security-database-menu.php:314 +msgid "Your WordPress system has a total of %s tables and your new DB prefix will be: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:320 +#: classes/wp-security-utility.php:306 +msgid "Failed to make a backup of the wp-config.php file. This operation will not go ahead." +msgstr "" + +#: admin/wp-security-database-menu.php:324 +msgid "A backup copy of your wp-config.php file was created successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:351 +msgid "%s table name update failed" +msgstr "" + +#: admin/wp-security-database-menu.php:363 +msgid "Please change the prefix manually for the above tables to: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:366 +msgid "%s tables had their prefix updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:387 +msgid "wp-config.php file was updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:390 +msgid "The \"wp-config.php\" file was not able to be modified." +msgstr "" + +#: admin/wp-security-database-menu.php:390 +msgid "Please modify this file manually using your favourite editor and search for variable \"$table_prefix\" and assign the following value to that variable: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:401 +#: admin/wp-security-database-menu.php:420 +msgid "Update of table %s failed: unable to change %s to %s" +msgstr "" + +#: admin/wp-security-database-menu.php:405 +msgid "The options table records which had references to the old DB prefix were updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:424 +msgid "The %s table records which had references to the old DB prefix were updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:452 +msgid "Error updating user_meta table where new meta_key = %s, old meta_key = %s and user_id = %s." +msgstr "" + +#: admin/wp-security-database-menu.php:457 +msgid "The usermeta table records which had references to the old DB prefix were updated successfully!" +msgstr "" + +#: admin/wp-security-database-menu.php:459 +msgid "The database prefix change tasks have been completed." +msgstr "" + +#: admin/wp-security-database-menu.php:503 +msgid "Checking for MySQL tables of type \"view\"....." +msgstr "" + +#: admin/wp-security-database-menu.php:520 +msgid "Update of the following MySQL view definition failed: %s" +msgstr "" + +#: admin/wp-security-database-menu.php:527 +msgid "%s view definitions were updated successfully!" +msgstr "" + +#: admin/wp-security-filescan-menu.php:26 +#: classes/grade-system/wp-security-feature-item-manager.php:127 +msgid "File change detection" +msgstr "文件更改检测" + +#: admin/wp-security-filescan-menu.php:27 +msgid "Malware scan" +msgstr "" + +#: admin/wp-security-filescan-menu.php:88 +msgid "There have been no file changes since the last scan." +msgstr "自上次扫描以来,没有文件更改。" + +#: admin/wp-security-filescan-menu.php:98 +msgid "Nonce check failed for manual file change detection scan operation!" +msgstr "" + +#: admin/wp-security-filescan-menu.php:104 +msgid "There was an error during the file change detection scan. Please check the AIOS logs." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:110 +msgid "The plugin has detected that this is your first file change detection scan. The file details from this scan will be used to detect file changes for future scans." +msgstr "该插件检测到,这是您第一次进行文件更改检测扫描。此次扫描的详细信息将用于比对未来执行检测扫描。" + +#: admin/wp-security-filescan-menu.php:112 +msgid "Scan complete - There were no file changes detected!" +msgstr "" + +#: admin/wp-security-filescan-menu.php:133 +msgid "You entered a non numeric value for the \"backup time interval\" field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-filescan-menu.php:167 +msgid "The following address was removed because it is not a valid email address: " +msgstr "" + +#: admin/wp-security-filescan-menu.php:206 +msgid "NEW SCAN COMPLETED: The plugin has detected that you have made changes to the \"File Types To Ignore\" or \"Files To Ignore\" fields." +msgstr "" + +#: admin/wp-security-filescan-menu.php:206 +msgid "In order to ensure that future scan results are accurate, the old scan data has been refreshed." +msgstr "" + +#: admin/wp-security-filescan-menu.php:215 +msgid "All In One WP Security & Firewall has detected that there was a change in your host's files." +msgstr "" + +#: admin/wp-security-filescan-menu.php:217 +msgid "View scan details and clear this message" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:226 +msgid "If given an opportunity hackers can insert their code or files into your system which they can then use to carry out malicious acts on your site." +msgstr "如果有机会黑客可以传送他们的代码或文件到您的系统,那么他们就可以在您的网站进行恶意行为。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:227 +msgid "Being informed of any changes in your files can be a good way to quickly prevent a hacker from causing damage to your website." +msgstr "告知你的文件的任何更改是一个很好的方式,防止黑客伤害你的网站。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:228 +msgid "In general, WordPress core and plugin files and file types such as \".php\" or \".js\" should not change often and when they do, it is important that you are made aware when a change occurs and which file was affected." +msgstr "在一般情况下,WordPress 的核心和插件文件和文件类型,如 “.php” 或 “.js” 不应该经常改变,当他们发生变化后,你应该知道文件什么时候发生更改和哪个文件受到影响" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:229 +msgid "The \"File Change Detection Feature\" will notify you of any file change which occurs on your system, including the addition and deletion of files by performing a regular automated or manual scan of your system's files." +msgstr "“文件更改检测功能”将通知您系统上发生的任何文件更改,通过系统文件定期自动或手动扫描,发现添加和删除的任何文件。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:230 +msgid "This feature also allows you to exclude certain files or folders from the scan in cases where you know that they change often as part of their normal operation. (For example log files and certain caching plugin files may change often and hence you may choose to exclude such files from the file change detection scan)" +msgstr "某些特定的文件或文件夹正常运行时会自动改变,此功能允许您排除这些文件或文件夹扫描。(例如:日志文件和某些插件的缓存,可能经常发生更改,因此您可以将这些文件或文件夹从扫描中排除掉。)" + +#: admin/wp-security-filescan-menu.php:241 +msgid "It appears that your server is using an old PHP version which is missing the %s. The file scanner feature needs this class in order to work. If you would like to use this feature please upgrade your server PHP version to 5.3 or greater." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:249 +msgid "Manual file change detection scan" +msgstr "手动文件更改检测扫描" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:255 +msgid "To perform a manual file change detection scan click on the button below." +msgstr "要手动执行文件更改检测扫描,点击下面的按钮。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:258 +msgid "Perform scan now" +msgstr "立即执行扫描" + +#: admin/wp-security-filescan-menu.php:262 +msgid "View last saved file change results" +msgstr "查看上次保存的文件更改结果" + +#: admin/wp-security-filescan-menu.php:268 +msgid "Click the button below to view the saved file change results from the last scan." +msgstr "点击下面的按钮来查看从上次扫描保存的文件变化的结果。" + +#: admin/wp-security-filescan-menu.php:271 +msgid "View last file change" +msgstr "查看上次更改文件" + +#: admin/wp-security-filescan-menu.php:275 +msgid "File change detection settings" +msgstr "文件更改检测设置" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:287 +msgid "Enable automated file change detection scan" +msgstr "启用自动文件更改检测扫描" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:290 +msgid "Check this if you want the system to automatically/periodically scan your files to check for file changes based on the settings below" +msgstr "如果您希望系统根据以下设置自动/定期扫描文件以检查文件更改,请选中此项" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:294 +msgid "Scan time interval" +msgstr "扫描时间间隔" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:297 +msgid "Hours" +msgstr "小时" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:298 +msgid "Days" +msgstr "天" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:299 +msgid "Weeks" +msgstr "周" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:301 +msgid "Set the value for how often you would like a scan to occur" +msgstr "设置您希望扫描发生的频率的值" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:305 +msgid "File types to ignore" +msgstr "要忽略的文件类型" + +#: admin/wp-security-filescan-menu.php:308 +msgid "Enter each file type or extension on a new line which you wish to exclude from the file change detection scan." +msgstr "" + +#: admin/wp-security-filescan-menu.php:312 +msgid "You can exclude file types from the scan which would not normally pose any security threat if they were changed. These can include things such as image files." +msgstr "" + +#: admin/wp-security-filescan-menu.php:313 +msgid "Example: If you want the scanner to ignore files of type jpg, png, and bmp, then you would enter the following:" +msgstr "" + +#: admin/wp-security-filescan-menu.php:314 +msgid "jpg" +msgstr "" + +#: admin/wp-security-filescan-menu.php:315 +msgid "png" +msgstr "" + +#: admin/wp-security-filescan-menu.php:316 +msgid "bmp" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:322 +msgid "Files/Directories to ignore" +msgstr "要忽略的文件/目录" + +#: admin/wp-security-filescan-menu.php:325 +msgid "Enter each file or directory on a new line which you wish to exclude from the file change detection scan." +msgstr "" + +#: admin/wp-security-filescan-menu.php:329 +msgid "You can exclude specific files/directories from the scan which would not normally pose any security threat if they were changed. These can include things such as log files." +msgstr "" + +#: admin/wp-security-filescan-menu.php:330 +msgid "Example: If you want the scanner to ignore certain files in different directories or whole directories, then you would enter the following:" +msgstr "" + +#: admin/wp-security-filescan-menu.php:331 +msgid "cache/config/master.php" +msgstr "" + +#: admin/wp-security-filescan-menu.php:332 +msgid "somedirectory" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:339 +msgid "Send email when change detected" +msgstr "在检测到更改时发送邮件" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filescan-menu.php:343 +msgid "Check this if you want the system to email you if a file change was detected" +msgstr "如果您希望系统在检测到文件更改时向您发送电子邮件,请选中此项" + +#: admin/wp-security-filescan-menu.php:347 +msgid "Enter one or more email addresses on a new line." +msgstr "每个电子邮件单独一行" + +#: admin/wp-security-filescan-menu.php:364 +msgid "What is malware?" +msgstr "" + +#: admin/wp-security-filescan-menu.php:365 +msgid "The word malware stands for Malicious Software. It can consist of things like trojan horses, adware, worms, spyware and any other undesirable code which a hacker will try to inject into your website." +msgstr "" + +#: admin/wp-security-filescan-menu.php:366 +msgid "Often when malware code has been inserted into your site you will normally not notice anything out of the ordinary based on appearances, but it can have a dramatic effect on your site's search ranking." +msgstr "" + +#: admin/wp-security-filescan-menu.php:367 +msgid "This is because the bots and spiders from search engines such as Google have the capability to detect malware when they are indexing the pages on your site, and consequently they can blacklist your website which will in turn affect your search rankings." +msgstr "" + +#: admin/wp-security-filescan-menu.php:369 +msgid "CLICK HERE" +msgstr "" + +#: admin/wp-security-filescan-menu.php:371 +msgid "Scanning for malware" +msgstr "" + +#: admin/wp-security-filescan-menu.php:372 +msgid "Due to the constantly changing and complex nature of Malware, scanning for such things using a standalone plugin will not work reliably. This is something best done via an external scan of your site regularly." +msgstr "" + +#: admin/wp-security-filescan-menu.php:373 +msgid "This is why we have created an easy-to-use scanning service which is hosted off our own server which will scan your site for malware once every day and notify you if it finds anything." +msgstr "" + +#: admin/wp-security-filescan-menu.php:374 +msgid "When you sign up for this service you will get the following:" +msgstr "" + +#: admin/wp-security-filescan-menu.php:376 +msgid "Automatic daily scan of 1 website" +msgstr "" + +#: admin/wp-security-filescan-menu.php:377 +msgid "Automatic malware and blacklist monitoring" +msgstr "" + +#: admin/wp-security-filescan-menu.php:378 +msgid "Automatic email alerting" +msgstr "" + +#: admin/wp-security-filescan-menu.php:379 +msgid "Site uptime monitoring" +msgstr "" + +#: admin/wp-security-filescan-menu.php:380 +msgid "Site response time monitoring" +msgstr "" + +#: admin/wp-security-filescan-menu.php:381 +msgid "We provide advice for malware cleanup" +msgstr "" + +#: admin/wp-security-filescan-menu.php:382 +msgid "Blacklist removal" +msgstr "" + +#: admin/wp-security-filescan-menu.php:383 +msgid "No contract (cancel anytime)" +msgstr "" + +#: admin/wp-security-filescan-menu.php:385 +msgid "To learn more please %s." +msgstr "" + +#: admin/wp-security-filescan-menu.php:406 +msgid "Latest file change scan results" +msgstr "" + +#: admin/wp-security-filescan-menu.php:416 +msgid "The following files were added to your host." +msgstr "" + +#: admin/wp-security-filescan-menu.php:419 +#: admin/wp-security-filescan-menu.php:440 +#: admin/wp-security-filescan-menu.php:464 +msgid "File" +msgstr "" + +#: admin/wp-security-filescan-menu.php:420 +#: admin/wp-security-filescan-menu.php:441 +#: admin/wp-security-filescan-menu.php:465 +msgid "File size" +msgstr "" + +#: admin/wp-security-filescan-menu.php:421 +#: admin/wp-security-filescan-menu.php:442 +#: admin/wp-security-filescan-menu.php:466 +msgid "File modified" +msgstr "" + +#: admin/wp-security-filescan-menu.php:437 +msgid "The following files were removed from your host." +msgstr "" + +#: admin/wp-security-filescan-menu.php:461 +msgid "The following files were changed on your host." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:26 +#: classes/grade-system/wp-security-feature-item-manager.php:69 +msgid "File permissions" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:27 +msgid "PHP file editing" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:28 +msgid "WP file access" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:29 +msgid "Host system logs" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filesystem-menu.php:55 +msgid "Filesystem security" +msgstr "文件系统安全" + +#: admin/wp-security-filesystem-menu.php:80 +msgid "Nonce check failed for manual DB backup operation!" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:90 +msgid "The permissions for %s were successfully changed to %s" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:94 +msgid "Unable to change permissions for %s!" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:100 +msgid "File permissions scan" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:103 +msgid "Your WordPress file and folder permission settings govern the accessibility and read/write privileges of the files and folders which make up your WP installation." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:104 +msgid "Your WP installation already comes with reasonably secure file permission settings for the filesystem." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:105 +msgid "However, sometimes people or other plugins modify the various permission settings of certain core WP folders or files such that they end up making their site less secure because they chose the wrong permission values." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:106 +msgid "This feature will scan the critical WP core folders and files and will highlight any permission settings which are insecure." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:114 +msgid "This plugin has detected that your site is running on a Windows server." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:115 +msgid "This feature is not applicable for Windows server installations." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:121 +msgid "WP directory and file permissions scan results" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filesystem-menu.php:133 +#: admin/wp-security-filesystem-menu.php:152 +msgid "Name" +msgstr "名称" + +#: admin/wp-security-filesystem-menu.php:134 +#: admin/wp-security-filesystem-menu.php:153 +msgid "File/Folder" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:135 +#: admin/wp-security-filesystem-menu.php:154 +msgid "Current permissions" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:136 +#: admin/wp-security-filesystem-menu.php:155 +msgid "Recommended permissions" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:137 +#: admin/wp-security-filesystem-menu.php:156 +msgid "Recommended action" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:195 +msgid "Your PHP file editing settings were saved successfully." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:199 +msgid "Operation failed! Unable to modify or make a backup of wp-config.php file!" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:212 +#: classes/grade-system/wp-security-feature-item-manager.php:71 +msgid "File editing" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:215 +msgid "The WordPress Dashboard by default allows administrators to edit PHP files, such as plugin and theme files." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:216 +msgid "This is often the first tool an attacker will use if able to login, since it allows code execution." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:217 +msgid "This feature will disable the ability for people to edit PHP files via the dashboard." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:223 +msgid "Disable PHP file editing" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:235 +msgid "Disable ability to edit PHP files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:238 +msgid "Check this if you want to remove the ability for people to edit PHP files via the WP dashboard" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:282 +msgid "You have successfully saved the Prevent Access to Default WP Files configuration." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:286 +#: admin/wp-security-firewall-menu.php:126 +#: admin/wp-security-firewall-menu.php:346 +#: admin/wp-security-firewall-menu.php:613 +#: admin/wp-security-firewall-menu.php:912 +#: admin/wp-security-settings-menu.php:772 +#: admin/wp-security-spam-menu.php:124 +msgid "Could not write to the .htaccess file. Please check the file permissions." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:291 +msgid "WordPress files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:294 +msgid "This feature allows you to prevent access to files such as %s, %s and %s which are delivered with all WP installations." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:295 +msgid "By preventing access to these files you are hiding some key pieces of information (such as WordPress version info) from potential hackers." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:300 +msgid "Prevent access to default WP files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:311 +msgid "Prevent access to WP default install files" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:314 +msgid "Check this if you want to prevent access to readme.html, license.txt and wp-config-sample.php." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:318 +msgid "Save setting" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:342 +msgid "System logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:345 +msgid "Sometimes your hosting platform will produce error or warning logs in a file called \"error_log\"." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:346 +msgid "Depending on the nature and cause of the error or warning, your hosting server can create multiple instances of this file in numerous directory locations of your WordPress installation." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:347 +msgid "By occasionally viewing the contents of these logs files you can keep informed of any underlying problems on your system which you might need to address." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:353 +msgid "View system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:355 +msgid "Please click the button below to view the latest system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:358 +msgid "Enter System Log File Name" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:360 +msgid "Enter your system log file name. (Defaults to error_log)" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:363 +msgid "View latest system logs" +msgstr "" + +#: admin/wp-security-filesystem-menu.php:365 +msgid "Loading..." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:382 +msgid "No system logs were found." +msgstr "" + +#: admin/wp-security-filesystem-menu.php:435 +msgid "Set recommended permissions" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-filesystem-menu.php:441 +msgid "No action required" +msgstr "无需执行任何操作。" + +#: admin/wp-security-filesystem-menu.php:481 +msgid "Showing latest entries of error_log file: %s" +msgstr "" + +#: admin/wp-security-firewall-menu.php:28 +msgid "Basic firewall rules" +msgstr "基本防火墙规则" + +#: admin/wp-security-firewall-menu.php:29 +msgid "Additional firewall rules" +msgstr "其他防火墙规则" + +#: admin/wp-security-firewall-menu.php:30 +msgid "6G Blacklist firewall rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:31 +msgid "Internet bots" +msgstr "网络机器人" + +#: admin/wp-security-firewall-menu.php:32 +msgid "Prevent hotlinks" +msgstr "防止热链接" + +#: admin/wp-security-firewall-menu.php:33 +msgid "404 detection" +msgstr "404检测" + +#: admin/wp-security-firewall-menu.php:34 +msgid "Custom rules" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:122 +#: admin/wp-security-firewall-menu.php:908 +#: admin/wp-security-spam-menu.php:120 +#: admin/wp-security-spam-menu.php:494 +#: admin/wp-security-spam-menu.php:556 +#: admin/wp-security-user-registration-menu.php:95 +msgid "Settings were successfully saved" +msgstr "设置已成功保存" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:131 +#: admin/wp-security-firewall-menu.php:651 +msgid "Firewall settings" +msgstr "防火墙设置" + +#: admin/wp-security-firewall-menu.php:138 +msgid "This should not have any impact on your site's general functionality but if you wish you can take a %s of your .htaccess file before proceeding." +msgstr "" + +#: admin/wp-security-firewall-menu.php:139 +msgid "The features in this tab allow you to activate some basic firewall security protection rules for your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:140 +msgid "The firewall functionality is achieved via the insertion of special code into your currently active .htaccess file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:151 +msgid "You have enabled the \"Completely Block Access To XMLRPC\" checkbox which means all XMLRPC functionality will be blocked." +msgstr "" + +#: admin/wp-security-firewall-menu.php:152 +msgid "By leaving this feature enabled you will prevent Jetpack or Wordpress iOS or other apps which need XMLRPC from working correctly on your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:153 +msgid "If you still need XMLRPC then uncheck the \"Completely Block Access To XMLRPC\" checkbox and enable only the \"Disable Pingback Functionality From XMLRPC\" checkbox." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:163 +msgid "Basic firewall settings" +msgstr "基本防火墙设置" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:171 +msgid "Enable basic firewall protection" +msgstr "启用基本防火墙保护" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:174 +msgid "Check this if you want to apply basic firewall protection to your site." +msgstr "如果你想对网站采用基本防火墙保护,请选中此项。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:178 +msgid "This setting will implement the following basic firewall protection mechanisms on your site:" +msgstr "此设置将在您的网站上实施以下基本防火墙保护机制:" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:179 +msgid "1) Protect your htaccess file by denying access to it." +msgstr "1)通过拒绝访问,保护你的 htaccess 文件。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:180 +msgid "2) Disable the server signature." +msgstr "2) 禁用服务器签名." + +#: admin/wp-security-firewall-menu.php:181 +msgid "3) Limit file upload size (%sMB)." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:182 +msgid "4) Protect your wp-config.php file by denying access to it." +msgstr "4)通过拒绝访问,保护你的 wp-config.php 文件。" + +#: admin/wp-security-firewall-menu.php:183 +msgid "The above firewall features will be applied via your .htaccess file and should not affect your site's overall functionality." +msgstr "" + +#: admin/wp-security-firewall-menu.php:184 +msgid "You are still advised to take a backup of your active .htaccess file just in case." +msgstr "" + +#: admin/wp-security-firewall-menu.php:190 +msgid "Max file upload size (MB)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:192 +msgid "The value for the maximum file upload size used in the .htaccess file. (Defaults to %sMB if left blank)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:200 +msgid "WordPress XMLRPC and pingback vulnerability protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:208 +msgid "Completely block access to XMLRPC" +msgstr "" + +#: admin/wp-security-firewall-menu.php:211 +msgid "Check this if you are not using the WP XML-RPC functionality and you want to completely block external access to XMLRPC." +msgstr "" + +#: admin/wp-security-firewall-menu.php:215 +msgid "This setting will add a directive in your .htaccess to disable access to the WordPress xmlrpc.php file which is responsible for the XML-RPC functionality in WordPress." +msgstr "" + +#: admin/wp-security-firewall-menu.php:216 +msgid "Hackers can exploit various vulnerabilities in the WordPress XML-RPC API in a number of ways such as:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:217 +msgid "1) Denial of Service (DoS) attacks" +msgstr "" + +#: admin/wp-security-firewall-menu.php:218 +msgid "2) Hacking internal routers." +msgstr "" + +#: admin/wp-security-firewall-menu.php:219 +msgid "3) Scanning ports in internal networks to get info from various hosts." +msgstr "" + +#: admin/wp-security-firewall-menu.php:220 +msgid "Apart from the security protection benefit, this feature may also help reduce load on your server, particularly if your site currently has a lot of unwanted traffic hitting the XML-RPC API on your installation." +msgstr "" + +#: admin/wp-security-firewall-menu.php:221 +msgid "NOTE: You should only enable this feature if you are not currently using the XML-RPC functionality on your WordPress installation." +msgstr "" + +#: admin/wp-security-firewall-menu.php:222 +msgid "Leave this feature disabled and use the feature below if you want pingback protection but you still need XMLRPC." +msgstr "" + +#: admin/wp-security-firewall-menu.php:228 +msgid "Disable pingback functionality from XMLRPC" +msgstr "" + +#: admin/wp-security-firewall-menu.php:231 +msgid "If you use Jetpack or WP iOS or other apps which need WP XML-RPC functionality then check this. This will enable protection against WordPress pingback vulnerabilities." +msgstr "" + +#: admin/wp-security-firewall-menu.php:235 +msgid "NOTE: If you use Jetpack or the Wordpress iOS or other apps then you should enable this feature but leave the \"Completely Block Access To XMLRPC\" checkbox unchecked." +msgstr "" + +#: admin/wp-security-firewall-menu.php:236 +msgid "The feature will still allow XMLRPC functionality on your site but will disable the pingback methods." +msgstr "" + +#: admin/wp-security-firewall-menu.php:237 +msgid "This feature will also remove the \"X-Pingback\" header if it is present." +msgstr "" + +#: admin/wp-security-firewall-menu.php:246 +msgid "Block access to debug log file" +msgstr "" + +#: admin/wp-security-firewall-menu.php:254 +msgid "Block access to debug.log file" +msgstr "" + +#: admin/wp-security-firewall-menu.php:257 +msgid "Check this if you want to block access to the debug.log file that WordPress creates when debug logging is enabled." +msgstr "" + +#: admin/wp-security-firewall-menu.php:261 +msgid "WordPress has an option to turn on the debug logging to a file located in wp-content/debug.log. This file may contain sensitive information." +msgstr "" + +#: admin/wp-security-firewall-menu.php:262 +msgid "Using this option will block external access to this file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:262 +msgid "You can still access this file by logging into your site via FTP." +msgstr "" + +#: admin/wp-security-firewall-menu.php:270 +msgid "Save basic firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:342 +msgid "You have successfully saved the Additional Firewall Protection configuration" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-firewall-menu.php:356 +msgid "Additional firewall protection" +msgstr "其他防火墙保护" + +#: admin/wp-security-firewall-menu.php:360 +msgid "Due to the nature of the code being inserted to the .htaccess file, this feature may break some functionality for certain plugins and you are therefore advised to take a %s of .htaccess before applying this configuration." +msgstr "" + +#: admin/wp-security-firewall-menu.php:362 +msgid "This feature allows you to activate more advanced firewall settings to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:363 +msgid "The advanced firewall rules are applied via the insertion of special code to your currently active .htaccess file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:372 +msgid "Listing of directory contents" +msgstr "" + +#: admin/wp-security-firewall-menu.php:381 +#: classes/grade-system/wp-security-feature-item-manager.php:85 +msgid "Disable index views" +msgstr "" + +#: admin/wp-security-firewall-menu.php:384 +msgid "Check this if you want to disable directory and file listing." +msgstr "" + +#: admin/wp-security-firewall-menu.php:389 +msgid "By default, an Apache server will allow the listing of the contents of a directory if it doesn't contain an index.php file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:391 +msgid "This feature will prevent the listing of contents for all directories." +msgstr "" + +#: admin/wp-security-firewall-menu.php:393 +msgid "NOTE: In order for this feature to work \"AllowOverride\" of the Indexes directive must be enabled in your httpd.conf file. Ask your hosting provider to check this if you don't have access to httpd.conf" +msgstr "" + +#: admin/wp-security-firewall-menu.php:402 +msgid "Trace and track" +msgstr "" + +#: admin/wp-security-firewall-menu.php:411 +#: classes/grade-system/wp-security-feature-item-manager.php:86 +msgid "Disable trace and track" +msgstr "" + +#: admin/wp-security-firewall-menu.php:414 +msgid "Check this if you want to disable trace and track." +msgstr "" + +#: admin/wp-security-firewall-menu.php:419 +msgid "HTTP Trace attack (XST) can be used to return header requests and grab cookies and other information." +msgstr "" + +#: admin/wp-security-firewall-menu.php:421 +msgid "This hacking technique is usually used together with cross site scripting attacks (XSS)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:423 +msgid "Disabling trace and track on your site will help prevent HTTP Trace attacks." +msgstr "" + +#: admin/wp-security-firewall-menu.php:432 +msgid "Proxy comment posting" +msgstr "" + +#: admin/wp-security-firewall-menu.php:442 +msgid "Forbid proxy comment posting" +msgstr "" + +#: admin/wp-security-firewall-menu.php:445 +msgid "Check this if you want to forbid proxy comment posting." +msgstr "" + +#: admin/wp-security-firewall-menu.php:450 +msgid "This setting will deny any requests that use a proxy server when posting comments." +msgstr "" + +#: admin/wp-security-firewall-menu.php:451 +msgid "By forbidding proxy comments you are in effect eliminating some spam and other proxy requests." +msgstr "" + +#: admin/wp-security-firewall-menu.php:460 +msgid "Bad query strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:470 +msgid "Deny bad query strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:473 +msgid "This will help protect you against malicious queries via XSS." +msgstr "" + +#: admin/wp-security-firewall-menu.php:478 +msgid "This feature will write rules in your .htaccess file to prevent malicious string attacks on your site using XSS." +msgstr "" + +#: admin/wp-security-firewall-menu.php:479 +msgid "NOTE: Some of these strings might be used for plugins or themes and hence this might break some functionality." +msgstr "" + +#: admin/wp-security-firewall-menu.php:480 +#: admin/wp-security-firewall-menu.php:510 +msgid "You are therefore strongly advised to take a backup of your active .htaccess file before applying this feature." +msgstr "" + +#: admin/wp-security-firewall-menu.php:489 +#: classes/grade-system/wp-security-feature-item-manager.php:89 +msgid "Advanced character string filter" +msgstr "" + +#: admin/wp-security-firewall-menu.php:499 +msgid "Enable advanced character string filter" +msgstr "" + +#: admin/wp-security-firewall-menu.php:502 +msgid "This will block bad character matches from XSS." +msgstr "" + +#: admin/wp-security-firewall-menu.php:507 +msgid "This is an advanced character string filter to prevent malicious string attacks on your site coming from Cross Site Scripting (XSS)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:508 +msgid "This setting matches for common malicious string patterns and exploits and will produce a 403 error for the hacker attempting the query." +msgstr "" + +#: admin/wp-security-firewall-menu.php:509 +msgid "NOTE: Some strings for this setting might break some functionality." +msgstr "" + +#: admin/wp-security-firewall-menu.php:518 +msgid "Save additional firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:609 +msgid "You have successfully saved the 5G/6G Firewall Protection configuration" +msgstr "" + +#: admin/wp-security-firewall-menu.php:633 +msgid "All in One WP Security and Firewall" +msgstr "" + +#: admin/wp-security-firewall-menu.php:634 +msgid "We were unable to access the firewall's configuration file:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:636 +msgid "As a result, the firewall will be unavailable." +msgstr "" + +#: admin/wp-security-firewall-menu.php:637 +msgid "Please check your PHP error log for further information." +msgstr "" + +#: admin/wp-security-firewall-menu.php:638 +msgid "If you're unable to locate your PHP log file, please contact your web hosting company to ask them where it can be found on their setup." +msgstr "" + +#: admin/wp-security-firewall-menu.php:655 +msgid "This feature allows you to activate the %s (or legacy %s) firewall security protection rules designed and produced by %s." +msgstr "" + +#: admin/wp-security-firewall-menu.php:656 +msgid "The 6G Blacklist is updated and improved version of 5G Blacklist. If you have 5G Blacklist active, you might consider activating 6G Blacklist instead." +msgstr "" + +#: admin/wp-security-firewall-menu.php:657 +msgid "The 6G Blacklist is a simple, flexible blacklist that helps reduce the number of malicious URL requests that hit your website." +msgstr "" + +#: admin/wp-security-firewall-menu.php:658 +msgid "The added advantage of applying the 6G firewall to your site is that it has been tested and confirmed by the people at PerishablePress.com to be an optimal and least disruptive set of .htaccess security rules for general WP sites running on an Apache server or similar." +msgstr "" + +#: admin/wp-security-firewall-menu.php:659 +msgid "Therefore the 6G firewall rules should not have any impact on your site's general functionality but if you wish you can take a %s of your .htaccess file before proceeding." +msgstr "" + +#: admin/wp-security-firewall-menu.php:665 +msgid "6G blacklist/firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:677 +msgid "Enable 6G firewall protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:680 +msgid "Check this if you want to apply the 6G Blacklist firewall protection from perishablepress.com to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:684 +msgid "This setting will implement the 6G security firewall protection mechanisms on your site which include the following things:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:685 +#: admin/wp-security-firewall-menu.php:703 +msgid "1) Block forbidden characters commonly used in exploitative attacks." +msgstr "" + +#: admin/wp-security-firewall-menu.php:686 +#: admin/wp-security-firewall-menu.php:704 +msgid "2) Block malicious encoded URL characters such as the \".css(\" string." +msgstr "" + +#: admin/wp-security-firewall-menu.php:687 +#: admin/wp-security-firewall-menu.php:705 +msgid "3) Guard against the common patterns and specific exploits in the root portion of targeted URLs." +msgstr "" + +#: admin/wp-security-firewall-menu.php:688 +#: admin/wp-security-firewall-menu.php:706 +msgid "4) Stop attackers from manipulating query strings by disallowing illicit characters." +msgstr "" + +#: admin/wp-security-firewall-menu.php:689 +#: admin/wp-security-firewall-menu.php:707 +msgid "....and much more." +msgstr "" + +#: admin/wp-security-firewall-menu.php:695 +msgid "Enable legacy 5G firewall protection" +msgstr "" + +#: admin/wp-security-firewall-menu.php:698 +msgid "Check this if you want to apply the 5G Blacklist firewall protection from perishablepress.com to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:702 +msgid "This setting will implement the 5G security firewall protection mechanisms on your site which include the following things:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:713 +msgid "Save 5G/6G firewall settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:721 +msgid "6G block request methods" +msgstr "" + +#: admin/wp-security-firewall-menu.php:725 +msgid "HTTP Request methods are used by browsers and clients to communicate with servers to get responses." +msgstr "" + +#: admin/wp-security-firewall-menu.php:726 +msgid "GET and POST are the most commonly used methods to request and submit data for specified resources of the server." +msgstr "" + +#: admin/wp-security-firewall-menu.php:732 +msgid "Block %s method" +msgstr "" + +#: admin/wp-security-firewall-menu.php:735 +msgid "Check this to block the %s request method" +msgstr "" + +#: admin/wp-security-firewall-menu.php:740 +msgid "Some WooCommerce extensions use the PUT request method in addition to GET and POST." +msgstr "" + +#: admin/wp-security-firewall-menu.php:740 +msgid "This means WooCommerce users shouldn't block the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:741 +msgid "A few REST requests use the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:741 +msgid "If your site is communicated by the WP REST API, you should not block the PUT request method." +msgstr "" + +#: admin/wp-security-firewall-menu.php:749 +msgid "Save request methods settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:757 +msgid "6G other settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:761 +msgid "Block query strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:764 +msgid "Check this to block all query strings recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:768 +msgid "Block request strings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:771 +msgid "Check this to block all request strings recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:775 +msgid "Block referrers" +msgstr "" + +#: admin/wp-security-firewall-menu.php:778 +msgid "Check this to block all referrers recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:782 +msgid "Block user-agents" +msgstr "" + +#: admin/wp-security-firewall-menu.php:785 +msgid "Check this to block all user-agents recommended by 6G" +msgstr "" + +#: admin/wp-security-firewall-menu.php:789 +msgid "Save other settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:823 +msgid "The Internet bot settings were successfully saved" +msgstr "" + +#: admin/wp-security-firewall-menu.php:827 +msgid "Internet bot settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:833 +msgid "What is an Internet Bot" +msgstr "" + +#: admin/wp-security-firewall-menu.php:834 +msgid "%s?" +msgstr "" + +#: admin/wp-security-firewall-menu.php:836 +msgid "A bot is a piece of software which runs on the Internet and performs automatic tasks. For example when Google indexes your pages it uses automatic bots to achieve this task." +msgstr "" + +#: admin/wp-security-firewall-menu.php:837 +msgid "A lot of bots are legitimate and non-malicious but not all bots are good and often you will find some which try to impersonate legitimate bots such as \"Googlebot\" but in reality they have nohing to do with Google at all." +msgstr "" + +#: admin/wp-security-firewall-menu.php:838 +msgid "Although most of the bots out there are relatively harmless sometimes website owners want to have more control over which bots they allow into their site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:839 +msgid "This feature allows you to block bots which are impersonating as a Googlebot but actually aren't. (In other words they are fake Google bots)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:840 +msgid "Googlebots have a unique identity which cannot easily be forged and this feature will identify any fake Google bots and block them from reading your site's pages." +msgstr "" + +#: admin/wp-security-firewall-menu.php:846 +msgid "Attention: Sometimes non-malicious Internet organizations might have bots which impersonate as a \"Googlebot\"." +msgstr "" + +#: admin/wp-security-firewall-menu.php:847 +msgid "Just be aware that if you activate this feature the plugin will block all bots which use the \"Googlebot\" string in their User Agent information but are NOT officially from Google (irrespective whether they are malicious or not)." +msgstr "" + +#: admin/wp-security-firewall-menu.php:848 +msgid "All other bots from other organizations such as \"Yahoo\", \"Bing\" etc will not be affected by this feature." +msgstr "" + +#: admin/wp-security-firewall-menu.php:854 +#: admin/wp-security-firewall-menu.php:864 +#: classes/grade-system/wp-security-feature-item-manager.php:93 +msgid "Block fake Googlebots" +msgstr "" + +#: admin/wp-security-firewall-menu.php:867 +msgid "Check this if you want to block all fake Googlebots." +msgstr "" + +#: admin/wp-security-firewall-menu.php:871 +msgid "This feature will check if the User Agent information of a bot contains the string \"Googlebot\"." +msgstr "" + +#: admin/wp-security-firewall-menu.php:872 +msgid "It will then perform a few tests to verify if the bot is legitimately from Google and if so it will allow the bot to proceed." +msgstr "" + +#: admin/wp-security-firewall-menu.php:873 +msgid "If the bot fails the checks then the plugin will mark it as being a fake Googlebot and it will block it" +msgstr "" + +#: admin/wp-security-firewall-menu.php:880 +msgid "Save internet bot settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:916 +#: admin/wp-security-firewall-menu.php:938 +#: classes/grade-system/wp-security-feature-item-manager.php:95 +msgid "Prevent image hotlinking" +msgstr "" + +#: admin/wp-security-firewall-menu.php:919 +msgid "A Hotlink is where someone displays an image on their site which is actually located on your site by using a direct link to the source of the image on your server." +msgstr "" + +#: admin/wp-security-firewall-menu.php:920 +msgid "Due to the fact that the image being displayed on the other person's site is coming from your server, this can cause leaking of bandwidth and resources for you because your server has to present this image for the people viewing it on someone elses's site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:921 +msgid "This feature will prevent people from directly hotlinking images from your site's pages by writing some directives in your .htaccess file." +msgstr "" + +#: admin/wp-security-firewall-menu.php:926 +msgid "Prevent hotlinking" +msgstr "" + +#: admin/wp-security-firewall-menu.php:941 +msgid "Check this if you want to prevent hotlinking to images on your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:961 +msgid "Nonce check failed for delete all 404 event logs operation!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:972 +msgid "404 Detection Feature - Delete all 404 event logs operation failed!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:976 +msgid "All 404 event logs were deleted from the DB successfully!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1000 +msgid "You entered a non numeric value for the lockout time length field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1006 +msgid "You entered an incorrect format for the \"Redirect URL\" field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1039 +msgid "404 detection configuration" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1042 +msgid "A 404 or Not Found error occurs when somebody tries to access a non-existent page on your website." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1043 +msgid "Typically, most 404 errors happen quite innocently when people have mis-typed a URL or used an old link to page which doesn't exist anymore." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1044 +msgid "However, in some cases you may find many repeated 404 errors which occur in a relatively short space of time and from the same IP address which are all attempting to access a variety of non-existent page URLs." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1045 +msgid "Such behaviour can mean that a hacker might be trying to find a particular page or URL for sinister reasons." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1046 +msgid "This feature allows you to monitor all 404 events which occur on your site, and it also gives you the option of blocking IP addresses for a configured length of time." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1047 +msgid "If you want to temporarily block or blacklist an IP address, simply click the \"Temp Block\" or \"Blacklist IP\" link for the applicable IP entry in the \"404 Event Logs\" table below." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1071 +msgid "404 detection options" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1083 +msgid "Enable 404 IP detection and lockout" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1086 +msgid "Check this if you want to enable the lockout of selected IP addresses." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1091 +msgid "When you enable this checkbox, all 404 events on your site will be logged in the table below. You can monitor these events and select some IP addresses listed in the table below and block them for a specified amount of time. All IP addresses you select to be blocked from the \"404 Event Logs\" table section will be unable to access your site during the time specified." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1099 +msgid "Enable 404 event logging" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1102 +msgid "Check this if you want to enable the logging of 404 events" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1107 +msgid "Time length of 404 lockout (minutes)" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1109 +msgid "Set the length of time for which a blocked IP address will be prevented from visiting your site" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1114 +msgid "You can lock any IP address which is recorded in the \"404 Event Logs\" table section below." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1116 +msgid "To temporarily lock an IP address, hover over the ID column and click the \"Temp Block\" link for the applicable IP entry." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1123 +msgid "404 lockout redirect URL" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1125 +msgid "A blocked visitor will be automatically redirected to this URL." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1135 +msgid "This list displays the 404 event logs when somebody tries to access a non-existent page on your website." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1136 +msgid "404 event logs that are older than %1$d days are purged automatically." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1141 +msgid "404 event logs" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1163 +#: admin/wp-security-firewall-menu.php:1172 +#: admin/wp-security-user-login-menu.php:495 +#: admin/wp-security-user-login-menu.php:504 +#: admin/wp-security-user-login-menu.php:653 +#: admin/wp-security-user-login-menu.php:662 +msgid "Export to CSV" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1169 +#: admin/wp-security-user-login-menu.php:501 +#: admin/wp-security-user-login-menu.php:659 +msgid "Click this button if you wish to download this log in CSV format." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1176 +#: admin/wp-security-firewall-menu.php:1185 +msgid "Delete all 404 event logs" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1182 +msgid "Click this button if you wish to purge all 404 event logs from the DB." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1241 +msgid "Custom .htaccess rules settings" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1248 +msgid "This feature can be used to apply your own custom .htaccess rules and directives." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1249 +msgid "It is useful for when you want to tweak our existing firewall rules or when you want to add your own." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1250 +msgid "NOTE: This feature can only be used if your site is hosted in an apache or similar web server." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1256 +msgid "Warning: Only use this feature if you know what you are doing." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1257 +msgid "Incorrect .htaccess rules or directives can break or prevent access to your site." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1258 +msgid "It is your responsibility to ensure that you are entering the correct code!" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1259 +msgid "If you break your site you will need to access your server via FTP or something similar and then edit your .htaccess file and delete the changes you made." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1265 +msgid "Custom .htaccess rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1269 +msgid "Enable custom .htaccess rules" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1272 +msgid "Check this if you want to enable custom rules entered in the text box below" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1276 +msgid "Place custom rules at the top" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1279 +msgid "Check this if you want to place your custom rules at the beginning of all the rules applied by this plugin" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1283 +msgid "Enter custom .htaccess rules:" +msgstr "" + +#: admin/wp-security-firewall-menu.php:1287 +msgid "Enter your custom .htaccess rules/directives." +msgstr "" + +#: admin/wp-security-firewall-menu.php:1292 +msgid "Save custom rules" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:338 +#: admin/wp-security-firewall-setup-notice.php:407 +#: admin/wp-security-firewall-setup-notice.php:479 +#: admin/wp-security-firewall-setup-notice.php:595 +#: wp-security.php:43 +msgid "All In One WP Security and Firewall" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:340 +msgid "We were unable to create the file necessary to give you the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:341 +msgid "Your firewall will have reduced protection which means some of your firewall's functionality will be unavailable." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:342 +msgid "If you would like to manually set up the necessary file, please follow these steps:" +msgstr "" + +#. translators: %s Bootstrap file name. +#. translators: %s Firewall file name. +#: admin/wp-security-firewall-setup-notice.php:346 +#: admin/wp-security-firewall-setup-notice.php:453 +msgid "1. Create a file with the name %s in the same directory as your WordPress install is in, i.e.:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:350 +msgid "2. Paste in the following code:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:352 +#: admin/wp-security-firewall-setup-notice.php:462 +msgid "3. Save the file and press the 'Try again' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:372 +msgid "1. Open the following file:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:378 +msgid "2. Look for the auto_prepend_file directive." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:382 +msgid "2. Look for the following:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:388 +msgid "3. Change it to the following:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:392 +msgid "4. Save the file and press the 'Try again' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:392 +#: admin/wp-security-firewall-setup-notice.php:441 +msgid "You may have to wait up to 5 minutes before the settings take effect." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:410 +msgid "Your firewall has been installed with the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:411 +msgid "You may have to wait 5 minutes for the changes to take effect." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:434 +msgid "1. Open your php.ini file." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:437 +msgid "2. Set the auto_prepend_file directive like below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:441 +msgid "3. Restart the webserver and refresh the page" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:458 +msgid "2. Paste in the following directives:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:482 +msgid "We were unable to set up your firewall with the highest level of protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:483 +msgid "Your firewall will have reduced functionality." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:487 +msgid "To give your site the highest level of protection, please follow these steps:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:500 +msgid "Note: if you're unable to perform any of the aforementioned steps, please ask your web hosting provider for further assistance." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:517 +msgid "Try again" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:539 +msgid "We have detected that your AIOS firewall is not fully installed, and therefore does not have the highest level of protection. " +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:540 +msgid "Your firewall will have reduced functionality until it has been upgraded. " +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:542 +msgid "Upgrade your protection now" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:598 +msgid "Our PHP-based firewall has been created to give you even greater protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:602 +msgid "If you already have our .htaccess-based firewall enabled, you will still need to set up the PHP-based firewall to benefit from its protection." +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:605 +msgid "To set up the PHP-based firewall, press the 'Set up now' button below:" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:608 +msgid "Set up now" +msgstr "" + +#: admin/wp-security-firewall-setup-notice.php:614 +#: templates/notices/custom-notice.php:10 +#: templates/notices/custom-notice.php:12 +#: templates/notices/horizontal-notice.php:50 +#: templates/notices/horizontal-notice.php:52 +#: templates/notices/htaccess-to-php-feature-notice.php:10 +#: templates/notices/htaccess-to-php-feature-notice.php:12 +msgid "Dismiss" +msgstr "" + +#: admin/wp-security-list-404.php:91 +msgid "Event type" +msgstr "" + +#: admin/wp-security-list-404.php:92 +#: admin/wp-security-list-logged-in-users.php:46 +#: admin/wp-security-list-registered-users.php:74 +msgid "IP address" +msgstr "" + +#: admin/wp-security-list-404.php:93 +msgid "Attempted URL" +msgstr "" + +#: admin/wp-security-list-404.php:94 +msgid "Referer" +msgstr "" + +#: admin/wp-security-list-404.php:96 +msgid "Lock status" +msgstr "" + +#: admin/wp-security-list-404.php:118 +msgid "Temp block IP" +msgstr "" + +#: admin/wp-security-list-404.php:119 +msgid "Blacklist IP" +msgstr "" + +#: admin/wp-security-list-404.php:120 +#: admin/wp-security-list-acct-activity.php:82 +#: admin/wp-security-list-locked-ip.php:37 +#: admin/wp-security-list-locked-ip.php:84 +#: admin/wp-security-list-login-fails.php:73 +#: admin/wp-security-list-registered-users.php:93 +msgid "Delete" +msgstr "" + +#: admin/wp-security-list-404.php:128 +#: admin/wp-security-list-404.php:136 +#: admin/wp-security-list-404.php:143 +#: admin/wp-security-list-acct-activity.php:92 +#: admin/wp-security-list-comment-spammer-ip.php:95 +#: admin/wp-security-list-locked-ip.php:97 +#: admin/wp-security-list-locked-ip.php:105 +#: admin/wp-security-list-login-fails.php:85 +#: admin/wp-security-list-permanent-blocked-ip.php:96 +#: admin/wp-security-list-registered-users.php:107 +#: admin/wp-security-list-registered-users.php:115 +#: admin/wp-security-list-registered-users.php:123 +msgid "Please select some records using the checkboxes" +msgstr "" + +#: admin/wp-security-list-404.php:278 +msgid "Nonce check failed for delete selected 404 event logs operation!" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:35 +msgid "Are you sure you want to delete this item?" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:46 +msgid "Login session still active" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:60 +#: admin/wp-security-list-locked-ip.php:60 +#: admin/wp-security-list-logged-in-users.php:44 +#: admin/wp-security-list-login-fails.php:54 +#: admin/wp-security-list-registered-users.php:69 +msgid "User ID" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:61 +#: admin/wp-security-list-locked-ip.php:61 +#: admin/wp-security-list-login-fails.php:55 +msgid "Username" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:62 +msgid "Login date" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:63 +msgid "Logout date" +msgstr "" + +#: admin/wp-security-list-acct-activity.php:136 +msgid "Nonce check failed for delete selected account activity logs operation!" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:59 +msgid "Spammer IP" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:60 +msgid "Number of spam comments from this IP" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:61 +msgid "Status" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:81 +msgid "Block" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:130 +#: admin/wp-security-list-comment-spammer-ip.php:179 +msgid "Nonce check failed for delete selected blocked IP operation!" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:137 +msgid "The selected IP addresses are now permanently blocked!" +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:193 +msgid "The selected IP addresses were saved in the blacklist configuration settings." +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:201 +msgid "The .htaccess file was successfully modified to include the selected IP addresses." +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:212 +msgid "NOTE: The .htaccess file was not modified because you have disabled the \"Enable IP or User Agent Blacklisting\" check box." +msgstr "" + +#: admin/wp-security-list-comment-spammer-ip.php:213 +msgid "To block these IP addresses you will need to enable the above flag in the %s menu" +msgstr "" + +#: admin/wp-security-list-debug.php:47 +msgid "Level" +msgstr "" + +#: admin/wp-security-list-debug.php:48 +msgid "Message" +msgstr "" + +#: admin/wp-security-list-debug.php:49 +msgid "Type" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:36 +#: admin/wp-security-list-locked-ip.php:83 +msgid "Unlock" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:59 +msgid "Locked IP/range" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:62 +#: admin/wp-security-list-permanent-blocked-ip.php:67 +msgid "Reason" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:63 +msgid "Date locked" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:64 +msgid "Release date" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:134 +msgid "The selected IP entries were unlocked successfully." +msgstr "选定的IP条目被成功解锁." + +#: admin/wp-security-list-locked-ip.php:140 +msgid "Nonce check failed for unlock IP operation!" +msgstr "" + +#: admin/wp-security-list-locked-ip.php:147 +msgid "The selected IP entry was unlocked successfully." +msgstr "" + +#: admin/wp-security-list-logged-in-users.php:45 +#: admin/wp-security-list-registered-users.php:70 +msgid "Login name" +msgstr "" + +#: admin/wp-security-list-logged-in-users.php:87 +msgid "Nonce check failed for force user logout operation!" +msgstr "" + +#: admin/wp-security-list-logged-in-users.php:96 +msgid "The selected user was logged out successfully!" +msgstr "" + +#: admin/wp-security-list-login-fails.php:53 +msgid "Login IP range" +msgstr "" + +#: admin/wp-security-list-login-fails.php:130 +msgid "Nonce check failed for delete failed login record operation!" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:66 +msgid "Blocked IP" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:87 +msgid "Unblock" +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:122 +#: admin/wp-security-list-permanent-blocked-ip.php:139 +msgid "Successfully unblocked and deleted the selected record(s)." +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:126 +#: admin/wp-security-list-permanent-blocked-ip.php:143 +msgid "Failed to unblock and delete the selected record(s)." +msgstr "" + +#: admin/wp-security-list-permanent-blocked-ip.php:133 +msgid "Nonce check failed for unblock IP operation!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:71 +msgid "Email" +msgstr "" + +#: admin/wp-security-list-registered-users.php:72 +msgid "Register date" +msgstr "" + +#: admin/wp-security-list-registered-users.php:73 +msgid "Account status" +msgstr "" + +#: admin/wp-security-list-registered-users.php:92 +msgid "Approve" +msgstr "" + +#: admin/wp-security-list-registered-users.php:94 +msgid "Block IP" +msgstr "" + +#: admin/wp-security-list-registered-users.php:159 +msgid "The selected accounts were approved successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:163 +msgid "The following accounts failed to update successfully: " +msgstr "" + +#: admin/wp-security-list-registered-users.php:171 +msgid "The selected account was approved successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:190 +msgid "Your account is now active" +msgstr "" + +#: admin/wp-security-list-registered-users.php:191 +msgid "Your account with username: " +msgstr "" + +#: admin/wp-security-list-registered-users.php:191 +msgid " is now active" +msgstr "" + +#: admin/wp-security-list-registered-users.php:222 +msgid "The selected accounts were deleted successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:230 +msgid "Nonce check failed for delete registered user account operation!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:238 +msgid "The selected account was deleted successfully!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:264 +msgid "The selected IP addresses were successfully added to the permanent block list!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:265 +#: admin/wp-security-list-registered-users.php:282 +msgid "View Blocked IPs" +msgstr "" + +#: admin/wp-security-list-registered-users.php:274 +msgid "Nonce check failed for block IP operation of registered user!" +msgstr "" + +#: admin/wp-security-list-registered-users.php:281 +msgid "The selected IP was successfully added to the permanent block list!" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:25 +msgid "Visitor lockout" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:85 +msgid "Site lockout feature settings saved!" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:92 +msgid "General visitor lockout" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:98 +msgid "This feature allows you to put your site into \"maintenance mode\" by locking down the front-end to all visitors except logged in users with super admin privileges." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:99 +msgid "Locking your site down to general visitors can be useful if you are investigating some issues on your site or perhaps you might be doing some maintenance and wish to keep out all traffic for security reasons." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:104 +msgid "Enable front-end lockout" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:107 +msgid "Check this if you want all visitors except those who are logged in as administrator to be locked out of the front-end of your site." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:111 +msgid "Enter a message:" +msgstr "" + +#: admin/wp-security-maintenance-menu.php:123 +msgid "Enter a message you wish to display to visitors when your site is in maintenance mode." +msgstr "" + +#: admin/wp-security-maintenance-menu.php:130 +msgid "Save site lockout settings" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:28 +msgid "Copy protection" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:29 +msgid "Frames" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:30 +msgid "Users enumeration" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:31 +msgid "WP REST API" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:89 +msgid "Copy Protection feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:94 +msgid "Disable the ability to copy text" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:100 +msgid "This feature allows you to disable the ability to select and copy text from your front end." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:101 +msgid "When admin user is logged in, the feature is automatically disabled for his session." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:106 +msgid "Enable copy protection" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:109 +msgid "Check this if you want to disable the \"Right click\", \"Text selection\" and \"Copy\" option on the front end of your site." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:116 +msgid "Save copy protection settings" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:140 +msgid "Frame Display Prevention feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:145 +msgid "Prevent your site from being displayed in a frame" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:151 +msgid "This feature allows you to prevent other sites from displaying any of your content via a frame or iframe." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:152 +msgid "When enabled, this feature will set the \"X-Frame-Options\" parameter to \"sameorigin\" in the HTTP header." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:157 +msgid "Enable iFrame protection" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:160 +msgid "Check this if you want to stop other sites from displaying your content in a frame or iframe." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:191 +msgid "Users Enumeration Prevention feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:196 +msgid "Prevent users enumeration" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:202 +msgid "This feature allows you to prevent external users/bots from fetching the user info with urls like \"/?author=1\"." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:203 +msgid "When enabled, this feature will print a \"forbidden\" error rather than the user information." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:208 +msgid "Disable users enumeration" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:211 +msgid "Check this if you want to stop users enumeration." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:242 +msgid "WP REST API Security feature settings saved!" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:253 +msgid "This feature allows you to block WordPress REST API access for unauthorized requests." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:254 +msgid "When enabled this feature will only allow REST requests to be processed if the user is logged in." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:260 +msgid "Beware that if you are using other plugins which have registered REST endpoints (eg, Contact Form 7), then this feature will also block REST requests used by these plugins if the user is not logged in. It is recommended that you leave this feature disabled if you want uninterrupted functionality for such plugins." +msgstr "" + +#: admin/wp-security-misc-options-menu.php:268 +msgid "Disallow unauthorized REST requests" +msgstr "" + +#: admin/wp-security-misc-options-menu.php:271 +msgid "Check this if you want to stop REST API access for non-logged in requests." +msgstr "" + +#: admin/wp-security-settings-menu.php:25 +msgid "General settings" +msgstr "常规设置" + +#: admin/wp-security-settings-menu.php:29 +#: admin/wp-security-settings-menu.php:33 +msgid "file" +msgstr "" + +#: admin/wp-security-settings-menu.php:37 +msgid "Delete plugin settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:41 +msgid "WP version info" +msgstr "" + +#: admin/wp-security-settings-menu.php:45 +msgid "Import/Export" +msgstr "导入/导出" + +#: admin/wp-security-settings-menu.php:52 +msgid "Advanced settings" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:128 +msgid "All the security features have been disabled successfully!" +msgstr "已成功禁用所有安全功能!" + +#: admin/wp-security-settings-menu.php:132 +#: admin/wp-security-settings-menu.php:159 +msgid "Could not write to the .htaccess file. Please restore your .htaccess file manually using the restore functionality in the \".htaccess File\"." +msgstr "" + +#: admin/wp-security-settings-menu.php:137 +msgid "Could not write to the wp-config.php. Please restore your wp-config.php file manually using the restore functionality in the \"wp-config.php File\"." +msgstr "" + +#: admin/wp-security-settings-menu.php:155 +msgid "All firewall rules have been disabled successfully!" +msgstr "" + +#: admin/wp-security-settings-menu.php:177 +msgid "Deletion of aio_wp_security_configs option and .htaccess directives failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:179 +msgid "Reset of aio_wp_security_configs option failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:181 +msgid "Deletion of .htaccess directives failed." +msgstr "" + +#: admin/wp-security-settings-menu.php:183 +msgid "All settings have been successfully reset." +msgstr "" + +#: admin/wp-security-settings-menu.php:203 +msgid "For information, updates and documentation, please visit the" +msgstr "有关信息,更新和文档,请访问" + +#: admin/wp-security-settings-menu.php:203 +msgid "Page" +msgstr "页面" + +#: admin/wp-security-settings-menu.php:204 +msgid "Follow us" +msgstr "关注我们" + +#: admin/wp-security-settings-menu.php:204 +msgid "on Twitter, Google+ or via Email to stay up to date about the new security features of this plugin." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:208 +msgid "WP Security plugin" +msgstr "WP安全插件" + +#: admin/wp-security-settings-menu.php:212 +msgid "Thank you for using the AIOS security plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:216 +msgid "There are a lot of security features in this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:221 +msgid "To start, go through each security option and enable the \"basic\" options." +msgstr "" + +#: admin/wp-security-settings-menu.php:225 +msgid "The more features you enable, the more security points you will achieve." +msgstr "" + +#: admin/wp-security-settings-menu.php:228 +msgid "Before doing anything we advise taking a backup of your .htaccess file, database and wp-config.php." +msgstr "" + +#: admin/wp-security-settings-menu.php:231 +msgid "Backup your database" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:232 +#: admin/wp-security-settings-menu.php:433 +msgid "Backup .htaccess file" +msgstr "备份 .htaccess 文件" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:233 +#: admin/wp-security-settings-menu.php:534 +msgid "Backup wp-config.php file" +msgstr "备份 wp-config.php 文件" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:240 +msgid "Disable security features" +msgstr "禁用安全功能" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:246 +msgid "If you think that some plugin functionality on your site is broken due to a security feature you enabled in this plugin, then use the following option to turn off all the security features of this plugin." +msgstr "如果您认为您的网站上的某些插件功能由于您在此插件中启用的安全功能而中断,请使用以下选项关闭此插件的所有安全功能." + +# @ default +#: admin/wp-security-settings-menu.php:250 +msgid "Disable all security features" +msgstr "禁用所有安全功能" + +# @ all-in-one-wp-security-and-firewall +# @ default +#: admin/wp-security-settings-menu.php:257 +#: admin/wp-security-settings-menu.php:267 +msgid "Disable all firewall rules" +msgstr "禁用所有防火墙规则" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:263 +msgid "This feature will disable all firewall rules which are currently active in this plugin and it will also delete these rules from your .htacess file. Use it if you think one of the firewall rules is causing an issue on your site." +msgstr "此功能将禁用在此插件中已激活的所有防火墙规则,同时.htacess中的规则也会被删除。如果您认为其中一个防火墙规则导致您的网站出现问题,请使用它。" + +#: admin/wp-security-settings-menu.php:274 +#: admin/wp-security-settings-menu.php:287 +msgid "Reset settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:279 +msgid "This button click will delete all of your settings related to the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:280 +msgid "This button click will reset/empty all the database tables of the security plugin also." +msgstr "" + +#: admin/wp-security-settings-menu.php:281 +msgid "Use this plugin if you were locked out by the All In One WP Security & Firewall Plugin and/or you are having issues logging in when that plugin is activated." +msgstr "" + +#: admin/wp-security-settings-menu.php:282 +msgid "In addition to the settings it will also delete any directives which were added to the .htaccess file by the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:283 +msgid "%1$sNOTE: %2$sAfter deleting the settings you will need to re-configure the All In One WP Security & Firewall Plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:295 +msgid "Debug settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:301 +msgid "This setting allows you to enable/disable debug for this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:307 +msgid "Enable debug" +msgstr "" + +#: admin/wp-security-settings-menu.php:310 +msgid "Check this if you want to enable debug. You should keep this option disabled after you have finished debugging the issue." +msgstr "" + +#: admin/wp-security-settings-menu.php:314 +msgid "Save debug settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:350 +msgid "Your .htaccess file was successfully backed up! Using an FTP program go to the \"/wp-content/aiowps_backups\" directory to save a copy of the file to your computer." +msgstr "您的.htaccess文件已成功备份!将通过FTP将此目录下\"/wp-content/aiowps_backups\"的文件备份到您的计算机中。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:356 +msgid "htaccess file rename failed during backup. Please check your root directory for the backup file using FTP." +msgstr "备份过程中 htaccess 文件重命名失败。请使用FTP检查备份文件的根目录。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:362 +msgid "htaccess backup failed." +msgstr "htaccess备份失败。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:377 +msgid "Please choose a .htaccess to restore from." +msgstr "请选择要从中还原的.htaccess。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:392 +msgid "htaccess file restore failed. Please attempt to restore the .htaccess manually using FTP." +msgstr "htaccess 文件恢复失败。请尝试使用FTP手动恢复 .htaccess 。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:396 +msgid "Your .htaccess file has successfully been restored!" +msgstr ".htaccess 文件已成功恢复!" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:402 +msgid "htaccess Restore operation failed! Please check the contents of the file you are trying to restore from." +msgstr "htaccess恢复操作失败! 请检查您要从中还原的文件的内容。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:408 +msgid ".htaccess file operations" +msgstr ".htaccess 文件操作" + +#: admin/wp-security-settings-menu.php:411 +msgid "Your \".htaccess\" file is a key component of your website's security and it can be modified to implement various levels of protection mechanisms." +msgstr "" + +#: admin/wp-security-settings-menu.php:412 +msgid "This feature allows you to backup and save your currently active .htaccess file should you need to re-use the the backed up file in the future." +msgstr "" + +#: admin/wp-security-settings-menu.php:413 +msgid "You can also restore your site's .htaccess settings using a backed up .htaccess file." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:428 +msgid "Save the current .htaccess file" +msgstr "保存当前 .htaccess 文件" + +#: admin/wp-security-settings-menu.php:432 +msgid "Click the button below to backup and save the currently active .htaccess file." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:437 +msgid "Restore from a backed up .htaccess file" +msgstr "从备份的.htaccess文件中恢复" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:443 +msgid ".htaccess file to restore from" +msgstr ".htaccess 恢复文件" + +#: admin/wp-security-settings-menu.php:445 +msgid "Select Your htaccess File" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:449 +msgid "After selecting your file, click the button below to restore your site using the backed up htaccess file (htaccess_backup.txt)." +msgstr "选择文件后,单击下面的恢复按钮,来恢复您网站的htaccess文件。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:455 +msgid "Restore .htaccess file" +msgstr "恢复 .htaccess 文件" + +#: admin/wp-security-settings-menu.php:477 +msgid "Please choose a wp-config.php file to restore from." +msgstr "" + +#: admin/wp-security-settings-menu.php:493 +msgid "wp-config.php file restore failed. Please attempt to restore this file manually using FTP." +msgstr "" + +#: admin/wp-security-settings-menu.php:497 +msgid "Your wp-config.php file has successfully been restored!" +msgstr "" + +#: admin/wp-security-settings-menu.php:503 +msgid "wp-config.php Restore operation failed! Please check the contents of the file you are trying to restore from." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:509 +msgid "wp-config.php file operations" +msgstr "wp-config.php 文件操作" + +#: admin/wp-security-settings-menu.php:512 +msgid "Your \"wp-config.php\" file is one of the most important in your WordPress installation. It is a primary configuration file and contains crucial things such as details of your database and other critical components." +msgstr "" + +#: admin/wp-security-settings-menu.php:513 +msgid "This feature allows you to backup and save your currently active wp-config.php file should you need to re-use the the backed up file in the future." +msgstr "" + +#: admin/wp-security-settings-menu.php:514 +msgid "You can also restore your site's wp-config.php settings using a backed up wp-config.php file." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:529 +msgid "Save the current wp-config.php file" +msgstr "保存当前wp-config.php文件" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:533 +msgid "Click the button below to backup and download the contents of the currently active wp-config.php file." +msgstr "点击下面的按钮备份和下载当前活动的wp-config.php文件的内容。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:539 +msgid "Restore from a backed up wp-config file" +msgstr "从备份的wp-config文件恢复" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:545 +msgid "wp-config file to restore from" +msgstr "wp-config 恢复文件" + +#: admin/wp-security-settings-menu.php:547 +msgid "Select Your wp-config File" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:551 +msgid "After selecting your file click the button below to restore your site using the backed up wp-config file (wp-config.php.backup.txt)." +msgstr "选择文件后,单击下面的恢复按钮,来恢复您网站的wp-config文件。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:557 +msgid "Restore wp-config file" +msgstr "恢复 wp-config 文件" + +#: admin/wp-security-settings-menu.php:591 +msgid "Manage delete plugin settings saved." +msgstr "" + +#: admin/wp-security-settings-menu.php:596 +msgid "Manage delete plugin tasks" +msgstr "" + +#: admin/wp-security-settings-menu.php:603 +msgid "Delete database tables" +msgstr "" + +#: admin/wp-security-settings-menu.php:606 +msgid "Check this if you want to remove database tables when the plugin is uninstalled." +msgstr "" + +#: admin/wp-security-settings-menu.php:610 +msgid "Delete settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:613 +msgid "Check this if you want to remove all plugin settings when uninstalling the plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:613 +msgid "It will also remove all custom htaccess rules that were added by this plugin." +msgstr "" + +#: admin/wp-security-settings-menu.php:647 +msgid "WP generator meta tag and version info" +msgstr "" + +#: admin/wp-security-settings-menu.php:650 +msgid "WordPress generator automatically adds some meta information inside the \"head\" tags of every page on your site's front end. Below is an example of this:" +msgstr "" + +#: admin/wp-security-settings-menu.php:652 +msgid "The above meta information shows which version of WordPress your site is currently running and thus can help hackers or crawlers scan your site to see if you have an older version of WordPress or one with a known exploit." +msgstr "" + +#: admin/wp-security-settings-menu.php:653 +msgid "There are also other ways wordpress reveals version info such as during style and script loading. An example of this is:" +msgstr "" + +#: admin/wp-security-settings-menu.php:655 +msgid "This feature will allow you to remove the WP generator meta info and other version info from your site's pages." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:661 +msgid "WP generator meta info" +msgstr "WP生成的元信息" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-settings-menu.php:673 +msgid "Remove WP generator meta info" +msgstr "删除WP生成的元信息" + +#: admin/wp-security-settings-menu.php:676 +msgid "Check this if you want to remove the version and meta info produced by WP from all pages" +msgstr "" + +#: admin/wp-security-settings-menu.php:704 +msgid "Please choose a file to import your settings from." +msgstr "" + +#: admin/wp-security-settings-menu.php:736 +msgid "Import AIOS settings from " +msgstr "" + +#: admin/wp-security-settings-menu.php:742 +#: admin/wp-security-settings-menu.php:786 +msgid "The deletion of the import file failed. Please delete this file manually via the media menu for security purposes." +msgstr "" + +#: admin/wp-security-settings-menu.php:744 +#: admin/wp-security-settings-menu.php:788 +msgid "The file you uploaded was also deleted for security purposes because it contains security settings details." +msgstr "" + +#: admin/wp-security-settings-menu.php:759 +msgid "Your AIOS settings were successfully imported via file input." +msgstr "" + +#: admin/wp-security-settings-menu.php:760 +msgid "The deletion of the import file failed. Please delete this file manually via the media menu for security purposes because it contains security settings details." +msgstr "" + +#: admin/wp-security-settings-menu.php:762 +msgid "Your AIOS settings were successfully imported. The file you uploaded was also deleted for security purposes because it contains security settings details." +msgstr "" + +#: admin/wp-security-settings-menu.php:765 +msgid "Your AIOS settings were successfully imported via text entry." +msgstr "" + +#: admin/wp-security-settings-menu.php:780 +msgid "The contents of your settings file appear invalid. Please check the contents of the file you are trying to import settings from." +msgstr "" + +#: admin/wp-security-settings-menu.php:797 +msgid "Export or import your AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:800 +msgid "This section allows you to export or import your All In One WP Security & Firewall settings." +msgstr "" + +#: admin/wp-security-settings-menu.php:801 +msgid "This can be handy if you wanted to save time by applying the settings from one site to another site." +msgstr "" + +#: admin/wp-security-settings-menu.php:802 +msgid "NOTE: Before importing, it is your responsibility to know what settings you are trying to import. Importing settings blindly can cause you to be locked out of your site." +msgstr "" + +#: admin/wp-security-settings-menu.php:803 +msgid "For Example: If a settings item relies on the domain URL then it may not work correctly when imported into a site with a different domain." +msgstr "" + +#: admin/wp-security-settings-menu.php:809 +#: admin/wp-security-settings-menu.php:818 +msgid "Export AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:815 +msgid "To export your All In One WP Security & Firewall settings click the button below." +msgstr "要导出您的All In One WP安全和防火墙设置,请单击下面的按钮。" + +#: admin/wp-security-settings-menu.php:822 +#: admin/wp-security-settings-menu.php:851 +msgid "Import AIOS settings" +msgstr "" + +#: admin/wp-security-settings-menu.php:828 +msgid "Use this section to import your All In One WP Security & Firewall settings from a file. Alternatively, copy/paste the contents of your import file into the textarea below." +msgstr "" + +#: admin/wp-security-settings-menu.php:830 +msgid "Import file" +msgstr "导入文件" + +#: admin/wp-security-settings-menu.php:833 +msgid "Select Your Import Settings File" +msgstr "" + +#: admin/wp-security-settings-menu.php:837 +msgid "After selecting your file, click the button below to apply the settings to your site." +msgstr "" + +#: admin/wp-security-settings-menu.php:844 +msgid "Copy/Paste import data" +msgstr "复制/粘贴导入数据" + +#: admin/wp-security-settings-menu.php:893 +msgid "Default - if correct, then this is the best option" +msgstr "" + +#: admin/wp-security-settings-menu.php:894 +msgid "Only use if you're using Cloudflare." +msgstr "" + +#: admin/wp-security-settings-menu.php:902 +msgid "(current value: %s)" +msgstr "" + +#: admin/wp-security-settings-menu.php:905 +msgid "no value (i.e. empty) on your server" +msgstr "" + +#: admin/wp-security-spam-menu.php:28 +msgid "Comment spam" +msgstr "" + +#: admin/wp-security-spam-menu.php:29 +msgid "Comment spam IP monitoring" +msgstr "" + +#: admin/wp-security-spam-menu.php:30 +msgid "BuddyPress" +msgstr "" + +#: admin/wp-security-spam-menu.php:31 +msgid "bbPress" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-spam-menu.php:57 +msgid "Spam prevention" +msgstr "垃圾防护" + +#: admin/wp-security-spam-menu.php:99 +msgid "You entered a non numeric value for the \"move spam comments to trash after number of days\" field." +msgstr "" + +#: admin/wp-security-spam-menu.php:99 +#: admin/wp-security-spam-menu.php:297 +#: admin/wp-security-user-login-menu.php:118 +#: admin/wp-security-user-login-menu.php:124 +#: admin/wp-security-user-login-menu.php:130 +#: admin/wp-security-user-login-menu.php:136 +msgid "It has been set to the default value." +msgstr "" + +#: admin/wp-security-spam-menu.php:129 +msgid "Comment spam settings" +msgstr "" + +#: admin/wp-security-spam-menu.php:134 +msgid "Add CAPTCHA to comments form" +msgstr "" + +#: admin/wp-security-spam-menu.php:138 +msgid "This feature will add a CAPTCHA field in the WordPress comments form." +msgstr "" + +#: admin/wp-security-spam-menu.php:139 +msgid "Adding a CAPTCHA field in the comment form is a simple way of greatly reducing spam comments from bots without using .htaccess rules." +msgstr "" + +#: admin/wp-security-spam-menu.php:148 +msgid "Enable CAPTCHA on comment forms" +msgstr "" + +#: admin/wp-security-spam-menu.php:151 +msgid "Check this if you want to insert a CAPTCHA field on the comment forms." +msgstr "" + +#: admin/wp-security-spam-menu.php:158 +msgid "Block spambot comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:162 +msgid "A large portion of WordPress blog comment spam is mainly produced by automated bots and not necessarily by humans." +msgstr "" + +#: admin/wp-security-spam-menu.php:163 +msgid "This feature will greatly minimize the useless and unnecessary traffic and load on your server resulting from spam comments by blocking all comment requests which do not originate from your domain." +msgstr "" + +#: admin/wp-security-spam-menu.php:164 +msgid "In other words, if the comment was not submitted by a human who physically submitted the comment on your site, the request will be blocked." +msgstr "" + +#: admin/wp-security-spam-menu.php:182 +msgid "Block spambots from posting comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:185 +msgid "Check this if you want to apply a firewall rule which will block comments originating from spambots." +msgstr "" + +#: admin/wp-security-spam-menu.php:189 +msgid "This feature will implement a firewall rule to block all comment attempts which do not originate from your domain." +msgstr "" + +#: admin/wp-security-spam-menu.php:190 +msgid "A legitimate comment is one which is submitted by a human who physically fills out the comment form and clicks the submit button. For such events, the HTTP_REFERRER is always set to your own domain." +msgstr "" + +#: admin/wp-security-spam-menu.php:191 +msgid "A comment submitted by a spambot is done by directly calling the comments.php file, which usually means that the HTTP_REFERRER value is not your domain and often times empty." +msgstr "" + +#: admin/wp-security-spam-menu.php:192 +msgid "This feature will check and block comment requests which are not referred by your domain thus greatly reducing your overall blog spam and PHP requests done by the server to process these comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:202 +msgid "Comment processing" +msgstr "" + +#: admin/wp-security-spam-menu.php:207 +msgid "Trash spam comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:216 +msgid "Move spam comments to trash after %s days." +msgstr "" + +#: admin/wp-security-spam-menu.php:224 +msgid "Enable this feature in order to move the spam comments to trash after given number of days." +msgstr "" + +#: admin/wp-security-spam-menu.php:262 +msgid "You entered a non numeric value for the minimum number of spam comments field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-spam-menu.php:265 +msgid "You must enter an integer greater than zero for minimum number of spam comments field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-spam-menu.php:292 +msgid "Nonce check failed for list spam comment IPs." +msgstr "" + +#: admin/wp-security-spam-menu.php:297 +msgid "You entered a non numeric value for the minimum spam comments per IP field." +msgstr "" + +#: admin/wp-security-spam-menu.php:308 +msgid "Displaying results for IP addresses which have posted a minimum of %s spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:323 +msgid "Auto block spammer IPs" +msgstr "" + +#: admin/wp-security-spam-menu.php:328 +msgid "This feature has detected that %s is not active. It is highly recommended that you activate the Akismet plugin to make the most of this feature." +msgstr "" + +#: admin/wp-security-spam-menu.php:337 +msgid "This feature allows you to automatically and permanently block IP addresses which have exceeded a certain number of comments labelled as spam." +msgstr "" + +#: admin/wp-security-spam-menu.php:338 +msgid "Comments are usually labelled as spam either by the Akismet plugin or manually by the WP administrator when they mark a comment as \"spam\" from the WordPress Comments menu." +msgstr "" + +#: admin/wp-security-spam-menu.php:352 +msgid "You currently have no IP addresses permanently blocked due to spam." +msgstr "" + +#: admin/wp-security-spam-menu.php:365 +msgid "Spammer IPs added to permanent block list today: " +msgstr "" + +#: admin/wp-security-spam-menu.php:366 +msgid "All time total: " +msgstr "" + +#: admin/wp-security-spam-menu.php:367 +msgid "View blocked IPs" +msgstr "" + +#: admin/wp-security-spam-menu.php:380 +msgid "Enable auto block of spam comment IPs" +msgstr "" + +#: admin/wp-security-spam-menu.php:383 +msgid "Check this box if you want this plugin to automatically block IP addresses which submit spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:387 +msgid "Minimum number of spam comments" +msgstr "" + +#: admin/wp-security-spam-menu.php:389 +msgid "Specify the minimum number of spam comments for an IP address before it is permanently blocked." +msgstr "" + +#: admin/wp-security-spam-menu.php:393 +msgid "Example 1: Setting this value to \"1\" will block ALL IP addresses which were used to submit at least one spam comment." +msgstr "" + +#: admin/wp-security-spam-menu.php:394 +msgid "Example 2: Setting this value to \"5\" will block only those IP addresses which were used to submit 5 spam comments or more on your site." +msgstr "" + +#: admin/wp-security-spam-menu.php:412 +msgid "List spammer IP addresses" +msgstr "" + +#: admin/wp-security-spam-menu.php:416 +msgid "This section displays a list of the IP addresses of the people or bots who have left spam comments on your site." +msgstr "" + +#: admin/wp-security-spam-menu.php:417 +msgid "This information can be handy for identifying the most persistent IP addresses or ranges used by spammers." +msgstr "" + +#: admin/wp-security-spam-menu.php:418 +msgid "By inspecting the IP address data coming from spammers you will be in a better position to determine which addresses or address ranges you should block by adding them to the permanent block list." +msgstr "" + +#: admin/wp-security-spam-menu.php:419 +msgid "To add one or more of the IP addresses displayed in the table below to your blacklist, simply click the \"Block\" link for the individual row or select more than one address using the checkboxes and then choose the \"block\" option from the Bulk Actions dropdown list and click the \"Apply\" button." +msgstr "" + +#: admin/wp-security-spam-menu.php:427 +msgid "Minimum number of spam comments per IP" +msgstr "" + +#: admin/wp-security-spam-menu.php:429 +msgid "This field allows you to list only those IP addresses which have been used to post X or more spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:433 +msgid "Example 1: Setting this value to \"0\" or \"1\" will list ALL IP addresses which were used to submit spam comments." +msgstr "" + +#: admin/wp-security-spam-menu.php:434 +msgid "Example 2: Setting this value to \"5\" will list only those IP addresses which were used to submit 5 spam comments or more on your site." +msgstr "" + +#: admin/wp-security-spam-menu.php:441 +msgid "Find IP addresses" +msgstr "" + +#: admin/wp-security-spam-menu.php:445 +msgid "Spammer IP address results" +msgstr "" + +#: admin/wp-security-spam-menu.php:451 +#: classes/wp-security-utility.php:253 +msgid "The plugin has detected that you are using a Multi-Site WordPress installation." +msgstr "" + +#: admin/wp-security-spam-menu.php:452 +msgid "Only the \"superadmin\" can block IP addresses from the main site." +msgstr "" + +#: admin/wp-security-spam-menu.php:453 +msgid "Take note of the IP addresses you want blocked and ask the superadmin to add these to the blacklist using the \"Blacklist Manager\" on the main site." +msgstr "" + +#: admin/wp-security-spam-menu.php:498 +msgid "BuddyPress spam settings" +msgstr "" + +#: admin/wp-security-spam-menu.php:503 +msgid "Add CAPTCHA to BuddyPress registration form" +msgstr "" + +#: admin/wp-security-spam-menu.php:507 +msgid "This feature will add a simple math CAPTCHA field in the BuddyPress registration form." +msgstr "" + +#: admin/wp-security-spam-menu.php:508 +msgid "Adding a CAPTCHA field in the registration form is a simple way of greatly reducing spam signups from bots without using .htaccess rules." +msgstr "" + +#: admin/wp-security-spam-menu.php:518 +msgid "Enable CAPTCHA on BuddyPress registration form" +msgstr "" + +#: admin/wp-security-spam-menu.php:521 +msgid "Check this if you want to insert a CAPTCHA field on the BuddyPress registration forms." +msgstr "" + +#: admin/wp-security-spam-menu.php:530 +msgid "BuddyPress is not active! In order to use this feature you will need to have BuddyPress installed and activated." +msgstr "" + +#: admin/wp-security-spam-menu.php:560 +msgid "bbPress spam settings" +msgstr "" + +#: admin/wp-security-spam-menu.php:565 +msgid "Add CAPTCHA to bbPress new topic form" +msgstr "" + +#: admin/wp-security-spam-menu.php:569 +msgid "This feature will add a simple math CAPTCHA field in the bbPress new topic form." +msgstr "" + +#: admin/wp-security-spam-menu.php:570 +msgid "Adding a CAPTCHA field in this form is a simple way of greatly reducing spam submitted from bots." +msgstr "" + +#: admin/wp-security-spam-menu.php:580 +msgid "Enable CAPTCHA on bbPress new topic form" +msgstr "" + +#: admin/wp-security-spam-menu.php:583 +msgid "Check this if you want to insert a CAPTCHA field on the bbPress new topic forms." +msgstr "" + +#: admin/wp-security-spam-menu.php:592 +msgid "bbPress is not active. In order to use this feature you will need to have bbPress installed and activated." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-tools-menu.php:34 +msgid "WHOIS lookup" +msgstr "WHOIS 查询" + +#: admin/wp-security-tools-menu.php:95 +#: admin/wp-security-tools-menu.php:136 +msgid "Querying %s: %s" +msgstr "" + +#: admin/wp-security-tools-menu.php:103 +#: admin/wp-security-tools-menu.php:112 +#: admin/wp-security-tools-menu.php:151 +msgid "Redirected to %s" +msgstr "" + +#: admin/wp-security-tools-menu.php:173 +msgid "The WHOIS lookup feature gives you a way to look up who owns an IP address or domain name." +msgstr "" + +#: admin/wp-security-tools-menu.php:173 +msgid "You can use this to investigate users engaging in malicious activity on your site." +msgstr "" + +#: admin/wp-security-tools-menu.php:176 +msgid "WHOIS lookup on IP or domain" +msgstr "" + +#: admin/wp-security-tools-menu.php:183 +msgid "IP address or domain name:" +msgstr "" + +#: admin/wp-security-tools-menu.php:190 +msgid "Look up IP or domain" +msgstr "" + +#: admin/wp-security-tools-menu.php:219 +msgid "Please enter a valid IP address or domain name to look up." +msgstr "" + +#: admin/wp-security-tools-menu.php:220 +#: admin/wp-security-tools-menu.php:226 +msgid "Nothing to show." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:32 +msgid "WP username" +msgstr "WP 用户名" + +#: admin/wp-security-user-accounts-menu.php:33 +msgid "Display name" +msgstr "昵称安全" + +#: admin/wp-security-user-accounts-menu.php:34 +msgid "Password" +msgstr "密码" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:60 +msgid "User accounts" +msgstr "用户账户" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:82 +msgid "Admin user security" +msgstr "管理员用户安全" + +#: admin/wp-security-user-accounts-menu.php:85 +msgid "By default, WordPress sets the administrator username to \"admin\" at installation time." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:86 +msgid "A lot of hackers try to take advantage of this information by attempting \"Brute force login attacks\" where they repeatedly try to guess the password by using \"admin\" for username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:87 +msgid "From a security perspective, changing the default \"admin\" user name is one of the first and smartest things you should do on your site." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:88 +msgid "This feature will allow you to change your default \"admin\" user name to a more secure name of your choosing." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:95 +msgid "List of administrator accounts" +msgstr "管理员帐户列表" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:104 +#: classes/grade-system/wp-security-feature-item-manager.php:43 +msgid "Change admin username" +msgstr "更改管理员用户名" + +#: admin/wp-security-user-accounts-menu.php:112 +msgid "Your site currently has an account which uses the default \"admin\" username. It is highly recommended that you change this name to something else. Use the following field to change the admin username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:118 +msgid "New admin username" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:120 +msgid "Choose a new username for admin." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:124 +msgid "Change username" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:126 +msgid "NOTE: If you are currently logged in as \"admin\" you will be automatically logged out after changing your username and will be required to log back in." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:133 +msgid "No action required! " +msgstr "无需执行任何操作!" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:135 +msgid "Your site does not have any account which uses the default \"admin\" username. " +msgstr "您的网站没有任何使用默认“admin”用户名的帐户。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:136 +msgid "This is good security practice." +msgstr "这是很好的安全措施。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:148 +msgid "Display name security" +msgstr "昵称安全" + +#: admin/wp-security-user-accounts-menu.php:151 +msgid "When you submit a post or answer a comment, WordPress will usually display your \"nickname\"." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:152 +msgid "By default the nickname is set to the login (or user) name of your account." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:153 +msgid "From a security perspective, leaving your nickname the same as your user name is bad practice because it gives a hacker at least half of your account's login credentials." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:154 +msgid "Therefore to further tighten your site's security you are advised to change your nickname and Display name to be different from your Username." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:160 +msgid "Modify accounts with identical login name and display name" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:169 +msgid "Your site currently has the following accounts which have an identical login name and display name." +msgstr "您的网站目前有下列帐户的登录名和昵称是相同的。" + +#: admin/wp-security-user-accounts-menu.php:170 +msgid "Follow the link to edit the user profile of that particular user account, change Nickname, choose a different Display name compared to Username, and press the \"Update User\" button.)" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:185 +msgid "No action required." +msgstr "无需执行任何操作。" + +#: admin/wp-security-user-accounts-menu.php:186 +msgid "Your site does not have a user account where the display name is identical to the username." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:197 +msgid "Password tool" +msgstr "密码工具" + +#: admin/wp-security-user-accounts-menu.php:200 +msgid "Poor password selection is one of the most common weak points of many sites and is usually the first thing a hacker will try to exploit when attempting to break into your site." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:201 +msgid "Many people fall into the trap of using a simple word or series of numbers as their password. Such a predictable and simple password would take a competent hacker merely minutes to guess your password by using a simple script which cycles through the easy and most common combinations." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:202 +msgid "The longer and more complex your password is the harder it is for hackers to \"crack\" because more complex passwords require much greater computing power and time." +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:203 +msgid "This section contains a useful password strength tool which you can use to check whether your password is sufficiently strong enough." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:208 +msgid "Password strength tool" +msgstr "密码强度工具" + +#: admin/wp-security-user-accounts-menu.php:210 +msgid "This password tool uses an algorithm which calculates how long it would take for your password to be cracked using the computing power of an off-the-shelf current model desktop PC with high end processor, graphics card and appropriate password cracking software." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:213 +msgid "Start typing a password." +msgstr "输入一个密码。" + +#: admin/wp-security-user-accounts-menu.php:216 +msgid "It would take a desktop PC approximately" +msgstr "一台台式电脑需要约" + +#: admin/wp-security-user-accounts-menu.php:217 +msgid "1 sec" +msgstr "1秒" + +#: admin/wp-security-user-accounts-menu.php:217 +msgid "to crack your password!" +msgstr "破解您的密码!" + +#: admin/wp-security-user-accounts-menu.php:222 +msgid "Password Strength" +msgstr "密码强度" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:245 +msgid "Username " +msgstr "用户名" + +#: admin/wp-security-user-accounts-menu.php:245 +msgid " already exists. Please enter another value. " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:262 +msgid "The database update operation of the user account failed!" +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:291 +msgid "You entered an invalid username. Please enter another value. " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:295 +msgid "Please enter a value for your username. " +msgstr "" + +#: admin/wp-security-user-accounts-menu.php:302 +msgid "Username successfully changed." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-accounts-menu.php:322 +msgid "Account login name" +msgstr "帐户登录名" + +#: admin/wp-security-user-accounts-menu.php:331 +msgid "Edit user" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:54 +#: admin/wp-security-user-login-menu.php:474 +msgid "Failed login records" +msgstr "登录失败记录" + +#: admin/wp-security-user-login-menu.php:55 +#: classes/grade-system/wp-security-feature-item-manager.php:51 +msgid "Force logout" +msgstr "强制注销" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:56 +#: admin/wp-security-user-login-menu.php:632 +msgid "Account activity logs" +msgstr "帐户活动日志" + +#: admin/wp-security-user-login-menu.php:58 +#: admin/wp-security-user-login-menu.php:769 +msgid "Additional settings" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:81 +msgid "User login" +msgstr "用户登录" + +#: admin/wp-security-user-login-menu.php:118 +msgid "You entered a non-numeric value for the max login attempts field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:124 +msgid "You entered a non numeric value for the login retry time period field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:130 +msgid "You entered a non numeric value for the lockout time length field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:136 +msgid "You entered a non numeric value for the maximum lockout time length field." +msgstr "" + +#: admin/wp-security-user-login-menu.php:141 +msgid "You entered an invalid minimum lockout time length, it must be less than the maximum lockout time length value." +msgstr "" + +#: admin/wp-security-user-login-menu.php:141 +msgid "Both have been set to the default values." +msgstr "" + +#: admin/wp-security-user-login-menu.php:160 +msgid "Please fill in one or more email addresses to notify." +msgstr "" + +#: admin/wp-security-user-login-menu.php:162 +msgid "You have entered one or more invalid email addresses." +msgstr "" + +#: admin/wp-security-user-login-menu.php:165 +msgid "It has been set to your WordPress admin email as default." +msgstr "" + +#: admin/wp-security-user-login-menu.php:250 +msgid "Login lockout configuration" +msgstr "" + +#: admin/wp-security-user-login-menu.php:254 +msgid "One of the ways hackers try to compromise sites is via a " +msgstr "" + +#: admin/wp-security-user-login-menu.php:254 +msgid "Brute force login attack" +msgstr "" + +#: admin/wp-security-user-login-menu.php:254 +msgid "This is where attackers use repeated login attempts until they guess the password." +msgstr "" + +#: admin/wp-security-user-login-menu.php:255 +msgid "Apart from choosing strong passwords, monitoring and blocking IP addresses which are involved in repeated login failures in a short period of time is a very effective way to stop these types of attacks." +msgstr "" + +#: admin/wp-security-user-login-menu.php:256 +msgid "You may also want to checkout our %s feature for another secure way to protect against these types of attacks." +msgstr "" + +#: admin/wp-security-user-login-menu.php:261 +msgid "Login lockout options" +msgstr "" + +#: admin/wp-security-user-login-menu.php:272 +msgid "Enable login lockout feature" +msgstr "" + +#: admin/wp-security-user-login-menu.php:275 +msgid "Check this if you want to enable the login lockout feature and apply the settings below" +msgstr "" + +#: admin/wp-security-user-login-menu.php:279 +msgid "Allow unlock requests" +msgstr "允许解锁请求" + +#: admin/wp-security-user-login-menu.php:282 +msgid "Check this if you want to allow users to generate an automated unlock request link which will unlock their account" +msgstr "如果您希望允许用户生成自动解锁请求链接,解锁其帐户,请选中此项" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:286 +msgid "Max login attempts" +msgstr "最大登录尝试" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:288 +msgid "Set the value for the maximum login retries before IP address is locked out" +msgstr "设置IP地址被锁定前的登录次数" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:292 +msgid "Login retry time period (min)" +msgstr "登录重试时间 (分钟)" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:294 +msgid "If the maximum number of failed login attempts for a particular IP address occur within this time period the plugin will lock out that address" +msgstr "如果在此时间段内,特定IP地址达到最大失败登录尝试次数时,插件将锁定该地址" + +#: admin/wp-security-user-login-menu.php:299 +msgid "Minimum lockout time length" +msgstr "" + +#: admin/wp-security-user-login-menu.php:305 +msgid "Set the minimum time period in minutes of lockout." +msgstr "" + +#: admin/wp-security-user-login-menu.php:306 +msgid "This failed login lockout time will be tripled on each failed login." +msgstr "" + +#: admin/wp-security-user-login-menu.php:313 +msgid "Maximum lockout time length" +msgstr "" + +#: admin/wp-security-user-login-menu.php:318 +msgid "Set the maximum time period in minutes of lockout." +msgstr "" + +#: admin/wp-security-user-login-menu.php:319 +msgid "No IP address will be blocked for more than this time period after making a failed login attempt." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:324 +msgid "Display generic error message" +msgstr "显示通用错误消息" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:327 +msgid "Check this if you want to show a generic error message when a login attempt fails" +msgstr "如果您希望在登录尝试失败时显示通用错误消息,请选中此项" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:331 +msgid "Instantly lockout invalid usernames" +msgstr "即时锁定无效的用户名" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:334 +msgid "Check this if you want to instantly lockout login attempts with usernames which do not exist on your system" +msgstr "如果您想立即锁定系统中不存在的用户名登录尝试,请选中此项" + +#: admin/wp-security-user-login-menu.php:339 +msgid "Instantly lockout specific usernames" +msgstr "即时锁定特定的用户名" + +#: admin/wp-security-user-login-menu.php:349 +msgid "Insert one username per line. Existing usernames are not blocked even if present in the list." +msgstr "每行插入一个用户名。" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:354 +msgid "Notify by email" +msgstr "通过邮件通知" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:358 +msgid "Check this if you want to receive an email when someone has been locked out due to maximum failed login attempts" +msgstr "如果您希望通过邮件收到因登录失败而导致锁定的消息,请选中此项" + +#: admin/wp-security-user-login-menu.php:361 +msgid "Fill in one email address per line." +msgstr "" + +#: admin/wp-security-user-login-menu.php:365 +msgid "Each email address must be on a new line." +msgstr "" + +#: admin/wp-security-user-login-menu.php:366 +msgid "If a valid email address has not been filled in, it will not be saved." +msgstr "" + +#: admin/wp-security-user-login-menu.php:367 +msgid "The valid email address format is userid@example.com" +msgstr "" + +#: admin/wp-security-user-login-menu.php:368 +msgid "Example: %s" +msgstr "" + +#: admin/wp-security-user-login-menu.php:375 +msgid "Enable PHP backtrace in email" +msgstr "" + +#: admin/wp-security-user-login-menu.php:379 +msgid "Check this if you want to include the PHP backtrace in notification emails." +msgstr "" + +#: admin/wp-security-user-login-menu.php:379 +msgid "This is internal coding information which makes it easier to investigate where an issued occurred." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:389 +msgid "Currently locked out IP address ranges" +msgstr "当前被锁定的 IP 地址和范围" + +#: admin/wp-security-user-login-menu.php:394 +msgid "To see a list of all locked IP addresses and ranges go to the %s tab in the dashboard menu." +msgstr "要查看所有已锁定的IP地址和范围的列表,请转到控制表菜单中的 %s 选项卡。" + +#: admin/wp-security-user-login-menu.php:399 +msgid "Login lockout IP whitelist settings" +msgstr "" + +#: admin/wp-security-user-login-menu.php:405 +msgid "Enable login lockout IP whitelist" +msgstr "" + +#: admin/wp-security-user-login-menu.php:416 +msgid "The addresses specified here will never be blocked by the login lockout feature." +msgstr "" + +#: admin/wp-security-user-login-menu.php:450 +msgid "User login feature - Delete all failed login records operation failed." +msgstr "" + +#: admin/wp-security-user-login-menu.php:452 +msgid "All records from the failed logins table were deleted successfully." +msgstr "" + +#: admin/wp-security-user-login-menu.php:467 +msgid "This tab displays the failed login attempts for your site." +msgstr "" + +#: admin/wp-security-user-login-menu.php:468 +msgid "The information below can be handy if you need to do security investigations because it will show you the IP range, username and ID (if applicable) and the time/date of the failed login attempt." +msgstr "" + +#: admin/wp-security-user-login-menu.php:469 +msgid "Failed login records that are older than %1$d days are purged automatically." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:508 +#: admin/wp-security-user-login-menu.php:517 +msgid "Delete all failed login records" +msgstr "删除所有失败的登录记录" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:514 +msgid "Click this button if you wish to delete all failed login records in one go." +msgstr "如果你要一次性删除所有失败的登录记录,请单击此按钮。" + +#: admin/wp-security-user-login-menu.php:544 +msgid "You entered a non numeric value for the logout time period field. It has been set to the default value." +msgstr "" + +#: admin/wp-security-user-login-menu.php:569 +msgid "Setting an expiry period for your WP administration session is a simple way to protect against unauthorized access to your site from your computer." +msgstr "" + +#: admin/wp-security-user-login-menu.php:570 +msgid "This feature allows you to specify a time period in minutes after which the admin session will expire and the user will be forced to log back in." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:575 +msgid "Force user logout options" +msgstr "强制用户注销选项" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:587 +msgid "Enable force WP user logout" +msgstr "启用强制WP用户注销" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:590 +msgid "Check this if you want to force a wp user to be logged out after a configured amount of time" +msgstr "如果您想强制wp用户在配置的时间后退出,请选中此项" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:594 +msgid "Logout the WP user after XX minutes" +msgstr "在XX分钟后注销WP用户" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:596 +msgid "(Minutes) The user will be forced to log back in after this time period has elapased." +msgstr "(分钟) 在此时间段过后,用户将被强制重新登录。" + +#: admin/wp-security-user-login-menu.php:625 +msgid "This tab displays the activity for accounts registered with your site that have logged in using the WordPress login form." +msgstr "" + +#: admin/wp-security-user-login-menu.php:626 +msgid "The information below can be handy if you need to do security investigations because it will show you the last 100 recent login events by username, IP address and time/date." +msgstr "" + +#: admin/wp-security-user-login-menu.php:627 +msgid "Account activity logs that are older than %1$d days are purged automatically." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:697 +msgid "Refresh logged in user data" +msgstr "刷新登录用户数据" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:701 +msgid "Refresh data" +msgstr "刷新数据" + +#: admin/wp-security-user-login-menu.php:706 +msgid "This tab displays all users who are currently logged into your site." +msgstr "" + +#: admin/wp-security-user-login-menu.php:707 +msgid "If you suspect there is a user or users who are logged in which should not be, you can block them by inspecting the IP addresses from the data below and adding them to your blacklist." +msgstr "" + +#: admin/wp-security-user-login-menu.php:708 +msgid "You can also instantly log them out by clicking on the \"Force logout\" link when you hover over the row in the user id column." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: admin/wp-security-user-login-menu.php:713 +msgid "Currently logged in users" +msgstr "当前登录用户" + +#: admin/wp-security-user-login-menu.php:761 +msgid "WordPress 5.6 introduced a new feature called \"Application passwords\"." +msgstr "" + +#: admin/wp-security-user-login-menu.php:762 +msgid "This allows you to create a token from the WordPress dashboard which then can be used in the authorization header." +msgstr "" + +#: admin/wp-security-user-login-menu.php:763 +msgid "This feature allows you to disable application passwords as they can leave your site vulnerable to social engineering and phishing scams." +msgstr "" + +#: admin/wp-security-user-login-menu.php:780 +#: classes/grade-system/wp-security-feature-item-manager.php:53 +msgid "Disable application password" +msgstr "" + +#: admin/wp-security-user-login-menu.php:783 +msgid "Check this if you want to disable the application password." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:27 +msgid "Manual approval" +msgstr "人工审核" + +#: admin/wp-security-user-registration-menu.php:28 +#: classes/grade-system/wp-security-feature-item-manager.php:59 +msgid "Registration CAPTCHA" +msgstr "注册验证码" + +#: admin/wp-security-user-registration-menu.php:29 +msgid "Registration honeypot" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:55 +msgid "User registration" +msgstr "用户注册" + +#: admin/wp-security-user-registration-menu.php:115 +msgid "User registration settings" +msgstr "用户注册设置" + +#: admin/wp-security-user-registration-menu.php:119 +msgid "Manually approve new registrations" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:123 +msgid "If your site allows people to create their own accounts via the WordPress registration form, then you can minimize spam or bogus registrations by manually approving each registration." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:124 +msgid "This feature will automatically set a newly registered account to \"pending\" until the administrator activates it. Therefore undesirable registrants will be unable to log in without your express approval." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:125 +msgid "You can view all accounts which have been newly registered via the handy table below and you can also perform bulk activation/deactivation/deletion tasks on each account." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:142 +msgid "Enable manual approval of new registrations" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:145 +msgid "Check this if you want to automatically disable all newly registered accounts so that you can approve them manually." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:154 +msgid "Approve registered users" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:206 +msgid "This feature allows you to add a CAPTCHA form on the WordPress registration page." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:207 +msgid "Users who attempt to register will also need to enter the answer to a simple mathematical question - if they enter the wrong answer, the plugin will not allow them to register." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:208 +msgid "Therefore, adding a CAPTCHA form on the registration page is another effective yet simple spam registration prevention technique." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:212 +msgid "Registration page CAPTCHA settings" +msgstr "注册页面验证码设置" + +#: admin/wp-security-user-registration-menu.php:219 +msgid "The core default behaviour for WordPress Multi Site regarding user registration is that all users are registered via the main site." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:220 +msgid "Therefore, if you would like to add a CAPTCHA form to the registration page for a Multi Site, please go to \"Registration CAPTCHA\" settings on the main site." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:235 +msgid "Enable CAPTCHA on registration page" +msgstr "在注册页面上启用验证码" + +#: admin/wp-security-user-registration-menu.php:238 +msgid "Check this if you want to insert a CAPTCHA form on the WordPress user registration page (if you allow user registration)." +msgstr "如果您要在WordPress用户注册页面上插入验证码表单(如果您允许用户注册),请选中此项。" + +#: admin/wp-security-user-registration-menu.php:276 +msgid "This feature allows you to add a special hidden \"honeypot\" field on the WordPress registration page. This will only be visible to robots and not humans." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:277 +msgid "Since robots usually fill in every input field from a registration form, they will also submit a value for the special hidden honeypot field." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:279 +msgid "Therefore, if the plugin detects that this field has a value when the registration form is submitted, then the robot which is attempting to register on your site will be redirected to its localhost address - http://127.0.0.1." +msgstr "" + +#: admin/wp-security-user-registration-menu.php:285 +msgid "Registration form honeypot settings" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:296 +msgid "Enable honeypot on registration page" +msgstr "" + +#: admin/wp-security-user-registration-menu.php:299 +msgid "Check this if you want to enable the honeypot feature for the registration page" +msgstr "" + +#: classes/aios-ajax.php:89 +msgid "Invalid IP retrieve method." +msgstr "" + +#: classes/aios-ajax.php:131 +#: wp-security-core.php:258 +msgid "The security check failed; try refreshing the page." +msgstr "" + +#: classes/aios-ajax.php:152 +#: wp-security-core.php:268 +msgid "You are not allowed to run this command." +msgstr "" + +#: classes/aios-ajax.php:173 +#: wp-security-core.php:282 +msgid "Options can only be saved by network admin" +msgstr "" + +#: classes/aios-ajax.php:202 +msgid "The command \"%s\" was not found" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:39 +msgid "Remove WP generator meta tag" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:45 +msgid "Change display name" +msgstr "更改显示名称" + +#: classes/grade-system/wp-security-feature-item-manager.php:57 +msgid "Registration approval" +msgstr "人工审核" + +#: classes/grade-system/wp-security-feature-item-manager.php:61 +msgid "Enable registration honeypot" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:73 +msgid "WordPress files access" +msgstr "WordPress文件访问" + +#: classes/grade-system/wp-security-feature-item-manager.php:77 +msgid "IP and user agent blacklisting" +msgstr "IP和用户代理黑名单" + +#: classes/grade-system/wp-security-feature-item-manager.php:81 +msgid "Enable basic firewall" +msgstr "启用基本防火墙" + +#: classes/grade-system/wp-security-feature-item-manager.php:82 +msgid "Enable pingback vulnerability protection" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:83 +msgid "Block access to debug log file" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:87 +msgid "Forbid proxy comments" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:88 +msgid "Deny bad queries" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:91 +msgid "5G/6G blacklist" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:97 +msgid "Enable IP blocking for 404 detection" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:101 +msgid "Enable rename login page" +msgstr "启用重命名登录页面" + +#: classes/grade-system/wp-security-feature-item-manager.php:106 +msgid "Lost password CAPTCHA" +msgstr "忘记密码验证码" + +#: classes/grade-system/wp-security-feature-item-manager.php:107 +msgid "Custom login CAPTCHA" +msgstr "自定义登录验证码" + +#: classes/grade-system/wp-security-feature-item-manager.php:108 +msgid "Woo login CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:109 +msgid "Woo lost password CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:110 +msgid "Woo register CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:112 +msgid "Login IP whitelisting" +msgstr "登录IP白名单" + +#: classes/grade-system/wp-security-feature-item-manager.php:114 +msgid "Enable login honeypot" +msgstr "启用登录蜜罐" + +#: classes/grade-system/wp-security-feature-item-manager.php:118 +msgid "Comment CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:119 +msgid "Block spambots" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:121 +msgid "BuddyPress registration CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item-manager.php:123 +msgid "bbPress new topic CAPTCHA" +msgstr "" + +#: classes/grade-system/wp-security-feature-item.php:29 +msgid "Basic" +msgstr "基本" + +#: classes/grade-system/wp-security-feature-item.php:31 +msgid "Intermediate" +msgstr "中级" + +#: classes/grade-system/wp-security-feature-item.php:33 +msgid "Advanced" +msgstr "高级" + +#: classes/wp-security-captcha.php:47 +#: classes/wp-security-general-init-tasks.php:407 +msgid "Please enter an answer in digits:" +msgstr "请输入数字答案:" + +#: classes/wp-security-captcha.php:127 +msgid "one" +msgstr "1" + +#: classes/wp-security-captcha.php:128 +msgid "two" +msgstr "2" + +#: classes/wp-security-captcha.php:129 +msgid "three" +msgstr "3" + +#: classes/wp-security-captcha.php:130 +msgid "four" +msgstr "4" + +#: classes/wp-security-captcha.php:131 +msgid "five" +msgstr "5" + +#: classes/wp-security-captcha.php:132 +msgid "six" +msgstr "6" + +#: classes/wp-security-captcha.php:133 +msgid "seven" +msgstr "7" + +#: classes/wp-security-captcha.php:134 +msgid "eight" +msgstr "8" + +#: classes/wp-security-captcha.php:135 +msgid "nine" +msgstr "9" + +#: classes/wp-security-captcha.php:136 +msgid "ten" +msgstr "10" + +#: classes/wp-security-captcha.php:137 +msgid "eleven" +msgstr "11" + +#: classes/wp-security-captcha.php:138 +msgid "twelve" +msgstr "12" + +#: classes/wp-security-captcha.php:139 +msgid "thirteen" +msgstr "13" + +#: classes/wp-security-captcha.php:140 +msgid "fourteen" +msgstr "14" + +#: classes/wp-security-captcha.php:141 +msgid "fifteen" +msgstr "15" + +#: classes/wp-security-captcha.php:142 +msgid "sixteen" +msgstr "16" + +#: classes/wp-security-captcha.php:143 +msgid "seventeen" +msgstr "17" + +#: classes/wp-security-captcha.php:144 +msgid "eighteen" +msgstr "18" + +#: classes/wp-security-captcha.php:145 +msgid "nineteen" +msgstr "19" + +#: classes/wp-security-captcha.php:146 +msgid "twenty" +msgstr "20" + +#: classes/wp-security-cronjob-handler.php:34 +msgid "Every 15 minutes" +msgstr "" + +#: classes/wp-security-debug-logger.php:46 +msgid "Unable to get the reason why" +msgstr "" + +#: classes/wp-security-debug-logger.php:47 +msgid "Unable to clear the logs" +msgstr "" + +#: classes/wp-security-file-scan.php:85 +msgid "All In One WP Security - File change detected!" +msgstr "" + +#: classes/wp-security-file-scan.php:87 +msgid "A file change was detected on your system for site URL" +msgstr "" + +#: classes/wp-security-file-scan.php:87 +msgid ". Scan was generated on" +msgstr "" + +#: classes/wp-security-file-scan.php:88 +msgid "A summary of the scan results is shown below:" +msgstr "" + +#: classes/wp-security-file-scan.php:91 +msgid "Login to your site to view the scan details." +msgstr "" + +#: classes/wp-security-file-scan.php:313 +msgid "The following files were added to your host" +msgstr "" + +#: classes/wp-security-file-scan.php:315 +#: classes/wp-security-file-scan.php:323 +#: classes/wp-security-file-scan.php:332 +msgid "modified on: " +msgstr "" + +#: classes/wp-security-file-scan.php:321 +msgid "The following files were removed from your host" +msgstr "" + +#: classes/wp-security-file-scan.php:330 +msgid "The following files were changed on your host" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:212 +#: classes/wp-security-general-init-tasks.php:481 +msgid "Application passwords have been disabled by All In One WP Security & Firewall plugin." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:428 +#: classes/wp-security-general-init-tasks.php:541 +#: classes/wp-security-general-init-tasks.php:574 +#: classes/wp-security-user-login.php:137 +#: classes/wp-security-user-registration.php:74 +msgid "ERROR: Your answer was incorrect - please try again." +msgstr "错误:您的验证码答案不正确 - 请再试一次。" + +#: classes/wp-security-general-init-tasks.php:463 +msgid "Enter something special:" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:476 +msgid "Application passwords" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:485 +msgid "Change setting" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:487 +msgid "Site admin can only change this setting." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:516 +msgid "Error: You entered an incorrect CAPTCHA answer. Please go back and try again." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:558 +msgid "Your CAPTCHA answer was incorrect - please try again." +msgstr "" + +#: classes/wp-security-general-init-tasks.php:567 +msgid "ERROR: Your IP address is currently locked please contact the administrator!" +msgstr "" + +#. translators: %s: Admin Dashboard > WP Security > Brute Force > Login CAPTCHA Tab Link +#: classes/wp-security-general-init-tasks.php:642 +msgid "Your Google reCAPTCHA site key is wrong. Please fill the correct reCAPTCHA keys %s to use the Google reCAPTCHA feature." +msgstr "" + +#. translators: %s: Admin Dashboard > WP Security > Brute Force > Login CAPTCHA Tab Link +#: classes/wp-security-general-init-tasks.php:642 +#: classes/wp-security-notices.php:99 +msgid "here" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +msgid "Would you like All In One WP Security & Firewall to re-insert the security rules in your .htaccess file which were cleared when you deactivated the plugin?" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +#: templates/may-also-like.php:40 +#: templates/may-also-like.php:43 +#: templates/may-also-like.php:54 +#: templates/may-also-like.php:57 +#: templates/may-also-like.php:68 +#: templates/may-also-like.php:71 +#: templates/may-also-like.php:91 +#: templates/may-also-like.php:103 +#: templates/may-also-like.php:115 +#: templates/may-also-like.php:127 +#: templates/may-also-like.php:139 +#: templates/may-also-like.php:151 +#: templates/may-also-like.php:168 +#: templates/may-also-like.php:171 +#: templates/may-also-like.php:183 +#: templates/may-also-like.php:195 +#: templates/may-also-like.php:207 +#: templates/may-also-like.php:219 +#: templates/may-also-like.php:231 +#: templates/may-also-like.php:243 +#: templates/may-also-like.php:252 +#: templates/may-also-like.php:255 +#: templates/may-also-like.php:264 +#: templates/may-also-like.php:267 +#: templates/may-also-like.php:279 +#: templates/may-also-like.php:297 +#: templates/may-also-like.php:309 +#: templates/may-also-like.php:327 +#: templates/may-also-like.php:339 +#: templates/may-also-like.php:351 +#: templates/may-also-like.php:368 +#: templates/may-also-like.php:380 +msgid "Yes" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:655 +#: templates/may-also-like.php:88 +#: templates/may-also-like.php:100 +#: templates/may-also-like.php:112 +#: templates/may-also-like.php:124 +#: templates/may-also-like.php:136 +#: templates/may-also-like.php:148 +#: templates/may-also-like.php:180 +#: templates/may-also-like.php:192 +#: templates/may-also-like.php:204 +#: templates/may-also-like.php:216 +#: templates/may-also-like.php:228 +#: templates/may-also-like.php:240 +#: templates/may-also-like.php:276 +#: templates/may-also-like.php:294 +#: templates/may-also-like.php:306 +#: templates/may-also-like.php:324 +#: templates/may-also-like.php:336 +#: templates/may-also-like.php:348 +#: templates/may-also-like.php:365 +#: templates/may-also-like.php:377 +#: templates/notices/custom-notice.php:27 +msgid "No" +msgstr "" + +#: classes/wp-security-general-init-tasks.php:674 +msgid "Your registration is pending approval." +msgstr "" + +#: classes/wp-security-notices.php:25 +msgid "The All in One Security plugin has disabled the login whitelist setting that you have enabled in the past." +msgstr "" + +#: classes/wp-security-notices.php:29 +msgid "Your website is running on an Apache webserver, the login whitelisting might not be functional until the recent update of AIOS (because it relied upon Apache-specific module features)." +msgstr "" + +#: classes/wp-security-notices.php:31 +msgid "Your website is running on a non-Apache webserver, so the login whitelisting was not functional until the recent update of AIOS (because it relied upon Apache-specific features)." +msgstr "" + +#: classes/wp-security-notices.php:33 +msgid "It began working with AIOS version 5.0.8." +msgstr "" + +#: classes/wp-security-notices.php:33 +msgid "We have disabled it so that your login page will not be blocked unexpectedly." +msgstr "" + +#: classes/wp-security-notices.php:42 +msgid "Would you like to re-enable login whitelisting?" +msgstr "" + +#: classes/wp-security-notices.php:48 +msgid "Removed database backup feature from the All In One WP Security & Firewall plugin" +msgstr "" + +#: classes/wp-security-notices.php:50 +msgid "Beginning with version 5.0.0, AIOS has replaced the AIOS backup method with the superior UpdraftPlus method." +msgstr "" + +#: classes/wp-security-notices.php:51 +msgid "It remains free and is fully supported by the UpdraftPlus team." +msgstr "" + +#: classes/wp-security-notices.php:54 +msgid "You are seeing this notice because you have previously set up automated database backups in AIOS." +msgstr "" + +#: classes/wp-security-notices.php:55 +msgid "Would you like to set up scheduled backups with UpdraftPlus?" +msgstr "" + +#: classes/wp-security-notices.php:61 +msgid "Setup UpdraftPlus backup plugin" +msgstr "" + +#: classes/wp-security-notices.php:67 +msgid "Important: set up your IP address detection settings" +msgstr "" + +#: classes/wp-security-notices.php:69 +msgid "The All in One Security plugin couldn't be certain about the correct method to detect the IP address for your site visitors with your currently-configured IP address detection settings." +msgstr "" + +#: classes/wp-security-notices.php:70 +msgid "It is important for your security to set the IP address detection settings properly." +msgstr "" + +#: classes/wp-security-notices.php:73 +msgid "Please go to the settings and set them now." +msgstr "" + +#: classes/wp-security-notices.php:79 +msgid "Setup IP address detection settings" +msgstr "" + +#: classes/wp-security-notices.php:85 +msgid "Important: Disabled login whitelist setting" +msgstr "" + +#: classes/wp-security-notices.php:91 +msgid "Turn it back on" +msgstr "" + +#: classes/wp-security-notices.php:92 +msgid "Edit the settings" +msgstr "" + +#: classes/wp-security-notices.php:95 +msgid "Keep it off" +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Hey - We noticed All In One WP Security & Firewall has kept your site safe for a while. If you like us, please consider leaving a positive review to spread the word. Or if you have any issues or questions please leave us a support message %s." +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Thank you so much!" +msgstr "" + +#: classes/wp-security-notices.php:99 +msgid "Team All In One WP Security & Firewall" +msgstr "" + +#: classes/wp-security-notices.php:109 +msgid "Enhance your security even more by backing up your site" +msgstr "" + +#: classes/wp-security-notices.php:110 +msgid "UpdraftPlus is the world's most trusted backup plugin from the owners of All In One WP Security & Firewall" +msgstr "" + +#: classes/wp-security-notices.php:121 +msgid "After you've secured your site, we recommend you install our WP-Optimize plugin to streamline it for better website performance." +msgstr "" + +#: classes/wp-security-process-renamed-login-page.php:152 +msgid "Not available." +msgstr "" + +#: classes/wp-security-two-factor-login.php:34 +msgid "Two factor authentication - Admin settings" +msgstr "" + +#: classes/wp-security-two-factor-login.php:97 +msgid "Two Factor Auth" +msgstr "" + +#: classes/wp-security-two-factor-login.php:153 +msgid "PHP OpenSSL or mcrypt module required" +msgstr "" + +#: classes/wp-security-two-factor-login.php:153 +msgid "The All In One WP Security plugin's Two Factor Authentication module requires either the PHP openssl (preferred) or mcrypt module to be installed. Please ask your web hosting company to install one of them." +msgstr "" + +#: classes/wp-security-user-login.php:71 +msgid "You have disabled login lockout by defining the AIOS_DISABLE_LOGIN_LOCKOUT constant value as true, and the login lockout setting has enabled it." +msgstr "" + +#. translators: 1: Locked IP Addresses admin page link +#: classes/wp-security-user-login.php:73 +msgid "Delete your login lockout IP from %s and define the AIOS_DISABLE_LOGIN_LOCKOUT constant value as false." +msgstr "" + +#: classes/wp-security-user-login.php:100 +msgid "ERROR: Access from your IP address has been blocked for security reasons. Please contact the administrator." +msgstr "错误︰ 出于安全考虑,您的IP地址的访问权限已被阻止。 请与管理员联系。" + +#: classes/wp-security-user-login.php:108 +msgid "Service temporarily unavailable" +msgstr "服务暂时无法使用" + +#: classes/wp-security-user-login.php:163 +msgid "ACCOUNT PENDING: Your account is currently not active. An administrator needs to activate your account before you can login." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-user-login.php:242 +msgid "ERROR: Invalid login credentials." +msgstr "错误:无效的登录凭据。" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-user-login.php:392 +msgid "Site Lockout Notification" +msgstr "网站锁定通知" + +#: classes/wp-security-user-login.php:393 +msgid "User login lockout events had occurred due to too many failed login attempts or invalid username:" +msgstr "" + +#: classes/wp-security-user-login.php:396 +msgid "Username:" +msgstr "用户名:" + +#: classes/wp-security-user-login.php:397 +msgid "IP address:" +msgstr "IP 地址:" + +#: classes/wp-security-user-login.php:399 +msgid "IP range:" +msgstr "IP范围:" + +#: classes/wp-security-user-login.php:404 +msgid "Log into your site WordPress administration panel to see the duration of the lockout or to unlock the user." +msgstr "" + +#: classes/wp-security-user-login.php:515 +msgid "Unlock request notification" +msgstr "解锁请求通知" + +#: classes/wp-security-user-login.php:516 +msgid "You have requested for the account with email address %s to be unlocked. Please click the link below to unlock your account:" +msgstr "您已请求通过电子邮件地址 %s 进行账户解锁。请点击以下链接进行帐户解锁:" + +#: classes/wp-security-user-login.php:516 +msgid "Unlock link: %s" +msgstr "解锁链接: %s" + +#: classes/wp-security-user-login.php:516 +msgid "After clicking the above link you will be able to login to the WordPress administration panel." +msgstr "点击上面的链接后,您将能够跳转到登录界面。" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-user-login.php:739 +msgid "Your session has expired because it has been over %d minutes since your last login." +msgstr "您的会话已经过期,因为它已经超过 %d 分钟,自从您的最后一次登录。" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-user-login.php:740 +#: classes/wp-security-user-login.php:744 +msgid "Please log back in to continue." +msgstr "请重新登录以继续。" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-user-login.php:743 +msgid "You were logged out because you just changed the \"admin\" username." +msgstr "你已被注销,因为你刚刚更改了“admin”的用户名。" + +#: classes/wp-security-user-login.php:773 +msgid "Request unlock" +msgstr "请求解锁" + +#: classes/wp-security-user-registration.php:68 +msgid "ERROR: You are not allowed to register because your IP address is currently locked!" +msgstr "错误:您无法注册,因为您的IP地址当前已锁定!" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-utility-ip-address.php:217 +#: classes/wp-security-utility-ip-address.php:231 +#: classes/wp-security-utility-ip-address.php:245 +#: classes/wp-security-utility-ip-address.php:257 +#: classes/wp-security-utility-ip-address.php:269 +msgid " is not a valid ip address format." +msgstr " 不是有效的IP地址格式。" + +# @ all-in-one-wp-security-and-firewall +#: classes/wp-security-utility-ip-address.php:274 +msgid "You cannot ban your own IP address: " +msgstr "你不能禁止自己的 IP 地址:" + +#: classes/wp-security-utility.php:254 +msgid "This feature can only be configured by the \"superadmin\" on the main site." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:32 +msgid "ERROR: Unable to process your request!" +msgstr "" + +#: other-includes/wp-security-unlock-request.php:45 +msgid "Please enter a valid email address" +msgstr "请输入有效的电子邮件地址" + +#: other-includes/wp-security-unlock-request.php:57 +msgid "User account not found!" +msgstr "用户帐户未找到!" + +#: other-includes/wp-security-unlock-request.php:71 +msgid "Error: No locked entry was found in the database with your IP address range." +msgstr "" + +#: other-includes/wp-security-unlock-request.php:76 +msgid "An email has been sent to you with the unlock instructions." +msgstr "有关解锁说明已通过电子邮件发送给您。" + +#: other-includes/wp-security-unlock-request.php:93 +msgid "You are here because you have been locked out due to too many incorrect login attempts." +msgstr "由于多次登陆失败,您已经被锁定。" + +#: other-includes/wp-security-unlock-request.php:94 +msgid "Please enter your email address and you will receive an email with instructions on how to unlock yourself." +msgstr "请输入您的电子邮件地址,您将收到一封电子邮件,请按提示解锁您的帐号。" + +#: other-includes/wp-security-unlock-request.php:104 +msgid "Email Address" +msgstr "Email 地址" + +#: other-includes/wp-security-unlock-request.php:108 +msgid "Send unlock request" +msgstr "" + +#: templates/admin/incompatible-plugin.php:6 +msgid "Two Factor Authentication" +msgstr "" + +#: templates/admin/incompatible-plugin.php:10 +msgid "Two Factor Authentication currently disabled" +msgstr "" + +#: templates/admin/incompatible-plugin.php:12 +#: templates/admin/incompatible-plugin.php:16 +msgid "Two factor authentication in All In One WP Security is currently disabled because the incompatible plugin %s is active." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: templates/automated-database-backup.php:4 +msgid "Automated scheduled backups" +msgstr "自动定时备份" + +#: templates/automated-database-backup.php:9 +msgid "Automate backup in the UpdraftPlus plugin" +msgstr "" + +#: templates/automated-database-backup.php:19 +msgid "The AIOS 5.0.0 version release has removed the automated backup feature." +msgstr "" + +#: templates/automated-database-backup.php:20 +msgid "The AIOS automated backup had issues that made it less robust than we could be happy with." +msgstr "" + +#: templates/automated-database-backup.php:21 +msgid "Follow this link to automate backups in the superior UpdraftPlus backup plugin." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: templates/info/ip-address-ip-range-info.php:5 +msgid "Each IP address must be on a new line." +msgstr "每一个 IP 地址必须新起一行。" + +#: templates/info/ip-address-ip-range-info.php:6 +msgid "To specify an IPv4 range use a wildcard \"*\" character. Acceptable ways to use wildcards is shown in the examples below:" +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: templates/info/ip-address-ip-range-info.php:7 +msgid "Example 1: 195.47.89.*" +msgstr "示例 1:195.47.89.*" + +# @ all-in-one-wp-security-and-firewall +#: templates/info/ip-address-ip-range-info.php:8 +msgid "Example 2: 195.47.*.*" +msgstr "示例 2:195.47.*.*" + +# @ all-in-one-wp-security-and-firewall +#: templates/info/ip-address-ip-range-info.php:9 +msgid "Example 3: 195.*.*.*" +msgstr "示例 3:195.*.*.*" + +#: templates/info/ip-address-ip-range-info.php:10 +msgid "To specify an IPv6 range use CIDR format as shown in the examples below:" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:11 +msgid "Example 4: 2401:4900:54c3:af15:2:2:5dc0:0/112" +msgstr "" + +#: templates/info/ip-address-ip-range-info.php:12 +msgid "Example 5: 2001:db8:1263::/48" +msgstr "" + +#: templates/may-also-like.php:5 +msgid "All-In-One Security (AIOS) Free vs Premium Comparison Chart" +msgstr "" + +#: templates/may-also-like.php:7 +msgid "FAQs" +msgstr "" + +#: templates/may-also-like.php:9 +msgid "Ask a pre-sales question" +msgstr "" + +#: templates/may-also-like.php:17 +msgid "All In One WP Security & Firewall Free" +msgstr "" + +#: templates/may-also-like.php:26 +#: templates/may-also-like.php:386 +msgid "Installed" +msgstr "" + +#: templates/may-also-like.php:29 +#: templates/may-also-like.php:389 +msgid "Upgrade now" +msgstr "" + +#: templates/may-also-like.php:34 +msgid "Login security feature suite" +msgstr "" + +#: templates/may-also-like.php:35 +msgid "Protect against brute-force attacks and keep bots at bay." +msgstr "" + +#: templates/may-also-like.php:35 +msgid "AIOS takes WordPress' default login security features to a whole new level." +msgstr "" + +#: templates/may-also-like.php:37 +msgid "To see all login security features, visit %s" +msgstr "" + +#: templates/may-also-like.php:48 +msgid "Firewall and file protection feature suite" +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Protection from the latest exploits." +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Activate firewall settings ranging from basic, intermediate and advanced." +msgstr "" + +#: templates/may-also-like.php:49 +msgid "Get comprehensive, instant protection with All-in-One Security." +msgstr "" + +#: templates/may-also-like.php:51 +msgid "To see all firewall and file protection features, visit %s" +msgstr "" + +#: templates/may-also-like.php:62 +msgid "Content protection feature suite" +msgstr "" + +#: templates/may-also-like.php:63 +msgid "Eliminate spam and protect your content to dramatically improve your website's interactions with search engines." +msgstr "" + +#: templates/may-also-like.php:65 +msgid "To see all content protection features, visit %s" +msgstr "" + +#: templates/may-also-like.php:76 +msgid "Malware scanning" +msgstr "" + +#: templates/may-also-like.php:77 +msgid "Finding out by accident that your site has been infected with malware is too late." +msgstr "" + +#: templates/may-also-like.php:79 +msgid "Malware can have a dramatic effect on your site's search rankings and you may not even know about it." +msgstr "" + +#: templates/may-also-like.php:79 +msgid "It can slow your website down, access customer data, send unsolicited emails, change your content or prevent users from accessing it." +msgstr "" + +#: templates/may-also-like.php:84 +msgid "Automatic malware scanning" +msgstr "" + +#: templates/may-also-like.php:85 +msgid "Best-in-class scanning for the latest malware, trojans and spyware 24/7." +msgstr "" + +#: templates/may-also-like.php:96 +msgid "Response time monitoring" +msgstr "" + +#: templates/may-also-like.php:97 +msgid "You'll know immediately if your website's response time is negatively affected." +msgstr "" + +#: templates/may-also-like.php:108 +msgid "Up-time monitoring" +msgstr "" + +#: templates/may-also-like.php:109 +msgid "AIOS checks your website's uptime every 5 minutes." +msgstr "" + +#: templates/may-also-like.php:109 +msgid "We'll notify you straight away if your site/server goes down." +msgstr "" + +#: templates/may-also-like.php:120 +msgid "Prevents blacklisting by search engines" +msgstr "" + +#: templates/may-also-like.php:121 +msgid "AIOS monitors your site's blacklist status daily." +msgstr "" + +#: templates/may-also-like.php:121 +msgid "We'll notify you within 24 hours if something's amiss so you can take action, before it's too late." +msgstr "" + +#: templates/may-also-like.php:132 +msgid "Flexible assignment" +msgstr "" + +#: templates/may-also-like.php:133 +msgid "Register and remove websites from the scanning service at any time." +msgstr "" + +#: templates/may-also-like.php:144 +msgid "Malware reports" +msgstr "" + +#: templates/may-also-like.php:145 +msgid "Reports are available via the 'My Account' page and directly via email." +msgstr "" + +#: templates/may-also-like.php:156 +msgid "Flexible two-factor authentication" +msgstr "" + +#: templates/may-also-like.php:157 +msgid "With Two-Factor Authentication (TFA) users enter their username and password and a one-time code sent to a device to login." +msgstr "" + +#: templates/may-also-like.php:159 +msgid "TFA is a feature in both our free and premium packages, but AIOS Premium affords whole new levels of control over how TFA is implemented." +msgstr "" + +#: templates/may-also-like.php:164 +msgid "Authenticator apps" +msgstr "" + +#: templates/may-also-like.php:165 +msgid "Supports TOTP and HOTP protocols." +msgstr "" + +#: templates/may-also-like.php:165 +msgid "TFA Can be used with Google Authenticator, Microsoft Authenticator, Authy and many more." +msgstr "" + +#: templates/may-also-like.php:176 +msgid "Role specific configuration" +msgstr "" + +#: templates/may-also-like.php:177 +msgid "Make it compulsory for certain roles e.g. for admin and editor roles." +msgstr "" + +#: templates/may-also-like.php:188 +msgid "Require TFA after a set time period" +msgstr "" + +#: templates/may-also-like.php:189 +msgid "For example you could require all admins to have TFA once their accounts are a week old." +msgstr "" + +#: templates/may-also-like.php:200 +msgid "Trusted devices - control how often TFA is required" +msgstr "" + +#: templates/may-also-like.php:201 +msgid "Ask for TFA after a chosen number of days for trusted devices instead of on every login." +msgstr "" + +#: templates/may-also-like.php:212 +msgid "Anti-bot protection" +msgstr "" + +#: templates/may-also-like.php:213 +msgid "Option to hide the existence of forms on WooCommerce login pages unless JavaScript is active." +msgstr "" + +#: templates/may-also-like.php:224 +msgid "Customise TFA design layout" +msgstr "" + +#: templates/may-also-like.php:225 +msgid "Customise the design of TFA so it aligns with your existing web design." +msgstr "" + +#: templates/may-also-like.php:236 +msgid "TFA emergency codes" +msgstr "" + +#: templates/may-also-like.php:237 +msgid "Generate a one-time use emergency code to allow access if your device is lost." +msgstr "" + +#: templates/may-also-like.php:248 +msgid "TFA multisite compatibility" +msgstr "" + +#: templates/may-also-like.php:249 +msgid "TFA is Compatible with multisite networks and sub-sites." +msgstr "" + +#: templates/may-also-like.php:260 +msgid "TFA support for common login forms" +msgstr "" + +#: templates/may-also-like.php:261 +msgid "Supports WooCommerce, Affiliates-WP and Theme my Login login forms." +msgstr "" + +#: templates/may-also-like.php:272 +msgid "TFA support for other login forms" +msgstr "" + +#: templates/may-also-like.php:273 +msgid "Supports Elementor Pro, bbPress and all third-party login forms without any further coding needed." +msgstr "" + +#: templates/may-also-like.php:284 +msgid "Smart 404 blocking" +msgstr "" + +#: templates/may-also-like.php:285 +msgid "404 errors can occur when someone legitimately mistypes a URL, but they're also generated by hackers searching for weaknesses in your site." +msgstr "" + +#: templates/may-also-like.php:290 +msgid "Automatically and permanently blocks bots producing 404s" +msgstr "" + +#: templates/may-also-like.php:291 +msgid "AIOS Premium provides more protection than the competition by automatically and permanently blocking IP addresses of bots and hackers based on how many 404 errors they generate." +msgstr "" + +#: templates/may-also-like.php:302 +msgid "404 error charts" +msgstr "" + +#: templates/may-also-like.php:303 +msgid "Handy charts keep you informed of how many 404s have occurred and which IP address or country is producing them." +msgstr "" + +#: templates/may-also-like.php:314 +msgid "Country blocking" +msgstr "" + +#: templates/may-also-like.php:315 +msgid "Most malicious attacks come from a handful of countries and so it's possible to prevent most attacks with our country blocking tool." +msgstr "" + +#: templates/may-also-like.php:320 +msgid "Block traffic based on country of origin" +msgstr "" + +#: templates/may-also-like.php:321 +msgid "AIOS Premium utilises an IP database that promises 99.5% accuracy." +msgstr "" + +#: templates/may-also-like.php:332 +msgid "Block traffic to specific pages based on country of origin" +msgstr "" + +#: templates/may-also-like.php:333 +msgid "Block access to your whole site or on a page-by-page basis." +msgstr "" + +#: templates/may-also-like.php:344 +msgid "Whitelist some users from blocked countries" +msgstr "" + +#: templates/may-also-like.php:345 +msgid "Whitelist IP addresses or IP ranges even if they are part of a blocked country." +msgstr "" + +#: templates/may-also-like.php:356 +msgid "Premium support" +msgstr "" + +#: templates/may-also-like.php:361 +msgid "Unlimited support" +msgstr "" + +#: templates/may-also-like.php:362 +msgid "Personalised, email support from our team of Security experts, as and when you need it." +msgstr "" + +#: templates/may-also-like.php:373 +msgid "Guaranteed response time" +msgstr "" + +#: templates/may-also-like.php:374 +msgid "We offer a guaranteed response time of three days." +msgstr "" + +#: templates/may-also-like.php:374 +msgid "99% of our Premium customers receive a response to their enquiry within 24 hours during the working week." +msgstr "" + +#: templates/may-also-like.php:397 +msgid "Our other plugins" +msgstr "" + +#: templates/may-also-like.php:411 +msgid "UpdraftPlus – the ultimate protection for your site, hard work and business" +msgstr "" + +#: templates/may-also-like.php:412 +msgid "Simplifies backups and restoration." +msgstr "" + +#: templates/may-also-like.php:412 +msgid "It is the world's highest ranking and most popular scheduled backup plugin, with over three million currently-active installs." +msgstr "" + +#: templates/may-also-like.php:413 +#: templates/may-also-like.php:419 +#: templates/may-also-like.php:425 +#: templates/may-also-like.php:431 +msgid "Try for free" +msgstr "" + +#: templates/may-also-like.php:417 +msgid "WP-Optimize – keep your database fast and efficient" +msgstr "" + +#: templates/may-also-like.php:418 +msgid "Makes your site fast and efficient." +msgstr "" + +#: templates/may-also-like.php:418 +msgid "It cleans the database, compresses images and caches pages for ultimate speed." +msgstr "" + +#: templates/may-also-like.php:423 +msgid "UpdraftCentral – save hours managing multiple WP sites from one place" +msgstr "" + +#: templates/may-also-like.php:424 +msgid "Highly efficient way to manage, optimize, update and backup multiple websites from one place." +msgstr "" + +#: templates/may-also-like.php:429 +msgid "Easy Updates Manager" +msgstr "" + +#: templates/may-also-like.php:430 +msgid "Keeps your WordPress site up to date and bug free." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:2 +msgid "IP address detection settings" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:6 +msgid "The IP address detection settings allow you to specify how visitors' IP addresses are made known to PHP (and hence to WordPress and its plugins)." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:7 +msgid "Usually, this is automatic and there is only one choice." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:8 +msgid "However in some setups, such as those using proxies (including load-balancers and security firewalls like Cloudflare), it may be necessary to set this manually." +msgstr "" + +# @ all-in-one-wp-security-and-firewall +#: templates/menus/settings/advanced-settings.php:9 +msgid "Attention" +msgstr "注意!" + +#: templates/menus/settings/advanced-settings.php:9 +msgid "It is important to set this correctly - otherwise you may make it possible for a hacker to ban all your visitors (e.g. via banning Cloudflare from connecting to you) instead of being banned himself." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:9 +msgid "The default is to use the REMOTE_ADDR PHP server variable. If this variable does not contain the visitor's IP address, then whilst you can make a different selection below, it is better to ask your web hosting company to have it correctly set." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:10 +msgid "This is the most secure setup, because when set correctly it is immune from being spoofed by an attacker." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:16 +msgid "You have no available IP address detection method(s); you must contact your web hosting company." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:22 +#: templates/menus/settings/advanced-settings.php:27 +#: templates/menus/settings/advanced-settings.php:32 +msgid "Your detected IP address according to %s:" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:38 +msgid "If your site is setup on localhost, you won't see your external IP address using your server's IP detection setting; but on a localhost-served site (not available to the outside world), the setting is irrelevant and can be ignored." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:61 +msgid "Choose a $_SERVER variable you would like to detect visitors' IP address using." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:67 +msgid "If your chosen server variable fails the plugin will automatically fall back to retrieving the IP address from $_SERVER[\"REMOTE_ADDR\"]" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:73 +msgid "Your IP address if using this setting:" +msgstr "" + +#: templates/menus/settings/advanced-settings.php:75 +msgid "fetching..." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:81 +#: templates/menus/settings/advanced-settings.php:190 +msgid "getting..." +msgstr "" + +#: templates/menus/settings/advanced-settings.php:89 +msgid "look-up possibly blocked by an ad-blocker or similar tool" +msgstr "" + +#: templates/notices/cookie-based-brute-force-prevention-disabled.php:4 +msgid "Cookie based brute force login prevention currently disabled" +msgstr "" + +#: templates/notices/cookie-based-brute-force-prevention-disabled.php:6 +msgid "Cookie based brute force login prevention is currently disabled via the AIOS_DISABLE_COOKIE_BRUTE_FORCE_PREVENTION constant (which is mostly likely to be defined in your wp-config.php)" +msgstr "" + +#: templates/notices/disable-login-whitelist.php:4 +msgid "Login whitelisting currently disabled" +msgstr "" + +#: templates/notices/disable-login-whitelist.php:6 +msgid "Login whitelisting is currently disabled via the AIOS_DISABLE_LOGIN_WHITELIST constant (which is mostly likely to be defined in your wp-config.php)" +msgstr "" + +#: templates/notices/horizontal-notice.php:8 +#: templates/notices/horizontal-notice.php:40 +msgid "notice image" +msgstr "" + +#: templates/notices/horizontal-notice.php:18 +msgid "Ok, you deserve it" +msgstr "" + +#: templates/notices/horizontal-notice.php:22 +msgid "Maybe later" +msgstr "" + +#: templates/notices/horizontal-notice.php:26 +msgid "Never" +msgstr "" + +#: templates/notices/horizontal-notice.php:66 +msgid "Get UpdraftCentral" +msgstr "" + +#: templates/notices/horizontal-notice.php:68 +msgid "Get UpdraftPlus" +msgstr "" + +#: templates/notices/horizontal-notice.php:70 +msgid "Get WP-Optimize" +msgstr "" + +#: templates/notices/horizontal-notice.php:72 +msgid "Find out more." +msgstr "" + +#: templates/notices/horizontal-notice.php:74 +msgid "Sign up" +msgstr "" + +#: templates/notices/horizontal-notice.php:76 +msgid "Go there" +msgstr "" + +#: templates/notices/horizontal-notice.php:78 +msgid "Read more" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:4 +msgid "Dismiss (for %s months)" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:6 +msgid "Thank you for installing All In One WP Security & Firewall!" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:13 +msgid "Super-charge and secure your WordPress site even more with our other top plugins:" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:17 +msgid "%s makes your site fast and efficient. It cleans the database, compresses images and caches pages for ultimate speed." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:21 +msgid "%s simplifies backups and restoration. It is the world's highest ranking and most popular scheduled backup plugin, with over three million currently-active installs." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:25 +msgid "%s is a highly efficient way to manage, optimize, update and backup multiple websites from one place." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:29 +msgid "%s is a WordPress subscription extension for WooCommerce store owners." +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:33 +msgid "More quality plugins" +msgstr "" + +#: templates/notices/thanks-for-using-main-dash.php:33 +msgid "Premium WooCommerce plugins" +msgstr "" + +#: templates/partials/non-apache-feature-notice.php:9 +msgid "This feature works only on the Apache server." +msgstr "" + +#: templates/partials/non-apache-feature-notice.php:10 +msgid "You are using the non-apache server %s, so this feature won't work on your site." +msgstr "" + +#: wp-security-core.php:236 +#: wp-security.php:45 +msgid "This plugin requires PHP version %s." +msgstr "" + +#: wp-security-core.php:237 +msgid "Current site PHP version is %s." +msgstr "" + +#: wp-security-core.php:238 +#: wp-security.php:47 +msgid "You will need to ask your web hosting company to upgrade." +msgstr "" + +#: wp-security-core.php:397 +msgid "Error:" +msgstr "" + +#: wp-security-core.php:397 +msgid "template not found" +msgstr "" + +#: wp-security.php:44 +msgid "All In One WP Security and Firewall plugin has been deactivated." +msgstr "" + +#: wp-security.php:46 +msgid "Your current PHP version is %s." +msgstr "" diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall.pot b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall.pot new file mode 100755 index 00000000..a892f6da --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/all-in-one-wp-security-and-firewall.pot @@ -0,0 +1,7895 @@ +# Copyright (C) 2025 all-in-one-wp-security-and-firewall +# This file is distributed under the same license as the all-in-one-wp-security-and-firewall package. +msgid "" +msgstr "" +"Project-Id-Version: all-in-one-wp-security-and-firewall\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language-Team: Team Updraft \n" +"Last-Translator: Team Updraft \n" +"POT-Creation-Date: 2025-11-06 13:53+0000\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/all-in-one-wp-security-and-firewall\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-KeywordsList: __;_e;_ex:1,2c;_n:1,2;_n_noop:1,2;_nx:1,2,4c;_nx_noop:1,2,3c;_x:1,2c;esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPathExcluded-0: *.js\n" +"X-Poedit-SourceCharset: UTF-8\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: dist/wp-security-core.php:352, dist/admin/wp-security-database-menu.php:134, dist/admin/wp-security-database-menu.php:137, dist/admin/wp-security-database-menu.php:141, dist/includes/simba-tfa/simba-tfa.php:1065, dist/includes/simba-tfa/simba-tfa.php:1470, dist/includes/simba-tfa/simba-tfa.php:1507, dist/includes/simba-tfa/simba-tfa.php:1521, dist/includes/simba-tfa/simba-tfa.php:1664, dist/includes/simba-tfa/includes/login-form-integrations.php:128 +msgid "Error:" +msgstr "" + +#: dist/wp-security-core.php:352 +msgid "template not found" +msgstr "" + +#: dist/wp-security.php:43 +msgid "All In One WP Security" +msgstr "" + +#: dist/wp-security.php:44 +msgid "All In One WP Security plugin has been deactivated." +msgstr "" + +#. translators: %s: Required PHP version +#: dist/wp-security.php:46 +msgid "This plugin requires PHP version %s." +msgstr "" + +#. translators: %s: PHP version +#: dist/wp-security.php:48 +msgid "Your current PHP version is %s." +msgstr "" + +#: dist/wp-security.php:49 +msgid "You will need to ask your web hosting company to upgrade." +msgstr "" + +#: dist/wp-security.php:64, dist/admin/wp-security-admin-init.php:86, dist/admin/wp-security-admin-init.php:87, dist/admin/wp-security-settings-menu.php:23, dist/includes/simba-tfa/templates/user-settings.php:20, dist/templates/wp-admin/brute-force/captcha-settings.php:27, dist/templates/wp-admin/filesystem-security/file-protection.php:29 +msgid "Settings" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:78, dist/admin/wp-security-admin-init.php:79, dist/admin/wp-security-dashboard-menu.php:19, dist/admin/wp-security-dashboard-menu.php:30 +msgid "Dashboard" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:94, dist/admin/wp-security-admin-init.php:95, dist/admin/wp-security-user-security-menu.php:19 +msgid "User Security" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:102, dist/admin/wp-security-admin-init.php:103 +msgid "Database Security" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:111, dist/admin/wp-security-admin-init.php:112 +msgid "File Security" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:119, dist/admin/wp-security-admin-init.php:120, dist/admin/wp-security-firewall-menu.php:22, dist/templates/wp-admin/dashboard/may-also-like.php:144, dist/templates/wp-admin/firewall/partials/firewall-setup.php:13 +msgid "Firewall" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:127, dist/admin/wp-security-admin-init.php:128 +msgid "Brute Force" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:135, dist/admin/wp-security-admin-init.php:136 +msgid "Spam Prevention" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:143, dist/admin/wp-security-admin-init.php:144, dist/admin/wp-security-filescan-menu.php:25 +msgid "Scanner" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:152, dist/admin/wp-security-admin-init.php:153, dist/admin/wp-security-tools-menu.php:20 +msgid "Tools" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:223 +msgid "Id" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:224 +msgid "Event Type" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:225 +msgid "IP Address" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:226, dist/admin/wp-security-list-404.php:115 +msgid "Attempted URL" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:227, dist/admin/wp-security-list-404.php:116 +msgid "Referer" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:228, dist/admin/wp-security-list-404.php:117, dist/admin/wp-security-list-audit.php:176, dist/admin/wp-security-list-debug.php:53, dist/classes/commands/wp-security-log-commands.php:104 +msgid "Date and time" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:229 +msgid "Lock Status" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:351, dist/templates/wp-admin/settings/advanced-settings.php:83 +msgid "Unexpected response:" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:352 +msgid "Copied" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:353 +msgid "You have not yet selected a file to import." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:354 +msgid "Processing..." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:355 +msgid "Please enter a valid IP address or domain name." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:357, dist/includes/simba-tfa/includes/tfa_frontend.php:183 +msgid "Saving..." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:358 +msgid "Deleting..." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:359 +msgid "Blocking..." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:360 +msgid "Unlocking..." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:361 +msgid "Clearing..." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:362 +msgid "Importing..." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:363 +msgid "Exporting..." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:364 +msgid "Refreshing..." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:365 +msgid "Scanning..." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:366 +msgid "Close" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:367 +msgid "Completed." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:368 +msgid "Refreshed." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:369 +msgid "Deleted." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:370 +msgid "show more" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:371 +msgid "hide" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:372 +msgid "But the following notices have been raised" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:373 +msgid "Disabling..." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:374 +msgid "Setting up firewall..." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:375 +msgid "Downgrading firewall..." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:376, dist/admin/wp-security-dashboard-menu.php:489 +msgid "Maintenance mode is currently enabled." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:376, dist/admin/wp-security-dashboard-menu.php:489 +msgid "Remember to disable it when you are done." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:377, dist/admin/wp-security-dashboard-menu.php:491 +msgid "Maintenance mode is currently disabled." +msgstr "" + +#: dist/admin/wp-security-admin-init.php:384 +msgid "year(s)" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:385 +msgid "month(s)" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:386 +msgid "day(s)" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:387 +msgid "hour(s)" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:388 +msgid "minute(s)" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:389 +msgid "second(s)" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:390 +msgid "less than one second" +msgstr "" + +#. translators: 1: Product Name, 2: Rating, 3: Trustpilot URL, 4: G2 URL +#: dist/admin/wp-security-admin-init.php:427 +msgid "Enjoyed %1$s? Please leave us a %2$s rating on %3$s or %4$s" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:427 +msgid "We really appreciate your support!" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:505, dist/admin/wp-security-admin-init.php:505, dist/classes/wp-security-two-factor-login.php:121, dist/classes/wp-security-two-factor-login.php:121 +msgid "AIOS" +msgstr "" + +#: dist/admin/wp-security-admin-init.php:522 +msgid "Premium Upgrade" +msgstr "" + +#: dist/admin/wp-security-admin-menu.php:117 +msgid "Press to toggle" +msgstr "" + +#: dist/admin/wp-security-admin-menu.php:160, dist/admin/wp-security-admin-menu.php:176, dist/classes/wp-security-commands.php:266, dist/classes/commands/wp-brute-force-commands.php:51, dist/classes/commands/wp-brute-force-commands.php:123, dist/classes/commands/wp-security-tools-commands.php:129, dist/classes/commands/wp-security-user-security-commands.php:206, dist/classes/commands/wp-security-user-security-commands.php:284, dist/classes/commands/wp-security-user-security-commands.php:329, dist/classes/commands/wp-security-user-security-commands.php:376, dist/classes/commands/wp-security-user-security-commands.php:417, dist/classes/commands/wp-security-user-security-commands.php:508 +msgid "The settings have been successfully updated." +msgstr "" + +#: dist/admin/wp-security-admin-menu.php:190, dist/admin/wp-security-list-audit.php:355, dist/classes/commands/wp-brute-force-commands.php:467 +msgid "The selected record(s) has been deleted successfully." +msgstr "" + +#: dist/admin/wp-security-admin-menu.php:200, dist/admin/wp-security-list-audit.php:342, dist/admin/wp-security-list-audit.php:358, dist/classes/commands/wp-brute-force-commands.php:465 +msgid "The selected record(s) have failed to delete." +msgstr "" + +#: dist/admin/wp-security-brute-force-menu.php:24 +msgid "Brute force" +msgstr "" + +#: dist/admin/wp-security-brute-force-menu.php:35, dist/admin/wp-security-dashboard-menu.php:532, dist/templates/wp-admin/brute-force/login-whitelist.php:17 +msgid "Rename login page" +msgstr "" + +#: dist/admin/wp-security-brute-force-menu.php:39, dist/templates/wp-admin/brute-force/rename-login.php:6 +msgid "Cookie based brute force prevention" +msgstr "" + +#: dist/admin/wp-security-brute-force-menu.php:44 +msgid "CAPTCHA settings" +msgstr "" + +#: dist/admin/wp-security-brute-force-menu.php:48, dist/templates/wp-admin/brute-force/login-whitelist.php:2 +msgid "Login whitelist" +msgstr "" + +#: dist/admin/wp-security-brute-force-menu.php:52 +msgid "404 detection" +msgstr "" + +#: dist/admin/wp-security-brute-force-menu.php:57 +msgid "Honeypot" +msgstr "" + +#: dist/admin/wp-security-brute-force-menu.php:116, dist/classes/commands/wp-brute-force-commands.php:316 +msgid "Your Cloudflare Turnstile configuration is invalid." +msgstr "" + +#: dist/admin/wp-security-brute-force-menu.php:116, dist/classes/commands/wp-brute-force-commands.php:316 +msgid "Please enter the correct Cloudflare Turnstile keys below to use the Turnstile feature." +msgstr "" + +#. translators: %s: Admin Dashboard > WP Security > Brute Force > Login CAPTCHA Tab Link +#: dist/admin/wp-security-brute-force-menu.php:120, dist/classes/wp-security-general-init-tasks.php:829, dist/classes/commands/wp-brute-force-commands.php:318 +msgid "Your Google reCAPTCHA configuration is invalid." +msgstr "" + +#: dist/admin/wp-security-brute-force-menu.php:120, dist/classes/commands/wp-brute-force-commands.php:318 +msgid "Please enter the correct reCAPTCHA keys below to use the reCAPTCHA feature." +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:34, dist/admin/wp-security-dashboard-menu.php:218, dist/admin/wp-security-dashboard-menu.php:589, dist/classes/wp-security-user-login.php:83 +msgid "Locked IP addresses" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:38 +msgid "Permanent block list" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:42, dist/templates/wp-admin/dashboard/audit-logs.php:3 +msgid "Audit logs" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:46 +msgid "Debugging" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:50 +msgid "Premium upgrade" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:205 +msgid "Security strength meter" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:206 +msgid "Security points breakdown" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:207 +msgid "Spread the word" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:208 +msgid "Get to know the developers" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:209 +msgid "Critical feature status" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:210 +msgid "Last 5 login summary" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:211 +msgid "Maintenance mode status" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:215 +msgid "Brute force prevention login page" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:217, dist/admin/wp-security-dashboard-menu.php:549, dist/admin/wp-security-user-security-menu.php:42 +msgid "Logged in users" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:224, dist/admin/wp-security-dashboard-menu.php:477 +msgid "View all" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:278 +msgid "Website strength:" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:283 +msgid "Total Achievable Points:" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:284 +msgid "Current Score of Your Site:" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:334 +msgid "We are working hard to make your WordPress site more secure." +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:334 +msgid "Please support us, here is how:" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:335 +msgid "Follow us on" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:339 +msgid "Post to X" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:343 +msgid "Give us a good rating" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:350 +msgid "Wanna know more about the developers behind this plugin?" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:365 +msgid "Admin username" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:369, dist/admin/wp-security-user-security-menu.php:34, dist/classes/grade-system/wp-security-feature-item-manager.php:81, dist/templates/wp-admin/dashboard/locked-ip.php:4 +msgid "Login lockout" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:373 +msgid "File permission" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:378 +msgid "Basic firewall" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:383, dist/admin/wp-security-database-menu.php:86, dist/classes/grade-system/wp-security-feature-item-manager.php:157 +msgid "Database prefix" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:388 +msgid "PHP file editing" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:393 +msgid "Renamed login page" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:397 +msgid "Hidden WP meta info" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:405 +msgid "Below is the current status of the critical features that you should activate on your site to achieve a minimum level of recommended security" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:450, dist/admin/wp-security-dashboard-menu.php:469 +msgid "Date" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:450 +msgid "Logins" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:469 +msgid "User" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:465 +msgid "No data found." +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:498, dist/templates/wp-admin/tools/visitor-lockout.php:14 +msgid "Enable maintenance mode" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:507 +msgid "Configure" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:513 +msgid "Cookie-based brute force" +msgstr "" + +#. translators: %s: Brute Force Login URL +#. translators: %s: Rename Login URL +#: dist/admin/wp-security-dashboard-menu.php:517, dist/admin/wp-security-dashboard-menu.php:535 +msgid "The %s feature is currently active." +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:518, dist/admin/wp-security-dashboard-menu.php:536 +msgid "Your new WordPress login URL is now:" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:551 +msgid "Number of users currently logged into your site (including you) is:" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:552 +msgid "There are no other users currently logged in." +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:566 +msgid "Number of users currently logged in site-wide (including you) is:" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:567 +msgid "There are no other site-wide users currently logged in." +msgstr "" + +#. translators: %s: Users Online URL +#. translators: %s: Number of locked out IPs +#: dist/admin/wp-security-dashboard-menu.php:581, dist/admin/wp-security-dashboard-menu.php:598 +msgid "Go to the %s menu to see more details" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:596 +msgid "Number of temporarily locked out IP addresses:" +msgstr "" + +#: dist/admin/wp-security-dashboard-menu.php:593 +msgid "There are no IP addresses currently locked out." +msgstr "" + +#: dist/admin/wp-security-database-menu.php:19 +msgid "Database security" +msgstr "" + +#: dist/admin/wp-security-database-menu.php:49 +msgid "UpdraftPlus is installed but currently not active." +msgstr "" + +#: dist/admin/wp-security-database-menu.php:49 +msgid "Follow this link to activate UpdraftPlus, to take a backup." +msgstr "" + +#: dist/admin/wp-security-database-menu.php:54 +msgid "Follow this link to install UpdraftPlus, to take a database backup." +msgstr "" + +#: dist/admin/wp-security-database-menu.php:91 +msgid "Database backup" +msgstr "" + +#: dist/admin/wp-security-database-menu.php:114 +msgid "Nonce check failed for DB prefix change operation." +msgstr "" + +#: dist/admin/wp-security-database-menu.php:134 +msgid "prefix contains HTML tags" +msgstr "" + +#: dist/admin/wp-security-database-menu.php:137 +msgid "prefix contains invalid characters, the prefix should only contain alphanumeric and underscore characters." +msgstr "" + +#: dist/admin/wp-security-database-menu.php:129 +msgid "Please enter a value for the DB prefix." +msgstr "" + +#: dist/admin/wp-security-database-menu.php:121 +msgid "The plugin has detected that it cannot write to the wp-config.php file." +msgstr "" + +#: dist/admin/wp-security-database-menu.php:121 +msgid "This feature can only be used if the plugin can successfully write to the wp-config.php file." +msgstr "" + +#: dist/admin/wp-security-database-menu.php:169 +msgid "Take a database backup using UpdraftPlus" +msgstr "" + +#: dist/admin/wp-security-database-menu.php:204 +msgid "Error - Could not get tables or no tables found!" +msgstr "" + +#: dist/admin/wp-security-database-menu.php:208 +msgid "Starting DB prefix change operations....." +msgstr "" + +#: dist/admin/wp-security-database-menu.php:210 +msgid "Your WordPress system has a total of %s tables and your new DB prefix will be: %s" +msgstr "" + +#: dist/admin/wp-security-database-menu.php:218 +msgid "A backup copy of your wp-config.php file was created successfully!" +msgstr "" + +#: dist/admin/wp-security-database-menu.php:215, dist/classes/wp-security-utility.php:316 +msgid "Failed to make a backup of the wp-config.php file." +msgstr "" + +#: dist/admin/wp-security-database-menu.php:215, dist/classes/wp-security-utility.php:316 +msgid "This operation will not go ahead." +msgstr "" + +#: dist/admin/wp-security-database-menu.php:243 +msgid "%s table name update failed" +msgstr "" + +#: dist/admin/wp-security-database-menu.php:255 +msgid "%s tables had their prefix updated successfully!" +msgstr "" + +#: dist/admin/wp-security-database-menu.php:253 +msgid "Please change the prefix manually for the above tables to: %s" +msgstr "" + +#: dist/admin/wp-security-database-menu.php:277 +msgid "The \"wp-config.php\" file was not able to be modified." +msgstr "" + +#: dist/admin/wp-security-database-menu.php:277 +msgid "Please modify this file manually using your favourite editor and search for variable \"$table_prefix\" and assign the following value to that variable: %s" +msgstr "" + +#: dist/admin/wp-security-database-menu.php:275 +msgid "wp-config.php file was updated successfully!" +msgstr "" + +#: dist/admin/wp-security-database-menu.php:288 +msgid "The options table records which had references to the old DB prefix were updated successfully!" +msgstr "" + +#: dist/admin/wp-security-database-menu.php:285, dist/admin/wp-security-database-menu.php:301 +msgid "Update of table %s failed: unable to change %s to %s" +msgstr "" + +#: dist/admin/wp-security-database-menu.php:304 +msgid "The %s table records which had references to the old DB prefix were updated successfully!" +msgstr "" + +#: dist/admin/wp-security-database-menu.php:325 +msgid "Error updating user_meta table where new meta_key = %s, old meta_key = %s and user_id = %s." +msgstr "" + +#: dist/admin/wp-security-database-menu.php:330 +msgid "The usermeta table records which had references to the old DB prefix were updated successfully!" +msgstr "" + +#: dist/admin/wp-security-database-menu.php:332 +msgid "The database prefix change tasks have been completed." +msgstr "" + +#: dist/admin/wp-security-database-menu.php:379 +msgid "Checking for MySQL tables of type \"view\"....." +msgstr "" + +#: dist/admin/wp-security-database-menu.php:396 +msgid "Update of the following MySQL view definition failed: %s" +msgstr "" + +#: dist/admin/wp-security-database-menu.php:403 +msgid "%s view definitions were updated successfully." +msgstr "" + +#: dist/admin/wp-security-filescan-menu.php:36, dist/classes/grade-system/wp-security-feature-item-manager.php:409 +msgid "File change detection" +msgstr "" + +#: dist/admin/wp-security-filescan-menu.php:40 +msgid "Malware scan" +msgstr "" + +#: dist/admin/wp-security-filesystem-menu.php:18 +msgid "File security" +msgstr "" + +#: dist/admin/wp-security-filesystem-menu.php:30, dist/classes/grade-system/wp-security-feature-item-manager.php:167 +msgid "File permissions" +msgstr "" + +#: dist/admin/wp-security-filesystem-menu.php:35, dist/templates/wp-admin/filesystem-security/file-protection.php:2 +msgid "File protection" +msgstr "" + +#: dist/admin/wp-security-filesystem-menu.php:40 +msgid "Host system logs" +msgstr "" + +#: dist/admin/wp-security-filesystem-menu.php:45 +msgid "Copy protection" +msgstr "" + +#: dist/admin/wp-security-filesystem-menu.php:49 +msgid "Frames" +msgstr "" + +#: dist/admin/wp-security-firewall-menu.php:33 +msgid "PHP rules" +msgstr "" + +#: dist/admin/wp-security-firewall-menu.php:37 +msgid ".htaccess rules" +msgstr "" + +#: dist/admin/wp-security-firewall-menu.php:42, dist/templates/wp-admin/general/moved.php:6 +msgid "6G firewall rules" +msgstr "" + +#: dist/admin/wp-security-firewall-menu.php:47 +msgid "5G legacy rules" +msgstr "" + +#: dist/admin/wp-security-firewall-menu.php:52, dist/templates/wp-admin/general/moved.php:10 +msgid "Internet bots" +msgstr "" + +#: dist/admin/wp-security-firewall-menu.php:57 +msgid "Block & allow lists" +msgstr "" + +#: dist/admin/wp-security-firewall-menu.php:62, dist/admin/wp-security-settings-menu.php:60, dist/templates/wp-admin/firewall/advanced-settings.php:2, dist/includes/simba-tfa/providers/totp/loader.php:245 +msgid "Advanced settings" +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:389, dist/admin/wp-security-firewall-setup-notice.php:521, dist/classes/commands/wp-security-firewall-commands.php:725, dist/templates/notices/firewall-installed-notice.php:2, dist/templates/notices/firewall-setup-notice.php:9, dist/templates/wp-admin/settings/general-settings.php:12 +msgid "All-In-One Security" +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:391 +msgid "We were unable to create the file necessary to give you the highest level of protection." +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:392 +msgid "Your firewall will have reduced protection which means some of your firewall's functionality will be unavailable." +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:393 +msgid "If you would like to manually set up the necessary file, please follow these steps:" +msgstr "" + +#. translators: %s Bootstrap file name. +#. translators: %s Firewall file name. +#: dist/admin/wp-security-firewall-setup-notice.php:397, dist/admin/wp-security-firewall-setup-notice.php:495 +msgid "1. Create a file with the name %s in the same directory as your WordPress install is in, i.e.:" +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:401 +msgid "2. Paste in the following code:" +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:403, dist/admin/wp-security-firewall-setup-notice.php:504 +msgid "3. Save the file and press the 'Try again' button below:" +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:422 +msgid "1. Open the following file:" +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:432 +msgid "2. Look for the following:" +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:428 +msgid "2. Look for the auto_prepend_file directive." +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:438 +msgid "3. Change it to the following:" +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:442 +msgid "4. Save the file and press the 'Try again' button below:" +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:442, dist/admin/wp-security-firewall-setup-notice.php:483 +msgid "You may have to wait up to 5 minutes before the settings take effect." +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:500 +msgid "2. Paste in the following directives:" +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:476 +msgid "1. Open your php.ini file." +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:479 +msgid "2. Set the auto_prepend_file directive like below:" +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:483 +msgid "3. Restart the webserver and refresh the page" +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:524 +msgid "We were unable to set up your firewall with the highest level of protection." +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:525 +msgid "Your firewall will have reduced functionality." +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:529 +msgid "To give your site the highest level of protection, please follow these steps:" +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:542 +msgid "Note: if you're unable to perform any of the aforementioned steps, please ask your web hosting provider for further assistance." +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:559 +msgid "Try again" +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:581 +msgid "We have detected that your AIOS firewall is not fully installed, and therefore does not have the highest level of protection." +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:582 +msgid "Your firewall will have reduced functionality until it has been upgraded." +msgstr "" + +#: dist/admin/wp-security-firewall-setup-notice.php:584 +msgid "Upgrade your protection now" +msgstr "" + +#: dist/admin/wp-security-list-404.php:48, dist/admin/wp-security-list-audit.php:62, dist/admin/wp-security-list-locked-ip.php:65 +msgid "Are you sure you want to delete this item?" +msgstr "" + +#: dist/admin/wp-security-list-404.php:48, dist/admin/wp-security-list-404.php:148, dist/admin/wp-security-list-audit.php:62, dist/admin/wp-security-list-locked-ip.php:65, dist/admin/wp-security-list-locked-ip.php:161, dist/admin/wp-security-list-registered-users.php:37, dist/admin/wp-security-list-registered-users.php:104, dist/templates/wp-admin/filesystem-security/partials/wp-file-access.php:27 +msgid "Delete" +msgstr "" + +#: dist/admin/wp-security-list-404.php:60, dist/admin/wp-security-list-registered-users.php:38 +msgid "Are you sure you want to block this IP address?" +msgstr "" + +#: dist/admin/wp-security-list-404.php:60 +msgid "Temporarily block" +msgstr "" + +#: dist/admin/wp-security-list-404.php:61, dist/admin/wp-security-list-comment-spammer-ip.php:34 +msgid "Are you sure you want to permanently block this IP address?" +msgstr "" + +#: dist/admin/wp-security-list-404.php:61, dist/admin/wp-security-list-404.php:147, dist/admin/wp-security-list-audit.php:98 +msgid "Blacklist IP" +msgstr "" + +#: dist/admin/wp-security-list-404.php:56, dist/admin/wp-security-list-404.php:52 +msgid "Are you sure you want to unblock this item?" +msgstr "" + +#: dist/admin/wp-security-list-404.php:56, dist/admin/wp-security-list-404.php:52, dist/admin/wp-security-list-permanent-blocked-ip.php:89 +msgid "Unblock" +msgstr "" + +#: dist/admin/wp-security-list-404.php:113 +msgid "Event type" +msgstr "" + +#: dist/admin/wp-security-list-404.php:114, dist/admin/wp-security-list-logged-in-users.php:55, dist/admin/wp-security-list-registered-users.php:85 +msgid "IP address" +msgstr "" + +#: dist/admin/wp-security-list-404.php:118 +msgid "Lock status" +msgstr "" + +#: dist/admin/wp-security-list-404.php:146 +msgid "Temporarily block IP" +msgstr "" + +#: dist/admin/wp-security-list-404.php:169, dist/admin/wp-security-list-404.php:178, dist/admin/wp-security-list-404.php:186, dist/admin/wp-security-list-audit.php:240, dist/admin/wp-security-list-comment-spammer-ip.php:102, dist/admin/wp-security-list-locked-ip.php:179, dist/admin/wp-security-list-locked-ip.php:188, dist/admin/wp-security-list-permanent-blocked-ip.php:102, dist/admin/wp-security-list-registered-users.php:122, dist/admin/wp-security-list-registered-users.php:130, dist/admin/wp-security-list-registered-users.php:138 +msgid "Please select some records using the checkboxes" +msgstr "" + +#: dist/admin/wp-security-list-404.php:213, dist/admin/wp-security-list-404.php:247 +msgid "Could not process the request because the IP addresses for the selected entries could not be found." +msgstr "" + +#: dist/admin/wp-security-list-404.php:222 +msgid "The selected IP addresses are now temporarily blocked." +msgstr "" + +#: dist/admin/wp-security-list-404.php:266, dist/classes/commands/wp-brute-force-commands.php:510 +msgid "The selected IP addresses have been added to the blacklist and will be permanently blocked." +msgstr "" + +#: dist/admin/wp-security-list-audit.php:78 +msgid "Are you sure you want to unblacklist this IP address?" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:79 +msgid "Are you sure you want to unlock this IP address?" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:80 +msgid "Are you sure you want to temporarily lock this IP address?" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:81 +msgid "Are you sure you want to blacklist this IP address?" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:94 +msgid "Lock IP" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:90, dist/admin/wp-security-list-locked-ip.php:64, dist/admin/wp-security-list-locked-ip.php:160 +msgid "Unlock" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:86 +msgid "Unblacklist" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:113 +msgid "No event type available." +msgstr "" + +#: dist/admin/wp-security-list-audit.php:149 +msgid "No stack trace available." +msgstr "" + +#: dist/admin/wp-security-list-audit.php:162, dist/admin/wp-security-list-audit.php:184, dist/classes/commands/wp-security-log-commands.php:112 +msgid "Stack trace" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:162 +msgid "Show trace" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:177, dist/admin/wp-security-list-debug.php:54, dist/classes/commands/wp-security-log-commands.php:105 +msgid "Level" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:178, dist/admin/wp-security-list-debug.php:55, dist/classes/commands/wp-security-log-commands.php:106 +msgid "Network ID" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:179, dist/admin/wp-security-list-debug.php:56, dist/admin/wp-security-list-logged-in-users.php:56, dist/classes/commands/wp-security-log-commands.php:107 +msgid "Site ID" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:180, dist/admin/wp-security-list-locked-ip.php:129, dist/classes/commands/wp-security-log-commands.php:108 +msgid "Username" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:181, dist/classes/wp-security-debug.php:418, dist/classes/commands/wp-security-log-commands.php:109 +msgid "IP" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:182, dist/classes/commands/wp-security-log-commands.php:110 +msgid "Event" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:183, dist/classes/commands/wp-security-log-commands.php:111 +msgid "Details" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:218 +msgid "Delete all" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:219 +msgid "Delete selected" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:220 +msgid "Delete filtered" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:253 +msgid "Please select the level or the event type filter or filter by a search term" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:275 +msgid "All levels" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:287 +msgid "All events" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:296 +msgid "Filter" +msgstr "" + +#: dist/admin/wp-security-list-audit.php:301, dist/templates/wp-admin/brute-force/404-detection.php:104, dist/templates/wp-admin/brute-force/404-detection.php:113 +msgid "Export to CSV" +msgstr "" + +#: dist/admin/wp-security-list-comment-spammer-ip.php:34, dist/admin/wp-security-list-comment-spammer-ip.php:79 +msgid "Block" +msgstr "" + +#: dist/admin/wp-security-list-comment-spammer-ip.php:57 +msgid "Spammer IP" +msgstr "" + +#: dist/admin/wp-security-list-comment-spammer-ip.php:58 +msgid "Number of spam comments from this IP" +msgstr "" + +#: dist/admin/wp-security-list-comment-spammer-ip.php:59 +msgid "Status" +msgstr "" + +#: dist/admin/wp-security-list-comment-spammer-ip.php:132 +msgid "The selected IP addresses are now permanently blocked." +msgstr "" + +#: dist/admin/wp-security-list-debug.php:57 +msgid "Message" +msgstr "" + +#: dist/admin/wp-security-list-debug.php:58 +msgid "Type" +msgstr "" + +#: dist/admin/wp-security-list-locked-ip.php:64 +msgid "Are you sure you want to unlock this address range?" +msgstr "" + +#: dist/admin/wp-security-list-locked-ip.php:99, dist/admin/wp-security-list-locked-ip.php:104 +msgid "There is no IP lookup result available." +msgstr "" + +#: dist/admin/wp-security-list-locked-ip.php:107, dist/classes/wp-security-user-login.php:414, dist/classes/wp-security-user-login.php:415 +msgid "Not Found" +msgstr "" + +#: dist/admin/wp-security-list-locked-ip.php:113, dist/admin/wp-security-list-locked-ip.php:133 +msgid "IP lookup result" +msgstr "" + +#: dist/admin/wp-security-list-locked-ip.php:113 +msgid "Show result" +msgstr "" + +#: dist/admin/wp-security-list-locked-ip.php:127 +msgid "Locked IP/range" +msgstr "" + +#: dist/admin/wp-security-list-locked-ip.php:128, dist/admin/wp-security-list-logged-in-users.php:53, dist/admin/wp-security-list-registered-users.php:80 +msgid "User ID" +msgstr "" + +#: dist/admin/wp-security-list-locked-ip.php:130, dist/admin/wp-security-list-permanent-blocked-ip.php:73 +msgid "Reason" +msgstr "" + +#: dist/admin/wp-security-list-locked-ip.php:131 +msgid "Date locked" +msgstr "" + +#: dist/admin/wp-security-list-locked-ip.php:132 +msgid "Release date" +msgstr "" + +#: dist/admin/wp-security-list-locked-ip.php:216 +msgid "The selected IP entries were unlocked successfully." +msgstr "" + +#: dist/admin/wp-security-list-logged-in-users.php:35 +msgid "Are you sure you want to force this user to be logged out of this session?" +msgstr "" + +#: dist/admin/wp-security-list-logged-in-users.php:35, dist/admin/wp-security-user-security-menu.php:38, dist/classes/grade-system/wp-security-feature-item-manager.php:89 +msgid "Force logout" +msgstr "" + +#: dist/admin/wp-security-list-logged-in-users.php:54, dist/admin/wp-security-list-registered-users.php:81 +msgid "Login name" +msgstr "" + +#: dist/admin/wp-security-list-logged-in-users.php:97 +msgid "Logout all" +msgstr "" + +#: dist/admin/wp-security-list-logged-in-users.php:98 +msgid "Logout selected" +msgstr "" + +#: dist/admin/wp-security-list-logged-in-users.php:166 +msgid "Some users were not logged out due to the ID being invalid, or them being a super admin or a member of a different subsite on a multisite" +msgstr "" + +#: dist/admin/wp-security-list-permanent-blocked-ip.php:45 +msgid "Are you sure you want to unblock this IP address?" +msgstr "" + +#: dist/admin/wp-security-list-permanent-blocked-ip.php:72 +msgid "Blocked IP" +msgstr "" + +#: dist/admin/wp-security-list-permanent-blocked-ip.php:74 +msgid "Date and Time" +msgstr "" + +#: dist/admin/wp-security-list-permanent-blocked-ip.php:132, dist/classes/commands/wp-security-ip-commands.php:75 +msgid "Failed to unblock and delete the selected record(s)." +msgstr "" + +#: dist/admin/wp-security-list-permanent-blocked-ip.php:128, dist/classes/commands/wp-security-ip-commands.php:77 +msgid "Successfully unblocked and deleted the selected record(s)." +msgstr "" + +#: dist/admin/wp-security-list-registered-users.php:35 +msgid "View" +msgstr "" + +#: dist/admin/wp-security-list-registered-users.php:36 +msgid "Are you sure you want to approve this account?" +msgstr "" + +#: dist/admin/wp-security-list-registered-users.php:36, dist/admin/wp-security-list-registered-users.php:103 +msgid "Approve" +msgstr "" + +#: dist/admin/wp-security-list-registered-users.php:37 +msgid "Are you sure you want to delete this account?" +msgstr "" + +#: dist/admin/wp-security-list-registered-users.php:38, dist/admin/wp-security-list-registered-users.php:105 +msgid "Block IP" +msgstr "" + +#: dist/admin/wp-security-list-registered-users.php:57 +msgid "blocked" +msgstr "" + +#: dist/admin/wp-security-list-registered-users.php:82 +msgid "Email" +msgstr "" + +#: dist/admin/wp-security-list-registered-users.php:83 +msgid "Register date" +msgstr "" + +#: dist/admin/wp-security-list-registered-users.php:84 +msgid "Account status" +msgstr "" + +#: dist/admin/wp-security-list-registered-users.php:178 +msgid "The selected accounts were approved successfully." +msgstr "" + +#: dist/admin/wp-security-list-registered-users.php:183 +msgid "The following accounts failed to update successfully:" +msgstr "" + +#: dist/admin/wp-security-list-registered-users.php:203 +msgid "Your account is now active" +msgstr "" + +#. translators: %s: Username +#: dist/admin/wp-security-list-registered-users.php:205 +msgid "Your account with username: %s is now active" +msgstr "" + +#: dist/admin/wp-security-list-registered-users.php:234 +msgid "The selected accounts were deleted successfully." +msgstr "" + +#: dist/admin/wp-security-list-registered-users.php:253 +msgid "Only invalid IP addresses were provided: you can not block your own IP address" +msgstr "" + +#: dist/admin/wp-security-list-registered-users.php:264, dist/classes/commands/wp-brute-force-commands.php:478, dist/classes/commands/wp-security-comment-commands.php:154, dist/classes/commands/wp-security-user-security-commands.php:593 +msgid "You cannot block your own IP address:" +msgstr "" + +#: dist/admin/wp-security-list-registered-users.php:272 +msgid "The selected IP addresses were successfully added to the permanent block list." +msgstr "" + +#: dist/admin/wp-security-list-registered-users.php:273, dist/classes/commands/wp-security-user-security-commands.php:601 +msgid "View Blocked IPs" +msgstr "" + +#: dist/admin/wp-security-settings-menu.php:34 +msgid "General settings" +msgstr "" + +#: dist/admin/wp-security-settings-menu.php:38, dist/admin/wp-security-settings-menu.php:43, dist/classes/wp-security-settings-tasks.php:60, dist/classes/wp-security-settings-tasks.php:65, dist/classes/wp-security-settings-tasks.php:90 +msgid "file" +msgstr "" + +#: dist/admin/wp-security-settings-menu.php:48 +msgid "Delete plugin settings" +msgstr "" + +#: dist/admin/wp-security-settings-menu.php:52 +msgid "WP version info" +msgstr "" + +#: dist/admin/wp-security-settings-menu.php:56 +msgid "Import/Export" +msgstr "" + +#: dist/admin/wp-security-spam-menu.php:19, dist/templates/wp-admin/dashboard/may-also-like.php:174 +msgid "Spam prevention" +msgstr "" + +#: dist/admin/wp-security-spam-menu.php:30 +msgid "Comment spam" +msgstr "" + +#: dist/admin/wp-security-spam-menu.php:34 +msgid "Comment spam IP monitoring" +msgstr "" + +#: dist/admin/wp-security-spam-menu.php:82, dist/classes/commands/wp-security-comment-commands.php:212 +msgid "Spammer IPs added to permanent block list today:" +msgstr "" + +#: dist/admin/wp-security-spam-menu.php:82, dist/classes/commands/wp-security-comment-commands.php:213 +msgid "All time total:" +msgstr "" + +#: dist/admin/wp-security-spam-menu.php:82, dist/classes/commands/wp-security-comment-commands.php:214 +msgid "View blocked IPs" +msgstr "" + +#: dist/admin/wp-security-spam-menu.php:70, dist/classes/commands/wp-security-comment-commands.php:207 +msgid "You currently have no IP addresses permanently blocked due to spam." +msgstr "" + +#: dist/admin/wp-security-tools-menu.php:32, dist/templates/wp-admin/tools/password-tool.php:2, dist/templates/wp-admin/user-security/http-authentication.php:81 +msgid "Password tool" +msgstr "" + +#: dist/admin/wp-security-tools-menu.php:36 +msgid "WHOIS lookup" +msgstr "" + +#: dist/admin/wp-security-tools-menu.php:40, dist/templates/wp-admin/tools/custom-htaccess.php:28 +msgid "Custom .htaccess rules" +msgstr "" + +#: dist/admin/wp-security-tools-menu.php:45 +msgid "Visitor lockout" +msgstr "" + +#: dist/admin/wp-security-user-security-menu.php:30 +msgid "User accounts" +msgstr "" + +#: dist/admin/wp-security-user-security-menu.php:46 +msgid "Manual approval" +msgstr "" + +#: dist/admin/wp-security-user-security-menu.php:50 +msgid "Salt" +msgstr "" + +#: dist/admin/wp-security-user-security-menu.php:55 +msgid "HTTP authentication" +msgstr "" + +#: dist/admin/wp-security-user-security-menu.php:59, dist/classes/grade-system/wp-security-feature-item-manager.php:97, dist/templates/wp-admin/tools/password-tool.php:23, dist/templates/wp-admin/user-security/hibp.php:4, dist/templates/wp-admin/user-security/http-authentication.php:82 +msgid "HIBP" +msgstr "" + +#: dist/admin/wp-security-user-security-menu.php:64, dist/templates/wp-admin/user-security/additional.php:9 +msgid "Additional settings" +msgstr "" + +#: dist/admin/wp-security-user-security-menu.php:109 +msgid "Account login name" +msgstr "" + +#: dist/admin/wp-security-user-security-menu.php:118 +msgid "Edit user" +msgstr "" + +#: dist/admin/wp-security-user-security-menu.php:222 +msgid "Failed to save 'Enable for WordPress dashboard'." +msgstr "" + +#: dist/admin/wp-security-user-security-menu.php:222, dist/admin/wp-security-user-security-menu.php:233, dist/templates/wp-admin/user-security/http-authentication.php:9 +msgid "Your site is currently not using https." +msgstr "" + +#: dist/admin/wp-security-user-security-menu.php:233 +msgid "Failed to save 'Enable for frontend'." +msgstr "" + +#: dist/admin/wp-security-user-security-menu.php:241 +msgid "Failed to save 'Username'." +msgstr "" + +#: dist/admin/wp-security-user-security-menu.php:241 +msgid "Please enter a value for the HTTP authentication username." +msgstr "" + +#: dist/admin/wp-security-user-security-menu.php:248 +msgid "Failed to save 'Password'." +msgstr "" + +#: dist/admin/wp-security-user-security-menu.php:248 +msgid "Please enter a value for the HTTP authentication password." +msgstr "" + +#: dist/classes/wp-security-ajax.php:149 +msgid "Options can only be saved by network admin" +msgstr "" + +#. translators: %s: Subaction +#: dist/classes/wp-security-ajax.php:182 +msgid "The command \"%s\" was not found" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:102 +msgid "Core updated" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:103 +msgid "Plugin installed" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:104 +msgid "Plugin activated" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:105 +msgid "Plugin updated" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:106 +msgid "Plugin deactivated" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:107 +msgid "Plugin deleted" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:108 +msgid "Theme installed" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:109 +msgid "Theme activated" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:110 +msgid "Theme updated" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:111 +msgid "Theme deleted" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:112 +msgid "Translation updated" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:113 +msgid "Entity changed" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:114 +msgid "Successful login" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:115 +msgid "Successful logout" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:116 +msgid "Failed login" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:117 +msgid "User registration" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:118 +msgid "User deleted" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:119 +msgid "User removed from blog" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:120 +msgid "Table migration" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:121 +msgid "Rule triggered" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:122 +msgid "Rule not triggered" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:123 +msgid "Rule active" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:124 +msgid "Rule not active" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:125 +msgid "Password reset" +msgstr "" + +#: dist/classes/wp-security-audit-events.php:635 +msgid "(force logout)" +msgstr "" + +#. translators: %s: User name +#: dist/classes/wp-security-audit-text-handler.php:18 +msgid "Successful login with username: %s" +msgstr "" + +#: dist/classes/wp-security-audit-text-handler.php:29 +msgid "Successful logout with username:" +msgstr "" + +#. translators: 1: Old version, 2: New version +#: dist/classes/wp-security-audit-text-handler.php:40 +msgid "WordPress updated from version %1$s to %2$s" +msgstr "" + +#: dist/classes/wp-security-audit-text-handler.php:50 +msgid "Plugin" +msgstr "" + +#: dist/classes/wp-security-audit-text-handler.php:63, dist/classes/wp-security-audit-text-handler.php:61, dist/templates/wp-admin/brute-force/captcha-provider.php:57 +msgid "Theme" +msgstr "" + +#: dist/classes/wp-security-audit-text-handler.php:78 +msgid "An unknown entity has changed, please check the stacktrace for more details" +msgstr "" + +#: dist/classes/wp-security-audit-text-handler.php:76 +msgid "Entity: \"%s\" has changed, please check the stacktrace for more details" +msgstr "" + +#. translators: 1: Slug, 2: Language name, 3: Version +#: dist/classes/wp-security-audit-text-handler.php:97 +msgid "Theme \"%1$s\" %2$s translations updated to version %3$s" +msgstr "" + +#: dist/classes/wp-security-audit-text-handler.php:94 +msgid "Plugin \"%1$s\" %2$s translations updated to version %3$s" +msgstr "" + +#: dist/classes/wp-security-audit-text-handler.php:91 +msgid "Core %1$s translations updated to version %2$s" +msgstr "" + +#. translators: %s: User name +#: dist/classes/wp-security-audit-text-handler.php:115 +msgid "Failed login attempt with a unknown username: %s" +msgstr "" + +#: dist/classes/wp-security-audit-text-handler.php:112 +msgid "Failed login attempt with a known username: %s" +msgstr "" + +#: dist/classes/wp-security-audit-text-handler.php:109 +msgid "Event imported from the failed logins table" +msgstr "" + +#. translators: %s: Registered User name +#: dist/classes/wp-security-audit-text-handler.php:134 +msgid "User %s registered" +msgstr "" + +#: dist/classes/wp-security-audit-text-handler.php:131 +msgid "User %s registered and set to pending" +msgstr "" + +#: dist/classes/wp-security-audit-text-handler.php:128 +msgid "Admin %1$s registered new user: %2$s" +msgstr "" + +#. translators: 1: From table, 2: To table +#: dist/classes/wp-security-audit-text-handler.php:150 +msgid "Failed to migrate the `%1$s` table data to the `%2$s` table" +msgstr "" + +#: dist/classes/wp-security-audit-text-handler.php:147 +msgid "Successfully migrated the `%1$s` table data to the `%2$s` table" +msgstr "" + +#. translators: 1: Rule name, 2: Rule family +#: dist/classes/wp-security-audit-text-handler.php:165 +msgid "\"%1$s [%2$s]\" rule has been triggered." +msgstr "" + +#. translators: 1: Rule name, 2: Rule family +#: dist/classes/wp-security-audit-text-handler.php:169 +msgid "\"%1$s [%2$s]\" rule was not triggered." +msgstr "" + +#. translators: 1: Rule name, 2: Rule family +#: dist/classes/wp-security-audit-text-handler.php:173 +msgid "\"%1$s [%2$s]\" rule is active." +msgstr "" + +#. translators: 1: Rule name, 2: Rule family +#: dist/classes/wp-security-audit-text-handler.php:177 +msgid "\"%1$s [%2$s]\" rule is not active." +msgstr "" + +#: dist/classes/wp-security-audit-text-handler.php:190 +msgid "Configure this rule" +msgstr "" + +#. translators: %s: User login +#: dist/classes/wp-security-audit-text-handler.php:204 +msgid "Password for user account: `%s` successfully changed" +msgstr "" + +#. translators: 1: User login, 2: User ID, 3: Reassign +#: dist/classes/wp-security-audit-text-handler.php:219 +msgid "User account: `%1$s` with ID: `%2$s` has been deleted and all content has been reassigned to user with ID: `%3$s`" +msgstr "" + +#: dist/classes/wp-security-audit-text-handler.php:216 +msgid "User account: %1$s with ID: `%2$s` has been deleted" +msgstr "" + +#. translators: 1: User login, 2: User ID, 3: Blog ID, 4: Reassign +#: dist/classes/wp-security-audit-text-handler.php:235 +msgid "User account: `%1$s` with ID: `%2$s` has been removed from the blog with ID: `%3$s` and all content has been reassigned to user with ID: `%4$s`" +msgstr "" + +#: dist/classes/wp-security-audit-text-handler.php:232 +msgid "User account: %1$s with ID: `%2$s` has been removed from the blog with ID: `%3$s`" +msgstr "" + +#: dist/classes/wp-security-captcha.php:100 +msgid "Auto" +msgstr "" + +#: dist/classes/wp-security-captcha.php:101 +msgid "Light" +msgstr "" + +#: dist/classes/wp-security-captcha.php:102 +msgid "Dark" +msgstr "" + +#: dist/classes/wp-security-captcha.php:183, dist/classes/wp-security-captcha.php:224, dist/classes/wp-security-captcha.php:367 +msgid "Please enter an answer in digits:" +msgstr "" + +#: dist/classes/wp-security-captcha.php:213 +msgid "This content is password protected." +msgstr "" + +#: dist/classes/wp-security-captcha.php:213 +msgid "To view it please enter your password below:" +msgstr "" + +#: dist/classes/wp-security-captcha.php:214, dist/templates/wp-admin/user-security/http-authentication.php:74 +msgid "Password:" +msgstr "" + +#: dist/classes/wp-security-captcha.php:233 +msgid "Enter" +msgstr "" + +#: dist/classes/wp-security-captcha.php:248 +msgid "Captcha verification failed." +msgstr "" + +#: dist/classes/wp-security-captcha.php:248 +msgid "Please try again." +msgstr "" + +#: dist/classes/wp-security-captcha.php:464 +msgid "one" +msgstr "" + +#: dist/classes/wp-security-captcha.php:465 +msgid "two" +msgstr "" + +#: dist/classes/wp-security-captcha.php:466 +msgid "three" +msgstr "" + +#: dist/classes/wp-security-captcha.php:467 +msgid "four" +msgstr "" + +#: dist/classes/wp-security-captcha.php:468 +msgid "five" +msgstr "" + +#: dist/classes/wp-security-captcha.php:469 +msgid "six" +msgstr "" + +#: dist/classes/wp-security-captcha.php:470 +msgid "seven" +msgstr "" + +#: dist/classes/wp-security-captcha.php:471 +msgid "eight" +msgstr "" + +#: dist/classes/wp-security-captcha.php:472 +msgid "nine" +msgstr "" + +#: dist/classes/wp-security-captcha.php:473 +msgid "ten" +msgstr "" + +#: dist/classes/wp-security-captcha.php:474 +msgid "eleven" +msgstr "" + +#: dist/classes/wp-security-captcha.php:475 +msgid "twelve" +msgstr "" + +#: dist/classes/wp-security-captcha.php:476 +msgid "thirteen" +msgstr "" + +#: dist/classes/wp-security-captcha.php:477 +msgid "fourteen" +msgstr "" + +#: dist/classes/wp-security-captcha.php:478 +msgid "fifteen" +msgstr "" + +#: dist/classes/wp-security-captcha.php:479 +msgid "sixteen" +msgstr "" + +#: dist/classes/wp-security-captcha.php:480 +msgid "seventeen" +msgstr "" + +#: dist/classes/wp-security-captcha.php:481 +msgid "eighteen" +msgstr "" + +#: dist/classes/wp-security-captcha.php:482 +msgid "nineteen" +msgstr "" + +#: dist/classes/wp-security-captcha.php:483 +msgid "twenty" +msgstr "" + +#: dist/classes/wp-security-captcha.php:816, dist/classes/wp-security-general-init-tasks.php:756 +msgid "Your CAPTCHA answer was incorrect - please try again." +msgstr "" + +#: dist/classes/wp-security-captcha.php:900 +msgid "%s captcha" +msgstr "" + +#: dist/classes/wp-security-captcha.php:913 +msgid "Generate a form-tag to use %s CAPTCHA" +msgstr "" + +#: dist/classes/wp-security-captcha.php:919 +msgid "Insert tag" +msgstr "" + +#. translators: %s: Error notification with strong HTML tag. +#: dist/classes/wp-security-captcha.php:936, dist/classes/wp-security-general-init-tasks.php:798, dist/classes/wp-security-user-login.php:151 +msgid "%s: Your answer was incorrect - please try again." +msgstr "" + +#: dist/classes/wp-security-captcha.php:936, dist/classes/wp-security-general-init-tasks.php:790, dist/classes/wp-security-general-init-tasks.php:798, dist/classes/wp-security-user-login.php:110, dist/classes/wp-security-user-login.php:151 +msgid "ERROR" +msgstr "" + +#: dist/classes/wp-security-commands.php:70 +msgid "The feature item manager could not be initialized." +msgstr "" + +#: dist/classes/wp-security-commands.php:88 +msgid "Invalid IP retrieve method." +msgstr "" + +#: dist/classes/wp-security-commands.php:266 +msgid "The settings update was unsuccessful." +msgstr "" + +#: dist/classes/wp-security-commands.php:318 +msgid "Invalid email address." +msgstr "" + +#: dist/classes/wp-security-commands.php:327 +msgid "The diagnostic report has been sent successfully." +msgstr "" + +#: dist/classes/wp-security-commands.php:333 +msgid "There was an error sending the diagnostic report." +msgstr "" + +#: dist/classes/wp-security-commands.php:401 +msgid "AIOS premium" +msgstr "" + +#: dist/classes/wp-security-commands.php:403 +msgid "Advanced malware scanning" +msgstr "" + +#: dist/classes/wp-security-commands.php:404 +msgid "Real-time response time monitoring" +msgstr "" + +#: dist/classes/wp-security-commands.php:405 +msgid "Custom two-factor authentication" +msgstr "" + +#: dist/classes/wp-security-commands.php:406 +msgid "404 error protection & bot blocking" +msgstr "" + +#: dist/classes/wp-security-commands.php:407 +msgid "Country-based traffic blocking" +msgstr "" + +#: dist/classes/wp-security-commands.php:408 +msgid "Country whitelist management" +msgstr "" + +#: dist/classes/wp-security-commands.php:409 +msgid "Guaranteed premium support" +msgstr "" + +#: dist/classes/wp-security-commands.php:412 +msgid "Upgrade Now" +msgstr "" + +#: dist/classes/wp-security-configure-settings.php:519 +msgid "Basic firewall settings disabled" +msgstr "" + +#. translators: %s: Dashboard link. +#: dist/classes/wp-security-configure-settings.php:521 +msgid "Our basic firewall rules have been upgraded and to prevent any unexpected site issues we have disabled the features." +msgstr "" + +#: dist/classes/wp-security-configure-settings.php:521 +msgid "You can enable the features again by logging into your WordPress dashboard." +msgstr "" + +#: dist/classes/wp-security-configure-settings.php:521, dist/classes/wp-security-configure-settings.php:539 +msgid "Go to dashboard: %s" +msgstr "" + +#: dist/classes/wp-security-configure-settings.php:521 +msgid "Once logged in you will see a notification where you can decide on which course of action you wish to take." +msgstr "" + +#: dist/classes/wp-security-configure-settings.php:537 +msgid "Blacklist manager disabled notification" +msgstr "" + +#. translators: %s: Dashboard link +#: dist/classes/wp-security-configure-settings.php:539 +msgid "The blacklist manager feature has been updated and to prevent any unexpected site lockouts we have disabled the feature." +msgstr "" + +#: dist/classes/wp-security-configure-settings.php:539 +msgid "You can enable the feature again by logging into your WordPress dashboard." +msgstr "" + +#: dist/classes/wp-security-configure-settings.php:539 +msgid "Once logged in before turning the blacklist manger on please double check your settings to ensure you have not entered your own details." +msgstr "" + +#: dist/classes/wp-security-cronjob-handler.php:35 +msgid "Every 15 minutes" +msgstr "" + +#: dist/classes/wp-security-debug-logger.php:48 +msgid "Unable to get the reason why" +msgstr "" + +#: dist/classes/wp-security-debug-logger.php:49 +msgid "Unable to clear the logs" +msgstr "" + +#: dist/classes/wp-security-debug.php:416 +msgid "status" +msgstr "" + +#: dist/classes/wp-security-debug.php:416 +msgid "On" +msgstr "" + +#: dist/classes/wp-security-debug.php:511 +msgid "Enter your email address" +msgstr "" + +#: dist/classes/wp-security-debug.php:513 +msgid "Send report" +msgstr "" + +#: dist/classes/wp-security-file-scan.php:78 +msgid "All In One WP Security - File change detected" +msgstr "" + +#: dist/classes/wp-security-file-scan.php:80 +msgid "A file change was detected on your system for site URL" +msgstr "" + +#: dist/classes/wp-security-file-scan.php:80 +msgid ". Scan was generated on" +msgstr "" + +#: dist/classes/wp-security-file-scan.php:81 +msgid "A summary of the scan results is shown below:" +msgstr "" + +#: dist/classes/wp-security-file-scan.php:84 +msgid "Login to your site to view the scan details." +msgstr "" + +#: dist/classes/wp-security-file-scan.php:323 +msgid "The following files were added to your host" +msgstr "" + +#: dist/classes/wp-security-file-scan.php:325, dist/classes/wp-security-file-scan.php:333, dist/classes/wp-security-file-scan.php:342 +msgid "modified on:" +msgstr "" + +#: dist/classes/wp-security-file-scan.php:331 +msgid "The following files were removed from your host" +msgstr "" + +#: dist/classes/wp-security-file-scan.php:340 +msgid "The following files were changed on your host" +msgstr "" + +#: dist/classes/wp-security-general-init-tasks.php:230, dist/classes/wp-security-general-init-tasks.php:557 +msgid "Application passwords have been disabled by All-In-One Security plugin." +msgstr "" + +#: dist/classes/wp-security-general-init-tasks.php:528, dist/classes/wp-security-general-init-tasks.php:616, dist/classes/wp-security-general-init-tasks.php:772, dist/classes/wp-security-user-registration.php:86 +msgid "ERROR: Your answer was incorrect - please try again." +msgstr "" + +#: dist/classes/wp-security-general-init-tasks.php:539 +msgid "Enter something special:" +msgstr "" + +#: dist/classes/wp-security-general-init-tasks.php:552 +msgid "Application passwords" +msgstr "" + +#: dist/classes/wp-security-general-init-tasks.php:556, dist/includes/simba-tfa/simba-tfa.php:444, dist/includes/simba-tfa/simba-tfa.php:1317 +msgid "Disabled" +msgstr "" + +#: dist/classes/wp-security-general-init-tasks.php:562 +msgid "Site admin can only change this setting." +msgstr "" + +#: dist/classes/wp-security-general-init-tasks.php:560 +msgid "Change setting" +msgstr "" + +#: dist/classes/wp-security-general-init-tasks.php:591 +msgid "Error: You entered an incorrect CAPTCHA answer, please go back and try again." +msgstr "" + +#: dist/classes/wp-security-general-init-tasks.php:765 +msgid "ERROR: Your IP address is currently locked please contact the administrator!" +msgstr "" + +#. translators: %s: Error notification with strong HTML tag. +#: dist/classes/wp-security-general-init-tasks.php:790 +msgid "%s: Your IP address is currently locked." +msgstr "" + +#: dist/classes/wp-security-general-init-tasks.php:790, dist/classes/wp-security-user-login.php:110 +msgid "Please contact the administrator." +msgstr "" + +#: dist/classes/wp-security-general-init-tasks.php:829 +msgid "Please enter the correct reCAPTCHA keys %s to use the Google reCAPTCHA feature." +msgstr "" + +#: dist/classes/wp-security-general-init-tasks.php:829, dist/templates/wp-admin/general/moved.php:21, dist/templates/wp-admin/scanner/malware-scan.php:7 +msgid "here" +msgstr "" + +#: dist/classes/wp-security-general-init-tasks.php:849 +msgid "Your registration is pending approval." +msgstr "" + +#: dist/classes/wp-security-general-init-tasks.php:886 +msgid "You are not authorized to perform this action." +msgstr "" + +#: dist/classes/wp-security-general-init-tasks.php:921 +msgid "Accessing user details is forbidden." +msgstr "" + +#: dist/classes/wp-security-general-init-tasks.php:916 +msgid "Listing users is forbidden." +msgstr "" + +#: dist/classes/wp-security-general-init-tasks.php:1017, dist/classes/wp-security-process-renamed-login-page.php:149 +msgid "You do not have permission to access this page." +msgstr "" + +#: dist/classes/wp-security-general-init-tasks.php:1018, dist/classes/wp-security-process-renamed-login-page.php:149 +msgid "Please log in and try again." +msgstr "" + +#: dist/classes/wp-security-notices.php:30 +msgid "An error occurred while rendering this notice, please enable and check your debug log." +msgstr "" + +#. translators: 1. HTML text. 2. HTML text, 3. HTML text. +#: dist/classes/wp-security-notices.php:45 +msgid "Get %1$s with %2$s. %3$s, downtime, and response time issues." +msgstr "" + +#: dist/classes/wp-security-notices.php:45, dist/classes/wp-security-notices.php:48 +msgid "added protection" +msgstr "" + +#: dist/classes/wp-security-notices.php:45, dist/classes/wp-security-notices.php:48, dist/templates/wp-admin/dashboard/may-also-like.php:24 +msgid "Premium" +msgstr "" + +#: dist/classes/wp-security-notices.php:45, dist/classes/wp-security-notices.php:48 +msgid "Scan your site for malware" +msgstr "" + +#. translators: %s: HTML text. +#: dist/classes/wp-security-notices.php:48 +msgid "Block traffic by country of origin, get advanced two-factor authentication, %s, and more." +msgstr "" + +#: dist/classes/wp-security-notices.php:52 +msgid "The All in One Security plugin has deactivated some of the firewall settings that you had activated." +msgstr "" + +#: dist/classes/wp-security-notices.php:55 +msgid "We have upgraded the following settings so that they are now part of the PHP firewall instead of .htaccess directives:" +msgstr "" + +#: dist/classes/wp-security-notices.php:85 +msgid "None of the settings that have been upgraded were active." +msgstr "" + +#: dist/classes/wp-security-notices.php:68 +msgid "Completely block xmlrpc.php" +msgstr "" + +#: dist/classes/wp-security-notices.php:71, dist/templates/wp-admin/firewall/partials/proxy-comment.php:13 +msgid "Forbid proxy comment posting" +msgstr "" + +#: dist/classes/wp-security-notices.php:74, dist/templates/wp-admin/firewall/partials/bad-query-strings.php:13 +msgid "Deny bad query strings" +msgstr "" + +#: dist/classes/wp-security-notices.php:77 +msgid "Advanced character filter" +msgstr "" + +#: dist/classes/wp-security-notices.php:89 +msgid "What would you like to do?" +msgstr "" + +#: dist/classes/wp-security-notices.php:92 +msgid "The All in One Security plugin has disabled the login whitelist setting that you have enabled in the past." +msgstr "" + +#: dist/classes/wp-security-notices.php:98 +msgid "Your website is running on a non-Apache webserver, so the login whitelisting was not functional until the recent update of AIOS (because it relied upon Apache-specific features)." +msgstr "" + +#: dist/classes/wp-security-notices.php:96 +msgid "Your website is running on an Apache webserver, the login whitelisting might not be functional until the recent update of AIOS (because it relied upon Apache-specific module features)." +msgstr "" + +#: dist/classes/wp-security-notices.php:100 +msgid "It began working with AIOS version 5.0.8." +msgstr "" + +#: dist/classes/wp-security-notices.php:100 +msgid "We have disabled it so that your login page will not be blocked unexpectedly." +msgstr "" + +#: dist/classes/wp-security-notices.php:106 +msgid "Whitelisted login IP address(es):" +msgstr "" + +#: dist/classes/wp-security-notices.php:109 +msgid "Would you like to re-enable login whitelisting?" +msgstr "" + +#: dist/classes/wp-security-notices.php:115 +msgid "Removed database backup feature from the All-In-One Security plugin" +msgstr "" + +#: dist/classes/wp-security-notices.php:117 +msgid "Beginning with version 5.0.0, AIOS has replaced the AIOS backup method with the superior UpdraftPlus method." +msgstr "" + +#: dist/classes/wp-security-notices.php:118 +msgid "It remains free and is fully supported by the UpdraftPlus team." +msgstr "" + +#: dist/classes/wp-security-notices.php:121 +msgid "You are seeing this notice because you have previously set up automated database backups in AIOS." +msgstr "" + +#: dist/classes/wp-security-notices.php:122 +msgid "Would you like to set up scheduled backups with UpdraftPlus?" +msgstr "" + +#: dist/classes/wp-security-notices.php:128 +msgid "Setup UpdraftPlus backup plugin" +msgstr "" + +#: dist/classes/wp-security-notices.php:134 +msgid "Important: set up your IP address detection settings" +msgstr "" + +#: dist/classes/wp-security-notices.php:136 +msgid "The All in One Security plugin couldn't be certain about the correct method to detect the IP address for your site visitors with your currently-configured IP address detection settings." +msgstr "" + +#: dist/classes/wp-security-notices.php:137 +msgid "It is important for your security to set the IP address detection settings properly." +msgstr "" + +#: dist/classes/wp-security-notices.php:140 +msgid "Please go to the settings and set them now." +msgstr "" + +#: dist/classes/wp-security-notices.php:146 +msgid "Setup IP address detection settings" +msgstr "" + +#: dist/classes/wp-security-notices.php:154 +msgid "Failed to load the firewall resources." +msgstr "" + +#: dist/classes/wp-security-notices.php:155 +msgid "The firewall won't operate correctly." +msgstr "" + +#: dist/classes/wp-security-notices.php:162 +msgid "AIOS PHP 5.6 support will end soon" +msgstr "" + +#: dist/classes/wp-security-notices.php:169 +msgid "Important: Disabled firewall settings" +msgstr "" + +#: dist/classes/wp-security-notices.php:175 +msgid "Reactivate" +msgstr "" + +#: dist/classes/wp-security-notices.php:176 +msgid "Configure manually" +msgstr "" + +#: dist/classes/wp-security-notices.php:179 +msgid "Keep deactivated" +msgstr "" + +#: dist/classes/wp-security-notices.php:183 +msgid "Important: Blacklist manager disabled" +msgstr "" + +#: dist/classes/wp-security-notices.php:185 +msgid "The blacklist manager feature has been disabled to prevent any unexpected site lockouts." +msgstr "" + +#: dist/classes/wp-security-notices.php:188 +msgid "This feature will block any IP address or range listed in its settings, please double check your own details are not included before turning it back on." +msgstr "" + +#: dist/classes/wp-security-notices.php:195, dist/classes/wp-security-notices.php:209 +msgid "Edit the settings" +msgstr "" + +#: dist/classes/wp-security-notices.php:202 +msgid "Important: Disabled login whitelist setting" +msgstr "" + +#: dist/classes/wp-security-notices.php:208 +msgid "Turn it back on" +msgstr "" + +#: dist/classes/wp-security-notices.php:212 +msgid "Keep it off" +msgstr "" + +#: dist/classes/wp-security-notices.php:216 +msgid "We noticed AIOS has kept your site safe for a while." +msgstr "" + +#: dist/classes/wp-security-notices.php:216 +msgid "If you like us, please consider leaving a positive review." +msgstr "" + +#: dist/classes/wp-security-notices.php:216 +msgid "If you have any issues or questions, please contact %s." +msgstr "" + +#: dist/classes/wp-security-notices.php:216 +msgid "support" +msgstr "" + +#: dist/classes/wp-security-notices.php:216 +msgid "Thank you so much!" +msgstr "" + +#: dist/classes/wp-security-notices.php:216 +msgid "All-In-One Security (AIOS)" +msgstr "" + +#: dist/classes/wp-security-notices.php:226 +msgid "Enhance your security even more by backing up your site" +msgstr "" + +#: dist/classes/wp-security-notices.php:227 +msgid "UpdraftPlus is the world's most trusted backup plugin." +msgstr "" + +#: dist/classes/wp-security-notices.php:227 +msgid "From the owners of All-In-One Security (AIOS)." +msgstr "" + +#: dist/classes/wp-security-notices.php:237 +msgid "Speed up your site" +msgstr "" + +#: dist/classes/wp-security-notices.php:238 +msgid "After you've secured your site, we recommend you install our WP-Optimize plugin to streamline it for better website performance." +msgstr "" + +#: dist/classes/wp-security-notices.php:250 +msgid "20% off - Black Friday Sale" +msgstr "" + +#: dist/classes/wp-security-notices.php:252 +msgid "at checkout." +msgstr "" + +#: dist/classes/wp-security-notices.php:252 +msgid "Hurry, offer ends 2 December." +msgstr "" + +#: dist/classes/wp-security-notices.php:254 +msgid "Save 20%% with code %s" +msgstr "" + +#: dist/classes/wp-security-notices.php:318 +msgid "AIOS will end support for PHP 5.6 on the 1st September 2025." +msgstr "" + +#: dist/classes/wp-security-notices.php:320 +msgid "PHP 5.6 is outdated and no longer receives security updates." +msgstr "" + +#: dist/classes/wp-security-notices.php:320 +msgid "To keep things secure and compatible with modern WordPress standards, AIOS will move to a minimum requirement of PHP 7.0." +msgstr "" + +#: dist/classes/wp-security-notices.php:322 +msgid "After the 1st September 2025, AIOS may not operate correctly on PHP versions below 7.0." +msgstr "" + +#: dist/classes/wp-security-notices.php:324 +msgid "If you require help upgrading your PHP version, please contact your hosting provider." +msgstr "" + +#: dist/classes/wp-security-process-renamed-login-page.php:163 +msgid "Invalid key" +msgstr "" + +#: dist/classes/wp-security-process-renamed-login-page.php:172 +msgid "User action confirmed." +msgstr "" + +#. translators: %s: .htaccess path +#. translators: %s: wp-config.php path +#. translators: %s: .htaccess path, %s file tab name. +#: dist/classes/wp-security-settings-tasks.php:32, dist/classes/wp-security-settings-tasks.php:60, dist/classes/wp-security-settings-tasks.php:65, dist/classes/wp-security-settings-tasks.php:90, dist/classes/commands/wp-security-settings-commands.php:307 +msgid "Could not write to the %s file." +msgstr "" + +#: dist/classes/wp-security-settings-tasks.php:32, dist/classes/commands/wp-security-settings-commands.php:307 +msgid "Please check the file permissions." +msgstr "" + +#: dist/classes/wp-security-settings-tasks.php:29 +msgid "Settings were successfully saved." +msgstr "" + +#: dist/classes/wp-security-settings-tasks.php:60, dist/classes/wp-security-settings-tasks.php:65, dist/classes/wp-security-settings-tasks.php:90 +msgid "Please restore it manually using the restore functionality in the \"%s\" tab." +msgstr "" + +#: dist/classes/wp-security-settings-tasks.php:57 +msgid "All the security features have been disabled successfully." +msgstr "" + +#: dist/classes/wp-security-settings-tasks.php:87 +msgid "All firewall rules have been disabled successfully." +msgstr "" + +#: dist/classes/wp-security-settings-tasks.php:122 +msgid "All settings have been successfully reset." +msgstr "" + +#: dist/classes/wp-security-settings-tasks.php:120 +msgid "Deletion of .htaccess directives failed." +msgstr "" + +#: dist/classes/wp-security-settings-tasks.php:118 +msgid "Reset of aio_wp_security_configs option failed." +msgstr "" + +#: dist/classes/wp-security-settings-tasks.php:116 +msgid "Deletion of aio_wp_security_configs option and .htaccess directives failed." +msgstr "" + +#: dist/classes/wp-security-two-factor-login.php:66 +msgid "Two factor authentication - Admin settings" +msgstr "" + +#: dist/classes/wp-security-two-factor-login.php:123, dist/classes/wp-security-two-factor-login.php:123 +msgid "Two Factor Auth" +msgstr "" + +#: dist/classes/wp-security-two-factor-login.php:146 +msgid "Two factor authentication" +msgstr "" + +#: dist/classes/wp-security-two-factor-login.php:195 +msgid "PHP OpenSSL or mcrypt module required" +msgstr "" + +#: dist/classes/wp-security-two-factor-login.php:195 +msgid "The All-In-One Security plugin's Two Factor Authentication module requires either the PHP openssl (preferred) or mcrypt module to be installed." +msgstr "" + +#: dist/classes/wp-security-two-factor-login.php:195 +msgid "Please ask your web hosting company to install one of them." +msgstr "" + +#: dist/classes/wp-security-user-login.php:80 +msgid "You have disabled login lockout by defining the AIOS_DISABLE_LOGIN_LOCKOUT constant value as true, and the login lockout setting has enabled it." +msgstr "" + +#. translators: 1: Locked IP Addresses admin page link +#: dist/classes/wp-security-user-login.php:82 +msgid "Delete your login lockout IP from %s and define the AIOS_DISABLE_LOGIN_LOCKOUT constant value as false." +msgstr "" + +#. translators: %s: Error notification with strong HTML tag. +#: dist/classes/wp-security-user-login.php:110 +msgid "%s: Access from your IP address has been blocked for security reasons." +msgstr "" + +#: dist/classes/wp-security-user-login.php:119 +msgid "Service temporarily unavailable" +msgstr "" + +#. translators: %s: Notification with strong HTML tag. +#: dist/classes/wp-security-user-login.php:178 +msgid "%s: Your account is currently not active." +msgstr "" + +#: dist/classes/wp-security-user-login.php:178 +msgid "ACCOUNT PENDING" +msgstr "" + +#: dist/classes/wp-security-user-login.php:178 +msgid "An administrator needs to activate your account before you can login." +msgstr "" + +#: dist/classes/wp-security-user-login.php:256 +msgid "ERROR: Invalid login credentials." +msgstr "" + +#: dist/classes/wp-security-user-login.php:398 +msgid "Site Lockout Notification" +msgstr "" + +#: dist/classes/wp-security-user-login.php:399 +msgid "User login lockout events had occurred due to too many failed login attempts or invalid username:" +msgstr "" + +#. translators: %s: User name. +#: dist/classes/wp-security-user-login.php:403 +msgid "Username: %s" +msgstr "" + +#. translators: %s: IP Address. +#: dist/classes/wp-security-user-login.php:406 +msgid "IP address: %s" +msgstr "" + +#. translators: %s: IP Range. +#: dist/classes/wp-security-user-login.php:409 +msgid "IP range: %s" +msgstr "" + +#. translators: %s: Org. +#: dist/classes/wp-security-user-login.php:418 +msgid "Org: %s" +msgstr "" + +#. translators: %s: AS. +#: dist/classes/wp-security-user-login.php:420 +msgid "AS: %s" +msgstr "" + +#: dist/classes/wp-security-user-login.php:427 +msgid "Log into your site WordPress administration panel to see the duration of the lockout or to unlock the user." +msgstr "" + +#: dist/classes/wp-security-user-login.php:544 +msgid "Unlock request notification" +msgstr "" + +#. translators: 1: Email 2: Link +#: dist/classes/wp-security-user-login.php:546 +msgid "You have requested for the account with email address %s to be unlocked." +msgstr "" + +#: dist/classes/wp-security-user-login.php:546 +msgid "Please press the link below to unlock your account:" +msgstr "" + +#: dist/classes/wp-security-user-login.php:546 +msgid "Unlock link: %s" +msgstr "" + +#: dist/classes/wp-security-user-login.php:546 +msgid "After pressing the above link you will be able to login to the WordPress administration panel." +msgstr "" + +#. translators: %s: Minute count +#: dist/classes/wp-security-user-login.php:746 +msgid "Your session has expired because it has been over %d minutes since your last login." +msgstr "" + +#: dist/classes/wp-security-user-login.php:747, dist/classes/wp-security-user-login.php:751 +msgid "Please log back in to continue." +msgstr "" + +#: dist/classes/wp-security-user-login.php:750 +msgid "You were logged out because you just changed the \"admin\" username." +msgstr "" + +#: dist/classes/wp-security-user-login.php:781 +msgid "Request unlock" +msgstr "" + +#: dist/classes/wp-security-user-registration.php:80 +msgid "ERROR: You are not allowed to register because your IP address is currently locked!" +msgstr "" + +#: dist/classes/wp-security-utility-file.php:457, dist/templates/wp-admin/filesystem-security/partials/file-permissions-table.php:5, dist/templates/wp-admin/filesystem-security/partials/file-permissions-table.php:21 +msgid "Name" +msgstr "" + +#: dist/classes/wp-security-utility-file.php:457, dist/admin/general/wp-security-ajax-data-table.php:553, dist/admin/general/wp-security-ajax-data-table.php:1387, dist/admin/general/wp-security-list-table.php:545, dist/admin/general/wp-security-list-table.php:1399 +msgid "Show more details" +msgstr "" + +#: dist/classes/wp-security-utility-file.php:458, dist/templates/wp-admin/filesystem-security/partials/file-permissions-table.php:6, dist/templates/wp-admin/filesystem-security/partials/file-permissions-table.php:22 +msgid "File/Folder" +msgstr "" + +#: dist/classes/wp-security-utility-file.php:459, dist/templates/wp-admin/filesystem-security/partials/file-permissions-table.php:7, dist/templates/wp-admin/filesystem-security/partials/file-permissions-table.php:23 +msgid "Current permissions" +msgstr "" + +#: dist/classes/wp-security-utility-file.php:460, dist/templates/wp-admin/filesystem-security/partials/file-permissions-table.php:8, dist/templates/wp-admin/filesystem-security/partials/file-permissions-table.php:24 +msgid "Recommended permissions" +msgstr "" + +#: dist/classes/wp-security-utility-file.php:466 +msgid "No action required" +msgstr "" + +#: dist/classes/wp-security-utility-file.php:462, dist/templates/wp-admin/filesystem-security/partials/file-permissions-table.php:9, dist/templates/wp-admin/filesystem-security/partials/file-permissions-table.php:25 +msgid "Recommended action" +msgstr "" + +#: dist/classes/wp-security-utility-file.php:463 +msgid "Set recommended permissions" +msgstr "" + +#: dist/classes/wp-security-utility-htaccess.php:169 +msgid "The .htaccess file is not supported by your web server." +msgstr "" + +#: dist/classes/wp-security-utility-htaccess.php:178 +msgid "The .htaccess file either does not exist or is unreadable" +msgstr "" + +#: dist/classes/wp-security-utility-htaccess.php:185 +msgid "The .htaccess file contains invalid content, please manually verify the file contents" +msgstr "" + +#: dist/classes/wp-security-utility-htaccess.php:195 +msgid "A copy of the .htaccess file could not be created" +msgstr "" + +#: dist/classes/wp-security-utility-htaccess.php:202 +msgid "Unable to delete plugin's content from .htaccess file." +msgstr "" + +#: dist/classes/wp-security-utility-htaccess.php:218 +msgid "Write operation on .htaccess failed." +msgstr "" + +#: dist/classes/wp-security-utility-htaccess.php:241 +msgid "The .htaccess file has invalid content, please manually verify that the file is properly formatted" +msgstr "" + +#: dist/classes/wp-security-utility-htaccess.php:248 +msgid "An error has occurred while writing to the .htaccess file." +msgstr "" + +#. translators: %s: IP Address +#: dist/classes/wp-security-utility-ip-address.php:153 +msgid "%s is not a valid IP address format." +msgstr "" + +#: dist/classes/wp-security-utility-ip-address.php:159 +msgid "You cannot ban your own IP address:" +msgstr "" + +#: dist/classes/wp-security-utility-permissions.php:58, dist/includes/simba-tfa/simba-tfa.php:1398 +msgid "Multisite Super Admin" +msgstr "" + +#: dist/classes/wp-security-utility.php:263, dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:101 +msgid "The plugin has detected that you are using a Multi-Site WordPress installation." +msgstr "" + +#: dist/classes/wp-security-utility.php:264 +msgid "Some features on this page can only be configured by the \"superadmin\"." +msgstr "" + +#. translators: %s: File name +#: dist/classes/wp-security-utility.php:1252 +msgid "The %s file has already been deleted." +msgstr "" + +#: dist/classes/wp-security-utility.php:1242 +msgid "Failed to delete the %s file." +msgstr "" + +#: dist/classes/wp-security-utility.php:1242 +msgid "Check the file/directory permissions at: %s" +msgstr "" + +#: dist/classes/wp-security-utility.php:1234 +msgid "Successfully deleted the %s file." +msgstr "" + +#: dist/other-includes/wp-security-stop-users-enumeration.php:8 +msgid "Accessing author info via link is forbidden" +msgstr "" + +#: dist/other-includes/wp-security-unlock-request.php:14 +msgid "Powered by WordPress" +msgstr "" + +#: dist/other-includes/wp-security-unlock-request.php:31 +msgid "ERROR: Unable to process your request!" +msgstr "" + +#: dist/other-includes/wp-security-unlock-request.php:44 +msgid "Please enter a valid email address" +msgstr "" + +#: dist/other-includes/wp-security-unlock-request.php:75 +msgid "An email has been sent to you with the unlock instructions." +msgstr "" + +#: dist/other-includes/wp-security-unlock-request.php:70 +msgid "Error: No locked entry was found in the database with your IP address range." +msgstr "" + +#: dist/other-includes/wp-security-unlock-request.php:56 +msgid "User account not found!" +msgstr "" + +#: dist/other-includes/wp-security-unlock-request.php:92 +msgid "You are here because you have been locked out due to too many incorrect login attempts." +msgstr "" + +#: dist/other-includes/wp-security-unlock-request.php:93 +msgid "Please enter your email address and you will receive an email with instructions on how to unlock yourself." +msgstr "" + +#: dist/other-includes/wp-security-unlock-request.php:103 +msgid "Email Address" +msgstr "" + +#: dist/other-includes/wp-security-unlock-request.php:107 +msgid "Send unlock request" +msgstr "" + +#: dist/admin/general/wp-security-ajax-data-table.php:187, dist/admin/general/wp-security-list-table.php:176 +msgid "List view" +msgstr "" + +#: dist/admin/general/wp-security-ajax-data-table.php:188, dist/admin/general/wp-security-list-table.php:177 +msgid "Excerpt view" +msgstr "" + +#: dist/admin/general/wp-security-ajax-data-table.php:353, dist/admin/general/wp-security-list-table.php:342 +msgid "No items found." +msgstr "" + +#: dist/admin/general/wp-security-ajax-data-table.php:482, dist/admin/general/wp-security-list-table.php:473 +msgid "Select bulk action" +msgstr "" + +#: dist/admin/general/wp-security-ajax-data-table.php:484, dist/admin/general/wp-security-list-table.php:475 +msgid "Bulk actions" +msgstr "" + +#: dist/admin/general/wp-security-ajax-data-table.php:498, dist/admin/general/wp-security-list-table.php:488 +msgid "Are you sure you want to perform this bulk action?" +msgstr "" + +#: dist/admin/general/wp-security-ajax-data-table.php:501, dist/admin/general/wp-security-list-table.php:491 +msgid "Apply" +msgstr "" + +#: dist/admin/general/wp-security-ajax-data-table.php:611, dist/admin/general/wp-security-list-table.php:616 +msgid "Filter by date" +msgstr "" + +#: dist/admin/general/wp-security-ajax-data-table.php:613, dist/admin/general/wp-security-list-table.php:618 +msgid "All dates" +msgstr "" + +#. translators: 1: month name, 2: 4-digit year +#: dist/admin/general/wp-security-ajax-data-table.php:627, dist/admin/general/wp-security-list-table.php:633 +msgid "%1$s %2$d" +msgstr "" + +#. translators: %s: Approved comments +#. translators: %s: Approved comments. +#: dist/admin/general/wp-security-ajax-data-table.php:678, dist/admin/general/wp-security-list-table.php:686 +msgid "%s comment" +msgid_plural "%s comments" +msgstr[0] "" +msgstr[1] "" + +#. translators: %s: Approved comments +#. translators: %s: Approved comments. +#: dist/admin/general/wp-security-ajax-data-table.php:680, dist/admin/general/wp-security-list-table.php:688 +msgid "%s approved comment" +msgid_plural "%s approved comments" +msgstr[0] "" +msgstr[1] "" + +#. translators: %s: Pending comments +#. translators: %s: Pending comments. +#: dist/admin/general/wp-security-ajax-data-table.php:682, dist/admin/general/wp-security-list-table.php:690 +msgid "%s pending comment" +msgid_plural "%s pending comments" +msgstr[0] "" +msgstr[1] "" + +#: dist/admin/general/wp-security-ajax-data-table.php:706, dist/admin/general/wp-security-list-table.php:718 +msgid "No approved comments" +msgstr "" + +#: dist/admin/general/wp-security-ajax-data-table.php:706, dist/admin/general/wp-security-ajax-data-table.php:686, dist/admin/general/wp-security-ajax-data-table.php:729, dist/admin/general/wp-security-list-table.php:718, dist/admin/general/wp-security-list-table.php:696, dist/admin/general/wp-security-list-table.php:741 +msgid "No comments" +msgstr "" + +#: dist/admin/general/wp-security-ajax-data-table.php:729, dist/admin/general/wp-security-list-table.php:741 +msgid "No pending comments" +msgstr "" + +#. translators: %s: Total items +#. translators: %s: Item count. +#: dist/admin/general/wp-security-ajax-data-table.php:808, dist/admin/general/wp-security-ajax-data-table.php:1434, dist/admin/general/wp-security-list-table.php:819, dist/admin/general/wp-security-list-table.php:1425 +msgid "%s item" +msgid_plural "%s items" +msgstr[0] "" +msgstr[1] "" + +#: dist/admin/general/wp-security-ajax-data-table.php:848, dist/admin/general/wp-security-list-table.php:858 +msgid "First page" +msgstr "" + +#: dist/admin/general/wp-security-ajax-data-table.php:859, dist/admin/general/wp-security-list-table.php:869 +msgid "Previous page" +msgstr "" + +#: dist/admin/general/wp-security-ajax-data-table.php:870, dist/admin/general/wp-security-ajax-data-table.php:866, dist/admin/general/wp-security-list-table.php:880, dist/admin/general/wp-security-list-table.php:876 +msgid "Current page" +msgstr "" + +#. translators: 1: Current page, 2: Total pages +#: dist/admin/general/wp-security-ajax-data-table.php:877, dist/admin/general/wp-security-list-table.php:889 +msgctxt "paging" +msgid "%1$s of %2$s" +msgstr "" + +#: dist/admin/general/wp-security-ajax-data-table.php:885, dist/admin/general/wp-security-list-table.php:897 +msgid "Next page" +msgstr "" + +#: dist/admin/general/wp-security-ajax-data-table.php:896, dist/admin/general/wp-security-list-table.php:908 +msgid "Last page" +msgstr "" + +#: dist/admin/general/wp-security-ajax-data-table.php:1121, dist/admin/general/wp-security-list-table.php:1134 +msgid "Select all" +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:32 +msgid "You must use alphanumeric characters for your login page slug." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:30 +msgid "You cannot use the value \"wp-admin\" for your login page slug." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:26 +msgid "Please enter a value for your login page slug." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:110 +msgid "You have successfully saved cookie based brute force prevention feature settings." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:84 +msgid "Settings have not been saved - your secret word must consist only of alphanumeric characters i.e., letters and/or numbers only." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:82 +msgid "You entered an invalid value for the secret word." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:82, dist/classes/commands/wp-brute-force-commands.php:92, dist/classes/commands/wp-brute-force-commands.php:382, dist/classes/commands/wp-brute-force-commands.php:387 +msgid "It has been set to the default value." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:92 +msgid "You entered an invalid value for the redirect url." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:101 +msgid "You have successfully enabled the cookie based brute force prevention feature" +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:102 +msgid "From now on you will need to log into your WP Admin using the following URL:" +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:104 +msgid "It is important that you save this URL value somewhere in case you forget it, OR," +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:105 +msgid "simply remember to add a \"?%s=1\" to your current site URL address." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:166 +msgid "The cookie test failed." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:166, dist/classes/commands/wp-brute-force-commands.php:167 +msgid "Consequently, this feature cannot be used on this site." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:167 +msgid "The cookie test failed on this server." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:162, dist/classes/commands/wp-brute-force-commands.php:163 +msgid "The cookie test was successful, you can now enable this feature." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:382 +msgid "You entered a non numeric or negative value for the lockout time length field." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:387 +msgid "You entered an incorrect format for the \"Redirect URL\" field." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:429 +msgid "All 404 event logs were deleted from the database successfully." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:427 +msgid "404 Detection Feature - The operation to delete all the 404 event logs failed" +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:446 +msgid "Invalid action provided for 404 log item." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:455 +msgid "Invalid 404 event log ID provided." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:472, dist/classes/commands/wp-brute-force-commands.php:491, dist/classes/commands/wp-security-ip-commands.php:23, dist/classes/commands/wp-security-ip-commands.php:47, dist/classes/commands/wp-security-ip-commands.php:96, dist/classes/commands/wp-security-ip-commands.php:122 +msgid "Invalid IP provided." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:485 +msgid "The selected entry is not a valid IP address." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:483 +msgid "The selected IP address is now temporarily blocked." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:515, dist/classes/commands/wp-brute-force-commands.php:526 +msgid "Invalid log event ID provided." +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:534 +msgid "The selected IP entry could not be unlocked" +msgstr "" + +#: dist/classes/commands/wp-brute-force-commands.php:532 +msgid "Access from the selected IP address has been unblocked." +msgstr "" + +#: dist/classes/commands/wp-security-comment-commands.php:30 +msgid "You entered a non-numeric value for the \"move spam comments to trash after number of days\" field; it has been set to the default value." +msgstr "" + +#: dist/classes/commands/wp-security-comment-commands.php:44, dist/classes/commands/wp-security-comment-commands.php:87, dist/classes/commands/wp-security-firewall-commands.php:251 +msgid "The settings were successfully updated." +msgstr "" + +#: dist/classes/commands/wp-security-comment-commands.php:76 +msgid "You must enter an integer greater than zero for the \"minimum number of spam comments\" field; it has been set to the default value." +msgstr "" + +#: dist/classes/commands/wp-security-comment-commands.php:73 +msgid "You entered a non-numeric value for the \"minimum number of spam comments\" field; it has been set to the default value." +msgstr "" + +#: dist/classes/commands/wp-security-comment-commands.php:115 +msgid "You must enter an integer greater than zero for the minimum spam comments per IP field; it has been set to the default value." +msgstr "" + +#: dist/classes/commands/wp-security-comment-commands.php:112 +msgid "You entered a non-numeric value for the minimum spam comments per IP field; it has been set to the default value." +msgstr "" + +#: dist/classes/commands/wp-security-comment-commands.php:148 +msgid "Invalid IP address provided." +msgstr "" + +#: dist/classes/commands/wp-security-comment-commands.php:164 +msgid "The selected IP address could not be blocked due to one of the following reasons:" +msgstr "" + +#: dist/classes/commands/wp-security-comment-commands.php:165 +msgid "either it has already been blocked, or your user account lacks sufficient permissions to perform IP blocking." +msgstr "" + +#: dist/classes/commands/wp-security-comment-commands.php:161 +msgid "The selected IP address is now permanently blocked." +msgstr "" + +#: dist/classes/commands/wp-security-file-scan-commands.php:31 +msgid "You entered a non numeric value for the \"backup time interval\" field, it has been set to the default value." +msgstr "" + +#: dist/classes/commands/wp-security-file-scan-commands.php:57 +msgid "The following address was removed because it is not a valid email address:" +msgstr "" + +#: dist/classes/commands/wp-security-file-scan-commands.php:80 +msgid "You have configured your file change detection scan to occur at least once daily." +msgstr "" + +#: dist/classes/commands/wp-security-file-scan-commands.php:81 +msgid "For most websites we recommended that you choose a less frequent schedule such as once every few days, once a week or once a month." +msgstr "" + +#: dist/classes/commands/wp-security-file-scan-commands.php:82 +msgid "Choosing a less frequent schedule will also help reduce your server load." +msgstr "" + +#: dist/classes/commands/wp-security-file-scan-commands.php:88 +msgid "New scan completed: The plugin has detected that you have made changes to the \"File Types To Ignore\" or \"Files To Ignore\" fields." +msgstr "" + +#: dist/classes/commands/wp-security-file-scan-commands.php:88 +msgid "In order to ensure that future scan results are accurate, the old scan data has been refreshed." +msgstr "" + +#: dist/classes/commands/wp-security-file-scan-commands.php:95, dist/templates/wp-admin/scanner/file-change-detect.php:22 +msgid "Nothing is currently scheduled" +msgstr "" + +#: dist/classes/commands/wp-security-file-scan-commands.php:126, dist/classes/commands/wp-security-firewall-commands.php:386, dist/classes/commands/wp-security-log-commands.php:153, dist/classes/commands/wp-security-log-commands.php:199, dist/classes/commands/wp-security-tfa-commands.php:34, dist/classes/commands/wp-security-tfa-commands.php:63, dist/classes/commands/wp-security-tfa-commands.php:84, dist/classes/commands/wp-security-tfa-commands.php:108, dist/classes/commands/wp-security-tfa-commands.php:198 +msgid "Sorry, you do not have enough privilege to execute the requested action." +msgstr "" + +#: dist/classes/commands/wp-security-file-scan-commands.php:175 +msgid "No previous scan data was found; either run a manual scan or schedule regular file scans" +msgstr "" + +#: dist/classes/commands/wp-security-file-scan-commands.php:199 +msgid "There was an error during the file change detection scan." +msgstr "" + +#: dist/classes/commands/wp-security-file-scan-commands.php:199 +msgid "Please check the plugin debug logs." +msgstr "" + +#: dist/classes/commands/wp-security-file-scan-commands.php:212, dist/templates/wp-admin/scanner/file-change-detect.php:5 +msgid "The scan has detected that there was a change in your website's files." +msgstr "" + +#: dist/classes/commands/wp-security-file-scan-commands.php:212, dist/classes/commands/wp-security-file-scan-commands.php:207 +msgid "View the file scan results" +msgstr "" + +#: dist/classes/commands/wp-security-file-scan-commands.php:210 +msgid "The scan is complete - There were no file changes detected." +msgstr "" + +#: dist/classes/commands/wp-security-file-scan-commands.php:207 +msgid "This is your first file change detection scan." +msgstr "" + +#: dist/classes/commands/wp-security-file-scan-commands.php:207 +msgid "The details from this scan will be used for future scans." +msgstr "" + +#: dist/classes/commands/wp-security-file-scan-commands.php:208 +msgid "View last file scan results" +msgstr "" + +#: dist/classes/commands/wp-security-files-commands.php:44 +msgid "Unable to change permissions for %s : not in list of valid files" +msgstr "" + +#: dist/classes/commands/wp-security-files-commands.php:40 +msgid "Unable to change permissions for %s" +msgstr "" + +#: dist/classes/commands/wp-security-files-commands.php:38 +msgid "The permissions for %s were successfully changed to %s" +msgstr "" + +#: dist/classes/commands/wp-security-files-commands.php:86 +msgid "Disable PHP file editing failed: unable to modify or make a backup of the wp-config.php file." +msgstr "" + +#: dist/classes/commands/wp-security-files-commands.php:102 +msgid "Could not write to the .htaccess file." +msgstr "" + +#: dist/classes/commands/wp-security-files-commands.php:99 +msgid "The settings have been successfully updated" +msgstr "" + +#: dist/classes/commands/wp-security-files-commands.php:126 +msgid "The files have been deleted successfully." +msgstr "" + +#: dist/classes/commands/wp-security-files-commands.php:132 +msgid "Failed to delete the %s file(s)." +msgstr "" + +#: dist/classes/commands/wp-security-files-commands.php:132 +msgid "Please try to delete them manually." +msgstr "" + +#: dist/classes/commands/wp-security-files-commands.php:190 +msgid "No system logs were found." +msgstr "" + +#: dist/classes/commands/wp-security-firewall-commands.php:93 +msgid "The attempt to save the 'Block fake Googlebots' settings failed, because it was not possible to validate the Googlebot IP addresses:" +msgstr "" + +#: dist/classes/commands/wp-security-firewall-commands.php:210 +msgid "Could not write to the .htaccess file" +msgstr "" + +#: dist/classes/commands/wp-security-firewall-commands.php:271 +msgid "Could not write to the .htaccess file for the 5G firewall settings, please check the file permissions." +msgstr "" + +#: dist/classes/commands/wp-security-firewall-commands.php:430 +msgid "Firewall has been setup successfully." +msgstr "" + +#: dist/classes/commands/wp-security-firewall-commands.php:449 +msgid "Something went wrong please try again later." +msgstr "" + +#: dist/classes/commands/wp-security-firewall-commands.php:449 +msgid "Firewall has been downgraded successfully." +msgstr "" + +#. translators: %s URL entered by user. +#: dist/classes/commands/wp-security-firewall-commands.php:522 +msgid "%s is not a valid url." +msgstr "" + +#: dist/classes/commands/wp-security-firewall-commands.php:726 +msgid "We were unable to access the firewall's configuration file:" +msgstr "" + +#: dist/classes/commands/wp-security-firewall-commands.php:728 +msgid "As a result, the firewall will be unavailable." +msgstr "" + +#: dist/classes/commands/wp-security-firewall-commands.php:729 +msgid "Please check your PHP error log for further information." +msgstr "" + +#: dist/classes/commands/wp-security-firewall-commands.php:730 +msgid "If you're unable to locate your PHP log file, please contact your web hosting company to ask them where it can be found on their setup." +msgstr "" + +#: dist/classes/commands/wp-security-ip-commands.php:19, dist/classes/commands/wp-security-ip-commands.php:43, dist/classes/commands/wp-security-ip-commands.php:92, dist/classes/commands/wp-security-ip-commands.php:118 +msgid "No IP provided." +msgstr "" + +#: dist/classes/commands/wp-security-ip-commands.php:29 +msgid "The selected IP address was unlocked successfully." +msgstr "" + +#: dist/classes/commands/wp-security-ip-commands.php:27 +msgid "Failed to unlock the selected IP address." +msgstr "" + +#: dist/classes/commands/wp-security-ip-commands.php:53 +msgid "The selected IP address was unblacklisted successfully." +msgstr "" + +#: dist/classes/commands/wp-security-ip-commands.php:51 +msgid "Failed to unblacklist the selected IP address." +msgstr "" + +#: dist/classes/commands/wp-security-ip-commands.php:67 +msgid "Invalid blocked IP ID provided." +msgstr "" + +#: dist/classes/commands/wp-security-ip-commands.php:100 +msgid "No lockout reason provided." +msgstr "" + +#: dist/classes/commands/wp-security-ip-commands.php:105 +msgid "The selected IP address is now temporarily locked." +msgstr "" + +#: dist/classes/commands/wp-security-ip-commands.php:130 +msgid "The selected IP address has been added to the blacklist." +msgstr "" + +#: dist/classes/commands/wp-security-log-commands.php:19 +msgid "No audit log ID provided." +msgstr "" + +#: dist/classes/commands/wp-security-log-commands.php:38 +msgid "No locked IP record ID provided." +msgstr "" + +#: dist/classes/commands/wp-security-log-commands.php:61 +msgid "The debug logs have been cleared." +msgstr "" + +#: dist/classes/commands/wp-security-settings-commands.php:30 +msgid "Some of the security features could not be disabled." +msgstr "" + +#: dist/classes/commands/wp-security-settings-commands.php:141 +msgid "htaccess backup failed." +msgstr "" + +#: dist/classes/commands/wp-security-settings-commands.php:135 +msgid "Your .htaccess file was successfully backed up." +msgstr "" + +#: dist/classes/commands/wp-security-settings-commands.php:188 +msgid "The restoration .htaccess file has failed, please check the contents of the file you are trying to restore from." +msgstr "" + +#: dist/classes/commands/wp-security-settings-commands.php:183 +msgid "Your .htaccess file has successfully been restored." +msgstr "" + +#: dist/classes/commands/wp-security-settings-commands.php:180 +msgid "The restoration of the .htaccess file failed; please attempt to restore the .htaccess file manually using FTP." +msgstr "" + +#: dist/classes/commands/wp-security-settings-commands.php:170 +msgid "Please choose a valid .htaccess to restore from." +msgstr "" + +#: dist/classes/commands/wp-security-settings-commands.php:234 +msgid "The restoration of the wp-config.php file failed, please check the contents of the file you are trying to restore from." +msgstr "" + +#: dist/classes/commands/wp-security-settings-commands.php:230 +msgid "Your wp-config.php file has successfully been restored." +msgstr "" + +#: dist/classes/commands/wp-security-settings-commands.php:227 +msgid "The restoration of the wp-config.php file failed, please attempt to restore this file manually using FTP." +msgstr "" + +#: dist/classes/commands/wp-security-settings-commands.php:215 +msgid "Please choose a wp-config.php file to restore from." +msgstr "" + +#: dist/classes/commands/wp-security-settings-commands.php:306 +msgid "Your AIOS settings were successfully imported." +msgstr "" + +#: dist/classes/commands/wp-security-settings-commands.php:387 +msgid "The contents of your settings file are invalid, please check the contents of the file you are trying to import settings from." +msgstr "" + +#: dist/classes/commands/wp-security-settings-commands.php:355 +msgid "Import AIOS settings operation failed." +msgstr "" + +#: dist/classes/commands/wp-security-settings-commands.php:311 +msgid "Please choose a file to import your settings from." +msgstr "" + +#: dist/classes/commands/wp-security-settings-commands.php:532 +msgid "Default - if correct, then this is the best option" +msgstr "" + +#: dist/classes/commands/wp-security-settings-commands.php:533 +msgid "Only use if you're using Cloudflare." +msgstr "" + +#: dist/classes/commands/wp-security-settings-commands.php:546 +msgid "no value (i.e. empty) on your server" +msgstr "" + +#: dist/classes/commands/wp-security-settings-commands.php:543 +msgid "(current value: %s)" +msgstr "" + +#: dist/classes/commands/wp-security-tools-commands.php:39, dist/classes/commands/wp-security-tools-commands.php:33 +msgid "Nothing to show." +msgstr "" + +#: dist/classes/commands/wp-security-tools-commands.php:32 +msgid "Please enter a valid IP address or domain name to look up." +msgstr "" + +#: dist/classes/commands/wp-security-tools-commands.php:99 +msgid "The plugin was unable to write to the .htaccess file, please edit file manually." +msgstr "" + +#: dist/classes/commands/wp-security-tools-commands.php:71 +msgid "You must enter some .htaccess directives in the text box below" +msgstr "" + +#: dist/classes/commands/wp-security-tools-commands.php:183, dist/classes/commands/wp-security-tools-commands.php:226 +msgid "Querying %s: %s" +msgstr "" + +#: dist/classes/commands/wp-security-tools-commands.php:191, dist/classes/commands/wp-security-tools-commands.php:200, dist/classes/commands/wp-security-tools-commands.php:242 +msgid "Redirected to %s" +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:108 +msgid "Please enter a value for your username." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:104 +msgid "You entered an invalid username, please enter another value." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:73 +msgid "The database update operation of the user account failed." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:58 +msgid "Username: %s already exists, please enter another value." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:114 +msgid "The username has been successfully changed." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:211 +msgid "The following options had invalid values and have been set to the defaults: %s" +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:318 +msgid "You entered a non numeric or negative value for the logout time period field, it has been set to the default value." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:444 +msgid "Invalid action provided for logged in user." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:452 +msgid "No user ID was provided" +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:465 +msgid "You cannot log out a user from a different subsite." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:463 +msgid "Super admins cannot be logged out." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:461 +msgid "You cannot log yourself out" +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:459 +msgid "Invalid user ID provided." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:481 +msgid "Failed to log out the selected user." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:479 +msgid "The selected user has been logged out successfully." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:535 +msgid "Invalid action provided for registered user." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:544, dist/classes/commands/wp-security-user-security-commands.php:567 +msgid "No valid user ID was provided" +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:560 +msgid "The selected account could not be approved." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:556 +msgid "The selected account was approved successfully." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:579 +msgid "The selected account could not be deleted." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:575 +msgid "The selected account was deleted successfully." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:586 +msgid "No valid IP address was provided" +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:605 +msgid "The selected IP could not be added to the permanent block list." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:600 +msgid "The selected IP was successfully added to the permanent block list." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:682 +msgid "You don't have enough permissions to whitelist your IP address." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:700 +msgid "Your IP address could not be detected." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:708 +msgid "There was an error whitelisting your IP address, please try again." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:712 +msgid "Your IP address has been whitelisted successfully." +msgstr "" + +#: dist/classes/commands/wp-security-user-security-commands.php:693 +msgid "Your IP address is already whitelisted." +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:53 +msgid "Remove WP generator meta tag" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:62, dist/templates/wp-admin/user-security/partials/wp-username.php:23 +msgid "Change admin username" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:71 +msgid "Change display name" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:106, dist/templates/wp-admin/user-security/additional.php:19 +msgid "Disable application password" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:114 +msgid "Login Lockout IP whitelisting" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:123 +msgid "Registration approval" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:131 +msgid "Registration CAPTCHA" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:139 +msgid "Enable registration honeypot" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:147 +msgid "HTTP authentication for admin and frontend" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:176 +msgid "File editing" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:184 +msgid "WordPress files access" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:193 +msgid "IP and user agent blacklisting" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:202 +msgid "Enable basic firewall" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:211 +msgid "Enable pingback vulnerability protection" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:219, dist/templates/wp-admin/firewall/partials/block-debug-log.php:3 +msgid "Block access to debug log file" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:228, dist/templates/wp-admin/firewall/partials/listing-directory-contents.php:14 +msgid "Disable index views" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:237, dist/templates/wp-admin/firewall/partials/disable-trace.php:14 +msgid "Disable trace and track" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:246 +msgid "Forbid proxy comments" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:254 +msgid "Deny bad queries" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:262, dist/templates/wp-admin/firewall/partials/advanced-character-filter.php:3 +msgid "Advanced character string filter" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:270 +msgid "6G firewall" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:278, dist/templates/wp-admin/firewall/partials/fake-googlebots.php:29 +msgid "Block fake Googlebots" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:286, dist/templates/wp-admin/filesystem-security/partials/prevent-hotlinks.php:20 +msgid "Prevent image hotlinking" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:294 +msgid "Enable IP blocking for 404 detection" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:302 +msgid "Disable RSS and ATOM feeds" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:310, dist/templates/wp-admin/firewall/partials/upgrade-unsafe-http-calls.php:3 +msgid "Upgrade unsafe HTTP calls" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:319 +msgid "Enable rename login page" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:327, dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:59 +msgid "Enable brute force attack prevention" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:335 +msgid "Login CAPTCHA" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:343 +msgid "Lost password CAPTCHA" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:351 +msgid "Custom login CAPTCHA" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:359 +msgid "Password-protected CAPTCHA" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:367 +msgid "Login IP whitelisting" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:375 +msgid "Enable login honeypot" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:384 +msgid "Comment CAPTCHA" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:392 +msgid "Detect spambots" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:400 +msgid "Auto block spam ips" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:418 +msgid "Enable Copy Protection" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:426, dist/templates/wp-admin/filesystem-security/frames.php:21 +msgid "Enable iFrame protection" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:434 +msgid "Disable users enumeration" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:442, dist/templates/wp-admin/firewall/partials/wp-rest-api.php:35 +msgid "Disallow unauthorized REST requests" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:450, dist/templates/wp-admin/user-security/salt.php:30 +msgid "Enable salt postfix" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:459 +msgid "BuddyPress registration CAPTCHA" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:468 +msgid "bbPress new topic CAPTCHA" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:477 +msgid "Woo login CAPTCHA" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:486 +msgid "Woo lost password CAPTCHA" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:495 +msgid "Woo register CAPTCHA" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:504 +msgid "Woo Checkout CAPTCHA" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:514 +msgid "Ban POST requests that have blank user-agent and referer headers" +msgstr "" + +#. translators: %s: Plugin name +#: dist/classes/grade-system/wp-security-feature-item-manager.php:523 +msgid "%s CAPTCHA" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:532 +msgid "Enforce use of strong passwords by users" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:603 +msgid "Feature difficulty" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item-manager.php:605 +msgid "Security points" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item.php:64 +msgid "Advanced" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item.php:62 +msgid "Intermediate" +msgstr "" + +#: dist/classes/grade-system/wp-security-feature-item.php:60 +msgid "Basic" +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:183, dist/templates/admin/incompatible-plugin.php:6, dist/includes/simba-tfa/templates/user-settings.php:20 +msgid "Two Factor Authentication" +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:185 +msgid "Go here for your two factor authentication settings..." +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:419 +msgid "2FA" +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:441, dist/includes/simba-tfa/simba-tfa.php:1307 +msgid "Enabled" +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1064 +msgid "The \"encrypt secrets\" feature is currently enabled, but no encryption key has been found (set via the SIMBA_TFA_DB_ENCRYPTION_KEY constant)." +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1064 +msgid "This indicates that either setup failed, or your WordPress installation has been corrupted." +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1064 +msgid "Go here for the FAQs, which explain how a website owner can de-activate the plugin without needing to login." +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1065, dist/includes/simba-tfa/includes/login-form-integrations.php:128 +msgid "The one-time password (TFA code) you entered was incorrect." +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1212 +msgid "Incorrect TFA code attempts" +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1213 +msgid "There has been an incorrect TFA code entered for logging in to your account %s." +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1214 +msgid "Attempts" +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1216 +msgid "from" +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1218 +msgid "If the above attempts were not by you then someone else has your password." +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1219 +msgid "TFA codes are checked only after the password has been successfully checked." +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1220 +msgid "Please change your password urgently." +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1304 +msgid "N.B. This site is configured to forbid you to log in if you disable two-factor authentication after your account is %d days old" +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1307 +msgid "Enable two-factor authentication" +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1312 +msgid "(you must enter the current code: %s)" +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1310 +msgid "(Current code: %s)" +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1317 +msgid "Disable two-factor authentication" +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1423 +msgid "Do not require 2FA over XMLRPC (best option if you must use XMLRPC and your client does not support 2FA)" +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1424 +msgid "Do require 2FA over XMLRPC (best option if you do not use XMLRPC or are unsure)" +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1470 +msgid "The indicated user could not be found." +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1507 +msgid "The site owner has forbidden you to login without two-factor authentication. Please contact the site owner to re-gain access." +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1521 +msgid "You are attempting to log in to an account that has two-factor authentication enabled; this requires you to also have two-factor authentication enabled on the account whose credentials you are using." +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1595 +msgid "Click to enter One Time Password" +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1596 +msgid "You have to enter a username first." +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1597 +msgid "One Time Password (i.e. 2FA)" +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1598 +msgid "(check your OTP app to get this password)" +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1599 +msgid "Trust this device (allow login without 2FA for %d day)" +msgid_plural "Trust this device (allow login without TFA for %d days)" +msgstr[0] "" +msgstr[1] "" + +#: dist/includes/simba-tfa/simba-tfa.php:1600 +msgid "(Trusted device - no OTP code required)" +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1604 +msgid "An error has occurred. Site owners can check the JavaScript console for more details." +msgstr "" + +#: dist/includes/simba-tfa/simba-tfa.php:1664 +msgid "Template path not found:" +msgstr "" + +#: dist/templates/admin/incompatible-plugin.php:10, dist/includes/simba-tfa/templates/admin-settings.php:24 +msgid "Two Factor Authentication currently disabled" +msgstr "" + +#. translators: %s: Incompatible plugin name. +#: dist/templates/admin/incompatible-plugin.php:13, dist/templates/admin/incompatible-plugin.php:18 +msgid "Two factor authentication in All In One WP Security is currently disabled because the incompatible plugin %s is active." +msgstr "" + +#: dist/templates/info/ip-address-ip-range-info.php:2, dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:63, dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:100, dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:123, dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:145, dist/templates/wp-admin/firewall/5g.php:17, dist/templates/wp-admin/scanner/file-change-detect.php:100, dist/templates/wp-admin/scanner/file-change-detect.php:119, dist/templates/wp-admin/settings/advanced-settings.php:66, dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:46, dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:81, dist/templates/wp-admin/spam-prevention/comment-spam.php:25, dist/templates/wp-admin/spam-prevention/comment-spam.php:42, dist/templates/wp-admin/spam-prevention/comment-spam.php:86, dist/templates/wp-admin/user-security/login-lockout.php:117, dist/templates/wp-admin/user-security/salt.php:36, dist/templates/wp-admin/brute-force/partials/other-plugins.php:58, dist/templates/wp-admin/firewall/partials/advanced-character-filter.php:17, dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:17, dist/templates/wp-admin/firewall/partials/bad-query-strings.php:17, dist/templates/wp-admin/firewall/partials/basic-firewall-settings.php:17, dist/templates/wp-admin/firewall/partials/blank-ref-and-useragent.php:17, dist/templates/wp-admin/firewall/partials/block-debug-log.php:18, dist/templates/wp-admin/firewall/partials/disable-rss-atom.php:17, dist/templates/wp-admin/firewall/partials/disable-trace.php:18, dist/templates/wp-admin/firewall/partials/fake-googlebots.php:33, dist/templates/wp-admin/firewall/partials/firewall-setup.php:18, dist/templates/wp-admin/firewall/partials/listing-directory-contents.php:18, dist/templates/wp-admin/firewall/partials/ng.php:29, dist/templates/wp-admin/firewall/partials/proxy-comment.php:17, dist/templates/wp-admin/firewall/partials/xmlrpc-pingback-protection.php:18, dist/templates/wp-admin/firewall/partials/xmlrpc-pingback-protection.php:39 +msgid "More info" +msgstr "" + +#: dist/templates/info/ip-address-ip-range-info.php:5 +msgid "Each IP address must be on a new line." +msgstr "" + +#: dist/templates/info/ip-address-ip-range-info.php:6 +msgid "You can add comments to the IP entries by placing a '#' at the start of a line." +msgstr "" + +#: dist/templates/info/ip-address-ip-range-info.php:7 +msgid "This can be useful for annotating each IP address with notes (e.g., identifying the individual or system associated with the IP)." +msgstr "" + +#: dist/templates/info/ip-address-ip-range-info.php:8 +msgid "To specify an IPv4 range use a wildcard \"*\" character, acceptable ways to use wildcards is shown in the examples below:" +msgstr "" + +#: dist/templates/info/ip-address-ip-range-info.php:9 +msgid "Example 1: 195.47.89.*" +msgstr "" + +#: dist/templates/info/ip-address-ip-range-info.php:10 +msgid "Example 2: 195.47.*.*" +msgstr "" + +#: dist/templates/info/ip-address-ip-range-info.php:11 +msgid "Example 3: 195.*.*.*" +msgstr "" + +#: dist/templates/info/ip-address-ip-range-info.php:12 +msgid "To specify an IPv6 range use CIDR format as shown in the examples below:" +msgstr "" + +#: dist/templates/info/ip-address-ip-range-info.php:13 +msgid "Example 4: 2401:4900:54c3:af15:2:2:5dc0:0/112" +msgstr "" + +#: dist/templates/info/ip-address-ip-range-info.php:14 +msgid "Example 5: 2001:db8:1263::/48" +msgstr "" + +#: dist/templates/notices/cookie-based-brute-force-prevention-disabled.php:4 +msgid "Cookie based brute force login prevention currently disabled" +msgstr "" + +#: dist/templates/notices/cookie-based-brute-force-prevention-disabled.php:7 +msgid "Cookie based brute force login prevention is currently disabled via the AIOS_DISABLE_COOKIE_BRUTE_FORCE_PREVENTION constant (which is most likely to be defined in your %s)" +msgstr "" + +#: dist/templates/notices/custom-notice.php:13, dist/templates/notices/custom-notice.php:11, dist/templates/notices/firewall-setup-notice.php:29, dist/templates/notices/horizontal-notice.php:54, dist/templates/notices/horizontal-notice.php:52, dist/templates/notices/htaccess-to-php-feature-notice.php:12, dist/templates/notices/htaccess-to-php-feature-notice.php:10 +msgid "Dismiss" +msgstr "" + +#: dist/templates/notices/custom-notice.php:29, dist/templates/wp-admin/dashboard/may-also-like.php:83, dist/templates/wp-admin/dashboard/may-also-like.php:94, dist/templates/wp-admin/dashboard/may-also-like.php:105, dist/templates/wp-admin/dashboard/may-also-like.php:116, dist/templates/wp-admin/dashboard/may-also-like.php:127, dist/templates/wp-admin/dashboard/may-also-like.php:194, dist/templates/wp-admin/dashboard/may-also-like.php:205, dist/templates/wp-admin/dashboard/may-also-like.php:216, dist/templates/wp-admin/dashboard/may-also-like.php:227, dist/templates/wp-admin/dashboard/may-also-like.php:238, dist/templates/wp-admin/dashboard/may-also-like.php:259, dist/templates/wp-admin/dashboard/may-also-like.php:271, dist/templates/wp-admin/dashboard/may-also-like.php:283 +msgid "No" +msgstr "" + +#: dist/templates/notices/disable-login-whitelist.php:4 +msgid "Login whitelisting currently disabled" +msgstr "" + +#: dist/templates/notices/disable-login-whitelist.php:6 +msgid "Login whitelisting is currently disabled via the AIOS_DISABLE_LOGIN_WHITELIST constant (which is mostly likely to be defined in your wp-config.php)" +msgstr "" + +#: dist/templates/notices/firewall-installed-notice.php:5 +msgid "Your firewall has been installed with the highest level of protection." +msgstr "" + +#: dist/templates/notices/firewall-installed-notice.php:6 +msgid "You may have to wait 5 minutes for the changes to take effect." +msgstr "" + +#: dist/templates/notices/firewall-setup-notice.php:12 +msgid "Our PHP-based firewall has been created to give you even greater protection." +msgstr "" + +#: dist/templates/notices/firewall-setup-notice.php:13 +msgid "To ensure the PHP-based firewall runs before any potentially vulnerable code in your WordPress site can be reached, it will need to be set up." +msgstr "" + +#: dist/templates/notices/firewall-setup-notice.php:17 +msgid "If you already have our .htaccess-based firewall enabled, you will still need to set up the PHP-based firewall to benefit from its protection." +msgstr "" + +#: dist/templates/notices/firewall-setup-notice.php:20 +msgid "To set up the PHP-based firewall, press the 'Set up now' button below:" +msgstr "" + +#: dist/templates/notices/firewall-setup-notice.php:23 +msgid "Set up now" +msgstr "" + +#: dist/templates/notices/horizontal-notice.php:42, dist/templates/notices/horizontal-notice.php:9 +msgid "notice image" +msgstr "" + +#: dist/templates/notices/horizontal-notice.php:90 +msgid "Read more" +msgstr "" + +#: dist/templates/notices/horizontal-notice.php:88 +msgid "Learn more" +msgstr "" + +#: dist/templates/notices/horizontal-notice.php:86 +msgid "Go there" +msgstr "" + +#: dist/templates/notices/horizontal-notice.php:84 +msgid "Sign up" +msgstr "" + +#: dist/templates/notices/horizontal-notice.php:82 +msgid "Get Premium." +msgstr "" + +#: dist/templates/notices/horizontal-notice.php:80 +msgid "Get WP-Optimize" +msgstr "" + +#: dist/templates/notices/horizontal-notice.php:78 +msgid "Get UpdraftPlus" +msgstr "" + +#: dist/templates/notices/horizontal-notice.php:76 +msgid "Get UpdraftCentral" +msgstr "" + +#: dist/templates/notices/horizontal-notice.php:19 +msgid "Review" +msgstr "" + +#: dist/templates/notices/horizontal-notice.php:23 +msgid "Maybe later" +msgstr "" + +#: dist/templates/notices/horizontal-notice.php:27 +msgid "Never" +msgstr "" + +#. translators: %s: Number of months +#: dist/templates/notices/thanks-for-using-main-dash.php:5 +msgid "Dismiss (for %s months)" +msgstr "" + +#: dist/templates/notices/thanks-for-using-main-dash.php:11 +msgid "Thank you for using All-In-One Security!" +msgstr "" + +#: dist/templates/notices/thanks-for-using-main-dash.php:9 +msgid "Thank you for using All-In-One Security Premium!" +msgstr "" + +#: dist/templates/notices/thanks-for-using-main-dash.php:22 +msgid "Protect your investment with the ultimate in WordPress website security." +msgstr "" + +#. translators: %s 'AIOS Premium' URL +#: dist/templates/notices/thanks-for-using-main-dash.php:27 +msgid "Get malware scanning, country blocking, premium support and more advanced security features with %s." +msgstr "" + +#: dist/templates/notices/thanks-for-using-main-dash.php:28 +msgid "AIOS Premium" +msgstr "" + +#: dist/templates/notices/thanks-for-using-main-dash.php:33 +msgid "Explore more top-rated plugins" +msgstr "" + +#: dist/templates/notices/thanks-for-using-main-dash.php:37 +msgid "WP-Optimize Premium:" +msgstr "" + +#: dist/templates/notices/thanks-for-using-main-dash.php:40 +msgid "Unlock new ways to speed up your WordPress website." +msgstr "" + +#: dist/templates/notices/thanks-for-using-main-dash.php:42 +msgid "Optimize from the WP-CLI, cache multilingual and multi currency websites and more." +msgstr "" + +#: dist/templates/notices/thanks-for-using-main-dash.php:47 +msgid "UpdraftPlus Premium:" +msgstr "" + +#: dist/templates/notices/thanks-for-using-main-dash.php:50 +msgid "Schedule automatic backups, run backups before updates, and restore with ease." +msgstr "" + +#: dist/templates/notices/thanks-for-using-main-dash.php:55 +msgid "Burst Statistics:" +msgstr "" + +#: dist/templates/notices/thanks-for-using-main-dash.php:58 +msgid "Privacy-friendly analytics that lets you track traffic without collecting personal data." +msgstr "" + +#: dist/templates/notices/thanks-for-using-main-dash.php:63 +msgid "Internal Link Juicer:" +msgstr "" + +#: dist/templates/notices/thanks-for-using-main-dash.php:66 +msgid "Automatically build internal links to save time and boost SEO." +msgstr "" + +#: dist/templates/notices/thanks-for-using-main-dash.php:68 +msgid "You don’t have to be an SEO expert to use this plugin!" +msgstr "" + +#: dist/templates/notices/thanks-for-using-main-dash.php:73 +msgid "WP Overnight:" +msgstr "" + +#: dist/templates/notices/thanks-for-using-main-dash.php:76 +msgid "Premium WooCommerce add-ons built to optimize your store, improve UX, and increase revenue." +msgstr "" + +#: dist/templates/notices/thanks-for-using-main-dash.php:81 +msgid "Browse more" +msgstr "" + +#: dist/templates/notices/thanks-for-using-main-dash.php:81 +msgid "Premium WooCommerce plugins" +msgstr "" + +#: dist/templates/partials/non-apache-feature-notice.php:9, dist/templates/wp-admin/firewall/partials/xmlrpc-warning-notice.php:6 +msgid "Attention:" +msgstr "" + +#: dist/templates/partials/non-apache-feature-notice.php:9 +msgid "This feature works only on the Apache server." +msgstr "" + +#. translators: %s: Server software +#: dist/templates/partials/non-apache-feature-notice.php:11 +msgid "You are using the non-apache server %s, so this feature won't work on your site." +msgstr "" + +#. translators: %s: Multi user plugin directory +#: dist/includes/simba-tfa/includes/tfa-encryption-muplugin.php:73 +msgid "Encrypt secrets feature not enabled: no directory has been set." +msgstr "" + +#: dist/includes/simba-tfa/includes/tfa-encryption-muplugin.php:73 +msgid "Please check your %s constant is valid" +msgstr "" + +#. translators: %s: Multi user plugin directory +#: dist/includes/simba-tfa/includes/tfa-encryption-muplugin.php:82 +msgid "The encrypt secrets feature was not enabled: your mu-plugins directory could not be automatically created; therefore, please use your web hosting file manager or FTP to manually create this folder and then try again: %s" +msgstr "" + +#. translators: %s: File path. +#: dist/includes/simba-tfa/includes/tfa-encryption-muplugin.php:91 +msgid "The encrypt secrets feature was not enabled: attempting to write the mu-plugin file contents failed; therefore, please create the file manually." +msgstr "" + +#: dist/includes/simba-tfa/includes/tfa-encryption-muplugin.php:91 +msgid "Add the following code to the file %s" +msgstr "" + +#: dist/includes/simba-tfa/includes/tfa-encryption-muplugin.php:91 +msgid "Once you have added the above code then press the button to turn on encryption again" +msgstr "" + +#: dist/includes/simba-tfa/includes/tfa_frontend.php:75 +msgid "The TFA code you entered was incorrect." +msgstr "" + +#: dist/includes/simba-tfa/includes/tfa_frontend.php:67 +msgid "To enable TFA, you must enter the current code." +msgstr "" + +#: dist/includes/simba-tfa/includes/tfa_frontend.php:99 +msgid "a time based" +msgstr "" + +#: dist/includes/simba-tfa/includes/tfa_frontend.php:99 +msgid "an event based" +msgstr "" + +#: dist/includes/simba-tfa/includes/tfa_frontend.php:129 +msgid "No emergency codes left. Sorry." +msgstr "" + +#: dist/includes/simba-tfa/includes/tfa_frontend.php:138, dist/includes/simba-tfa/includes/tfa_frontend.php:152 +msgid "Save Settings" +msgstr "" + +#: dist/includes/simba-tfa/includes/tfa_frontend.php:182 +msgid "You have unsaved settings." +msgstr "" + +#: dist/includes/simba-tfa/includes/tfa_frontend.php:187, dist/includes/simba-tfa/providers/totp/loader.php:199 +msgid "Response:" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:8 +msgid "Two Factor Authentication - Admin Settings" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:26 +msgid "Two factor authentication is currently disabled via the TWO_FACTOR_DISABLE constant (which is mostly likely to be defined in your wp-config.php)" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:38 +msgid "N.B. These two-factor settings apply to your entire WordPress network. (i.e. They are not localised to one particular site)." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:50 +msgid "Make two factor authentication available" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:51 +msgid "Choose which user roles will have two factor authentication available." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:61 +msgid "Make two factor authentication compulsory" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:65 +msgid "Requiring users to use two-factor authentication is a feature of the Premium version of this plugin." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:71, dist/includes/simba-tfa/templates/admin-settings.php:193 +msgid "Trusted devices" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:75 +msgid "Choose which user roles are permitted to mark devices they login on as trusted. This feature requires browser cookies and an https (i.e. SSL) connection to the website to work." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:78 +msgid "Allowing users to mark a device as trusted so that a two-factor code is only needed once in a specified number of days (instead of every login) is a feature of the Premium version of this plugin." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:92 +msgid "XMLRPC requests" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:96 +msgid "XMLRPC is a feature within WordPress allowing other computers to talk to your WordPress install. For example, it could be used by an app on your tablet that allows you to blog directly from the app (instead of needing the WordPress dashboard)." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:99 +msgid "Unfortunately, XMLRPC also provides a way for attackers to perform actions on your WordPress site, using only a password (i.e. without a two-factor password). More unfortunately, authors of legitimate programmes using XMLRPC have not yet added two-factor support to their code." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:102 +msgid "i.e. XMLRPC requests coming in to WordPress (whether from a legitimate app, or from an attacker) can only be verified using the password - not with a two-factor code. As a result, there not be an ideal option to pick below. You may have to choose between the convenience of using your apps, or the security of two factor authentication." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:117 +msgid "Default algorithm for codes generated by user devices" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:118 +msgid "Your users can change this in their own settings if they want." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:138, dist/includes/simba-tfa/templates/admin-settings.php:130 +msgid "Encrypt keys in database" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:140 +msgid "Once turned on, this feature cannot be turned off (but there is no technical reason why this should discourage you from using it)." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:143 +msgid "This feature will encrypt all two factor authentication secret keys stored in the database, using an encryption key that is stored on your disk." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:144 +msgid "This means that in the event your database is compromised there's an additional layer of security (the attacker would need to compromise your on-disk data as well) protecting your two factor authentication secret keys." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:146 +msgid "Enable encryption of database keys" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:132 +msgid "Encryption of keys in the database has been enabled." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:132 +msgid "This feature cannot be turned off." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:158 +msgid "WooCommerce integration" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:160 +msgid "The Premium version of this plugin allows you to add a configuration tab for users in the WooCommerce \"My account\" area, and anti-bot protection on the WooCommerce login form." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:169 +msgid "Users' settings" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:175 +msgid "The Premium version of this plugin allows you to see and reset the TFA settings of other users." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:177 +msgid "Another way to do that is by using a user-switching plugin like this one." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:185 +msgid "Premium version" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:187 +msgid "If you want to say 'thank you' or help this plugin's development, or get extra features, then please take a look at the premium version of this plugin." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:187 +msgid "It comes with these extra features:" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:191, dist/includes/simba-tfa/providers/totp/loader.php:446 +msgid "Emergency codes" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:191 +msgid "provide your users with one-time codes to use in case they lose their device." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:192 +msgid "Make TFA compulsory" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:192 +msgid "require your users to set up TFA to be able to log in, after an optional grace period." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:193 +msgid "allow privileged (or all) users to mark a device as trusted and thereby only needing to supply a TFA code upon login every so-many days (e.g. every 30 days) instead of on each login." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:194 +msgid "Manage all users centrally" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:194 +msgid "enable, disable or see TFA codes for all your users from one central location." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:195 +msgid "More shortcodes" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:195 +msgid "flexible shortcodes allowing you to design your front-end settings page for your users exactly as you wish." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:196 +msgid "More WooCommerce features" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:196 +msgid "automatically add TFA settings in the WooCommerce account settings, and WooCommerce login form bot protection." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:197 +msgid "Elementor support" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:197 +msgid "adds support for Elementor login forms." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:198 +msgid "Any-form support" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:198 +msgid "adds support for any login form from any plugin via appending your TFA code onto the end of your password." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:199 +msgid "Personal support" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:199 +msgid "access to our personal support desk for 12 months." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:206 +msgid "Translations" +msgstr "" + +#. translators: %s: Plugin translation URL. +#: dist/includes/simba-tfa/templates/admin-settings.php:209 +msgid "If you want to translate this plugin, please go to %s" +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:209 +msgid "the wordpress.org translation website." +msgstr "" + +#: dist/includes/simba-tfa/templates/admin-settings.php:209 +msgid "Don't send us the translation file directly - plugin authors do not have access to the wordpress.org translation system (local language teams do)." +msgstr "" + +#: dist/includes/simba-tfa/templates/settings-intro-notices.php:5 +msgid "These are your personal settings." +msgstr "" + +#: dist/includes/simba-tfa/templates/settings-intro-notices.php:5 +msgid "Nothing you change here will have any effect on other users." +msgstr "" + +#: dist/includes/simba-tfa/templates/settings-intro-notices.php:17, dist/includes/simba-tfa/templates/settings-intro-notices.php:13 +msgid "The site-wide administration options are here." +msgstr "" + +#: dist/includes/simba-tfa/templates/settings-intro-notices.php:25 +msgid "If you activate two-factor authentication, then verify that your two-factor application and this page show the same One-Time Password (within a minute of each other) before you log out." +msgstr "" + +#: dist/includes/simba-tfa/templates/settings-intro-notices.php:28 +msgid "You should also bookmark the FAQs, which explain how to de-activate the plugin even if you cannot log in." +msgstr "" + +#: dist/includes/simba-tfa/templates/shortcode-tfa-user-settings.php:8 +msgid "Not logged in." +msgstr "" + +#: dist/includes/simba-tfa/templates/shortcode-tfa-user-settings.php:8 +msgid "Two factor authentication is not available for your user." +msgstr "" + +#: dist/includes/simba-tfa/templates/trusted-devices-inner-box.php:5 +msgid "Trusted devices are devices which have previously logged in with a second factor, belonging to users who have been permitted to mark devices as trusted, and for which the user checked the checkbox on the login form to trust the device." +msgstr "" + +#: dist/includes/simba-tfa/templates/trusted-devices-inner-box.php:14 +msgid "(none)" +msgstr "" + +#: dist/includes/simba-tfa/templates/trusted-devices-inner-box.php:21 +msgid "(unspecified)" +msgstr "" + +#: dist/includes/simba-tfa/templates/trusted-devices-inner-box.php:23 +msgid "User agent %s logged in from IP address %s and is trusted until %s" +msgstr "" + +#: dist/includes/simba-tfa/templates/trusted-devices-inner-box.php:23 +msgid "Remove trust" +msgstr "" + +#: dist/includes/simba-tfa/templates/user-settings.php:25 +msgid "Settings saved." +msgstr "" + +#: dist/includes/simba-tfa/templates/user-settings.php:36 +msgid "Activate two factor authentication" +msgstr "" + +#. translators: 1. UTC date. 2. Now date. +#: dist/includes/simba-tfa/templates/user-settings.php:42 +msgid "N.B. Getting your TFA app/device to generate the correct code depends upon a) you first setting it up by entering or scanning the code below into it, and b) upon your web-server and your TFA app/device agreeing upon the UTC time (within a minute or so). The current UTC time according to the server when this page loaded: %1$s, and in the time-zone you have configured in your WordPress settings: %2$s" +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:2 +msgid "404 detection configuration" +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:5 +msgid "A 404 or Not Found error occurs when somebody tries to access a non-existent page on your website." +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:6 +msgid "Typically, most 404 errors happen quite innocently when people have mis-typed a URL or used an old link to page which doesn't exist anymore." +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:7 +msgid "However, in some cases you may find many repeated 404 errors which occur in a relatively short space of time and from the same IP address which are all attempting to access a variety of non-existent page URLs." +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:8 +msgid "Such behaviour can mean that a hacker might be trying to find a particular page or URL for sinister reasons." +msgstr "" + +#. translators: %1$s - Open strong tag, %2$s - Close strong tag. +#: dist/templates/wp-admin/brute-force/404-detection.php:10 +msgid "With this feature enabled, you can use the table below to manually temporarily block IP addresses." +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:10 +msgid "The %1$s Smart 404 %2$s feature in Premium automatically detects and blocks these IP addresses." +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:18, dist/templates/wp-admin/dashboard/may-also-like.php:23, dist/templates/wp-admin/firewall/block-and-allow-lists.php:16 +msgid "All-In-One Security Premium" +msgstr "" + +#. translators: %s: Premium upgrade link +#: dist/templates/wp-admin/brute-force/404-detection.php:20, dist/templates/wp-admin/firewall/block-and-allow-lists.php:17 +msgid "You may also be interested in %s." +msgstr "" + +#. translators: 1: open strong tag, 2: close strong tag. +#: dist/templates/wp-admin/brute-force/404-detection.php:22 +msgid "This plugin adds a number of extra features including %1$s and %2$s." +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:22, dist/templates/wp-admin/firewall/block-and-allow-lists.php:18 +msgid "smart 404 blocking" +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:22, dist/templates/wp-admin/firewall/block-and-allow-lists.php:18 +msgid "country IP blocking" +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:33 +msgid "404 detection options" +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:44 +msgid "Enable 404 IP detection" +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:47 +msgid "Enable this option to detect IP addresses that return 404 errors." +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:53 +msgid "Enable 404 event logging" +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:56 +msgid "Check this if you want to enable the logging of 404 events" +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:61 +msgid "Time length of 404 lockout (minutes)" +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:63 +msgid "Set the length of time for which a blocked IP address will be prevented from visiting your site" +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:67 +msgid "404 lockout redirect URL" +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:69 +msgid "A blocked visitor will be automatically redirected to this URL." +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:73, dist/templates/wp-admin/brute-force/captcha-settings.php:62, dist/templates/wp-admin/brute-force/honeypot.php:50, dist/templates/wp-admin/brute-force/login-whitelist.php:63, dist/templates/wp-admin/brute-force/rename-login.php:52, dist/templates/wp-admin/filesystem-security/file-protection.php:59, dist/templates/wp-admin/filesystem-security/frames.php:30, dist/templates/wp-admin/firewall/block-and-allow-lists.php:82, dist/templates/wp-admin/scanner/file-change-detect.php:145, dist/templates/wp-admin/settings/advanced-settings.php:220, dist/templates/wp-admin/settings/delete-plugin-settings.php:37, dist/templates/wp-admin/settings/wp-version-info.php:35, dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:62, dist/templates/wp-admin/spam-prevention/comment-spam.php:97, dist/templates/wp-admin/user-security/additional.php:28, dist/templates/wp-admin/user-security/force-logout.php:36, dist/templates/wp-admin/user-security/hibp.php:32, dist/templates/wp-admin/user-security/http-authentication.php:103, dist/templates/wp-admin/user-security/login-lockout.php:141, dist/templates/wp-admin/user-security/login-lockout.php:184, dist/templates/wp-admin/user-security/manual-approval.php:30, dist/templates/wp-admin/user-security/salt.php:49, dist/templates/wp-admin/user-security/user-accounts.php:14, dist/templates/wp-admin/firewall/partials/upgrade-unsafe-http-calls.php:45 +msgid "Save settings" +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:79 +msgid "404 event logs" +msgstr "" + +#. translators: %1$d - Purge event records after number of days. +#: dist/templates/wp-admin/brute-force/404-detection.php:83 +msgid "This list displays the 404 event logs when somebody tries to access a non-existent page on your website." +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:83 +msgid "404 event logs that are older than %1$d days are purged automatically." +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:92, dist/templates/wp-admin/brute-force/captcha-settings.php:30, dist/templates/wp-admin/dashboard/audit-logs.php:13, dist/templates/wp-admin/dashboard/permanent-block.php:18, dist/templates/wp-admin/filesystem-security/file-protection.php:32, dist/templates/wp-admin/firewall/htaccess-firewall-rules.php:28, dist/templates/wp-admin/firewall/php-firewall-rules.php:51, dist/templates/wp-admin/user-security/manual-approval.php:51 +msgid "Search" +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:110 +msgid "Press this button if you wish to download this log in CSV format." +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:118, dist/templates/wp-admin/brute-force/404-detection.php:126 +msgid "Delete all 404 event logs" +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:123 +msgid "Press this button if you wish to purge all 404 event logs from the DB." +msgstr "" + +#: dist/templates/wp-admin/brute-force/404-detection.php:126 +msgid "Are you sure you want to delete all records?" +msgstr "" + +#: dist/templates/wp-admin/brute-force/captcha-provider.php:3 +msgid "CAPTCHA provider" +msgstr "" + +#: dist/templates/wp-admin/brute-force/captcha-provider.php:9 +msgid "CAPTCHA will not work because you have disabled login lockout by activating the AIOS_DISABLE_LOGIN_LOCKOUT constant value in a configuration file." +msgstr "" + +#: dist/templates/wp-admin/brute-force/captcha-provider.php:10 +msgid "To enable it, define AIOS_DISABLE_LOGIN_LOCKOUT constant value as false, or remove it." +msgstr "" + +#: dist/templates/wp-admin/brute-force/captcha-provider.php:18 +msgid "This feature allows you to add a CAPTCHA form on various WordPress login pages and forms." +msgstr "" + +#: dist/templates/wp-admin/brute-force/captcha-provider.php:18 +msgid "Adding a CAPTCHA form on a login page or form is another effective yet simple \"Brute Force\" prevention technique." +msgstr "" + +#: dist/templates/wp-admin/brute-force/captcha-provider.php:19 +msgid "You have the option of using either %s, %s or a plain maths CAPTCHA form." +msgstr "" + +#: dist/templates/wp-admin/brute-force/captcha-provider.php:20 +msgid "We recommend %s as a more privacy-respecting option than %s" +msgstr "" + +#: dist/templates/wp-admin/brute-force/captcha-provider.php:24 +msgid "Default CAPTCHA" +msgstr "" + +#: dist/templates/wp-admin/brute-force/captcha-provider.php:43, dist/templates/wp-admin/brute-force/captcha-provider.php:78 +msgid "Site key" +msgstr "" + +#: dist/templates/wp-admin/brute-force/captcha-provider.php:49, dist/templates/wp-admin/brute-force/captcha-provider.php:84 +msgid "Secret key" +msgstr "" + +#: dist/templates/wp-admin/brute-force/captcha-settings.php:6 +msgid "Wordpress forms" +msgstr "" + +#: dist/templates/wp-admin/brute-force/captcha-settings.php:9 +msgid "Woocommerce forms" +msgstr "" + +#: dist/templates/wp-admin/brute-force/captcha-settings.php:13 +msgid "Other forms" +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:2 +msgid "Brute force prevention firewall settings" +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:6 +msgid "A Brute Force Attack is when a hacker tries many combinations of usernames and passwords until they succeed in guessing the right combination." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:6 +msgid "Due to the fact that at any one time there may be many concurrent login attempts occurring on your site via malicious automated robots, this also has a negative impact on your server's memory and performance." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:6 +msgid "The features in this tab will stop the majority of brute force login attacks thus providing even better protection for your WP login page." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:11 +msgid "Read our tutorial on how to use the cookie-based brute force prevention feature" +msgstr "" + +#. translators: %s: Tutorial link. +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:13 +msgid "%s." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:26 +msgid "Cookie based brute force login prevention" +msgstr "" + +#. translators: %s: Notes link. +#. translators: %s: Notes URL. +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:38, dist/templates/wp-admin/brute-force/rename-login.php:32, dist/templates/wp-admin/firewall/block-and-allow-lists.php:39 +msgid "This feature can lock you out of admin if it doesn't work correctly on your site." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:38 +msgid "Before activating this feature, please read the following %s." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:38, dist/templates/wp-admin/brute-force/rename-login.php:32 +msgid "message" +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:62 +msgid "Enable this if you want to protect your login page from a brute force attack." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:67 +msgid "This feature will deny access to your WordPress login page for all people except those who have a special cookie in their browser." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:69 +msgid "To use this feature do the following:" +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:71 +msgid "1) Enable the checkbox." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:73 +msgid "2) Enter a secret word consisting of alphanumeric characters which will be difficult to guess." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:73 +msgid "This secret word will be useful whenever you need to know the special URL which you will use to access the login page (see point below)." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:75 +msgid "3) You will then be provided with a special login URL." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:75 +msgid "You will need to use this URL to login to your WordPress site instead of the usual login URL." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:77 +msgid "NOTE: The system will deposit a special cookie in your browser which will allow you access to the WordPress administration login page." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:79 +msgid "Any person trying to access your login page who does not have the special cookie in their browser will be automatically blocked." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:87 +msgid "Secret word" +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:89 +msgid "Choose a secret word consisting of alphanumeric characters which you can use to access your special URL." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:89 +msgid "You are highly encouraged to choose a word which will be difficult to guess." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:93 +msgid "Re-direct URL" +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:97 +msgid "Specify a URL to redirect a hacker to when they try to access your WordPress login page." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:104 +msgid "The URL specified here can be any site's URL and does not have to be your own." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:106 +msgid "This field will default to: http://127.0.0.1 if you do not enter a value." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:108 +msgid "Useful Tip:" +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:110 +msgid "It's a good idea to not redirect attempted brute force login attempts to your site because it increases the load on your server." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:112 +msgid "Redirecting a hacker or malicious bot back to \"http://127.0.0.1\" is ideal because it deflects them back to their own local host and puts the load on their server instead of yours." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:119 +msgid "My site has posts or pages which are password protected" +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:122 +msgid "Enable this if you are using the native WordPress password protection feature for some or all of your blog posts or pages." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:127 +msgid "In the cases where you are protecting some of your posts or pages using the in-built WordPress password protection feature, a few extra lines of directives and exceptions need to be added so that people trying to access pages are not automatically blocked." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:129 +msgid "By enabling this checkbox, the plugin will add the necessary rules and exceptions so that people trying to access these pages are not automatically blocked." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:131 +msgid "Helpful Tip:" +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:133 +msgid "If you do not use the WordPress password protection feature for your posts or pages then it is highly recommended that you leave this checkbox disabled." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:141 +msgid "My site has a theme or plugins which use AJAX" +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:144 +msgid "Enable this if your site uses AJAX functionality." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:149 +msgid "In the cases where your WordPress installation has a theme or plugin that uses AJAX, a few extra lines of directives and exceptions need to be added to prevent AJAX requests from being automatically blocked by the brute force prevention feature." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:151 +msgid "By enabling this checkbox, the plugin will add the necessary rules and exceptions so that AJAX operations will work as expected." +msgstr "" + +#: dist/templates/wp-admin/brute-force/cookie-based-brute-force-prevention.php:161 +msgid "Save feature settings" +msgstr "" + +#: dist/templates/wp-admin/brute-force/honeypot.php:4 +msgid "This feature allows you to add a special hidden \"honeypot\" field on WordPress login and registration pages." +msgstr "" + +#: dist/templates/wp-admin/brute-force/honeypot.php:4 +msgid "This will only be visible to robots and not humans." +msgstr "" + +#: dist/templates/wp-admin/brute-force/honeypot.php:4 +msgid "Since robots usually fill in every input field on a form, they will also submit a value for the special hidden honeypot field." +msgstr "" + +#: dist/templates/wp-admin/brute-force/honeypot.php:4 +msgid "The way honeypots work is that a hidden field is placed somewhere inside a form which only robots will submit." +msgstr "" + +#: dist/templates/wp-admin/brute-force/honeypot.php:4 +msgid "If that field contains a value when the form is submitted then a robot has most likely submitted the form and it is consequently dealt with." +msgstr "" + +#: dist/templates/wp-admin/brute-force/honeypot.php:4 +msgid "Therefore, if the plugin detects that this field has a value when the form is submitted, then the robot which is attempting to submit the form on your site will be redirected to its localhost address - http://127.0.0.1." +msgstr "" + +#: dist/templates/wp-admin/brute-force/honeypot.php:9 +msgid "Login form honeypot settings" +msgstr "" + +#: dist/templates/wp-admin/brute-force/honeypot.php:19 +msgid "Enable honeypot on login page" +msgstr "" + +#: dist/templates/wp-admin/brute-force/honeypot.php:22 +msgid "Enable this if you want the honeypot feature for the login page" +msgstr "" + +#: dist/templates/wp-admin/brute-force/honeypot.php:30 +msgid "Registration form honeypot settings" +msgstr "" + +#: dist/templates/wp-admin/brute-force/honeypot.php:40 +msgid "Enable honeypot on registration page" +msgstr "" + +#: dist/templates/wp-admin/brute-force/honeypot.php:43 +msgid "Enable this if you want the honeypot feature for the registration page" +msgstr "" + +#: dist/templates/wp-admin/brute-force/login-whitelist.php:5 +msgid "The All-In-One Security whitelist feature gives you the option of only allowing certain IP addresses or ranges to have access to your WordPress login page." +msgstr "" + +#: dist/templates/wp-admin/brute-force/login-whitelist.php:5 +msgid "This feature will deny login access for all IP addresses which are not in your whitelist as configured in the settings below." +msgstr "" + +#: dist/templates/wp-admin/brute-force/login-whitelist.php:5 +msgid "By allowing/blocking IP addresses, you are using the most secure first line of defence because login access will only be granted to whitelisted IP addresses and other addresses will be blocked as soon as they try to access your login page." +msgstr "" + +#. translators: %s: AIOS Constant. +#: dist/templates/wp-admin/brute-force/login-whitelist.php:11 +msgid "If you are locked out by the login whitelist feature and you do not have a static IP address, define the following constant %s in wp-config.php to disable the feature." +msgstr "" + +#: dist/templates/wp-admin/brute-force/login-whitelist.php:16 +msgid "Cookie-Based brute force login prevention" +msgstr "" + +#. translators: 1: Brute force link, 2: Rename login link 3: Open strong tag, 4: Close strong tag. +#: dist/templates/wp-admin/brute-force/login-whitelist.php:19 +msgid "Attention: If in addition to enabling the white list feature, you also have one of the %1$s or %2$s features enabled, %3$s you will still need to use your secret word or special slug in the URL when trying to access your WordPress login page %4$s" +msgstr "" + +#: dist/templates/wp-admin/brute-force/login-whitelist.php:19 +msgid "These features are NOT functionally related." +msgstr "" + +#: dist/templates/wp-admin/brute-force/login-whitelist.php:19 +msgid "Having both of them enabled on your site means you are creating 2 layers of security." +msgstr "" + +#: dist/templates/wp-admin/brute-force/login-whitelist.php:28 +msgid "Login IP whitelist settings" +msgstr "" + +#: dist/templates/wp-admin/brute-force/login-whitelist.php:39 +msgid "Enable IP whitelisting" +msgstr "" + +#: dist/templates/wp-admin/brute-force/login-whitelist.php:42, dist/templates/wp-admin/user-security/login-lockout.php:173 +msgid "Enable this if you want the whitelisting of selected IP addresses specified in the settings below" +msgstr "" + +#: dist/templates/wp-admin/brute-force/login-whitelist.php:47 +msgid "Your current IP address" +msgstr "" + +#: dist/templates/wp-admin/brute-force/login-whitelist.php:52, dist/templates/wp-admin/settings/advanced-settings.php:84, dist/templates/wp-admin/settings/advanced-settings.php:193 +msgid "getting..." +msgstr "" + +#: dist/templates/wp-admin/brute-force/login-whitelist.php:54 +msgid "You can copy and paste the above address(es) in the text box below if you want to include it in your login whitelist." +msgstr "" + +#: dist/templates/wp-admin/brute-force/login-whitelist.php:59, dist/templates/wp-admin/user-security/login-lockout.php:179 +msgid "Enter whitelisted IP addresses:" +msgstr "" + +#: dist/templates/wp-admin/brute-force/login-whitelist.php:59, dist/templates/wp-admin/user-security/login-lockout.php:179 +msgid "Enter one or more IP addresses or IP ranges you wish to include in your whitelist." +msgstr "" + +#: dist/templates/wp-admin/brute-force/login-whitelist.php:59 +msgid "Only the addresses specified here will have access to the WordPress login page." +msgstr "" + +#: dist/templates/wp-admin/brute-force/rename-login.php:4 +msgid "An effective Brute Force prevention technique is to change the default WordPress login page URL." +msgstr "" + +#: dist/templates/wp-admin/brute-force/rename-login.php:4 +msgid "Normally if you wanted to login to WordPress you would type your site's home URL followed by wp-login.php." +msgstr "" + +#: dist/templates/wp-admin/brute-force/rename-login.php:4 +msgid "This feature allows you to change the login URL by setting your own slug and renaming the last portion of the login URL which contains the wp-login.php to any string that you like." +msgstr "" + +#: dist/templates/wp-admin/brute-force/rename-login.php:4 +msgid "By doing this, malicious bots and hackers will not be able to access your login page because they will not know the correct login page URL." +msgstr "" + +#: dist/templates/wp-admin/brute-force/rename-login.php:7 +msgid "Login page white list" +msgstr "" + +#: dist/templates/wp-admin/brute-force/rename-login.php:10 +msgid "You may also be interested in the following alternative brute force prevention features:" +msgstr "" + +#: dist/templates/wp-admin/brute-force/rename-login.php:20 +msgid "Rename login page settings" +msgstr "" + +#: dist/templates/wp-admin/brute-force/rename-login.php:32 +msgid "Before activating this feature, you must read the following %s." +msgstr "" + +#: dist/templates/wp-admin/brute-force/rename-login.php:33 +msgid "NOTE: If you are hosting your site on WPEngine or a provider which performs server caching, you will need to ask the host support people to NOT cache your renamed login page." +msgstr "" + +#: dist/templates/wp-admin/brute-force/rename-login.php:38 +msgid "Enable rename login page feature" +msgstr "" + +#: dist/templates/wp-admin/brute-force/rename-login.php:41 +msgid "Enable this if you want the rename login page feature" +msgstr "" + +#: dist/templates/wp-admin/brute-force/rename-login.php:46 +msgid "Login page URL" +msgstr "" + +#: dist/templates/wp-admin/brute-force/rename-login.php:48 +msgid "Enter a string which will represent your secure login page slug." +msgstr "" + +#: dist/templates/wp-admin/brute-force/rename-login.php:48 +msgid "You are encouraged to choose something which is hard to guess and only you will remember." +msgstr "" + +#: dist/templates/wp-admin/dashboard/debug-logs.php:4 +msgid "Debug log options" +msgstr "" + +#: dist/templates/wp-admin/dashboard/debug-logs.php:7 +msgid "Clear logs" +msgstr "" + +#: dist/templates/wp-admin/dashboard/debug-logs.php:7 +msgid "Are you sure you want to clear all the debug logs?" +msgstr "" + +#: dist/templates/wp-admin/dashboard/debug-logs.php:13 +msgid "Debug logs" +msgstr "" + +#: dist/templates/wp-admin/dashboard/debug-logs.php:24 +msgid "This section displays information valuable for diagnosing conflicts, configuration discrepancies, or compatibility concerns with other plugins, themes, or the hosting environment." +msgstr "" + +#: dist/templates/wp-admin/dashboard/debug-logs.php:25 +msgid "You can use this information to help troubleshoot issues you may be experiencing with your WordPress site or send a report to the AIOS team." +msgstr "" + +#: dist/templates/wp-admin/dashboard/debug-logs.php:36 +msgid "Copy/send report" +msgstr "" + +#: dist/templates/wp-admin/dashboard/debug-logs.php:39 +msgid "All-In-One Security diagnostics report" +msgstr "" + +#: dist/templates/wp-admin/dashboard/debug-logs.php:40 +msgid "Copy to clipboard" +msgstr "" + +#: dist/templates/wp-admin/dashboard/locked-ip.php:5 +msgid "This tab displays the list of all IP addresses which are currently temporarily locked out." +msgstr "" + +#: dist/templates/wp-admin/dashboard/locked-ip.php:9 +msgid "Currently locked out IP addresses and ranges" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:5 +msgid "All-In-One Security Free vs Premium Comparison Chart" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:7 +msgid "FAQs" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:9 +msgid "Ask a pre-sales question" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:18 +msgid "All-In-One Security Free" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:19 +msgid "Free" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:30, dist/templates/wp-admin/dashboard/may-also-like.php:136, dist/templates/wp-admin/dashboard/may-also-like.php:247, dist/templates/wp-admin/dashboard/may-also-like.php:292 +msgid "Installed" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:33, dist/templates/wp-admin/dashboard/may-also-like.php:139, dist/templates/wp-admin/dashboard/may-also-like.php:250, dist/templates/wp-admin/dashboard/may-also-like.php:295 +msgid "Upgrade" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:38 +msgid "Login security feature suite" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:39 +msgid "Upgrade your WordPress security and protect against brute-force attacks with login and user security features." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:39 +msgid "Limit login attempts, rename the login page to hide it from bots, add CAPTCHA and more." +msgstr "" + +#. translators: %s: Features URL +#: dist/templates/wp-admin/dashboard/may-also-like.php:42, dist/templates/wp-admin/dashboard/may-also-like.php:148, dist/templates/wp-admin/dashboard/may-also-like.php:163 +msgid "%s" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:42 +msgid "See all login security features" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:45, dist/templates/wp-admin/dashboard/may-also-like.php:48, dist/templates/wp-admin/dashboard/may-also-like.php:61, dist/templates/wp-admin/dashboard/may-also-like.php:64, dist/templates/wp-admin/dashboard/may-also-like.php:72, dist/templates/wp-admin/dashboard/may-also-like.php:75, dist/templates/wp-admin/dashboard/may-also-like.php:86, dist/templates/wp-admin/dashboard/may-also-like.php:97, dist/templates/wp-admin/dashboard/may-also-like.php:108, dist/templates/wp-admin/dashboard/may-also-like.php:119, dist/templates/wp-admin/dashboard/may-also-like.php:130, dist/templates/wp-admin/dashboard/may-also-like.php:151, dist/templates/wp-admin/dashboard/may-also-like.php:154, dist/templates/wp-admin/dashboard/may-also-like.php:166, dist/templates/wp-admin/dashboard/may-also-like.php:169, dist/templates/wp-admin/dashboard/may-also-like.php:178, dist/templates/wp-admin/dashboard/may-also-like.php:181, dist/templates/wp-admin/dashboard/may-also-like.php:197, dist/templates/wp-admin/dashboard/may-also-like.php:208, dist/templates/wp-admin/dashboard/may-also-like.php:219, dist/templates/wp-admin/dashboard/may-also-like.php:230, dist/templates/wp-admin/dashboard/may-also-like.php:241, dist/templates/wp-admin/dashboard/may-also-like.php:262, dist/templates/wp-admin/dashboard/may-also-like.php:274, dist/templates/wp-admin/dashboard/may-also-like.php:286 +msgid "Yes" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:53 +msgid "Two-factor authentication (TFA)" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:58 +msgid "Supports Google Authenticator, Microsoft Authenticator, Authy and more." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:69 +msgid "Configure TFA by user role." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:80 +msgid "Control how often TFA is required on trusted devices." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:91 +msgid "Adjust the TFA design to match your brand." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:102 +msgid "Generate one-time use emergency codes to regain access if you lose your TFA device." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:113 +msgid "TFA works consistently in subsites of WordPress multisite networks." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:124 +msgid "Integrate TFA with third party login forms without additional coding." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:145 +msgid "Get PHP, .htaccess and 6G firewall rules." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:145 +msgid "Spot and block fake Google Bots and more!" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:148 +msgid "See all firewall features" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:159 +msgid "File and database security" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:160 +msgid "Block access to files like readme.html to hide key information from hackers." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:160 +msgid "Hide your WordPress database, scan critical folders and files to spot and fix insecure file permissions and more." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:163 +msgid "See all file and database security features" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:175 +msgid "Prevent annoying spam comments and reduce unnecessary server load." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:175 +msgid "Automatically and permanently block IP addresses that exceed a set number of spam comments." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:186 +msgid "Site Scanner" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:191 +msgid "Monitors and alerts you to file changes outside of normal operations." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:202 +msgid "Monitors and alerts you to infection by malware" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:213 +msgid "Monitors and alerts you to blacklisting by search engines." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:224 +msgid "Monitors and alerts you to downtime." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:235 +msgid "Monitors and alerts you to response time issues." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:255 +msgid "Smart 404 blocking" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:256 +msgid "Automatically block IP addresses based on how many 404 errors they generate." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:256 +msgid "Handy charts show how many 404s have occurred and where they’re coming from." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:267 +msgid "Country blocking" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:268 +msgid "Most attacks come from a handful of countries." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:268 +msgid "Prevent most of them by blocking traffic based on country of origin to 99.5% accuracy." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:279 +msgid "Premium support" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:280 +msgid "We can do more to support you via our own support channels than is allowed in the WordPress forums." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:280 +msgid "90% of tickets are responded to within 24 hours." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:303 +msgid "Our other plugins" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:323 +msgid "UpdraftPlus – the ultimate protection for your site, hard work and business" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:324 +msgid "Simplifies backups and restoration." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:324 +msgid "It is the world's highest ranking and most popular scheduled backup plugin, with over three million currently-active installs." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:325 +msgid "Learn more about UpdraftPlus" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:329 +msgid "WP-Optimize – keep your database fast and efficient" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:330 +msgid "Makes your site fast and efficient." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:330 +msgid "It cleans the database, compresses images and caches pages for ultimate speed." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:331 +msgid "Learn more about WP-Optimize" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:335 +msgid "UpdraftCentral – save hours managing multiple WP sites from one place" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:336 +msgid "Highly efficient way to manage, optimize, update and backup multiple websites from one place." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:337 +msgid "Learn more about UpdraftCentral" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:341 +msgid "Easy Updates Manager - keep your WordPress site up to date and bug free" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:344 +msgid "A light yet powerful plugin that allows you to manage all kinds of updates." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:345 +msgid "With a huge number of settings for endless customization." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:346 +msgid "Easy Updates Manager is an obvious choice for anyone wanting to take control of their website updates." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:350, dist/templates/wp-admin/dashboard/may-also-like.php:366, dist/templates/wp-admin/dashboard/may-also-like.php:381, dist/templates/wp-admin/dashboard/may-also-like.php:394 +msgid "Try for free" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:355 +msgid "Internal Link Juicer - a five-star rated internal linking plugin for WordPress" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:359 +msgid "This five-star rated plugin automates internal linking." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:360 +msgid "It strategically places relevant links within your content." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:364 +msgid "Improve your SEO with just a few clicks." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:370 +msgid "WP Overnight - quality plugins for your WooCommerce store. 5 star rated invoicing, order and product management tools" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:373 +msgid "WP Overnight is an independent plugin shop with a range of WooCommerce plugins." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:374 +msgid "Our range of plugins have over 7,500,000 downloads and thousands of loyal customers." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:378, dist/templates/wp-admin/dashboard/may-also-like.php:379 +msgid "Create PDF invoices, automations, barcodes, reports and so much more." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:385 +msgid "WPGetAPI - connect WordPress to APIs without a developer" +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:389 +msgid "The easiest way to connect your WordPress website to an external API." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:390 +msgid "WPGetAPI is free, powerful and easy to use." +msgstr "" + +#: dist/templates/wp-admin/dashboard/may-also-like.php:391 +msgid "Connect to virtually any REST API and retrieve data without writing a line of code." +msgstr "" + +#: dist/templates/wp-admin/dashboard/permanent-block.php:4 +msgid "This tab displays the list of all permanently blocked IP addresses." +msgstr "" + +#: dist/templates/wp-admin/dashboard/permanent-block.php:4 +msgid "NOTE: This feature does NOT use the .htaccess file to permanently block the IP addresses so it should be compatible with all web servers running WordPress." +msgstr "" + +#: dist/templates/wp-admin/dashboard/permanent-block.php:8 +msgid "Permanently blocked IP addresses" +msgstr "" + +#: dist/templates/wp-admin/database-security/database-backup.php:3 +msgid "Manual backup" +msgstr "" + +#: dist/templates/wp-admin/database-security/database-backup.php:10, dist/templates/wp-admin/database-security/database-backup.php:10 +msgid "UpdraftPlus Backup/Restore" +msgstr "" + +#: dist/templates/wp-admin/database-security/database-backup.php:10 +msgid "Your backups are on the UpdraftPlus Backup/Restore admin page." +msgstr "" + +#: dist/templates/wp-admin/database-security/database-backup.php:12 +msgid "Create database backup now" +msgstr "" + +#: dist/templates/wp-admin/database-security/database-backup.php:21 +msgid "Automated scheduled backups" +msgstr "" + +#: dist/templates/wp-admin/database-security/database-backup.php:26 +msgid "Automate backup in the UpdraftPlus plugin" +msgstr "" + +#: dist/templates/wp-admin/database-security/database-backup.php:29 +msgid "The automated backup feature in All-In-One Security was removed as of version 5.0.0." +msgstr "" + +#: dist/templates/wp-admin/database-security/database-backup.php:29 +msgid "For a reliable backup solution, we recommend" +msgstr "" + +#: dist/templates/wp-admin/database-security/database-prefix.php:2, dist/templates/wp-admin/database-security/database-prefix.php:55 +msgid "Change database prefix" +msgstr "" + +#: dist/templates/wp-admin/database-security/database-prefix.php:5 +msgid "Your WordPress database is the most important asset of your website because it contains a lot of your site's precious information." +msgstr "" + +#: dist/templates/wp-admin/database-security/database-prefix.php:5 +msgid "The database is also a target for hackers via methods such as SQL injections and malicious and automated code which targets certain tables." +msgstr "" + +#: dist/templates/wp-admin/database-security/database-prefix.php:5 +msgid "One way to add a layer of protection for your DB is to change the default WordPress table prefix from \"wp_\" to something else which will be difficult for hackers to guess." +msgstr "" + +#: dist/templates/wp-admin/database-security/database-prefix.php:5 +msgid "This feature allows you to easily change the prefix to a value of your choice or to a random value set by this plugin." +msgstr "" + +#: dist/templates/wp-admin/database-security/database-prefix.php:9 +msgid "Database prefix options" +msgstr "" + +#: dist/templates/wp-admin/database-security/database-prefix.php:19 +msgid "database backup" +msgstr "" + +#. translators: %s: Backup link. +#: dist/templates/wp-admin/database-security/database-prefix.php:21 +msgid "It is recommended that you perform a %s before using this feature" +msgstr "" + +#: dist/templates/wp-admin/database-security/database-prefix.php:30 +msgid "Current database table prefix" +msgstr "" + +#: dist/templates/wp-admin/database-security/database-prefix.php:36 +msgid "Your site is currently using the default WordPress database prefix value of \"wp_\"." +msgstr "" + +#: dist/templates/wp-admin/database-security/database-prefix.php:36 +msgid "To increase your site's security you should consider changing the database prefix value to another value." +msgstr "" + +#: dist/templates/wp-admin/database-security/database-prefix.php:43 +msgid "Generate new database table prefix" +msgstr "" + +#: dist/templates/wp-admin/database-security/database-prefix.php:47 +msgid "Enable this if you want the plugin to generate a random 6 character string for the table prefix" +msgstr "" + +#: dist/templates/wp-admin/database-security/database-prefix.php:48 +msgid "OR" +msgstr "" + +#: dist/templates/wp-admin/database-security/database-prefix.php:50 +msgid "Choose your own database prefix by specifying a string which contains letters and/or numbers and/or underscores, example: xyz_" +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/copy-protection.php:3 +msgid "Disable the ability to copy text" +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/copy-protection.php:14 +msgid "This feature allows you to disable the ability to select and copy text from your front end." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/copy-protection.php:15 +msgid "When admin user is logged in, the feature is automatically disabled for his session." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/copy-protection.php:20 +msgid "Enable copy protection" +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/copy-protection.php:23 +msgid "Enable this to disable the \"Right click\", \"Text selection\" and \"Copy\" options on the front end of your site." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/copy-protection.php:29 +msgid "Save copy protection settings" +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/file-permissions.php:2 +msgid "File permissions scan" +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/file-permissions.php:5 +msgid "Your WordPress file and folder permission settings govern the accessibility and read/write privileges of the files and folders which make up your WP installation." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/file-permissions.php:5 +msgid "Your WP installation already comes with reasonably secure file permission settings for the filesystem." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/file-permissions.php:5 +msgid "However, sometimes people or other plugins modify the various permission settings of certain core WP folders or files such that they end up making their site less secure because they chose the wrong permission values." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/file-permissions.php:5 +msgid "This feature will scan the critical WP core folders and files and will highlight any permission settings which are insecure." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/file-permissions.php:19 +msgid "WP directory and file permissions scan results" +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/file-permissions.php:12 +msgid "This plugin has detected that your site is running on a Windows server." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/file-permissions.php:13 +msgid "This feature is not applicable for Windows server installations." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/file-protection.php:5 +msgid "These features allow you to protect your files and assets." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/file-protection.php:6 +msgid "By protecting your files and assets, you can help prevent nefarious users gain key information and protect your server's resources." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/file-protection.php:14, dist/templates/wp-admin/filesystem-security/partials/wp-file-access.php:3 +msgid "Delete default WP files" +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/file-protection.php:17, dist/templates/wp-admin/filesystem-security/partials/prevent-hotlinks.php:3 +msgid "Prevent hotlinking" +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/file-protection.php:20, dist/templates/wp-admin/filesystem-security/partials/php-file-editing.php:3 +msgid "Disable PHP file editing" +msgstr "" + +#. translators: %s: File path. +#: dist/templates/wp-admin/filesystem-security/filesystem-log-result.php:20 +msgid "The file %s could not be read" +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/filesystem-log-result.php:7 +msgid "Showing latest entries for file: %s" +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/frames.php:4 +msgid "Prevent your site from being displayed in a frame" +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/frames.php:15 +msgid "This feature allows you to prevent other sites from displaying any of your content via a frame or iframe." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/frames.php:16 +msgid "When enabled, this feature will set the \"X-Frame-Options\" parameter to \"sameorigin\" in the HTTP header." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/frames.php:24 +msgid "Enable this to stop other sites from displaying your content in a frame or iframe." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/host-system-logs.php:2 +msgid "System logs" +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/host-system-logs.php:5 +msgid "Sometimes your hosting platform will produce error or warning logs in a file called \"error_log\"." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/host-system-logs.php:5 +msgid "Depending on the nature and cause of the error or warning, your hosting server can create multiple instances of this file in numerous directory locations of your WordPress installation." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/host-system-logs.php:5 +msgid "By occasionally viewing the contents of these logs files you can keep informed of any underlying problems on your system which you might need to address." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/host-system-logs.php:11 +msgid "View system logs" +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/host-system-logs.php:13 +msgid "Please press the button below to view the latest system logs" +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/host-system-logs.php:17 +msgid "Enter System Log File Name" +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/host-system-logs.php:19 +msgid "Enter your system log file name. (Defaults to error_log)" +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/host-system-logs.php:22 +msgid "View latest system logs" +msgstr "" + +#: dist/templates/wp-admin/firewall/5g.php:2 +msgid "Firewall settings" +msgstr "" + +#: dist/templates/wp-admin/firewall/5g.php:5 +msgid "5G firewall settings" +msgstr "" + +#: dist/templates/wp-admin/firewall/5g.php:8 +msgid "This feature is marked for deprecation and will be removed in a future version of the plugin." +msgstr "" + +#: dist/templates/wp-admin/firewall/5g.php:13 +msgid "Enable legacy 5G firewall protection" +msgstr "" + +#: dist/templates/wp-admin/firewall/5g.php:16 +msgid "Enable this to apply the 5G firewall protection from perishablepress.com to your site." +msgstr "" + +#: dist/templates/wp-admin/firewall/5g.php:20 +msgid "This setting will implement the 5G security firewall protection mechanisms on your site which include the following things:" +msgstr "" + +#: dist/templates/wp-admin/firewall/5g.php:21, dist/templates/wp-admin/firewall/partials/ng.php:33 +msgid "1) Block forbidden characters commonly used in exploitative attacks." +msgstr "" + +#: dist/templates/wp-admin/firewall/5g.php:22, dist/templates/wp-admin/firewall/partials/ng.php:34 +msgid "2) Block malicious encoded URL characters such as the \".css(\" string." +msgstr "" + +#: dist/templates/wp-admin/firewall/5g.php:23, dist/templates/wp-admin/firewall/partials/ng.php:35 +msgid "3) Guard against the common patterns and specific exploits in the root portion of targeted URLs." +msgstr "" + +#: dist/templates/wp-admin/firewall/5g.php:24, dist/templates/wp-admin/firewall/partials/ng.php:36 +msgid "4) Stop attackers from manipulating query strings by disallowing illicit characters." +msgstr "" + +#: dist/templates/wp-admin/firewall/5g.php:25, dist/templates/wp-admin/firewall/partials/ng.php:37 +msgid "....and much more." +msgstr "" + +#: dist/templates/wp-admin/firewall/5g.php:34 +msgid "Save 5G firewall settings" +msgstr "" + +#: dist/templates/wp-admin/firewall/block-and-allow-lists.php:2 +msgid "Ban IPs or user agents" +msgstr "" + +#: dist/templates/wp-admin/firewall/block-and-allow-lists.php:5 +msgid "The All-In-One Security blacklist feature gives you the option of banning certain host IP addresses or ranges and also user agents." +msgstr "" + +#: dist/templates/wp-admin/firewall/block-and-allow-lists.php:6 +msgid "This feature will deny total site access for users which have IP addresses or user agents matching those which you have configured in the settings below." +msgstr "" + +#: dist/templates/wp-admin/firewall/block-and-allow-lists.php:7 +msgid "Black-listed visitors will be blocked as soon as WordPress loads, preventing them from gaining any further access." +msgstr "" + +#: dist/templates/wp-admin/firewall/block-and-allow-lists.php:18 +msgid "This plugin adds a number of extra features including %s and %s." +msgstr "" + +#: dist/templates/wp-admin/firewall/block-and-allow-lists.php:26 +msgid "IP hosts and user agent blacklist settings" +msgstr "" + +#: dist/templates/wp-admin/firewall/block-and-allow-lists.php:38 +msgid "please read the following message" +msgstr "" + +#: dist/templates/wp-admin/firewall/block-and-allow-lists.php:39 +msgid "You %s before activating this feature." +msgstr "" + +#: dist/templates/wp-admin/firewall/block-and-allow-lists.php:45 +msgid "Enable IP or user agent blacklisting" +msgstr "" + +#: dist/templates/wp-admin/firewall/block-and-allow-lists.php:48 +msgid "Enable this if you want the banning (or blacklisting) of selected IP addresses and/or user agents specified in the settings below" +msgstr "" + +#: dist/templates/wp-admin/firewall/block-and-allow-lists.php:53, dist/templates/wp-admin/firewall/partials/allowlist.php:13 +msgid "Enter IP addresses:" +msgstr "" + +#: dist/templates/wp-admin/firewall/block-and-allow-lists.php:57, dist/templates/wp-admin/firewall/partials/allowlist.php:13 +msgid "Enter one or more IP addresses or IP ranges." +msgstr "" + +#: dist/templates/wp-admin/firewall/block-and-allow-lists.php:62 +msgid "Enter user agents:" +msgstr "" + +#: dist/templates/wp-admin/firewall/block-and-allow-lists.php:67 +msgid "Enter one or more user agent strings." +msgstr "" + +#: dist/templates/wp-admin/firewall/block-and-allow-lists.php:68, dist/templates/wp-admin/firewall/partials/upgrade-unsafe-http-calls.php:35 +msgid "More Info" +msgstr "" + +#: dist/templates/wp-admin/firewall/block-and-allow-lists.php:71 +msgid "The user agent string will be checked in a case-insensitive manner." +msgstr "" + +#: dist/templates/wp-admin/firewall/block-and-allow-lists.php:72 +msgid "Each user agent string must be on a new line." +msgstr "" + +#: dist/templates/wp-admin/firewall/block-and-allow-lists.php:73 +msgid "Example 1 - A single user agent string to block:" +msgstr "" + +#: dist/templates/wp-admin/firewall/block-and-allow-lists.php:75 +msgid "Example 2 - A list of more than 1 user agent strings to block" +msgstr "" + +#: dist/templates/wp-admin/firewall/htaccess-firewall-rules.php:2 +msgid ".htaccess firewall settings" +msgstr "" + +#: dist/templates/wp-admin/firewall/htaccess-firewall-rules.php:8, dist/templates/wp-admin/firewall/partials/basic-firewall-settings.php:3 +msgid "Basic firewall settings" +msgstr "" + +#: dist/templates/wp-admin/firewall/htaccess-firewall-rules.php:11 +msgid "Block debug log" +msgstr "" + +#: dist/templates/wp-admin/firewall/htaccess-firewall-rules.php:14 +msgid "Listing directory content" +msgstr "" + +#: dist/templates/wp-admin/firewall/htaccess-firewall-rules.php:25, dist/templates/wp-admin/firewall/php-firewall-rules.php:48 +msgid "Rules" +msgstr "" + +#: dist/templates/wp-admin/firewall/htaccess-firewall-rules.php:56 +msgid "Save .htaccess firewall settings" +msgstr "" + +#: dist/templates/wp-admin/firewall/php-firewall-rules.php:3 +msgid "PHP firewall settings" +msgstr "" + +#: dist/templates/wp-admin/firewall/php-firewall-rules.php:9 +msgid "Security enhancements" +msgstr "" + +#: dist/templates/wp-admin/firewall/php-firewall-rules.php:13 +msgid "Feed control" +msgstr "" + +#: dist/templates/wp-admin/firewall/php-firewall-rules.php:17 +msgid "Comment protection" +msgstr "" + +#: dist/templates/wp-admin/firewall/php-firewall-rules.php:21 +msgid "URL security" +msgstr "" + +#: dist/templates/wp-admin/firewall/php-firewall-rules.php:25 +msgid "String filtering" +msgstr "" + +#: dist/templates/wp-admin/firewall/php-firewall-rules.php:29 +msgid "nG firewall rules" +msgstr "" + +#: dist/templates/wp-admin/firewall/php-firewall-rules.php:33 +msgid "WP REST API" +msgstr "" + +#: dist/templates/wp-admin/firewall/php-firewall-rules.php:36, dist/templates/wp-admin/firewall/partials/internet-bots.php:3 +msgid "Internet bot settings" +msgstr "" + +#: dist/templates/wp-admin/firewall/php-firewall-rules.php:79 +msgid "Save PHP firewall settings" +msgstr "" + +#. translators: 1: Old location 2: New location +#: dist/templates/wp-admin/general/moved.php:24 +msgid "The %1$s feature is now located %2$s." +msgstr "" + +#: dist/templates/wp-admin/general/moved.php:24 +msgid "This page will be removed in a future release." +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:5 +msgid "View the scan results and clear this message" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:10 +msgid "If given an opportunity hackers can insert their code or files into your system which they can then use to carry out malicious acts on your site." +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:10 +msgid "Being informed of any changes in your files can be a good way to quickly prevent a hacker from causing damage to your website." +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:10 +msgid "In general, WordPress core and plugin files and file types such as \".php\" or \".js\" should not change often and when they do, it is important that you are made aware when a change occurs and which file was affected." +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:10 +msgid "The \"File Change Detection Feature\" will notify you of any file change which occurs on your system, including the addition and deletion of files by performing a regular automated or manual scan of your system's files." +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:10 +msgid "This feature also allows you to exclude certain files or folders from the scan in cases where you know that they change often as part of their normal operation. (For example log files and certain caching plugin files may change often and hence you may choose to exclude such files from the file change detection scan)" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:17 +msgid "Next file scan" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:31 +msgid "Previous file scan results" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:39 +msgid "No previous scan results" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:37 +msgid "View the last file scan results" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:50 +msgid "Time now" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:55 +msgid "Scan now" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:56 +msgid "or schedule regular file scans below." +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:65 +msgid "File change detection settings" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:76 +msgid "Enable automated file change detection scan" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:79 +msgid "Enable this if you want the system to automatically and periodically scan your files to check for file changes based on the settings below" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:84 +msgid "Scan time interval" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:87 +msgid "Hours" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:88 +msgid "Days" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:89 +msgid "Weeks" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:91 +msgid "Set the value for how often you would like a scan to occur" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:95 +msgid "File types to ignore" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:99 +msgid "Enter each file type or extension on a new line which you wish to exclude from the file change detection scan." +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:103 +msgid "You can exclude file types from the scan which would not normally pose any security threat if they were changed." +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:103 +msgid "These can include things such as image files." +msgstr "" + +#. translators: 1. JPG, 2. PNG, 3. BMP. +#: dist/templates/wp-admin/scanner/file-change-detect.php:105 +msgid "Example: If you want the scanner to ignore files of type %1$s, %2$s, and %3$s, then you would enter the following:" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:114 +msgid "Files/Directories to ignore" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:118 +msgid "Enter each file or directory on a new line which you wish to exclude from the file change detection scan." +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:122 +msgid "You can exclude specific files/directories from the scan which would not normally pose any security threat if they were changed." +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:122 +msgid "These can include things such as log files." +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:123 +msgid "Example: If you want the scanner to ignore certain files in different directories or whole directories, then you would enter the following:" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:125 +msgid "somedirectory" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:132 +msgid "Send email when change detected" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:136 +msgid "Enable this if you want the system to email you if a file change was detected" +msgstr "" + +#: dist/templates/wp-admin/scanner/file-change-detect.php:141 +msgid "Enter one or more email addresses on a new line." +msgstr "" + +#: dist/templates/wp-admin/scanner/malware-scan.php:4 +msgid "What is malware?" +msgstr "" + +#: dist/templates/wp-admin/scanner/malware-scan.php:5 +msgid "The word malware stands for malicious software." +msgstr "" + +#: dist/templates/wp-admin/scanner/malware-scan.php:5 +msgid "It can consist of things like trojan horses, adware, worms, spyware and any other undesirable code which a hacker will try to inject into your website." +msgstr "" + +#: dist/templates/wp-admin/scanner/malware-scan.php:5 +msgid "Often when malware code has been inserted into your site you will normally not notice anything out of the ordinary based on appearances, but it can have a dramatic effect on your site's search ranking." +msgstr "" + +#: dist/templates/wp-admin/scanner/malware-scan.php:5 +msgid "This is because the bots and spiders from search engines such as Google have the capability to detect malware when they are indexing the pages on your site, and consequently they can blacklist your website which will in turn affect your search rankings." +msgstr "" + +#: dist/templates/wp-admin/scanner/malware-scan.php:9 +msgid "Scanning for malware" +msgstr "" + +#: dist/templates/wp-admin/scanner/malware-scan.php:10 +msgid "Due to the constantly changing and complex nature of Malware, scanning for such things using a standalone plugin will not work reliably." +msgstr "" + +#: dist/templates/wp-admin/scanner/malware-scan.php:10 +msgid "This is something best done via an external scan of your site regularly." +msgstr "" + +#: dist/templates/wp-admin/scanner/malware-scan.php:10 +msgid "This is why we have created an easy-to-use scanning service which is hosted off our own server which will scan your site for malware weekly and notify you if it finds anything." +msgstr "" + +#: dist/templates/wp-admin/scanner/malware-scan.php:11 +msgid "This service is included with the premium plugin and provides the following:" +msgstr "" + +#: dist/templates/wp-admin/scanner/malware-scan.php:13 +msgid "Automatic weekly scans" +msgstr "" + +#: dist/templates/wp-admin/scanner/malware-scan.php:14 +msgid "Automatic malware and blacklist monitoring" +msgstr "" + +#: dist/templates/wp-admin/scanner/malware-scan.php:15 +msgid "Automatic email alerting" +msgstr "" + +#: dist/templates/wp-admin/scanner/malware-scan.php:16 +msgid "Site uptime monitoring" +msgstr "" + +#: dist/templates/wp-admin/scanner/malware-scan.php:17 +msgid "Site response time monitoring" +msgstr "" + +#: dist/templates/wp-admin/scanner/malware-scan.php:18 +msgid "We provide advice for malware cleanup" +msgstr "" + +#: dist/templates/wp-admin/scanner/malware-scan.php:19 +msgid "Blacklist removal" +msgstr "" + +#: dist/templates/wp-admin/scanner/malware-scan.php:20 +msgid "No contract (cancel anytime)" +msgstr "" + +#. translators: %s: Scanner URL. +#: dist/templates/wp-admin/scanner/malware-scan.php:23 +msgid "Learn more %s." +msgstr "" + +#: dist/templates/wp-admin/scanner/scan-result.php:3 +msgid "Latest file change scan results" +msgstr "" + +#: dist/templates/wp-admin/scanner/scan-result.php:8 +msgid "The following files were added to your website." +msgstr "" + +#: dist/templates/wp-admin/scanner/scan-result.php:9 +msgid "The following files were removed from your website." +msgstr "" + +#: dist/templates/wp-admin/scanner/scan-result.php:10 +msgid "The following files were changed on your website." +msgstr "" + +#: dist/templates/wp-admin/scanner/scan-result.php:20 +msgid "File" +msgstr "" + +#: dist/templates/wp-admin/scanner/scan-result.php:21 +msgid "File size" +msgstr "" + +#: dist/templates/wp-admin/scanner/scan-result.php:22 +msgid "File modified" +msgstr "" + +#: dist/templates/wp-admin/settings/advanced-settings.php:4 +msgid "IP address detection settings" +msgstr "" + +#: dist/templates/wp-admin/settings/advanced-settings.php:8 +msgid "The IP address detection settings allow you to specify how visitors' IP addresses are made known to PHP (and hence to WordPress and its plugins)." +msgstr "" + +#: dist/templates/wp-admin/settings/advanced-settings.php:9 +msgid "Usually, this is automatic and there is only one choice." +msgstr "" + +#: dist/templates/wp-admin/settings/advanced-settings.php:10 +msgid "However in some setups, such as those using proxies (including load-balancers and security firewalls like Cloudflare), it may be necessary to set this manually." +msgstr "" + +#: dist/templates/wp-admin/settings/advanced-settings.php:11, dist/templates/wp-admin/firewall/partials/fake-googlebots.php:12 +msgid "Attention" +msgstr "" + +#: dist/templates/wp-admin/settings/advanced-settings.php:11 +msgid "It is important to set this correctly - otherwise you may make it possible for a hacker to ban all your visitors (e.g. via banning Cloudflare from connecting to you) instead of the hacker being banned." +msgstr "" + +#: dist/templates/wp-admin/settings/advanced-settings.php:11 +msgid "The default is to use the REMOTE_ADDR PHP server variable." +msgstr "" + +#: dist/templates/wp-admin/settings/advanced-settings.php:11 +msgid "If this variable does not contain the visitor's IP address, then whilst you can make a different selection below, it is better to ask your web hosting company to have it correctly set." +msgstr "" + +#: dist/templates/wp-admin/settings/advanced-settings.php:12 +msgid "This is the most secure setup, because when set correctly it is immune from being spoofed by an attacker." +msgstr "" + +#: dist/templates/wp-admin/settings/advanced-settings.php:18 +msgid "You have no available IP address detection method(s); you must contact your web hosting company." +msgstr "" + +#. translators: %s: Cloudflare +#. translators: %s: IPIFY IPv4 +#. translators: %s: IPIFY IPv6 +#: dist/templates/wp-admin/settings/advanced-settings.php:25, dist/templates/wp-admin/settings/advanced-settings.php:31, dist/templates/wp-admin/settings/advanced-settings.php:37 +msgid "Your detected IP address according to %s:" +msgstr "" + +#: dist/templates/wp-admin/settings/advanced-settings.php:43 +msgid "If your site is setup on localhost, you won't see your external IP address using your server's IP detection setting; but on a localhost-served site (not available to the outside world), the setting is irrelevant and can be ignored." +msgstr "" + +#: dist/templates/wp-admin/settings/advanced-settings.php:64 +msgid "Choose a $_SERVER variable you would like to detect visitors' IP address using." +msgstr "" + +#: dist/templates/wp-admin/settings/advanced-settings.php:70 +msgid "If your chosen server variable fails the plugin will automatically fall back to retrieving the IP address from $_SERVER[\"REMOTE_ADDR\"]" +msgstr "" + +#: dist/templates/wp-admin/settings/advanced-settings.php:76 +msgid "Your IP address if using this setting:" +msgstr "" + +#: dist/templates/wp-admin/settings/advanced-settings.php:78 +msgid "fetching..." +msgstr "" + +#: dist/templates/wp-admin/settings/advanced-settings.php:92 +msgid "look-up possibly blocked by an ad-blocker or similar tool" +msgstr "" + +#: dist/templates/wp-admin/settings/delete-plugin-settings.php:3 +msgid "Manage delete plugin tasks" +msgstr "" + +#: dist/templates/wp-admin/settings/delete-plugin-settings.php:8 +msgid "NOTE: Even if these options are disabled, the plugin settings will still be inactive when the plugin is uninstalled, but they will be remembered for the next time the plugin is installed and activated." +msgstr "" + +#: dist/templates/wp-admin/settings/delete-plugin-settings.php:13 +msgid "Delete database tables" +msgstr "" + +#: dist/templates/wp-admin/settings/delete-plugin-settings.php:16 +msgid "Enable this to remove all database tables for this site when uninstalling the plugin." +msgstr "" + +#: dist/templates/wp-admin/settings/delete-plugin-settings.php:21 +msgid "Delete settings" +msgstr "" + +#: dist/templates/wp-admin/settings/delete-plugin-settings.php:24 +msgid "Enable this to remove all plugin settings for this site when uninstalling the plugin." +msgstr "" + +#: dist/templates/wp-admin/settings/delete-plugin-settings.php:27 +msgid "It will also remove all firewall rules that were added by this plugin." +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:3 +msgid "For information, updates and documentation, please visit" +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:3 +msgid "Page" +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:16 +msgid "Thank you for using the All-In-One Security plugin." +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:20 +msgid "There are a lot of security features in this plugin." +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:25 +msgid "To start, go through each security option and enable the \"basic\" options." +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:29 +msgid "The more features you enable, the more security points you will achieve." +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:32 +msgid "Before doing anything we advise taking a backup of your .htaccess file, database and wp-config.php." +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:35 +msgid "Backup your database" +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:36, dist/templates/wp-admin/settings/htaccess-file-operations.php:16 +msgid "Backup .htaccess file" +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:37, dist/templates/wp-admin/settings/wp-config-file-operations.php:16 +msgid "Backup wp-config.php file" +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:43 +msgid "Disable security features" +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:48 +msgid "If you think that some plugin functionality on your site is broken due to a security feature you enabled in this plugin, then use the following option to turn off all the security features of this plugin." +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:52 +msgid "Disable all security features" +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:58, dist/templates/wp-admin/settings/general-settings.php:67 +msgid "Disable all firewall rules" +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:63 +msgid "This feature will disable all firewall rules which are currently active in this plugin and it will also delete these rules from your .htaccess file." +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:63 +msgid "Use it if you think one of the firewall rules is causing an issue on your site." +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:73, dist/templates/wp-admin/settings/general-settings.php:87 +msgid "Reset settings" +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:78 +msgid "This feature will delete all of your settings related to the All-In-One Security plugin." +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:79 +msgid "This feature will reset/empty all the database tables of the security plugin also." +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:80 +msgid "Use this feature if you were locked out by the All-In-One Security plugin and/or you are having issues logging in when that plugin is activated." +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:81 +msgid "In addition to the settings it will also delete any directives which were added to the .htaccess file by the All-In-One Security Plugin." +msgstr "" + +#. translators: 1: Open strong tag, 2: Close strong tag. +#: dist/templates/wp-admin/settings/general-settings.php:83 +msgid "%1$sNOTE: %2$sAfter deleting the settings you will need to re-configure the All-In-One Security plugin." +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:96 +msgid "Debug settings" +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:101 +msgid "This setting allows you to enable/disable debug for this plugin." +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:106 +msgid "Enable debug" +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:109 +msgid "Enable debug mode." +msgstr "" + +#: dist/templates/wp-admin/settings/general-settings.php:109 +msgid "You should keep this option disabled after you have finished debugging the issue." +msgstr "" + +#: dist/templates/wp-admin/settings/htaccess-file-operations.php:2 +msgid ".htaccess file operations" +msgstr "" + +#: dist/templates/wp-admin/settings/htaccess-file-operations.php:5 +msgid "Your \".htaccess\" file is a key component of your website's security and it can be modified to implement various levels of protection mechanisms." +msgstr "" + +#: dist/templates/wp-admin/settings/htaccess-file-operations.php:6 +msgid "This feature allows you to backup and save your currently active .htaccess file should you need to re-use the the backed up file in the future." +msgstr "" + +#: dist/templates/wp-admin/settings/htaccess-file-operations.php:7 +msgid "You can also restore your site's .htaccess settings using a backed up .htaccess file." +msgstr "" + +#: dist/templates/wp-admin/settings/htaccess-file-operations.php:12 +msgid "Save the current .htaccess file" +msgstr "" + +#: dist/templates/wp-admin/settings/htaccess-file-operations.php:15 +msgid "Press the button below to backup and save the currently active .htaccess file." +msgstr "" + +#: dist/templates/wp-admin/settings/htaccess-file-operations.php:21 +msgid "Restore from a backed up .htaccess file" +msgstr "" + +#: dist/templates/wp-admin/settings/htaccess-file-operations.php:26 +msgid ".htaccess file to restore from" +msgstr "" + +#: dist/templates/wp-admin/settings/htaccess-file-operations.php:28 +msgid "Restore your .htaccess file" +msgstr "" + +#: dist/templates/wp-admin/settings/settings-file-operations.php:2 +msgid "Export or import your AIOS settings" +msgstr "" + +#: dist/templates/wp-admin/settings/settings-file-operations.php:5 +msgid "This section allows you to export or import your All-In-One Security settings." +msgstr "" + +#: dist/templates/wp-admin/settings/settings-file-operations.php:6 +msgid "This can be handy if you wanted to save time by applying the settings from one site to another site." +msgstr "" + +#: dist/templates/wp-admin/settings/settings-file-operations.php:7 +msgid "NOTE: Before importing, it is your responsibility to know what settings you are trying to import." +msgstr "" + +#: dist/templates/wp-admin/settings/settings-file-operations.php:7 +msgid "Importing settings blindly can cause you to be locked out of your site." +msgstr "" + +#: dist/templates/wp-admin/settings/settings-file-operations.php:8 +msgid "For Example: If a settings item relies on the domain URL then it may not work correctly when imported into a site with a different domain." +msgstr "" + +#: dist/templates/wp-admin/settings/settings-file-operations.php:13, dist/templates/wp-admin/settings/settings-file-operations.php:21 +msgid "Export AIOS settings" +msgstr "" + +#: dist/templates/wp-admin/settings/settings-file-operations.php:18 +msgid "To export your All-In-One Security settings press the button below." +msgstr "" + +#: dist/templates/wp-admin/settings/settings-file-operations.php:26 +msgid "Import AIOS settings" +msgstr "" + +#: dist/templates/wp-admin/settings/settings-file-operations.php:31 +msgid "Use this section to import your All-In-One Security settings from a file." +msgstr "" + +#: dist/templates/wp-admin/settings/settings-file-operations.php:33 +msgid "Settings file to restore from" +msgstr "" + +#: dist/templates/wp-admin/settings/settings-file-operations.php:36 +msgid "Select your import settings file" +msgstr "" + +#: dist/templates/wp-admin/settings/wp-config-file-operations.php:2 +msgid "wp-config.php file operations" +msgstr "" + +#: dist/templates/wp-admin/settings/wp-config-file-operations.php:5 +msgid "Your \"wp-config.php\" file is one of the most important files in your WordPress installation." +msgstr "" + +#: dist/templates/wp-admin/settings/wp-config-file-operations.php:5 +msgid "It is a primary configuration file and contains crucial things such as details of your database and other critical components." +msgstr "" + +#: dist/templates/wp-admin/settings/wp-config-file-operations.php:6 +msgid "This feature allows you to backup and save your currently active wp-config.php file should you need to re-use the the backed up file in the future." +msgstr "" + +#: dist/templates/wp-admin/settings/wp-config-file-operations.php:7 +msgid "You can also restore your site's wp-config.php settings using a backed up wp-config.php file." +msgstr "" + +#: dist/templates/wp-admin/settings/wp-config-file-operations.php:12 +msgid "Save the current wp-config.php file" +msgstr "" + +#: dist/templates/wp-admin/settings/wp-config-file-operations.php:15 +msgid "Press the button below to backup and download the contents of the currently active wp-config.php file." +msgstr "" + +#: dist/templates/wp-admin/settings/wp-config-file-operations.php:21 +msgid "Restore from a backed up wp-config file" +msgstr "" + +#: dist/templates/wp-admin/settings/wp-config-file-operations.php:26 +msgid "wp-config file to restore from" +msgstr "" + +#: dist/templates/wp-admin/settings/wp-config-file-operations.php:28 +msgid "Restore your wp-config file" +msgstr "" + +#: dist/templates/wp-admin/settings/wp-version-info.php:2 +msgid "WP generator meta tag and version info" +msgstr "" + +#: dist/templates/wp-admin/settings/wp-version-info.php:5 +msgid "WordPress generator automatically adds some meta information inside the \"head\" tags of every page on your site's front end, below is an example of this:" +msgstr "" + +#: dist/templates/wp-admin/settings/wp-version-info.php:7 +msgid "The above meta information shows which version of WordPress your site is currently running and thus can help hackers or crawlers scan your site to see if you have an older version of WordPress or one with a known exploit." +msgstr "" + +#: dist/templates/wp-admin/settings/wp-version-info.php:8 +msgid "There are also other ways Wordpress reveals version info such as during style and script loading, an example of this is:" +msgstr "" + +#: dist/templates/wp-admin/settings/wp-version-info.php:11 +msgid "This feature will allow you to remove the WP generator meta info and other version info from your site's pages." +msgstr "" + +#: dist/templates/wp-admin/settings/wp-version-info.php:16 +msgid "WP generator meta info" +msgstr "" + +#: dist/templates/wp-admin/settings/wp-version-info.php:27 +msgid "Remove WP generator meta info" +msgstr "" + +#: dist/templates/wp-admin/settings/wp-version-info.php:30 +msgid "Enable this if you want to remove the version and meta info produced by WP from all pages" +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:3 +msgid "Auto block spammer IPs" +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:7 +msgid "spam comment detection" +msgstr "" + +#. translators: %s: Feature URL. +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:9 +msgid "This feature has detected that %s is not active." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:9 +msgid "It is highly recommended that you activate to make the most of this feature." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:22 +msgid "This feature allows you to automatically and permanently block IP addresses which have exceeded a certain number of spam comments." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:22 +msgid "Comments are considered spam if the \"Spam comment detection\" feature is enabled or an administrator manually marks a comment as \"spam\" from the WordPress Comments menu." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:35 +msgid "Enable auto block of spam comment IPs" +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:38 +msgid "Enable this if you want this plugin to automatically block IP addresses which submit spam comments." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:43 +msgid "Minimum number of spam comments" +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:45 +msgid "Specify the minimum number of spam comments for an IP address before it is permanently blocked." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:49 +msgid "Example 1: Setting this value to \"1\" will block ALL IP addresses which were used to submit at least one spam comment." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:50 +msgid "Example 2: Setting this value to \"5\" will block only those IP addresses which were used to submit 5 spam comments or more on your site." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:67 +msgid "List spammer IP addresses" +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:71 +msgid "This section displays a list of the IP addresses of the people or bots who have left spam comments on your site." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:71 +msgid "This information can be handy for identifying the most persistent IP addresses or ranges used by spammers." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:71 +msgid "By inspecting the IP address data coming from spammers you will be in a better position to determine which addresses or address ranges you should block by adding them to the permanent block list." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:71 +msgid "To add one or more of the IP addresses displayed in the table below to your blacklist, simply press the \"Block\" link for the individual row or select more than one address using the checkboxes and then choose the \"block\" option from the Bulk Actions dropdown list and press the \"Apply\" button." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:77 +msgid "Minimum number of spam comments per IP" +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:80 +msgid "This field allows you to list only those IP addresses which have been used to post X or more spam comments." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:84 +msgid "Example 1: Setting this value to \"1\" will list ALL IP addresses which were used to submit at least 1 spam comment." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:85 +msgid "Example 2: Setting this value to \"5\" will list only those IP addresses which were used to submit 5 spam comments or more on your site." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:91 +msgid "Find IP addresses" +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:96 +msgid "Spammer IP address results" +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:101 +msgid "Only the \"superadmin\" can block IP addresses from the main site." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam-ip-monitoring.php:101 +msgid "Take note of the IP addresses you want blocked and ask the superadmin to add these to the blacklist using the \"Blacklist Manager\" on the main site." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:2 +msgid "Comment spam settings" +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:6 +msgid "Spam comment detect" +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:10 +msgid "A large portion of WordPress blog comment spam is produced by automated bots rather than by humans." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:10 +msgid "This feature will reduce the useless and unnecessary traffic and load on your server resulting from spam comments." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:10 +msgid "In other words, if the comment was not submitted by a human, the request will be discarded or marked as spam." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:10 +msgid "This feature uses cookies and JavaScript." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:10 +msgid "If your visitors have either cookies or JavaScript disabled, their comments will automatically be discarded or marked as spam." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:21 +msgid "Detect spambots posting comments" +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:24 +msgid "Enable this if you want to detect comments originating from spambots." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:28 +msgid "This feature will detect comment attempts which originate from spambots." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:29 +msgid "A legitimate comment is one which is submitted by a human who physically fills out the comment form and presses the submit button." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:30 +msgid "A comment submitted by a spambot is done by directly calling the wp-comments-post.php file." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:31 +msgid "This feature will detect these comments and either discard them completely or mark them as spam." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:38 +msgid "Use cookies to detect comment spam" +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:41 +msgid "Using cookies may prevent caches from caching pages containing comment forms." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:45 +msgid "This feature uses cookies." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:45 +msgid "Unless your cache (e.g. Cloudflare) is configured to ignore these cookies, it may decide to not cache any of these pages." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:46 +msgid "Cloudflare detects that the set-cookie header is set and will not cache the page by default." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:54 +msgid "Comment processing" +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:59 +msgid "Spam comments detected should be" +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:63 +msgid "Discarded" +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:64 +msgid "Marked as spam" +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:66 +msgid "Select the value for how you would like a comment detected as spam to be processed" +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:71 +msgid "Trash spam comments" +msgstr "" + +#. translators: %s: Spam comments day threshold. +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:81 +msgid "Move spam comments to trash after %s days." +msgstr "" + +#: dist/templates/wp-admin/spam-prevention/comment-spam.php:89 +msgid "Enable this feature in order to move the spam comments to trash after given number of days." +msgstr "" + +#: dist/templates/wp-admin/tools/custom-htaccess.php:2 +msgid "Custom .htaccess rules settings" +msgstr "" + +#: dist/templates/wp-admin/tools/custom-htaccess.php:8 +msgid "This feature can be used to apply your own custom .htaccess rules and directives." +msgstr "" + +#: dist/templates/wp-admin/tools/custom-htaccess.php:9 +msgid "It is useful for when you want to tweak our existing firewall rules or when you want to add your own." +msgstr "" + +#: dist/templates/wp-admin/tools/custom-htaccess.php:10 +msgid "NOTE: This feature can only be used if your site is hosted using the Apache webserver, or another that uses .htaccess files." +msgstr "" + +#. translators: %s: Warning +#: dist/templates/wp-admin/tools/custom-htaccess.php:18 +msgid "%s: Only use this feature if you know what you are doing." +msgstr "" + +#: dist/templates/wp-admin/tools/custom-htaccess.php:18 +msgid "Warning" +msgstr "" + +#: dist/templates/wp-admin/tools/custom-htaccess.php:19 +msgid "Incorrect .htaccess rules or directives can break or prevent access to your site." +msgstr "" + +#: dist/templates/wp-admin/tools/custom-htaccess.php:20 +msgid "It is your responsibility to ensure that you are entering the correct code!" +msgstr "" + +#: dist/templates/wp-admin/tools/custom-htaccess.php:21 +msgid "If you break your site you will need to access your server via FTP or something similar and then edit your .htaccess file and delete the changes you made." +msgstr "" + +#: dist/templates/wp-admin/tools/custom-htaccess.php:32 +msgid "Enable custom .htaccess rules" +msgstr "" + +#: dist/templates/wp-admin/tools/custom-htaccess.php:35 +msgid "Enable this to activate the custom rules entered in the text box below" +msgstr "" + +#: dist/templates/wp-admin/tools/custom-htaccess.php:40 +msgid "Place custom rules at the top" +msgstr "" + +#: dist/templates/wp-admin/tools/custom-htaccess.php:43 +msgid "Enable this if you want to place your custom rules at the beginning of all the rules applied by this plugin" +msgstr "" + +#: dist/templates/wp-admin/tools/custom-htaccess.php:48 +msgid "Enter custom .htaccess rules:" +msgstr "" + +#: dist/templates/wp-admin/tools/custom-htaccess.php:52 +msgid "Enter your custom .htaccess rules/directives." +msgstr "" + +#: dist/templates/wp-admin/tools/custom-htaccess.php:57 +msgid "Save custom rules" +msgstr "" + +#: dist/templates/wp-admin/tools/password-tool.php:5 +msgid "Poor password selection is one of the most common weak points of many sites and is usually the first thing a hacker will try to exploit when attempting to break into your site." +msgstr "" + +#: dist/templates/wp-admin/tools/password-tool.php:6 +msgid "Many people fall into the trap of using a simple word or series of numbers as their password." +msgstr "" + +#: dist/templates/wp-admin/tools/password-tool.php:6 +msgid "Such a predictable and simple password would take a competent hacker merely minutes to guess your password by using a simple script which cycles through the easy and most common combinations." +msgstr "" + +#: dist/templates/wp-admin/tools/password-tool.php:7 +msgid "The longer and more complex your password is the harder it is for hackers to \"crack\" because more complex passwords require much greater computing power and time." +msgstr "" + +#: dist/templates/wp-admin/tools/password-tool.php:8 +msgid "This section contains a useful password strength tool which you can use to check whether your password is sufficiently strong enough." +msgstr "" + +#: dist/templates/wp-admin/tools/password-tool.php:12 +msgid "Password strength tool" +msgstr "" + +#: dist/templates/wp-admin/tools/password-tool.php:14 +msgid "This password tool uses an algorithm which calculates how long it would take for your password to be cracked using the computing power of an off-the-shelf current model desktop PC with high end processor, graphics card and appropriate password cracking software." +msgstr "" + +#: dist/templates/wp-admin/tools/password-tool.php:16 +msgid "Start typing a password." +msgstr "" + +#: dist/templates/wp-admin/tools/password-tool.php:24 +msgid "It would take a desktop PC approximately %s to crack your password!" +msgstr "" + +#: dist/templates/wp-admin/tools/password-tool.php:24, dist/templates/wp-admin/user-security/http-authentication.php:80 +msgid "1 sec" +msgstr "" + +#. translators: %s HIBP link. +#: dist/templates/wp-admin/tools/password-tool.php:26, dist/templates/wp-admin/user-security/http-authentication.php:85 +msgid "Pwned according to %s" +msgstr "" + +#: dist/templates/wp-admin/tools/visitor-lockout.php:3 +msgid "General visitor lockout" +msgstr "" + +#: dist/templates/wp-admin/tools/visitor-lockout.php:8 +msgid "This feature allows you to put your site into \"maintenance mode\" by locking down the front-end to all visitors except logged in users with super admin privileges." +msgstr "" + +#: dist/templates/wp-admin/tools/visitor-lockout.php:9 +msgid "Locking your site down to general visitors can be useful if you are investigating some issues on your site or perhaps you might be doing some maintenance and wish to keep out all traffic for security reasons." +msgstr "" + +#: dist/templates/wp-admin/tools/visitor-lockout.php:17 +msgid "Enable this if you want all visitors except those who are logged in as an administrator to be locked out of the front-end of your site." +msgstr "" + +#: dist/templates/wp-admin/tools/visitor-lockout.php:22 +msgid "Enter a message:" +msgstr "" + +#: dist/templates/wp-admin/tools/visitor-lockout.php:34 +msgid "Enter a message you wish to display to visitors when your site is in maintenance mode." +msgstr "" + +#: dist/templates/wp-admin/tools/visitor-lockout.php:39 +msgid "Save site lockout settings" +msgstr "" + +#: dist/templates/wp-admin/tools/whois-lookup.php:3 +msgid "The WHOIS lookup feature gives you a way to look up who owns an IP address or domain name." +msgstr "" + +#: dist/templates/wp-admin/tools/whois-lookup.php:3 +msgid "You can use this to investigate users engaging in malicious activity on your site." +msgstr "" + +#: dist/templates/wp-admin/tools/whois-lookup.php:6 +msgid "WHOIS lookup on IP or domain" +msgstr "" + +#: dist/templates/wp-admin/tools/whois-lookup.php:12 +msgid "IP address or domain name:" +msgstr "" + +#: dist/templates/wp-admin/tools/whois-lookup.php:19 +msgid "Look up IP or domain" +msgstr "" + +#: dist/templates/wp-admin/user-security/additional.php:4 +msgid "WordPress 5.6 introduced a new feature called \"Application passwords\"." +msgstr "" + +#: dist/templates/wp-admin/user-security/additional.php:5 +msgid "This allows you to create a token from the WordPress dashboard which then can be used in the authorization header." +msgstr "" + +#: dist/templates/wp-admin/user-security/additional.php:5 +msgid "This feature allows you to disable application passwords as they can leave your site vulnerable to social engineering and phishing scams." +msgstr "" + +#: dist/templates/wp-admin/user-security/additional.php:22 +msgid "Enable this if you want to disable the application password." +msgstr "" + +#: dist/templates/wp-admin/user-security/force-logout.php:4 +msgid "Setting an expiry period for your administration session is a simple way to protect against unauthorized access to your site from your computer." +msgstr "" + +#: dist/templates/wp-admin/user-security/force-logout.php:5 +msgid "This feature allows you to specify a time period in minutes after which the admin session will expire and the user will be forced to log back in." +msgstr "" + +#: dist/templates/wp-admin/user-security/force-logout.php:10 +msgid "Force user logout options" +msgstr "" + +#: dist/templates/wp-admin/user-security/force-logout.php:21 +msgid "Enable force user logout" +msgstr "" + +#: dist/templates/wp-admin/user-security/force-logout.php:24 +msgid "Enable this if you want to force a user to be logged out after a configured amount of time" +msgstr "" + +#: dist/templates/wp-admin/user-security/force-logout.php:29 +msgid "Logout the user after X minutes" +msgstr "" + +#: dist/templates/wp-admin/user-security/force-logout.php:31 +msgid "(Minutes) The user will be forced to log back in after this time period has elapased." +msgstr "" + +#: dist/templates/wp-admin/user-security/hibp.php:4 +msgid "%s (Have I Been Pwned?) is a website that allows people to check if their email or password has shown up in a data breach." +msgstr "" + +#: dist/templates/wp-admin/user-security/hibp.php:8 +msgid "HIBP password settings" +msgstr "" + +#: dist/templates/wp-admin/user-security/hibp.php:16 +msgid "Enforce on profile update" +msgstr "" + +#: dist/templates/wp-admin/user-security/hibp.php:19 +msgid "Enable this if you want to enforce passwords not being in the HIBP database when updating user profiles." +msgstr "" + +#: dist/templates/wp-admin/user-security/hibp.php:24 +msgid "Enforce on password reset" +msgstr "" + +#: dist/templates/wp-admin/user-security/hibp.php:27 +msgid "Enable this if you want to enforce passwords not being in the HIBP database when resetting passwords." +msgstr "" + +#: dist/templates/wp-admin/user-security/http-authentication.php:3 +msgid "The HTTP authentication feature gives you a way to add a login username and password to your site through the use of the WWW-Authenticate header." +msgstr "" + +#: dist/templates/wp-admin/user-security/http-authentication.php:3 +msgid "Only enable this feature for the frontend of your site if you don't want your site to be public." +msgstr "" + +#: dist/templates/wp-admin/user-security/http-authentication.php:5 +msgid "The username and password will only be secure if you're enforcing the use of TLS(https) on your site." +msgstr "" + +#: dist/templates/wp-admin/user-security/http-authentication.php:7 +msgid "Your site is currently using https." +msgstr "" + +#: dist/templates/wp-admin/user-security/http-authentication.php:22 +msgid "If you are locked out by the HTTP authentication feature, define the following constant %s in wp-config.php to disable the feature." +msgstr "" + +#: dist/templates/wp-admin/user-security/http-authentication.php:16 +msgid "HTTP authentication is currently disabled via the AIOS_DISABLE_HTTP_AUTHENTICATION constant (which is mostly likely to be defined in your wp-config.php)" +msgstr "" + +#: dist/templates/wp-admin/user-security/http-authentication.php:29 +msgid "Your web browser is already sending a username/password." +msgstr "" + +#: dist/templates/wp-admin/user-security/http-authentication.php:29 +msgid "If this is because you previously activated this feature then no action is required." +msgstr "" + +#: dist/templates/wp-admin/user-security/http-authentication.php:30 +msgid "However, if this is because you have HTTP authentication set up elsewhere, such as another plugin or at the webserver level, then this feature either shouldn't be activated, or should only be activated with the same username/password." +msgstr "" + +#: dist/templates/wp-admin/user-security/http-authentication.php:37 +msgid "HTTP authentication for WordPress dashboard and frontend" +msgstr "" + +#: dist/templates/wp-admin/user-security/http-authentication.php:46 +msgid "Enable for WordPress dashboard:" +msgstr "" + +#: dist/templates/wp-admin/user-security/http-authentication.php:50 +msgid "Check this if you want to protect the WordPress dashboard area of your site with HTTP authentication." +msgstr "" + +#: dist/templates/wp-admin/user-security/http-authentication.php:56 +msgid "Enable for frontend:" +msgstr "" + +#: dist/templates/wp-admin/user-security/http-authentication.php:60 +msgid "Check this if you want to protect the frontend of your site with HTTP authentication." +msgstr "" + +#: dist/templates/wp-admin/user-security/http-authentication.php:66 +msgid "Username:" +msgstr "" + +#: dist/templates/wp-admin/user-security/http-authentication.php:84 +msgid "%s to crack by a desktop PC according to the %s." +msgstr "" + +#: dist/templates/wp-admin/user-security/http-authentication.php:90 +msgid "Failure message:" +msgstr "" + +#: dist/templates/wp-admin/user-security/logged-in-users.php:3 +msgid "Refresh logged in user data" +msgstr "" + +#: dist/templates/wp-admin/user-security/logged-in-users.php:6, dist/templates/wp-admin/user-security/manual-approval.php:38 +msgid "Refresh data" +msgstr "" + +#: dist/templates/wp-admin/user-security/logged-in-users.php:12 +msgid "This tab displays all users who are currently logged into your site." +msgstr "" + +#: dist/templates/wp-admin/user-security/logged-in-users.php:13 +msgid "If you suspect there is a user or users who are logged in which should not be, you can block them by inspecting the IP addresses from the data below and adding them to your blacklist." +msgstr "" + +#: dist/templates/wp-admin/user-security/logged-in-users.php:14 +msgid "You can also instantly log them out by pressing on the \"Force logout\" link when you hover over the row in the user id column." +msgstr "" + +#: dist/templates/wp-admin/user-security/logged-in-users.php:19 +msgid "Currently logged in users" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:2 +msgid "Login lockout configuration" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:5 +msgid "Cookie-based brute force login prevention" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:6 +msgid "One of the ways hackers try to compromise sites is via a" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:6 +msgid "Brute force login attack" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:6 +msgid "This is where attackers use repeated login attempts until they guess the password." +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:7 +msgid "Apart from choosing strong passwords, monitoring and blocking IP addresses which are involved in repeated login failures in a short period of time is a very effective way to stop these types of attacks." +msgstr "" + +#. translators: %s: Brute force feature link. +#: dist/templates/wp-admin/user-security/login-lockout.php:9 +msgid "You may also want to checkout our %s feature for another secure way to protect against these types of attacks." +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:13 +msgid "Login lockout options" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:24 +msgid "Enable login lockout feature" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:27 +msgid "Enable this to turn on the login lockout feature" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:32 +msgid "Allow unlock requests" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:35 +msgid "Enable this if you want to allow users to generate an automated unlock request link which will unlock their account" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:40 +msgid "Max login attempts" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:42 +msgid "Set the value for the maximum login retries before IP address is locked out" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:46 +msgid "Login retry time period (min)" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:48 +msgid "If the maximum number of failed login attempts for a particular IP address occur within this time period the plugin will lock out that address" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:53 +msgid "Minimum lockout time length" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:59 +msgid "Set the minimum time period in minutes of lockout." +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:59 +msgid "This failed login lockout time will be tripled on each failed login." +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:66 +msgid "Maximum lockout time length" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:71 +msgid "Set the maximum time period in minutes of lockout." +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:71 +msgid "No IP address will be blocked for more than this time period after making a failed login attempt." +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:76 +msgid "Display generic error message" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:79 +msgid "Enable this if you want to show a generic error message when a login attempt fails" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:84 +msgid "Instantly lockout invalid usernames" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:87 +msgid "Enable this if you want to instantly lockout login attempts with usernames which do not exist on your system" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:93 +msgid "Instantly lockout specific usernames" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:103 +msgid "Insert one username per line." +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:103 +msgid "Existing usernames are not blocked even if present in the list." +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:108 +msgid "Notify by email" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:112 +msgid "Enable this if you want to receive an email when someone has been locked out due to maximum failed login attempts" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:116 +msgid "Fill in one email address per line." +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:120 +msgid "Each email address must be on a new line." +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:121 +msgid "If a valid email address has not been filled in, it will not be saved." +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:122 +msgid "The valid email address format is userid@example.com" +msgstr "" + +#. translators: %s: Email example. +#: dist/templates/wp-admin/user-security/login-lockout.php:124 +msgid "Example: %s" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:131 +msgid "Enable PHP backtrace in email" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:135 +msgid "Enable this if you want to include the PHP backtrace in notification emails." +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:147 +msgid "Currently locked out IP address ranges" +msgstr "" + +#. translators: %s: Locked IP link. +#: dist/templates/wp-admin/user-security/login-lockout.php:153 +msgid "To see a list of all locked IP addresses and ranges go to the %s tab in the dashboard menu." +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:159 +msgid "Login lockout IP whitelist settings" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:170 +msgid "Enable login lockout IP whitelist" +msgstr "" + +#: dist/templates/wp-admin/user-security/login-lockout.php:179 +msgid "The addresses specified here will never be blocked by the login lockout feature." +msgstr "" + +#: dist/templates/wp-admin/user-security/manual-approval.php:2 +msgid "User registration settings" +msgstr "" + +#: dist/templates/wp-admin/user-security/manual-approval.php:4 +msgid "Manually approve new registrations" +msgstr "" + +#: dist/templates/wp-admin/user-security/manual-approval.php:8 +msgid "If your site allows people to create their own accounts via the WordPress registration form, then you can minimize spam or bogus registrations by manually approving each registration." +msgstr "" + +#: dist/templates/wp-admin/user-security/manual-approval.php:9 +msgid "This feature will automatically set a newly registered account to \"pending\" until the administrator activates it." +msgstr "" + +#: dist/templates/wp-admin/user-security/manual-approval.php:9 +msgid "Therefore undesirable registrants will be unable to log in without your express approval." +msgstr "" + +#: dist/templates/wp-admin/user-security/manual-approval.php:10 +msgid "You can view all accounts which have been newly registered via the handy table below and you can also perform bulk activation/deactivation/deletion tasks on each account." +msgstr "" + +#: dist/templates/wp-admin/user-security/manual-approval.php:22 +msgid "Enable manual approval of new registrations" +msgstr "" + +#: dist/templates/wp-admin/user-security/manual-approval.php:25 +msgid "Enable this if you want to automatically disable all newly registered accounts so that you can approve them manually." +msgstr "" + +#: dist/templates/wp-admin/user-security/manual-approval.php:35 +msgid "Refresh manual approval data" +msgstr "" + +#: dist/templates/wp-admin/user-security/manual-approval.php:43 +msgid "Approve registered users" +msgstr "" + +#: dist/templates/wp-admin/user-security/salt.php:4 +msgid "Add salt postfix" +msgstr "" + +#: dist/templates/wp-admin/user-security/salt.php:15 +msgid "WordPress \"salts\" are secret phrases which are combined with user passwords when those passwords are stored, with the end result that they become much harder for an attacker to crack even if he managed to steal the database of your website." +msgstr "" + +#: dist/templates/wp-admin/user-security/salt.php:15 +msgid "Learn more about WordPress Salts." +msgstr "" + +#: dist/templates/wp-admin/user-security/salt.php:21 +msgid "When you enable this feature, you and all other logged-in users will be logged out so that AIOS can append the additional code (the salt) to all users’ login information." +msgstr "" + +#: dist/templates/wp-admin/user-security/salt.php:35 +msgid "Enable this if you want to activate the salt postfix feature." +msgstr "" + +#: dist/templates/wp-admin/user-security/salt.php:39 +msgid "This setting will suffix the salt with an additional 64 characters." +msgstr "" + +#: dist/templates/wp-admin/user-security/salt.php:39 +msgid "It improves your WordPress site's cryptographic mechanism." +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:196 +msgid "Updating..." +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:209 +msgid "(update)" +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:223, dist/includes/simba-tfa/providers/totp/loader.php:573 +msgid "TOTP (time based - most common algorithm; used by Google Authenticator)" +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:224, dist/includes/simba-tfa/providers/totp/loader.php:573 +msgid "HOTP (event based)" +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:254 +msgid "Choose which algorithm for One Time Passwords you want to use." +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:260 +msgid "Your counter on the server is currently on" +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:343 +msgid "Warning: if you reset this key you will have to update your apps with the new one. Are you sure you want this?" +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:343, dist/includes/simba-tfa/providers/totp/loader.php:436 +msgid "Reset private key" +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:376 +msgid "Current codes (login: %s)" +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:395, dist/includes/simba-tfa/providers/totp/loader.php:384 +msgid "Current one-time password" +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:413 +msgid "Setting up" +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:410 +msgid "Setting up - either scan the code, or type in the private key" +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:419 +msgid "For OTP apps that support using a camera to scan a setup code (below), that is the quickest way to set the app up (e.g. with Duo Mobile, Google Authenticator)." +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:421 +msgid "Otherwise, you can type the textual private key (shown below) into your app. Always keep private keys secret." +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:424 +msgid "You are currently using %s, %s" +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:424 +msgid "a time based algorithm" +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:424 +msgid "an event based algorithm" +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:448 +msgid "One-time emergency codes are a feature of the Premium version of this plugin." +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:524 +msgid "Two Factor Authentication re-sync needed" +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:526 +msgid "You need to resync your device for Two Factor Authentication since the OTP you last used is many steps ahead of the server." +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:528 +msgid "Please re-sync or you might not be able to log in if you generate more OTPs without logging in." +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:530 +msgid "Click here and re-scan the QR-Code" +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:732 +msgid "Encrypt secrets feature not enabled: unable to get private keys from the database." +msgstr "" + +#: dist/includes/simba-tfa/providers/totp/loader.php:807 +msgid "There are no emergency codes left. You will need to reset your private key to generate new ones." +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/cookie-test-container.php:4 +msgid "Before using this feature, you must perform a cookie test first." +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/cookie-test-container.php:6 +msgid "This ensures that your browser cookie is working correctly and that you won't lock yourself out." +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/cookie-test-container.php:11 +msgid "Perform cookie test" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/other-plugins.php:3 +msgid "Other forms CAPTCHA settings" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/other-plugins.php:14 +msgid "Enable CAPTCHA on BuddyPress registration form" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/other-plugins.php:17 +msgid "Enable this if you want to insert a CAPTCHA field on the %s registration forms." +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/other-plugins.php:34 +msgid "Enable CAPTCHA on bbPress new topic form" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/other-plugins.php:37 +msgid "Enable this if you want to insert a CAPTCHA field on the %s new topic forms." +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/other-plugins.php:54 +msgid "Enable CAPTCHA on %s" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/other-plugins.php:57 +msgid "Enable this if you want to insert a CAPTCHA field on %s forms." +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/other-plugins.php:61 +msgid "%s will automatically try to insert a CAPTCHA field before the form's submit button" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/other-plugins.php:62 +msgid "For the exact placement of the CAPTCHA you can use the following shortcode in your %s template" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/other-plugins.php:64 +msgid "This feature requires %s version %s or greater" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/other-plugins.php:65 +msgid "The validation message will be displayed only when using %s version %s or greater" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/rename-login-notice.php:5 +msgid "Your WordPress login page URL has been renamed." +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/rename-login-notice.php:6 +msgid "Your current login URL is:" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/woo-captcha.php:3 +msgid "WooCommerce forms CAPTCHA settings" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/woo-captcha.php:14 +msgid "Enable CAPTCHA on WooCommerce login form" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/woo-captcha.php:17 +msgid "Enable this if you want to insert CAPTCHA on a %s login form." +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/woo-captcha.php:30 +msgid "Enable CAPTCHA on WooCommerce lost password form" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/woo-captcha.php:33 +msgid "Enable this if you want to insert CAPTCHA on a %s lost password form." +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/woo-captcha.php:46 +msgid "Enable CAPTCHA on WooCommerce registration form" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/woo-captcha.php:49 +msgid "Enable this if you want to insert CAPTCHA on a %s registration form." +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/woo-captcha.php:69 +msgid "Guest checkout allows a customer to place an order without an account or being logged in." +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/woo-captcha.php:66 +msgid "Guest checkout is not enabled in your WooCommerce settings." +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/woo-captcha.php:66 +msgid "Therefore, the setting below is not relevant." +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/woo-captcha.php:76 +msgid "Enable CAPTCHA on the WooCommerce checkout page" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/woo-captcha.php:79 +msgid "Enable this if you want to insert a CAPTCHA on the %s checkout page when a guest places an order." +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/wordpress-forms.php:3 +msgid "Wordpress forms CAPTCHA settings" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/wordpress-forms.php:13 +msgid "Enable CAPTCHA on login page" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/wordpress-forms.php:16 +msgid "Enable this if you want to insert a CAPTCHA form on the login page." +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/wordpress-forms.php:31 +msgid "Enable CAPTCHA on registration page" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/wordpress-forms.php:34 +msgid "Enable this if you want to insert a CAPTCHA form on the WordPress user registration page (if you allow user registration)." +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/wordpress-forms.php:50 +msgid "Enable CAPTCHA on lost password page" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/wordpress-forms.php:53 +msgid "Enable this if you want to insert a CAPTCHA form on the lost password page." +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/wordpress-forms.php:69 +msgid "Enable CAPTCHA on custom login form" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/wordpress-forms.php:72 +msgid "Enable this if you want to insert CAPTCHA on a custom login form generated by the following WP function: %s" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/wordpress-forms.php:87 +msgid "Enable CAPTCHA on comment forms" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/wordpress-forms.php:90 +msgid "Enable this if you want to insert a CAPTCHA field on the comment forms." +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/wordpress-forms.php:105 +msgid "Enable CAPTCHA on password protected pages/posts" +msgstr "" + +#: dist/templates/wp-admin/brute-force/partials/wordpress-forms.php:108 +msgid "Enable this if you want to insert a CAPTCHA field on password-protected posts and pages." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/partials/php-file-editing.php:7 +msgid "The WordPress Dashboard by default allows administrators to edit PHP files, such as plugin and theme files." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/partials/php-file-editing.php:7 +msgid "This is often the first tool an attacker will use if able to login, since it allows code execution." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/partials/php-file-editing.php:7 +msgid "This feature will disable the ability for people to edit PHP files via the dashboard." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/partials/php-file-editing.php:16 +msgid "The DISALLOW_FILE_EDIT constant has already been defined, please remove it before enabling this feature." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/partials/php-file-editing.php:16 +msgid "The constant is likely already defined in your wp-config.php file." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/partials/php-file-editing.php:22 +msgid "Disable ability to edit PHP files" +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/partials/php-file-editing.php:25 +msgid "Enable this to remove the ability for people to edit PHP files via the WP dashboard" +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/partials/prevent-hotlinks.php:7 +msgid "A hotlink is where someone displays an image on their site which is actually located on your site by using a direct link to the source of the image on your server." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/partials/prevent-hotlinks.php:8 +msgid "Due to the fact that the image being displayed on the other person's site is coming from your server, this can cause leaking of bandwidth and resources for you because your server has to present this image for the people viewing it on someone elses's site." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/partials/prevent-hotlinks.php:9 +msgid "This feature will prevent people from directly hotlinking images from your site's pages by writing some directives in your .htaccess file." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/partials/prevent-hotlinks.php:23 +msgid "Enable this to prevent hotlinking to images on your site." +msgstr "" + +#. translators: 1: readme.txt, 2: license text, 3: wp-config-sample.php +#: dist/templates/wp-admin/filesystem-security/partials/wp-file-access.php:8 +msgid "This feature allows you to auto delete files such as %1$s, %2$s and %3$s which are delivered with all WP installations." +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/partials/wp-file-access.php:10 +msgid "By deleting these files you are hiding some key pieces of information (such as WordPress version info) from potential hackers." +msgstr "" + +#. translators: 1: readme.txt, 2: license text, 3: wp-config-sample.php +#: dist/templates/wp-admin/filesystem-security/partials/wp-file-access.php:23 +msgid "Delete %1$s, %2$s, and %3$s:" +msgstr "" + +#: dist/templates/wp-admin/filesystem-security/partials/wp-file-access.php:28 +msgid "Automatically delete the files after a WP core update." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-character-filter.php:13 +msgid "Enable advanced character string filter" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-character-filter.php:16 +msgid "This will block character sequences which resemble XSS attacks." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-character-filter.php:21 +msgid "This is an advanced character string filter to prevent malicious string attacks on your site coming from Cross Site Scripting (XSS)." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-character-filter.php:22 +msgid "This setting matches for common malicious string patterns and exploits and will produce a 403 error for the hacker attempting the query." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-character-filter.php:23 +msgid "NOTE: Some strings for this setting might break some functionality." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:2 +msgid "Block request methods" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:3 +msgid "HTTP request methods are used by browsers and clients to communicate with servers to get responses." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:3 +msgid "The below request methods are not necessary for every site to function and you may disable all HTTP request methods that are not essential for your site to function." +msgstr "" + +#. translators: %s: Block method +#: dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:11 +msgid "Block %s method" +msgstr "" + +#. translators: %s: Block request method +#: dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:15 +msgid "Check this to block the %s request method" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:20 +msgid "Some WooCommerce extensions use the PUT request method in addition to GET and POST." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:20 +msgid "This means WooCommerce users shouldn't block the PUT request method." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:21 +msgid "A few REST requests use the PUT request method." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:21 +msgid "If your site is communicated by the WP REST API, you should not block the PUT request method." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:31 +msgid "Other settings" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:32 +msgid "The 6G firewall provides other settings for blocking malicious query strings, request strings, referers and user-agents; you can configure their settings below." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:38 +msgid "Block query strings" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:41 +msgid "Enable this to block all query strings recommended by 6G" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:46 +msgid "Block request strings" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:49 +msgid "Enable this to block all request strings recommended by 6G" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:54 +msgid "Block referers" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:57 +msgid "Enable this to block all referers recommended by 6G" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:62 +msgid "Block user-agents" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/advanced-settings-6g.php:65 +msgid "Enable this to block all user-agents recommended by 6G" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/allowlist.php:2 +msgid "Allow list" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/allowlist.php:6 +msgid "This option allows you to add IP addresses to your allow list." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/allowlist.php:7 +msgid "All IPs in your allow list will no longer be affected by the firewall's rules." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/allowlist.php:16 +msgid "Save allow list" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/bad-query-strings.php:3 +msgid "Bad query strings" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/bad-query-strings.php:16 +msgid "This will help protect you against malicious queries via XSS." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/bad-query-strings.php:21 +msgid "This feature will prevent malicious string attacks on your site using XSS." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/bad-query-strings.php:22 +msgid "NOTE: Some of these strings might be used for plugins or themes and hence this might break some functionality." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/basic-firewall-settings.php:13 +msgid "Enable basic firewall protection" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/basic-firewall-settings.php:16 +msgid "Enable this to apply basic firewall protection to your site." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/basic-firewall-settings.php:20 +msgid "This setting will implement the following basic firewall protection mechanisms on your site:" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/basic-firewall-settings.php:21 +msgid "1) Protect your htaccess file by denying access to it." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/basic-firewall-settings.php:22 +msgid "2) Disable the server signature." +msgstr "" + +#. translators: %s: Upload limit. +#: dist/templates/wp-admin/firewall/partials/basic-firewall-settings.php:24 +msgid "3) Limit file upload size (%sMB)." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/basic-firewall-settings.php:25 +msgid "4) Protect your wp-config.php file by denying access to it." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/basic-firewall-settings.php:26 +msgid "The above firewall features will be applied via your .htaccess file and should not affect your site's overall functionality." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/basic-firewall-settings.php:27 +msgid "You are still advised to take a backup of your active .htaccess file just in case." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/basic-firewall-settings.php:34 +msgid "Max file upload size (MB)" +msgstr "" + +#. translators: %s: Upload limit. +#: dist/templates/wp-admin/firewall/partials/basic-firewall-settings.php:37 +msgid "The value for the maximum file upload size used in the .htaccess file. (Defaults to %sMB if left blank)" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/blank-ref-and-useragent.php:13 +msgid "Ban POST requests that have a blank user-agent and referer" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/blank-ref-and-useragent.php:16 +msgid "Enable this if you want to ban POST requests that have a blank user-agent and referer." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/blank-ref-and-useragent.php:20 +msgid "This feature will check whether the user-agent and referer HTTP headers are blank." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/blank-ref-and-useragent.php:21 +msgid "If they are both blank, the IP address associated with the request will be added to your permanent block list." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/block-debug-log.php:14 +msgid "Block access to debug.log file" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/block-debug-log.php:17 +msgid "Enable this if you want to block access to the debug.log file that WordPress creates when debug logging is enabled." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/block-debug-log.php:21 +msgid "WordPress has an option to turn on the debug logging to a file located in wp-content/debug.log." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/block-debug-log.php:21 +msgid "This file may contain sensitive information." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/block-debug-log.php:22 +msgid "Using this option will block external access to this file." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/block-debug-log.php:22 +msgid "You can still access this file by logging into your site via FTP." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/disable-rss-atom.php:3 +msgid "Disable WordPress RSS and ATOM feeds" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/disable-rss-atom.php:13 +msgid "Disable RSS and ATOM feeds:" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/disable-rss-atom.php:16 +msgid "Enable this if you do not want users using feeds." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/disable-rss-atom.php:16 +msgid "RSS and ATOM feeds are used to read content from your site." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/disable-rss-atom.php:20 +msgid "Most users will want to share their site content widely, but some may prefer to prevent automated site scraping." +msgstr "" + +#. translators: %s: FAQ URL. +#: dist/templates/wp-admin/firewall/partials/disable-rss-atom.php:22 +msgid "For more information, check the %s" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/disable-rss-atom.php:22 +msgid "documentation" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/disable-trace.php:3 +msgid "Trace and track" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/disable-trace.php:17 +msgid "Enable this to disable trace and track." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/disable-trace.php:22 +msgid "HTTP Trace attack (XST) can be used to return header requests and grab cookies and other information." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/disable-trace.php:24 +msgid "This hacking technique is usually used together with cross site scripting attacks (XSS)." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/disable-trace.php:26 +msgid "Disabling trace and track on your site will help prevent HTTP Trace attacks." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/fake-googlebots.php:4 +msgid "This feature allows you to block bots which are impersonating as a Googlebot but actually aren't. (In other words they are fake Google bots)" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/fake-googlebots.php:5 +msgid "Googlebots have a unique identity which cannot easily be forged and this feature will identify any fake Google bots and block them from reading your site's pages." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/fake-googlebots.php:12 +msgid "Sometimes non-malicious Internet organizations might have bots which impersonate as a \"Googlebot\"." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/fake-googlebots.php:13 +msgid "Just be aware that if you activate this feature the plugin will block all bots which use the \"Googlebot\" string in their User Agent information but are NOT officially from Google (irrespective of whether they are malicious or not)." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/fake-googlebots.php:14 +msgid "All other bots from other organizations such as \"Yahoo\", \"Bing\" etc will not be affected by this feature." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/fake-googlebots.php:32 +msgid "Enable this if you want to block all fake Googlebots." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/fake-googlebots.php:36 +msgid "This feature will check if the User Agent information of a bot contains the string \"Googlebot\"." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/fake-googlebots.php:37 +msgid "It will then perform a few tests to verify if the bot is legitimately from Google and if so it will allow the bot to proceed." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/fake-googlebots.php:38 +msgid "If the bot fails the checks then the plugin will mark it as being a fake Googlebot and it will block it" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/firewall-downgrade-button.php:4, dist/templates/wp-admin/firewall/partials/firewall-setup.php:22 +msgid "Downgrade firewall" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/firewall-set-up-button.php:4, dist/templates/wp-admin/firewall/partials/firewall-setup.php:20 +msgid "Set up firewall" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/firewall-setup.php:3 +msgid "Firewall setup" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/firewall-setup.php:7 +msgid "This option allows you to set up or downgrade the firewall." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/firewall-setup.php:8 +msgid "We recommend you set up the firewall for greater protection, but if for whatever reason you wish to downgrade the firewall, then you can do so here." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/firewall-setup.php:20 +msgid "This will attempt to set up the firewall in order to give you the highest level of protection it has to offer." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/firewall-setup.php:22 +msgid "This will undo the changes performed by the set-up mechanism." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/firewall-setup.php:24 +msgid "The firewall will still be active if it is downgraded or not set up, but you will have reduced protection." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/internet-bots.php:8 +msgid "What is an Internet Bot" +msgstr "" + +#. translators: s%: Wiki URL. +#: dist/templates/wp-admin/firewall/partials/internet-bots.php:10 +msgid "%s?" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/internet-bots.php:12 +msgid "A bot is a piece of software which runs on the Internet and performs automatic tasks." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/internet-bots.php:12 +msgid "For example when Google indexes your pages it uses bots to achieve this task." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/internet-bots.php:13 +msgid "A lot of bots are legitimate and non-malicious but not all bots are good and often you will find some which try to impersonate legitimate bots such as \"Googlebot\" but in reality they have nohing to do with Google at all." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/internet-bots.php:14 +msgid "Although most of the bots out there are relatively harmless sometimes website owners want to have more control over which bots they allow into their site." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/listing-directory-contents.php:3 +msgid "Listing of directory contents" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/listing-directory-contents.php:17 +msgid "Enable this if you want to disable directory and file listing." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/listing-directory-contents.php:22 +msgid "By default, an Apache server will allow the listing of the contents of a directory if it doesn't contain an index.php file." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/listing-directory-contents.php:24 +msgid "This feature will prevent the listing of contents for all directories." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/listing-directory-contents.php:26 +msgid "NOTE: In order for this feature to work \"AllowOverride\" of the Indexes directive must be enabled in your httpd.conf file." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/listing-directory-contents.php:26 +msgid "Ask your hosting provider to check this if you don't have access to httpd.conf" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/ng.php:4 +msgid "6G firewall settings" +msgstr "" + +#. translators: 1: 8G URL, 2: 5G URL, 3: Perishable Press URL +#: dist/templates/wp-admin/firewall/partials/ng.php:9 +msgid "This feature allows you to activate the %1$s (or legacy %2$s) firewall security protection rules designed and produced by %3$s." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/ng.php:10 +msgid "The 6G firewall is an updated and improved version of the 5G firewall that is PHP-based and doesn't use a .htaccess file." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/ng.php:10 +msgid "If you have the 5G firewall active, you might consider activating the 6G firewall instead." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/ng.php:11 +msgid "The 6G firewall is a simple, flexible blacklist that helps reduce the number of malicious URL requests that hit your website." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/ng.php:12 +msgid "The added advantage of applying the 6G firewall to your site is that it has been tested and confirmed by the people at PerishablePress.com to be an optimal and least disruptive set of security rules for general WP sites." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/ng.php:25 +msgid "Enable 6G firewall protection" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/ng.php:28 +msgid "Enable this to apply the recommended 6G firewall protection." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/ng.php:32 +msgid "This setting will implement the 6G security firewall protection mechanisms on your site which include the following things:" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/ng.php:47 +msgid "Show advanced options" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/ng.php:48 +msgid "Hide advanced options" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/proxy-comment.php:3 +msgid "Proxy comment posting" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/proxy-comment.php:16 +msgid "Enable this if you want to forbid proxy comment posting." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/proxy-comment.php:21 +msgid "This setting will deny any requests that use a proxy server when posting comments." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/proxy-comment.php:22 +msgid "By forbidding proxy comments you are in effect eliminating some spam and other proxy requests." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/rest-route-whitelist.php:3 +msgid "%s this REST route allows websites to display core content, such as posts, pages, and other WordPress data." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/rest-route-whitelist.php:3 +msgid "This route is essential for the WordPress block editor and API integrations." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/rest-route-whitelist.php:3 +msgid "Disabling it may break plugins and themes." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/rest-route-whitelist.php:4 +msgid "%s this REST route enables embedding content from your site on external platforms (e.g., Twitter, Facebook, and WordPress embeds)." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/rest-route-whitelist.php:4 +msgid "Disabling this may prevent your site's content from being embedded in social media and other platforms." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/rest-route-whitelist.php:10 +msgid "Whitelist REST routes" +msgstr "" + +#. translators: 1: Bold unsafe function name, 2: Bold safe function name. +#: dist/templates/wp-admin/firewall/partials/upgrade-unsafe-http-calls.php:15 +msgid "This feature allows you to upgrade all unsafe HTTP calls on your site using %1$s to %2$s." +msgstr "" + +#. translators: %s Bold unsafe function name. +#: dist/templates/wp-admin/firewall/partials/upgrade-unsafe-http-calls.php:17 +msgid "You can also specify a list of URLs that are allowed to be contacted with the unsafe %s calls." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/upgrade-unsafe-http-calls.php:22 +msgid "Enable" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/upgrade-unsafe-http-calls.php:30 +msgid "URL exceptions" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/upgrade-unsafe-http-calls.php:34 +msgid "Enter URL exceptions." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/upgrade-unsafe-http-calls.php:38 +msgid "Each URL must be on a new line." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/upgrade-unsafe-http-calls.php:39 +msgid "All localhost URLs are already an exception." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/wp-rest-api.php:7 +msgid "WP REST API settings" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/wp-rest-api.php:18 +msgid "This feature allows you to block WordPress REST API access for unauthorized requests." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/wp-rest-api.php:19 +msgid "When enabled this feature will only allow REST requests to be processed if the user is logged in." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/wp-rest-api.php:20 +msgid "Only REST requests made by logged-in users with a role permitted below will succeed, unless the REST API endpoint has been white-listed for others to also use." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/wp-rest-api.php:21 +msgid "You can whitelist REST routes by selecting from the list of all registered rest routes for all users, including those who are not logged in." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/wp-rest-api.php:28 +msgid "You do not have any registered REST API routes to block unauthorized access." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/wp-rest-api.php:38 +msgid "Enable this to stop REST API access for non-logged in requests." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/wp-rest-api.php:43 +msgid "User roles allowed access when logged in" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-pingback-protection.php:3 +msgid "WordPress XMLRPC and pingback vulnerability protection" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-pingback-protection.php:14 +msgid "Completely block access to XMLRPC" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-pingback-protection.php:17 +msgid "Enable this if you are not using the WP XML-RPC functionality and you want to completely block external access to XMLRPC." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-pingback-protection.php:21 +msgid "This setting will disable access to the WordPress xmlrpc.php file which is responsible for the XML-RPC functionality in WordPress." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-pingback-protection.php:22 +msgid "Hackers can exploit various vulnerabilities in the WordPress XML-RPC API in a number of ways such as:" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-pingback-protection.php:23 +msgid "1) Denial of Service (DoS) attacks" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-pingback-protection.php:24 +msgid "2) Hacking internal routers." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-pingback-protection.php:25 +msgid "3) Scanning ports in internal networks to get info from various hosts." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-pingback-protection.php:26 +msgid "Apart from the security protection benefit, this feature may also help reduce load on your server, particularly if your site currently has a lot of unwanted traffic hitting the XML-RPC API on your installation." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-pingback-protection.php:27 +msgid "NOTE: You should only enable this feature if you are not currently using the XML-RPC functionality on your WordPress installation." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-pingback-protection.php:28 +msgid "Leave this feature disabled and use the feature below if you want pingback protection but you still need XMLRPC." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-pingback-protection.php:35 +msgid "Disable pingback functionality from XMLRPC" +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-pingback-protection.php:38 +msgid "If you use Jetpack or WP iOS or other apps which need WP XML-RPC functionality then check this." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-pingback-protection.php:38 +msgid "This will enable protection against WordPress pingback vulnerabilities." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-pingback-protection.php:42 +msgid "NOTE: If you use Jetpack or the Wordpress iOS or other apps then you should enable this feature but leave the \"Completely Block Access To XMLRPC\" checkbox unchecked." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-pingback-protection.php:43 +msgid "The feature will still allow XMLRPC functionality on your site but will disable the pingback methods." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-pingback-protection.php:44 +msgid "This feature will also remove the \"X-Pingback\" header if it is present." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-warning-notice.php:6 +msgid "You have enabled the \"Completely Block Access To XMLRPC\" checkbox which means all XMLRPC functionality will be blocked." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-warning-notice.php:7 +msgid "By leaving this feature enabled you will prevent Jetpack or Wordpress iOS or other apps which need XMLRPC from working correctly on your site." +msgstr "" + +#: dist/templates/wp-admin/firewall/partials/xmlrpc-warning-notice.php:8 +msgid "If you still need XMLRPC then uncheck the \"Completely Block Access To XMLRPC\" checkbox and enable only the \"Disable Pingback Functionality From XMLRPC\" checkbox." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/display-name.php:2 +msgid "Display name security" +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/display-name.php:5 +msgid "When you submit a post or answer a comment, WordPress will usually display your \"nickname\"." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/display-name.php:6 +msgid "By default the nickname is set to the login (or user) name of your account." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/display-name.php:7 +msgid "From a security perspective, leaving your nickname the same as your user name is bad practice because it gives a hacker at least half of your account's login credentials." +msgstr "" + +#. translators: 1. Open strong tag, 2. Close strong tag. +#: dist/templates/wp-admin/user-security/partials/display-name.php:9 +msgid "Therefore to further tighten your site's security you are advised to change your %1$snickname%2$s and %1$sDisplay name%2$s to be different from your %1$sUsername%2$s." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/display-name.php:14 +msgid "Modify accounts with identical login name and display name" +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/display-name.php:37, dist/templates/wp-admin/user-security/partials/wp-username-content.php:21 +msgid "No action required." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/display-name.php:37 +msgid "Your site does not have a user account where the display name is identical to the username." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/display-name.php:22 +msgid "Your site currently has the following accounts with identical login and display names." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/display-name.php:22 +msgid "Follow the link to edit the user profile of that particular user account, change Nickname, choose a different Display name compared to Username, and press the \"Update Profile\" button." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/enforce-strong-password.php:3, dist/templates/wp-admin/user-security/partials/enforce-strong-password.php:19 +msgid "Enforce strong password" +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/enforce-strong-password.php:13 +msgid "This feature allows you to enforce the use of strong user passwords" +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/enforce-strong-password.php:14 +msgid "When enabled, this feature will hide the \"confirm weak password\" checkbox on forms." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/enforce-strong-password.php:22 +msgid "Enable this if you want to force your users to use a strong password." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/user-enumeration.php:3 +msgid "Prevent user enumeration" +msgstr "" + +#. translators: 1: Author example, 2: REST API prefix. +#: dist/templates/wp-admin/user-security/partials/user-enumeration.php:14 +msgid "This feature allows you to prevent external users/bots from fetching the user info with URLs like \"%1$s\", \"%2$s\", oEmbed request." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/user-enumeration.php:15 +msgid "When enabled, this feature will print a \"forbidden\" error rather than the user information." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/user-enumeration.php:20 +msgid "Disable user enumeration" +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/user-enumeration.php:23 +msgid "Enable this if you want to stop user enumeration." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/wp-username-content.php:23 +msgid "Your site does not have any account which uses the \"admin\" username." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/wp-username-content.php:24 +msgid "This is good security practice." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/wp-username-content.php:3 +msgid "Your site currently has an account which uses the \"admin\" username." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/wp-username-content.php:3 +msgid "It is highly recommended that you change this name to something else." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/wp-username-content.php:3 +msgid "Use the following field to change the admin username." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/wp-username-content.php:8 +msgid "New admin username" +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/wp-username-content.php:10 +msgid "Choose a new username for admin." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/wp-username-content.php:14 +msgid "Change username" +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/wp-username-content.php:16 +msgid "NOTE: If you are currently logged in as \"admin\" you will be automatically logged out after changing your username and will be required to log back in." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/wp-username.php:2 +msgid "Admin user security" +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/wp-username.php:5 +msgid "Depending on how you installed WordPress, you could have a default administrator with the username \"admin\"." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/wp-username.php:6 +msgid "Hackers can try to take advantage of this information by attempting \"Brute force login attacks\" where they repeatedly try to guess the password by using \"admin\" for username." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/wp-username.php:7 +msgid "From a security perspective, changing the username \"admin\" is one of the first and smartest things you should do on your site." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/wp-username.php:8 +msgid "This feature will allow you to change your \"admin\" username to a more secure name of your choosing." +msgstr "" + +#: dist/templates/wp-admin/user-security/partials/wp-username.php:14 +msgid "List of administrator accounts" +msgstr "" diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/index.html b/wp-content/plugins/all-in-one-wp-security-and-firewall/languages/index.html new file mode 100755 index 00000000..e69de29b diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/lib/index.html b/wp-content/plugins/all-in-one-wp-security-and-firewall/lib/index.html new file mode 100755 index 00000000..e69de29b diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/license.txt b/wp-content/plugins/all-in-one-wp-security-and-firewall/license.txt new file mode 100755 index 00000000..7dc2abcc --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/license.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright © 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright © + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright © + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/logs/index.html b/wp-content/plugins/all-in-one-wp-security-and-firewall/logs/index.html new file mode 100755 index 00000000..e69de29b diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/logs/wp-security-log-cron-job.txt b/wp-content/plugins/all-in-one-wp-security-and-firewall/logs/wp-security-log-cron-job.txt new file mode 100755 index 00000000..e69de29b diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/logs/wp-security-log.txt b/wp-content/plugins/all-in-one-wp-security-and-firewall/logs/wp-security-log.txt new file mode 100755 index 00000000..e69de29b diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/other-includes/index.html b/wp-content/plugins/all-in-one-wp-security-and-firewall/other-includes/index.html new file mode 100755 index 00000000..e69de29b diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/other-includes/wp-security-rename-login-feature-pre-5-2.php b/wp-content/plugins/all-in-one-wp-security-and-firewall/other-includes/wp-security-rename-login-feature-pre-5-2.php new file mode 100755 index 00000000..a54f1705 --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/other-includes/wp-security-rename-login-feature-pre-5-2.php @@ -0,0 +1,1138 @@ +` element. + * Default 'Log In'. + * @param string $message Optional. Message to display in header. Default empty. + * @param WP_Error $wp_error Optional. The error to pass. Default empty. + */ +function login_header($title = 'Log In', $message = '', $wp_error = '') { +global $error, $interim_login, $action; + +// Don't index any of these forms +add_action('login_head', 'wp_no_robots'); + +add_action('login_head', 'wp_login_viewport_meta'); + +if (empty($wp_error)) + $wp_error = new WP_Error(); + +// Shake it! +$shake_error_codes = array('empty_password', 'empty_email', 'invalid_email', 'invalidcombo', 'empty_username', 'invalid_username', 'incorrect_password'); +/** + * Filter the error codes array for shaking the login form. + * + * @since 3.0.0 + * + * @param array $shake_error_codes Error codes that shake the login form. + */ +$shake_error_codes = apply_filters('shake_error_codes', $shake_error_codes); + +if ($shake_error_codes && $wp_error->get_error_code() && in_array($wp_error->get_error_code(), $shake_error_codes)) + add_action('login_head', 'wp_shake_js', 12); + +$login_title = get_bloginfo('name', 'display'); + +/* translators: Login screen title. 1: Login screen name, 2: Network or site name */ +$login_title = sprintf(__('%1$s ‹ %2$s — WordPress'), $title, $login_title); + +/** + * Filters the title tag content for login page. + * + * @since 4.9.0 + * + * @param string $login_title The page title, with extra context added. + * @param string $title The original page title. + */ +$login_title = apply_filters('login_title', $login_title, $title); + +?> + + +> + + + + <?php echo esc_html($login_title); ?> + get_error_code()) { + ?> + + site_name; + } else { + $login_header_url = __('https://wordpress.org/'); + $login_header_title = __('Powered by WordPress'); + } + + /** + * Filter link URL of the header logo above login form. + * + * @since 2.1.0 + * + * @param string $login_header_url Login header logo URL. + */ + $login_header_url = apply_filters('login_headerurl', $login_header_url); + + /** + * Filter the title attribute of the header logo above login form. + * + * @since 2.1.0 + * + * @param string $login_header_title Login header logo title attribute. + */ + $login_header_title = apply_filters('login_headertitle', $login_header_title); + + /* + * To match the URL/title set above, Multisite sites have the blog name, + * while single sites get the header title. + */ + if (is_multisite()) { + $login_header_text = get_bloginfo('name', 'display'); + } else { + $login_header_text = $login_header_title; + } + + $classes = array('login-action-' . $action, 'wp-core-ui'); + if (is_rtl()) + $classes[] = 'rtl'; + if ($interim_login) { + $classes[] = 'interim-login'; + ?> + + + + + +
            +

            + add('error', $error); + unset($error); + } + + if ($wp_error->get_error_code()) { + $errors = ''; + $messages = ''; + foreach ($wp_error->get_error_codes() as $code) { + $severity = $wp_error->get_error_data($code); + foreach ($wp_error->get_error_messages($code) as $error_message) { + if ('message' == $severity) { + $messages .= ' ' . $error_message . "
            \n"; + } else { + $errors .= ' ' . $error_message . "
            \n"; + } + } + } + if (! empty($errors)) { + /** + * Filter the error messages displayed above the login form. + * + * @since 2.1.0 + * + * @param string $errors Login error message. + */ + echo '
            ' . wp_kses_post(apply_filters('login_errors', $errors)) . "
            \n"; + } + if (! empty($messages)) { + /** + * Filter instructional messages displayed above the login form. + * + * @since 2.5.0 + * + * @param string $messages Login messages. + */ + echo '

            ' . wp_kses_post(apply_filters('login_messages', $messages)) . "

            \n"; + } + } + } // End of login_header() + + /** + * Outputs the footer for the login page. + * + * @param string $input_id Which input to auto-focus + */ + function login_footer($input_id = '') { + global $interim_login; + + // Don't allow interim logins to navigate away from the page. + if (!$interim_login) : ?> +

            + ', '
            '); + } + ?> + + +
            + + + + + + +
            + + + + + + +add('empty_username', __('ERROR: Enter a username or email address.')); + } elseif (strpos(sanitize_email(wp_unslash($_POST['user_login'])), '@')) { + $user_data = get_user_by('email', trim(sanitize_email(wp_unslash($_POST['user_login'])))); + if (empty($user_data)) + $errors->add('invalid_email', __('ERROR: There is no account with that username or email address.')); + } else { + $login = trim(sanitize_email(wp_unslash($_POST['user_login']))); + $user_data = get_user_by('login', $login); + } + // phpcs:enable WordPress.Security.NonceVerification.Missing -- No nonce available. + + /** + * Fires before errors are returned from a password reset request. + * + * @since 2.1.0 + * @since 4.4.0 Added the `$errors` parameter. + * + * @param WP_Error $errors A WP_Error object containing any errors generated + * by using invalid credentials. + */ + do_action('lostpassword_post', $errors); + + if ($errors->get_error_code()) + return $errors; + + if (!$user_data) { + $errors->add('invalidcombo', __('ERROR: There is no account with that username or email address.')); + return $errors; + } + + // Redefining user_login ensures we return the right case in the email. + $user_login = $user_data->user_login; + $user_email = $user_data->user_email; + $key = get_password_reset_key($user_data); + + if (is_wp_error($key)) { + return $key; + } + + if (is_multisite()) { + $site_name = get_network()->site_name; + } else { + /* + * The blogname option is escaped with esc_html on the way into the database + * in sanitize_option we want to reverse this for the plain text arena of emails. + */ + $site_name = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES); + } + + $message = __('Someone has requested a password reset for the following account:') . "\r\n\r\n"; + /* translators: %s: site name */ + $message .= sprintf(__('Site Name: %s'), $site_name) . "\r\n\r\n"; + /* translators: %s: user login */ + $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n"; + $message .= __('If this was a mistake, just ignore this email and nothing will happen.') . "\r\n\r\n"; + $message .= __('To reset your password, visit the following address:') . "\r\n\r\n"; + $message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . ">\r\n"; + + // translators: Password reset email subject. %s: Site name + $title = sprintf(__('[%s] Password Reset'), $site_name); + + /** + * Filters the subject of the password reset email. + * + * @since 2.8.0 + * @since 4.4.0 Added the `$user_login` and `$user_data` parameters. + * + * @param string $title Default email title. + * @param string $user_login The username for the user. + * @param WP_User $user_data WP_User object. + */ + $title = apply_filters('retrieve_password_title', $title, $user_login, $user_data); + + /** + * Filter the message body of the password reset mail. + * + * If the filtered message is empty, the password reset email will not be sent. + * + * @since 2.8.0 + * @since 4.1.0 Added `$user_login` and `$user_data` parameters. + * + * @param string $message Default mail message. + * @param string $key The activation key. + * @param string $user_login The username for the user. + * @param WP_User $user_data WP_User object. + */ + $message = apply_filters('retrieve_password_message', $message, $key, $user_login, $user_data); + + if ($message && !wp_mail($user_email, wp_specialchars_decode($title), $message)) + wp_die(esc_html__('The email could not be sent.') . "
            \n" . esc_html__('Possible reason: your host may have disabled the mail() function.')); + + return true; +} + +// +// Main +// +// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- No nonce available. +$action = isset($_REQUEST['action']) ? sanitize_text_field(wp_unslash($_REQUEST['action'])) : 'login'; +$errors = new WP_Error(); + +if (isset($_GET['key'])) + $action = 'resetpass'; + +// validate action so as to default to the login screen +if (!in_array($action, array('postpass', 'logout', 'lostpassword', 'retrievepassword', 'resetpass', 'rp', 'register', 'login', 'confirmaction'), true) && false === has_filter('login_form_' . $action)) + $action = 'login'; + +nocache_headers(); + +header('Content-Type: '.get_bloginfo('html_type').'; charset='.get_bloginfo('charset')); + +if (defined('RELOCATE') && RELOCATE) { // Move flag is set + $path_info = isset($_SERVER['PATH_INFO']) ? sanitize_text_field(wp_unslash($_SERVER['PATH_INFO'])) : ''; + $php_self = isset($_SERVER['PHP_SELF']) ? sanitize_text_field(wp_unslash($_SERVER['PHP_SELF'])) : ''; + + if ('' !== $path_info && ($path_info != $php_self)) + $_SERVER['PHP_SELF'] = str_replace($path_info, '', $php_self); + + $url = dirname(set_url_scheme('http://' . isset($_SERVER['HTTP_HOST']) ? sanitize_text_field(wp_unslash($_SERVER['HTTP_HOST'])) : '' . $php_self)); + if (get_option('siteurl') != $url) + update_option('siteurl', $url); +} + +setcookie(TEST_COOKIE, 'WP Cookie check', 0, COOKIEPATH, COOKIE_DOMAIN, is_ssl(), true); +if (SITECOOKIEPATH != COOKIEPATH) + setcookie(TEST_COOKIE, 'WP Cookie check', 0, SITECOOKIEPATH, COOKIE_DOMAIN, is_ssl(), true); + +$lang = ! empty($_GET['wp_lang']) ? sanitize_text_field(wp_unslash($_GET['wp_lang'])) : ''; +$switched_locale = false; + +if (function_exists('switch_to_locale')) { + $switched_locale = switch_to_locale($lang); +} + +/** + * Fires when the login form is initialized. + * + * @since 3.2.0 + */ +do_action('login_init'); + +/** + * Fires before a specified login form action. + * + * The dynamic portion of the hook name, `$action`, refers to the action + * that brought the visitor to the login form. Actions include 'postpass', + * 'logout', 'lostpassword', etc. + * + * @since 2.8.0 + */ +do_action("login_form_{$action}"); + +$http_post = ('POST' == isset($_SERVER['REQUEST_METHOD']) ? sanitize_text_field(wp_unslash($_SERVER['REQUEST_METHOD'])) : ''); +$interim_login = isset($_REQUEST['interim-login']); + +/** + * Filters the separator used between login form navigation links. + * + * @since 4.9.0 + * + * @param string $login_link_separator The separator used between login form navigation links. + */ +$login_link_separator = apply_filters('login_link_separator', ' | '); + +switch ($action) { + + case 'postpass': + if (! array_key_exists('post_password', $_POST)) { + wp_safe_redirect(wp_get_referer()); + exit(); + } + + require_once ABSPATH . WPINC . '/class-phpass.php'; + $hasher = new PasswordHash(8, true); + + /** + * Filter the life span of the post password cookie. + * + * By default, the cookie expires 10 days from creation. To turn this + * into a session cookie, return 0. + * + * @since 3.7.0 + * + * @param int $expires The expiry time, as passed to setcookie(). + */ + $expire = apply_filters('post_password_expires', time() + 10 * DAY_IN_SECONDS); + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitizing password not recommended. It's going to be hashed anyway. + setcookie('wp-postpass_' . COOKIEHASH, $hasher->HashPassword(wp_unslash($_POST['post_password'])), $expire, COOKIEPATH, COOKIE_DOMAIN, is_ssl(), true); + + if ($switched_locale) { + restore_previous_locale(); + } + + wp_safe_redirect(wp_get_referer()); + exit(); + case 'logout': + check_admin_referer('log-out'); + + $user = wp_get_current_user(); + + wp_logout(); + + if (! empty($_REQUEST['redirect_to'])) { + $redirect_to = $requested_redirect_to = sanitize_text_field(wp_unslash($_REQUEST['redirect_to'])); + } else { + $redirect_to = 'wp-login.php?loggedout=true'; + $requested_redirect_to = ''; + } + + if ($switched_locale) { + restore_previous_locale(); + } + + /** + * Filter the log out redirect URL. + * + * @since 4.2.0 + * + * @param string $redirect_to The redirect destination URL. + * @param string $requested_redirect_to The requested redirect destination URL passed as a parameter. + * @param WP_User $user The WP_User object for the user that's logging out. + */ + $redirect_to = apply_filters('logout_redirect', $redirect_to, $requested_redirect_to, $user); + + wp_safe_redirect($redirect_to); + exit(); + + case 'lostpassword': + case 'retrievepassword': + if ($http_post) { + $errors = retrieve_password(); + if (!is_wp_error($errors)) { + $redirect_to = !empty($_REQUEST['redirect_to']) ? sanitize_text_field(wp_unslash($_REQUEST['redirect_to'])) : 'wp-login.php?checkemail=confirm'; + wp_safe_redirect($redirect_to); + exit(); + } + } + + if (isset($_GET['error'])) { + if ('invalidkey' == $_GET['error']) { + $errors->add('invalidkey', __('Your password reset link appears to be invalid. Please request a new link below.')); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + } elseif ('expiredkey' == $_GET['error']) { + $errors->add('expiredkey', __('Your password reset link has expired. Please request a new link below.')); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + } + } + + $lostpassword_redirect = ! empty($_REQUEST['redirect_to']) ? sanitize_text_field(wp_unslash($_REQUEST['redirect_to'])) : ''; + /** + * Filter the URL redirected to after submitting the lostpassword/retrievepassword form. + * + * @since 3.0.0 + * + * @param string $lostpassword_redirect The redirect destination URL. + */ + $redirect_to = apply_filters('lostpassword_redirect', $lostpassword_redirect); + + /** + * Fires before the lost password form. + * + * @since 1.5.1 + */ + do_action('lost_password'); + + login_header(__('Lost Password'), '

            ' . __('Please enter your username or email address. You will receive a link to create a new password via email.') . '

            ', $errors); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + + $user_login = ''; + + if (isset($_POST['user_login']) && is_string($_POST['user_login'])) { + $user_login = sanitize_text_field(wp_unslash($_POST['user_login'])); + } + + ?> + +
            +

            + +

            + + +

            +
            + + + + get_error_code() === 'expired_key') { + wp_redirect(site_url('wp-login.php?action=lostpassword&error=expiredkey')); + } else { + wp_redirect(site_url('wp-login.php?action=lostpassword&error=invalidkey')); + } + exit; + } + + $errors = new WP_Error(); + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Not recommended to sanitize password. + if (isset($_POST['pass1']) && wp_unslash($_POST['pass1']) != isset($_POST['pass2']) ? wp_unslash($_POST['pass2']) : '') + $errors->add('password_reset_mismatch', __('The passwords do not match.')); + + /** + * Fires before the password reset procedure is validated. + * + * @since 3.5.0 + * + * @param object $errors WP Error object. + * @param WP_User|WP_Error $user WP_User object if the login and reset key match. WP_Error object otherwise. + */ + do_action('validate_password_reset', $errors, $user); + + if ((! $errors->get_error_code()) && isset($_POST['pass1']) && !empty($_POST['pass1'])) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Not recommended to sanitize password. + reset_password($user, wp_unslash($_POST['pass1'])); + setcookie($rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true); + login_header(__('Password Reset'), '

            ' . __('Your password has been reset.') . ' ' . __('Log in') . '

            '); + login_footer(); + exit; + } + + wp_enqueue_script('utils'); + wp_enqueue_script('user-profile'); + + login_header(__('Reset Password'), '

            ' . __('Enter your new password below.') . '

            ', $errors); + ?> +
            + + +
            +

            + +

            + +
            +
            + + + + +
            +
            +
            +
            + +
            +
            +

            +
            + +

            + +

            +
            + + + +

            +
            + + + + ' . __('Register For This Site') . '

            ', $errors); + ?> + +
            +

            + +

            +

            + +

            + +

            +
            + +

            +
            + + + + ID)) { + $secure_cookie = true; + force_ssl_admin(true); + } + } + } + + if (isset($_REQUEST['redirect_to'])) { + $redirect_to = sanitize_text_field(wp_unslash($_REQUEST['redirect_to'])); + // Redirect to https if user wants ssl + if ($secure_cookie && false !== strpos($redirect_to, 'wp-admin')) + $redirect_to = preg_replace('|^http://|', 'https://', $redirect_to); + } else { + $redirect_to = admin_url(); + } + + $reauth = empty($_REQUEST['reauth']) ? false : true; + + $user = wp_signon(array(), $secure_cookie); + + if (empty($_COOKIE[LOGGED_IN_COOKIE])) { + if (headers_sent()) { + // translators: 1: Browser cookie documentation URL, 2: Support forums URL + $user = new WP_Error('test_cookie', sprintf(__('ERROR: Cookies are blocked due to unexpected output. For help, please see this documentation or try the support forums.'), esc_url(__('https://codex.wordpress.org/Cookies')), esc_url(__('https://wordpress.org/support/')))); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + } elseif (isset($_POST['testcookie']) && empty($_COOKIE[TEST_COOKIE])) { + // If cookies are disabled we can't log in even with a valid user+pass + // translators: 1: Browser cookie documentation URL + $user = new WP_Error('test_cookie', sprintf(__('ERROR: Cookies are blocked or not supported by your browser. You must enable cookies to use WordPress.'), esc_url(__('https://codex.wordpress.org/Cookies')))); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + } + } + + $requested_redirect_to = isset($_REQUEST['redirect_to']) ? sanitize_text_field(wp_unslash($_REQUEST['redirect_to'])) : ''; + /** + * Filter the login redirect URL. + * + * @since 3.0.0 + * + * @param string $redirect_to The redirect destination URL. + * @param string $requested_redirect_to The requested redirect destination URL passed as a parameter. + * @param WP_User|WP_Error $user WP_User object if login was successful, WP_Error object otherwise. + */ + $redirect_to = apply_filters('login_redirect', $redirect_to, $requested_redirect_to, $user); + + if (!is_wp_error($user) && !$reauth) { + if ($interim_login) { + $message = '

            ' . __('You have logged in successfully.') . '

            '; + $interim_login = 'success'; + login_header('', $message); ?> +
            + + + + + + ID) && !is_super_admin($user->ID)) + $redirect_to = user_admin_url(); + elseif (is_multisite() && !$user->has_cap('read')) + $redirect_to = get_dashboard_url($user->ID); + elseif (!$user->has_cap('edit_posts')) + $redirect_to = $user->has_cap('read') ? admin_url('profile.php') : home_url(); + + wp_redirect($redirect_to); + exit(); + } + wp_safe_redirect($redirect_to); + exit(); + } + + $errors = $user; + // Clear errors if loggedout is set. + if (!empty($_GET['loggedout']) || $reauth) + $errors = new WP_Error(); + + if ($interim_login) { + if (! $errors->get_error_code()) + $errors->add('expired', __('Your session has expired. Please log in to continue where you left off.'), 'message'); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + } else { + // Some parts of this script use the main login form to display a message + if (isset($_GET['loggedout']) && true == $_GET['loggedout']) + $errors->add('loggedout', __('You are now logged out.'), 'message'); + elseif (isset($_GET['registration']) && 'disabled' == $_GET['registration']) + $errors->add('registerdisabled', __('User registration is currently not allowed.')); + elseif (isset($_GET['checkemail']) && 'confirm' == $_GET['checkemail']) + $errors->add('confirm', __('Check your email for the confirmation link.'), 'message'); + elseif (isset($_GET['checkemail']) && 'newpass' == $_GET['checkemail']) + $errors->add('newpass', __('Check your email for your new password.'), 'message'); + elseif (isset($_GET['checkemail']) && 'registered' == $_GET['checkemail']) + $errors->add('registered', __('Registration complete. Please check your email.'), 'message'); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + elseif (strpos($redirect_to, 'about.php?updated')) + $errors->add('updated', __('You have successfully updated WordPress! Please log back in to see what’s new.'), 'message'); + } + + /** + * Filter the login page errors. + * + * @since 3.6.0 + * + * @param object $errors WP Error object. + * @param string $redirect_to Redirect destination URL. + */ + $errors = apply_filters('wp_login_errors', $errors, $redirect_to); + + // Clear any stale cookies. + if ($reauth) + wp_clear_auth_cookie(); + + login_header(__('Log In'), '', $errors); + + if (isset($_POST['log'])) + $user_login = ('incorrect_password' == $errors->get_error_code() || 'empty_password' == $errors->get_error_code()) ? esc_attr(sanitize_text_field(wp_unslash($_POST['log']))) : ''; + $rememberme = ! empty($_POST['rememberme']); + + if (! empty($errors->errors)) { + $aria_describedby_error = ' aria-describedby="login_error"'; + } else { + $aria_describedby_error = ''; + } + + //aiowps - this check is necessary because otherwise if variables are undefined we get a warning! + if (empty($user_login)) { + $user_login = ''; + } + + if (empty($error)) { + $error = ''; + } +?> + +
            +

            + +

            +

            + +

            + +

            +

            + + + + + + + + + + +

            +
            + + + + + + + +` element. + * Default 'Log In'. + * @param string $message Optional. Message to display in header. Default empty. + * @param WP_Error $wp_error Optional. The error to pass. Default is a WP_Error instance. + */ +function login_header($title = 'Log In', $message = '', $wp_error = null) { + global $error, $interim_login, $action; + + // Don't index any of these forms. + add_action('login_head', 'wp_sensitive_page_meta'); + + add_action('login_head', 'wp_login_viewport_meta'); + + if (! is_wp_error($wp_error)) { + $wp_error = new WP_Error(); + } + + // Shake it! + $shake_error_codes = array('empty_password', 'empty_email', 'invalid_email', 'invalidcombo', 'empty_username', 'invalid_username', 'incorrect_password', 'retrieve_password_email_failure'); + /** + * Filters the error codes array for shaking the login form. + * + * @since 3.0.0 + * + * @param array $shake_error_codes Error codes that shake the login form. + */ + $shake_error_codes = apply_filters('shake_error_codes', $shake_error_codes); + + if ($shake_error_codes && $wp_error->has_errors() && in_array($wp_error->get_error_code(), $shake_error_codes, true)) { + add_action('login_footer', 'wp_shake_js', 12); + } + + $login_title = get_bloginfo('name', 'display'); + + /* translators: Login screen title. 1: Login screen name, 2: Network or site name. */ + $login_title = sprintf(__('%1$s ‹ %2$s — WordPress'), $title, $login_title); + + if (wp_is_recovery_mode()) { + /* translators: %s: Login screen title. */ + $login_title = sprintf(__('Recovery Mode — %s'), $login_title); + } + + /** + * Filters the title tag content for login page. + * + * @since 4.9.0 + * + * @param string $login_title The page title, with extra context added. + * @param string $title The original page title. + */ + $login_title = apply_filters('login_title', $login_title, $title); + + ?> + > + + + <?php echo esc_html($login_title); ?> + get_error_code()) { + ?> + + + + + + + + +
            +

            + add('error', $error); + unset($error); + } + + if ($wp_error->has_errors()) { + $errors = ''; + $messages = ''; + + foreach ($wp_error->get_error_codes() as $code) { + $severity = $wp_error->get_error_data($code); + foreach ($wp_error->get_error_messages($code) as $error_message) { + if ('message' === $severity) { + $messages .= ' ' . $error_message . "
            \n"; + } else { + $errors .= ' ' . $error_message . "
            \n"; + } + } + } + + if (! empty($errors)) { + /** + * Filters the error messages displayed above the login form. + * + * @since 2.1.0 + * + * @param string $errors Login error message. + */ + echo '
            ' . wp_kses_post(apply_filters('login_errors', $errors)) . "
            \n"; + } + + if (! empty($messages)) { + /** + * Filters instructional messages displayed above the login form. + * + * @since 2.5.0 + * + * @param string $messages Login messages. + */ + echo '

            ' . wp_kses_post(apply_filters('login_messages', $messages)) . "

            \n"; + } + } +} // End of login_header(). + +/** + * Outputs the footer for the login page. + * + * @since 3.1.0 + * + * @global bool|string $interim_login Whether interim login modal is being displayed. String 'success' + * upon successful login. + * + * @param string $input_id Which input to auto-focus. + */ +function login_footer($input_id = '') { + global $interim_login; + + // Don't allow interim logins to navigate away from the page. + if (! $interim_login) { + ?> +

            + +

            + ', '
            '); + } + + ?> +
            . ?> + + + + +
            + + + + + + + add('empty_username', __('Error: Please enter a username or email address.')); + } elseif (strpos($_POST['user_login'], '@')) { + $user_data = get_user_by('email', trim(wp_unslash($_POST['user_login']))); + if (empty($user_data)) { + $errors->add('invalid_email', __('Error: There is no account with that username or email address.')); + } + } else { + $login = trim(wp_unslash($_POST['user_login'])); + $user_data = get_user_by('login', $login); + } + + /** + * Fires before errors are returned from a password reset request. + * + * @since 2.1.0 + * @since 4.4.0 Added the `$errors` parameter. + * @since 5.4.0 Added the `$user_data` parameter. + * + * @param WP_Error $errors A WP_Error object containing any errors generated + * by using invalid credentials. + * @param WP_User|false $user_data WP_User object if found, false if the user does not exist. + */ + do_action('lostpassword_post', $errors, $user_data); + + /** + * Filters the errors encountered on a password reset request. + * + * The filtered WP_Error object may, for example, contain errors for an invalid + * username or email address. A WP_Error object should always be returned, + * but may or may not contain errors. + * + * If any errors are present in $errors, this will abort the password reset request. + * + * @since 5.5.0 + * + * @param WP_Error $errors A WP_Error object containing any errors generated + * by using invalid credentials. + * @param WP_User|false $user_data WP_User object if found, false if the user does not exist. + */ + $errors = apply_filters('lostpassword_errors', $errors, $user_data); + + if ($errors->has_errors()) { + return $errors; + } + + if (! $user_data) { + $errors->add('invalidcombo', __('Error: There is no account with that username or email address.')); + return $errors; + } + + // Redefining user_login ensures we return the right case in the email. + $user_login = $user_data->user_login; + $user_email = $user_data->user_email; + $key = get_password_reset_key($user_data); + + if (is_wp_error($key)) { + return $key; + } + + if (is_multisite()) { + $site_name = get_network()->site_name; + } else { + /* + * The blogname option is escaped with esc_html on the way into the database + * in sanitize_option. We want to reverse this for the plain text arena of emails. + */ + $site_name = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES); + } + + $message = __('Someone has requested a password reset for the following account:') . "\r\n\r\n"; + /* translators: %s: Site name. */ + $message .= sprintf(__('Site Name: %s'), $site_name) . "\r\n\r\n"; + /* translators: %s: User login. */ + $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n"; + $message .= __('If this was a mistake, ignore this email and nothing will happen.') . "\r\n\r\n"; + $message .= __('To reset your password, visit the following address:') . "\r\n\r\n"; + $message .= network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . "\r\n\r\n"; + + $requester_ip = $_SERVER['REMOTE_ADDR']; + if ($requester_ip) { + $message .= sprintf( + /* translators: %s: IP address of password reset requester. */ + __('This password reset request originated from the IP address %s.'), + $requester_ip + ) . "\r\n"; + } + + /* translators: Password reset notification email subject. %s: Site title. */ + $title = sprintf(__('[%s] Password Reset'), $site_name); + + /** + * Filters the subject of the password reset email. + * + * @since 2.8.0 + * @since 4.4.0 Added the `$user_login` and `$user_data` parameters. + * + * @param string $title Email subject. + * @param string $user_login The username for the user. + * @param WP_User $user_data WP_User object. + */ + $title = apply_filters('retrieve_password_title', $title, $user_login, $user_data); + + /** + * Filters the message body of the password reset mail. + * + * If the filtered message is empty, the password reset email will not be sent. + * + * @since 2.8.0 + * @since 4.1.0 Added `$user_login` and `$user_data` parameters. + * + * @param string $message Email message. + * @param string $key The activation key. + * @param string $user_login The username for the user. + * @param WP_User $user_data WP_User object. + */ + $message = apply_filters('retrieve_password_message', $message, $key, $user_login, $user_data); + + if ($message && ! wp_mail($user_email, wp_specialchars_decode($title), $message)) { + $errors->add( + 'retrieve_password_email_failure', + sprintf( + /* translators: %s: Documentation URL. */ + __('Error: The email could not be sent. Your site may not be correctly configured to send emails. Get support for resetting your password.'), // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + esc_url(__('https://wordpress.org/support/article/resetting-your-password/')) + ) + ); + return $errors; + } + + return true; +} + +// +// Main. +// + +$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'login'; +$errors = new WP_Error(); + +if (isset($_GET['key'])) { + $action = 'resetpass'; +} + +if (isset($_GET['checkemail'])) { + $action = 'checkemail'; +} + +$default_actions = array( + 'confirm_admin_email', + 'postpass', + 'logout', + 'lostpassword', + 'retrievepassword', + 'resetpass', + 'rp', + 'register', + 'checkemail', + 'confirmaction', + 'login', + WP_Recovery_Mode_Link_Service::LOGIN_ACTION_ENTERED, +); + +// Validate action so as to default to the login screen. +if (! in_array($action, $default_actions, true) && false === has_filter('login_form_' . $action)) { + $action = 'login'; +} + +nocache_headers(); + +header('Content-Type: ' . get_bloginfo('html_type') . '; charset=' . get_bloginfo('charset')); + +if (defined('RELOCATE') && RELOCATE) { // Move flag is set. + if (isset($_SERVER['PATH_INFO']) && ($_SERVER['PATH_INFO'] !== $_SERVER['PHP_SELF'])) { + $_SERVER['PHP_SELF'] = str_replace($_SERVER['PATH_INFO'], '', $_SERVER['PHP_SELF']); + } + + $url = dirname(set_url_scheme('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'])); + + if (get_option('siteurl') !== $url) { + update_option('siteurl', $url); + } +} + +setcookie(TEST_COOKIE, 'WP Cookie check', 0, COOKIEPATH, COOKIE_DOMAIN, is_ssl(), true); + +if (SITECOOKIEPATH !== COOKIEPATH) { + setcookie(TEST_COOKIE, 'WP Cookie check', 0, SITECOOKIEPATH, COOKIE_DOMAIN, is_ssl(), true); +} + +/** + * Fires when the login form is initialized. + * + * @since 3.2.0 + */ +do_action('login_init'); + +/** + * Fires before a specified login form action. + * + * The dynamic portion of the hook name, `$action`, refers to the action + * that brought the visitor to the login form. Actions include 'postpass', + * 'logout', 'lostpassword', etc. + * + * @since 2.8.0 + */ +do_action("login_form_{$action}"); + +$http_post = ('POST' === $_SERVER['REQUEST_METHOD']); +$interim_login = isset($_REQUEST['interim-login']); + +/** + * Filters the separator used between login form navigation links. + * + * @since 4.9.0 + * + * @param string $login_link_separator The separator used between login form navigation links. + */ +$login_link_separator = apply_filters('login_link_separator', ' | '); + +switch ($action) { + + case 'confirm_admin_email': + /* + * Note that `is_user_logged_in()` will return false immediately after logging in + * as the current user is not set, see wp-includes/pluggable.php. + * However this action runs on a redirect after logging in. + */ + if (! is_user_logged_in()) { + wp_safe_redirect(wp_login_url()); + exit; + } + + if (! empty($_REQUEST['redirect_to'])) { + $redirect_to = $_REQUEST['redirect_to']; + } else { + $redirect_to = admin_url(); + } + + if (current_user_can('manage_options')) { + $admin_email = get_option('admin_email'); + } else { + wp_safe_redirect($redirect_to); + exit; + } + + /** + * Filters the interval for dismissing the admin email confirmation screen. + * + * If `0` (zero) is returned, the "Remind me later" link will not be displayed. + * + * @since 5.3.1 + * + * @param int $interval Interval time (in seconds). Default is 3 days. + */ + $remind_interval = (int) apply_filters('admin_email_remind_interval', 3 * DAY_IN_SECONDS); + + if (! empty($_GET['remind_me_later'])) { + if (! wp_verify_nonce($_GET['remind_me_later'], 'remind_me_later_nonce')) { + wp_safe_redirect(wp_login_url()); + exit; + } + + if ($remind_interval > 0) { + update_option('admin_email_lifespan', time() + $remind_interval); + } + + $redirect_to = add_query_arg('admin_email_remind_later', 1, $redirect_to); + wp_safe_redirect($redirect_to); + exit; + } + + if (! empty($_POST['correct-admin-email'])) { + if (! check_admin_referer('confirm_admin_email', 'confirm_admin_email_nonce')) { + wp_safe_redirect(wp_login_url()); + exit; + } + + /** + * Filters the interval for redirecting the user to the admin email confirmation screen. + * + * If `0` (zero) is returned, the user will not be redirected. + * + * @since 5.3.0 + * + * @param int $interval Interval time (in seconds). Default is 6 months. + */ + $admin_email_check_interval = (int) apply_filters('admin_email_check_interval', 6 * MONTH_IN_SECONDS); + + if ($admin_email_check_interval > 0) { + update_option('admin_email_lifespan', time() + $admin_email_check_interval); + } + + wp_safe_redirect($redirect_to); + exit; + } + + login_header(__('Confirm your administration email'), '', $errors); + + /** + * Fires before the admin email confirm form. + * + * @since 5.3.0 + * + * @param WP_Error $errors A `WP_Error` object containing any errors generated by using invalid + * credentials. Note that the error object may not contain any errors. + */ + do_action('admin_email_confirm', $errors); + ?> + +
            + + + +

            + +

            +

            + administration email for this website is still correct.'); ?> + %s', __('(opens in a new tab)')); + + printf( + '%s%s', + esc_url($admin_email_help_url), + esc_html__('Why is this important?'), + wp_kses_post($accessibility_text) + ); + ?> +

            +

            + ' . esc_html($admin_email) . '' + ); + ?> +

            +

            + +

            + +
            +
            + + + +
            + 0) : ?> +
            + 'confirm_admin_email', + 'remind_me_later' => wp_create_nonce('remind_me_later_nonce'), + ), + $remind_me_link + ); + ?> + +
            + +
            +
            + + HashPassword(wp_unslash($_POST['post_password'])), $expire, COOKIEPATH, COOKIE_DOMAIN, is_ssl(), true); + + wp_safe_redirect(wp_get_referer()); + exit; + + case 'logout': + check_admin_referer('log-out'); + + $user = wp_get_current_user(); + + wp_logout(); + + if (! empty($_REQUEST['redirect_to'])) { + $redirect_to = $_REQUEST['redirect_to']; + $requested_redirect_to = $redirect_to; + } else { + $redirect_to = add_query_arg( + array( + 'loggedout' => 'true', + 'wp_lang' => get_user_locale($user), + ), + wp_login_url() + ); + + $requested_redirect_to = ''; + } + + /** + * Filters the log out redirect URL. + * + * @since 4.2.0 + * + * @param string $redirect_to The redirect destination URL. + * @param string $requested_redirect_to The requested redirect destination URL passed as a parameter. + * @param WP_User $user The WP_User object for the user that's logging out. + */ + $redirect_to = apply_filters('logout_redirect', $redirect_to, $requested_redirect_to, $user); + + wp_safe_redirect($redirect_to); + exit; + + case 'lostpassword': + case 'retrievepassword': + if ($http_post) { + $errors = retrieve_password(); + + if (! is_wp_error($errors)) { + $redirect_to = ! empty($_REQUEST['redirect_to']) ? $_REQUEST['redirect_to'] : 'wp-login.php?checkemail=confirm'; + wp_safe_redirect($redirect_to); + exit; + } + } + + if (isset($_GET['error'])) { + if ('invalidkey' === $_GET['error']) { + $errors->add('invalidkey', __('Your password reset link appears to be invalid. Please request a new link below.')); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + } elseif ('expiredkey' === $_GET['error']) { + $errors->add('expiredkey', __('Your password reset link has expired. Please request a new link below.')); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + } + } + + $lostpassword_redirect = ! empty($_REQUEST['redirect_to']) ? $_REQUEST['redirect_to'] : ''; + /** + * Filters the URL redirected to after submitting the lostpassword/retrievepassword form. + * + * @since 3.0.0 + * + * @param string $lostpassword_redirect The redirect destination URL. + */ + $redirect_to = apply_filters('lostpassword_redirect', $lostpassword_redirect); + + /** + * Fires before the lost password form. + * + * @since 1.5.1 + * @since 5.1.0 Added the `$errors` parameter. + * + * @param WP_Error $errors A `WP_Error` object containing any errors generated by using invalid + * credentials. Note that the error object may not contain any errors. + */ + do_action('lost_password', $errors); + + login_header(__('Lost Password'), '

            ' . __('Please enter your username or email address. You will receive an email message with instructions on how to reset your password.') . '

            ', $errors); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + + $user_login = ''; + + if (isset($_POST['user_login']) && is_string($_POST['user_login'])) { + $user_login = wp_unslash($_POST['user_login']); + } + + ?> + +
            +

            + + +

            + + +

            + +

            +
            + + + get_error_code() === 'expired_key') { + wp_redirect(site_url('wp-login.php?action=lostpassword&error=expiredkey')); + } else { + wp_redirect(site_url('wp-login.php?action=lostpassword&error=invalidkey')); + } + + exit; + } + + $errors = new WP_Error(); + + if (isset($_POST['pass1']) && $_POST['pass1'] !== $_POST['pass2']) { + $errors->add('password_reset_mismatch', __('The passwords do not match.')); + } + + /** + * Fires before the password reset procedure is validated. + * + * @since 3.5.0 + * + * @param WP_Error $errors WP Error object. + * @param WP_User|WP_Error $user WP_User object if the login and reset key match. WP_Error object otherwise. + */ + do_action('validate_password_reset', $errors, $user); + + if ((! $errors->has_errors()) && isset($_POST['pass1']) && ! empty($_POST['pass1'])) { + reset_password($user, $_POST['pass1']); + setcookie($rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true); + login_header(__('Password Reset'), '

            ' . __('Your password has been reset.') . ' ' . __('Log in') . '

            '); + login_footer(); + exit; + } + + wp_enqueue_script('utils'); + wp_enqueue_script('user-profile'); + + login_header(__('Reset Password'), '

            ' . __('Enter your new password below.') . '

            ', $errors); + ?> +
            + + +
            +

            + +

            + +
            + + + +
            +
            +
            + + +
            +
            + +

            + + +

            + +

            +
            + + + +

            + +

            +
            + + + ' . __('Register For This Site') . '

            ', $errors); + ?> +
            +

            + + +

            +

            + + +

            + +

            + +

            +
            + +

            + +

            +
            + + + add( + 'confirm', + sprintf( + /* translators: %s: Link to the login page. */ + __('Check your email for the confirmation link, then visit the login page.'), + wp_login_url() + ), + 'message' + ); + } elseif ('registered' === $_GET['checkemail']) { + $errors->add( + 'registered', + sprintf( + /* translators: %s: Link to the login page. */ + __('Registration complete. Please check your email, then visit the login page.'), // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + wp_login_url() + ), + 'message' + ); + } + + // This action is documented in wp-login.php + $errors = apply_filters('wp_login_errors', $errors, $redirect_to); + + login_header(__('Check your email'), '', $errors); + login_footer(); + break; + + case 'confirmaction': + if (! isset($_GET['request_id'])) { + wp_die(esc_html__('Missing request ID.')); + } + + if (! isset($_GET['confirm_key'])) { + wp_die(esc_html__('Missing confirm key.')); + } + + $request_id = (int) $_GET['request_id']; + $key = sanitize_text_field(wp_unslash($_GET['confirm_key'])); + $result = wp_validate_user_request_key($request_id, $key); + + if (is_wp_error($result)) { + wp_die($result); + } + + /** + * Fires an action hook when the account action has been confirmed by the user. + * + * Using this you can assume the user has agreed to perform the action by + * clicking on the link in the confirmation email. + * + * After firing this action hook the page will redirect to wp-login a callback + * redirects or exits first. + * + * @since 4.9.6 + * + * @param int $request_id Request ID. + */ + do_action('user_request_action_confirmed', $request_id); + + $message = _wp_privacy_account_request_confirmed_message($request_id); + + login_header(__('User action confirmed.'), $message); + login_footer(); + exit; + + case 'login': + default: + $secure_cookie = ''; + $customize_login = isset($_REQUEST['customize-login']); + + if ($customize_login) { + wp_enqueue_script('customize-base'); + } + + // If the user wants SSL but the session is not SSL, force a secure cookie. + if (! empty($_POST['log']) && ! force_ssl_admin()) { + $user_name = sanitize_user(wp_unslash($_POST['log'])); + $user = get_user_by('login', $user_name); + + if (! $user && strpos($user_name, '@')) { + $user = get_user_by('email', $user_name); + } + + if ($user) { + if (get_user_option('use_ssl', $user->ID)) { + $secure_cookie = true; + force_ssl_admin(true); + } + } + } + + if (isset($_REQUEST['redirect_to'])) { + $redirect_to = $_REQUEST['redirect_to']; + // Redirect to HTTPS if user wants SSL. + if ($secure_cookie && false !== strpos($redirect_to, 'wp-admin')) { + $redirect_to = preg_replace('|^http://|', 'https://', $redirect_to); + } + } else { + $redirect_to = admin_url(); + } + + $reauth = empty($_REQUEST['reauth']) ? false : true; + + $user = wp_signon(array(), $secure_cookie); + + if (empty($_COOKIE[LOGGED_IN_COOKIE])) { + if (headers_sent()) { + $user = new WP_Error( + 'test_cookie', + sprintf( + /* translators: 1: Browser cookie documentation URL, 2: Support forums URL. */ + __('Error: Cookies are blocked due to unexpected output. For help, please see this documentation or try the support forums.'), // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + esc_url(__('https://wordpress.org/support/article/cookies/')), + esc_url(__('https://wordpress.org/support/forums/')) + ) + ); + } elseif (isset($_POST['testcookie']) && empty($_COOKIE[TEST_COOKIE])) { + // If cookies are disabled, we can't log in even with a valid user and password. + $user = new WP_Error( + 'test_cookie', + sprintf( + /* translators: %s: Browser cookie documentation URL. */ + __('Error: Cookies are blocked or not supported by your browser. You must enable cookies to use WordPress.'), // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + esc_url(__('https://wordpress.org/support/article/cookies/#enable-cookies-in-your-browser')) + ) + ); + } + } + + $requested_redirect_to = isset($_REQUEST['redirect_to']) ? $_REQUEST['redirect_to'] : ''; + /** + * Filters the login redirect URL. + * + * @since 3.0.0 + * + * @param string $redirect_to The redirect destination URL. + * @param string $requested_redirect_to The requested redirect destination URL passed as a parameter. + * @param WP_User|WP_Error $user WP_User object if login was successful, WP_Error object otherwise. + */ + $redirect_to = apply_filters('login_redirect', $redirect_to, $requested_redirect_to, $user); + + if (! is_wp_error($user) && ! $reauth) { + if ($interim_login) { + $message = '

            ' . __('You have logged in successfully.') . '

            '; + $interim_login = 'success'; + login_header('', $message); + ?> +
            + + + + + exists() && $user->has_cap('manage_options')) { + $admin_email_lifespan = (int) get_option('admin_email_lifespan'); + + // If `0` (or anything "falsey" as it is cast to int) is returned, the user will not be redirected + // to the admin email confirmation screen. + // This filter is documented in wp-login.php + $admin_email_check_interval = (int) apply_filters('admin_email_check_interval', 6 * MONTH_IN_SECONDS); + + if ($admin_email_check_interval > 0 && time() > $admin_email_lifespan) { + $redirect_to = add_query_arg( + array( + 'action' => 'confirm_admin_email', + 'wp_lang' => get_user_locale($user), + ), + wp_login_url($redirect_to) + ); + } + } + + if ((empty($redirect_to) || 'wp-admin/' === $redirect_to || admin_url() === $redirect_to)) { + // 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. + if (is_multisite() && ! get_active_blog_for_user($user->ID) && ! is_super_admin($user->ID)) { + $redirect_to = user_admin_url(); + } elseif (is_multisite() && ! $user->has_cap('read')) { + $redirect_to = get_dashboard_url($user->ID); + } elseif (! $user->has_cap('edit_posts')) { + $redirect_to = $user->has_cap('read') ? admin_url('profile.php') : home_url(); + } + + wp_redirect($redirect_to); + exit; + } + + wp_safe_redirect($redirect_to); + exit; + } + + $errors = $user; + // Clear errors if loggedout is set. + if (! empty($_GET['loggedout']) || $reauth) { + $errors = new WP_Error(); + } + + if (empty($_POST) && $errors->get_error_codes() === array('empty_username', 'empty_password')) { + $errors = new WP_Error('', ''); + } + + if ($interim_login) { + if (! $errors->has_errors()) { + $errors->add('expired', __('Your session has expired. Please log in to continue where you left off.'), 'message'); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + } + } else { + // Some parts of this script use the main login form to display a message. + if (isset($_GET['loggedout']) && $_GET['loggedout']) { + $errors->add('loggedout', __('You are now logged out.'), 'message'); + } elseif (isset($_GET['registration']) && 'disabled' === $_GET['registration']) { + $errors->add('registerdisabled', __('User registration is currently not allowed.')); + } elseif (strpos($redirect_to, 'about.php?updated')) { + $errors->add('updated', __('You have successfully updated WordPress! Please log back in to see what’s new.'), 'message'); + } elseif (WP_Recovery_Mode_Link_Service::LOGIN_ACTION_ENTERED === $action) { + $errors->add('enter_recovery_mode', __('Recovery Mode Initialized. Please log in to continue.'), 'message'); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + } elseif (isset($_GET['redirect_to']) && false !== strpos($_GET['redirect_to'], 'wp-admin/authorize-application.php')) { + $query_component = wp_parse_url($_GET['redirect_to'], PHP_URL_QUERY); + parse_str($query_component, $query); + + if (! empty($query['app_name'])) { + /* translators: 1: Website name, 2: Application name. */ + $message = sprintf('Please log in to %1$s to authorize %2$s to connect to your account.', get_bloginfo('name', 'display'), '' . esc_html($query['app_name']) . ''); + } else { + /* translators: %s: Website name. */ + $message = sprintf('Please log in to %s to proceed with authorization.', get_bloginfo('name', 'display')); + } + + $errors->add('authorize_application', $message, 'message'); + } + } + + /** + * Filters the login page errors. + * + * @since 3.6.0 + * + * @param WP_Error $errors WP Error object. + * @param string $redirect_to Redirect destination URL. + */ + $errors = apply_filters('wp_login_errors', $errors, $redirect_to); + + // Clear any stale cookies. + if ($reauth) { + wp_clear_auth_cookie(); + } + + login_header(__('Log In'), '', $errors); + + if (isset($_POST['log'])) { + $user_login = ('incorrect_password' === $errors->get_error_code() || 'empty_password' === $errors->get_error_code()) ? esc_attr(wp_unslash($_POST['log'])) : ''; + } + + $rememberme = ! empty($_POST['rememberme']); + + if ($errors->has_errors()) { + $aria_describedby_error = ' aria-describedby="login_error"'; + } else { + $aria_describedby_error = ''; + } + + wp_enqueue_script('user-profile'); + + //aiowps - this check is necessary because otherwise if variables are undefined we get a warning! + if (empty($user_login)) { + $user_login = ''; + } + if (empty($error)) { + $error = ''; + } + ?> + +
            +

            + + class="input" value="" size="20" autocapitalize="off" /> +

            + +
            + +
            + class="input password-input" value="" size="20" /> + +
            +
            + +

            />

            +

            + + + + + + + + + +

            +
            + + + + get_error_code() === 'invalid_username') { + $login_script .= 'd.value = "";'; + } + } + + $login_script .= 'd.focus(); d.select();'; + $login_script .= '} catch(er) {}'; + $login_script .= '}, 200);'; + $login_script .= "}\n"; // End of wp_attempt_focus(). + + /** + * Filters whether to print the call to `wp_attempt_focus()` on the login screen. + * + * @since 4.8.0 + * + * @param bool $print Whether to print the function call. Default true. + */ + if (apply_filters('enable_login_autofocus', true) && ! $error) { + $login_script .= "wp_attempt_focus();\n"; + } + + // Run `wpOnload()` if defined. + $login_script .= "if (typeof wpOnload === 'function') { wpOnload() }"; + ?> + + + + ` element. + * Default 'Log In'. + * @param string $message Optional. Message to display in header. Default empty. + * @param WP_Error $wp_error Optional. The error to pass. Default is a WP_Error instance. + */ +function login_header($title = 'Log In', $message = '', $wp_error = null) { + global $error, $interim_login, $action; + + // Don't index any of these forms. + add_filter('wp_robots', 'wp_robots_sensitive_page'); + add_action('login_head', 'wp_strict_cross_origin_referrer'); + + add_action('login_head', 'wp_login_viewport_meta'); + + if (! is_wp_error($wp_error)) { + $wp_error = new WP_Error(); + } + + // Shake it! + $shake_error_codes = array('empty_password', 'empty_email', 'invalid_email', 'invalidcombo', 'empty_username', 'invalid_username', 'incorrect_password', 'retrieve_password_email_failure'); + /** + * Filters the error codes array for shaking the login form. + * + * @since 3.0.0 + * + * @param array $shake_error_codes Error codes that shake the login form. + */ + $shake_error_codes = apply_filters('shake_error_codes', $shake_error_codes); + + if ($shake_error_codes && $wp_error->has_errors() && in_array($wp_error->get_error_code(), $shake_error_codes, true)) { + add_action('login_footer', 'wp_shake_js', 12); + } + + $login_title = get_bloginfo('name', 'display'); + + /* translators: Login screen title. 1: Login screen name, 2: Network or site name. */ + $login_title = sprintf(__('%1$s ‹ %2$s — WordPress'), $title, $login_title); + + if (wp_is_recovery_mode()) { + /* translators: %s: Login screen title. */ + $login_title = sprintf(__('Recovery Mode — %s'), $login_title); + } + + /** + * Filters the title tag content for login page. + * + * @since 4.9.0 + * + * @param string $login_title The page title, with extra context added. + * @param string $title The original page title. + */ + $login_title = apply_filters('login_title', $login_title, $title); + + ?> + > + + + <?php echo esc_html($login_title); ?> + get_error_code()) { + ?> + + + + + + + + +
            +

            + add('error', $error); + unset($error); + } + + if ($wp_error->has_errors()) { + $errors = ''; + $messages = ''; + + foreach ($wp_error->get_error_codes() as $code) { + $severity = $wp_error->get_error_data($code); + foreach ($wp_error->get_error_messages($code) as $error_message) { + if ('message' === $severity) { + $messages .= ' ' . $error_message . "
            \n"; + } else { + $errors .= ' ' . $error_message . "
            \n"; + } + } + } + + if (! empty($errors)) { + /** + * Filters the error messages displayed above the login form. + * + * @since 2.1.0 + * + * @param string $errors Login error message. + */ + echo '
            ' . wp_kses_post(apply_filters('login_errors', $errors)) . "
            \n"; + } + + if (! empty($messages)) { + /** + * Filters instructional messages displayed above the login form. + * + * @since 2.5.0 + * + * @param string $messages Login messages. + */ + echo '

            ' . wp_kses_post(apply_filters('login_messages', $messages)) . "

            \n"; + } + } +} // End of login_header(). + +/** + * Outputs the footer for the login page. + * + * @since 3.1.0 + * + * @global bool|string $interim_login Whether interim login modal is being displayed. String 'success' + * upon successful login. + * @global AIO_WP_Security $aio_wp_security + * + * @param string $input_id Which input to auto-focus. + */ +function login_footer($input_id = '') { + global $interim_login, $aio_wp_security; + + // Don't allow interim logins to navigate away from the page. + if (! $interim_login) { + ?> +

            + +

            + ', '
            '); + } + + ?> +
            . ?> + + +
            +
            + + + + 'language-switcher-locales', + 'name' => 'wp_lang', + 'selected' => determine_locale(), + 'show_available_translations' => false, + 'explicit_option_en_us' => true, + 'languages' => $languages, + ); + + /** + * Filters default arguments for the Languages select input on the login screen. + * + * The arguments get passed to the wp_dropdown_languages() function. + * + * @since 5.9.0 + * + * @param array $args Arguments for the Languages select input on the login screen. + */ + wp_dropdown_languages(apply_filters('login_language_dropdown_args', $args)); + ?> + + + + + + + + + + + + + + + + + + + + + +
            +
            + + + + + +
            + + + + + + + 0) { + update_option('admin_email_lifespan', time() + $remind_interval); + } + + $redirect_to = add_query_arg('admin_email_remind_later', 1, $redirect_to); + wp_safe_redirect($redirect_to); + exit; + } + + if (! empty($_POST['correct-admin-email'])) { + if (! check_admin_referer('confirm_admin_email', 'confirm_admin_email_nonce')) { + wp_safe_redirect(wp_login_url()); + exit; + } + + /** + * Filters the interval for redirecting the user to the admin email confirmation screen. + * + * If `0` (zero) is returned, the user will not be redirected. + * + * @since 5.3.0 + * + * @param int $interval Interval time (in seconds). Default is 6 months. + */ + $admin_email_check_interval = (int) apply_filters('admin_email_check_interval', 6 * MONTH_IN_SECONDS); + + if ($admin_email_check_interval > 0) { + update_option('admin_email_lifespan', time() + $admin_email_check_interval); + } + + wp_safe_redirect($redirect_to); + exit; + } + + login_header(__('Confirm your administration email'), '', $errors); + + /** + * Fires before the admin email confirm form. + * + * @since 5.3.0 + * + * @param WP_Error $errors A `WP_Error` object containing any errors generated by using invalid + * credentials. Note that the error object may not contain any errors. + */ + do_action('admin_email_confirm', $errors); + ?> + +
            + + + +

            + +

            +

            + administration email for this website is still correct.'); ?> + %s', __('(opens in a new tab)')); + + printf( + '%s%s', + esc_url($admin_email_help_url), + esc_html__('Why is this important?'), + wp_kses_post($accessibility_text) + ); + ?> +

            +

            + ' . esc_html($admin_email) . '' + ); + ?> +

            +

            + +

            + +
            +
            + + + +
            + 0) : ?> +
            + 'confirm_admin_email', + 'remind_me_later' => wp_create_nonce('remind_me_later_nonce'), + ), + $remind_me_link + ); + ?> + +
            + +
            +
            + + HashPassword(wp_unslash($_POST['post_password'])), $expire, COOKIEPATH, COOKIE_DOMAIN, is_ssl(), true); + + wp_safe_redirect(wp_get_referer()); + exit; + + case 'logout': + check_admin_referer('log-out'); + + $user = wp_get_current_user(); + + wp_logout(); + + if (! empty($_REQUEST['redirect_to'])) { + $redirect_to = sanitize_url(wp_unslash($_REQUEST['redirect_to'])); + $requested_redirect_to = $redirect_to; + } else { + $redirect_to = add_query_arg( + array( + 'loggedout' => 'true', + 'wp_lang' => get_user_locale($user), + ), + wp_login_url() + ); + + $requested_redirect_to = ''; + } + + /** + * Filters the log out redirect URL. + * + * @since 4.2.0 + * + * @param string $redirect_to The redirect destination URL. + * @param string $requested_redirect_to The requested redirect destination URL passed as a parameter. + * @param WP_User $user The WP_User object for the user that's logging out. + */ + $redirect_to = apply_filters('logout_redirect', $redirect_to, $requested_redirect_to, $user); + + wp_safe_redirect($redirect_to); + exit; + + case 'lostpassword': + case 'retrievepassword': + if ($http_post) { + $errors = retrieve_password(); + + if (! is_wp_error($errors)) { + $redirect_to = ! empty($_REQUEST['redirect_to']) ? sanitize_url(wp_unslash($_REQUEST['redirect_to'])) : 'wp-login.php?checkemail=confirm'; + wp_safe_redirect($redirect_to); + exit; + } + } + + if (isset($_GET['error'])) { + if ('invalidkey' === $_GET['error']) { + // translators: %s: 'ERROR' + $errors->add('invalidkey', sprintf(__('%s: Your password reset link appears to be invalid.') . ' ' . __('Please request a new link below.'), '' . __('ERROR') . '')); + } elseif ('expiredkey' === $_GET['error']) { + // translators: %s: 'ERROR' + $errors->add('expiredkey', sprintf(__('%s: Your password reset link has expired.') . ' ' . __('Please request a new link below.'), '' . __('ERROR') . '')); + } + } + + $lostpassword_redirect = ! empty($_REQUEST['redirect_to']) ? sanitize_url(wp_unslash($_REQUEST['redirect_to'])) : ''; + /** + * Filters the URL redirected to after submitting the lostpassword/retrievepassword form. + * + * @since 3.0.0 + * + * @param string $lostpassword_redirect The redirect destination URL. + */ + $redirect_to = apply_filters('lostpassword_redirect', $lostpassword_redirect); + + /** + * Fires before the lost password form. + * + * @since 1.5.1 + * @since 5.1.0 Added the `$errors` parameter. + * + * @param WP_Error $errors A `WP_Error` object containing any errors generated by using invalid + * credentials. Note that the error object may not contain any errors. + */ + do_action('lost_password', $errors); + + login_header(__('Lost Password'), '

            ' . __('Please enter your username or email address. You will receive an email message with instructions on how to reset your password.') . '

            ', $errors); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- ignore this to use WordPress translation + + $user_login = ''; + + if (isset($_POST['user_login']) && is_string($_POST['user_login'])) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized below. + $user_login = wp_unslash($_POST['user_login']); // Remove slashes first + + if (is_email($user_login)) { + // Sanitize as an email address + $user_login = sanitize_email($user_login); + } else { + // Sanitize as a username + $user_login = sanitize_user($user_login, true); + } + } + + ?> + +
            +

            + + +

            + + +

            + +

            +
            + + + get_error_code() === 'expired_key') { + wp_redirect(site_url('wp-login.php?action=lostpassword&error=expiredkey')); + } else { + wp_redirect(site_url('wp-login.php?action=lostpassword&error=invalidkey')); + } + + exit; + } + + $errors = new WP_Error(); + + // Check if password is one or all empty spaces. + if (!empty($_POST['pass1'])) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Not recommended to sanitize password. + $_POST['pass1'] = trim($_POST['pass1']); + if (empty($_POST['pass1'])) { + $errors->add('password_reset_empty_space', __('The password cannot be a space or all spaces.')); + } + } + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Not recommended to sanitize password. + if (!empty($_POST['pass1']) && trim($_POST['pass2']) !== $_POST['pass1']) { + $errors->add('password_reset_mismatch', __('Error: The passwords do not match.')); + } + + /** + * Fires before the password reset procedure is validated. + * + * @since 3.5.0 + * + * @param WP_Error $errors WP Error object. + * @param WP_User|WP_Error $user WP_User object if the login and reset key match. WP_Error object otherwise. + */ + do_action('validate_password_reset', $errors, $user); + + if ((! $errors->has_errors()) && isset($_POST['pass1']) && ! empty($_POST['pass1'])) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Not recommended to sanitize password. + reset_password($user, wp_unslash($_POST['pass1'])); + setcookie($rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true); + login_header(__('Password Reset'), '

            ' . __('Your password has been reset.') . ' ' . __('Log in') . '

            '); + login_footer(); + exit; + } + + wp_enqueue_script('utils'); + wp_enqueue_script('user-profile'); + + login_header(__('Reset Password'), '

            ' . __('Enter your new password below or generate one.') . '

            ', $errors); + ?> +
            + + +
            +

            + +

            + +
            + + + +
            +
            +
            + + +
            +
            + +

            + + +

            + +

            +
            + + + +

            + + +

            +
            + + + ' . __('Register For This Site') . '

            ', $errors); + ?> +
            +

            + + +

            +

            + + +

            + +

            + +

            +
            + +

            + +

            +
            + + + add( + 'confirm', + sprintf( + /* translators: %s: Link to the login page. */ + __('Check your email for the confirmation link, then visit the login page.'), + wp_login_url() + ), + 'message' + ); + } elseif ('registered' === $_GET['checkemail']) { + $errors->add( + 'registered', + sprintf( + /* translators: %s: Link to the login page. */ + __('Registration complete.') . ' ' . __('Please check your email, then visit the login page.'), + wp_login_url() + ), + 'message' + ); + } + + // This action is documented in wp-login.php + $errors = apply_filters('wp_login_errors', $errors, $redirect_to); + + login_header(__('Check your email'), '', $errors); + login_footer(); + break; + + case 'confirmaction': + if (! isset($_GET['request_id'])) { + wp_die(esc_html__('Missing request ID.')); + } + + if (! isset($_GET['confirm_key'])) { + wp_die(esc_html__('Missing confirm key.')); + } + + $request_id = (int) $_GET['request_id']; + $key = sanitize_text_field(wp_unslash($_GET['confirm_key'])); + $result = wp_validate_user_request_key($request_id, $key); + + if (is_wp_error($result)) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- WP_Error is an object and cannot be escaped. + wp_die($result); + } + + /** + * Fires an action hook when the account action has been confirmed by the user. + * + * Using this you can assume the user has agreed to perform the action by + * clicking on the link in the confirmation email. + * + * After firing this action hook the page will redirect to wp-login a callback + * redirects or exits first. + * + * @since 4.9.6 + * + * @param int $request_id Request ID. + */ + do_action('user_request_action_confirmed', $request_id); + + $message = _wp_privacy_account_request_confirmed_message($request_id); + + login_header(__('User action confirmed.'), $message); + login_footer(); + exit; + + case 'login': + default: + $secure_cookie = ''; + $customize_login = isset($_REQUEST['customize-login']); + + if ($customize_login) { + wp_enqueue_script('customize-base'); + } + + // If the user wants SSL but the session is not SSL, force a secure cookie. + if (! empty($_POST['log']) && ! force_ssl_admin()) { + $user_name = sanitize_user(wp_unslash($_POST['log'])); + $user = get_user_by('login', $user_name); + + if (! $user && strpos($user_name, '@')) { + $user = get_user_by('email', $user_name); + } + + if ($user) { + if (get_user_option('use_ssl', $user->ID)) { + $secure_cookie = true; + force_ssl_admin(true); + } + } + } + + if (isset($_REQUEST['redirect_to'])) { + $redirect_to = sanitize_url(wp_unslash($_REQUEST['redirect_to'])); + // Redirect to HTTPS if user wants SSL. + if ($secure_cookie && false !== strpos($redirect_to, 'wp-admin')) { + $redirect_to = preg_replace('|^http://|', 'https://', $redirect_to); + } + } else { + $redirect_to = admin_url(); + } + + $reauth = empty($_REQUEST['reauth']) ? false : true; + + $user = wp_signon(array(), $secure_cookie); + + if (empty($_COOKIE[LOGGED_IN_COOKIE])) { + if (headers_sent()) { + $user = new WP_Error( + 'test_cookie', + sprintf( + // translators: 1: 'ERROR', 2: 'this documentation'(Browser cookie documentation link), 3: 'support forums'(Support forums link) + __('%1$s: Cookies are blocked due to unexpected output.') . ' ' . __('For help, please see %2$s or try the %3$s.'), + '' . __('ERROR') . '', + '' . __('this documentation') . '', + '' . __('support forums') . '' + ) + ); + } elseif (isset($_POST['testcookie']) && empty($_COOKIE[TEST_COOKIE])) { + // If cookies are disabled, we can't log in even with a valid user and password. + $user = new WP_Error( + 'test_cookie', + sprintf( + // translators: 1: 'ERROR', 2: 'enable cookies'(Browser cookie documentation link) + __('%1$s: Cookies are blocked or not supported by your browser.') . ' ' . __('You must %2$s to use WordPress.'), + '' . __('ERROR') . '', + '' . __('enable cookies') . '' + ) + ); + } + } + + $requested_redirect_to = isset($_REQUEST['redirect_to']) ? sanitize_url(wp_unslash($_REQUEST['redirect_to'])) : ''; + /** + * Filters the login redirect URL. + * + * @since 3.0.0 + * + * @param string $redirect_to The redirect destination URL. + * @param string $requested_redirect_to The requested redirect destination URL passed as a parameter. + * @param WP_User|WP_Error $user WP_User object if login was successful, WP_Error object otherwise. + */ + $redirect_to = apply_filters('login_redirect', $redirect_to, $requested_redirect_to, $user); + + if (! is_wp_error($user) && ! $reauth) { + if ($interim_login) { + $message = '

            ' . __('You have logged in successfully.') . '

            '; + $interim_login = 'success'; + login_header('', $message); + ?> +
            + + + + + exists() && $user->has_cap('manage_options')) { + $admin_email_lifespan = (int) get_option('admin_email_lifespan'); + + // If `0` (or anything "falsey" as it is cast to int) is returned, the user will not be redirected + // to the admin email confirmation screen. + // This filter is documented in wp-login.php + $admin_email_check_interval = (int) apply_filters('admin_email_check_interval', 6 * MONTH_IN_SECONDS); + + if ($admin_email_check_interval > 0 && time() > $admin_email_lifespan) { + $redirect_to = add_query_arg( + array( + 'action' => 'confirm_admin_email', + 'wp_lang' => get_user_locale($user), + ), + wp_login_url($redirect_to) + ); + } + } + + if ((empty($redirect_to) || 'wp-admin/' === $redirect_to || admin_url() === $redirect_to)) { + // 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. + if (is_multisite() && ! get_active_blog_for_user($user->ID) && ! is_super_admin($user->ID)) { + $redirect_to = user_admin_url(); + } elseif (is_multisite() && ! $user->has_cap('read')) { + $redirect_to = get_dashboard_url($user->ID); + } elseif (! $user->has_cap('edit_posts')) { + $redirect_to = $user->has_cap('read') ? admin_url('profile.php') : home_url(); + } + + wp_redirect($redirect_to); + exit; + } + + wp_safe_redirect($redirect_to); + exit; + } + + $errors = $user; + // Clear errors if loggedout is set. + if (! empty($_GET['loggedout']) || $reauth) { + $errors = new WP_Error(); + } + + if (empty($_POST) && $errors->get_error_codes() === array('empty_username', 'empty_password')) { + $errors = new WP_Error('', ''); + } + + if ($interim_login) { + if (! $errors->has_errors()) { + $errors->add('expired', __('Your session has expired. Please log in to continue where you left off.'), 'message'); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- ignore this to use WordPress translation + } + } else { + // Some parts of this script use the main login form to display a message. + if (isset($_GET['loggedout']) && sanitize_text_field(wp_unslash($_GET['loggedout']))) { + $errors->add('loggedout', __('You are now logged out.'), 'message'); + } elseif (isset($_GET['registration']) && 'disabled' === $_GET['registration']) { + $errors->add('registerdisabled', __('Error: User registration is currently not allowed.')); + } elseif (strpos($redirect_to, 'about.php?updated')) { + $errors->add('updated', __('You have successfully updated WordPress! Please log back in to see what’s new.'), 'message'); + } elseif (WP_Recovery_Mode_Link_Service::LOGIN_ACTION_ENTERED === $action) { + $errors->add('enter_recovery_mode', __('Recovery Mode Initialized. Please log in to continue.'), 'message'); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- ignore this to use WordPress translation + } elseif (isset($_GET['redirect_to']) && false !== strpos(sanitize_url(wp_unslash($_GET['redirect_to'])), 'wp-admin/authorize-application.php')) { + $query_component = wp_parse_url(sanitize_url(wp_unslash($_GET['redirect_to'])), PHP_URL_QUERY); + parse_str($query_component, $query); + + if (! empty($query['app_name'])) { + /* translators: 1: Website name, 2: Application name. */ + $message = sprintf('Please log in to %1$s to authorize %2$s to connect to your account.', get_bloginfo('name', 'display'), '' . esc_html($query['app_name']) . ''); + } else { + /* translators: %s: Website name. */ + $message = sprintf('Please log in to %s to proceed with authorization.', get_bloginfo('name', 'display')); + } + + $errors->add('authorize_application', $message, 'message'); + } + } + + /** + * Filters the login page errors. + * + * @since 3.6.0 + * + * @param WP_Error $errors WP Error object. + * @param string $redirect_to Redirect destination URL. + */ + $errors = apply_filters('wp_login_errors', $errors, $redirect_to); + + // Clear any stale cookies. + if ($reauth) { + wp_clear_auth_cookie(); + } + + login_header(__('Log In'), '', $errors); + + if (isset($_POST['log'])) { + $user_login = ('incorrect_password' === $errors->get_error_code() || 'empty_password' === $errors->get_error_code()) ? esc_attr(sanitize_text_field(wp_unslash($_POST['log']))) : ''; + } + + $rememberme = ! empty($_POST['rememberme']); + + $aria_describedby = ''; + $has_errors = $errors->has_errors(); + + if ($has_errors) { + $aria_describedby = ' aria-describedby="login_error"'; + } + + if ($has_errors && 'message' === $errors->get_error_data()) { + $aria_describedby = ' aria-describedby="login-message"'; + } + + wp_enqueue_script('user-profile'); + + //aiowps - this check is necessary because otherwise if variables are undefined we get a warning! + if (empty($user_login)) { + $user_login = ''; + } + if (empty($error)) { + $error = ''; + } + ?> + +
            +

            + + class="input" value="" size="20" autocapitalize="off" /> +

            + +
            + +
            + class="input password-input" value="" size="20" /> + +
            +
            + +

            />

            +

            + + + + + + + + + +

            +
            + + + + get_error_code() === 'invalid_username') { + $login_script .= 'd.value = "";'; + } + } + + $login_script .= 'd.focus(); d.select();'; + $login_script .= '} catch(er) {}'; + $login_script .= '}, 200);'; + $login_script .= "}\n"; // End of wp_attempt_focus(). + + /** + * Filters whether to print the call to `wp_attempt_focus()` on the login screen. + * + * @since 4.8.0 + * + * @param bool $print Whether to print the function call. Default true. + */ + if (apply_filters('enable_login_autofocus', true) && ! $error) { + $login_script .= "wp_attempt_focus();\n"; + } + + // Run `wpOnload()` if defined. + $login_script .= "if (typeof wpOnload === 'function') { wpOnload() }"; + ?> + + + + configs->get_value('aiowps_login_page_slug'); +$custom_login_url = home_url('/' . ltrim($login_slug, '/') . '/'); + +// Redirect to HTTPS login if forced to use SSL. +if (force_ssl_admin() && !is_ssl()) { + $request_uri = isset($_SERVER['REQUEST_URI']) ? sanitize_text_field(wp_unslash($_SERVER['REQUEST_URI'])) : ''; + if (0 === strpos($request_uri, 'http')) { + wp_safe_redirect(set_url_scheme($request_uri, 'https')); + exit; + } else { + wp_safe_redirect('https://' . isset($_SERVER['HTTP_HOST']) ? sanitize_text_field(wp_unslash($_SERVER['HTTP_HOST'])) : '' . $request_uri); + exit; + } +} + +/** + * Outputs the login page header. + * + * @since 2.1.0 + * + * @global string $error Login error message set by deprecated pluggable wp_login() function + * or plugins replacing it. + * @global bool|string $interim_login Whether interim login modal is being displayed. String 'success' + * upon successful login. + * @global string $action The action that brought the visitor to the login page. + * + * @param string|null $title Optional. WordPress login page title to display in the `` element. + * Defaults to 'Log In'. + * @param string $message Optional. Message to display in header. Default empty. + * @param WP_Error|null $wp_error Optional. The error to pass. Defaults to a WP_Error instance. + */ +function login_header($title = null, $message = '', $wp_error = null) { + global $error, $interim_login, $action; + + if (null === $title) { + $title = __('Log In'); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. This is a default WordPress translation string + } + + // Don't index any of these forms. + add_filter('wp_robots', 'wp_robots_sensitive_page'); + add_action('login_head', 'wp_strict_cross_origin_referrer'); + + add_action('login_head', 'wp_login_viewport_meta'); + + if (!is_wp_error($wp_error)) { + $wp_error = new WP_Error(); + } + + // Shake it! + $shake_error_codes = array('empty_password', 'empty_email', 'invalid_email', 'invalidcombo', 'empty_username', 'invalid_username', 'incorrect_password', 'retrieve_password_email_failure'); + /** + * Filters the error codes array for shaking the login form. + * + * @since 3.0.0 + * + * @param string[] $shake_error_codes Error codes that shake the login form. + */ + $shake_error_codes = apply_filters('shake_error_codes', $shake_error_codes); + + if ($shake_error_codes && $wp_error->has_errors() && in_array($wp_error->get_error_code(), $shake_error_codes, true)) { + add_action('login_footer', 'wp_shake_js', 12); + } + + $login_title = get_bloginfo('name', 'display'); + + /* translators: Login screen title. 1: Login screen name, 2: Network or site name. */ + $login_title = sprintf(__('%1$s ‹ %2$s — WordPress'), $title, $login_title); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. This is a default WordPress translation string + + if (wp_is_recovery_mode()) { + /* translators: %s: Login screen title. */ + $login_title = sprintf(__('Recovery Mode — %s'), $login_title); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. This is a default WordPress translation string + } + + /** + * Filters the title tag content for login page. + * + * @since 4.9.0 + * + * @param string $login_title The page title, with extra context added. + * @param string $title The original page title. + */ + $login_title = apply_filters('login_title', $login_title, $title); + ?><!DOCTYPE html> + <html <?php language_attributes(); ?>> + <head> + <meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php bloginfo('charset'); ?>" /> + <title><?php echo esc_html($login_title); ?> + get_error_code()) { + ob_start(); + ?> + + + + + + + + + + +

            + +
            +

            + add('error', $error); + unset($error); + } + + if ($wp_error->has_errors()) { + $error_list = array(); + $messages = ''; + + foreach ($wp_error->get_error_codes() as $code) { + $severity = $wp_error->get_error_data($code); + foreach ($wp_error->get_error_messages($code) as $error_message) { + if ('message' === $severity) { + $messages .= '

            ' . $error_message . '

            '; + } else { + $error_list[] = $error_message; + } + } + } + + if (!empty($error_list)) { + $errors = ''; + + if (count($error_list) > 1) { + $errors .= ''; + } else { + $errors .= '

            ' . $error_list[0] . '

            '; + } + + /** + * Filters the error messages displayed above the login form. + * + * @since 2.1.0 + * + * @param string $errors Login error messages. + */ + $errors = apply_filters('login_errors', $errors); + + wp_admin_notice( + $errors, + array( + 'type' => 'error', + 'id' => 'login_error', + 'paragraph_wrap' => false, + ) + ); + } + + if (!empty($messages)) { + /** + * Filters instructional messages displayed above the login form. + * + * @since 2.5.0 + * + * @param string $messages Login messages. + */ + $messages = apply_filters('login_messages', $messages); + + wp_admin_notice( + $messages, + array( + 'type' => 'info', + 'id' => 'login-message', + 'additional_classes' => array('message'), + 'paragraph_wrap' => false, + ) + ); + } + } +} // End of login_header(). + +/** + * Outputs the footer for the login page. + * + * @since 3.1.0 + * + * @global bool|string $interim_login Whether interim login modal is being displayed. String 'success' + * upon successful login. + * + * @param string $input_id Which input to auto-focus. + */ +function login_footer($input_id = '') { + global $interim_login, $aio_wp_security; + + // Don't allow interim logins to navigate away from the page. + if (!$interim_login) { + ?> +

            + %s', + esc_url(home_url('/')), + sprintf( + /* translators: %s: Site title. */ + _x('← Go to %s', 'site'), + get_bloginfo('title', 'display') + ) + ); + /** + * Filters the "Go to site" link displayed in the login page footer. + * + * @since 5.7.0 + * + * @param string $link HTML link to the home URL of the current site. + */ + echo apply_filters('login_site_html_link', $html_link); + ?> +

            + ', '
            '); + } + ?> + . ?> + +
            +
            + + + + 'language-switcher-locales', + 'name' => 'wp_lang', + 'selected' => determine_locale(), + 'show_available_translations' => false, + 'explicit_option_en_us' => true, + 'languages' => $languages, + ); + + /** + * Filters default arguments for the Languages select input on the login screen. + * + * The arguments get passed to the wp_dropdown_languages() function. + * + * @since 5.9.0 + * + * @param array $args Arguments for the Languages select input on the login screen. + */ + wp_dropdown_languages(apply_filters('login_language_dropdown_args', $args)); + ?> + + + + + + + + + + + + + + + + + + + + + +
            +
            + + + + + + + + + + + 0) { + update_option('admin_email_lifespan', time() + $remind_interval); + } + + $redirect_to = add_query_arg('admin_email_remind_later', 1, $redirect_to); + wp_safe_redirect($redirect_to); + exit; + } + + if (!empty($_POST['correct-admin-email'])) { + if (!check_admin_referer('confirm_admin_email', 'confirm_admin_email_nonce')) { + wp_safe_redirect($custom_login_url); + exit; + } + + /** + * Filters the interval for redirecting the user to the admin email confirmation screen. + * + * If `0` (zero) is returned, the user will not be redirected. + * + * @since 5.3.0 + * + * @param int $interval Interval time (in seconds). Default is 6 months. + */ + $admin_email_check_interval = (int) apply_filters('admin_email_check_interval', 6 * MONTH_IN_SECONDS); + + if ($admin_email_check_interval > 0) { + update_option('admin_email_lifespan', time() + $admin_email_check_interval); + } + + wp_safe_redirect($redirect_to); + exit; + } + + login_header(__('Confirm your administration email'), '', $errors); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. This is a default WordPress translation string + + /** + * Fires before the admin email confirm form. + * + * @since 5.3.0 + * + * @param WP_Error $errors A `WP_Error` object containing any errors generated by using invalid + * credentials. Note that the error object may not contain any errors. + */ + do_action('admin_email_confirm', $errors); + ?> + +
            + + + +

            + +

            +

            + administration email for this website is still correct.'); ?> + %s', + /* translators: Hidden accessibility text. */ + __('(opens in a new tab)') // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. This is a default WordPress translation string + ); + + printf( + '%s%s', + esc_url($admin_email_help_url), + __('Why is this important?'), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. This is a default WordPress translation string + wp_kses_post($accessibility_text) + ); + ?> +

            +

            + ' . esc_html($admin_email) . '' + ); + ?> +

            +

            + +

            + +
            +
            + + + +
            + +
            + 'confirm_admin_email', + 'remind_me_later' => wp_create_nonce('remind_me_later_nonce'), + ), + $remind_me_link + ); + ?> + +
            + +
            +
            + + HashPassword(wp_unslash($_POST['post_password'])), $expire, COOKIEPATH, COOKIE_DOMAIN, $secure); + + wp_safe_redirect(wp_get_referer()); + exit; + + case 'logout': + check_admin_referer('log-out'); + + $user = wp_get_current_user(); + + wp_logout(); + + if (!empty($_REQUEST['redirect_to']) && is_string($_REQUEST['redirect_to'])) { + $redirect_to = sanitize_url(wp_unslash($_REQUEST['redirect_to'])); + $requested_redirect_to = $redirect_to; + } else { + $redirect_to = add_query_arg( + array( + 'loggedout' => 'true', + 'wp_lang' => get_user_locale($user), + ), + $custom_login_url + ); + + $requested_redirect_to = ''; + } + + /** + * Filters the log out redirect URL. + * + * @since 4.2.0 + * + * @param string $redirect_to The redirect destination URL. + * @param string $requested_redirect_to The requested redirect destination URL passed as a parameter. + * @param WP_User $user The WP_User object for the user that's logging out. + */ + $redirect_to = apply_filters('logout_redirect', $redirect_to, $requested_redirect_to, $user); + + wp_safe_redirect($redirect_to); + exit; + + case 'lostpassword': + case 'retrievepassword': + if ($http_post) { + $errors = retrieve_password(); + + if (!is_wp_error($errors)) { + $redirect_to = !empty($_REQUEST['redirect_to']) ? sanitize_url(wp_unslash($_REQUEST['redirect_to'])) : 'wp-login.php?checkemail=confirm'; + wp_safe_redirect($redirect_to); + exit; + } + } + + if (isset($_GET['error'])) { + if ('invalidkey' === $_GET['error']) { + $errors->add('invalidkey', __('Your password reset link appears to be invalid. Please request a new link below.')); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + } elseif ('expiredkey' === $_GET['error']) { + $errors->add('expiredkey', __('Your password reset link has expired. Please request a new link below.')); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + } + } + + $lostpassword_redirect = !empty($_REQUEST['redirect_to']) ? sanitize_url(wp_unslash($_REQUEST['redirect_to'])) : ''; + /** + * Filters the URL redirected to after submitting the lostpassword/retrievepassword form. + * + * @since 3.0.0 + * + * @param string $lostpassword_redirect The redirect destination URL. + */ + $redirect_to = apply_filters('lostpassword_redirect', $lostpassword_redirect); + + /** + * Fires before the lost password form. + * + * @since 1.5.1 + * @since 5.1.0 Added the `$errors` parameter. + * + * @param WP_Error $errors A `WP_Error` object containing any errors generated by using invalid + * credentials. Note that the error object may not contain any errors. + */ + do_action('lost_password', $errors); + + login_header( + __('Lost Password'), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. This is a default WordPress translation string + wp_get_admin_notice( + __('Please enter your username or email address. You will receive an email message with instructions on how to reset your password.'), // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + array( + 'type' => 'info', + 'additional_classes' => array('message'), + ) + ), + $errors + ); + + $user_login = ''; + + if (isset($_POST['user_login']) && is_string($_POST['user_login'])) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized below. + $user_login = wp_unslash($_POST['user_login']); // Remove slashes first + + if (is_email($user_login)) { + // Sanitize as an email address + $user_login = sanitize_email($user_login); + } else { + // Sanitize as a username + $user_login = sanitize_user($user_login, true); + } + } + + ?> + +
            +

            + + +

            + + +

            + +

            +
            + + + get_error_code() === 'expired_key') { + wp_redirect(site_url('wp-login.php?action=lostpassword&error=expiredkey')); + } else { + wp_redirect(site_url('wp-login.php?action=lostpassword&error=invalidkey')); + } + + exit; + } + + $errors = new WP_Error(); + + // Check if password is one or all empty spaces. + if (!empty($_POST['pass1'])) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Not recommended to sanitize password. + $_POST['pass1'] = trim($_POST['pass1']); + + if (empty($_POST['pass1'])) { + $errors->add('password_reset_empty_space', __('The password cannot be a space or all spaces.')); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + } + } + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Not recommended to sanitize password. + // Check if password fields do not match. + if (!empty($_POST['pass1']) && trim($_POST['pass2']) !== $_POST['pass1']) { + $errors->add('password_reset_mismatch', __('Error: The passwords do not match.')); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + } + + /** + * Fires before the password reset procedure is validated. + * + * @since 3.5.0 + * + * @param WP_Error $errors WP Error object. + * @param WP_User|WP_Error $user WP_User object if the login and reset key match. WP_Error object otherwise. + */ + do_action('validate_password_reset', $errors, $user); + + if ((!$errors->has_errors()) && isset($_POST['pass1']) && !empty($_POST['pass1'])) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- PCP warning. Not recommended to sanitize password. + reset_password($user, $_POST['pass1']); + setcookie($rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true); + login_header( + __('Password Reset'), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. This is a default WordPress translation string + wp_get_admin_notice( + __('Your password has been reset.') . ' ' . __('Log in') . '', // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + array( + 'type' => 'info', + 'additional_classes' => array('message', 'reset-pass'), + ) + ) + ); + login_footer(); + exit; + } + + wp_enqueue_script('utils'); + wp_enqueue_script('user-profile'); + + login_header( + __('Reset Password'), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. This is a default WordPress translation string + wp_get_admin_notice( + __('Enter your new password below or generate one.'), // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + array( + 'type' => 'info', + 'additional_classes' => array('message', 'reset-pass'), + ) + ), + $errors + ); + ?> +
            + + +
            +

            + +

            + +
            + + + +
            +
            +
            + + +
            +
            + +

            + + +

            + +

            + + + +

            + + +

            +
            + + + 'info', + 'additional_classes' => array('message', 'register'), + ) + ), + $errors + ); + ?> +
            +

            + + +

            +

            + + +

            + +

            + +

            + +

            + +

            +
            + + + add( + 'confirm', + sprintf( + /* translators: %s: Link to the login page. */ + __('Check your email for the confirmation link, then visit the login page.'), // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + $custom_login_url + ), + 'message' + ); + } elseif ('registered' === $_GET['checkemail']) { + $errors->add( + 'registered', + sprintf( + /* translators: %s: Link to the login page. */ + __('Registration complete. Please check your email, then visit the login page.'), // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + $custom_login_url + ), + 'message' + ); + } + + /* This action is documented in wp-login.php */ + $errors = apply_filters('wp_login_errors', $errors, $redirect_to); + + login_header(__('Check your email'), '', $errors); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. This is a default WordPress translation string + login_footer(); + break; + + case 'confirmaction': + if (!isset($_GET['request_id'])) { + wp_die(__('Missing request ID.')); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. This is a default WordPress translation string + } + + if (!isset($_GET['confirm_key'])) { + wp_die(__('Missing confirm key.')); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. This is a default WordPress translation string + } + + $request_id = (int) $_GET['request_id']; + $key = sanitize_text_field(wp_unslash($_GET['confirm_key'])); + $result = wp_validate_user_request_key($request_id, $key); + + if (is_wp_error($result)) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- WP_Error is an object and cannot be escaped. + wp_die($result); + } + + /** + * Fires an action hook when the account action has been confirmed by the user. + * + * Using this you can assume the user has agreed to perform the action by + * clicking on the link in the confirmation email. + * + * After firing this action hook the page will redirect to wp-login a callback + * redirects or exits first. + * + * @since 4.9.6 + * + * @param int $request_id Request ID. + */ + do_action('user_request_action_confirmed', $request_id); + + $message = _wp_privacy_account_request_confirmed_message($request_id); + + login_header(__('User action confirmed.'), $message); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. This is a default WordPress translation string + login_footer(); + exit; + + case 'login': + default: + $secure_cookie = ''; + $customize_login = isset($_REQUEST['customize-login']); + + if ($customize_login) { + wp_enqueue_script('customize-base'); + } + + // If the user wants SSL but the session is not SSL, force a secure cookie. + if (!empty($_POST['log']) && !force_ssl_admin()) { + $user_name = sanitize_user(wp_unslash($_POST['log'])); + $user = get_user_by('login', $user_name); + + if (!$user && strpos($user_name, '@')) { + $user = get_user_by('email', $user_name); + } + + if ($user) { + if (get_user_option('use_ssl', $user->ID)) { + $secure_cookie = true; + force_ssl_admin(true); + } + } + } + + if (isset($_REQUEST['redirect_to']) && is_string($_REQUEST['redirect_to'])) { + $redirect_to = sanitize_url(wp_unslash($_REQUEST['redirect_to'])); + // Redirect to HTTPS if user wants SSL. + if ($secure_cookie && str_contains($redirect_to, 'wp-admin')) { + $redirect_to = preg_replace('|^http://|', 'https://', $redirect_to); + } + } else { + $redirect_to = admin_url(); + } + + $reauth = empty($_REQUEST['reauth']) ? false : true; + + $user = wp_signon(array(), $secure_cookie); + + if (empty($_COOKIE[LOGGED_IN_COOKIE])) { + if (headers_sent()) { + $user = new WP_Error( + 'test_cookie', + sprintf( + /* translators: 1: Browser cookie documentation URL, 2: Support forums URL. */ + __('Error: Cookies are blocked due to unexpected output. For help, please see this documentation or try the support forums.'), // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + esc_url(__('https://wordpress.org/support/article/cookies/')), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. This is a default WordPress translation string + esc_url(__('https://wordpress.org/support/forums/')) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. This is a default WordPress translation string + ) + ); + } elseif (isset($_POST['testcookie']) && empty($_COOKIE[TEST_COOKIE])) { + // If cookies are disabled, the user can't log in even with a valid username and password. + $user = new WP_Error( + 'test_cookie', + sprintf( + /* translators: %s: Browser cookie documentation URL. */ + __('%1$s: Cookies are blocked or not supported by your browser. You must %2$s to use WordPress.'), // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + '' . __('ERROR') . '', // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. This is a default WordPress translation string + '' . __('enable cookies') . '' // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. This is a default WordPress translation string + ) + ); + } + } + + $requested_redirect_to = isset($_REQUEST['redirect_to']) && is_string($_REQUEST['redirect_to']) ? $_REQUEST['redirect_to'] : ''; + + /** + * Filters the login redirect URL. + * + * @since 3.0.0 + * + * @param string $redirect_to The redirect destination URL. + * @param string $requested_redirect_to The requested redirect destination URL passed as a parameter. + * @param WP_User|WP_Error $user WP_User object if login was successful, WP_Error object otherwise. + */ + $redirect_to = apply_filters('login_redirect', $redirect_to, $requested_redirect_to, $user); + + if (!is_wp_error($user) && !$reauth) { + if ($interim_login) { + $message = '

            ' . __('You have logged in successfully.') . '

            '; // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + $interim_login = 'success'; + login_header('', $message); + ?> + + + + + + exists() && $user->has_cap('manage_options')) { + $admin_email_lifespan = (int) get_option('admin_email_lifespan'); + + /* + * If `0` (or anything "falsey" as it is cast to int) is returned, the user will not be redirected + * to the admin email confirmation screen. + */ + /*This filter is documented in wp-login.php */ + $admin_email_check_interval = (int) apply_filters('admin_email_check_interval', 6 * MONTH_IN_SECONDS); + + if ($admin_email_check_interval > 0 && time() > $admin_email_lifespan) { + + $redirect_to = add_query_arg( + array( + 'action' => 'confirm_admin_email', + 'wp_lang' => get_user_locale($user), + ), + wp_login_url($redirect_to) + ); + } + } + + if ((empty($redirect_to) || 'wp-admin/' === $redirect_to || admin_url() === $redirect_to)) { + // 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. + if (is_multisite() && !get_active_blog_for_user($user->ID) && !is_super_admin($user->ID)) { + $redirect_to = user_admin_url(); + } elseif (is_multisite() && !$user->has_cap('read')) { + $redirect_to = get_dashboard_url($user->ID); + } elseif (!$user->has_cap('edit_posts')) { + $redirect_to = $user->has_cap('read') ? admin_url('profile.php') : home_url(); + } + + wp_redirect($redirect_to); + exit; + } + + wp_safe_redirect($redirect_to); + exit; + } + + $errors = $user; + // Clear errors if loggedout is set. + if (!empty($_GET['loggedout']) || $reauth) { + $errors = new WP_Error(); + } + + if (empty($_POST) && $errors->get_error_codes() === array('empty_username', 'empty_password')) { + $errors = new WP_Error('', ''); + } + + if ($interim_login) { + if (!$errors->has_errors()) { + $errors->add('expired', __('Your session has expired. Please log in to continue where you left off.'), 'message'); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- ignore this to use WordPress translation + } + } else { + // Some parts of this script use the main login form to display a message. + if (isset($_GET['loggedout']) && $_GET['loggedout']) { + $errors->add('loggedout', __('You are now logged out.'), 'message'); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + } elseif (isset($_GET['registration']) && 'disabled' === $_GET['registration']) { + $errors->add('registerdisabled', __('Error: User registration is currently not allowed.')); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + } elseif (str_contains($redirect_to, 'about.php?updated')) { + $errors->add('updated', __('You have successfully updated WordPress! Please log back in to see what’s new.'), 'message'); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + } elseif (WP_Recovery_Mode_Link_Service::LOGIN_ACTION_ENTERED === $action) { + $errors->add('enter_recovery_mode', __('Recovery Mode Initialized.') . ' ' . __('Please log in to continue.'), 'message'); // phpcs:ignore UpdraftPlus.Translation.MultipleSentence.MultipleSentenceInsideTranslationFunction -- This is a WordPress translation. + } elseif (isset($_GET['redirect_to']) && false !== strpos(sanitize_url(wp_unslash($_GET['redirect_to'])), 'wp-admin/authorize-application.php')) { + $query_component = wp_parse_url(sanitize_url(wp_unslash($_GET['redirect_to'])), PHP_URL_QUERY); + $query = array(); + if ($query_component) { + parse_str($query_component, $query); + } + + if (!empty($query['app_name'])) { + /* translators: 1: Website name, 2: Application name. */ + $message = sprintf('Please log in to %1$s to authorize %2$s to connect to your account.', get_bloginfo('name', 'display'), '' . esc_html($query['app_name']) . ''); + } else { + /* translators: %s: Website name. */ + $message = sprintf('Please log in to %s to proceed with authorization.', get_bloginfo('name', 'display')); + } + + $errors->add('authorize_application', $message, 'message'); + } + } + + /** + * Filters the login page errors. + * + * @since 3.6.0 + * + * @param WP_Error $errors WP Error object. + * @param string $redirect_to Redirect destination URL. + */ + $errors = apply_filters('wp_login_errors', $errors, $redirect_to); + + // Clear any stale cookies. + if ($reauth) { + wp_clear_auth_cookie(); + } + + login_header(__('Log In'), '', $errors); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PCP error. This is a default WordPress translation string + + if (isset($_POST['log'])) { + $user_login = ('incorrect_password' === $errors->get_error_code() || 'empty_password' === $errors->get_error_code()) ? esc_attr(sanitize_text_field(wp_unslash($_POST['log']))) : ''; + } + + $rememberme = !empty($_POST['rememberme']); + + $aria_describedby = ''; + $has_errors = $errors->has_errors(); + + if ($has_errors) { + $aria_describedby = ' aria-describedby="login_error"'; + } + + if ($has_errors && 'message' === $errors->get_error_data()) { + $aria_describedby = ' aria-describedby="login-message"'; + } + + wp_enqueue_script('user-profile'); + + //aiowps - this check is necessary because otherwise if variables are undefined we get a warning! + if (empty($user_login)) { + $user_login = ''; + } + if (empty($error)) { + $error = ''; + } + ?> + +
            +

            + + class="input" value="" size="20" autocapitalize="off" autocomplete="username" required="required" /> +

            + +
            + +
            + class="input password-input" value="" size="20" autocomplete="current-password" spellcheck="false" required="required" /> + +
            +
            + +

            />

            +

            + + + + + + + + + +

            +
            + + + + get_error_code() === 'invalid_username') { + $login_script .= 'd.value = "";'; + } + } + + $login_script .= 'd.focus(); d.select();'; + $login_script .= '} catch(er) {}'; + $login_script .= '}, 200);'; + $login_script .= "}\n"; // End of wp_attempt_focus(). + + /** + * Filters whether to print the call to `wp_attempt_focus()` on the login screen. + * + * @since 4.8.0 + * + * @param bool $print Whether to print the function call. Default true. + */ + if (apply_filters('enable_login_autofocus', true) && !$error) { + $login_script .= "wp_attempt_focus();\n"; + } + + // Run `wpOnload()` if defined. + $login_script .= "if (typeof wpOnload === 'function') { wpOnload() }"; + + wp_print_inline_script_tag($login_script); + + if ($interim_login) { + ob_start(); + ?> + + + + + +<?php bloginfo('name'); ?> + + + + +
            +

            + +configs->get_value('aiowps_unlock_request_secret_key'); + $unlock_temp_string = isset($_POST['aiowps-unlock-temp-string']) ? strip_tags($_POST['aiowps-unlock-temp-string']) : ''; + $submitted_encoded_string = base64_encode($unlock_temp_string.$unlock_secret_string); + if ($submitted_encoded_string !== $unlock_encoded_info) { + //Someone somehow landed on this page directly without clicking the unlock button on login form + echo '
            '.__('ERROR: Unable to process your request!', 'all-in-one-wp-security-and-firewall').'
            '; + die(); + } elseif ($display_form) { + echo display_unlock_form(); + } +} //End if block + +if (isset($_POST['aiowps_wp_submit_unlock_request'])) { + //This catches the $_POST when someone submits the form from our special unlock request page where visitor enters email address + $errors = ''; + + $email = trim($_POST['aiowps_unlock_request_email']); + if (empty($email) || !is_email($email)) { + $errors .= '

            '.__('Please enter a valid email address', 'all-in-one-wp-security-and-firewall').'

            '; + } + + if ($errors) { + $display_form = true; + echo '
            '.$errors.'
            '; + $sanitized_email = sanitize_email($email); + echo display_unlock_form($sanitized_email); + } else { + $locked_user = get_user_by('email', $email); + if (!$locked_user) { + //user with this email does not exist in the system + $errors .= '

            '.__('User account not found!', 'all-in-one-wp-security-and-firewall').'

            '; + echo '
            '.$errors.'
            '; + } else { + //Process unlock request + //Generate a special code and unlock url + $ip = AIOWPSecurity_Utility_IP::get_user_ip_address(); //Get the IP address of user + if (empty($ip)) { + $unlock_url = false; + } else { + $unlock_url = AIOWPSecurity_User_Login::generate_unlock_request_link($ip); + } + + if (!$unlock_url) { + //No entry found in lockout table with this IP range + $error_msg = '

            '.__('Error: No locked entry was found in the database with your IP address range.', 'all-in-one-wp-security-and-firewall').'

            '; + echo '
            '.$error_msg.'
            '; + } else { + //Send an email to the user + AIOWPSecurity_User_Login::send_unlock_request_email($email, $unlock_url); + echo '

            ' . __('An email has been sent to you with the unlock instructions.', 'all-in-one-wp-security-and-firewall') . '

            '; + } + } + $display_form = false; + } +} +?> +
            + + + +' . __('You are here because you have been locked out due to too many incorrect login attempts.', 'all-in-one-wp-security-and-firewall') . '

            ' + . '

            ' . __('Please enter your email address and you will receive an email with instructions on how to unlock yourself.', 'all-in-one-wp-security-and-firewall') . '

            '; +?> +
            +
            + '; + } + ?> +

            + +

            +

            + +

            +
            +configs->get_value('aiowps_site_lockout_msg'); +if (empty($aiowps_site_lockout_msg_raw)) { + $aiowps_site_lockout_msg_raw = '

            This site is currently not available. Please try again later.

            '; +} +$maintenance_msg = html_entity_decode($aiowps_site_lockout_msg_raw, ENT_COMPAT, "UTF-8"); +$maintenance_msg = apply_filters('the_content', $maintenance_msg); +?> + + + + + <?php bloginfo('name'); ?> + + + + + + +
            +
            +
            +
            + +
            +
            +
            +
            + + \ No newline at end of file diff --git a/wp-content/plugins/all-in-one-wp-security-and-firewall/readme.txt b/wp-content/plugins/all-in-one-wp-security-and-firewall/readme.txt new file mode 100755 index 00000000..23064d9a --- /dev/null +++ b/wp-content/plugins/all-in-one-wp-security-and-firewall/readme.txt @@ -0,0 +1,1649 @@ +=== All-In-One Security (AIOS) – Security and Firewall === +Contributors: DavidAnderson, pmbaldha, Tips and Tricks HQ, wpsolutions, Peter Petreski, Ruhul Amin, mbrsolution +Donate link: https://david.dw-perspective.org.uk/donate +Tags: security, malware scanning, two factor authentication, firewall, login security +Requires PHP: 5.6 +Requires at least: 5.0 +Tested up to: 6.9 +Stable tag: 5.4.4 +License: GPLv3 or later + +Protect your website investment with All-In-One Security (AIOS) – a comprehensive and easy to use security plugin designed especially for WordPress. Featuring login security tools, a cutting-edge firewall and much more. + +== Description == + +### THE TOP RATED WORDPRESS SECURITY AND FIREWALL PLUGIN + +[All-in-One Security (AIOS)](https://teamupdraft.com/all-in-one-security?utm_source=aios-wp-dir&utm_medium=referral&utm_campaign=plugin-dir&utm_content=aios&utm_creative_format=description) is a WordPress security plugin from the same, trusted team that brought you UpdraftPlus. + +It’s called 'All-In-One' because it’s packed full of ways to keep your WordPress website(s) safe and secure. + +It includes: + +**Login security features** keep bots at bay. Lock out users based on a configurable number of login attempts, get two-factor authentication and more. + +**File and database security.** Get notified of file changes that occur outside of normal operations. Block access to key files and scan files and folders to spot insecure permissions. + +**Firewall.** Get PHP, .htaccess and 6G firewall rules courtesy of Perishable Press. Spot and block fake Google Bots and more! + +**Spam prevention.** Prevent annoying spam comments and reduce unnecessary load on the server. Automatically and permanently block IP addresses that exceed a set number of spam comments. + +**Audit log.** View events happening on your WordPress website. Find out if a plugin or theme has been added, removed, updated and more. + +#### WHY ALL-IN-ONE SECURITY? + +AIOS has a near-perfect **4.7 / 5-star user rating** across more than 1 million installs. + +Great for beginners and experts alike. AIOS guides you logically and clearly through each of its features which are all clearly explained. Security features are marked as basic, intermediate and advanced. Each step increases your security score. Turn them on and watch your protection grow! + +We have a large support team of software developers. That means we have the availability and the skillset to help you with the trickiest of queries. + +We comb the WordPress plugin directory for support tickets daily - most queries are responded to within 24 hours. + +Excellent plugin with numerous well-thought-out options for making a website more secure. I have been using it for years and am very happy with it. I recently had a small problem setting up a website and – even as a non-premium user – I received support very quickly. Highly recommended! + +For even more ways to stay safe and secure, upgrade to [AIOS Premium](https://teamupdraft.com/all-in-one-security/pricing?utm_source=aios-wp-dir&utm_medium=referral&utm_campaign=plugin-dir&utm_content=aios_premium&utm_creative_format=description) - it packs a punch security-wise, whilst being **extremely cost-competitive**. + +#### LOGIN SECURITY + +**Two-factor authentication (TFA)** - Require TFA for specific user roles. Supports Google Authenticator, Microsoft Authenticator, Authy, and many more. + +**Detect and manage 'admin' usernames** - Identify default 'admin' usernames and guide users to change them to protect against brute force attacks. + +**Identify and correct identical login and display names** - Detect cases where the display name matches the username and provide guidance to improve login security. + +**Prevent user enumeration** - Block unauthorised access to URLs that can reveal sensitive information such as usernames or other details. + +**Control login attempts** - Prevent brute force attacks by limiting the number of failed login attempts. Choose how many login attempts are allowed, set lockout durations, and more. + +**Force user logout** - Automatically log out users after a specified period of time. Unattended sessions are closed, reducing the risk of unauthorised access. + +**Manually approve new registrations** - Review and approve new user registrations to prevent spam and fake sign-ups. + +**Enhance WordPress salt security** - Adds 64 extra characters to WordPress salts, rotating them weekly. Makes cracking passwords virtually impossible, even if your database is stolen. + +#### Plugin Support +* If you have a question or problem with the All-In-One Security plugin, post it on the support forum and we will help you. Premium customers can log queries directly with the team via https://teamupdraft.com/all-in-one-security/ +**Monitor and manage active sessions** - If a user is logged in who shouldn't be, log them out or add them to a blacklist. + +#### SPAM PREVENTION + +**Block spam coming from bots** - Reduce the load on your server and improve the user experience by automatically blocking spam comments from bots. + +**Monitor spam IP addresses** - Monitor the IP addresses of people or bots leaving spam comments. Choose which ones to block based on a configurable number of comments left. + +#### FILE / DATABASE Security + +**Scan and fix file permissions** - Scan for insecure file permissions. Click once to fix issues and safeguard critical files and folders. + +**Disable PHP file editing** - Disable editing of PHP files (such as plugins and themes) via the dashboard. It’s often the first tool that attackers use as it allows for code execution. + +**Protect sensitive files** - Prevent access to files like readme.html that might reveal information about your WordPress installation. + +**File change scanner** - Get notified of any file changes which occur on your system. Exclude files and folders which change as part of normal operations. + +**Prevent image hotlinking** - Prevent other websites from displaying your images via hotlinking and protect server bandwidth. + +**Secure database backups** - Perform a database backup via UpdraftPlus from AIOS. Change the default 'wp_' prefix to hide your WordPress database from hackers. + +#### FIREWALL + +**Get .htaccess firewall rules** - Deny access to the .htaccess and wp-config.php files. Disable the server signature and limit file uploads to a configurable size.** + +Block access to the debug.log file and prevent Apache servers from listing the contents of a directory when an index.php file is not present + +**Get PHP firewall rules** - PHP firewall rules prevent malicious users from exploiting well-known vulnerabilities in XML-RPC. Safeguard your content by disabling RSS and Atom feeds and avoid cross-site scripting (XSS) attacks. +Block fake Google bots and POST requests made by bots - Block fake Google bots and stop bots from making POST requests by blocking IP addresses where the user-agent and referrer fields are blank. + +**Utilise 6G firewall rules** - Employ flexible blacklist rules to reduce the number of malicious URL requests that hit your website (courtesy of Perishable Press). + +**And more** - Blacklist (and whitelist) IP ranges and user agents and block unauthorized access to data by disabling REST API access for non-logged-in requests. + +#### TWO-FACTOR AUTHENTICATION ENHANCED [Premium] + +**Two-factor authentication** is included in the free plugin. Upgrade to Premium if you’d like to: +Require TFA after a set time period - Mandate TFA for all admins or other roles after their accounts reach a specified age. + +**Control how often TFA is required** - Set TFA to be required after a certain number of days on trusted devices instead of every login. + +**Customise design layout** - Adjust the TFA design to match your website’s existing layout and branding. +Emergency codes - Generate one-time use emergency codes to regain access if you lose your TFA device. + +**WordPress Multisite Compatible** - Ensure compatibility with WordPress multisite networks and their sub-sites for consistent TFA application. + +**Integration with login forms** - Integrate TFA with various login forms, including WooCommerce, Affiliates-WP, Elementor Pro, bbPress, and 'Theme My Login' without additional coding. + +#### SMART 404 BLOCKING [Premium] + +**Block IPs based on 404 errors** - Detect hackers probing your URLs via script and bots by the 404 errors they leave behind. + +**Smart 404 Configuration** - Set a figure for the maximum number of 404 events allowed before an IP address is blocked. Choose a time period within which the 404 events must occur (e.g., 10 errors within 10 minutes). + +**Smart 404 block by URL string** - Instantly block an IP address if a 404 event includes a specific URL string. + +**Smart 404 whitelisting** - Prevent particular IP addresses from being permanently blocked due to 404 events. + +#### COUNTRY BLOCKING [Premium] + +**Block traffic to the entire site or to specific pages or posts** - Useful if you’re an e-commerce site and you want to block sales to some countries for shipping or tax reasons. + +**Whitelist some users from blocked countries** - Whitelist IP addresses or IP ranges even if they are part of a blocked country. + +#### MALWARE SCANNING [Premium] + +**Automatic malware scanning** - Detect and protect against the latest malware, trojans, and spyware. +Alerts you to blacklisting by search engines - Monitor your site for blacklisting by search engines due to malicious code. + +**Response time monitoring** - Keep track of your website’s response time to identify and address any performance issues. + +**Uptime monitoring** - Checks your website’s uptime every 5 minutes and alerts you immediately if your site or server goes down. + +**Advice and malware removal** - Need hands-on advice and support for malware removal? Our team of genuine cybersecurity experts is here to help. + +**Notification if something’s amiss** - Receive notifications about any issues with your site so you can address problems before they escalate. + += Plugin Support = + +If you have a question or problem with the All-In-One Security plugin, post it on the support forum and we will help you. Premium customers can log queries directly with the team via https://teamupdraft.com/all-in-one-security + += Developers = + +* If you are a developer and you need some extra hooks or filters for this plugin then let us know. + += Translations = + +* All-In-One Security plugin can be translated to any language. + +Currently available translations: + +- English +- German +- Spanish +- French +- Hungarian +- Italian +- Swedish +- Russian +- Chinese +- Portuguese (Brazil) +- Persian + += Privacy Policy = + +This plugin may collect IP addresses for security reasons such as mitigating brute force login threats and malicious activity. + +The collected information is stored on your server. No information is transmitted to third parties or remote server locations. + += Usage = + +Go to the settings menu after you activate the plugin and follow the instructions. + +== Frequently Asked Questions == + += How is All-In-One Security (AIOS) supported? = +Customers of ‘Free’ AIOS can get support from this very webpage. Select ‘Support’ from the tabs above and post a topic. We aim to respond to all support requests within 24 hours during the working week. + += Is All-In-One Security compatible with other plugins? = +Yes. AIOS works smoothly with most popular WordPress plugins. + += Is All-in-One-Security regularly updated? = +Yes. WordPress Security is something that evolves over time. We update AIOS with new security features (and fixes if required) on a regular basis so you can be assured that your site will keep benefitting from new security protection techniques for as long as you need them. + += Will All-In-One Security slow down my website? = +No. + += Should I install All-In-One Security for free or should I purchase AIOS Premium? = +The decision is yours to make. ‘Free’ AIOS incorporates a web application firewall, comprehensive login security tools including two-factor authentication and all the latest recommended WordPress security practices and techniques. +But if your WordPress site is a business website, if it showcases what you do, or who you are, we generally recommend AIOS Premium. Prices start from as little as $70 for the year. + += What are the additional features of All-In-One Security Premium? = +AIOS Premium scans your WordPress website for malware whilst also monitoring your site's response time and uptime, notifying you of any issues within 24 hours, AIOS Premium customers also benefit from hands-on ticketed support via email (rather than via WP Support forums). +Additional security tools include Country Blocking, Smart 404 Error Blocking and Advanced Two Factor Authentication. +More information is available from our [All-In-One Security website](https://teamupdraft.com/all-in-one-security/) +More information is available from our [All-In-One Security website]( https://teamupdraft.com/all-in-one-security/pricing?utm_source=aios-wp-dir&utm_medium=referral&utm_campaign=plugin-dir&utm_content=additional_features&utm_creative_format=faq) + += How do I get started with All-In-One Security Premium? = +In the web shop, purchase your preferred subscription. After completing the purchase, you will be emailed a link to download the plugin. You can also access the link through your "My Account" page. +After downloading the zip file, install and activate the plugin through WP Admin->Plugins->Add New->Upload Plugin. +The premium extends the free version. Therefore you should keep the free version installed and active. You will also be prompted to enter your AIOS username and password to connect your site to licenses. This will allow the plugin to receive updates. + += Do I need to have the free version before downloading Premium? = +Yes, you need to have the free version of the plugin installed and activated before installing Premium. Premium plugin is an add-on that requires the free version to be present. + += Does All-In-One Security work with multi-site network installations? = +Yes, AIOS Premium is compatible with WordPress multisites. For multisite networks, the protection will apply to the network as a whole, and the dashboard and options will be available on the main site of the WordPress multisite. + += Can a WordPress security plugin stop all attacks on my site? = +There is no 100% guarantee that a security plugin will be able to protect against all attacks, as there is always the possibility of unknown WordPress vulnerabilities or other unexpected factors, and attackers are always seeking to develop new ways around protections. However, All-In-One Security gives good protection against known attack methods, and is under continuous development to monitor and improve protections. + += Does All-In-One Security work on all servers and hosts? = +AIOS should be compatible with most hosts, unless the host has specifically restricted the use of security plugins. Similarly, certain features may not work on some servers, especially Windows/IIS platforms. Features that use the ‘.htaccess’ file will not apply on a Windows IIS server or NGINX server (but development is ongoing to port those protections to all servers). + += Can I cover my subdomains and test sites with a licence for AIOS Premium? = +Development and test sites require their own licence if updates to the plugin are needed. +However, these sites can be disconnected from the licence when they have served their purpose. You can disconnect the licence via the site's WP Admin->Plugins page, and it will be available to be reassigned to a different site. + += Is the All In One Security & Firewall Plugin GDPR and other privacy law compliant? = +Please read more about GDPR compliance here: https://teamupdraft.com/privacy/ . +Please read more about GDPR compliance here: https://www.teamupdraft.com/privacy?utm_source=aios-wp-dir&utm_medium=referral&utm_campaign=plugin-dir&utm_content=gdpr&utm_creative_format=faq. + +== Installation == + +To begin making your WordPress site more secure: + +1. Upload the 'all-in-one-wp-security.zip' file from the Plugins->Add New page in the WordPress administration panel. +2. Activate the plugin through the 'Plugins' menu in WordPress +3. Go to Settings menu under 'AIOS' and start activating the security features of the plugin. + +== Usage == + +Go to the settings menu after you activate the plugin and follow the instructions. + +== Screenshots == + +1. Features list. + +== Changelog == + += 5.4.4 - 5/Nov/2025 = + +* FEATURE: Added new and improved existing modules for UpdraftCentral. +* FIX: The theme's custom 404 page does not parse and instead displays the shortcodes for wp-login.php, due to the login page having been renamed. +* FIX: 404 detection was not working when using a custom 404 template page. +* FIX: PHP Strict Standards warning for AIOWPSecurity_Base_Tasks::run_for_a_site() +* FIX: Changed slider control class name from `slider` to `aiowps_slider` and updated CSS to prevent conflict with other plugins. +* FIX: Resolved deprecated error in fputcsv() by providing the required $escape parameter when exporting CSV files. + += 5.4.3 - 8/Sep/2025 = + +* FEATURE: Added a feature to enforce the use of strong passwords by users +* FIX: Bypass Cookie based brute force prevention using AJAX request. +* FIX: PHP notice - the translation load text domain was called incorrectly. +* FIX: Resolved call to undefined function disk_total_space in wp-security-debug.php when the hosting provider has disabled this PHP function. +* FIX: Fatal error when accessing an array query parameter when the login page has been renamed. +* FIX: Chrome console error where the maths captcha