IP Geo Block - Version 3.0.15

Version Description

  • Fix issue: Fix the issue that "Can not find Geolocation API libraries" error would always appear when once Geolite2, Maxmind and IP2Location were unselected.
  • Fix issue: Fix the issue that https in ipstack.com is available only for premiums users.
  • New feature: Introduce a new filter hook ip-geo-block-logs-preset that adds an UI of "Preset filters" at "Search in logs".
  • Improvement: Prevent to make a cached page by WP Fastest Cache on blocking when "Validation timing" is "init" action hook.
  • Improvement: Make the priofity of "UA string and qualification" is higher than that of "Block badly-behaved bots and crawlers" on public facing pages.
  • Improvement: Update google charts based on the release note.
  • Improvement: Always show "Google Maps API key" text box in "Plugin settings" section. If it is saved as empty, Google Maps API will no longer be used and a simple map will appear on "Search" tab.
  • Improvement: Follow the change the RIPE whois format related to AS number.
  • Improvement: Add UI to select the number of entries per page on IP address tables.
  • Improvement: Multiple entries on IP address tables can be selected across the pages for bulk action.
  • Improvement: Multiple Geolocation APIs can be selected on "Search" tab.
  • Improvement: The country code of admin should not be cached if it's ZZ during initialization process.
Download this release

Release Info

Developer tokkonopapa
Plugin Icon 128x128 IP Geo Block
Version 3.0.15
Comparing to
See all releases

Code changes from version 3.0.13 to 3.0.15

Files changed (83) hide show
  1. README.txt +78 -51
  2. admin/class-ip-geo-block-admin.php +144 -100
  3. admin/css/admin.css +94 -17
  4. admin/css/admin.min.css +1 -1
  5. admin/css/cidr.min.css +1 -1
  6. admin/datatables/js/dataTables.responsive.js +3 -3
  7. admin/datatables/js/datatables-all.js +13 -13
  8. admin/datatables/js/datatables-all.min.js +1 -1
  9. admin/datatables/js/jquery.dataTables.js +10 -10
  10. admin/datatables/js/jquery.dataTables.min.js +1 -1
  11. admin/datatables/license.txt +1 -1
  12. admin/images/ajax-loader-snake.gif +0 -0
  13. admin/includes/class-admin-ajax.php +32 -18
  14. admin/includes/class-admin-rewrite.php +3 -3
  15. admin/includes/tab-accesslog.php +38 -19
  16. admin/includes/tab-attribution.php +4 -9
  17. admin/includes/tab-geolocation.php +25 -23
  18. admin/includes/tab-network.php +3 -5
  19. admin/includes/tab-settings.php +412 -504
  20. admin/includes/tab-statistics.php +30 -41
  21. admin/js/admin.js +182 -102
  22. admin/js/admin.min.js +6 -6
  23. admin/js/authenticate.js +0 -2
  24. admin/js/authenticate.min.js +15 -5
  25. admin/js/gmap.js +3 -2
  26. admin/js/gmap.min.js +8 -8
  27. admin/js/whois.js +7 -5
  28. admin/js/whois.min.js +8 -8
  29. classes/class-ip-geo-block-actv.php +1 -1
  30. classes/class-ip-geo-block-apis.php +39 -62
  31. classes/class-ip-geo-block-cron.php +4 -5
  32. classes/class-ip-geo-block-file.php +2 -2
  33. classes/class-ip-geo-block-lkup.php +30 -35
  34. classes/class-ip-geo-block-load.php +1 -1
  35. classes/class-ip-geo-block-logs.php +106 -104
  36. classes/class-ip-geo-block-opts.php +36 -56
  37. classes/class-ip-geo-block-util.php +147 -51
  38. classes/class-ip-geo-block.php +41 -25
  39. includes/random_compat/LICENSE +22 -0
  40. includes/random_compat/byte_safe_strings.php +195 -0
  41. includes/random_compat/cast_to_int.php +77 -0
  42. includes/random_compat/error_polyfill.php +49 -0
  43. includes/random_compat/random.php +225 -0
  44. includes/random_compat/random_bytes_com_dotnet.php +91 -0
  45. includes/random_compat/random_bytes_dev_urandom.php +172 -0
  46. includes/random_compat/random_bytes_libsodium.php +91 -0
  47. includes/random_compat/random_bytes_libsodium_legacy.php +93 -0
  48. includes/random_compat/random_bytes_mcrypt.php +79 -0
  49. includes/random_compat/random_int.php +204 -0
  50. ip-geo-block.php +5 -5
  51. languages/ip-geo-block-ja.mo +0 -0
  52. languages/ip-geo-block-ja.po +659 -780
  53. languages/ip-geo-block.mo +0 -0
  54. languages/ip-geo-block.po +476 -502
  55. languages/ip-geo-block.pot +476 -502
  56. rewrite-ini.php +1 -1
  57. rewrite.php +9 -9
  58. samples.php +17 -3
  59. uninstall.php +2 -2
  60. wp-content/ip-geo-api/drop-in-sample.php +2 -2
  61. wp-content/ip-geo-api/ip2location/IP2Location.php +2 -2
  62. wp-content/ip-geo-api/ip2location/bcmath.php +4 -4
  63. wp-content/ip-geo-api/ip2location/class-ip2location.php +9 -9
  64. wp-content/ip-geo-api/maxmind/class-maxmind-geolite2.php +6 -6
  65. wp-content/ip-geo-api/maxmind/class-maxmind-legacy.php +11 -11
  66. wp-content/ip-geo-api/maxmind/class-maxmind.php +3 -3
  67. wp-content/ip-geo-api/maxmind/vendor/LICENSE +2 -2
  68. wp-content/ip-geo-api/maxmind/vendor/geoip2/geoip2/LICENSE +2 -2
  69. wp-content/ip-geo-api/maxmind/vendor/geoip2/geoip2/README.md +14 -14
  70. wp-content/ip-geo-api/maxmind/vendor/geoip2/geoip2/src/Model/City.php +1 -1
  71. wp-content/ip-geo-api/maxmind/vendor/geoip2/geoip2/src/Model/Country.php +1 -1
  72. wp-content/ip-geo-api/maxmind/vendor/geoip2/geoip2/src/Model/Enterprise.php +1 -1
  73. wp-content/ip-geo-api/maxmind/vendor/geoip2/geoip2/src/Model/Insights.php +1 -1
  74. wp-content/ip-geo-api/maxmind/vendor/geoip2/geoip2/src/Record/Country.php +1 -1
  75. wp-content/ip-geo-api/maxmind/vendor/geoip2/geoip2/src/Record/Location.php +1 -1
  76. wp-content/ip-geo-api/maxmind/vendor/geoip2/geoip2/src/Record/RepresentedCountry.php +1 -1
  77. wp-content/ip-geo-api/maxmind/vendor/geoip2/geoip2/src/Record/Subdivision.php +1 -1
  78. wp-content/ip-geo-api/maxmind/vendor/geoip2/geoip2/src/Record/Traits.php +2 -2
  79. wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/LICENSE +2 -2
  80. wp-content/ip-geo-api/maxmind/vendor/maxmind-db/reader/README.md +3 -3
  81. wp-content/ip-geo-api/maxmind/vendor/maxmind/web-service-common/LICENSE +2 -2
  82. wp-content/ip-geo-api/maxmind/vendor/maxmind/web-service-common/README.md +1 -1
  83. wp-content/mu-plugins/ip-geo-block-mu.php +7 -5
README.txt CHANGED
@@ -4,7 +4,7 @@ Donate link:
4
Tags: security, firewall, brute force, vulnerability, login, wp-admin, admin, ajax, xmlrpc, comment, pingback, trackback, spam, IP address, geo, geolocation, buddypress, bbPress
5
Requires at least: 3.7
6
Tested up to: 4.9.8
7
- Stable tag: 3.0.13
8
License: GPLv3
9
License URI: https://www.gnu.org/licenses/gpl-3.0.txt
10
@@ -33,7 +33,7 @@ After several days of installation, you'll be supprised to find many malicious o
33
In order to prevent hacking through the login form and XML-RPC by brute-force and the reverse-brute-force attacks, the number of login attempts will be limited per IP address even from the permitted countries.
34
35
* **Minimize server load against brute-force attacks:**
36
- You can configure this plugin as a [Must Use Plugins](https://codex.wordpress.org/Must_Use_Plugins "Must Use Plugins « WordPress Codex") so that this plugin can be loaded prior to regular plugins. It can massively [reduce the load on server](http://www.ipgeoblock.com/codex/validation-timing.html "Validation timing | IP Geo Block").
37
38
* **Prevent malicious down/uploading:**
39
A malicious request such as exposing `wp-config.php` or uploading malwares via vulnerable plugins/themes can be blocked.
@@ -48,8 +48,8 @@ After several days of installation, you'll be supprised to find many malicious o
48
When you click an external hyperlink on admin screens, http referrer will be eliminated to hide a footprint of your site.
49
50
* **Multiple source of IP Geolocation databases:**
51
- [MaxMind GeoLite2 free databases](http://www.maxmind.com "MaxMind - IP Geolocation and Online Fraud Prevention") (it requires PHP 5.4.0+) and [IP2Location LITE databases](http://www.ip2location.com/ "IP Address Geolocation to Identify Website Visitor's Geographical Location") can be installed in this plugin. Also free Geolocation REST APIs and whois information can be available for audit purposes.
52
- Father more, [dedicated API class libraries](http://www.ipgeoblock.com/article/api-class-library.html "CloudFlare & CloudFront API class library | IP Geo Block") can be installed for CloudFlare and CloudFront as a reverse proxy service.
53
54
* **Customizing response:**
55
HTTP response code can be selectable as `403 Forbidden` to deny access pages, `404 Not Found` to hide pages or even `200 OK` to redirect to the top page.
@@ -59,27 +59,27 @@ After several days of installation, you'll be supprised to find many malicious o
59
Validation logs for useful information to audit attack patterns can be manageable.
60
61
* **Cooperation with full spec security plugin:**
62
- This plugin is lite enough to be able to cooperate with other full spec security plugin such as [Wordfence Security](https://wordpress.org/plugins/wordfence/ "Wordfence Security — WordPress Plugins"). See [this report](http://www.ipgeoblock.com/codex/page-speed-performance.html "Page speed performance | IP Geo Block") about page speed performance.
63
64
* **Extendability:**
65
- You can customize the behavior of this plugin via `add_filter()` with [pre-defined filter hook](http://www.ipgeoblock.com/codex/ "Codex | IP Geo Block"). See various use cases in [samples.php](https://github.com/tokkonopapa/WordPress-IP-Geo-Block/blob/master/ip-geo-block/samples.php "WordPress-IP-Geo-Block/samples.php at master - tokkonopapa/WordPress-IP-Geo-Block - GitHub") bundled within this package.
66
You can also get the extension [IP Geo Allow](https://github.com/ddur/WordPress-IP-Geo-Allow "GitHub - ddur/WordPress-IP-Geo-Allow: WordPress Plugin Exension for WordPress-IP-Geo-Block Plugin") by [Dragan](https://github.com/ddur "ddur (Dragan) - GitHub"). It makes admin screens strictly private with more flexible way than specifying IP addresses.
67
68
* **Self blocking prevention and easy rescue:**
69
- Website owners do not prefer themselves to be blocked. This plugin prevents such a sad thing unless you force it. And futhermore, if such a situation occurs, you can [rescue yourself](http://www.ipgeoblock.com/codex/what-should-i-do-when-i-m-locked-out.html "What should I do when I'm locked out? | IP Geo Block") easily.
70
71
* **Clean uninstallation:**
72
Nothing is left in your precious mySQL database after uninstallation. So you can feel free to install and activate to make a trial of this plugin's functionality.
73
74
= Attribution =
75
76
- This package includes GeoLite2 library distributed by MaxMind, available from [MaxMind](http://www.maxmind.com "MaxMind - IP Geolocation and Online Fraud Prevention") (it requires PHP 5.4.0+), and also includes IP2Location open source libraries available from [IP2Location](http://www.ip2location.com "IP Address Geolocation to Identify Website Visitor's Geographical Location").
77
78
Also thanks for providing the following great services and REST APIs for free.
79
80
* [https://ipdata.co/](https://ipdata.co/ "ipdata.co - IP Geolocation and Threat Data API") (IPv4, IPv6 / free)
81
* [https://ipinfo.io/](https://ipinfo.io/ "IP Address API and Data Solutions") (IPv4, IPv6 / free)
82
- * [http://geoip.nekudo.com/](http://geoip.nekudo.com/ "Free IP GeoLocation/GeoIp API - geoip.nekudo.com") (IPv4, IPv6 / free)
83
* [http://geoiplookup.net/](http://geoiplookup.net/ "What Is My IP Address | GeoIP Lookup") (IPv4, IPv6 / free)
84
* [http://ip-api.com/](http://ip-api.com/ "IP-API.com - Free Geolocation API") (IPv4, IPv6 / free for non-commercial use)
85
* [https://ipinfodb.com/](https://ipinfodb.com/ "Free IP Geolocation Tools and API| IPInfoDB") (IPv4, IPv6 / free for registered user, need API key)
@@ -89,7 +89,7 @@ Also thanks for providing the following great services and REST APIs for free.
89
90
Development of this plugin is promoted at [WordPress-IP-Geo-Block](https://github.com/tokkonopapa/WordPress-IP-Geo-Block "tokkonopapa/WordPress-IP-Geo-Block - GitHub") and class libraries to handle geo-location database are developed separately as "add-in"s at [WordPress-IP-Geo-API](https://github.com/tokkonopapa/WordPress-IP-Geo-API "tokkonopapa/WordPress-IP-Geo-API - GitHub").
91
92
- All contributions will always be welcome. Or visit my [development blog](http://www.ipgeoblock.com/ "IP Geo Block").
93
94
== Installation ==
95
@@ -101,7 +101,7 @@ All contributions will always be welcome. Or visit my [development blog](http://
101
4. Activate the plugin on the Plugin dashboard
102
5. Try 'Best for Back-end' button for easy setup at the bottom of this plugin's setting page.
103
104
- Please refer to [the document](http://www.ipgeoblock.com/codex/ "Codex | IP Geo Block")
105
or following descriptions for your best setup.
106
107
= Validation rule settings =
@@ -110,7 +110,7 @@ or following descriptions for your best setup.
110
Choose either `White list` (recommended) or `Black list` to specify the countries from which you want to pass or block.
111
112
* **Whitelist/Blacklist of country code**
113
- Specify the country code with two letters (see [ISO 3166-1 alpha-2](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements "ISO 3166-1 alpha-2 - Wikipedia, the free encyclopedia")). Each of them should be separated by comma.
114
115
* **Use Autonomous System Number (ASN)**
116
It enables you to use "AS number" in the whitelist and blacklist of extra IP addresses to specify a group of IP networks.
@@ -128,7 +128,7 @@ or following descriptions for your best setup.
128
It restricts the file types on upload to block malware and backdoor via both back-end and front-end.
129
130
* **Response code**
131
- Choose one of the [response code](http://tools.ietf.org/html/rfc2616#section-10 "RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1") to be sent when it blocks a comment.
132
The 2xx code will lead to your top page, the 3xx code will redirect to [Black Hole Server](http://blackhole.webpagetest.org/), the 4xx code will lead to WordPress error page, and the 5xx will pretend an server error.
133
134
* **Max number of failed login attempts per IP address**
@@ -186,7 +186,7 @@ or following descriptions for your best setup.
186
= Geolocation API settings =
187
188
* **API selection and key settings**
189
- If you wish to use `IPInfoDB`, you should register at [their site](http://ipinfodb.com/ "IPInfoDB | Free IP Address Geolocation Tools") to get a free API key and set it into the textfield. And `ip-api.com` and `Smart-IP.net` require non-commercial use.
190
191
= Local database settings settings =
192
@@ -242,7 +242,7 @@ or following descriptions for your best setup.
242
243
= Does the site using this plugin comply with GDPR? =
244
245
- Using this plugin itself should not be the problem, because from version 3.0.11 IP addresses in logs and cache of this plugin are encrypted by default in preparation for personal data breach. It also not only provides a way to manually erase them but also has the functionality to remove them when those are exceeded a certain amount/time. The option "Privacy friendly" helps you to restrict sending the ip address to the 3rd parties such as geolocation APIs and whois service equipped in this plugin. However, these functions are part of the requirements that GDPR requires and do not guarantee that the site is compliant with GDPR. Refer to [3.0.11 release note](http://www.ipgeoblock.com/changelog/release-3.0.11.html) for details.
246
247
= Does this plugin support multisite? =
248
@@ -273,17 +273,17 @@ Other plugins adopting `mod_rewrite` (e.g. WP Fastest Cache) or `advanced-cache.
273
274
Thus your site would have less risk against the exploiting via vulnerable plugins and themes.
275
276
- For more details, please refer to some documents at "[Blocking on front-end](http://www.ipgeoblock.com/codex/#blocking-on-front-end 'Codex | IP Geo Block')".
277
278
= I still have access from blacklisted country. Does it work correctly? =
279
280
Absolutely, YES.
281
282
- Sometimes, a Wordfence Security user would report this type of claim when he/she found some accesses in its Live traffic view. But please don't worry. Before WordPress runs, Wordfence cleverly filters out malicious requests to your site using <a href="http://php.net/manual/en/ini.core.php#ini.auto-prepend-file" title="PHP: Description of core php.ini directives - Manual">auto_prepend_file</a> directive to include PHP based Web Application Firewall. Then this plugin validates the rest of the requests that pass over Wordfence because those were not in WAF rules, especially you enables "**Prevent Zero-day Exploit**".
283
284
It would also possibly be caused by the accuracy of country code in the geolocation databases. Actually, there is a case that a same IP address has different country code.
285
286
- For more detail, please refer to "[I still have access from blacklisted country.](http://www.ipgeoblock.com/codex/access-from-blacklisted-country.html 'I still have access from blacklisted country. | IP Geo Block')".
287
288
= How can I test this plugin works? =
289
@@ -293,7 +293,7 @@ Another one is to use [http header browser addon](https://www.google.com/search?
293
294
You can add an IP address to the `X-Forwarded-For` header to emulate the access behind the proxy. In this case, you should add `HTTP_X_FORWARDED_FOR` into the "**$_SERVER keys for extra IPs**" on "**Settings**" tab.
295
296
- See more details at "[How to test prevention of attacks](http://www.ipgeoblock.com/codex/#how-to-test-prevention-of-attacks 'Codex | IP Geo Block')".
297
298
= I'm locked out! What shall I do? =
299
@@ -319,7 +319,7 @@ After saving and uploading it to `/wp-content/plugins/ip-geo-block/` on your ser
319
320
Remember that you should upload the original one after re-configuration to deactivate this feature.
321
322
- [This document](http://www.ipgeoblock.com/codex/what-should-i-do-when-i-m-locked-out.html "What should I do when I'm locked out? | IP Geo Block") can also help you.
323
324
= Do I have to turn on all the selection to enhance security? =
325
@@ -337,7 +337,7 @@ Yes. Roughly speaking, the strategy of this plugin has been constructed as follo
337
- **Bad signatures in query**
338
It blocks the request which has not been covered in the above three.
339
340
- Please try "**Best for Back-end**" button at the bottom of this plugin's setting page for easy setup. And also see more details in "[The best practice of target settings](http://www.ipgeoblock.com/codex/the-best-practice-for-target-settings.html 'The best practice of target settings | IP Geo Block')".
341
342
= Does this plugin validate all the requests? =
343
@@ -347,17 +347,17 @@ But there're exceptions: When you enable "**Force to load WP core**" for **Plugi
347
348
= How to resolve "Sorry, your request cannot be accepted."? =
349
350
- If you encounter this message, please refer to [this document](http://www.ipgeoblock.com/codex/you-are-not-allowed-to-access.html "Why &ldquo;Sorry, your request cannot be accepted&rdquo; ? | IP Geo Block") to resolve your blocking issue.
351
352
If you can't solve your issue, please let me know about it on the [support forum](https://wordpress.org/support/plugin/ip-geo-block/ "View: Plugin Support &laquo; WordPress.org Forums"). Your logs in this plugin and "**Installation information**" at "**Plugin settings**" will be a great help to resolve the issue.
353
354
= How can I fix "Unable to write" error? =
355
356
- When you enable "**Force to load WP core**" options, this plugin will try to configure `.htaccess` in your `/wp-content/plugins/` and `/wp-content/themes/` directory in order to protect your site against the malicous attacks to the [OMG plugins and themes](http://www.ipgeoblock.com/article/exposure-of-wp-config-php.html "Prevent exposure of wp-config.php | IP Geo Block").
357
358
But some servers doesn't give read / write permission against `.htaccess` to WordPress. In this case, you can configure `.htaccess` files by your own hand instead of enabling "**Force to load WP core**" options.
359
360
- Please refer to "[How can I fix permission troubles?](http://www.ipgeoblock.com/codex/how-can-i-fix-permission-troubles.html 'How can I fix permission troubles? | IP Geo Block')" in order to fix this error.
361
362
== Other Notes ==
363
@@ -382,6 +382,33 @@ Please refer to "[How can I fix permission troubles?](http://www.ipgeoblock.com/
382
383
== Changelog ==
384
385
= 3.0.13 =
386
* **Deprecate:** Remove the hotfix in 3.0.12.1 because of [WordPress 4.9.7 Security and Maintenance Release](https://wordpress.org/news/2018/07/wordpress-4-9-7-security-and-maintenance-release/ "WordPress 4.9.7 Security and Maintenance Release").
387
* **Fix issue:** Local databases settings will be updated when Geolocation API folder can not be found on activation. ([forum topic](https://wordpress.org/support/topic/local-database-settings-wrong-after-server-move/ "Topic: Local Database settings wrong after server move &#124; WordPress.org"))
@@ -393,7 +420,7 @@ Please refer to "[How can I fix permission troubles?](http://www.ipgeoblock.com/
393
394
= 3.0.12.1 =
395
* **Fix issue:** Unexpected blocking cause by an extra slash at the end of `$_SERVER['DOCUMENT_ROOT']` that might be added by server's configuration. ([forum topic](https://wordpress.org/support/topic/wpwebinar/ "Topic: WPWebinar &#124; WordPress.org"))
396
- * **Fix issue:** [Human friendly error page](http://www.ipgeoblock.com/codex/customizing-the-response.html#human-friendly-error-page) now works properly. ([forum topic](https://wordpress.org/support/topic/problem-with-permalinks-51/ "Topic: Problem with Permalinks &#124; WordPress.org"))
397
* **Fix issue:** Fix the conflict with WP hide & Security Enhancer. ([forum topic](https://wordpress.org/support/topic/problem-with-permalinks-51/ "Topic: Problem with Permalinks &#124; WordPress.org"))
398
* **Fix issue:** Hotfix [WordPress File Delete to Code Execution](https://blog.ripstech.com/2018/wordpress-file-delete-to-code-execution/ "WARNING: WordPress File Delete to Code Execution") by RIPS Technologies.
399
@@ -407,7 +434,7 @@ Please refer to "[How can I fix permission troubles?](http://www.ipgeoblock.com/
407
* **Improvement:** Update geolocation APIs and add a new one.
408
* **Improvement:** Change the JavaScript compressor from Google Closure Compiler to UglifyJS 2 to prevent "Uncaught TypeError: Cannot read property ‘toLowerCase’ of undefined" in a certain environment.
409
* **Fix:** Fix the issue that blocking occurred immediately instead of displaying the login page again when login failed, even the number of times did not exceed the limit.
410
- * See [3.0.11 release note](http://www.ipgeoblock.com/changelog/release-3.0.11.html) for some details.
411
412
= 3.0.10.4 =
413
* **Fix:** JavaScript error caused by bad handling form tag without method property. This error was happened with Wordfence Live Traffic.
@@ -447,7 +474,7 @@ If you still find the error "/plugins/ip-geo-block/classes/class-ip-geo-block-lo
447
* **Maintenance:** Change the priority order of local geolocation databases.
448
* **Bug fix:** Fix the issue that the target action for login form on settings tab could not unchecked on saving changes.
449
* **Bug fix:** Fix some other minor bugs.
450
- * See [3.0.9 release note](http://www.ipgeoblock.com/changelog/release-3.0.9.html "3.0.9 Release Note | IP Geo Block") for some details.
451
452
= 3.0.8 =
453
* **Improvement:** Use both Maxmind Legacy and GeoLite2 databases parallely.
@@ -480,14 +507,14 @@ Sorry for frequent update but the following bug should be fixed.
480
* **Bug fix:** Fix the bug using php short open tag on "Logs" tab.
481
* **Bug fix:** Fix the bug related to absolute path in filesystem on windows system.
482
* **Bug fix:** Fix the issue that "Auto updating (once a month)" could not be disabled.
483
- * See [3.0.6 release note](http://www.ipgeoblock.com/changelog/release-3.0.6.html "3.0.6 Release Note | IP Geo Block") for some details.
484
485
= 3.0.5 =
486
* **New feature:** Add "Live update" mode on "Logs" tab.
487
* **Improvement:** List all the IP addresses in cache are now displayed and manageable on "Statistics" tab.
488
* **Improvement:** Add "Either blocked or passed" as a new condition for recording logs. It enables to verify the requests "passed" from the blacklisted countries or the countries not in the whitelist.
489
* **Improvement:** Add two new filter hooks to utilize Google APIs from native domain in China.
490
- * See [3.0.5 release note](http://www.ipgeoblock.com/changelog/release-3.0.5.html "3.0.5 Release Note | IP Geo Block") for some details.
491
492
= 3.0.4.6 =
493
* **Bug fix:** Fix the issue that the emergent functionality didn't work when the number of login attempts reached to the limit.
@@ -530,7 +557,7 @@ Thank you all for taking your time again since last update.
530
* **Improvement:** Inhibit to embed a special nonce into links when WP-ZEP is disabled at each target. This may improve compatibility with some plugins and themes.
531
* **Bug fix:** Fix the issue of verifying file upload. It could not handle multiple files. ([@](https://wordpress.org/support/topic/incompatible-with-awesome-support-plugin/#post-9403708 "Topic: incompatible with Awesome Support plugin &laquo; WordPress.org Forums"))
532
* **Bug fix:** Fix the issue of illegal click event handling on anchor tag without href. ([@](https://wordpress.org/support/topic/pagebuilder-broken-by-ipgeoblock-v3-0-3-4/ "Topic: Pagebuilder broken by IPGeoblock v3.0.3.4 &laquo; WordPress.org Forums"))
533
- * See [3.0.4 release note](http://www.ipgeoblock.com/changelog/release-3.0.4.html "3.0.4 Release Note | IP Geo Block") for some details.
534
535
= 3.0.3.4 =
536
* **Improvement:** Some minor refactoring for the future release.
@@ -573,7 +600,7 @@ This is a maintenance release addressing various internal improvement.
573
* **Improvement:** Better handling of server and private IP address.
574
* **Bug fix:** Fix the bug of "Export/Import settings". **Please export json file again if you hold it as backup purpose** because some of settings data might be incompatible.
575
* **Bug fix:** Fix the bug of "Password Reset" caused by miss-spelling "resetpasss".
576
- * See some details at [release 3.0.3](http://www.ipgeoblock.com/changelog/release-3.0.3.html "3.0.3 Release Note | IP Geo Block").
577
578
= 3.0.2.2 =
579
* **Improvement:** Change the behavior of "Referrer Suppressor" not to open a new window on public facing pages.
@@ -597,8 +624,8 @@ This is a maintenance release addressing some issues.
597
* **New feature:** Add "Exceptions" for "Admin ajax/post" to specify the name of action which causes undesired blocking (typically on the public facing pages).
598
* **Improvement:** Add "Disable" to "Max number of failed login attempts per IP address" to avoid conflict with other similar plugin.
599
* **Improvement:** Update geolocation database libraries to 1.1.7 for better compatibility on some platform.
600
- * **Trial feature:** Add custom action hook `ip-geo-block-send-response`. This is useful to control firewall via [fail2ban](http://www.fail2ban.org/ "Fail2ban") like [WP fail2ban](https://wordpress.org/plugins/wp-fail2ban/ "WP fail2ban - WordPress Plugins").
601
- * See some details at [release 3.0.2](http://www.ipgeoblock.com/changelog/release-3.0.2.html "3.0.2 Release Note | IP Geo Block").
602
603
= 3.0.1.2 =
604
* **Bug fix:** Fix the blocking issue in some environments when upgrading from 2.2.9.1 to 3.0.0.
@@ -626,7 +653,7 @@ This is a maintenance release addressing some issues.
626
* **Improvement:** Better compatibility with some plugins, themes and widgets.
627
* **Improvement:** Deferred execution of SQL command to improve the response.
628
* **Improvement:** Make the response compatible with WP original when it is requested by GET method.
629
- * See some details at [release 3.0.0](http://www.ipgeoblock.com/changelog/release-3.0.0.html "3.0.0 Release Note | IP Geo Block").
630
631
= 2.2.9.1 =
632
* **Bug fix:** Blocking Wordfence scanning. ([@](https://wordpress.org/support/topic/wordfence-conflict-2/ "WordFence Conflict"))
@@ -639,7 +666,7 @@ This is a maintenance release addressing some issues.
639
* **New feature:** A new option that makes this plugin configured as a "Must-use plugin". It can massively reduce the server load especially against brute-force attacks because it initiates this plugin prior to other typical plugins.
640
* **Improvement:** Validation of a certain signature against XSS is internally added to "Bad signature in query" by default.
641
* **Improvement:** Improved compatibility with PHP 7 (Thanks to [FireMyst](https://wordpress.org/support/topic/plans-for-php-7-compatiblity/ "Topic: Plans for PHP 7 compatiblity? &laquo; WordPress.org Forums")).
642
- * Find details in [2.2.9 Release Note](http://www.ipgeoblock.com/changelog/release-2.2.9.html "2.2.9 Release Note").
643
644
= 2.2.8.2 =
645
* **Bug fix:** Fixed the mismatched internal version number.
@@ -652,19 +679,19 @@ This is a maintenance release addressing some issues.
652
* **Bug fix:** Fixed the issue of stripping some required characters for Google maps API key.
653
* **New feature:** Whois database Lookup for IP address on search tab.
654
* **Update:** Updated geolocation API libraries and services.
655
- * Find more details in [2.2.8 Release Note](http://www.ipgeoblock.com/changelog/release-2.2.8.html "2.2.8 Release Note").
656
657
= 2.2.7 =
658
* **Bug fix:** Fix inadequate validation of "**Bad signatures in query**".
659
* **Improvement:** Add fallback for Google Maps API key ([@](https://wordpress.org/support/topic/226-problem-with-search-resp-google-maps "WordPress &#8250; Support &raquo; [2.2.6] Problem with SEARCH resp. Google Maps")) and corruption of "Bad signatures" ([@](https://wordpress.org/support/topic/226-problem-with-bad-signatures-in-query "WordPress &#8250; Support &raquo; [2.2.6] Problem with &quot;Bad signatures in query&quot;")).
660
* **Update:** Update geolocation service api.
661
- * Find details about Google Maps API in [2.2.7 Release Note](http://www.ipgeoblock.com/changelog/release-2.2.7.html "2.2.7 Release Note").
662
663
= 2.2.6 =
664
* **New feature:** Add saving csv file of logs in "Logs" tab.
665
* **New feature:** Add filter hook `ip-geo-block-record-log` to control over the conditions of recording in more detail.
666
* **Bug fix:** Fixed the issue that "Exceptions" for Plugins/Themes area does not work properly. Please confirm your settings again.
667
- * See details at [release 2.2.6](http://www.ipgeoblock.com/changelog/release-2.2.6.html "2.2.6 Release Note").
668
669
= 2.2.5 =
670
* **New feature:** On the settings page, you can specify the pliugin or theme which would cause undesired blocking in order to exclude it from the validation target without embedding any codes into `functions.php`.
@@ -689,7 +716,7 @@ Sorry for frequent updating.
689
* **Improvement:** Made the logout url compatible with [Rename wp-login.php](https://wordpress.org/plugins/rename-wp-login/).
690
* **Improvement:** Made condition of validation more strictly at admin diagnosis to prevent unnecessary notice of self blocking. ([@](https://wordpress.org/support/topic/youll-be-blocked-after-you-log-out-notice-doesnt-disappear "[resolved] &quot;You'll be blocked after you log out&quot; notice doesn't disappear"))
691
* **Improvement:** Improved some of UI. ([@](https://wordpress.org/support/topic/possible-to-select-which-countries-are-blocked "[resolved] Possible to select which countries are blocked?"), [@](https://wordpress.org/support/topic/ip-geo-block-black-list "IP Geo Block Black List"))
692
- * See some details at [release 2.2.4](http://www.ipgeoblock.com/changelog/release-2.2.4.html "2.2.4 Release Note").
693
694
= 2.2.3.1 =
695
* **Bug fix:** Fixed the issue that disabled validation target was still blocked by country. ([@](https://wordpress.org/support/topic/logs-whitelist-comments-still-blocked "[resolved] logs whitelist comments still blocked?"))
@@ -703,7 +730,7 @@ Sorry for frequent updating.
703
* **Improvement:** Prevent self blocking caused by irrelevant signature. ([@](https://wordpress.org/support/topic/works-too-well-blocked-my-wp-admin-myself "[resolved] Works too well - Blocked my wp-admin myself"))
704
* **Bug fix:** Fixed the issue of conflicting with certain plugins due to the irrelevant handling of js event. ([@](https://wordpress.org/support/topic/cannot-edit-pages-when-ip-geo-block-is-enabled "[resolved] Cannot edit pages when ip-geo-block is enabled."))
705
* **New feature:** Add "Blocked per day" graph for the daily statistics.
706
- * See some details at [2.2.3 release note](http://www.ipgeoblock.com/changelog/release-2.2.3.html "2.2.3 Release Note").
707
708
= 2.2.2.3 =
709
Sorry for frequent update again but the following obvious bugs should be fixed.
@@ -725,14 +752,14 @@ Sorry for frequent update.
725
* **Improvement:** In the previous version, the statistical data was recorded into `wp_options`. It caused the uncertainty of recording especially in case of burst attacks. Now the data will be recorded in an independent table to improve this issue.
726
* **Bug fix:** Fixed conflict with NextGEN Gallary Pro. Thanks to [bodowewer](https://wordpress.org/support/profile/bodowewer).
727
* **Bug fix:** Fixed some filter hooks that did not work as intended.
728
- * See more details at [2.2.2 release note](http://www.ipgeoblock.com/changelog/release-2.2.2.html "2.2.2 Release Note").
729
730
= 2.2.1.1 =
731
* **Bug fix:** Fixed "open_basedir restriction" issue caused by `file_exists()`.
732
733
= 2.2.1 =
734
* **Enhancement:** In previous version, local geolocation databases will always be removed and downloaded again at every upgrading. Now, the class library for Maxmind and IP2Location have become independent of this plugin and you can put them outside this plugin in order to cut the above useless process. The library can be available from [WordPress-IP-Geo-API](https://github.com/tokkonopapa/WordPress-IP-Geo-API).
735
- * **Deprecated:** Cooperation with IP2Location plugins such as [IP2Location Tags](http://wordpress.org/plugins/ip2location-tags/ "WordPress - IP2Location Tags - WordPress Plugins"), [IP2Location Variables](http://wordpress.org/plugins/ip2location-variables/ "WordPress - IP2Location Variables - WordPress Plugins"), [IP2Location Country Blocker](http://wordpress.org/plugins/ip2location-country-blocker/ "WordPress - IP2Location Country Blocker - WordPress Plugins") is out of use. Instead of it, free [IP2Location LITE databases for IPv4 and IPv6](http://lite.ip2location.com/ "Free IP Geolocation Database") will be downloaded.
736
* **Improvement:** Improved connectivity with Jetpack.
737
* **Improvement:** Improved immediacy of downloading databases at upgrading.
738
* **Improvement:** Replaced a terminated RESTful API service with a new stuff.
@@ -752,7 +779,7 @@ Sorry for frequent update.
752
* **New feature:** Malicious signatures to prevent disclosing the important files via vulnerable plugins or themes. A malicious request to try to expose `wp-config.php` or `passwd` can be blocked.
753
* **New feature:** Add privacy considerations related to IP address. Add **Anonymize IP address** at **Record settings**.
754
* **Bug fix:** Fix the issue that spaces in **Text message on comment form** are deleted.
755
- * See details at [2.2.0 release note](http://www.ipgeoblock.com/changelog/release-2.2.0.html "2.2.0 Release Note").
756
757
= 2.1.5.1 =
758
* **Bug fix:** Fixed the issue that the Blacklist did not work properly. Thanks to TJayYay for reporting this issue at [support forum](https://wordpress.org/support/topic/hackers-from-country-in-blocked-list-of-countries-trying-to-login "WordPress &rsaquo; Support &raquo; Hackers from country in Blocked List of Countries trying to login").
@@ -762,13 +789,13 @@ Sorry for frequent update.
762
* **New feature:** Add pie chart to display statistics of "Blocked by country".
763
* **Enhancement:** WP-ZEP is reinforced against CSRF.
764
* **Bug fix:** Fix illegal handling of the fragment in a link.
765
- * See details at [2.1.5 release note](http://www.ipgeoblock.com/changelog/release-2.1.5.html "2.1.5 Release Note").
766
767
= 2.1.4 =
768
* **Bug fix:** Fix the issue that this plugin broke functionality of a certain plugin. Thanks to **opsec** for reporting this issue at [support forum](https://wordpress.org/support/topic/blocks-saves-in-types-or-any-plugins-from-wp-typescom "WordPress &rsaquo; Support &raquo; Blocks saves in Types or any plugins from wp-types.com").
769
* **Improvement:** Add checking process for validation rule to prevent being blocked itself. Thanks to **internationals** for proposing at [support forum](https://wordpress.org/support/topic/locked-out-due-to-eu-vs-country "WordPress &rsaquo; Support &raquo; Locked out due to EU vs. Country")
770
* **Improvement:** Arrage the order of setting sections to focus the goal of this plugin.
771
- * See details at [2.1.4 release note](http://www.ipgeoblock.com/changelog/release-2.1.4.html "2.1.4 Release Note").
772
773
= 2.1.3 =
774
* **New feature:** Add "show" / "hide" at each section on the "Settings" tab.
@@ -777,7 +804,7 @@ Sorry for frequent update.
777
* **Improvement:** Improved the compatibility with Autoptimize.
778
* **Bug fix:** Fix the issue related to showing featured themes on dashboard.
779
* **Bug fix:** Fix minor bug in `rewrite.php` for the advanced use case.
780
- * See details at [2.1.3 release note](http://www.ipgeoblock.com/changelog/release-2.1.3.html "2.1.3 Release Note").
781
782
= 2.1.2 =
783
This is a maintenance release.
@@ -788,16 +815,16 @@ This is a maintenance release.
788
* **Improvement:** Hide checking the existence of log db behind the symbol `IP_GEO_BLOCK_DEBUG` to reduce 1 query on admin screen.
789
* **Improvement:** Add alternative functions of BCMath extension to avoid `PHP Fatal error: Call to undefined function` in `IP2Location.php` when IPv6 is specified.
790
* **Improvement:** Use MaxMind database at the activating process not to be locked out by means of inconsistency of database at the activation and after.
791
- * See more details at [2.1.2 release note](http://www.ipgeoblock.com/changelog/release-2.1.2.html "2.1.2 Release Note").
792
793
= 2.1.1 =
794
* **New feature:** Added `Block by country (register, lost password)` at `Login form` on `Settings` tab in order to accept the registered users as membership from anywhere but block the request of new user ragistration and lost password by the country code. Is't suitable for BuddyPress and bbPress.
795
* **Improvement:** Added showing the custom error page for http response code 4xx and 5xx. For example the `403.php` in the theme template directory or in the child theme directory is used if it exists. And new filter hooks `ip-geo-block-(comment|xmlrpc|login|admin)-(status|reason)` are available to customize the response code and reason for human.
796
* **Obsoleted:** Obsoleted the filter hooks `ip-geo-block-(admin-actions|admin-pages|wp-content)`. Alternatively new filter hooks `ip-geo-block-bypass-(admins|plugins|themes)` are added to bypass WP-ZEP.
797
- * Find out more details in the [2.1.1 release note](http://www.ipgeoblock.com/changelog/release-2.1.1.html "2.1.1 Release Note").
798
799
= 2.1.0 =
800
- * **New feature:** Expanded the operating range of ZP-ZEP, that includes admin area, plugins area, themes area. Now it can prevent a direct malicios attack to the file in plugins and themes area. Please go to the "Validation Settings" on "Settings" tab and check it. Also check my article in "[Analysis of Attack Vector against WP Plugins](http://www.ipgeoblock.com/article/analysis-attack-vector.html)".
801
* **Bug fix:** Fixed the issue that action hook `ip-geo-block-backup-dir` did not work correctly because the order of argument was mismatched.
802
* **Bug fix:** Fixed the issue that a record including utf8 4 bytes character in its columns was not logged into DB in WordPress 4.2.
803
* **Improvement:** Fixed the issue that Referrer Suppressor do nothing with a new element which is added into DOM after DOM ready. The event handler is now delegated at the `body`.
@@ -807,7 +834,7 @@ This is a maintenance release.
807
* Added re-creating DB table for validation logs in case of accidentally failed at activation process.
808
* The time of day is shown with local time by adding GMT offset based on the time zone setting.
809
* Optimized resource loading and settings to avoid redundancy.
810
- * See details at [this plugin's blog](http://www.ipgeoblock.com/changelog/release-2.0.8.html "2.0.8 Release Note").
811
812
= 2.0.7 =
813
* Avoid JavaScript error which occurs if an anchor link has no `href`.
@@ -829,7 +856,7 @@ This is a maintenance release.
829
* Also added the filter hook `ip-geo-block-admin-actions` for safe actions on back-end.
830
831
= 2.0.2 =
832
- * **New feature:** Include `wp-admin/admin-post.php` as a validation target in the `Admin area`. This feature is to protect against a vulnerability such as [Analysis of the Fancybox-For-WordPress Vulnerability](http://blog.sucuri.net/2015/02/analysis-of-the-fancybox-for-wordpress-vulnerability.html) on Sucuri Blog.
833
* Added a sample code snippet as a use case for 'Give ajax permission in case of safe actions on front facing page'. See Example 10 in `sample.php`.
834
835
= 2.0.1 =
4
Tags: security, firewall, brute force, vulnerability, login, wp-admin, admin, ajax, xmlrpc, comment, pingback, trackback, spam, IP address, geo, geolocation, buddypress, bbPress
5
Requires at least: 3.7
6
Tested up to: 4.9.8
7
+ Stable tag: 3.0.15
8
License: GPLv3
9
License URI: https://www.gnu.org/licenses/gpl-3.0.txt
10
33
In order to prevent hacking through the login form and XML-RPC by brute-force and the reverse-brute-force attacks, the number of login attempts will be limited per IP address even from the permitted countries.
34
35
* **Minimize server load against brute-force attacks:**
36
+ You can configure this plugin as a [Must Use Plugins](https://codex.wordpress.org/Must_Use_Plugins "Must Use Plugins &laquo; WordPress Codex") so that this plugin can be loaded prior to regular plugins. It can massively [reduce the load on server](https://www.ipgeoblock.com/codex/validation-timing.html "Validation timing | IP Geo Block").
37
38
* **Prevent malicious down/uploading:**
39
A malicious request such as exposing `wp-config.php` or uploading malwares via vulnerable plugins/themes can be blocked.
48
When you click an external hyperlink on admin screens, http referrer will be eliminated to hide a footprint of your site.
49
50
* **Multiple source of IP Geolocation databases:**
51
+ [MaxMind GeoLite2 free databases](https://www.maxmind.com "MaxMind - IP Geolocation and Online Fraud Prevention") (it requires PHP 5.4.0+) and [IP2Location LITE databases](https://www.ip2location.com/ "IP Address Geolocation to Identify Website Visitor's Geographical Location") can be installed in this plugin. Also free Geolocation REST APIs and whois information can be available for audit purposes.
52
+ Father more, [dedicated API class libraries](https://www.ipgeoblock.com/article/api-class-library.html "CloudFlare & CloudFront API class library | IP Geo Block") can be installed for CloudFlare and CloudFront as a reverse proxy service.
53
54
* **Customizing response:**
55
HTTP response code can be selectable as `403 Forbidden` to deny access pages, `404 Not Found` to hide pages or even `200 OK` to redirect to the top page.
59
Validation logs for useful information to audit attack patterns can be manageable.
60
61
* **Cooperation with full spec security plugin:**
62
+ This plugin is lite enough to be able to cooperate with other full spec security plugin such as [Wordfence Security](https://wordpress.org/plugins/wordfence/ "Wordfence Security &mdash; WordPress Plugins"). See [this report](https://www.ipgeoblock.com/codex/page-speed-performance.html "Page speed performance | IP Geo Block") about page speed performance.
63
64
* **Extendability:**
65
+ You can customize the behavior of this plugin via `add_filter()` with [pre-defined filter hook](https://www.ipgeoblock.com/codex/ "Codex | IP Geo Block"). See various use cases in [samples.php](https://github.com/tokkonopapa/WordPress-IP-Geo-Block/blob/master/ip-geo-block/samples.php "WordPress-IP-Geo-Block/samples.php at master - tokkonopapa/WordPress-IP-Geo-Block - GitHub") bundled within this package.
66
You can also get the extension [IP Geo Allow](https://github.com/ddur/WordPress-IP-Geo-Allow "GitHub - ddur/WordPress-IP-Geo-Allow: WordPress Plugin Exension for WordPress-IP-Geo-Block Plugin") by [Dragan](https://github.com/ddur "ddur (Dragan) - GitHub"). It makes admin screens strictly private with more flexible way than specifying IP addresses.
67
68
* **Self blocking prevention and easy rescue:**
69
+ Website owners do not prefer themselves to be blocked. This plugin prevents such a sad thing unless you force it. And futhermore, if such a situation occurs, you can [rescue yourself](https://www.ipgeoblock.com/codex/what-should-i-do-when-i-m-locked-out.html "What should I do when I'm locked out? | IP Geo Block") easily.
70
71
* **Clean uninstallation:**
72
Nothing is left in your precious mySQL database after uninstallation. So you can feel free to install and activate to make a trial of this plugin's functionality.
73
74
= Attribution =
75
76
+ This package includes GeoLite2 library distributed by MaxMind, available from [MaxMind](https://www.maxmind.com "MaxMind - IP Geolocation and Online Fraud Prevention") (it requires PHP 5.4.0+), and also includes IP2Location open source libraries available from [IP2Location](https://www.ip2location.com "IP Address Geolocation to Identify Website Visitor's Geographical Location").
77
78
Also thanks for providing the following great services and REST APIs for free.
79
80
* [https://ipdata.co/](https://ipdata.co/ "ipdata.co - IP Geolocation and Threat Data API") (IPv4, IPv6 / free)
81
* [https://ipinfo.io/](https://ipinfo.io/ "IP Address API and Data Solutions") (IPv4, IPv6 / free)
82
+ * [https://geoip.nekudo.com/](https://geoip.nekudo.com/ "Free IP GeoLocation/GeoIp API - geoip.nekudo.com") (IPv4, IPv6 / free)
83
* [http://geoiplookup.net/](http://geoiplookup.net/ "What Is My IP Address | GeoIP Lookup") (IPv4, IPv6 / free)
84
* [http://ip-api.com/](http://ip-api.com/ "IP-API.com - Free Geolocation API") (IPv4, IPv6 / free for non-commercial use)
85
* [https://ipinfodb.com/](https://ipinfodb.com/ "Free IP Geolocation Tools and API| IPInfoDB") (IPv4, IPv6 / free for registered user, need API key)
89
90
Development of this plugin is promoted at [WordPress-IP-Geo-Block](https://github.com/tokkonopapa/WordPress-IP-Geo-Block "tokkonopapa/WordPress-IP-Geo-Block - GitHub") and class libraries to handle geo-location database are developed separately as "add-in"s at [WordPress-IP-Geo-API](https://github.com/tokkonopapa/WordPress-IP-Geo-API "tokkonopapa/WordPress-IP-Geo-API - GitHub").
91
92
+ All contributions will always be welcome. Or visit my [development blog](https://www.ipgeoblock.com/ "IP Geo Block").
93
94
== Installation ==
95
101
4. Activate the plugin on the Plugin dashboard
102
5. Try 'Best for Back-end' button for easy setup at the bottom of this plugin's setting page.
103
104
+ Please refer to [the document](https://www.ipgeoblock.com/codex/ "Codex | IP Geo Block")
105
or following descriptions for your best setup.
106
107
= Validation rule settings =
110
Choose either `White list` (recommended) or `Black list` to specify the countries from which you want to pass or block.
111
112
* **Whitelist/Blacklist of country code**
113
+ Specify the country code with two letters (see [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements "ISO 3166-1 alpha-2 - Wikipedia, the free encyclopedia")). Each of them should be separated by comma.
114
115
* **Use Autonomous System Number (ASN)**
116
It enables you to use "AS number" in the whitelist and blacklist of extra IP addresses to specify a group of IP networks.
128
It restricts the file types on upload to block malware and backdoor via both back-end and front-end.
129
130
* **Response code**
131
+ Choose one of the [response code](https://tools.ietf.org/html/rfc2616#section-10 "RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1") to be sent when it blocks a comment.
132
The 2xx code will lead to your top page, the 3xx code will redirect to [Black Hole Server](http://blackhole.webpagetest.org/), the 4xx code will lead to WordPress error page, and the 5xx will pretend an server error.
133
134
* **Max number of failed login attempts per IP address**
186
= Geolocation API settings =
187
188
* **API selection and key settings**
189
+ If you wish to use `IPInfoDB`, you should register at [their site](https://ipinfodb.com/ "IPInfoDB | Free IP Address Geolocation Tools") to get a free API key and set it into the textfield. And `ip-api.com` and `Smart-IP.net` require non-commercial use.
190
191
= Local database settings settings =
192
242
243
= Does the site using this plugin comply with GDPR? =
244
245
+ Using this plugin itself should not be the problem, because from version 3.0.11 IP addresses in logs and cache of this plugin are encrypted by default in preparation for personal data breach. It also not only provides a way to manually erase them but also has the functionality to remove them when those are exceeded a certain amount/time. The option "Privacy friendly" helps you to restrict sending the ip address to the 3rd parties such as geolocation APIs and whois service equipped in this plugin. However, these functions are part of the requirements that GDPR requires and do not guarantee that the site is compliant with GDPR. Refer to [3.0.11 release note](https://www.ipgeoblock.com/changelog/release-3.0.11.html) for details.
246
247
= Does this plugin support multisite? =
248
273
274
Thus your site would have less risk against the exploiting via vulnerable plugins and themes.
275
276
+ For more details, please refer to some documents at "[Blocking on front-end](https://www.ipgeoblock.com/codex/#blocking-on-front-end 'Codex | IP Geo Block')".
277
278
= I still have access from blacklisted country. Does it work correctly? =
279
280
Absolutely, YES.
281
282
+ Sometimes, a Wordfence Security user would report this type of claim when he/she found some accesses in its Live traffic view. But please don't worry. Before WordPress runs, Wordfence cleverly filters out malicious requests to your site using <a href="https://php.net/manual/en/ini.core.php#ini.auto-prepend-file" title="PHP: Description of core php.ini directives - Manual">auto_prepend_file</a> directive to include PHP based Web Application Firewall. Then this plugin validates the rest of the requests that pass over Wordfence because those were not in WAF rules, especially you enables "**Prevent Zero-day Exploit**".
283
284
It would also possibly be caused by the accuracy of country code in the geolocation databases. Actually, there is a case that a same IP address has different country code.
285
286
+ For more detail, please refer to "[I still have access from blacklisted country.](https://www.ipgeoblock.com/codex/access-from-blacklisted-country.html 'I still have access from blacklisted country. | IP Geo Block')".
287
288
= How can I test this plugin works? =
289
293
294
You can add an IP address to the `X-Forwarded-For` header to emulate the access behind the proxy. In this case, you should add `HTTP_X_FORWARDED_FOR` into the "**$_SERVER keys for extra IPs**" on "**Settings**" tab.
295
296
+ See more details at "[How to test prevention of attacks](https://www.ipgeoblock.com/codex/#how-to-test-prevention-of-attacks 'Codex | IP Geo Block')".
297
298
= I'm locked out! What shall I do? =
299
319
320
Remember that you should upload the original one after re-configuration to deactivate this feature.
321
322
+ [This document](https://www.ipgeoblock.com/codex/what-should-i-do-when-i-m-locked-out.html "What should I do when I'm locked out? | IP Geo Block") can also help you.
323
324
= Do I have to turn on all the selection to enhance security? =
325
337
- **Bad signatures in query**
338
It blocks the request which has not been covered in the above three.
339
340
+ Please try "**Best for Back-end**" button at the bottom of this plugin's setting page for easy setup. And also see more details in "[The best practice of target settings](https://www.ipgeoblock.com/codex/the-best-practice-for-target-settings.html 'The best practice of target settings | IP Geo Block')".
341
342
= Does this plugin validate all the requests? =
343
347
348
= How to resolve "Sorry, your request cannot be accepted."? =
349
350
+ If you encounter this message, please refer to [this document](https://www.ipgeoblock.com/codex/you-are-not-allowed-to-access.html "Why &ldquo;Sorry, your request cannot be accepted&rdquo; ? | IP Geo Block") to resolve your blocking issue.
351
352
If you can't solve your issue, please let me know about it on the [support forum](https://wordpress.org/support/plugin/ip-geo-block/ "View: Plugin Support &laquo; WordPress.org Forums"). Your logs in this plugin and "**Installation information**" at "**Plugin settings**" will be a great help to resolve the issue.
353
354
= How can I fix "Unable to write" error? =
355
356
+ When you enable "**Force to load WP core**" options, this plugin will try to configure `.htaccess` in your `/wp-content/plugins/` and `/wp-content/themes/` directory in order to protect your site against the malicous attacks to the [OMG plugins and themes](https://www.ipgeoblock.com/article/exposure-of-wp-config-php.html "Prevent exposure of wp-config.php | IP Geo Block").
357
358
But some servers doesn't give read / write permission against `.htaccess` to WordPress. In this case, you can configure `.htaccess` files by your own hand instead of enabling "**Force to load WP core**" options.
359
360
+ Please refer to "[How can I fix permission troubles?](https://www.ipgeoblock.com/codex/how-can-i-fix-permission-troubles.html 'How can I fix permission troubles? | IP Geo Block')" in order to fix this error.
361
362
== Other Notes ==
363
382
383
== Changelog ==
384
385
+ = 3.0.15 =
386
+ * **Fix issue:** Fix the issue that "Can not find Geolocation API libraries" error would always appear when once Geolite2, Maxmind and IP2Location were unselected.
387
+ * **Fix issue:** Fix the issue that https in ipstack.com is available only for premiums users.
388
+ * **New feature:** Introduce a new filter hook [`ip-geo-block-logs-preset`](https://www.ipgeoblock.com/codex/ip-geo-block-logs-preset.html "ip-geo-block-logs[-preset] | IP Geo Block") that adds an UI of "Preset filters" at "Search in logs".
389
+ * **Improvement:** Prevent to make a cached page by WP Fastest Cache on blocking when "Validation timing" is "init" action hook.
390
+ * **Improvement:** Make the priofity of "UA string and qualification" is higher than that of "Block badly-behaved bots and crawlers" on public facing pages.
391
+ * **Improvement:** Update google charts based on the [release note](https://developers.google.com/chart/interactive/docs/release_notes "Google Charts Release Notes &nbsp;|&nbsp; Charts | Google Developers").
392
+ * **Improvement:** Always show "Google Maps API key" text box in "Plugin settings" section. If it is saved as empty, Google Maps API will no longer be used and a simple map will appear on "Search" tab.
393
+ * **Improvement:** Follow the change the RIPE whois format related to AS number.
394
+ * **Improvement:** Add UI to select the number of entries per page on IP address tables.
395
+ * **Improvement:** Multiple entries on IP address tables can be selected across the pages for bulk action.
396
+ * **Improvement:** Multiple Geolocation APIs can be selected on "Search" tab.
397
+ * **Improvement:** The country code of admin should not be cached if it's `ZZ` during initialization process.
398
+
399
+ = 3.0.14 =
400
+ * **Fix issue:** Fix wrong handling of anonymized IPv6 on clicking a link or applying bulk actions.
401
+ * **Fix issue:** Fix the issue that added a server's country code which was not in "Whitelist of country code" but its IP address was in "Whitelist of extra IP addresses prior to country code" on activation. ([forum topic](https://wordpress.org/support/topic/possible-bug-disabling-enabling-adds-us-to-whitelist-country-code/ "Topic: Possible bug: disabling/enabling adds &#8220;,US&#8221; to whitelist country code &#124; WordPress.org"))
402
+ * **Fix issue:** Fix the issue of "Fatal error: Call to undefined function" which caused 500 Internal error on admin screen under a certain condition.
403
+ * **Fix issue:** Fix the issue of undefined symbol for openssl in PHP 5.3.5 and under.
404
+ * **New feature:** Introduce an emergency login link in "Plugins settings" section.
405
+ * **New feature:** Introduce a new filter hook [`ip-geo-block-dns`](https://www.ipgeoblock.com/codex/ip-geo-block-dns.html "ip-geo-block-dns | IP Geo Block") to specify the primary and secondary domain name resolvers.
406
+ * **New feature:** Introduce a new filter hook `ip-geo-block-logs`. ([forum topic](https://wordpress.org/support/topic/request-log-filtering/ "Topic: Request: Log filtering &#124; WordPress.org"))
407
+ * **New feature:** Introduce a new drop-in file `drop-in-admin.php` in Geolocation API library folder.
408
+ * **Improvement:** Provide help links on "Settings" tab.
409
+ * **Improvement:** Sort out some related items in the section on "Settings" tab.
410
+ * **Improvement:** All the http had been replaced to https if possible.
411
+
412
= 3.0.13 =
413
* **Deprecate:** Remove the hotfix in 3.0.12.1 because of [WordPress 4.9.7 Security and Maintenance Release](https://wordpress.org/news/2018/07/wordpress-4-9-7-security-and-maintenance-release/ "WordPress 4.9.7 Security and Maintenance Release").
414
* **Fix issue:** Local databases settings will be updated when Geolocation API folder can not be found on activation. ([forum topic](https://wordpress.org/support/topic/local-database-settings-wrong-after-server-move/ "Topic: Local Database settings wrong after server move &#124; WordPress.org"))
420
421
= 3.0.12.1 =
422
* **Fix issue:** Unexpected blocking cause by an extra slash at the end of `$_SERVER['DOCUMENT_ROOT']` that might be added by server's configuration. ([forum topic](https://wordpress.org/support/topic/wpwebinar/ "Topic: WPWebinar &#124; WordPress.org"))
423
+ * **Fix issue:** [Human friendly error page](https://www.ipgeoblock.com/codex/customizing-the-response.html#human-friendly-error-page) now works properly. ([forum topic](https://wordpress.org/support/topic/problem-with-permalinks-51/ "Topic: Problem with Permalinks &#124; WordPress.org"))
424
* **Fix issue:** Fix the conflict with WP hide & Security Enhancer. ([forum topic](https://wordpress.org/support/topic/problem-with-permalinks-51/ "Topic: Problem with Permalinks &#124; WordPress.org"))
425
* **Fix issue:** Hotfix [WordPress File Delete to Code Execution](https://blog.ripstech.com/2018/wordpress-file-delete-to-code-execution/ "WARNING: WordPress File Delete to Code Execution") by RIPS Technologies.
426
434
* **Improvement:** Update geolocation APIs and add a new one.
435
* **Improvement:** Change the JavaScript compressor from Google Closure Compiler to UglifyJS 2 to prevent "Uncaught TypeError: Cannot read property ‘toLowerCase’ of undefined" in a certain environment.
436
* **Fix:** Fix the issue that blocking occurred immediately instead of displaying the login page again when login failed, even the number of times did not exceed the limit.
437
+ * See [3.0.11 release note](https://www.ipgeoblock.com/changelog/release-3.0.11.html) for some details.
438
439
= 3.0.10.4 =
440
* **Fix:** JavaScript error caused by bad handling form tag without method property. This error was happened with Wordfence Live Traffic.
474
* **Maintenance:** Change the priority order of local geolocation databases.
475
* **Bug fix:** Fix the issue that the target action for login form on settings tab could not unchecked on saving changes.
476
* **Bug fix:** Fix some other minor bugs.
477
+ * See [3.0.9 release note](https://www.ipgeoblock.com/changelog/release-3.0.9.html "3.0.9 Release Note | IP Geo Block") for some details.
478
479
= 3.0.8 =
480
* **Improvement:** Use both Maxmind Legacy and GeoLite2 databases parallely.
507
* **Bug fix:** Fix the bug using php short open tag on "Logs" tab.
508
* **Bug fix:** Fix the bug related to absolute path in filesystem on windows system.
509
* **Bug fix:** Fix the issue that "Auto updating (once a month)" could not be disabled.
510
+ * See [3.0.6 release note](https://www.ipgeoblock.com/changelog/release-3.0.6.html "3.0.6 Release Note | IP Geo Block") for some details.
511
512
= 3.0.5 =
513
* **New feature:** Add "Live update" mode on "Logs" tab.
514
* **Improvement:** List all the IP addresses in cache are now displayed and manageable on "Statistics" tab.
515
* **Improvement:** Add "Either blocked or passed" as a new condition for recording logs. It enables to verify the requests "passed" from the blacklisted countries or the countries not in the whitelist.
516
* **Improvement:** Add two new filter hooks to utilize Google APIs from native domain in China.
517
+ * See [3.0.5 release note](https://www.ipgeoblock.com/changelog/release-3.0.5.html "3.0.5 Release Note | IP Geo Block") for some details.
518
519
= 3.0.4.6 =
520
* **Bug fix:** Fix the issue that the emergent functionality didn't work when the number of login attempts reached to the limit.
557
* **Improvement:** Inhibit to embed a special nonce into links when WP-ZEP is disabled at each target. This may improve compatibility with some plugins and themes.
558
* **Bug fix:** Fix the issue of verifying file upload. It could not handle multiple files. ([@](https://wordpress.org/support/topic/incompatible-with-awesome-support-plugin/#post-9403708 "Topic: incompatible with Awesome Support plugin &laquo; WordPress.org Forums"))
559
* **Bug fix:** Fix the issue of illegal click event handling on anchor tag without href. ([@](https://wordpress.org/support/topic/pagebuilder-broken-by-ipgeoblock-v3-0-3-4/ "Topic: Pagebuilder broken by IPGeoblock v3.0.3.4 &laquo; WordPress.org Forums"))
560
+ * See [3.0.4 release note](https://www.ipgeoblock.com/changelog/release-3.0.4.html "3.0.4 Release Note | IP Geo Block") for some details.
561
562
= 3.0.3.4 =
563
* **Improvement:** Some minor refactoring for the future release.
600
* **Improvement:** Better handling of server and private IP address.
601
* **Bug fix:** Fix the bug of "Export/Import settings". **Please export json file again if you hold it as backup purpose** because some of settings data might be incompatible.
602
* **Bug fix:** Fix the bug of "Password Reset" caused by miss-spelling "resetpasss".
603
+ * See some details at [release 3.0.3](https://www.ipgeoblock.com/changelog/release-3.0.3.html "3.0.3 Release Note | IP Geo Block").
604
605
= 3.0.2.2 =
606
* **Improvement:** Change the behavior of "Referrer Suppressor" not to open a new window on public facing pages.
624
* **New feature:** Add "Exceptions" for "Admin ajax/post" to specify the name of action which causes undesired blocking (typically on the public facing pages).
625
* **Improvement:** Add "Disable" to "Max number of failed login attempts per IP address" to avoid conflict with other similar plugin.
626
* **Improvement:** Update geolocation database libraries to 1.1.7 for better compatibility on some platform.
627
+ * **Trial feature:** Add custom action hook `ip-geo-block-send-response`. This is useful to control firewall via [fail2ban](https://www.fail2ban.org/ "Fail2ban") like [WP fail2ban](https://wordpress.org/plugins/wp-fail2ban/ "WP fail2ban - WordPress Plugins").
628
+ * See some details at [release 3.0.2](https://www.ipgeoblock.com/changelog/release-3.0.2.html "3.0.2 Release Note | IP Geo Block").
629
630
= 3.0.1.2 =
631
* **Bug fix:** Fix the blocking issue in some environments when upgrading from 2.2.9.1 to 3.0.0.
653
* **Improvement:** Better compatibility with some plugins, themes and widgets.
654
* **Improvement:** Deferred execution of SQL command to improve the response.
655
* **Improvement:** Make the response compatible with WP original when it is requested by GET method.
656
+ * See some details at [release 3.0.0](https://www.ipgeoblock.com/changelog/release-3.0.0.html "3.0.0 Release Note | IP Geo Block").
657
658
= 2.2.9.1 =
659
* **Bug fix:** Blocking Wordfence scanning. ([@](https://wordpress.org/support/topic/wordfence-conflict-2/ "WordFence Conflict"))
666
* **New feature:** A new option that makes this plugin configured as a "Must-use plugin". It can massively reduce the server load especially against brute-force attacks because it initiates this plugin prior to other typical plugins.
667
* **Improvement:** Validation of a certain signature against XSS is internally added to "Bad signature in query" by default.
668
* **Improvement:** Improved compatibility with PHP 7 (Thanks to [FireMyst](https://wordpress.org/support/topic/plans-for-php-7-compatiblity/ "Topic: Plans for PHP 7 compatiblity? &laquo; WordPress.org Forums")).
669
+ * Find details in [2.2.9 Release Note](https://www.ipgeoblock.com/changelog/release-2.2.9.html "2.2.9 Release Note").
670
671
= 2.2.8.2 =
672
* **Bug fix:** Fixed the mismatched internal version number.
679
* **Bug fix:** Fixed the issue of stripping some required characters for Google maps API key.
680
* **New feature:** Whois database Lookup for IP address on search tab.
681
* **Update:** Updated geolocation API libraries and services.
682
+ * Find more details in [2.2.8 Release Note](https://www.ipgeoblock.com/changelog/release-2.2.8.html "2.2.8 Release Note").
683
684
= 2.2.7 =
685
* **Bug fix:** Fix inadequate validation of "**Bad signatures in query**".
686
* **Improvement:** Add fallback for Google Maps API key ([@](https://wordpress.org/support/topic/226-problem-with-search-resp-google-maps "WordPress &#8250; Support &raquo; [2.2.6] Problem with SEARCH resp. Google Maps")) and corruption of "Bad signatures" ([@](https://wordpress.org/support/topic/226-problem-with-bad-signatures-in-query "WordPress &#8250; Support &raquo; [2.2.6] Problem with &quot;Bad signatures in query&quot;")).
687
* **Update:** Update geolocation service api.
688
+ * Find details about Google Maps API in [2.2.7 Release Note](https://www.ipgeoblock.com/changelog/release-2.2.7.html "2.2.7 Release Note").
689
690
= 2.2.6 =
691
* **New feature:** Add saving csv file of logs in "Logs" tab.
692
* **New feature:** Add filter hook `ip-geo-block-record-log` to control over the conditions of recording in more detail.
693
* **Bug fix:** Fixed the issue that "Exceptions" for Plugins/Themes area does not work properly. Please confirm your settings again.
694
+ * See details at [release 2.2.6](https://www.ipgeoblock.com/changelog/release-2.2.6.html "2.2.6 Release Note").
695
696
= 2.2.5 =
697
* **New feature:** On the settings page, you can specify the pliugin or theme which would cause undesired blocking in order to exclude it from the validation target without embedding any codes into `functions.php`.
716
* **Improvement:** Made the logout url compatible with [Rename wp-login.php](https://wordpress.org/plugins/rename-wp-login/).
717
* **Improvement:** Made condition of validation more strictly at admin diagnosis to prevent unnecessary notice of self blocking. ([@](https://wordpress.org/support/topic/youll-be-blocked-after-you-log-out-notice-doesnt-disappear "[resolved] &quot;You'll be blocked after you log out&quot; notice doesn't disappear"))
718
* **Improvement:** Improved some of UI. ([@](https://wordpress.org/support/topic/possible-to-select-which-countries-are-blocked "[resolved] Possible to select which countries are blocked?"), [@](https://wordpress.org/support/topic/ip-geo-block-black-list "IP Geo Block Black List"))
719
+ * See some details at [release 2.2.4](https://www.ipgeoblock.com/changelog/release-2.2.4.html "2.2.4 Release Note").
720
721
= 2.2.3.1 =
722
* **Bug fix:** Fixed the issue that disabled validation target was still blocked by country. ([@](https://wordpress.org/support/topic/logs-whitelist-comments-still-blocked "[resolved] logs whitelist comments still blocked?"))
730
* **Improvement:** Prevent self blocking caused by irrelevant signature. ([@](https://wordpress.org/support/topic/works-too-well-blocked-my-wp-admin-myself "[resolved] Works too well - Blocked my wp-admin myself"))
731
* **Bug fix:** Fixed the issue of conflicting with certain plugins due to the irrelevant handling of js event. ([@](https://wordpress.org/support/topic/cannot-edit-pages-when-ip-geo-block-is-enabled "[resolved] Cannot edit pages when ip-geo-block is enabled."))
732
* **New feature:** Add "Blocked per day" graph for the daily statistics.
733
+ * See some details at [2.2.3 release note](https://www.ipgeoblock.com/changelog/release-2.2.3.html "2.2.3 Release Note").
734
735
= 2.2.2.3 =
736
Sorry for frequent update again but the following obvious bugs should be fixed.
752
* **Improvement:** In the previous version, the statistical data was recorded into `wp_options`. It caused the uncertainty of recording especially in case of burst attacks. Now the data will be recorded in an independent table to improve this issue.
753
* **Bug fix:** Fixed conflict with NextGEN Gallary Pro. Thanks to [bodowewer](https://wordpress.org/support/profile/bodowewer).
754
* **Bug fix:** Fixed some filter hooks that did not work as intended.
755
+ * See more details at [2.2.2 release note](https://www.ipgeoblock.com/changelog/release-2.2.2.html "2.2.2 Release Note").
756
757
= 2.2.1.1 =
758
* **Bug fix:** Fixed "open_basedir restriction" issue caused by `file_exists()`.
759
760
= 2.2.1 =
761
* **Enhancement:** In previous version, local geolocation databases will always be removed and downloaded again at every upgrading. Now, the class library for Maxmind and IP2Location have become independent of this plugin and you can put them outside this plugin in order to cut the above useless process. The library can be available from [WordPress-IP-Geo-API](https://github.com/tokkonopapa/WordPress-IP-Geo-API).
762
+ * **Deprecated:** Cooperation with IP2Location plugins such as [IP2Location Tags](https://wordpress.org/plugins/ip2location-tags/ "WordPress - IP2Location Tags - WordPress Plugins"), [IP2Location Variables](https://wordpress.org/plugins/ip2location-variables/ "WordPress - IP2Location Variables - WordPress Plugins"), [IP2Location Country Blocker](https://wordpress.org/plugins/ip2location-country-blocker/ "WordPress - IP2Location Country Blocker - WordPress Plugins") is out of use. Instead of it, free [IP2Location LITE databases for IPv4 and IPv6](https://lite.ip2location.com/ "Free IP Geolocation Database") will be downloaded.
763
* **Improvement:** Improved connectivity with Jetpack.
764
* **Improvement:** Improved immediacy of downloading databases at upgrading.
765
* **Improvement:** Replaced a terminated RESTful API service with a new stuff.
779
* **New feature:** Malicious signatures to prevent disclosing the important files via vulnerable plugins or themes. A malicious request to try to expose `wp-config.php` or `passwd` can be blocked.
780
* **New feature:** Add privacy considerations related to IP address. Add **Anonymize IP address** at **Record settings**.
781
* **Bug fix:** Fix the issue that spaces in **Text message on comment form** are deleted.
782
+ * See details at [2.2.0 release note](https://www.ipgeoblock.com/changelog/release-2.2.0.html "2.2.0 Release Note").
783
784
= 2.1.5.1 =
785
* **Bug fix:** Fixed the issue that the Blacklist did not work properly. Thanks to TJayYay for reporting this issue at [support forum](https://wordpress.org/support/topic/hackers-from-country-in-blocked-list-of-countries-trying-to-login "WordPress &rsaquo; Support &raquo; Hackers from country in Blocked List of Countries trying to login").
789
* **New feature:** Add pie chart to display statistics of "Blocked by country".
790
* **Enhancement:** WP-ZEP is reinforced against CSRF.
791
* **Bug fix:** Fix illegal handling of the fragment in a link.
792
+ * See details at [2.1.5 release note](https://www.ipgeoblock.com/changelog/release-2.1.5.html "2.1.5 Release Note").
793
794
= 2.1.4 =
795
* **Bug fix:** Fix the issue that this plugin broke functionality of a certain plugin. Thanks to **opsec** for reporting this issue at [support forum](https://wordpress.org/support/topic/blocks-saves-in-types-or-any-plugins-from-wp-typescom "WordPress &rsaquo; Support &raquo; Blocks saves in Types or any plugins from wp-types.com").
796
* **Improvement:** Add checking process for validation rule to prevent being blocked itself. Thanks to **internationals** for proposing at [support forum](https://wordpress.org/support/topic/locked-out-due-to-eu-vs-country "WordPress &rsaquo; Support &raquo; Locked out due to EU vs. Country")
797
* **Improvement:** Arrage the order of setting sections to focus the goal of this plugin.
798
+ * See details at [2.1.4 release note](https://www.ipgeoblock.com/changelog/release-2.1.4.html "2.1.4 Release Note").
799
800
= 2.1.3 =
801
* **New feature:** Add "show" / "hide" at each section on the "Settings" tab.
804
* **Improvement:** Improved the compatibility with Autoptimize.
805
* **Bug fix:** Fix the issue related to showing featured themes on dashboard.
806
* **Bug fix:** Fix minor bug in `rewrite.php` for the advanced use case.
807
+ * See details at [2.1.3 release note](https://www.ipgeoblock.com/changelog/release-2.1.3.html "2.1.3 Release Note").
808
809
= 2.1.2 =
810
This is a maintenance release.
815
* **Improvement:** Hide checking the existence of log db behind the symbol `IP_GEO_BLOCK_DEBUG` to reduce 1 query on admin screen.
816
* **Improvement:** Add alternative functions of BCMath extension to avoid `PHP Fatal error: Call to undefined function` in `IP2Location.php` when IPv6 is specified.
817
* **Improvement:** Use MaxMind database at the activating process not to be locked out by means of inconsistency of database at the activation and after.
818
+ * See more details at [2.1.2 release note](https://www.ipgeoblock.com/changelog/release-2.1.2.html "2.1.2 Release Note").
819
820
= 2.1.1 =
821
* **New feature:** Added `Block by country (register, lost password)` at `Login form` on `Settings` tab in order to accept the registered users as membership from anywhere but block the request of new user ragistration and lost password by the country code. Is't suitable for BuddyPress and bbPress.
822
* **Improvement:** Added showing the custom error page for http response code 4xx and 5xx. For example the `403.php` in the theme template directory or in the child theme directory is used if it exists. And new filter hooks `ip-geo-block-(comment|xmlrpc|login|admin)-(status|reason)` are available to customize the response code and reason for human.
823
* **Obsoleted:** Obsoleted the filter hooks `ip-geo-block-(admin-actions|admin-pages|wp-content)`. Alternatively new filter hooks `ip-geo-block-bypass-(admins|plugins|themes)` are added to bypass WP-ZEP.
824
+ * Find out more details in the [2.1.1 release note](https://www.ipgeoblock.com/changelog/release-2.1.1.html "2.1.1 Release Note").
825
826
= 2.1.0 =
827
+ * **New feature:** Expanded the operating range of ZP-ZEP, that includes admin area, plugins area, themes area. Now it can prevent a direct malicios attack to the file in plugins and themes area. Please go to the "Validation Settings" on "Settings" tab and check it. Also check my article in "[Analysis of Attack Vector against WP Plugins](https://www.ipgeoblock.com/article/analysis-attack-vector.html)".
828
* **Bug fix:** Fixed the issue that action hook `ip-geo-block-backup-dir` did not work correctly because the order of argument was mismatched.
829
* **Bug fix:** Fixed the issue that a record including utf8 4 bytes character in its columns was not logged into DB in WordPress 4.2.
830
* **Improvement:** Fixed the issue that Referrer Suppressor do nothing with a new element which is added into DOM after DOM ready. The event handler is now delegated at the `body`.
834
* Added re-creating DB table for validation logs in case of accidentally failed at activation process.
835
* The time of day is shown with local time by adding GMT offset based on the time zone setting.
836
* Optimized resource loading and settings to avoid redundancy.
837
+ * See details at [this plugin's blog](https://www.ipgeoblock.com/changelog/release-2.0.8.html "2.0.8 Release Note").
838
839
= 2.0.7 =
840
* Avoid JavaScript error which occurs if an anchor link has no `href`.
856
* Also added the filter hook `ip-geo-block-admin-actions` for safe actions on back-end.
857
858
= 2.0.2 =
859
+ * **New feature:** Include `wp-admin/admin-post.php` as a validation target in the `Admin area`. This feature is to protect against a vulnerability such as [Analysis of the Fancybox-For-WordPress Vulnerability](https://blog.sucuri.net/2015/02/analysis-of-the-fancybox-for-wordpress-vulnerability.html) on Sucuri Blog.
860
* Added a sample code snippet as a use case for 'Give ajax permission in case of safe actions on front facing page'. See Example 10 in `sample.php`.
861
862
= 2.0.1 =
admin/class-ip-geo-block-admin.php CHANGED
@@ -5,7 +5,7 @@
5
* @package IP_Geo_Block
6
* @author tokkonopapa <tokkonopapa@yahoo.com>
7
* @license GPL-3.0
8
- * @link http://www.ipgeoblock.com/
9
* @copyright 2013-2018 tokkonopapa
10
*/
11
define( 'IP_GEO_BLOCK_NETWORK', FALSE );
@@ -24,8 +24,8 @@ class IP_Geo_Block_Admin {
24
*
25
*/
26
private static $instance = NULL;
27
private $admin_tab = 0;
28
- private $is_network = NULL;
29
30
/**
31
* Initialize the plugin by loading admin scripts & styles
@@ -59,6 +59,10 @@ class IP_Geo_Block_Admin {
59
*
60
*/
61
public function admin_init() {
62
// Add the options page and menu item.
63
add_action( 'admin_menu', array( $this, 'setup_admin_page' ) );
64
add_action( 'admin_post_ip_geo_block', array( $this, 'admin_ajax_callback' ) );
@@ -69,12 +73,12 @@ class IP_Geo_Block_Admin {
69
add_filter( IP_Geo_Block::PLUGIN_NAME . '-bypass-admins', array( $this, 'verify_request' ), 10, 2 );
70
71
if ( is_multisite() ) {
72
- require_once ABSPATH . 'wp-admin/includes/plugin.php'; // is_plugin_active_for_network() @since 3.0.0
73
- $this->is_network = is_plugin_active_for_network( IP_GEO_BLOCK_BASE ) && current_user_can( 'manage_network_options' );
74
-
75
add_action( 'network_admin_menu', array( $this, 'setup_admin_page' ) );
76
- add_action( 'wpmu_new_blog', array( $this, 'create_blog' ), 10, 6 ); // on creating a new blog @since MU
77
- add_action( 'delete_blog', array( $this, 'delete_blog' ), 10, 2 ); // on deleting an old blog @since 3.0.0
78
}
79
80
// loads a plugin’s translated strings.
@@ -161,10 +165,9 @@ class IP_Geo_Block_Admin {
161
*/
162
public function create_blog( $blog_id, $user_id, $domain, $path, $site_id, $meta ) {
163
defined( 'IP_GEO_BLOCK_DEBUG' ) and IP_GEO_BLOCK_DEBUG and assert( is_main_site(), 'Not main blog.' );
164
-
165
require_once IP_GEO_BLOCK_PATH . 'classes/class-ip-geo-block-actv.php';
166
167
- // Get option of main blog.
168
$settings = IP_Geo_Block::get_option();
169
170
// Switch to the new blog and initialize.
@@ -172,7 +175,7 @@ class IP_Geo_Block_Admin {
172
IP_Geo_Block_Activate::activate_blog();
173
174
// Copy option from main blog.
175
- if ( $this->is_network && $settings['network_wide'] )
176
update_option( IP_Geo_Block::OPTION_NAME, $settings );
177
178
// Restore the main blog.
@@ -223,10 +226,10 @@ class IP_Geo_Block_Admin {
223
break;
224
225
case 5: /* Site list */
226
- // js for google chart
227
wp_register_script(
228
$addon = IP_Geo_Block::PLUGIN_NAME . '-google-chart',
229
- apply_filters( 'google-jsapi', 'https://www.google.com/jsapi' ), array(), NULL, $footer
230
);
231
wp_enqueue_script( $addon );
232
break;
@@ -235,7 +238,7 @@ class IP_Geo_Block_Admin {
235
// Google Map in China
236
$geo = IP_Geo_Block::get_geolocation();
237
if ( isset( $geo['code'] ) && 'CN' === $geo['code'] ) {
238
- add_filter( 'google-jsapi', array( $this, 'google_jsapi_cn' ) );
239
add_filter( 'google-maps', array( $this, 'google_maps_cn' ) );
240
add_filter( 'google-maps-nokey', array( $this, 'google_maps_nokey_cn' ) );
241
}
@@ -252,10 +255,12 @@ class IP_Geo_Block_Admin {
252
$dependency, IP_Geo_Block::VERSION, $footer
253
);
254
}
255
wp_enqueue_script( IP_Geo_Block::PLUGIN_NAME . '-whois-js',
256
plugins_url( $release ? 'js/whois.min.js' : 'js/whois.js', __FILE__ ),
257
$dependency, IP_Geo_Block::VERSION, $footer
258
);
259
}
260
261
// css for option page
@@ -283,19 +288,18 @@ class IP_Geo_Block_Admin {
283
'url' => admin_url( 'admin-ajax.php' ),
284
'nonce' => IP_Geo_Block_Util::create_nonce( $this->get_ajax_action() ),
285
'msg' => array(
286
- /* [ 0] */ __( 'Import settings ?', 'ip-geo-block' ),
287
- /* [ 1] */ __( 'Create table ?', 'ip-geo-block' ),
288
- /* [ 2] */ __( 'Delete table ?', 'ip-geo-block' ),
289
- /* [ 3] */ __( 'Clear statistics ?', 'ip-geo-block' ),
290
- /* [ 4] */ __( 'Clear cache ?', 'ip-geo-block' ),
291
- /* [ 5] */ __( 'Clear logs ?', 'ip-geo-block' ),
292
- /* [ 6] */ __( 'ajax for logged-in user', 'ip-geo-block' ),
293
- /* [ 7] */ __( 'ajax for non logged-in user', 'ip-geo-block' ),
294
- /* [ 8] */ __( '[Found: %d]', 'ip-geo-block' ),
295
- /* [ 9] */ __( 'Find and verify `%s` on &#8220;Logs&#8221; tab.', 'ip-geo-block' ),
296
- /* [10] */ __( 'This feature is available with HTML5 compliant browsers.', 'ip-geo-block' ),
297
- /* [11] */ __( 'The selected row cannot be found in the visible area.', 'ip-geo-block' ),
298
- /* [12] */ __( 'An error occurred while executing the ajax command `%s`.', 'ip-geo-block' ),
299
),
300
'i18n' => array(
301
/* [ 0] */ '<div class="ip-geo-block-loading"></div>',
@@ -327,9 +331,9 @@ class IP_Geo_Block_Admin {
327
* Google Map in China
328
*
329
*/
330
- public function google_jsapi_cn ( $url ) { return 'https://www.google.cn/jsapi'; }
331
- public function google_maps_cn ( $url ) { return '//maps.google.cn/maps/api/js'; }
332
- public function google_maps_nokey_cn( $url ) { return '//maps.google.cn/maps'; }
333
334
/**
335
* Add plugin meta links
@@ -412,34 +416,32 @@ class IP_Geo_Block_Admin {
412
*
413
*/
414
public function dashboard_url( $network = NULL ) {
415
- return ( is_null( $network ) ? $this->is_network : $network ) ? network_admin_url( 'admin.php' /*'settings.php'*/ ) : admin_url( 'options-general.php' );
416
}
417
418
/**
419
* Register the administration menu into the WordPress Dashboard menu.
420
*
421
*/
422
- private function add_plugin_admin_menu() {
423
- $settings = IP_Geo_Block::get_option();
424
-
425
- // Network wide or not
426
- $admin_menu = ( 'admin_menu' === current_filter() ); // @since: 2.5 `admin_menu` or `network_admin_menu`
427
-
428
- // Verify tab number
429
- if ( $this->is_network &= $settings['network_wide'] ) {
430
- if ( $admin_menu ) {
431
$this->admin_tab = min( 4, max( 1, $this->admin_tab ) );
432
- } elseif ( ! in_array( $this->admin_tab, array( 0, 5 ), TRUE ) ) {
433
- $this->admin_tab = 0;
434
- }
435
} else {
436
- $this->admin_tab = min( 4, $this->admin_tab ); // exclude `Site List`
437
}
438
439
if ( $admin_menu ) {
440
// `settings-updated` would be added just after settings updated.
441
- if ( ! empty( $_REQUEST['settings-updated'] ) && $this->is_network &&
442
- ! empty( $_REQUEST['page'] ) && IP_Geo_Block::PLUGIN_NAME === $_REQUEST['page'] ) {
443
$this->update_multisite_settings( $settings );
444
wp_safe_redirect( esc_url_raw( add_query_arg(
445
array( 'page' => IP_Geo_Block::PLUGIN_NAME ),
@@ -458,7 +460,7 @@ class IP_Geo_Block_Admin {
458
);
459
}
460
461
- elseif ( IP_GEO_BLOCK_NETWORK && $this->is_network ) {
462
// Add a settings page for this plugin to the Settings menu.
463
$hook = add_menu_page(
464
__( 'IP Geo Block', 'ip-geo-block' ),
@@ -468,6 +470,7 @@ class IP_Geo_Block_Admin {
468
array( $this, 'display_plugin_admin_page' )
469
//, 'dashicons-admin-site' // or 'data:image/svg+xml;base64...'
470
);
471
if ( $settings['network_wide'] ) {
472
add_submenu_page(
473
IP_Geo_Block::PLUGIN_NAME,
@@ -478,6 +481,7 @@ class IP_Geo_Block_Admin {
478
array( $this, 'display_plugin_admin_page' )
479
);
480
}
481
add_submenu_page(
482
IP_Geo_Block::PLUGIN_NAME,
483
__( 'IP Geo Block', 'ip-geo-block' ),
@@ -486,6 +490,7 @@ class IP_Geo_Block_Admin {
486
IP_Geo_Block::PLUGIN_NAME . '&amp;tab=5',
487
array( $this, 'display_plugin_admin_page' )
488
);
489
wp_enqueue_style( IP_Geo_Block::PLUGIN_NAME . '-admin-icons',
490
plugins_url( ! defined( 'IP_GEO_BLOCK_DEBUG' ) || ! IP_GEO_BLOCK_DEBUG ?
491
'css/admin-icons.min.css' : 'css/admin-icons.css', __FILE__
@@ -503,15 +508,41 @@ class IP_Geo_Block_Admin {
503
* Diagnosis of admin settings.
504
*
505
*/
506
- private function diagnose_admin_screen() {
507
- $settings = IP_Geo_Block::get_option();
508
$updating = get_transient( IP_Geo_Block::CRON_NAME );
509
- $adminurl = $this->dashboard_url( $this->is_network && $settings['network_wide'] );
510
511
// Check version and compatibility
512
if ( version_compare( get_bloginfo( 'version' ), '3.7.0' ) < 0 )
513
self::add_admin_notice( 'error', __( 'You need WordPress 3.7+.', 'ip-geo-block' ) );
514
515
// Check consistency of matching rule
516
if ( -1 === (int)$settings['matching_rule'] ) {
517
if ( FALSE !== $updating ) {
@@ -544,8 +575,9 @@ class IP_Geo_Block_Admin {
544
self::add_admin_notice( 'error',
545
__( 'Once you logout, you will be unable to login again because the number of login attempts reaches the limit.', 'ip-geo-block' ) . ' ' .
546
sprintf(
547
- __( 'Please execute "<strong>Clear cache</strong>" on <a href="%s">Statistics tab</a> to prevent locking yourself out.', 'ip-geo-block' ),
548
- esc_url( add_query_arg( array( 'page' => IP_Geo_Block::PLUGIN_NAME, 'tab' => 1 ), $adminurl ) )
549
)
550
);
551
break;
@@ -564,7 +596,7 @@ class IP_Geo_Block_Admin {
564
) :
565
sprintf(
566
__( 'Please confirm your local geolocation databases at &#8220;%sLocal database settings%s&#8221; section and remove your IP address in cache at &#8220;%sStatistics in cache%s&#8221; section.', 'ip-geo-block' ),
567
- '<strong><a href="' . esc_url( add_query_arg( array( 'page' => IP_Geo_Block::PLUGIN_NAME, 'tab' => 0, 'sec' => 4 ), $adminurl ) . '#' . IP_Geo_Block::PLUGIN_NAME . '-section-4' ) . '">', '</a></strong>',
568
'<strong><a href="' . esc_url( add_query_arg( array( 'page' => IP_Geo_Block::PLUGIN_NAME, 'tab' => 1, 'sec' => 2 ), $adminurl ) . '#' . IP_Geo_Block::PLUGIN_NAME . '-section-2' ) . '">', '</a></strong>'
569
)
570
)
@@ -581,6 +613,16 @@ if ( defined( 'IP_GEO_BLOCK_DEBUG' ) && IP_GEO_BLOCK_DEBUG ):
581
}
582
}
583
endif;
584
// Check activation of IP Geo Allow
585
if ( $settings['validation']['timing'] && is_plugin_active( 'ip-geo-allow/index.php' ) ) {
586
self::add_admin_notice( 'error',
@@ -594,12 +636,14 @@ endif;
594
*
595
*/
596
public function setup_admin_page() {
597
// Register the administration menu.
598
- $this->add_plugin_admin_menu();
599
600
// Avoid multiple validation.
601
- if ( 'POST' !== $_SERVER['REQUEST_METHOD'] )
602
- $this->diagnose_admin_screen();
603
604
// Register settings page only if it is needed.
605
if ( ( isset( $_GET ['page' ] ) && IP_Geo_Block::PLUGIN_NAME === $_GET ['page' ] ) ||
@@ -705,7 +749,7 @@ endif;
705
if ( 'options-general.php' === $GLOBALS['pagenow'] ) {
706
$action = 'options.php';
707
unset( $tabs[5] ); // Site List
708
- if ( IP_GEO_BLOCK_NETWORK && $this->is_network ) {
709
if ( $settings['network_wide'] ) {
710
unset( $tabs[0] ); // Settings
711
}
@@ -720,10 +764,9 @@ endif;
720
// `edit.php` is an action handler for Multisite administration panels.
721
// `edit.php` ==> do action `network_admin_edit_IP_GEO_BLOCK` ==> `validate_network_settings()`
722
$action = 'edit.php?action=' . IP_Geo_Block::PLUGIN_NAME;
723
- if ( $this->is_network ) {
724
if ( ! $settings['network_wide'] ) {
725
- $tab = 5; // forct to Site List
726
- unset( $tabs[0] ); // Settings
727
}
728
unset( $tabs[1], $tabs[4], $tabs[2], $tabs[3] ); // Statistics, Logs, Search, Attribution
729
$title .= ' <span class="ip-geo-block-menu-link">';
@@ -759,8 +802,9 @@ endif;
759
?>
760
</form>
761
<?php if ( 2 === $tab ) { /* Search tab */ ?>
762
- <div id="ip-geo-block-whois"></div>
763
<div id="ip-geo-block-map"></div>
764
<?php } elseif ( 3 === $tab ) { /* Attribute tab */
765
// show attribution (higher priority order)
766
$tab = array();
@@ -771,7 +815,7 @@ endif;
771
}
772
echo '<p>', implode( '<br />', $tab ), "</p>\n";
773
echo '<p>', __( 'Thanks for providing these great services for free.', 'ip-geo-block' ), "<br />\n";
774
- echo __( '(Most browsers will redirect you to each site <a href="http://www.ipgeoblock.com/etc/referer.html" title="Referer Checker">without referrer when you click the link</a>.)', 'ip-geo-block' ), "</p>\n";
775
} ?>
776
<?php if ( defined( 'IP_GEO_BLOCK_DEBUG' ) && IP_GEO_BLOCK_DEBUG ) {
777
echo '<p>', get_num_queries(), ' queries. ', timer_stop(0), ' seconds. ', memory_get_usage(), " bytes.</p>\n";
@@ -876,9 +920,9 @@ endif;
876
case 'select':
877
case 'select-text':
878
$desc = '';
879
- echo "\n<select id=\"${id}${sub_id}\" name=\"${name}${sub_name}\">\n";
880
foreach ( $args['list'] as $key => $val ) {
881
- echo "\t<option value=\"$key\"", ( NULL === $val ? ' selected disabled' : selected( $args['value'], $key, FALSE ) );
882
if ( isset( $args['desc'][ $key ] ) ) {
883
echo ' data-desc="', $args['desc'][ $key ], '"';
884
$key === $args['value'] and $desc = $args['desc'][ $key ];
@@ -933,10 +977,10 @@ endif;
933
*
934
* @param array $input The values to be validated.
935
*
936
- * @link http://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Data
937
- * @link http://codex.wordpress.org/Function_Reference/sanitize_option
938
- * @link http://codex.wordpress.org/Function_Reference/sanitize_text_field
939
- * @link http://codex.wordpress.org/Plugin_API/Filter_Reference/sanitize_option_$option
940
* @link https://core.trac.wordpress.org/browser/trunk/src/wp-includes/formatting.php
941
*/
942
public function sanitize_options( $input ) {
@@ -990,10 +1034,6 @@ endif;
990
isset( $input[ $key ][ $provider ] ) ? sanitize_text_field( $input[ $key ][ $provider ] ) : '';
991
}
992
}
993
-
994
- // Check providers setting
995
- if ( $error = IP_Geo_Block_Provider::diag_providers( $output[ $key ] ) )
996
- self::add_admin_notice( 'error', $error );
997
break;
998
999
case 'comment':
@@ -1117,6 +1157,9 @@ endif;
1117
$output['public'][ $key ] = is_array( $default['public'][ $key ] ) ? array() : FALSE;
1118
}
1119
1120
// 3.0.4 AS number, 3.0.6 Auto updating of DB files, 3.0.8 Geolite2
1121
$output['Maxmind']['use_asn'] = $output['Geolite2']['use_asn'] = $output['update']['auto'] = FALSE;
1122
@@ -1218,10 +1261,7 @@ endif;
1218
// expiration time [days]
1219
if ( version_compare( $output['version'], '3.0.13' ) < 0 )
1220
$output['validation']['explogs'] /= DAY_IN_SECONDS;
1221
- $output['validation']['explogs'] = min( 365, max( 1, $output['validation']['explogs'] ) );
1222
-
1223
- // reset the version number
1224
- $output['version'] = $default['version'];
1225
1226
return $output;
1227
}
@@ -1229,8 +1269,8 @@ endif;
1229
/**
1230
* A fallback function of array_replace_recursive() before PHP 5.3.
1231
*
1232
- * @link http://php.net/manual/en/function.array-replace-recursive.php#92574
1233
- * @link http://php.net/manual/en/function.array-replace-recursive.php#109390
1234
*/
1235
public function array_replace_recursive() {
1236
if ( function_exists( 'array_replace_recursive' ) ) {
@@ -1372,6 +1412,7 @@ endif;
1372
$this->dashboard_url( ! empty( $_POST[ $option ]['network_wide'] ) )
1373
)
1374
) );
1375
exit;
1376
}
1377
@@ -1399,16 +1440,16 @@ endif;
1399
/**
1400
* Ajax callback function
1401
*
1402
- * @link http://codex.wordpress.org/AJAX_in_Plugins
1403
- * @link http://codex.wordpress.org/Function_Reference/check_ajax_referer
1404
- * @link http://core.trac.wordpress.org/browser/trunk/wp-admin/admin-ajax.php
1405
*/
1406
public function admin_ajax_callback() {
1407
// Check request origin, nonce, capability.
1408
$this->check_admin_post( TRUE );
1409
1410
- require_once IP_GEO_BLOCK_PATH . 'admin/includes/class-admin-ajax.php';
1411
-
1412
// `$which` and `$cmd` should be restricted by whitelist in each function
1413
$settings = IP_Geo_Block::get_option();
1414
$which = isset( $_POST['which'] ) ? $_POST['which'] : NULL;
@@ -1421,7 +1462,10 @@ endif;
1421
break;
1422
1423
case 'search': // Get geolocation by IP
1424
- $res = IP_Geo_Block_Admin_Ajax::search_ip( $which );
1425
break;
1426
1427
case 'scan-code': // Fetch providers to get country code
@@ -1483,6 +1527,14 @@ endif;
1483
}
1484
break;
1485
1486
case 'show-info': // Show system and debug information
1487
$res = IP_Geo_Block_Admin_Ajax::get_wp_info();
1488
break;
@@ -1523,9 +1575,9 @@ endif;
1523
foreach ( array_unique( (array)$which[ $src ] ) as $val ) {
1524
// replace anonymized IP address with CIDR (IPv4:256, IPv6:4096)
1525
$val = preg_replace(
1526
- array( '/\.\*\*\*.*#x2F;', '/\*\*\*.*#x2F;', '/:000\/116#x2F;' ),
1527
- array( '.0/24', '000/116', '::/116' ),
1528
- $val
1529
);
1530
if ( ( filter_var( preg_replace( '/\/\d+#x2F;', '', $val ), FILTER_VALIDATE_IP ) || preg_match( '/^AS\d+#x2F;', $val ) ) &&
1531
( FALSE === strpos( $settings['extra_ips'][ $dst ], $val ) ) ) {
@@ -1533,14 +1585,12 @@ endif;
1533
}
1534
}
1535
1536
- if ( $this->is_network && $settings['network_wide'] )
1537
$this->update_multisite_settings( $settings );
1538
else
1539
update_option( IP_Geo_Block::OPTION_NAME, $settings );
1540
1541
- $res = array(
1542
- 'page' => 'options-general.php?page=' . IP_Geo_Block::PLUGIN_NAME,
1543
- );
1544
break;
1545
1546
case 'restore-network': // Restore blocked per target in logs
@@ -1577,17 +1627,11 @@ endif;
1577
$res = IP_Geo_Block_Admin_Ajax::find_exceptions( $cmd );
1578
break;
1579
1580
- case 'create-table':
1581
- case 'delete-table':
1582
// Need to define `IP_GEO_BLOCK_DEBUG` to true
1583
- if ( 'create-table' === $cmd )
1584
- IP_Geo_Block_Logs::create_tables();
1585
- else
1586
- IP_Geo_Block_Logs::delete_tables();
1587
-
1588
- $res = array(
1589
- 'page' => 'options-general.php?page=' . IP_Geo_Block::PLUGIN_NAME,
1590
- );
1591
break;
1592
}
1593
5
* @package IP_Geo_Block
6
* @author tokkonopapa <tokkonopapa@yahoo.com>
7
* @license GPL-3.0
8
+ * @link https://www.ipgeoblock.com/
9
* @copyright 2013-2018 tokkonopapa
10
*/
11
define( 'IP_GEO_BLOCK_NETWORK', FALSE );
24
*
25
*/
26
private static $instance = NULL;
27
+ private $is_network_admin = NULL;
28
private $admin_tab = 0;
29
30
/**
31
* Initialize the plugin by loading admin scripts & styles
59
*
60
*/
61
public function admin_init() {
62
+ // include drop in for admin if it exists
63
+ $settings = IP_Geo_Block::get_option();
64
+ file_exists( $file = IP_Geo_Block_Util::unslashit( $settings['api_dir'] ) . '/drop-in-admin.php' ) and include( $file );
65
+
66
// Add the options page and menu item.
67
add_action( 'admin_menu', array( $this, 'setup_admin_page' ) );
68
add_action( 'admin_post_ip_geo_block', array( $this, 'admin_ajax_callback' ) );
73
add_filter( IP_Geo_Block::PLUGIN_NAME . '-bypass-admins', array( $this, 'verify_request' ), 10, 2 );
74
75
if ( is_multisite() ) {
76
+ $this->is_network_admin = current_user_can( 'manage_network_options' );
77
add_action( 'network_admin_menu', array( $this, 'setup_admin_page' ) );
78
+ if ( is_plugin_active_for_network( IP_GEO_BLOCK_BASE ) ) { // @since 3.0.0
79
+ add_action( 'wpmu_new_blog', array( $this, 'create_blog' ), 10, 6 ); // on creating a new blog @since MU
80
+ add_action( 'delete_blog', array( $this, 'delete_blog' ), 10, 2 ); // on deleting an old blog @since 3.0.0
81
+ }
82
}
83
84
// loads a plugin’s translated strings.
165
*/
166
public function create_blog( $blog_id, $user_id, $domain, $path, $site_id, $meta ) {
167
defined( 'IP_GEO_BLOCK_DEBUG' ) and IP_GEO_BLOCK_DEBUG and assert( is_main_site(), 'Not main blog.' );
168
require_once IP_GEO_BLOCK_PATH . 'classes/class-ip-geo-block-actv.php';
169
170
+ // get options on main blog
171
$settings = IP_Geo_Block::get_option();
172
173
// Switch to the new blog and initialize.
175
IP_Geo_Block_Activate::activate_blog();
176
177
// Copy option from main blog.
178
+ if ( $this->is_network_admin && $settings['network_wide'] )
179
update_option( IP_Geo_Block::OPTION_NAME, $settings );
180
181
// Restore the main blog.
226
break;
227
228
case 5: /* Site list */
229
+ // js for google charts
230
wp_register_script(
231
$addon = IP_Geo_Block::PLUGIN_NAME . '-google-chart',
232
+ apply_filters( 'google-charts', 'https://www.gstatic.com/charts/loader.js' ), array(), NULL, $footer
233
);
234
wp_enqueue_script( $addon );
235
break;
238
// Google Map in China
239
$geo = IP_Geo_Block::get_geolocation();
240
if ( isset( $geo['code'] ) && 'CN' === $geo['code'] ) {
241
+ add_filter( 'google-charts', array( $this, 'google_charts_cn' ) );
242
add_filter( 'google-maps', array( $this, 'google_maps_cn' ) );
243
add_filter( 'google-maps-nokey', array( $this, 'google_maps_nokey_cn' ) );
244
}
255
$dependency, IP_Geo_Block::VERSION, $footer
256
);
257
}
258
+
259
wp_enqueue_script( IP_Geo_Block::PLUGIN_NAME . '-whois-js',
260
plugins_url( $release ? 'js/whois.min.js' : 'js/whois.js', __FILE__ ),
261
$dependency, IP_Geo_Block::VERSION, $footer
262
);
263
+ break;
264
}
265
266
// css for option page
288
'url' => admin_url( 'admin-ajax.php' ),
289
'nonce' => IP_Geo_Block_Util::create_nonce( $this->get_ajax_action() ),
290
'msg' => array(
291
+ /* [ 0] */ __( 'Are you sure ?', 'ip-geo-block' ),
292
+ /* [ 1] */ __( 'Open a new window', 'ip-geo-block' ),
293
+ /* [ 2] */ __( 'Generate new link', 'ip-geo-block' ),
294
+ /* [ 3] */ __( 'Delete current link', 'ip-geo-block' ),
295
+ /* [ 4] */ __( 'Please add the following link to favorites / bookmarks in your browser : ', 'ip-geo-block' ),
296
+ /* [ 5] */ __( 'ajax for logged-in user', 'ip-geo-block' ),
297
+ /* [ 6] */ __( 'ajax for non logged-in user', 'ip-geo-block' ),
298
+ /* [ 7] */ __( '[Found: %d]', 'ip-geo-block' ),
299
+ /* [ 8] */ __( 'Find and verify `%s` on &#8220;Logs&#8221; tab.', 'ip-geo-block' ),
300
+ /* [ 9] */ __( 'This feature is available with HTML5 compliant browsers.', 'ip-geo-block' ),
301
+ /* [10] */ __( 'The selected row cannot be found in the table.', 'ip-geo-block' ),
302
+ /* [11] */ __( 'An error occurred while executing the ajax command `%s`.', 'ip-geo-block' ),
303
),
304
'i18n' => array(
305
/* [ 0] */ '<div class="ip-geo-block-loading"></div>',
331
* Google Map in China
332
*
333
*/
334
+ public function google_charts_cn ( $url ) { return 'https://www.gstatic.cn/charts/loader.js'; }
335
+ public function google_maps_cn ( $url ) { return '//maps.google.cn/maps/api/js'; }
336
+ public function google_maps_nokey_cn( $url ) { return '//maps.google.cn/maps'; }
337
338
/**
339
* Add plugin meta links
416
*
417
*/
418
public function dashboard_url( $network = NULL ) {
419
+ return ( is_null( $network ) ? $this->is_network_admin : $network ) ? network_admin_url( 'admin.php' /*'settings.php'*/ ) : admin_url( 'options-general.php' );
420
}
421
422
/**
423
* Register the administration menu into the WordPress Dashboard menu.
424
*
425
*/
426
+ private function add_plugin_admin_menu( $settings ) {
427
+ // Control tab number
428
+ // `admin_menu` or `network_admin_menu` @since: 2.5
429
+ if ( $admin_menu = ( 'admin_menu' === current_filter() ) ) {
430
+ if ( $this->is_network_admin && $settings['network_wide'] )
431
$this->admin_tab = min( 4, max( 1, $this->admin_tab ) );
432
+ else
433
+ $this->admin_tab = min( 4, max( 0, $this->admin_tab ) );
434
} else {
435
+ if ( $this->is_network_admin && $settings['network_wide'] )
436
+ $this->admin_tab = in_array( $this->admin_tab, array( 0, 5 ), TRUE ) ? $this->admin_tab : 0;
437
+ else
438
+ $this->admin_tab = 5;
439
}
440
441
if ( $admin_menu ) {
442
// `settings-updated` would be added just after settings updated.
443
+ if ( ! empty( $_REQUEST['page'] ) && IP_Geo_Block::PLUGIN_NAME === $_REQUEST['page'] &&
444
+ ! empty( $_REQUEST['settings-updated'] ) && $this->is_network_admin && $settings['network_wide'] ) {
445
$this->update_multisite_settings( $settings );
446
wp_safe_redirect( esc_url_raw( add_query_arg(
447
array( 'page' => IP_Geo_Block::PLUGIN_NAME ),
460
);
461
}
462
463
+ elseif ( IP_GEO_BLOCK_NETWORK && $this->is_network_admin ) {
464
// Add a settings page for this plugin to the Settings menu.
465
$hook = add_menu_page(
466
__( 'IP Geo Block', 'ip-geo-block' ),
470
array( $this, 'display_plugin_admin_page' )
471
//, 'dashicons-admin-site' // or 'data:image/svg+xml;base64...'
472
);
473
+
474
if ( $settings['network_wide'] ) {
475
add_submenu_page(
476
IP_Geo_Block::PLUGIN_NAME,
481
array( $this, 'display_plugin_admin_page' )
482
);
483
}
484
+
485
add_submenu_page(
486
IP_Geo_Block::PLUGIN_NAME,
487
__( 'IP Geo Block', 'ip-geo-block' ),
490
IP_Geo_Block::PLUGIN_NAME . '&amp;tab=5',
491
array( $this, 'display_plugin_admin_page' )
492
);
493
+
494
wp_enqueue_style( IP_Geo_Block::PLUGIN_NAME . '-admin-icons',
495
plugins_url( ! defined( 'IP_GEO_BLOCK_DEBUG' ) || ! IP_GEO_BLOCK_DEBUG ?
496
'css/admin-icons.min.css' : 'css/admin-icons.css', __FILE__
508
* Diagnosis of admin settings.
509
*
510
*/
511
+ private function diagnose_admin_screen( $settings ) {
512
$updating = get_transient( IP_Geo_Block::CRON_NAME );
513
+ $adminurl = $this->dashboard_url( $this->is_network_admin && $settings['network_wide'] );
514
515
// Check version and compatibility
516
if ( version_compare( get_bloginfo( 'version' ), '3.7.0' ) < 0 )
517
self::add_admin_notice( 'error', __( 'You need WordPress 3.7+.', 'ip-geo-block' ) );
518
519
+ if ( ! $settings['api_dir'] || ! file_exists( $settings['api_dir'] ) ) {
520
+ $this->add_admin_notice( 'error', sprintf(
521
+ __( 'Can not load Geolocation API libraries from <code>%s</code>. It seems to have failed downloading <a rel="noreferrer" href="https://github.com/tokkonopapa/WordPress-IP-Geo-API/archive/master.zip" title="Download the contents of tokkonopapa/WordPress-IP-Geo-API as a zip file">ZIP file</a> from <a rel="noreferrer" href="https://github.com/tokkonopapa/WordPress-IP-Geo-API" title="tokkonopapa/WordPress-IP-Geo-API - GitHub">WordPress-IP-Geo-API</a>. Please install <code>ip-geo-api</code> with write permission according to <a rel="noreferrer" href="https://www.ipgeoblock.com/codex/how-to-fix-permission-troubles.html" title="How can I fix permission troubles? | IP Geo Block">this instruction</a>.', 'ip-geo-block' ),
522
+ apply_filters( 'ip-geo-block-api-dir', $settings['api_dir'] ? $settings['api_dir'] : basename( WP_CONTENT_DIR ) )
523
+ ) );
524
+ }
525
+
526
+ else {
527
+ $providers = IP_Geo_Block_Provider::get_valid_providers( $settings, FALSE, FALSE, TRUE );
528
+ if ( empty( $providers ) ) {
529
+ $this->add_admin_notice( 'error', sprintf(
530
+ __( 'You should select at least one API at <a href="%s">Geolocation API settings</a>. Otherwise <strong>you\'ll be blocked</strong> after the cache expires.', 'ip-geo-block' ),
531
+ esc_url( add_query_arg( array( 'page' => IP_Geo_Block::PLUGIN_NAME, 'tab' => 0, 'sec' => 4 ), $adminurl ) ) . '#' . IP_Geo_Block::PLUGIN_NAME . '-section-4'
532
+ ) );
533
+ }
534
+
535
+ else {
536
+ $providers = IP_Geo_Block_Provider::get_addons( $settings['providers'] );
537
+ if ( empty( $providers ) ) {
538
+ $this->add_admin_notice( 'error', sprintf(
539
+ __( 'You should select at least one API for local database at <a href="%s">Geolocation API settings</a>. Otherwise access to the external API may slow down the site.', 'ip-geo-block' ),
540
+ esc_url( add_query_arg( array( 'page' => IP_Geo_Block::PLUGIN_NAME, 'tab' => 0, 'sec' => 4 ), $adminurl ) ) . '#' . IP_Geo_Block::PLUGIN_NAME . '-section-4'
541
+ ) );
542
+ }
543
+ }
544
+ }
545
+
546
// Check consistency of matching rule
547
if ( -1 === (int)$settings['matching_rule'] ) {
548
if ( FALSE !== $updating ) {
575
self::add_admin_notice( 'error',
576
__( 'Once you logout, you will be unable to login again because the number of login attempts reaches the limit.', 'ip-geo-block' ) . ' ' .
577
sprintf(
578
+ __( 'Please remove your IP address in &#8220;%1$sStatistics in IP address cache%2$s&#8221; on &#8220;%3$sStatistics%4$s&#8221; tab to prevent locking yourself out.', 'ip-geo-block' ),
579
+ '<strong><a href="' . esc_url( add_query_arg( array( 'page' => IP_Geo_Block::PLUGIN_NAME, 'tab' => 1, 'sec' => 2 ), $adminurl ) . '#' . IP_Geo_Block::PLUGIN_NAME . '-section-2' ) . '">', '</a></strong>',
580
+ '<strong>', '</strong>'
581
)
582
);
583
break;
596
) :
597
sprintf(
598
__( 'Please confirm your local geolocation databases at &#8220;%sLocal database settings%s&#8221; section and remove your IP address in cache at &#8220;%sStatistics in cache%s&#8221; section.', 'ip-geo-block' ),
599
+ '<strong><a href="' . esc_url( add_query_arg( array( 'page' => IP_Geo_Block::PLUGIN_NAME, 'tab' => 0, 'sec' => 5 ), $adminurl ) . '#' . IP_Geo_Block::PLUGIN_NAME . '-section-5' ) . '">', '</a></strong>',
600
'<strong><a href="' . esc_url( add_query_arg( array( 'page' => IP_Geo_Block::PLUGIN_NAME, 'tab' => 1, 'sec' => 2 ), $adminurl ) . '#' . IP_Geo_Block::PLUGIN_NAME . '-section-2' ) . '">', '</a></strong>'
601
)
602
)
613
}
614
}
615
endif;
616
+ // Check consistency of emergency login link
617
+ if ( isset( $settings['login_link'] ) && $settings['login_link']['link'] && ! IP_Geo_Block_Util::verify_link( $settings['login_link']['link'], $settings['login_link']['hash'] ) ) {
618
+ self::add_admin_notice( 'error',
619
+ sprintf(
620
+ __( 'Emergency login link is outdated. Please delete it once and generate again at &#8220;%sPlugin settings%s&#8221; section. Also do not forget to update favorites / bookmarks in your browser.', 'ip-geo-block' ),
621
+ '<strong><a href="' . esc_url( add_query_arg( array( 'page' => IP_Geo_Block::PLUGIN_NAME, 'tab' => 0, 'sec' => 7 ), $adminurl ) . '#' . IP_Geo_Block::PLUGIN_NAME . '-section-7' ) . '">', '</a></strong>'
622
+ )
623
+ );
624
+ }
625
+
626
// Check activation of IP Geo Allow
627
if ( $settings['validation']['timing'] && is_plugin_active( 'ip-geo-allow/index.php' ) ) {
628
self::add_admin_notice( 'error',
636
*
637
*/
638
public function setup_admin_page() {
639
+ $settings = IP_Geo_Block::get_option();
640
+
641
// Register the administration menu.
642
+ $this->add_plugin_admin_menu( $settings );
643
644
// Avoid multiple validation.
645
+ if ( 'GET' === $_SERVER['REQUEST_METHOD'] )
646
+ $this->diagnose_admin_screen( $settings );
647
648
// Register settings page only if it is needed.
649
if ( ( isset( $_GET ['page' ] ) && IP_Geo_Block::PLUGIN_NAME === $_GET ['page' ] ) ||
749
if ( 'options-general.php' === $GLOBALS['pagenow'] ) {
750
$action = 'options.php';
751
unset( $tabs[5] ); // Site List
752
+ if ( IP_GEO_BLOCK_NETWORK && $this->is_network_admin ) {
753
if ( $settings['network_wide'] ) {
754
unset( $tabs[0] ); // Settings
755
}
764
// `edit.php` is an action handler for Multisite administration panels.
765
// `edit.php` ==> do action `network_admin_edit_IP_GEO_BLOCK` ==> `validate_network_settings()`
766
$action = 'edit.php?action=' . IP_Geo_Block::PLUGIN_NAME;
767
+ if ( $this->is_network_admin ) {
768
if ( ! $settings['network_wide'] ) {
769
+ unset( $tabs[0] ); // remove Settings
770
}
771
unset( $tabs[1], $tabs[4], $tabs[2], $tabs[3] ); // Statistics, Logs, Search, Attribution
772
$title .= ' <span class="ip-geo-block-menu-link">';
802
?>
803
</form>
804
<?php if ( 2 === $tab ) { /* Search tab */ ?>
805
+ <div id="ip-geo-block-apis"></div>
806
<div id="ip-geo-block-map"></div>
807
+ <div id="ip-geo-block-whois"></div>
808
<?php } elseif ( 3 === $tab ) { /* Attribute tab */
809
// show attribution (higher priority order)
810
$tab = array();
815
}
816
echo '<p>', implode( '<br />', $tab ), "</p>\n";
817
echo '<p>', __( 'Thanks for providing these great services for free.', 'ip-geo-block' ), "<br />\n";
818
+ echo __( '(Most browsers will redirect you to each site <a href="https://www.ipgeoblock.com/etc/referer.html" title="Referer Checker">without referrer when you click the link</a>.)', 'ip-geo-block' ), "</p>\n";
819
} ?>
820
<?php if ( defined( 'IP_GEO_BLOCK_DEBUG' ) && IP_GEO_BLOCK_DEBUG ) {
821
echo '<p>', get_num_queries(), ' queries. ', timer_stop(0), ' seconds. ', memory_get_usage(), " bytes.</p>\n";
920
case 'select':
921
case 'select-text':
922
$desc = '';
923
+ echo "\n<select id=\"${id}${sub_id}\" name=\"${name}${sub_name}\" ", (isset( $args['attr'] ) ? esc_attr( $args['attr'] ) : ''), ">\n";
924
foreach ( $args['list'] as $key => $val ) {
925
+ echo "\t<option value=\"$key\"", NULL === $val ? ' selected disabled' : ( is_array( $args['value'] ) ? selected( in_array( $key, $args['value'] ), TRUE, FALSE ) : selected( $args['value'], $key, FALSE ) );
926
if ( isset( $args['desc'][ $key ] ) ) {
927
echo ' data-desc="', $args['desc'][ $key ], '"';
928
$key === $args['value'] and $desc = $args['desc'][ $key ];
977
*
978
* @param array $input The values to be validated.
979
*
980
+ * @link https://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Data
981
+ * @link https://codex.wordpress.org/Function_Reference/sanitize_option
982
+ * @link https://codex.wordpress.org/Function_Reference/sanitize_text_field
983
+ * @link https://codex.wordpress.org/Plugin_API/Filter_Reference/sanitize_option_$option
984
* @link https://core.trac.wordpress.org/browser/trunk/src/wp-includes/formatting.php
985
*/
986
public function sanitize_options( $input ) {
1034
isset( $input[ $key ][ $provider ] ) ? sanitize_text_field( $input[ $key ][ $provider ] ) : '';
1035
}
1036
}
1037
break;
1038
1039
case 'comment':
1157
$output['public'][ $key ] = is_array( $default['public'][ $key ] ) ? array() : FALSE;
1158
}
1159
1160
+ // disabled in case IP address cache is disabled
1161
+ empty( $output['cache_hold'] ) and $output['login_fails'] = -1;
1162
+
1163
// 3.0.4 AS number, 3.0.6 Auto updating of DB files, 3.0.8 Geolite2
1164
$output['Maxmind']['use_asn'] = $output['Geolite2']['use_asn'] = $output['update']['auto'] = FALSE;
1165
1261
// expiration time [days]
1262
if ( version_compare( $output['version'], '3.0.13' ) < 0 )
1263
$output['validation']['explogs'] /= DAY_IN_SECONDS;
1264
+ $output['validation']['explogs'] = min( 365, max( 1, (int)$output['validation']['explogs'] ) );
1265
1266
return $output;
1267
}
1269
/**
1270
* A fallback function of array_replace_recursive() before PHP 5.3.
1271
*
1272
+ * @link https://php.net/manual/en/function.array-replace-recursive.php#92574
1273
+ * @link https://php.net/manual/en/function.array-replace-recursive.php#109390
1274
*/
1275
public function array_replace_recursive() {
1276
if ( function_exists( 'array_replace_recursive' ) ) {
1412
$this->dashboard_url( ! empty( $_POST[ $option ]['network_wide'] ) )
1413
)
1414
) );
1415
+
1416
exit;
1417
}
1418
1440
/**
1441
* Ajax callback function
1442
*
1443
+ * @link https://codex.wordpress.org/AJAX_in_Plugins
1444
+ * @link https://codex.wordpress.org/Function_Reference/check_ajax_referer
1445
+ * @link https://core.trac.wordpress.org/browser/trunk/wp-admin/admin-ajax.php
1446
*/
1447
public function admin_ajax_callback() {
1448
+ require_once IP_GEO_BLOCK_PATH . 'admin/includes/class-admin-ajax.php';
1449
+
1450
// Check request origin, nonce, capability.
1451
$this->check_admin_post( TRUE );
1452
1453
// `$which` and `$cmd` should be restricted by whitelist in each function
1454
$settings = IP_Geo_Block::get_option();
1455
$which = isset( $_POST['which'] ) ? $_POST['which'] : NULL;
1462
break;
1463
1464
case 'search': // Get geolocation by IP
1465
+ $res = array();
1466
+ foreach ( (array)$which as $cmd ) {
1467
+ $res[ $cmd ] = IP_Geo_Block_Admin_Ajax::search_ip( $cmd );
1468
+ }
1469
break;
1470
1471
case 'scan-code': // Fetch providers to get country code
1527
}
1528
break;
1529
1530
+ case 'generate-link': // Generate new link
1531
+ $res = array( 'link' => IP_Geo_Block_Util::generate_link() );
1532
+ break;
1533
+
1534
+ case 'delete-link': // Delete existing link
1535
+ IP_Geo_Block_Util::delete_link();
1536
+ break;
1537
+
1538
case 'show-info': // Show system and debug information
1539
$res = IP_Geo_Block_Admin_Ajax::get_wp_info();
1540
break;
1575
foreach ( array_unique( (array)$which[ $src ] ) as $val ) {
1576
// replace anonymized IP address with CIDR (IPv4:256, IPv6:4096)
1577
$val = preg_replace(
1578
+ array( '/\.\*\*\*#x2F;', '/:\w*\*\*\*#x2F;', '/(::.*)::\/116#x2F;' ),
1579
+ array( '.0/24', '::/116', '$1/116' ),
1580
+ trim( $val )
1581
);
1582
if ( ( filter_var( preg_replace( '/\/\d+#x2F;', '', $val ), FILTER_VALIDATE_IP ) || preg_match( '/^AS\d+#x2F;', $val ) ) &&
1583
( FALSE === strpos( $settings['extra_ips'][ $dst ], $val ) ) ) {
1585
}
1586
}
1587
1588
+ if ( $this->is_network_admin && $settings['network_wide'] )
1589
$this->update_multisite_settings( $settings );
1590
else
1591
update_option( IP_Geo_Block::OPTION_NAME, $settings );
1592
1593
+ $res = array( 'page' => 'options-general.php?page=' . IP_Geo_Block::PLUGIN_NAME );
1594
break;
1595
1596
case 'restore-network': // Restore blocked per target in logs
1627
$res = IP_Geo_Block_Admin_Ajax::find_exceptions( $cmd );
1628
break;
1629
1630
+ case 'init-table':
1631
// Need to define `IP_GEO_BLOCK_DEBUG` to true
1632
+ IP_Geo_Block_Logs::delete_tables();
1633
+ IP_Geo_Block_Logs::create_tables();
1634
+ $res = array( 'page' => 'options-general.php?page=' . IP_Geo_Block::PLUGIN_NAME );
1635
break;
1636
}
1637
admin/css/admin.css CHANGED
@@ -213,22 +213,39 @@ input[id*="ip_geo_block_settings_providers"] + label {
213
color: #2786C2;
214
display: inline-block;
215
}
216
217
/* Loading image */
218
.ip-geo-block-loading,
219
#ip-geo-block-live-loading {
220
background-size: 16px 16px;
221
background-position: center center;
222
background-repeat: no-repeat;
223
- height: 16px;
224
- width: 16px;
225
margin-left: 1em;
226
margin-top: 0.2em;
227
display: inline-block;
228
vertical-align: top;
229
}
230
.ip-geo-block-loading {
231
- background-image: url(data:image/gif;base64,R0lGODlhEAAQAPIGAAAAAMLCwkJCQpKSkmJiYoKCgv///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAGACwAAAAAEAAQAAADM2i63P4wyklrC0IEKgAQnAdOmGYFBLExwboQWcG2rlHEwTDQLUsUOd2mBxkUCgNKa+dIAAAh+QQJCgAGACwAAAIACgAOAAADLWgWIqHQCABEVLPe1R4MBOFFRFNsRUNsYDFewTC8iixvQ1EMyxjEvyBLODQkAAAh+QQJCgAGACwAAAAACgAOAAADLWi6IRJrCQCECoU0ag1xxeBARuEQ0UUU5DUM7fK+qTEUYR0EcM3Ev51uB7wAEwAh+QQJCgAGACwAAAAADgAKAAADLWi6URQrLiJEkSaM0eqrkLFtAVEEAgAIylAUQ5SuSqCFNZjhWG3zmB8wOJQkAAAh+QQJCgAGACwCAAAADgAKAAADK2hqMRMrLuekCnCU8gqBDCZ2glBcYkSUxIJJgQdaUVDOtAAAAr3oPN/llgAAIfkECQoABgAsBgAAAAoADgAAAytoEdauiz0Yx5BQFTvN2EMXWNgUFETZFIJQdERLiGgZtKohAIDQ7T0RrpEAACH5BAkKAAYALAYAAgAKAA4AAAMqaKoR+609Fie1K4zhZiibNRSg1XAQUXQPIQgE835voQgAIARqh+ummSUBACH5BAUKAAYALAIABgAOAAoAAAMsaLpsES2+F9mEddEgBFbBMGACAAiMOCrlGRBFWBQD2L0dYYjfUuQZEKynSAAAOw==);
232
}
233
234
/* Google Map infomation window */
@@ -236,6 +253,19 @@ input[id*="ip_geo_block_settings_providers"] + label {
236
height: 400px;
237
margin: 1em auto;
238
}
239
.gm-style-iw {
240
width: 18em;
241
height: auto !important;
@@ -333,16 +363,6 @@ table.ip-geo-block-table td:first-child {
333
word-break: normal;
334
white-space: pre;
335
}
336
- #ip-geo-block-preferred {
337
- color: #fff;
338
- background: #00838f !important;
339
- border-color: #00707a !important;
340
- text-shadow: none; /* for WordPress 3.7.21 */
341
- }
342
- #ip-geo-block-preferred:hover {
343
- background-color: #00919e !important;
344
- border-color: #00525a !important;
345
- }
346
#ip-geo-block-back-to-top {
347
margin:0;
348
text-align:right;
@@ -667,11 +687,64 @@ table.collapsed > tbody > tr.child > td.child > ul li span.dtr-data {
667
margin-right: 0.3em;
668
}
669
670
/* Pagenation */
671
div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate {
672
float: none;
673
text-align: center;
674
margin-bottom: 1em;
675
}
676
div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate span.ellipsis,
677
div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate a.paginate_button,
@@ -863,7 +936,7 @@ mark {
863
display: block;
864
height: 1em;
865
width: 1em;
866
- background: radial-gradient(#0073aa, #72777c);
867
border-radius: 50%;
868
position: absolute;
869
top: 0;
@@ -895,8 +968,8 @@ mark {
895
transform: rotate(180deg);
896
}
897
.ip-geo-block-live-timer > div:last-child:before {
898
- /* older webkit seems buggy with zero so use 0.00001 */
899
- transform: rotate(0.00001deg);
900
animation: 30s spin-timer linear 30s forwards;
901
}
902
@keyframes spin-timer {
@@ -906,7 +979,7 @@ mark {
906
907
/* sub items in settings */
908
.ip-geo-block-subitem {
909
- margin-left:1.7em
910
}
911
.ip-geo-block-subitem:before {
912
content: "\00bb"; /* &raquo; */
@@ -916,6 +989,10 @@ mark {
916
.ip-geo-block-subitem dfn {
917
vertical-align: middle;
918
}
919
920
/* placeholder */
921
:placeholder-shown { color: #888; }
213
color: #2786C2;
214
display: inline-block;
215
}
216
+ .ip-geo-block-primary {
217
+ color: #fff !important;;
218
+ background: #00838f !important;
219
+ border-color: #00707a !important;
220
+ text-shadow: none; /* for WordPress 3.7.21 */
221
+ }
222
+ .ip-geo-block-primary:hover {
223
+ background-color: #00919e !important;
224
+ border-color: #00525a !important;
225
+ }
226
+ ul#ip-geo-block-logs-preset {
227
+ margin: 0.25em 0;
228
+ }
229
+ ul#ip-geo-block-logs-preset li {
230
+ float: left;
231
+ margin-right: 1em;
232
+ }
233
234
/* Loading image */
235
.ip-geo-block-loading,
236
#ip-geo-block-live-loading {
237
+ height: 16px;
238
+ width: 16px;
239
background-size: 16px 16px;
240
background-position: center center;
241
background-repeat: no-repeat;
242
margin-left: 1em;
243
margin-top: 0.2em;
244
display: inline-block;
245
vertical-align: top;
246
}
247
.ip-geo-block-loading {
248
+ background-image: url(data:image/gif;base64,R0lGODlhEAAQAPYCAKqqqsbGxlZWVsrKyvr6+ubm5tDQ0K6urmZmZmJiYuzs7IaGhvT09JycnLq6us7Ozurq6o6OjtbW1tra2vDw8CgoKCYmJvz8/NLS0kJCQlJSUqysrPLy8vb29pqamra2tm5ubujo6Kampvj4+IiIiMjIyEhISNzc3OLi4rKysj4+PlBQULi4uJKSkmRkZODg4KKiou7u7iQkJB4eHlpaWhISErCwsHh4eMDAwDIyMi4uLqSkpIKCgr6+vt7e3n5+fggICJCQkAwMDEpKSmBgYHZ2dhgYGBYWFnx8fF5eXk5OTiIiIjAwMIyMjISEhDQ0NJaWltTU1AQEBBwcHGpqaoqKiuTk5CoqKlhYWAoKCtjY2Hp6ehAQEJ6ensLCwkxMTJSUlCwsLAYGBnR0dDg4OFxcXLy8vKCgoA4ODsTExMzMzDw8PERERDY2NqioqHJycrS0tGhoaBQUFEZGRjo6OkBAQICAgHBwcFRUVCAgIGxsbP///wAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgACACwAAAAAEAAQAEAHjIACgoOEhYJsbTGGghcPGIJRbFNNhgQKCheDDkllDQYMHSc4MAcvhTB0aFliggQjmYNEFQ6LAh0+VoIwbFW1GGamhCgfUE5NbgMKtQYLc0a1gjsyR3E2IYwMFASDYDJvtRRWFIJ1TMq1ElqCICpetQoBEoInVCsAhhI2XhyEPUgIIG7waALlwAloCAMBACH5BAkKAAIALAEAAQAOAA4AAAeDgAKCEmBYYRVKJAaCjAcrVzIzRjVoTw2MKRk5Ww4KECkuWTWCE0Rrl4yCTow7bAupsBcCW19psKkjBEQaFLeMHBwINBy+ggoxVQkPxSMFMXBUMMUQPhRWVUU9tyFRLwQCA048cCcjIyFaJQYxjA8NEVBnAClmahCwEANwbjYBJwyMAgEAIfkECQoABQAsAQABAA4ADgAAB4OABYInO29DbC5QUYKMZiBfbCptTBUmIow4LgJBaTExZkVLFTAFKD8JB4yMQUZrBixUXaqqVFwkUG8Ys4wpQiZOWwy7ghBiRk08HcOqblUTy4wlLWbLBCMFCgBdurMjFMoFE24ADxAXFwwKITEEjD5mH2YBDxI+IdeqHCcGAxgv7IwCAQAh+QQJCgAAACwBAAEADgAOAAAHhYAAglYfTVQJSCITgowDVSAISQJKJgkpjA8LWyIGHBQBJCoZBwAQDU44jIxdTxoSAxEfqqpbFWApUCezjA5LWCJdI7uCClNXGyLCwxBHFl4HBcMAKVxfEx8Y0glZCxwlOCjDUkwPACElAygMghftAB6MClpRJygQFB0EuyMKBQUKDPQxCgQAIfkECQoAAAAsAQABAA4ADgAAB4SAAIIKahstTQ0OVoKMJzYeLVU8W29OXowvBztePh0dUTtxVD0AHDgHEoyMKWVvPj4sBqqqLUoiGDgQs4wBJmNqARe7gjEqXxgPwsMxbWw+UQzDAGY6LjEnusNjFmAEBVbRs00zc1EAHRAKHYw2CHIyO4wEHAwjgmJCZDC7F8psC7IEBQIAIfkECQoARwAsAQABAA4ADgAAB4OAR4IMPgMfNg4PCoKMEA84LCkAMB47GIwxBiUTEAQjKD0REQ9HBD4YIYyMATwtBRQnqaqMG0UOEC8ds4wYIEEQBbuMHC4gMYvCRxw0CAwcF8kBGj8EHdDCJCYiRxfXsw0qCROqRDYQECw3ORkpqjpAQjVGMxYrB7MPC0MyFQItEowCAQAh+QQJCgACACwBAAEADgAOAAAHgIACghcUVhIYEigMgowjEC8nUQ8BOGkojAQxITEdAhcxEh9wPoIMFCOMjBMAKTEXHaipjGldDxcEsqkvUAe5sh1NLb6pHTxNbGK9vlE3DU5ZLsNnIA4GbTVVuQcJdpdnS0Z3LAoxXhF4LjiMMBl5FjptKiZ6ZrJRLUkqbCAwJ4yBACH5BAUKAAEALAEAAQAOAA4AAAd/gAGCARcjHDExHASDjAQdHAoFLy8Ugw2MgiMKWhIKAQ9MYpiCEA8YHQtZCaOCJ14vX2g2rAEKZgMyNRC0BCksFUa7rCMANgIzH7QvZw4tMmO0DlAPUV9hHqNeVTC7G2tkTmkUHA8iSFUGgzZlGSYaNC4gTWqYEzA3SQhVH1aDgQA7);
249
}
250
251
/* Google Map infomation window */
253
height: 400px;
254
margin: 1em auto;
255
}
256
+ #ip-geo-block-apis div.nav-tab-wrapper {
257
+ padding-top: 0;
258
+ margin-bottom: 1em;
259
+ }
260
+ #ip-geo-block-geoinfo {
261
+ white-space: normal;
262
+ word-wrap: break-word;
263
+ word-break: break-all;
264
+ }
265
+ #ip-geo-block-geoinfo ul {
266
+ margin-top: 0;
267
+ margin-left: 1em;
268
+ }
269
.gm-style-iw {
270
width: 18em;
271
height: auto !important;
363
word-break: normal;
364
white-space: pre;
365
}
366
#ip-geo-block-back-to-top {
367
margin:0;
368
text-align:right;
687
margin-right: 0.3em;
688
}
689
690
+ /* Length menu */
691
+ div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_length {
692
+ padding-top: 0.15em;
693
+ margin: 0.5em 0 0 0.3em;
694
+ position: relative;
695
+ display: inline-block;
696
+ }
697
+ div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_length:after {
698
+ content: '';
699
+ width: 6px;
700
+ height: 6px;
701
+ border: 0px;
702
+ border-bottom: solid 2px #999;
703
+ border-right: solid 2px #999;
704
+ -ms-transform: rotate(45deg);
705
+ -webkit-transform: rotate(45deg);
706
+ transform: rotate(45deg);
707
+ position: absolute;
708
+ top: 50%;
709
+ right: 10px;
710
+ margin-top: -4px;
711
+ }
712
+ div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_length select {
713
+ padding-top: 0;
714
+ -webkit-appearance: none;
715
+ -moz-appearance: none;
716
+ appearance: none;
717
+ font-size: 13px !important;
718
+ line-height: 1.4em;
719
+ width: 100%;
720
+ height: 2.05em !important;
721
+ background: transparent;
722
+ position: relative;
723
+ z-index: 1;
724
+ padding: 0.125em 1.5em 0.125em 0.25em;
725
+ border: 1px solid #ddd;
726
+ border-radius: 4px;
727
+ box-shadow: none;
728
+ }
729
+ div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_length select::-ms-expand {
730
+ display: none;
731
+ }
732
+
733
/* Pagenation */
734
div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate {
735
float: none;
736
text-align: center;
737
margin-bottom: 1em;
738
+ margin-top: 0 !important;
739
+ }
740
+ @media screen and (min-width:640px) {
741
+ div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_length {
742
+ margin: 0.5em 0 0 0.6em;
743
+ }
744
+ div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate {
745
+ position: relative;
746
+ left: -2.25em;
747
+ }
748
}
749
div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate span.ellipsis,
750
div[class*="ip-geo-block"] .dataTables_wrapper .dataTables_paginate a.paginate_button,
936
display: block;
937
height: 1em;
938
width: 1em;
939
+ background: #0073aa;
940
border-radius: 50%;
941
position: absolute;
942
top: 0;
968
transform: rotate(180deg);
969
}
970
.ip-geo-block-live-timer > div:last-child:before {
971
+ /* older webkit seems buggy with zero so use 0.00001 if you notice something strange */
972
+ transform: rotate(0deg);
973
animation: 30s spin-timer linear 30s forwards;
974
}
975
@keyframes spin-timer {
979
980
/* sub items in settings */
981
.ip-geo-block-subitem {
982
+ margin-left: 1.7em
983
}
984
.ip-geo-block-subitem:before {
985
content: "\00bb"; /* &raquo; */
989
.ip-geo-block-subitem dfn {
990
vertical-align: middle;
991
}
992
+ .ip-geo-block-subitem-parent th,
993
+ .ip-geo-block-subitem-parent td {
994
+ padding-top: 0;
995
+ }
996
997
/* placeholder */
998
:placeholder-shown { color: #888; }
admin/css/admin.min.css CHANGED
@@ -3,4 +3,4 @@
3
* Copyright (c) 2013-2018 tokkonopapa (tokkonopapa@yahoo.com)
4
* This software is released under the MIT License.
5
*/
6
- dfn{cursor:help;border-bottom:1px dotted #888}.ip-geo-block-icon,svg a,table.ip-geo-block-dataTable>tbody>tr{cursor:pointer}fieldset,legend{padding:0;margin:0;border:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}fieldset{min-width:0}legend{display:block;line-height:inherit;width:100%}.panel-body,label{display:inline-block}label{max-width:100%}.panel{border:1px solid #e5e5e5;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.04);-moz-box-shadow:0 1px 1px rgba(0,0,0,.04);box-shadow:0 1px 1px rgba(0,0,0,.04);background:#f5f5f5}#ip-geo-block-back-to-top a,#ip-geo-block-toggle-sections,.ip-geo-block-help-link a{box-shadow:none}.panel-heading{float:left!important;background:#fff}.panel-default>.panel-heading{border-color:inherit}.panel-body{width:100%;padding:0 1em;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.panel-body:after,.panel-body:before{content:" ";display:table}.panel-body:after{clear:both}.ip-geo-block-navi-link{text-align:left}.ip-geo-block-help-link{float:right;font-size:90%;font-weight:400}fieldset label{vertical-align:text-middle}fieldset input[type=checkbox]{margin:1px 2px 0}fieldset.ip-geo-block-field{margin:1em 0}fieldset.ip-geo-block-field h2,fieldset.ip-geo-block-field h3{padding:0;margin:0;font-size:14px!important}fieldset.ip-geo-block-field h4{margin:.75em 0 .5em}fieldset.ip-geo-block-field legend.panel-heading{padding:10px}fieldset.ip-geo-block-field .ip-geo-block-dropdown,fieldset.ip-geo-block-field .ip-geo-block-dropup{cursor:pointer;position:relative;padding-left:1em}fieldset.ip-geo-block-field .ip-geo-block-dropdown:before,fieldset.ip-geo-block-field .ip-geo-block-dropup:before{content:'';height:0;width:0;border:.4em solid transparent;position:absolute}fieldset.ip-geo-block-field .ip-geo-block-dropup:before{border-left:.4em solid #555;left:2px;top:18%}fieldset.ip-geo-block-field .ip-geo-block-dropdown:before{border-top:.4em solid #555;left:-2px;top:38%}fieldset.ip-geo-block-field .form-table .ip-geo-block-dropdown,fieldset.ip-geo-block-field .form-table .ip-geo-block-dropup{margin-top:.75em}fieldset.ip-geo-block-field ul.ip-geo-block-dropup:before{top:.25em}fieldset.ip-geo-block-field ul.ip-geo-block-dropdown:before{top:.5em}fieldset.ip-geo-block-field table.form-table{margin:0 0 .5em;width:100%}textarea.regular-text{width:25em}fieldset.ip-geo-block-field input.regular-text,fieldset.ip-geo-block-field textarea.regular-text{font-size:95%}input[id*=ip_geo_block_settings_rewrite_]+label{margin-left:.25em}input[id*=ip_geo_block_settings_providers]+label{min-width:7em}.ip-geo-block-settings-folding{margin:.5em 0}.ip-geo-block-settings-folding ul{margin-bottom:0}.ip-geo-block-settings-folding li{margin:.5em 0}.folding-disable{pointer-events:none;opacity:.5}.folding-inactive{opacity:.5;font-style:oblique!important}.ip-geo-block-float li{display:inline-block;width:18em;margin-top:0}.ip-geo-block-checked{list-style-type:disc}.ip-geo-block-ip-addr{display:inline-block;padding-top:5px}.ip-geo-block-hide{display:none}.ip-geo-block-sup{margin-left:.2em;display:inline-block}.ip-geo-block-note{margin-top:1em;list-style:disc inside}.ip-geo-block-note li{text-indent:-1em;padding-left:1em}.ip-geo-block-border{border-top:inherit}.ip-geo-block-notice{color:#dd3d36}.ip-geo-block-title{width:100px;display:inline-block}.ip-geo-block-result{color:#2786C2;display:inline-block}#ip-geo-block-live-loading,.ip-geo-block-loading{background-size:16px 16px;background-position:center center;background-repeat:no-repeat;height:16px;width:16px;margin-left:1em;margin-top:.2em;display:inline-block;vertical-align:top}.ip-geo-block-loading{background-image:url(data:image/gif;base64,R0lGODlhEAAQAPIGAAAAAMLCwkJCQpKSkmJiYoKCgv///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAGACwAAAAAEAAQAAADM2i63P4wyklrC0IEKgAQnAdOmGYFBLExwboQWcG2rlHEwTDQLUsUOd2mBxkUCgNKa+dIAAAh+QQJCgAGACwAAAIACgAOAAADLWgWIqHQCABEVLPe1R4MBOFFRFNsRUNsYDFewTC8iixvQ1EMyxjEvyBLODQkAAAh+QQJCgAGACwAAAAACgAOAAADLWi6IRJrCQCECoU0ag1xxeBARuEQ0UUU5DUM7fK+qTEUYR0EcM3Ev51uB7wAEwAh+QQJCgAGACwAAAAADgAKAAADLWi6URQrLiJEkSaM0eqrkLFtAVEEAgAIylAUQ5SuSqCFNZjhWG3zmB8wOJQkAAAh+QQJCgAGACwCAAAADgAKAAADK2hqMRMrLuekCnCU8gqBDCZ2glBcYkSUxIJJgQdaUVDOtAAAAr3oPN/llgAAIfkECQoABgAsBgAAAAoADgAAAytoEdauiz0Yx5BQFTvN2EMXWNgUFETZFIJQdERLiGgZtKohAIDQ7T0RrpEAACH5BAkKAAYALAYAAgAKAA4AAAMqaKoR+609Fie1K4zhZiibNRSg1XAQUXQPIQgE835voQgAIARqh+ummSUBACH5BAUKAAYALAIABgAOAAoAAAMsaLpsES2+F9mEddEgBFbBMGACAAiMOCrlGRBFWBQD2L0dYYjfUuQZEKynSAAAOw==)}#ip-geo-block-map{height:400px;margin:1em auto}.gm-style-iw{width:18em;height:auto!important;height:100%;min-height:100%:}.gm-style-iw ul{margin:.1em}.gm-style-iw li{margin:.2em}svg a:hover>text{fill:#0096dd}svg a>text{fill:#0073aa;text-decoration:underline}table.ip-geo-block-statistics-table{float:right}table.ip-geo-block-statistics-table td,table.ip-geo-block-statistics-table th{width:12em;margin:0;padding:.2em;text-align:right;line-height:1.5em;word-wrap:break-word}table.ip-geo-block-statistics-table tr:nth-child(even){background-color:#eee}table.ip-geo-block-table{margin:1em 0;white-space:normal;word-wrap:break-word;word-break:break-all}table.ip-geo-block-table td:first-child{min-width:4.3em}@media screen and (max-width:782px){#ip-geo-block-whois .panel-body{padding:0 .5em}}#ip-geo-block-scan-code{vertical-align:middle}#ip-geo-block-code-list{display:none;margin-bottom:0}#ip-geo-block-chart-countries{height:200px}#ip-geo-block-chart-daily{height:240px}#ip_geo_block_settings_validation_mimetype+label{padding-top:.25em}#ip_geo_block_settings_validation_mimetype+label+ul{margin-top:.7em}#ip_geo_block_settings_create_user{margin-bottom:.5em}#ip-geo-block-wp-info textarea{margin-top:.5em;overflow:auto;width:100%;word-wrap:normal;word-break:normal;white-space:pre}#ip-geo-block-preferred{color:#fff;background:#00838f!important;border-color:#00707a!important;text-shadow:none}#ip-geo-block-preferred:hover{background-color:#00919e!important;border-color:#00525a!important}.ip-geo-block-icon,.ip-geo-block-list-exceptions a.ip-geo-block-icon{background-color:transparent;box-shadow:none;text-decoration:none;outline:0}#ip-geo-block-back-to-top{margin:0;text-align:right}#ip-geo-block-live-update,#ip-geo-block-open-new{margin-left:1em}.ip-geo-block-menu-link{font-size:13px!important}dfn~.ip-geo-block-icon{margin-left:.4em}.ip-geo-block-icon{position:relative}.ip-geo-block-icon:active{top:1px}.ip-geo-block-icon span{height:16px;width:16px;margin:0;border:none;display:inline-block;vertical-align:middle;background-size:16px 16px;background-position:center center;background-repeat:no-repeat}.ip-geo-block-icon-cycle span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAh1BMVEUAda2otLp+rsSHprWHr8IBd7EpfKRGhaNajqeUqrRymKuKoq5yo7prlKgAcqoVe6w8gqQmgq5Tj6wIdqsVdKIshrEMea1Uhp+Anqw0hawDdq4gfKhljqE7hqoLdKYbgbM4jLQygKUGeK8CdawQd6gVeKcad6NKkrSerrZAj7UAc6sAc6rc3NySrVGQAAAALXRSTlP//////////////////////////////////////////////////////////wCl7wv9AAACOklEQVR4Ae2W15rzKgxF9xTZzhTX9B7S/gN6/9ebYqzzGZsw/S7LV3FZgCSIwD/kQ8FVcBU8xatZUczy8luC/ABNOn0DSHEsvyZ4PgLatNCYR3efFxyhTQ8g+qQgJxgv2JefERzJXATRh4LHOUwAHD4S7OGEztRJaN86hAUxtaNWDUf/bRdDBbQMWVDAO8jn89WUhag1MeyCAh6hHofyrliLgZKggDMYgzF3eVAwFq0uCZq5KY0TezjIHDDzC0qqmkwe2ctGDOQVLMkgu+F3/rGXwb4xIPcJ6P3JgkM8wFjmfcFAWfeKQywaAz33BJVuHsUcAt09gVbuLDThAJkdR687ggLmf4gDJLIGV7BydtB8yn3u+fbtuj/LS7G9wZAd1AKK+yxJ1x+aBmibTtgCcEHGHsh0wdbOgNLek4L7lI5BigY8nWuZUQ3qGEXes9JzOKGJztPaGtLslu3lIXJirdxCWkASHGDTMqg7V1DKPplygDG61YJukLHjEErGSXqCSos6xNSOgzP3BDmsQBcchNwkoV8oiNnPA78zIefUgCdJeGIfE7LmFWXsFTCFdzTJ/RlfEMRiSGnFXXbkC7AIeqcKDu4ynseozeouKJiSEYBDwkJyIC1nRUjgblkNWp/e/1vXc2gjoAoLksYgjrrFMi0oDgjEEIDij1scBXMJSH6DAj6RNl7o8MkuLak8Co15/Pk+MRmT0xilQJV/sdWNKg2kTaeroudvNNsDjmejYjSL+e6v2/2r4Cp4BXNajr0H7hRfAAAAAElFTkSuQmCC)}.ip-geo-block-icon-lock span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAYFBMVEXc3Ny3y9Zzq8dRmb7M1dlXnsIFdK0AcawAcqwphrYAcKvZ29wAb6oJd680jrqlw9MBcqxmo8MUfbJLl75eoMI7kbzX2ttqp8VSmL1YnL8NeK+Tu89DlL1ImMEOebBNmL4OkqMoAAAAAXRSTlMAQObYZgAAAPlJREFUeAG9kAWyhTAQBIPOsCzufv9TPnf4Ll0CSbpmxXwNy3Yc23rz2fV8kPA99433AIQIiGDTCD0lojiOQPXCDSFJIbF16CMWItkQMkF+inZzSLYhFKLl+a9UKTZaqJTZJYtarZuo40chrv9CqJTN+behVi+Cm7RdDgRld6AMgLxrE/dxBz0BEjwBEmD/uIsWPAOAF9A+CE56ufSryr8oqfOYcBbQJ8YkES7COkFOYzTypqCDOTDo2wljaEw4vp1APYyWKd8WMBozylvCpcvmXeHQ5fCegHia4s1FgZcIVeVFeFx1M4MvYG4eBHdYWufC+addBtf8E3vdjBNhWnVQqAAAAABJRU5ErkJggg==)}.ip-geo-block-icon-unlock span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAYFBMVEXc3NyzydRzq8dRmb7I09hYnsEFdK0AcawAcqzP1toqhrYAcKvZ29wAb6oMeK8zjbqrxtQBcazBz9Zko8MVfbLF0thMmL07kbtpp8WjwtJSmL1YnL+Tu89DlL1JmMEPebBFV++UAAAAAXRSTlMAQObYZgAAAONJREFUeAG9kAWChDAMAIMmJaTFXf7/ynXflvMbnE5j8DU8Pwh8D1yEUYxEGEchWFEJEjEflESBhTQSQm2MRpIotQhZTmgKgMIg5ZlFKBmrGg7UFXJpEQKW8qIKN7YeikJdBJI2BTtXwfyx0L3XoPphvBEliNU49OoxqEa6g4cTST/OYshvi3hV8+FxSNfluG3jqxG8C6h7gF6jU+AODnTsFGSCA5O4I8wpQDq7I5CUAKWQW+AZYOYtoQPoGDeECWDaioBmWQxeBduoWURso+5WpBdw7R4ENTVDcGE435tJwT+xB+vMEnZRNB0YAAAAAElFTkSuQmCC)}.ip-geo-block-icon-find span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAYFBMVEXc3NzS19rD0NWHtMpGk7kYfbAGda0Req+WtcTT1temwM4AcasAcqwAc6wAcKydvMt1pr8Ab6pqpcLX2doggrKoxdNYm7yzw8u/y9HO1tkKdq4th7Td3t6DrcLL0taxyNPGe/YhAAAAAXRSTlMAQObYZgAAARVJREFUeAGtkkeiwyAMRP2xDfxoRjElvd3/lOkNUlZ5u0GPruan/Bnz96Xadr21rvP/7+ujXsAjom78rj4ApCoERIipqfGB1H7wPmYhw1DXjZI6nOel1oJhVAmdUP0tTEDkVC4AYvqIbaDOCqFV6vwRF0tIeYoo6J/X7ICuPAJl9ZynwiIfB5DXxZlRChulbh8xZci0EHZK3TziJFDL504rEOZ+iR5cVj82DoS7XtSshLJpKqaB0Dg3ZjcsQWKaKiF1gVQlITwh/bw2pgKeEeURhE29yKSzUFF03p1V7Wqj2Y7GfrY9X/NirJsPxKsxfBLSSs5GmH8yjAWPSNd8Yoez4f4/G1nIsksqFtGK1i9e39o0P+EAqaoRLlQ+r94AAAAASUVORK5CYII=)}.ip-geo-block-icon-alert span,span.ip-geo-block-icon-alert{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAkFBMVEXc3Nzc2trWl5DHRDTFOyvOgXfc1tXCLBrEMiHEMyLNcmfaxMLDMSDDLx7bu7jRiYHDLhzDMB/LX1PaxsTDLh3YtrHMY1bWmpPJVknSjYXUkYnZuLTMZVnENCPWlI3QhXzENiXXrqrDLRzXsa3Oal7Pe3Hc2NjVn5nNbmPayMbbwb7ay8rUj4fc09Lbw8Db0dDBbRUDAAAAAXRSTlMAQObYZgAAAPVJREFUeAG9ktXWwyAQBonC12brFvff5f2frr4nBredK2DnTFS8Gst2XM8XZmypIGeWcT4PFABaGIXlClfWG1NiC4Ubu705oKRcY32wTAHl2MdTYEqEK8hIiHgHSnSJeaogMyEWO4BijZCvwII2MS9UJ2BXTh+hQidoEttboBOwq3WBnkCNpQlA2iyAhol2hRu71n97p4fw0Z9/ugoPHCfFA+o/iLfCkyBglRJdICBas7uuey+R56fF14wNanj+/QjwY3aX23cBFn6EiHmHNT/ICYxystv/wJy4UHWGlN2cuPB72tFqAq3dP/Hk3zs0E5LZVryGC/hqGNnUa0SVAAAAAElFTkSuQmCC);vertical-align:bottom}table.form-table th .ip-geo-block-cycle span{vertical-align:text-bottom}.ip-geo-block-list{margin-top:0;margin-bottom:.7em}@media screen and (min-width:782px){ul.ip-geo-block-list .code{width:15em}}.ip-geo-block-list-exceptions label{display:inline-block}.ip-geo-block-list-exceptions dfn{border:none}div[class*=ip-geo-block] .dataTables_wrapper.no-footer .dataTables_scrollBody,table.ip-geo-block-dataTable.no-footer,table.ip-geo-block-dataTable>thead>tr>td,table.ip-geo-block-dataTable>thead>tr>th{border-bottom:1px solid #ddd}.ip-geo-block-list-exceptions span.dashicons{font-size:14px}.ip-geo-block-list-exceptions a.ip-geo-block-icon{margin-left:.3em}.form-table td p.ip-geo-block-desc,.form-table td p.ip-geo-block-find-desc{color:#666;font-size:13px!important;margin:4px 0 .5em .5em}.ip-geo-block-find-desc{display:none}.ip-geo-block-admin-post{color:#c43322;margin-left:.25em}.ip-geo-block-warn{color:#c43322;font-weight:700}input#ip_geo_block_settings_behavior_time,input#ip_geo_block_settings_behavior_view{width:3.5em}.ip-geo-block-top-list{display:inline-table;list-style-position:outside;margin:0 2em .5em 1.75em}.ip-geo-block-top-list h4{margin:1em 0}.ip-geo-block-top-list li code{background:0 0}.ip-geo-block-network{margin-bottom:1em}.ip-geo-block-container{margin:0 auto;padding:0 1em;position:relative;width:100%}.ip-geo-block-row{display:flex;flex-direction:column;align-items:flex-start;align-items:stretch;padding:0;width:100%}.ip-geo-block-row .ip-geo-block-column{display:block;flex:1 1 auto;align-self:flex-start;margin-left:0;max-width:100%;width:100%}.ip-geo-block-row .ip-geo-block-column.column-20{flex:0 0 20%;max-width:20%}.ip-geo-block-row .ip-geo-block-column.column-25{flex:0 0 25%;max-width:25%}.ip-geo-block-row .ip-geo-block-column.column-33{flex:0 0 33.3333%;max-width:33.3333%}.ip-geo-block-row .ip-geo-block-column.column-50{flex:0 0 50%;max-width:50%}@media (min-width:40rem){.ip-geo-block-row{flex-direction:row;margin-left:-2em;width:calc(100% + 2em)}.ip-geo-block-row .ip-geo-block-column{margin-bottom:inherit;padding:0 1em}}table.ip-geo-block-dataTable{clear:none!important}table.ip-geo-block-dataTable td,table.ip-geo-block-dataTable th{text-align:right}table.ip-geo-block-dataTable td:nth-child(n+2),table.ip-geo-block-dataTable th:nth-child(n+2){padding-left:0!important}table.ip-geo-block-dataTable th{white-space:nowrap}table.ip-geo-block-dataTable>thead>tr{line-height:1.8em}table.ip-geo-block-dataTable thead td,table.ip-geo-block-dataTable thead th{padding:10px 16px}#ip-geo-block-statistics-cache td:nth-child(3),#ip-geo-block-validation-logs td:nth-child(4){min-width:1.6em}table.ip-geo-block-dataTable.nowrap td,table.ip-geo-block-dataTable>tbody>tr>td span{white-space:normal!important;word-wrap:break-word!important;word-break:break-all!important}table.ip-geo-block-dataTable>tbody>tr>td span{display:inline-block}.ip-geo-block-settings-folding input[type=checkbox]{margin-right:.5em}table.ip-geo-block-dataTable input[type=checkbox]{max-height:16px;max-width:16px;margin:0}table.ip-geo-block-dataTable>tbody>tr>td:first-child,table.ip-geo-block-dataTable>thead>tr>th:first-child{padding:8px 4px 8px 1.4em;text-align:left}table.collapsed>tbody>tr>td.dataTables_empty:first-child::before,table.ip-geo-block-dataTable>tbody>tr>td.dataTables_empty{border:none;text-align:center}table.ip-geo-block-dataTable thead>tr>th:first-child.sorting_asc{background-image:none!important}table.ip-geo-block-dataTable.display tbody tr.even>.sorting_1,table.ip-geo-block-dataTable.display tbody tr.odd>.sorting_1,table.ip-geo-block-dataTable.display tbody tr:hover>.sorting_1{background-color:inherit!important}table.ip-geo-block-dataTable.collapsed>tbody>tr>td:first-child{padding:8px 4px 8px 8px!important}table.collapsed>tbody>tr.parent>td:first-child::before,table.collapsed>tbody>tr>td:first-child::before{content:'';height:0;width:0;display:inline-block;border-radius:0;border:5px solid transparent;box-shadow:none;position:relative;background-color:transparent}table.collapsed>tbody>tr>td:first-child::before{border-left:5px solid #555;top:1px;left:-2px}table.collapsed>tbody>tr.parent>td:first-child::before{border-top:5px solid #555;top:4px;left:-4px}table.collapsed>tbody>tr.child>td:first-child::before{border:none}table.collapsed>tbody>tr.child>td.child>ul li{border:none;padding:0;margin:0;line-height:1.8em}table.collapsed>tbody>tr.child>td.child>ul li span.dtr-data,table.collapsed>tbody>tr.child>td.child>ul li span.dtr-title{font-size:13px!important;display:block;white-space:normal;word-wrap:break-word;word-break:break-all}table.collapsed>tbody>tr.child>td.child>ul li span.dtr-data{margin-left:1.25em;margin-right:.3em}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate{float:none;text-align:center;margin-bottom:1em}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.current,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.current:active,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.current:hover,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:active,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:hover,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button:active,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button:hover,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate span.ellipsis{min-width:2em;background:inherit;border-color:#ddd;border-radius:0;border-image:none;border-style:solid;border-width:1px 1px 1px 0;box-shadow:none;margin:.5em 0 0;padding:.25em 0;display:inline-block;text-decoration:none}#ip-geo-block-1 #ip-geo-block-section-2 .panel-body,#ip-geo-block-4 #ip-geo-block-section-0 .panel-body,mark{padding:0}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate:active>a.paginate_button:first-child,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate:hover>a.paginate_button:first-child,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate>a.paginate_button:first-child{border-left-width:1px;border-bottom-left-radius:4px;border-top-left-radius:4px}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate:active>a.paginate_button:last-child,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate:hover>a.paginate_button:last-child,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate>a.paginate_button:last-child{border-bottom-right-radius:4px;border-top-right-radius:4px}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button{color:#0073aa!important}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button:hover{color:#0096dd!important;background-color:#fff}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:active,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:hover,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate span.ellipsis{cursor:default;color:#999!important;background-color:transparent}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.current,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.current:active,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.current:hover{cursor:default;color:#444!important;background-color:#fff!important}#ip-geo-block-1 #ip-geo-block-section-2 table.form-table,#ip-geo-block-4 #ip-geo-block-section-0 table.form-table{margin-left:1em;max-width:95%}#ip-geo-block-live-log,#ip-geo-block-select-duration,#ip-geo-block-select-layout,#ip-geo-block-select-target{margin:0}#ip-geo-block-select-duration li,#ip-geo-block-select-layout li,#ip-geo-block-select-target li{float:left;margin-right:1.5em}#ip-geo-block-select-duration li label,#ip-geo-block-select-target li label{cursor:pointer}#ip_geo_block_settings_search_filter{width:16em;padding-top:3px}table.ip-geo-block-dataTable.display tbody tr.ip-geo-block-passed{background-color:#edf6ff!important}table.ip-geo-block-dataTable.display tbody tr.ip-geo-block-blocked{background-color:#ffefef!important}.ip-geo-block-new-passed{animation:ip-geo-block-flash-passed 1s ease-out 0s 1 normal both running}.ip-geo-block-new-blocked{animation:ip-geo-block-flash-blocked 1s ease-out 0s 1 normal both running}@keyframes ip-geo-block-flash-passed{0%{background-color:gold}100%{background-color:#edf6ff}}@keyframes ip-geo-block-flash-blocked{0%{background-color:gold}100%{background-color:#ffefef}}mark{background:gold}#ip-geo-block-live-log li{float:left;margin-right:3em}#ip-geo-block-live-log li:last-child{margin-right:0}#ip-geo-block-live-log li input[type=radio]{visibility:hidden;position:absolute}#ip-geo-block-live-log li input[type=radio]+label{display:inline-block;margin:-2px -2px 0;padding:4px 12px;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);border-bottom-color:#b3b3b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}#ip-geo-block-live-log li input[type=radio]:checked+label{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);background-color:#e0e0e0}.ip-geo-block-live-timer{height:1em;width:1em;margin:0;position:relative;top:0;left:0}.ip-geo-block-live-timer:before{content:"";display:block;height:1em;width:1em;background:radial-gradient(#0073aa,#72777c);border-radius:50%;position:absolute;top:0;left:0}.ip-geo-block-live-timer:after{display:none}.ip-geo-block-live-timer>div{position:absolute;width:1em;height:1em;clip:rect(0,1em,1em,.5em)}.ip-geo-block-live-timer>div:before{content:" ";position:absolute;width:1em;height:1em;border-radius:.5em;clip:rect(0,.5em,1em,0);background-color:#f1f1f1;transform:rotate(0)}.ip-geo-block-live-timer>div:first-child:before{animation:30s spin-timer linear forwards}.ip-geo-block-live-timer>div:last-child{transform:rotate(180deg)}.ip-geo-block-live-timer>div:last-child:before{transform:rotate(.00001deg);animation:30s spin-timer linear 30s forwards}@keyframes spin-timer{0%{transform:rotate(0)}100%{transform:rotate(180deg)}}.ip-geo-block-subitem{margin-left:1.7em}.ip-geo-block-subitem:before{content:"\00bb";position:absolute;left:2em}.ip-geo-block-subitem dfn{vertical-align:middle}:placeholder-shown{color:#888}::-webkit-input-placeholder{color:#888}:-moz-placeholder{color:#888;opacity:1}::-moz-placeholder{color:#888;opacity:1}:-ms-input-placeholder{color:#888}
3
* Copyright (c) 2013-2018 tokkonopapa (tokkonopapa@yahoo.com)
4
* This software is released under the MIT License.
5
*/
6
+ dfn{cursor:help;border-bottom:1px dotted #888}fieldset,legend{padding:0;margin:0;border:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}fieldset{min-width:0}legend{display:block;line-height:inherit;width:100%}label{display:inline-block;max-width:100%}.panel{border-color:#888;border:1px solid #e5e5e5;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.04);-moz-box-shadow:0 1px 1px rgba(0,0,0,.04);box-shadow:0 1px 1px rgba(0,0,0,.04);background:#f5f5f5}.panel-heading{float:left!important;background:#fff}.panel-default>.panel-heading{border-color:inherit}.panel-body{width:100%;padding:0 1em;display:inline-block;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.panel-body:after,.panel-body:before{content:" ";display:table}.panel-body:after{clear:both}.ip-geo-block-navi-link{text-align:left}.ip-geo-block-help-link{float:right;font-size:90%;font-weight:400}.ip-geo-block-help-link a{box-shadow:none}fieldset label{vertical-align:text-middle}fieldset input[type=checkbox]{margin:1px 2px 0}fieldset.ip-geo-block-field{margin:1em 0}fieldset.ip-geo-block-field h2,fieldset.ip-geo-block-field h3{padding:0;margin:0;font-size:14px!important}fieldset.ip-geo-block-field h4{margin:.75em 0 .5em 0}fieldset.ip-geo-block-field legend.panel-heading{padding:10px}fieldset.ip-geo-block-field .ip-geo-block-dropdown,fieldset.ip-geo-block-field .ip-geo-block-dropup{cursor:pointer;position:relative;padding-left:1em}fieldset.ip-geo-block-field .ip-geo-block-dropdown:before,fieldset.ip-geo-block-field .ip-geo-block-dropup:before{content:'';height:0;width:0;border:.4em solid transparent;position:absolute}fieldset.ip-geo-block-field .ip-geo-block-dropup:before{border-left:.4em solid #555;left:2px;top:18%}fieldset.ip-geo-block-field .ip-geo-block-dropdown:before{border-top:.4em solid #555;left:-2px;top:38%}fieldset.ip-geo-block-field .form-table .ip-geo-block-dropdown,fieldset.ip-geo-block-field .form-table .ip-geo-block-dropup{margin-top:.75em}fieldset.ip-geo-block-field ul.ip-geo-block-dropup:before{top:.25em}fieldset.ip-geo-block-field ul.ip-geo-block-dropdown:before{top:.5em}fieldset.ip-geo-block-field table.form-table{margin:0 0 .5em;width:100%}textarea.regular-text{width:25em}fieldset.ip-geo-block-field input.regular-text,fieldset.ip-geo-block-field textarea.regular-text{font-size:95%}input[id*=ip_geo_block_settings_rewrite_]+label{margin-left:.25em}input[id*=ip_geo_block_settings_providers]+label{min-width:7em}.ip-geo-block-settings-folding{margin:.5em 0}.ip-geo-block-settings-folding ul{margin-bottom:0}.ip-geo-block-settings-folding li{margin:.5em 0}.folding-disable{pointer-events:none;opacity:.5}.folding-inactive{opacity:.5;font-style:oblique!important}.ip-geo-block-float li{display:inline-block;width:18em;margin-top:0}.ip-geo-block-checked{list-style-type:disc}.ip-geo-block-ip-addr{display:inline-block;padding-top:5px}.ip-geo-block-hide{display:none}.ip-geo-block-sup{margin-left:.2em;display:inline-block}.ip-geo-block-note{margin-top:1em;list-style:disc inside}.ip-geo-block-note li{text-indent:-1em;padding-left:1em}.ip-geo-block-border{border-top:inherit}.ip-geo-block-notice{color:#dd3d36}.ip-geo-block-title{width:100px;display:inline-block}.ip-geo-block-result{color:#2786c2;display:inline-block}.ip-geo-block-primary{color:#fff!important;background:#00838f!important;border-color:#00707a!important;text-shadow:none}.ip-geo-block-primary:hover{background-color:#00919e!important;border-color:#00525a!important}ul#ip-geo-block-logs-preset{margin:.25em 0}ul#ip-geo-block-logs-preset li{float:left;margin-right:1em}#ip-geo-block-live-loading,.ip-geo-block-loading{height:16px;width:16px;background-size:16px 16px;background-position:center center;background-repeat:no-repeat;margin-left:1em;margin-top:.2em;display:inline-block;vertical-align:top}.ip-geo-block-loading{background-image:url(data:image/gif;base64,R0lGODlhEAAQAPYCAKqqqsbGxlZWVsrKyvr6+ubm5tDQ0K6urmZmZmJiYuzs7IaGhvT09JycnLq6us7Ozurq6o6OjtbW1tra2vDw8CgoKCYmJvz8/NLS0kJCQlJSUqysrPLy8vb29pqamra2tm5ubujo6Kampvj4+IiIiMjIyEhISNzc3OLi4rKysj4+PlBQULi4uJKSkmRkZODg4KKiou7u7iQkJB4eHlpaWhISErCwsHh4eMDAwDIyMi4uLqSkpIKCgr6+vt7e3n5+fggICJCQkAwMDEpKSmBgYHZ2dhgYGBYWFnx8fF5eXk5OTiIiIjAwMIyMjISEhDQ0NJaWltTU1AQEBBwcHGpqaoqKiuTk5CoqKlhYWAoKCtjY2Hp6ehAQEJ6ensLCwkxMTJSUlCwsLAYGBnR0dDg4OFxcXLy8vKCgoA4ODsTExMzMzDw8PERERDY2NqioqHJycrS0tGhoaBQUFEZGRjo6OkBAQICAgHBwcFRUVCAgIGxsbP///wAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgACACwAAAAAEAAQAEAHjIACgoOEhYJsbTGGghcPGIJRbFNNhgQKCheDDkllDQYMHSc4MAcvhTB0aFliggQjmYNEFQ6LAh0+VoIwbFW1GGamhCgfUE5NbgMKtQYLc0a1gjsyR3E2IYwMFASDYDJvtRRWFIJ1TMq1ElqCICpetQoBEoInVCsAhhI2XhyEPUgIIG7waALlwAloCAMBACH5BAkKAAIALAEAAQAOAA4AAAeDgAKCEmBYYRVKJAaCjAcrVzIzRjVoTw2MKRk5Ww4KECkuWTWCE0Rrl4yCTow7bAupsBcCW19psKkjBEQaFLeMHBwINBy+ggoxVQkPxSMFMXBUMMUQPhRWVUU9tyFRLwQCA048cCcjIyFaJQYxjA8NEVBnAClmahCwEANwbjYBJwyMAgEAIfkECQoABQAsAQABAA4ADgAAB4OABYInO29DbC5QUYKMZiBfbCptTBUmIow4LgJBaTExZkVLFTAFKD8JB4yMQUZrBixUXaqqVFwkUG8Ys4wpQiZOWwy7ghBiRk08HcOqblUTy4wlLWbLBCMFCgBdurMjFMoFE24ADxAXFwwKITEEjD5mH2YBDxI+IdeqHCcGAxgv7IwCAQAh+QQJCgAAACwBAAEADgAOAAAHhYAAglYfTVQJSCITgowDVSAISQJKJgkpjA8LWyIGHBQBJCoZBwAQDU44jIxdTxoSAxEfqqpbFWApUCezjA5LWCJdI7uCClNXGyLCwxBHFl4HBcMAKVxfEx8Y0glZCxwlOCjDUkwPACElAygMghftAB6MClpRJygQFB0EuyMKBQUKDPQxCgQAIfkECQoAAAAsAQABAA4ADgAAB4SAAIIKahstTQ0OVoKMJzYeLVU8W29OXowvBztePh0dUTtxVD0AHDgHEoyMKWVvPj4sBqqqLUoiGDgQs4wBJmNqARe7gjEqXxgPwsMxbWw+UQzDAGY6LjEnusNjFmAEBVbRs00zc1EAHRAKHYw2CHIyO4wEHAwjgmJCZDC7F8psC7IEBQIAIfkECQoARwAsAQABAA4ADgAAB4OAR4IMPgMfNg4PCoKMEA84LCkAMB47GIwxBiUTEAQjKD0REQ9HBD4YIYyMATwtBRQnqaqMG0UOEC8ds4wYIEEQBbuMHC4gMYvCRxw0CAwcF8kBGj8EHdDCJCYiRxfXsw0qCROqRDYQECw3ORkpqjpAQjVGMxYrB7MPC0MyFQItEowCAQAh+QQJCgACACwBAAEADgAOAAAHgIACghcUVhIYEigMgowjEC8nUQ8BOGkojAQxITEdAhcxEh9wPoIMFCOMjBMAKTEXHaipjGldDxcEsqkvUAe5sh1NLb6pHTxNbGK9vlE3DU5ZLsNnIA4GbTVVuQcJdpdnS0Z3LAoxXhF4LjiMMBl5FjptKiZ6ZrJRLUkqbCAwJ4yBACH5BAUKAAEALAEAAQAOAA4AAAd/gAGCARcjHDExHASDjAQdHAoFLy8Ugw2MgiMKWhIKAQ9MYpiCEA8YHQtZCaOCJ14vX2g2rAEKZgMyNRC0BCksFUa7rCMANgIzH7QvZw4tMmO0DlAPUV9hHqNeVTC7G2tkTmkUHA8iSFUGgzZlGSYaNC4gTWqYEzA3SQhVH1aDgQA7)}#ip-geo-block-map{height:400px;margin:1em auto}#ip-geo-block-apis div.nav-tab-wrapper{padding-top:0;margin-bottom:1em}#ip-geo-block-geoinfo{white-space:normal;word-wrap:break-word;word-break:break-all}#ip-geo-block-geoinfo ul{margin-top:0;margin-left:1em}.gm-style-iw{width:18em;height:auto!important;height:100%;min-height:100%:}.gm-style-iw ul{margin:.1em}.gm-style-iw li{margin:.2em}svg a{cursor:pointer}svg a:hover>text{fill:#0096dd}svg a>text{fill:#0073aa;text-decoration:underline}table.ip-geo-block-statistics-table{float:right}table.ip-geo-block-statistics-table td,table.ip-geo-block-statistics-table th{width:12em;margin:0;padding:.2em;text-align:right;line-height:1.5em;word-wrap:break-word}table.ip-geo-block-statistics-table tr:nth-child(even){background-color:#eee}table.ip-geo-block-table{margin:1em 0;white-space:normal;word-wrap:break-word;word-break:break-all}table.ip-geo-block-table td:first-child{min-width:4.3em}@media screen and (max-width:782px){#ip-geo-block-whois .panel-body{padding:0 .5em}}#ip-geo-block-scan-code{vertical-align:middle}#ip-geo-block-code-list{display:none;margin-bottom:0}#ip-geo-block-chart-countries{height:200px}#ip-geo-block-chart-daily{height:240px}#ip_geo_block_settings_validation_mimetype+label{padding-top:.25em}#ip_geo_block_settings_validation_mimetype+label+ul{margin-top:.7em}#ip_geo_block_settings_create_user{margin-bottom:.5em}#ip-geo-block-back-to-top a,#ip-geo-block-toggle-sections{box-shadow:none}#ip-geo-block-wp-info textarea{margin-top:.5em;overflow:auto;width:100%;word-wrap:normal;word-break:normal;white-space:pre}#ip-geo-block-back-to-top{margin:0;text-align:right}#ip-geo-block-live-update,#ip-geo-block-open-new{margin-left:1em}.ip-geo-block-menu-link{font-size:13px!important}dfn~.ip-geo-block-icon{margin-left:.4em}.ip-geo-block-icon{position:relative;cursor:pointer;outline:0;box-shadow:none;text-decoration:none;background-color:transparent}.ip-geo-block-icon:active{top:1px}.ip-geo-block-icon span{height:16px;width:16px;margin:0;border:none;display:inline-block;vertical-align:middle;background-size:16px 16px;background-position:center center;background-repeat:no-repeat}.ip-geo-block-icon-cycle span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAh1BMVEUAda2otLp+rsSHprWHr8IBd7EpfKRGhaNajqeUqrRymKuKoq5yo7prlKgAcqoVe6w8gqQmgq5Tj6wIdqsVdKIshrEMea1Uhp+Anqw0hawDdq4gfKhljqE7hqoLdKYbgbM4jLQygKUGeK8CdawQd6gVeKcad6NKkrSerrZAj7UAc6sAc6rc3NySrVGQAAAALXRSTlP//////////////////////////////////////////////////////////wCl7wv9AAACOklEQVR4Ae2W15rzKgxF9xTZzhTX9B7S/gN6/9ebYqzzGZsw/S7LV3FZgCSIwD/kQ8FVcBU8xatZUczy8luC/ABNOn0DSHEsvyZ4PgLatNCYR3efFxyhTQ8g+qQgJxgv2JefERzJXATRh4LHOUwAHD4S7OGEztRJaN86hAUxtaNWDUf/bRdDBbQMWVDAO8jn89WUhag1MeyCAh6hHofyrliLgZKggDMYgzF3eVAwFq0uCZq5KY0TezjIHDDzC0qqmkwe2ctGDOQVLMkgu+F3/rGXwb4xIPcJ6P3JgkM8wFjmfcFAWfeKQywaAz33BJVuHsUcAt09gVbuLDThAJkdR687ggLmf4gDJLIGV7BydtB8yn3u+fbtuj/LS7G9wZAd1AKK+yxJ1x+aBmibTtgCcEHGHsh0wdbOgNLek4L7lI5BigY8nWuZUQ3qGEXes9JzOKGJztPaGtLslu3lIXJirdxCWkASHGDTMqg7V1DKPplygDG61YJukLHjEErGSXqCSos6xNSOgzP3BDmsQBcchNwkoV8oiNnPA78zIefUgCdJeGIfE7LmFWXsFTCFdzTJ/RlfEMRiSGnFXXbkC7AIeqcKDu4ynseozeouKJiSEYBDwkJyIC1nRUjgblkNWp/e/1vXc2gjoAoLksYgjrrFMi0oDgjEEIDij1scBXMJSH6DAj6RNl7o8MkuLak8Co15/Pk+MRmT0xilQJV/sdWNKg2kTaeroudvNNsDjmejYjSL+e6v2/2r4Cp4BXNajr0H7hRfAAAAAElFTkSuQmCC)}.ip-geo-block-icon-lock span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAYFBMVEXc3Ny3y9Zzq8dRmb7M1dlXnsIFdK0AcawAcqwphrYAcKvZ29wAb6oJd680jrqlw9MBcqxmo8MUfbJLl75eoMI7kbzX2ttqp8VSmL1YnL8NeK+Tu89DlL1ImMEOebBNmL4OkqMoAAAAAXRSTlMAQObYZgAAAPlJREFUeAG9kAWyhTAQBIPOsCzufv9TPnf4Ll0CSbpmxXwNy3Yc23rz2fV8kPA99433AIQIiGDTCD0lojiOQPXCDSFJIbF16CMWItkQMkF+inZzSLYhFKLl+a9UKTZaqJTZJYtarZuo40chrv9CqJTN+behVi+Cm7RdDgRld6AMgLxrE/dxBz0BEjwBEmD/uIsWPAOAF9A+CE56ufSryr8oqfOYcBbQJ8YkES7COkFOYzTypqCDOTDo2wljaEw4vp1APYyWKd8WMBozylvCpcvmXeHQ5fCegHia4s1FgZcIVeVFeFx1M4MvYG4eBHdYWufC+addBtf8E3vdjBNhWnVQqAAAAABJRU5ErkJggg==)}.ip-geo-block-icon-unlock span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAYFBMVEXc3NyzydRzq8dRmb7I09hYnsEFdK0AcawAcqzP1toqhrYAcKvZ29wAb6oMeK8zjbqrxtQBcazBz9Zko8MVfbLF0thMmL07kbtpp8WjwtJSmL1YnL+Tu89DlL1JmMEPebBFV++UAAAAAXRSTlMAQObYZgAAAONJREFUeAG9kAWChDAMAIMmJaTFXf7/ynXflvMbnE5j8DU8Pwh8D1yEUYxEGEchWFEJEjEflESBhTQSQm2MRpIotQhZTmgKgMIg5ZlFKBmrGg7UFXJpEQKW8qIKN7YeikJdBJI2BTtXwfyx0L3XoPphvBEliNU49OoxqEa6g4cTST/OYshvi3hV8+FxSNfluG3jqxG8C6h7gF6jU+AODnTsFGSCA5O4I8wpQDq7I5CUAKWQW+AZYOYtoQPoGDeECWDaioBmWQxeBduoWURso+5WpBdw7R4ENTVDcGE435tJwT+xB+vMEnZRNB0YAAAAAElFTkSuQmCC)}.ip-geo-block-icon-find span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAYFBMVEXc3NzS19rD0NWHtMpGk7kYfbAGda0Req+WtcTT1temwM4AcasAcqwAc6wAcKydvMt1pr8Ab6pqpcLX2doggrKoxdNYm7yzw8u/y9HO1tkKdq4th7Td3t6DrcLL0taxyNPGe/YhAAAAAXRSTlMAQObYZgAAARVJREFUeAGtkkeiwyAMRP2xDfxoRjElvd3/lOkNUlZ5u0GPruan/Bnz96Xadr21rvP/7+ujXsAjom78rj4ApCoERIipqfGB1H7wPmYhw1DXjZI6nOel1oJhVAmdUP0tTEDkVC4AYvqIbaDOCqFV6vwRF0tIeYoo6J/X7ICuPAJl9ZynwiIfB5DXxZlRChulbh8xZci0EHZK3TziJFDL504rEOZ+iR5cVj82DoS7XtSshLJpKqaB0Dg3ZjcsQWKaKiF1gVQlITwh/bw2pgKeEeURhE29yKSzUFF03p1V7Wqj2Y7GfrY9X/NirJsPxKsxfBLSSs5GmH8yjAWPSNd8Yoez4f4/G1nIsksqFtGK1i9e39o0P+EAqaoRLlQ+r94AAAAASUVORK5CYII=)}.ip-geo-block-icon-alert span,span.ip-geo-block-icon-alert{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAkFBMVEXc3Nzc2trWl5DHRDTFOyvOgXfc1tXCLBrEMiHEMyLNcmfaxMLDMSDDLx7bu7jRiYHDLhzDMB/LX1PaxsTDLh3YtrHMY1bWmpPJVknSjYXUkYnZuLTMZVnENCPWlI3QhXzENiXXrqrDLRzXsa3Oal7Pe3Hc2NjVn5nNbmPayMbbwb7ay8rUj4fc09Lbw8Db0dDBbRUDAAAAAXRSTlMAQObYZgAAAPVJREFUeAG9ktXWwyAQBonC12brFvff5f2frr4nBredK2DnTFS8Gst2XM8XZmypIGeWcT4PFABaGIXlClfWG1NiC4Ubu705oKRcY32wTAHl2MdTYEqEK8hIiHgHSnSJeaogMyEWO4BijZCvwII2MS9UJ2BXTh+hQidoEttboBOwq3WBnkCNpQlA2iyAhol2hRu71n97p4fw0Z9/ugoPHCfFA+o/iLfCkyBglRJdICBas7uuey+R56fF14wNanj+/QjwY3aX23cBFn6EiHmHNT/ICYxystv/wJy4UHWGlN2cuPB72tFqAq3dP/Hk3zs0E5LZVryGC/hqGNnUa0SVAAAAAElFTkSuQmCC);vertical-align:bottom}table.form-table th .ip-geo-block-cycle span{vertical-align:text-bottom}.ip-geo-block-list{margin-top:0;margin-bottom:.7em}@media screen and (min-width:782px){ul.ip-geo-block-list .code{width:15em}}.ip-geo-block-list-exceptions label{display:inline-block}.ip-geo-block-list-exceptions dfn{border:none}.ip-geo-block-list-exceptions span.dashicons{font-size:14px}.ip-geo-block-list-exceptions a.ip-geo-block-icon{margin-left:.3em;outline:0;box-shadow:none;text-decoration:none;background-color:transparent}.form-table td p.ip-geo-block-desc,.form-table td p.ip-geo-block-find-desc{color:#666;font-size:13px!important;margin:4px 0 .5em .5em}.ip-geo-block-find-desc{display:none}.ip-geo-block-admin-post{color:#c43322;margin-left:.25em}.ip-geo-block-warn{color:#c43322;font-weight:700}input#ip_geo_block_settings_behavior_time,input#ip_geo_block_settings_behavior_view{width:3.5em}.ip-geo-block-top-list{display:inline-table;list-style-position:outside;margin:0 2em .5em 1.75em}.ip-geo-block-top-list h4{margin:1em 0}.ip-geo-block-top-list li code{background:0 0}.ip-geo-block-network{margin-bottom:1em}.ip-geo-block-container{margin:0 auto;padding:0 1em;position:relative;width:100%}.ip-geo-block-row{display:flex;flex-direction:column;align-items:flex-start;align-items:stretch;padding:0;width:100%}.ip-geo-block-row .ip-geo-block-column{display:block;flex:1 1 auto;align-self:flex-start;margin-left:0;max-width:100%;width:100%}.ip-geo-block-row .ip-geo-block-column.column-20{flex:0 0 20%;max-width:20%}.ip-geo-block-row .ip-geo-block-column.column-25{flex:0 0 25%;max-width:25%}.ip-geo-block-row .ip-geo-block-column.column-33{flex:0 0 33.3333%;max-width:33.3333%}.ip-geo-block-row .ip-geo-block-column.column-50{flex:0 0 50%;max-width:50%}@media (min-width:40rem){.ip-geo-block-row{flex-direction:row;margin-left:-2em;width:calc(100% + 2em)}.ip-geo-block-row .ip-geo-block-column{margin-bottom:inherit;padding:0 1em}}table.ip-geo-block-dataTable{clear:none!important}table.ip-geo-block-dataTable td,table.ip-geo-block-dataTable th{text-align:right}table.ip-geo-block-dataTable td:nth-child(n+2),table.ip-geo-block-dataTable th:nth-child(n+2){padding-left:0!important}table.ip-geo-block-dataTable th{white-space:nowrap}table.ip-geo-block-dataTable>thead>tr{line-height:1.8em}table.ip-geo-block-dataTable>tbody>tr{cursor:pointer}table.ip-geo-block-dataTable.no-footer,table.ip-geo-block-dataTable>thead>tr>td,table.ip-geo-block-dataTable>thead>tr>th{border-bottom:1px solid #ddd}table.ip-geo-block-dataTable thead td,table.ip-geo-block-dataTable thead th{padding:10px 16px}#ip-geo-block-statistics-cache td:nth-child(3),#ip-geo-block-validation-logs td:nth-child(4){min-width:1.6em}div[class*=ip-geo-block] .dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #ddd}table.ip-geo-block-dataTable.nowrap td,table.ip-geo-block-dataTable>tbody>tr>td span{white-space:normal!important;word-wrap:break-word!important;word-break:break-all!important}table.ip-geo-block-dataTable>tbody>tr>td span{display:inline-block}.ip-geo-block-settings-folding input[type=checkbox]{margin-right:.5em}table.ip-geo-block-dataTable input[type=checkbox]{max-height:16px;max-width:16px;margin:0}table.ip-geo-block-dataTable>tbody>tr>td:first-child,table.ip-geo-block-dataTable>thead>tr>th:first-child{padding:8px 4px 8px 1.4em;text-align:left}table.collapsed>tbody>tr>td.dataTables_empty:first-child::before,table.ip-geo-block-dataTable>tbody>tr>td.dataTables_empty{border:none;text-align:center}table.ip-geo-block-dataTable thead>tr>th:first-child.sorting_asc{background-image:none!important}table.ip-geo-block-dataTable.display tbody tr.even>.sorting_1,table.ip-geo-block-dataTable.display tbody tr.odd>.sorting_1,table.ip-geo-block-dataTable.display tbody tr:hover>.sorting_1{background-color:inherit!important}table.ip-geo-block-dataTable.collapsed>tbody>tr>td:first-child{padding:8px 4px 8px 8px!important}table.collapsed>tbody>tr.parent>td:first-child::before,table.collapsed>tbody>tr>td:first-child::before{content:'';height:0;width:0;display:inline-block;border-radius:0;border:5px solid transparent;box-shadow:none;position:relative;background-color:transparent}table.collapsed>tbody>tr>td:first-child::before{border-left:5px solid #555;top:1px;left:-2px}table.collapsed>tbody>tr.parent>td:first-child::before{border-top:5px solid #555;top:4px;left:-4px}table.collapsed>tbody>tr.child>td:first-child::before{border:none}table.collapsed>tbody>tr.child>td.child>ul li{border:none;padding:0;margin:0;line-height:1.8em}table.collapsed>tbody>tr.child>td.child>ul li span.dtr-data,table.collapsed>tbody>tr.child>td.child>ul li span.dtr-title{font-size:13px!important;display:block;white-space:normal;word-wrap:break-word;word-break:break-all}table.collapsed>tbody>tr.child>td.child>ul li span.dtr-data{margin-left:1.25em;margin-right:.3em}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_length{padding-top:.15em;margin:.5em 0 0 .3em;position:relative;display:inline-block}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_length:after{content:'';width:6px;height:6px;border:0;border-bottom:solid 2px #999;border-right:solid 2px #999;-ms-transform:rotate(45deg);-webkit-transform:rotate(45deg);transform:rotate(45deg);position:absolute;top:50%;right:10px;margin-top:-4px}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_length select{padding-top:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;font-size:13px!important;line-height:1.4em;width:100%;height:2.05em!important;background:0 0;position:relative;z-index:1;padding:.125em 1.5em .125em .25em;border:1px solid #ddd;border-radius:4px;box-shadow:none}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_length select::-ms-expand{display:none}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate{float:none;text-align:center;margin-bottom:1em;margin-top:0!important}@media screen and (min-width:640px){div[class*=ip-geo-block] .dataTables_wrapper .dataTables_length{margin:.5em 0 0 .6em}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate{position:relative;left:-2.25em}}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.current,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.current:active,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.current:hover,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:active,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:hover,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button:active,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button:hover,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate span.ellipsis{min-width:2em;background:inherit;border-color:#ddd;border-radius:0;border-image:none;border-style:solid;border-width:1px 1px 1px 0;box-shadow:none;margin:.5em 0 0 0;padding:.25em 0;display:inline-block;text-decoration:none}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate:active>a.paginate_button:first-child,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate:hover>a.paginate_button:first-child,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate>a.paginate_button:first-child{border-left-width:1px;border-bottom-left-radius:4px;border-top-left-radius:4px}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate:active>a.paginate_button:last-child,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate:hover>a.paginate_button:last-child,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate>a.paginate_button:last-child{border-bottom-right-radius:4px;border-top-right-radius:4px}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button{color:#0073aa!important}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button:hover{color:#0096dd!important;background-color:#fff}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:active,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:hover,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate span.ellipsis{cursor:default;color:#999!important;background-color:transparent}div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.current,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.current:active,div[class*=ip-geo-block] .dataTables_wrapper .dataTables_paginate a.paginate_button.current:hover{cursor:default;color:#444!important;background-color:#fff!important}#ip-geo-block-1 #ip-geo-block-section-2 .panel-body,#ip-geo-block-4 #ip-geo-block-section-0 .panel-body{padding:0}#ip-geo-block-1 #ip-geo-block-section-2 table.form-table,#ip-geo-block-4 #ip-geo-block-section-0 table.form-table{margin-left:1em;max-width:95%}#ip-geo-block-select-duration,#ip-geo-block-select-layout,#ip-geo-block-select-target{margin:0}#ip-geo-block-select-duration li,#ip-geo-block-select-layout li,#ip-geo-block-select-target li{float:left;margin-right:1.5em}#ip-geo-block-select-duration li label,#ip-geo-block-select-target li label{cursor:pointer}#ip_geo_block_settings_search_filter{width:16em;padding-top:3px}table.ip-geo-block-dataTable.display tbody tr.ip-geo-block-passed{background-color:#edf6ff!important}table.ip-geo-block-dataTable.display tbody tr.ip-geo-block-blocked{background-color:#ffefef!important}.ip-geo-block-new-passed{animation:ip-geo-block-flash-passed 1s ease-out 0s 1 normal both running}.ip-geo-block-new-blocked{animation:ip-geo-block-flash-blocked 1s ease-out 0s 1 normal both running}@keyframes ip-geo-block-flash-passed{0%{background-color:gold}100%{background-color:#edf6ff}}@keyframes ip-geo-block-flash-blocked{0%{background-color:gold}100%{background-color:#ffefef}}mark{padding:0;background:gold}// Gold #ip-geo-block-live-log{margin:0}#ip-geo-block-live-log li{float:left;margin-right:3em}#ip-geo-block-live-log li:last-child{margin-right:0}#ip-geo-block-live-log li input[type=radio]{visibility:hidden;position:absolute}#ip-geo-block-live-log li input[type=radio]+label{display:inline-block;margin:-2px;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);border-bottom-color:#b3b3b3;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}#ip-geo-block-live-log li input[type=radio]:checked+label{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);background-color:#e0e0e0}.ip-geo-block-live-timer{height:1em;width:1em;margin:0;position:relative;top:0;left:0}.ip-geo-block-live-timer:before{content:"";display:block;height:1em;width:1em;background:#0073aa;border-radius:50%;position:absolute;top:0;left:0}.ip-geo-block-live-timer:after{display:none}.ip-geo-block-live-timer>div{position:absolute;width:1em;height:1em;clip:rect(0,1em,1em,.5em)}.ip-geo-block-live-timer>div:before{content:" ";position:absolute;width:1em;height:1em;border-radius:.5em;clip:rect(0,.5em,1em,0);background-color:#f1f1f1;transform:rotate(0)}.ip-geo-block-live-timer>div:first-child:before{animation:30s spin-timer linear forwards}.ip-geo-block-live-timer>div:last-child{transform:rotate(180deg)}.ip-geo-block-live-timer>div:last-child:before{transform:rotate(0);animation:30s spin-timer linear 30s forwards}@keyframes spin-timer{0%{transform:rotate(0)}100%{transform:rotate(180deg)}}.ip-geo-block-subitem{margin-left:1.7em}.ip-geo-block-subitem:before{content:"\00bb";position:absolute;left:2em}.ip-geo-block-subitem dfn{vertical-align:middle}.ip-geo-block-subitem-parent td,.ip-geo-block-subitem-parent th{padding-top:0}:placeholder-shown{color:#888}::-webkit-input-placeholder{color:#888}:-moz-placeholder{color:#888;opacity:1}::-moz-placeholder{color:#888;opacity:1}:-ms-input-placeholder{color:#888}
admin/css/cidr.min.css CHANGED
@@ -1 +1 @@
1
- *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:8xp;font-size:14px;line-height:1.4}#g,textarea{border:1px solid #ccc;font-size:12px;font-family:Consolas,Monaco,monospace}.container{margin:0;padding:0}.clr:after,.col:after,.container:after,.row:after{content:"";display:table;clear:both}.row{padding-bottom:0}#g,fieldset{padding:.5rem}.col{display:block;float:left;width:100%}.span_2{width:8.33333333333%}.span_11{width:45.8333333333%}.span_24,textarea{width:100%}fieldset{border:none;margin:0}textarea{height:4.5rem;resize:horizontal}legend input[type=button]{margin-left:.5rem;vertical-align:middle}#j,#i{display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;justify-content:center;align-items:center}#j{padding:0 .5rem}ul#h{padding:1.5rem 0 0;list-style:none}ul#h li{width:100%;margin:.1rem 0;display:inline-block}ul#h li input{padding:0}#g{height:3em;text-align:center}
1
+ *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:8xp;font-size:14px;line-height:1.4}.container{margin:0;padding:0}.clr:after,.col:after,.container:after,.row:after{content:"";display:table;clear:both}.row{padding-bottom:0}.col{display:block;float:left;width:100%}.span_2{width:8.33333333333%}.span_11{width:45.8333333333%}.span_24{width:100%}fieldset{border:none;margin:0;padding:.5rem}textarea{width:100%;height:4.5rem;resize:horizontal;border:1px solid #ccc;font-size:12px;font-family:Consolas,Monaco,monospace}legend input[type=button]{margin-left:.5rem;vertical-align:middle}#j,#i{display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;justify-content:center;align-items:center}#j{padding:0 .5rem}ul#h{padding:1.5rem 0 0;list-style:none}ul#h li{width:100%;margin:.1rem 0;display:inline-block}ul#h li input{padding:0}#g{height:3em;text-align:center;border:1px solid #ccc;padding:.5rem;font-size:12px;font-family:Consolas,Monaco,monospace}
admin/datatables/js/dataTables.responsive.js CHANGED
@@ -12,13 +12,13 @@
12
* @copyright Copyright 2014-2016 SpryMedia Ltd.
13
*
14
* This source file is free software, available under the following license:
15
- * MIT license - http://datatables.net/license/mit
16
*
17
* This source file is distributed in the hope that it will be useful, but
18
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19
* or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
20
*
21
- * For details please refer to: http://www.datatables.net
22
*/
23
(function( factory ){
24
if ( typeof define === 'function' && define.amd ) {
@@ -152,7 +152,7 @@ $.extend( Responsive.prototype, {
152
// resize
153
$(window).on( 'resize.dtr orientationchange.dtr', DataTable.util.throttle( function () {
154
// iOS has a bug whereby resize can fire when only scrolling
155
- // See: http://stackoverflow.com/questions/8898412
156
var width = $(window).width();
157
158
if ( width !== oldWindowWidth ) {
12
* @copyright Copyright 2014-2016 SpryMedia Ltd.
13
*
14
* This source file is free software, available under the following license:
15
+ * MIT license - https://datatables.net/license/mit
16
*
17
* This source file is distributed in the hope that it will be useful, but
18
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19
* or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
20
*
21
+ * For details please refer to: https://www.datatables.net
22
*/
23
(function( factory ){
24
if ( typeof define === 'function' && define.amd ) {
152
// resize
153
$(window).on( 'resize.dtr orientationchange.dtr', DataTable.util.throttle( function () {
154
// iOS has a bug whereby resize can fire when only scrolling
155
+ // See: https://stackoverflow.com/questions/8898412
156
var width = $(window).width();
157
158
if ( width !== oldWindowWidth ) {
admin/datatables/js/datatables-all.js CHANGED
@@ -12,13 +12,13 @@
12
* @copyright Copyright 2008-2017 SpryMedia Ltd.
13
*
14
* This source file is free software, available under the following license:
15
- * MIT license - http://datatables.net/license
16
*
17
* This source file is distributed in the hope that it will be useful, but
18
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19
* or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
20
*
21
- * For details please refer to: http://www.datatables.net
22
*/
23
24
/*jslint evil: true, undef: true, browser: true */
@@ -64,7 +64,7 @@
64
* flexible tool, based upon the foundations of progressive enhancement,
65
* which will add advanced interaction controls to any HTML table. For a
66
* full list of features please refer to
67
- * [DataTables.net](href="http://datatables.net).
68
*
69
* Note that the `DataTable` object is not a global variable but is aliased
70
* to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may
@@ -1345,7 +1345,7 @@
1345
// Escape regular expression special characters
1346
var _re_escape_regex = new RegExp( '(\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '#x27;, '^', '-' ].join('|\\') + ')', 'g' );
1347
1348
- // http://en.wikipedia.org/wiki/Foreign_exchange_market
1349
// - \u20BD - Russian ruble.
1350
// - \u20a9 - South Korean Won
1351
// - \u20BA - Turkish Lira
@@ -4509,7 +4509,7 @@
4509
// If it looks like there is an HTML entity in the string,
4510
// attempt to decode it so sorting works as expected. Note that
4511
// we could use a single line of jQuery to do this, but the DOM
4512
- // method used here is much faster http://jsperf.com/html-decode
4513
if ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {
4514
__filter_div.innerHTML = cellData;
4515
cellData = __filter_div_textContent ?
@@ -6443,7 +6443,7 @@
6443
6444
if ( tn ) {
6445
msg += '. For more information about this error, please see '+
6446
- 'http://datatables.net/tn/'+tn;
6447
}
6448
6449
if ( ! level ) {
@@ -9408,7 +9408,7 @@
9408
/**
9409
* Version string for plug-ins to check compatibility. Allowed format is
9410
* `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used
9411
- * only for non-release builds. See http://semver.org/ for more information.
9412
* @member
9413
* @type string
9414
* @default Version number
@@ -9981,7 +9981,7 @@
9981
* --------
9982
*
9983
* As an object, the parameters in the object are passed to
9984
- * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control
9985
* of the Ajax request. DataTables has a number of default parameters which
9986
* you can override using this option. Please refer to the jQuery
9987
* documentation for a full description of the options available, although
@@ -11688,7 +11688,7 @@
11688
* $(document).ready( function() {
11689
* $('#example').dataTable( {
11690
* "language": {
11691
- * "url": "http://www.sprymedia.co.uk/dataTables/lang.txt"
11692
* }
11693
* } );
11694
* } );
@@ -14747,7 +14747,7 @@
14747
// string
14748
"string-pre": function ( a ) {
14749
// This is a little complex, but faster than always calling toString,
14750
- // http://jsperf.com/tostring-v-check
14751
return _empty(a) ?
14752
'' :
14753
typeof a === 'string' ?
@@ -15256,13 +15256,13 @@
15256
* @copyright Copyright 2014-2016 SpryMedia Ltd.
15257
*
15258
* This source file is free software, available under the following license:
15259
- * MIT license - http://datatables.net/license/mit
15260
*
15261
* This source file is distributed in the hope that it will be useful, but
15262
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15263
* or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
15264
*
15265
- * For details please refer to: http://www.datatables.net
15266
*/
15267
(function( factory ){
15268
if ( typeof define === 'function' && define.amd ) {
@@ -15396,7 +15396,7 @@ $.extend( Responsive.prototype, {
15396
// resize
15397
$(window).on( 'resize.dtr orientationchange.dtr', DataTable.util.throttle( function () {
15398
// iOS has a bug whereby resize can fire when only scrolling
15399
- // See: http://stackoverflow.com/questions/8898412
15400
var width = $(window).width();
15401
15402
if ( width !== oldWindowWidth ) {
12
* @copyright Copyright 2008-2017 SpryMedia Ltd.
13
*
14
* This source file is free software, available under the following license:
15
+ * MIT license - https://datatables.net/license
16
*
17
* This source file is distributed in the hope that it will be useful, but
18
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19
* or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
20
*
21
+ * For details please refer to: https://www.datatables.net
22
*/
23
24
/*jslint evil: true, undef: true, browser: true */
64
* flexible tool, based upon the foundations of progressive enhancement,
65
* which will add advanced interaction controls to any HTML table. For a
66
* full list of features please refer to
67
+ * [DataTables.net](href="https://datatables.net).
68
*
69
* Note that the `DataTable` object is not a global variable but is aliased
70
* to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may
1345
// Escape regular expression special characters
1346
var _re_escape_regex = new RegExp( '(\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '#x27;, '^', '-' ].join('|\\') + ')', 'g' );
1347
1348
+ // https://en.wikipedia.org/wiki/Foreign_exchange_market
1349
// - \u20BD - Russian ruble.
1350
// - \u20a9 - South Korean Won
1351
// - \u20BA - Turkish Lira
4509
// If it looks like there is an HTML entity in the string,
4510
// attempt to decode it so sorting works as expected. Note that
4511
// we could use a single line of jQuery to do this, but the DOM
4512
+ // method used here is much faster https://jsperf.com/html-decode
4513
if ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {
4514
__filter_div.innerHTML = cellData;
4515
cellData = __filter_div_textContent ?
6443
6444
if ( tn ) {
6445
msg += '. For more information about this error, please see '+
6446
+ 'https://datatables.net/tn/'+tn;
6447
}
6448
6449
if ( ! level ) {
9408
/**
9409
* Version string for plug-ins to check compatibility. Allowed format is
9410
* `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used
9411
+ * only for non-release builds. See https://semver.org/ for more information.
9412
* @member
9413
* @type string
9414
* @default Version number
9981
* --------
9982
*
9983
* As an object, the parameters in the object are passed to
9984
+ * [jQuery.ajax](https://api.jquery.com/jQuery.ajax/) allowing fine control
9985
* of the Ajax request. DataTables has a number of default parameters which
9986
* you can override using this option. Please refer to the jQuery
9987
* documentation for a full description of the options available, although
11688
* $(document).ready( function() {
11689
* $('#example').dataTable( {
11690
* "language": {
11691
+ * "url": "https://www.sprymedia.co.uk/dataTables/lang.txt"
11692
* }
11693
* } );
11694
* } );
14747
// string
14748
"string-pre": function ( a ) {
14749
// This is a little complex, but faster than always calling toString,
14750
+ // https://jsperf.com/tostring-v-check
14751
return _empty(a) ?
14752
'' :
14753
typeof a === 'string' ?
15256
* @copyright Copyright 2014-2016 SpryMedia Ltd.
15257
*
15258
* This source file is free software, available under the following license:
15259
+ * MIT license - https://datatables.net/license/mit
15260
*
15261
* This source file is distributed in the hope that it will be useful, but
15262
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15263
* or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
15264
*
15265
+ * For details please refer to: https://www.datatables.net
15266
*/
15267
(function( factory ){
15268
if ( typeof define === 'function' && define.amd ) {
15396
// resize
15397
$(window).on( 'resize.dtr orientationchange.dtr', DataTable.util.throttle( function () {
15398
// iOS has a bug whereby resize can fire when only scrolling
15399
+ // See: https://stackoverflow.com/questions/8898412
15400
var width = $(window).width();
15401
15402
if ( width !== oldWindowWidth ) {
admin/datatables/js/datatables-all.min.js CHANGED
@@ -71,7 +71,7 @@ function wa(a){var b=a.aLastSort,c=a.oClasses.sSortColumn,d=V(a),e=a.oFeatures,f
71
c._aSortData||(c._aSortData=[]),!c._aSortData[b]||d)f=d?e[j]:B(a,j,b,"sort"),c._aSortData[b]=g?g(f):f}function xa(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:h.extend(!0,[],a.aaSorting),search:zb(a.oPreviousSearch),columns:h.map(a.aoColumns,function(b,d){return{visible:b.bVisible,search:zb(a.aoPreSearchCols[d])}})};r(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,
72
b)}}function Ib(a,b,c){var d,e,f=a.aoColumns,b=function(b){if(b&&b.time){var g=r(a,"aoStateLoadParams","stateLoadParams",[a,b]);if(-1===h.inArray(!1,g)&&(g=a.iStateDuration,!(0<g&&b.time<+new Date-1E3*g)&&!(b.columns&&f.length!==b.columns.length))){a.oLoadedState=h.extend(!0,{},b);b.start!==k&&(a._iDisplayStart=b.start,a.iInitDisplayStart=b.start);b.length!==k&&(a._iDisplayLength=b.length);b.order!==k&&(a.aaSorting=[],h.each(b.order,function(b,c){a.aaSorting.push(c[0]>=f.length?[0,c[1]]:c)}));b.search!==
73
k&&h.extend(a.oPreviousSearch,Ab(b.search));if(b.columns){d=0;for(e=b.columns.length;d<e;d++)g=b.columns[d],g.visible!==k&&(f[d].bVisible=g.visible),g.search!==k&&h.extend(a.aoPreSearchCols[d],Ab(g.search))}r(a,"aoStateLoaded","stateLoaded",[a,b])}}c()};if(a.oFeatures.bStateSave){var g=a.fnStateLoadCallback.call(a.oInstance,a,b);g!==k&&b(g)}else c()}function ya(a){var b=m.settings,a=h.inArray(a,D(b,"nTable"));return-1!==a?b[a]:null}function J(a,b,c,d){c="DataTables warning: "+(a?"table id="+a.sTableId+
74
- " - ":"")+c;d&&(c+=". For more information about this error, please see http://datatables.net/tn/"+d);if(b)E.console&&console.log&&console.log(c);else if(b=m.ext,b=b.sErrMode||b.errMode,a&&r(a,null,"error",[a,d,c]),"alert"==b)alert(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,d,c)}}function F(a,b,c,d){h.isArray(c)?h.each(c,function(c,d){h.isArray(d)?F(a,b,d[0],d[1]):F(a,b,d)}):(d===k&&(d=c),b[c]!==k&&(a[d]=b[c]))}function Jb(a,b,c){var d,e;for(e in b)b.hasOwnProperty(e)&&(d=b[e],
75
h.isPlainObject(d)?(h.isPlainObject(a[e])||(a[e]={}),h.extend(!0,a[e],d)):a[e]=c&&"data"!==e&&"aaData"!==e&&h.isArray(d)?d.slice():d);return a}function Va(a,b,c){h(a).on("click.DT",b,function(b){a.blur();c(b)}).on("keypress.DT",b,function(a){13===a.which&&(a.preventDefault(),c(a))}).on("selectstart.DT",function(){return!1})}function z(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function r(a,b,c,d){var e=[];b&&(e=h.map(a[b].slice().reverse(),function(b){return b.fn.apply(a.oInstance,d)}));null!==c&&(b=h.Event(c+
76
".dt"),h(a.nTable).trigger(b,d),e.push(b.result));return e}function Ra(a){var b=a._iDisplayStart,c=a.fnDisplayEnd(),d=a._iDisplayLength;b>=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Ma(a,b){var c=a.renderer,d=m.ext.renderer[b];return h.isPlainObject(c)&&c[b]?d[c[b]]||d._:"string"===typeof c?d[c]||d._:d._}function y(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function ha(a,b){var c=[],c=Kb.numbers_length,d=Math.floor(c/2);b<=c?c=W(0,b):a<=d?(c=W(0,
77
c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-d?c=W(b-(c-2),b):(c=W(a-d+2,a+d-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function cb(a){h.each({num:function(b){return za(b,a)},"num-fmt":function(b){return za(b,a,Wa)},"html-num":function(b){return za(b,a,Aa)},"html-num-fmt":function(b){return za(b,a,Aa,Wa)}},function(b,c){x.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(x.type.search[b+a]=x.type.search.html)})}function Lb(a){return function(){var b=
71
c._aSortData||(c._aSortData=[]),!c._aSortData[b]||d)f=d?e[j]:B(a,j,b,"sort"),c._aSortData[b]=g?g(f):f}function xa(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:h.extend(!0,[],a.aaSorting),search:zb(a.oPreviousSearch),columns:h.map(a.aoColumns,function(b,d){return{visible:b.bVisible,search:zb(a.aoPreSearchCols[d])}})};r(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,
72
b)}}function Ib(a,b,c){var d,e,f=a.aoColumns,b=function(b){if(b&&b.time){var g=r(a,"aoStateLoadParams","stateLoadParams",[a,b]);if(-1===h.inArray(!1,g)&&(g=a.iStateDuration,!(0<g&&b.time<+new Date-1E3*g)&&!(b.columns&&f.length!==b.columns.length))){a.oLoadedState=h.extend(!0,{},b);b.start!==k&&(a._iDisplayStart=b.start,a.iInitDisplayStart=b.start);b.length!==k&&(a._iDisplayLength=b.length);b.order!==k&&(a.aaSorting=[],h.each(b.order,function(b,c){a.aaSorting.push(c[0]>=f.length?[0,c[1]]:c)}));b.search!==
73
k&&h.extend(a.oPreviousSearch,Ab(b.search));if(b.columns){d=0;for(e=b.columns.length;d<e;d++)g=b.columns[d],g.visible!==k&&(f[d].bVisible=g.visible),g.search!==k&&h.extend(a.aoPreSearchCols[d],Ab(g.search))}r(a,"aoStateLoaded","stateLoaded",[a,b])}}c()};if(a.oFeatures.bStateSave){var g=a.fnStateLoadCallback.call(a.oInstance,a,b);g!==k&&b(g)}else c()}function ya(a){var b=m.settings,a=h.inArray(a,D(b,"nTable"));return-1!==a?b[a]:null}function J(a,b,c,d){c="DataTables warning: "+(a?"table id="+a.sTableId+
74
+ " - ":"")+c;d&&(c+=". For more information about this error, please see https://datatables.net/tn/"+d);if(b)E.console&&console.log&&console.log(c);else if(b=m.ext,b=b.sErrMode||b.errMode,a&&r(a,null,"error",[a,d,c]),"alert"==b)alert(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,d,c)}}function F(a,b,c,d){h.isArray(c)?h.each(c,function(c,d){h.isArray(d)?F(a,b,d[0],d[1]):F(a,b,d)}):(d===k&&(d=c),b[c]!==k&&(a[d]=b[c]))}function Jb(a,b,c){var d,e;for(e in b)b.hasOwnProperty(e)&&(d=b[e],
75
h.isPlainObject(d)?(h.isPlainObject(a[e])||(a[e]={}),h.extend(!0,a[e],d)):a[e]=c&&"data"!==e&&"aaData"!==e&&h.isArray(d)?d.slice():d);return a}function Va(a,b,c){h(a).on("click.DT",b,function(b){a.blur();c(b)}).on("keypress.DT",b,function(a){13===a.which&&(a.preventDefault(),c(a))}).on("selectstart.DT",function(){return!1})}function z(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function r(a,b,c,d){var e=[];b&&(e=h.map(a[b].slice().reverse(),function(b){return b.fn.apply(a.oInstance,d)}));null!==c&&(b=h.Event(c+
76
".dt"),h(a.nTable).trigger(b,d),e.push(b.result));return e}function Ra(a){var b=a._iDisplayStart,c=a.fnDisplayEnd(),d=a._iDisplayLength;b>=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Ma(a,b){var c=a.renderer,d=m.ext.renderer[b];return h.isPlainObject(c)&&c[b]?d[c[b]]||d._:"string"===typeof c?d[c]||d._:d._}function y(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function ha(a,b){var c=[],c=Kb.numbers_length,d=Math.floor(c/2);b<=c?c=W(0,b):a<=d?(c=W(0,
77
c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-d?c=W(b-(c-2),b):(c=W(a-d+2,a+d-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function cb(a){h.each({num:function(b){return za(b,a)},"num-fmt":function(b){return za(b,a,Wa)},"html-num":function(b){return za(b,a,Aa)},"html-num-fmt":function(b){return za(b,a,Aa,Wa)}},function(b,c){x.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(x.type.search[b+a]=x.type.search.html)})}function Lb(a){return function(){var b=
admin/datatables/js/jquery.dataTables.js CHANGED
@@ -12,13 +12,13 @@
12
* @copyright Copyright 2008-2017 SpryMedia Ltd.
13
*
14
* This source file is free software, available under the following license:
15
- * MIT license - http://datatables.net/license
16
*
17
* This source file is distributed in the hope that it will be useful, but
18
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19
* or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
20
*
21
- * For details please refer to: http://www.datatables.net
22
*/
23
24
/*jslint evil: true, undef: true, browser: true */
@@ -64,7 +64,7 @@
64
* flexible tool, based upon the foundations of progressive enhancement,
65
* which will add advanced interaction controls to any HTML table. For a
66
* full list of features please refer to
67
- * [DataTables.net](href="http://datatables.net).
68
*
69
* Note that the `DataTable` object is not a global variable but is aliased
70
* to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may
@@ -1345,7 +1345,7 @@
1345
// Escape regular expression special characters
1346
var _re_escape_regex = new RegExp( '(\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '#x27;, '^', '-' ].join('|\\') + ')', 'g' );
1347
1348
- // http://en.wikipedia.org/wiki/Foreign_exchange_market
1349
// - \u20BD - Russian ruble.
1350
// - \u20a9 - South Korean Won
1351
// - \u20BA - Turkish Lira
@@ -4509,7 +4509,7 @@
4509
// If it looks like there is an HTML entity in the string,
4510
// attempt to decode it so sorting works as expected. Note that
4511
// we could use a single line of jQuery to do this, but the DOM
4512
- // method used here is much faster http://jsperf.com/html-decode
4513
if ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {
4514
__filter_div.innerHTML = cellData;
4515
cellData = __filter_div_textContent ?
@@ -6443,7 +6443,7 @@
6443
6444
if ( tn ) {
6445
msg += '. For more information about this error, please see '+
6446
- 'http://datatables.net/tn/'+tn;
6447
}
6448
6449
if ( ! level ) {
@@ -9408,7 +9408,7 @@
9408
/**
9409
* Version string for plug-ins to check compatibility. Allowed format is
9410
* `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used
9411
- * only for non-release builds. See http://semver.org/ for more information.
9412
* @member
9413
* @type string
9414
* @default Version number
@@ -9981,7 +9981,7 @@
9981
* --------
9982
*
9983
* As an object, the parameters in the object are passed to
9984
- * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control
9985
* of the Ajax request. DataTables has a number of default parameters which
9986
* you can override using this option. Please refer to the jQuery
9987
* documentation for a full description of the options available, although
@@ -11688,7 +11688,7 @@
11688
* $(document).ready( function() {
11689
* $('#example').dataTable( {
11690
* "language": {
11691
- * "url": "http://www.sprymedia.co.uk/dataTables/lang.txt"
11692
* }
11693
* } );
11694
* } );
@@ -14747,7 +14747,7 @@
14747
// string
14748
"string-pre": function ( a ) {
14749
// This is a little complex, but faster than always calling toString,
14750
- // http://jsperf.com/tostring-v-check
14751
return _empty(a) ?
14752
'' :
14753
typeof a === 'string' ?
12
* @copyright Copyright 2008-2017 SpryMedia Ltd.
13
*
14
* This source file is free software, available under the following license:
15
+ * MIT license - https://datatables.net/license
16
*
17
* This source file is distributed in the hope that it will be useful, but
18
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19
* or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
20
*
21
+ * For details please refer to: https://www.datatables.net
22
*/
23
24
/*jslint evil: true, undef: true, browser: true */
64
* flexible tool, based upon the foundations of progressive enhancement,
65
* which will add advanced interaction controls to any HTML table. For a
66
* full list of features please refer to
67
+ * [DataTables.net](href="https://datatables.net).
68
*
69
* Note that the `DataTable` object is not a global variable but is aliased
70
* to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may
1345
// Escape regular expression special characters
1346
var _re_escape_regex = new RegExp( '(\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '#x27;, '^', '-' ].join('|\\') + ')', 'g' );
1347
1348
+ // https://en.wikipedia.org/wiki/Foreign_exchange_market
1349
// - \u20BD - Russian ruble.
1350
// - \u20a9 - South Korean Won
1351
// - \u20BA - Turkish Lira
4509
// If it looks like there is an HTML entity in the string,
4510
// attempt to decode it so sorting works as expected. Note that
4511
// we could use a single line of jQuery to do this, but the DOM
4512
+ // method used here is much faster https://jsperf.com/html-decode
4513
if ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {
4514
__filter_div.innerHTML = cellData;
4515
cellData = __filter_div_textContent ?
6443
6444
if ( tn ) {
6445
msg += '. For more information about this error, please see '+
6446
+ 'https://datatables.net/tn/'+tn;
6447
}
6448
6449
if ( ! level ) {
9408
/**
9409
* Version string for plug-ins to check compatibility. Allowed format is
9410
* `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used
9411
+ * only for non-release builds. See https://semver.org/ for more information.
9412
* @member
9413
* @type string
9414
* @default Version number
9981
* --------
9982
*
9983
* As an object, the parameters in the object are passed to
9984
+ * [jQuery.ajax](https://api.jquery.com/jQuery.ajax/) allowing fine control
9985
* of the Ajax request. DataTables has a number of default parameters which
9986
* you can override using this option. Please refer to the jQuery
9987
* documentation for a full description of the options available, although
11688
* $(document).ready( function() {
11689
* $('#example').dataTable( {
11690
* "language": {
11691
+ * "url": "https://www.sprymedia.co.uk/dataTables/lang.txt"
11692
* }
11693
* } );
11694
* } );
14747
// string
14748
"string-pre": function ( a ) {
14749
// This is a little complex, but faster than always calling toString,
14750
+ // https://jsperf.com/tostring-v-check
14751
return _empty(a) ?
14752
'' :
14753
typeof a === 'string' ?
admin/datatables/js/jquery.dataTables.min.js CHANGED
@@ -71,7 +71,7 @@ function wa(a){var b=a.aLastSort,c=a.oClasses.sSortColumn,d=V(a),e=a.oFeatures,f
71
c._aSortData||(c._aSortData=[]),!c._aSortData[b]||d)f=d?e[j]:B(a,j,b,"sort"),c._aSortData[b]=g?g(f):f}function xa(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:h.extend(!0,[],a.aaSorting),search:zb(a.oPreviousSearch),columns:h.map(a.aoColumns,function(b,d){return{visible:b.bVisible,search:zb(a.aoPreSearchCols[d])}})};r(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,
72
b)}}function Ib(a,b,c){var d,e,f=a.aoColumns,b=function(b){if(b&&b.time){var g=r(a,"aoStateLoadParams","stateLoadParams",[a,b]);if(-1===h.inArray(!1,g)&&(g=a.iStateDuration,!(0<g&&b.time<+new Date-1E3*g)&&!(b.columns&&f.length!==b.columns.length))){a.oLoadedState=h.extend(!0,{},b);b.start!==k&&(a._iDisplayStart=b.start,a.iInitDisplayStart=b.start);b.length!==k&&(a._iDisplayLength=b.length);b.order!==k&&(a.aaSorting=[],h.each(b.order,function(b,c){a.aaSorting.push(c[0]>=f.length?[0,c[1]]:c)}));b.search!==
73
k&&h.extend(a.oPreviousSearch,Ab(b.search));if(b.columns){d=0;for(e=b.columns.length;d<e;d++)g=b.columns[d],g.visible!==k&&(f[d].bVisible=g.visible),g.search!==k&&h.extend(a.aoPreSearchCols[d],Ab(g.search))}r(a,"aoStateLoaded","stateLoaded",[a,b])}}c()};if(a.oFeatures.bStateSave){var g=a.fnStateLoadCallback.call(a.oInstance,a,b);g!==k&&b(g)}else c()}function ya(a){var b=m.settings,a=h.inArray(a,D(b,"nTable"));return-1!==a?b[a]:null}function J(a,b,c,d){c="DataTables warning: "+(a?"table id="+a.sTableId+
74
- " - ":"")+c;d&&(c+=". For more information about this error, please see http://datatables.net/tn/"+d);if(b)E.console&&console.log&&console.log(c);else if(b=m.ext,b=b.sErrMode||b.errMode,a&&r(a,null,"error",[a,d,c]),"alert"==b)alert(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,d,c)}}function F(a,b,c,d){h.isArray(c)?h.each(c,function(c,d){h.isArray(d)?F(a,b,d[0],d[1]):F(a,b,d)}):(d===k&&(d=c),b[c]!==k&&(a[d]=b[c]))}function Jb(a,b,c){var d,e;for(e in b)b.hasOwnProperty(e)&&(d=b[e],
75
h.isPlainObject(d)?(h.isPlainObject(a[e])||(a[e]={}),h.extend(!0,a[e],d)):a[e]=c&&"data"!==e&&"aaData"!==e&&h.isArray(d)?d.slice():d);return a}function Va(a,b,c){h(a).on("click.DT",b,function(b){a.blur();c(b)}).on("keypress.DT",b,function(a){13===a.which&&(a.preventDefault(),c(a))}).on("selectstart.DT",function(){return!1})}function z(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function r(a,b,c,d){var e=[];b&&(e=h.map(a[b].slice().reverse(),function(b){return b.fn.apply(a.oInstance,d)}));null!==c&&(b=h.Event(c+
76
".dt"),h(a.nTable).trigger(b,d),e.push(b.result));return e}function Ra(a){var b=a._iDisplayStart,c=a.fnDisplayEnd(),d=a._iDisplayLength;b>=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Ma(a,b){var c=a.renderer,d=m.ext.renderer[b];return h.isPlainObject(c)&&c[b]?d[c[b]]||d._:"string"===typeof c?d[c]||d._:d._}function y(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function ha(a,b){var c=[],c=Kb.numbers_length,d=Math.floor(c/2);b<=c?c=W(0,b):a<=d?(c=W(0,
77
c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-d?c=W(b-(c-2),b):(c=W(a-d+2,a+d-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function cb(a){h.each({num:function(b){return za(b,a)},"num-fmt":function(b){return za(b,a,Wa)},"html-num":function(b){return za(b,a,Aa)},"html-num-fmt":function(b){return za(b,a,Aa,Wa)}},function(b,c){x.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(x.type.search[b+a]=x.type.search.html)})}function Lb(a){return function(){var b=
71
c._aSortData||(c._aSortData=[]),!c._aSortData[b]||d)f=d?e[j]:B(a,j,b,"sort"),c._aSortData[b]=g?g(f):f}function xa(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:h.extend(!0,[],a.aaSorting),search:zb(a.oPreviousSearch),columns:h.map(a.aoColumns,function(b,d){return{visible:b.bVisible,search:zb(a.aoPreSearchCols[d])}})};r(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,
72
b)}}function Ib(a,b,c){var d,e,f=a.aoColumns,b=function(b){if(b&&b.time){var g=r(a,"aoStateLoadParams","stateLoadParams",[a,b]);if(-1===h.inArray(!1,g)&&(g=a.iStateDuration,!(0<g&&b.time<+new Date-1E3*g)&&!(b.columns&&f.length!==b.columns.length))){a.oLoadedState=h.extend(!0,{},b);b.start!==k&&(a._iDisplayStart=b.start,a.iInitDisplayStart=b.start);b.length!==k&&(a._iDisplayLength=b.length);b.order!==k&&(a.aaSorting=[],h.each(b.order,function(b,c){a.aaSorting.push(c[0]>=f.length?[0,c[1]]:c)}));b.search!==
73
k&&h.extend(a.oPreviousSearch,Ab(b.search));if(b.columns){d=0;for(e=b.columns.length;d<e;d++)g=b.columns[d],g.visible!==k&&(f[d].bVisible=g.visible),g.search!==k&&h.extend(a.aoPreSearchCols[d],Ab(g.search))}r(a,"aoStateLoaded","stateLoaded",[a,b])}}c()};if(a.oFeatures.bStateSave){var g=a.fnStateLoadCallback.call(a.oInstance,a,b);g!==k&&b(g)}else c()}function ya(a){var b=m.settings,a=h.inArray(a,D(b,"nTable"));return-1!==a?b[a]:null}function J(a,b,c,d){c="DataTables warning: "+(a?"table id="+a.sTableId+
74
+ " - ":"")+c;d&&(c+=". For more information about this error, please see https://datatables.net/tn/"+d);if(b)E.console&&console.log&&console.log(c);else if(b=m.ext,b=b.sErrMode||b.errMode,a&&r(a,null,"error",[a,d,c]),"alert"==b)alert(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,d,c)}}function F(a,b,c,d){h.isArray(c)?h.each(c,function(c,d){h.isArray(d)?F(a,b,d[0],d[1]):F(a,b,d)}):(d===k&&(d=c),b[c]!==k&&(a[d]=b[c]))}function Jb(a,b,c){var d,e;for(e in b)b.hasOwnProperty(e)&&(d=b[e],
75
h.isPlainObject(d)?(h.isPlainObject(a[e])||(a[e]={}),h.extend(!0,a[e],d)):a[e]=c&&"data"!==e&&"aaData"!==e&&h.isArray(d)?d.slice():d);return a}function Va(a,b,c){h(a).on("click.DT",b,function(b){a.blur();c(b)}).on("keypress.DT",b,function(a){13===a.which&&(a.preventDefault(),c(a))}).on("selectstart.DT",function(){return!1})}function z(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function r(a,b,c,d){var e=[];b&&(e=h.map(a[b].slice().reverse(),function(b){return b.fn.apply(a.oInstance,d)}));null!==c&&(b=h.Event(c+
76
".dt"),h(a.nTable).trigger(b,d),e.push(b.result));return e}function Ra(a){var b=a._iDisplayStart,c=a.fnDisplayEnd(),d=a._iDisplayLength;b>=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Ma(a,b){var c=a.renderer,d=m.ext.renderer[b];return h.isPlainObject(c)&&c[b]?d[c[b]]||d._:"string"===typeof c?d[c]||d._:d._}function y(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function ha(a,b){var c=[],c=Kb.numbers_length,d=Math.floor(c/2);b<=c?c=W(0,b):a<=d?(c=W(0,
77
c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-d?c=W(b-(c-2),b):(c=W(a-d+2,a+d-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function cb(a){h.each({num:function(b){return za(b,a)},"num-fmt":function(b){return za(b,a,Wa)},"html-num":function(b){return za(b,a,Aa)},"html-num-fmt":function(b){return za(b,a,Aa,Wa)}},function(b,c){x.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(x.type.search[b+a]=x.type.search.html)})}function Lb(a){return function(){var b=
admin/datatables/license.txt CHANGED
@@ -1,5 +1,5 @@
1
Copyright (c) 2008-2015 SpryMedia Limited
2
- http://datatables.net
3
4
Permission is hereby granted, free of charge, to any person obtaining a copy
5
of this software and associated documentation files (the "Software"), to deal
1
Copyright (c) 2008-2015 SpryMedia Limited
2
+ https://datatables.net
3
4
Permission is hereby granted, free of charge, to any person obtaining a copy
5
of this software and associated documentation files (the "Software"), to deal
admin/images/ajax-loader-snake.gif ADDED
Binary file
admin/includes/class-admin-ajax.php CHANGED
@@ -40,9 +40,9 @@ class IP_Geo_Block_Admin_Ajax {
40
}
41
42
$tmp = microtime( TRUE );
43
- $res['host'] = esc_html( IP_Geo_Block_Lkup::gethostbyaddr( $ip ) );
44
$tmp = microtime( TRUE ) - $tmp;
45
- $res['DNS lookup'] = sprintf( '%.1f [msec]', $tmp * 1000.0 );
46
}
47
48
return $res;
@@ -72,7 +72,7 @@ class IP_Geo_Block_Admin_Ajax {
72
FALSE === $ret ? __( 'n/a', 'ip-geo-block' ) : (
73
! empty( $ret['errorMessage'] ) ? $ret['errorMessage'] : (
74
! empty( $ret['countryCode' ] ) ? $ret['countryCode' ] :
75
- __( 'UNKNOWN', 'ip-geo-block' ) ) )
76
),
77
);
78
}
@@ -149,9 +149,9 @@ class IP_Geo_Block_Admin_Ajax {
149
array_shift( $row ); // remove `No`
150
$row = array_map( 'esc_html', $row );
151
152
- if ( $options['anonymize'] ) {
153
- $row[2] = IP_Geo_Block_Util::anonymize_ip( $row[2], TRUE );
154
- $row[8] = IP_Geo_Block_Util::anonymize_ip( $row[8], FALSE );
155
}
156
157
$res[] = array(
@@ -179,7 +179,9 @@ class IP_Geo_Block_Admin_Ajax {
179
* @param string $which 'comment', 'xmlrpc', 'login', 'admin' or 'public'
180
*/
181
public static function restore_logs( $which ) {
182
- return array( 'data' => self::format_logs( IP_Geo_Block_Logs::restore_logs( $which ) ) ); // DataTables requires `data`
183
}
184
185
/**
@@ -256,7 +258,7 @@ class IP_Geo_Block_Admin_Ajax {
256
/* AS number */ $val['asn' ],
257
/* Host name */ $val['host'],
258
/* Target */ $val['hook'],
259
- /* Failure / Total */ sprintf( '%d / %d', (int)$val['fail'], (int)$val['call'] ),
260
/* Elapsed[sec] */ $time - (int)$val['time'],
261
) ) . PHP_EOL;
262
}
@@ -293,7 +295,7 @@ class IP_Geo_Block_Admin_Ajax {
293
/* AS number */ '<span>' . esc_html( $val['asn' ] ) . '</span>',
294
/* Host name */ '<span>' . esc_html( $val['host'] ) . '</span>',
295
/* Target */ '<span>' . esc_html( $val['hook'] ) . '</span>',
296
- /* Fails/Calls */ '<span>' . sprintf( '%d / %d', (int)$val['fail'], (int)$val['call'] ) . '</span>',
297
/* Elapsed[sec] */ '<span>' . ( $time - (int)$val['time'] ) . '</span>',
298
);
299
}
@@ -306,7 +308,18 @@ class IP_Geo_Block_Admin_Ajax {
306
*/
307
public static function get_network_count() {
308
if ( ! defined( 'TEST_RESTORE_NETWORK' ) or ! TEST_RESTORE_NETWORK ):
309
- return get_blog_count(); // get_sites( array( 'count' => TRUE ) ) @since 4.6
310
else:
311
return TEST_NETWORK_BLOG_COUNT;
312
endif;
@@ -347,7 +360,7 @@ if ( ! defined( 'TEST_RESTORE_NETWORK' ) or ! TEST_RESTORE_NETWORK ):
347
foreach ( $wpdb->get_col( "SELECT `blog_id` FROM `$wpdb->blogs`" ) as $id ) {
348
switch_to_blog( $id );
349
350
- if ( $offset <= $i && $i < $length ) {
351
// array of ( `time`, `ip`, `hook`, `code`, `method`, `data` )
352
$name = get_bloginfo( 'name' );
353
$logs = IP_Geo_Block_Logs::get_recent_logs( $duration );
@@ -361,12 +374,12 @@ if ( ! defined( 'TEST_RESTORE_NETWORK' ) or ! TEST_RESTORE_NETWORK ):
361
362
// link over network
363
$count[ $name ]['link'] = esc_url( add_query_arg(
364
- array( 'page' => IP_Geo_Block::PLUGIN_NAME, 'tab' => 1 ),
365
admin_url( 'options-general.php' )
366
) );
367
-
368
- restore_current_blog();
369
}
370
}
371
else:
372
for ( $i = 0; $i < TEST_NETWORK_BLOG_COUNT; ++$i ) {
@@ -509,12 +522,12 @@ endif; // TEST_RESTORE_NETWORK
509
'[extra_ips][white_list]',
510
'[extra_ips][black_list]',
511
'[anonymize]',
512
'[signature]',
513
'[login_fails]',
514
'[response_code]',
515
'[response_msg]', // 3.0.0
516
'[redirect_uri]', // 3.0.0
517
- '[restrict_api]', // 3.0.13
518
'[validation][timing]', // 2.2.9
519
'[validation][proxy]',
520
'[validation][comment]',
@@ -702,8 +715,8 @@ endif; // TEST_RESTORE_NETWORK
702
}
703
704
// Fallback function for PHP 5.3 and under
705
- // @link http://qiita.com/keromichan16/items/5ff45a77fb0d48e046cc
706
- // @link http://stackoverflow.com/questions/16498286/why-does-the-php-json-encode-function-convert-utf-8-strings-to-hexadecimal-entit/
707
private static function json_unescaped_unicode( $input ) {
708
return preg_replace_callback(
709
'/(?:\\\\u[0-9a-zA-Z]{4})++/',
@@ -765,6 +778,7 @@ endif; // TEST_RESTORE_NETWORK
765
$result += array( $matches[1] => $which );
766
}
767
}
768
}
769
770
return $result;
@@ -836,7 +850,7 @@ endif; // TEST_RESTORE_NETWORK
836
'PECL phar:' => class_exists( 'PharData', FALSE ) ? 'yes' : 'no',
837
'BC Math:' => (extension_loaded('gmp') ? 'gmp ' : '') . (function_exists('bcadd') ? 'yes' : 'no'),
838
'mb_strcut:' => function_exists( 'mb_strcut' ) ? 'yes' : 'no', // @since PHP 4.0.6
839
- 'OpenSSL:' => function_exists( 'openssl_cipher_iv_length' ) ? 'yes' : 'no', // @since PHP 5.3.3
840
'SQLite(PDO):' => extension_loaded( 'pdo_sqlite' ) ? 'yes' : 'no',
841
'DNS lookup:' => ('8.8.8.8' !== $val ? 'available' : 'n/a') . sprintf( ' [%.1f msec]', $key * 1000.0 ),
842
'User agent:' => $_SERVER['HTTP_USER_AGENT'],
40
}
41
42
$tmp = microtime( TRUE );
43
+ $res['host (DNS)'] = esc_html( IP_Geo_Block_Lkup::gethostbyaddr( $ip ) );
44
$tmp = microtime( TRUE ) - $tmp;
45
+ $res['host (DNS)'] .= sprintf( ' (%.1f [msec])', $tmp * 1000.0 );
46
}
47
48
return $res;
72
FALSE === $ret ? __( 'n/a', 'ip-geo-block' ) : (
73
! empty( $ret['errorMessage'] ) ? $ret['errorMessage'] : (
74
! empty( $ret['countryCode' ] ) ? $ret['countryCode' ] :
75
+ __( 'n/a', 'ip-geo-block' ) ) )
76
),
77
);
78
}
149
array_shift( $row ); // remove `No`
150
$row = array_map( 'esc_html', $row );
151
152
+ if ( $options['anonymize'] && FALSE === strpos( $row[2], '***' ) ) {
153
+ $row[2] = IP_Geo_Block_Util::anonymize_ip( $row[2], TRUE );
154
+ $row[8] = IP_Geo_Block_Util::anonymize_ip( $row[8], FALSE );
155
}
156
157
$res[] = array(
179
* @param string $which 'comment', 'xmlrpc', 'login', 'admin' or 'public'
180
*/
181
public static function restore_logs( $which ) {
182
+ return array( 'data' => self::format_logs(
183
+ apply_filters( IP_Geo_Block::PLUGIN_NAME . '-logs', IP_Geo_Block_Logs::restore_logs( $which ) )
184
+ ) ); // DataTables requires `data`
185
}
186
187
/**
258
/* AS number */ $val['asn' ],
259